Ranides Atterwim 10 роки тому
батько
коміт
34f51b73bb

+ 1 - 6
assira.common/pom.xml

@@ -165,8 +165,8 @@
                 <version>2.0.1</version>
             </dependency>
             <dependency>
-                <artifactId>assira.asm</artifactId>
                 <groupId>net.ranides</groupId>
+                <artifactId>assira.asm</artifactId>
                 <version>5.0.4</version>
             </dependency>
             <dependency>
@@ -175,11 +175,6 @@
                 <version>2.0.1</version>
                 <scope>test</scope>
             </dependency>
-            <dependency>
-                <groupId>eu.vitaliy</groupId>
-                <artifactId>mazovia-charset</artifactId>
-                <version>1.0</version>
-            </dependency>
             <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>

+ 0 - 5
assira/pom.xml

@@ -163,11 +163,6 @@
 			<artifactId>assira.asm</artifactId>
 			<groupId>net.ranides</groupId>
 		</dependency>
-		<dependency>
-			<groupId>eu.vitaliy</groupId>
-			<artifactId>mazovia-charset</artifactId>
-			<optional>true</optional>
-		</dependency>
 		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>

+ 2 - 2
assira/src/main/java/net/ranides/assira/generic/HashUtils.java

@@ -10,7 +10,7 @@ import java.math.BigInteger;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
-import net.ranides.assira.text.TextEncoding;
+import net.ranides.assira.text.Charsets;
 
 @SuppressWarnings({
     "PMD.AvoidReassigningParameters"
@@ -131,7 +131,7 @@ public final class HashUtils {
         }
         try {
             MessageDigest mdt = MessageDigest.getInstance(method);
-            byte[] digest = mdt.digest( value.getBytes(TextEncoding.NIO_UTF8) );
+            byte[] digest = mdt.digest(value.getBytes(Charsets.UTF8) );
             BigInteger number = new BigInteger(1, digest);
             return number.toString(16);
         } catch (NoSuchAlgorithmException cause) {

+ 48 - 0
assira/src/main/java/net/ranides/assira/text/Charsets.java

@@ -0,0 +1,48 @@
+/*
+ *  @author Ranides Atterwim <ranides@gmail.com>
+ *  @copyright Ranides Atterwim
+ *  @license WTFPL
+ *  @url http://ranides.net/projects/assira
+ */
+
+package net.ranides.assira.text;
+
+import java.nio.charset.Charset;
+import java.nio.charset.UnsupportedCharsetException;
+import net.ranides.assira.annotations.Meta;
+
+public final class Charsets {
+    
+    private Charsets() {
+        // utility class        
+    }
+
+    public static final Charset US_ASCII = Charset.forName("US-ASCII");
+
+    public static final Charset ISO88591 = Charset.forName("ISO-8859-1");
+
+    public static final Charset UTF8 = Charset.forName("UTF-8");
+
+    public static final Charset UTF16BE = Charset.forName("UTF-16BE");
+
+    public static final Charset UTF16LE = Charset.forName("UTF-16LE");
+
+    public static final Charset UTF16 = Charset.forName("UTF-16");
+
+    public static final Charset PL_DOS = Charset.forName("IBM852");
+
+    public static final Charset PL_ISO = Charset.forName("ISO-8859-2");
+
+    public static final Charset PL_WINDOWS = Charset.forName("windows-1250");
+
+    public static final Charset MAZOVIA = load("mazovia");
+
+    @Meta.Unsafe
+    private static Charset load(String name) {
+        try {
+            return Charset.forName(name);
+        } catch(UnsupportedCharsetException _cause) {
+            return null;
+        }
+    }
+}

+ 13 - 0
assira/src/main/java/net/ranides/assira/text/MCharset.java

@@ -0,0 +1,13 @@
+package net.ranides.assira.text;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CoderResult;
+
+/**
+ *
+ * @author Vitaliy Oliynyk
+ */

+ 142 - 0
assira/src/main/java/net/ranides/assira/text/MazoviaCharset.java

@@ -0,0 +1,142 @@
+package net.ranides.assira.text;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CoderResult;
+import java.nio.charset.spi.CharsetProvider;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import net.ranides.assira.collection.sets.HashSet;
+
+public class MazoviaCharset extends CharsetProvider {
+
+    public static final String CS_NAME = "mazovia";
+    
+    public final static String[] NAMES = new String[]{
+        "cp-896",
+        "cp896",
+        "cp620",
+        "cp-620",
+        "cp790",
+        "cp-790"
+    };
+    
+    private static final Set<String> NAMES_SET = new HashSet<>(NAMES);
+    
+    private static final List<Charset> CHARSETS = Arrays.asList(new MCharset());
+    
+    private static final char[][] CHARMAP = new char[][]{
+        {'\u0104', 143}//Ą
+      , {'\u0105', 134}//ą
+      , {'\u0106', 149}//Ć
+      , {'\u0107', 141}//ć
+      , {'\u0118', 144}//Ę
+      , {'\u0119', 145}//ę
+      , {'\u0141', 156}//Ł
+      , {'\u0142', 146}//ł
+      , {'\u0143', 165}//Ń
+      , {'\u0144', 164}//ń
+      , {'\u00D3', 163}//Ó
+      , {'\u00F3', 162}//ó
+      , {'\u015A', 152}//Ś
+      , {'\u015B', 158}//ś
+      , {'\u0179', 160}//Ź
+      , {'\u017A', 166}//ź
+      , {'\u017B', 161}//Ż
+      , {'\u017C', 167}//ż
+    };
+
+    @Override
+    public Iterator<Charset> charsets() {
+        return CHARSETS.iterator();
+    }
+
+    @Override
+    public Charset charsetForName(String charsetName) {
+        if(CS_NAME.equalsIgnoreCase(charsetName)){
+            return CHARSETS.get(0);
+        }
+        if (NAMES_SET.contains(charsetName.toLowerCase(Locale.ROOT).trim())) {
+            return CHARSETS.get(0);
+        } 
+        return null;
+    }
+    
+    private static class MCharset extends Charset {
+
+        public MCharset() {
+            super(CS_NAME, NAMES);
+        }
+
+        @Override
+        public boolean contains(Charset cs) {
+            return cs.equals(this);
+        }
+        
+        @Override
+        public CharsetEncoder newEncoder() {
+            return new MEncoder(this);
+        }
+
+        @Override
+        public CharsetDecoder newDecoder() {
+            return new MDecoder(this);
+        }
+
+    }
+    
+    private static class MEncoder extends CharsetEncoder {
+
+        public MEncoder(Charset cs) {
+            super(cs, 1, 1);
+        }
+
+        @Override
+        protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) {
+            while (in.hasRemaining()) {
+                out.put((byte) (encodeChar(in.get()) & 0xFF));
+            }
+            return CoderResult.UNDERFLOW;
+        }
+
+        private char encodeChar(char c) {
+            for (char[] m : CHARMAP) {
+                if (c == m[0]) {
+                    return m[1];
+                }
+            }
+            return c;
+        }
+    }
+
+    private static class MDecoder extends CharsetDecoder {
+
+        public MDecoder(Charset cs) {
+            super(cs, 1, 1);
+        }
+
+        @Override
+        protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) {
+            while (in.hasRemaining()) {
+                out.put(decodeChar((char) (in.get() & 0x00FF)));
+            }
+            return CoderResult.UNDERFLOW;
+        }
+
+        private char decodeChar(char c) {
+            for (char[] m : CHARMAP) {
+                if (c == m[1]) {
+                    return m[0];
+                }
+            }
+            return c;
+        }
+    }
+
+}

+ 0 - 72
assira/src/main/java/net/ranides/assira/text/TextEncoding.java

@@ -1,72 +0,0 @@
-/*
- *  @author Ranides Atterwim <ranides@gmail.com>
- *  @copyright Ranides Atterwim
- *  @license WTFPL
- *  @url http://ranides.net/projects/assira
- */
-
-package net.ranides.assira.text;
-
-import java.nio.charset.Charset;
-import java.nio.charset.UnsupportedCharsetException;
-import net.ranides.assira.annotations.Meta;
-
-public final class TextEncoding {
-    
-    private TextEncoding() {
-        // utility class        
-    }
-
-    public static final Charset NIO_US_ASCII = Charset.forName("US-ASCII");
-
-    public static final Charset NIO_ISO88591 = Charset.forName("ISO-8859-1");
-
-    public static final Charset NIO_UTF8 = Charset.forName("UTF-8");
-
-    public static final Charset NIO_UTF16BE = Charset.forName("UTF-16BE");
-
-    public static final Charset NIO_UTF16LE = Charset.forName("UTF-16LE");
-
-    public static final Charset NIO_UTF16 = Charset.forName("UTF-16");
-
-    public static final Charset NIO_PL_DOS = Charset.forName("IBM852");
-
-    public static final Charset NIO_PL_ISO = Charset.forName("ISO-8859-2");
-
-    public static final Charset NIO_PL_WINDOWS = Charset.forName("windows-1250");
-
-    public static final Charset NIO_MAZOVIA = load("mazovia");
-
-    public static final Charset NIO_DEFAULT = Charset.defaultCharset();
-
-    public static final String IO_US_ASCII = "ASCII";
-
-    public static final String IO_ISO88591 = "ISO8859_1";
-
-    public static final String IO_UTF8 = "UTF8";
-
-    public static final String IO_UTF16BE = "UnicodeBigUnmarked";
-
-    public static final String IO_UTF16LE = "UnicodeLittleUnmarked";
-
-    public static final String IO_UTF16 = "UTF-16";
-
-    public static final String IO_PL_DOS = "Cp852";
-
-    public static final String IO_PL_ISO = "ISO8859_2";
-
-    public static final String IO_PL_WINDOWS = "Cp1250";
-
-    public static final String IO_MAZOVIA = "mazovia";
-
-    public static final String IO_DEFAULT = Charset.defaultCharset().name();
-
-    @Meta.Unsafe
-    private static Charset load(String name) {
-        try {
-            return Charset.forName(name);
-        } catch(UnsupportedCharsetException _cause) {
-            return null;
-        }
-    }
-}

+ 1 - 0
assira/src/main/resources/META-INF/services/java.nio.charset.spi.CharsetProvider

@@ -0,0 +1 @@
+net.ranides.assira.text.MazoviaCharset