Explorar o código

teoretycznie wszystko w "text.format" jest serializable

Ranides Atterwim %!s(int64=13) %!d(string=hai) anos
pai
achega
de7bb8a80d

+ 28 - 14
src/main/java/net/ranides/assira/text/format/AnsiFontArray.java

@@ -12,6 +12,8 @@ import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Collection;
 import net.ranides.assira.collection.list.VirtualList;
+import net.ranides.assira.generic.ValueUtils;
+import net.ranides.assira.math.HashHelper;
 
 /**
  *
@@ -20,28 +22,28 @@ import net.ranides.assira.collection.list.VirtualList;
 public class AnsiFontArray extends AnsiFontScheme implements Serializable {
 
     private static final long serialVersionUID = 0x101L;
-    
+
     private final Font[] array;
-    
+
     public AnsiFontArray(int size) {
         array = new Font[size];
     }
-    
+
     public AnsiFontArray(AnsiFontArray scheme) {
         this(scheme.array);
     }
-    
+
     public AnsiFontArray(Font[] fonts) {
         array = Arrays.copyOf(fonts, fonts.length);
     }
-    
+
     public AnsiFontArray(int fontSize, String[] fonts) {
         array = new Font[ fonts.length ];
         for(int i=0; i<fonts.length; i++) {
             array[i] = new Font(fonts[i], Font.PLAIN, fontSize);
         }
     }
-    
+
     @Override
     public Font getFont(int index) {
         return array[index];
@@ -56,11 +58,11 @@ public class AnsiFontArray extends AnsiFontScheme implements Serializable {
     public Collection<FontAttr> values() {
         return new ListView();
     }
-    
+
     public int size() {
         return array.length;
     }
-    
+
     private final class ListView extends VirtualList<FontAttr> {
         @Override
         public int size() {
@@ -71,12 +73,12 @@ public class AnsiFontArray extends AnsiFontScheme implements Serializable {
             return new FontAttrView(index);
         }
     }
-    
+
     @edu.umd.cs.findbugs.annotations.SuppressWarnings("SE_INNER_CLASS") // serializacja działa, więc nie kombinujmy
     private final class FontAttrView implements FontAttr, Serializable {
 
         private static final long serialVersionUID = 1L;
-        
+
         private final int index;
 
         public FontAttrView(int index) {
@@ -97,9 +99,21 @@ public class AnsiFontArray extends AnsiFontScheme implements Serializable {
         public void setFont(Font value) {
             AnsiFontArray.this.setFont(index, value);
         }
-        
-        
-        
+
+        @Override
+        public int hashCode() {
+            return HashHelper.generateHashCode(0, 0, getFont());
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof FontAttr) {
+                FontAttr attr = (FontAttr) obj;
+                return ValueUtils.isEqual(attr.getFont(), getFont());
+            }
+            return false;
+        }
+
     }
-    
+
 }

+ 26 - 10
src/main/java/net/ranides/assira/text/format/AnsiFontMap.java

@@ -12,6 +12,8 @@ import java.io.Serializable;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import net.ranides.assira.generic.ValueUtils;
+import net.ranides.assira.math.HashHelper;
 
 /**
  *
@@ -20,13 +22,13 @@ import java.util.Map;
 public class AnsiFontMap extends AnsiFontScheme implements Serializable {
 
     private static final long serialVersionUID = 0x101L;
-    
+
     final Map<Integer, FontAttr> map;
-    
+
     public AnsiFontMap() {
         map = new HashMap<Integer, FontAttr>();
     }
-    
+
     public AnsiFontMap(AnsiFontScheme scheme) {
         Collection<FontAttr> values = scheme.values();
         map = new HashMap<Integer, FontAttr>( values.size() );
@@ -47,17 +49,17 @@ public class AnsiFontMap extends AnsiFontScheme implements Serializable {
 
     @Override
     public void setFont(int index, Font value) {
-        if( !map.containsKey(index) ) { 
-            map.put(index, new FontAttrView(index, value)); 
+        if( !map.containsKey(index) ) {
+            map.put(index, new FontAttrView(index, value));
         } else {
             map.get(index).setFont(value);
         }
     }
-    
+
     private static final class FontAttrView implements FontAttr, Serializable {
-        
+
         private static final long serialVersionUID = 1L;
-        
+
         private final int index;
         private Font font;
 
@@ -65,7 +67,7 @@ public class AnsiFontMap extends AnsiFontScheme implements Serializable {
             this.index = index;
             this.font = font;
         }
-        
+
         public FontAttrView(FontAttr item) {
             this.index = item.index();
             this.font = item.getFont();
@@ -85,6 +87,20 @@ public class AnsiFontMap extends AnsiFontScheme implements Serializable {
         public void setFont(Font value) {
             this.font = value;
         }
-        
+
+        @Override
+        public int hashCode() {
+            return HashHelper.generateHashCode(0, 0, getFont());
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof FontAttr) {
+                FontAttr attr = (FontAttr) obj;
+                return ValueUtils.isEqual(attr.getFont(), getFont());
+            }
+            return false;
+        }
+
     }
 }

+ 71 - 35
src/main/java/net/ranides/assira/text/format/AnsiFontScheme.java

@@ -9,15 +9,18 @@ package net.ranides.assira.text.format;
 import java.awt.Font;
 import java.io.Serializable;
 import java.util.Collection;
+import net.ranides.assira.collection.CollectionUtils;
 import net.ranides.assira.collection.SingleCollection;
+import net.ranides.assira.generic.ValueUtils;
+import net.ranides.assira.math.HashHelper;
 
 /**
  * Schemat przyporządkowujący graficzne reprezentacje czcionek do numerów, które
- * są przechowywane w obiektach typu {@link AnsiCharSequence}. 
+ * są przechowywane w obiektach typu {@link AnsiCharSequence}.
  * @author ranides
  */
 public abstract class AnsiFontScheme {
-    
+
     /**
      * Pusty schemat kolorów. Zwraca {@code null} dla każdej wartości.
      */
@@ -25,24 +28,24 @@ public abstract class AnsiFontScheme {
 
     /**
      * Zwraca kolekcję wszystkich czcionek zapisanych w schemacie.
-     * @return 
+     * @return
      */
     public abstract Collection<FontAttr> values();
-    
+
     /**
      * Zwraca czcionkę o podanym indeksie.
      * @param index
      * @return
      */
     public abstract Font getFont(int index);
-    
+
     /**
      * Ustawia czcionkę o podanym indeksie.
      * @param index
      * @param value
      */
     public abstract void setFont(int index, Font value);
-    
+
     /**
      * Zwraca domyślną czcionkę (o indeksie 0).
      * @return
@@ -50,7 +53,7 @@ public abstract class AnsiFontScheme {
     public final Font getFont() {
         return getFont(0);
     }
-    
+
     /**
      * Ustawia domyślną czcionkę (o indeksie 0).
      * @param value
@@ -60,11 +63,11 @@ public abstract class AnsiFontScheme {
     }
 
 /* ************************************************************************** */
-    
+
     /**
      * Kopiuje podany schemat czcionek
      * @param scheme
-     * @return 
+     * @return
      */
     public static AnsiFontScheme copy(AnsiFontScheme scheme) {
         if(scheme instanceof AnsiFontArray) {
@@ -73,59 +76,59 @@ public abstract class AnsiFontScheme {
             return new AnsiFontMap(scheme);
         }
     }
-    
+
     /**
      * Tworzy <i>scheme</i> o nieograniczonym rozmiarze, w którym można przypisać
      * wartość do dowolnego klucza (ciąg kluczy nie musi być sekwencją). Klucz
      * 0 oznacza oczywiście (by convention) wartość domyślną.
-     * @return  
+     * @return
      */
     public static AnsiFontScheme make() {
         return new AnsiFontMap();
     }
-    
+
     /**
-     * Tworzy <i>scheme</i> o ustalonym rozmiarze {@code size}, w którym można 
+     * Tworzy <i>scheme</i> o ustalonym rozmiarze {@code size}, w którym można
      * używać kluczy z zakresu {@code [0...size]}. Klucz 0 oznacza oczywiście
      * (by convention) wartość domyślną.
      * @param size
-     * @return 
+     * @return
      */
     public static AnsiFontScheme make(int size) {
         return new AnsiFontArray(size+1);
     }
-    
+
     /**
-     * Tworzy <i>scheme</i> przechowujący pojedynczy atrybut pod indeksem 0. 
+     * Tworzy <i>scheme</i> przechowujący pojedynczy atrybut pod indeksem 0.
      * Użycie innych kluczy jest dozwolone ale zawsze ma wpływ na wartość domyślną
      * (prowadzi do niejednoznaczności).
-     * @param font 
-     * @return 
+     * @param font
+     * @return
      */
     public static AnsiFontScheme make(Font font) {
         return new AnsiSchemePlain(font);
     }
-    
+
 /* ************************************************************************** */
-    
-    
+
+
     /**
      * Element reprezentujący czcionkę przypisaną do danego indeksu w schemacie.
      */
     public interface FontAttr {
-        
+
         /**
          * Zwraca numer indeksu, z którym pozwiązana jest czcionka.
-         * @return 
+         * @return
          */
         int index();
-        
+
         /**
          * Zwraca czcionkę.
          * @return
          */
         Font getFont();
-        
+
         /**
          * Ustawia czcionkę powiązaną z indeksem, do którego jest przyporządkowany element.
          * Metoda modyfikuje schemat czcionek, który zwrócił element.
@@ -134,15 +137,15 @@ public abstract class AnsiFontScheme {
         void setFont(Font value);
 
     }
-    
-     
+
+
 /* ************************************************************************** */
-    
-    
+
+
     private static final class AnsiSchemePlain extends AnsiFontScheme implements Serializable {
 
         private static final long serialVersionUID = 0x200L;
-        
+
         private final FontAttrPlain font;
 
         public AnsiSchemePlain(Font font) {
@@ -164,14 +167,33 @@ public abstract class AnsiFontScheme {
             return new SingleCollection<FontAttr>(font);
         }
 
+        @Override
+        public int hashCode() {
+            return HashHelper.generateHashCode(0, 0, font);
+        }
+
+        @Override
+        public boolean equals(Object object) {
+            if (object instanceof AnsiFontScheme) {
+                AnsiFontScheme scheme = (AnsiFontScheme) object;
+                if(scheme.values().size() != 1) {
+                    return false;
+                }
+                return ValueUtils.isEqual(font, CollectionUtils.first(scheme.values()));
+            }
+            return false;
+        }
+
+
+
     }
-    
+
     private static final class FontAttrPlain implements FontAttr, Serializable {
-        
+
         private static final long serialVersionUID = 0x200L;
-        
+
         private Font font;
-        
+
         public FontAttrPlain(Font font) {
             this.font = font;
         }
@@ -190,6 +212,20 @@ public abstract class AnsiFontScheme {
         public void setFont(Font value) {
             this.font = value;
         }
+
+        @Override
+        public int hashCode() {
+            return HashHelper.generateHashCode(0, 0, getFont());
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof FontAttr) {
+                FontAttr attr = (FontAttr) obj;
+                return ValueUtils.isEqual(attr.getFont(), getFont());
+            }
+            return false;
+        }
     }
-    
+
 }

+ 9 - 6
src/main/java/net/ranides/assira/text/format/AnsiStringWrapper.java

@@ -8,30 +8,33 @@ package net.ranides.assira.text.format;
 
 import java.awt.Color;
 import java.awt.Font;
+import java.io.Serializable;
 import net.ranides.assira.collection.SingleCollection;
 
 /**
  * <p>
  * Klasa abstrakcyjna ułatwiająca pisanie wrapperów, które opakowują standardową
- * sekwencję znaków nadając wszystkim elementom atrybuty zwrócone przez metodę {@link #getAttr getAttr}. 
- * Metoda musi zwracać numery kolorów i czcionek kompatybilne ze schematami 
+ * sekwencję znaków nadając wszystkim elementom atrybuty zwrócone przez metodę {@link #getAttr getAttr}.
+ * Metoda musi zwracać numery kolorów i czcionek kompatybilne ze schematami
  * zwracanymi przez metody {@link #getScheme getScheme} oraz {@link #getFonts getFonts}.
  * Implementacja metody {@link #subAnsiSequence subAnsiSequence} najczęściej będzie miała w klasie
  * pochodnej {@code TWrapper} bardzo prostą implementację, jeśli tylko zostanie
  * dostarczony odpowiedni konstruktor:
  * </p>
- * <pre>{@code 
+ * <pre>{@code
  * return new TWrapper(subSequence(begin, end));
  * }</code>
  * @author ranides
  */
-public abstract class AnsiStringWrapper implements AnsiCharSequence {
-    
+public abstract class AnsiStringWrapper implements AnsiCharSequence, Serializable {
+
+    private static final long serialVersionUID = 3L;
+
     /**
      * Opakowywana sekwencja znaków.
      */
     protected final CharSequence value;
-    
+
     /**
      * Opakowuje podaną sekwencję znaków.
      * @param value

+ 34 - 0
src/test/java/net/ranides/assira/text/format/AnsiColorMapTest.java

@@ -0,0 +1,34 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.text.format;
+
+import java.io.IOException;
+import net.ranides.assira.generic.Serializer;
+import net.ranides.assira.text.format.AnsiColorScheme.ColorAttr;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author ranides
+ */
+public class AnsiColorMapTest {
+
+    public AnsiColorMapTest() {
+    }
+
+    @Test
+    public void testSerialization() throws IOException {
+        final AnsiColorScheme input = new AnsiColorMap(new AnsiColorArray(new int[]{1,2,3,4}, new int[]{10,20,30,40}));
+
+        AnsiColorScheme output = Serializer.copy(input);
+
+        for(ColorAttr expected : input.values()) {
+            assertTrue( output.values().contains(expected) );
+        }
+    }
+}

+ 37 - 0
src/test/java/net/ranides/assira/text/format/AnsiFontArrayTest.java

@@ -0,0 +1,37 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.text.format;
+
+import java.awt.Font;
+import java.io.IOException;
+import net.ranides.assira.generic.Serializer;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author ranides
+ */
+public class AnsiFontArrayTest {
+
+    public AnsiFontArrayTest() {
+    }
+
+    @Test
+    public void testSerialization() throws IOException {
+        final AnsiFontScheme input = new AnsiFontArray(new Font[]{
+            new Font("arial", 0, 12),
+            new Font("verdana", 0, 16),
+        });
+
+        AnsiFontScheme output = Serializer.copy(input);
+
+        for(AnsiFontScheme.FontAttr expected : input.values()) {
+            assertTrue( output.values().contains(expected) );
+        }
+    }
+}

+ 37 - 0
src/test/java/net/ranides/assira/text/format/AnsiFontMapTest.java

@@ -0,0 +1,37 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.text.format;
+
+import java.awt.Font;
+import java.io.IOException;
+import net.ranides.assira.generic.Serializer;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author ranides
+ */
+public class AnsiFontMapTest {
+
+    public AnsiFontMapTest() {
+    }
+
+    @Test
+    public void testSerialization() throws IOException {
+        final AnsiFontScheme input = new AnsiFontMap(new AnsiFontArray(new Font[]{
+            new Font("arial", 0, 12),
+            new Font("verdana", 0, 16),
+        }));
+
+        AnsiFontScheme output = Serializer.copy(input);
+
+        for(AnsiFontScheme.FontAttr expected : input.values()) {
+            assertTrue( output.values().contains(expected) );
+        }
+    }
+}

+ 40 - 0
src/test/java/net/ranides/assira/text/format/AnsiFontSchemeTest.java

@@ -0,0 +1,40 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.text.format;
+
+import java.awt.Font;
+import java.io.IOException;
+import net.ranides.assira.generic.Serializer;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author ranides
+ */
+public class AnsiFontSchemeTest {
+
+    public AnsiFontSchemeTest() {
+    }
+
+    @Test
+    public void testSerializationEmpty() throws IOException {
+        AnsiFontScheme input = AnsiFontScheme.EMPTY;
+
+        AnsiFontScheme output = Serializer.copy(input);
+
+        assertEquals(input, output);
+    }
+
+    @Test
+    public void testSerializationSingle() throws IOException {
+        AnsiFontScheme input = AnsiFontScheme.make(new Font("Arial", 0, 12));
+
+        AnsiFontScheme output = Serializer.copy(input);
+        assertEquals(input, output);
+    }
+}