gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r18226 - in gnunet-java: . src/org/gnunet/construct src/org


From: gnunet
Subject: [GNUnet-SVN] r18226 - in gnunet-java: . src/org/gnunet/construct src/org/gnunet/messages test/org/gnunet/construct
Date: Mon, 21 Nov 2011 00:28:02 +0100

Author: dold
Date: 2011-11-21 00:28:02 +0100 (Mon, 21 Nov 2011)
New Revision: 18226

Added:
   gnunet-java/src/org/gnunet/messages/SimpleTestMessage2.java
   gnunet-java/src/org/gnunet/messages/TestMessage3.java
Modified:
   gnunet-java/ISSUES
   gnunet-java/src/org/gnunet/construct/Construct.java
   gnunet-java/src/org/gnunet/construct/FieldLocation.java
   gnunet-java/src/org/gnunet/construct/ObjectParser.java
   gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java
   gnunet-java/src/org/gnunet/messages/ComplexTestMessage.java
   gnunet-java/src/org/gnunet/messages/MessageHeader.java
   gnunet-java/src/org/gnunet/messages/RelativeTimeNBO.java
   gnunet-java/src/org/gnunet/messages/SimpleTestMessage.java
   gnunet-java/test/org/gnunet/construct/ConstructTest.java
Log:
tests

Modified: gnunet-java/ISSUES
===================================================================
--- gnunet-java/ISSUES  2011-11-20 22:48:41 UTC (rev 18225)
+++ gnunet-java/ISSUES  2011-11-20 23:28:02 UTC (rev 18226)
@@ -49,9 +49,11 @@
  
  
  
- 
  * advantages of the "new" parsing/unparsing package
   * parsers are decoupled from annotations
     * => parsers could be pre-compiled
   * parsers are only constructed once per class
+ 
+ 
+ * what about TotalSize? 
  
\ No newline at end of file

Modified: gnunet-java/src/org/gnunet/construct/Construct.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/Construct.java 2011-11-20 22:48:41 UTC 
(rev 18225)
+++ gnunet-java/src/org/gnunet/construct/Construct.java 2011-11-20 23:28:02 UTC 
(rev 18226)
@@ -5,12 +5,8 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
-import java.lang.reflect.Array;
 import java.lang.reflect.Field;
-import java.math.BigInteger;
-import java.nio.ByteBuffer;
 
-import org.grothoff.Runabout;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -89,6 +85,17 @@
         String charset() default "UTF-8";
     }
 
+    /**
+     * Fill a byte array with the rest of the message in the buffer
+     * 
+     * @author dold
+     * 
+     */
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target(ElementType.FIELD)
+    public @interface Fill {
+    }
+
     public static <T> T parseWith(Parser p, byte[] data, int offset) {
         RefLocation rl = new RefLocation();
         Location[] locs = { rl };
@@ -101,21 +108,42 @@
 
         ObjectParser op = new ObjectParser(cls);
 
-        for (Field f : cls.getFields()) {
+        for (Field f : cls.getDeclaredFields()) {
             Annotation[] anns = f.getAnnotations();
             for (int i = 0; i < anns.length; ++i) {
                 Annotation ann = anns[i];
                 if (ann instanceof SignedInteger) {
+                    if (i != anns.length - 1) {
+                        throw new RuntimeException(
+                                "Further annotations are forbidden after 
@SignedInteger");
+                    }
                     SignedInteger a = (SignedInteger) ann;
                     op.add(new SignedIntegerParser(a.value()), f);
                 } else if (ann instanceof UnsignedInteger) {
+                    if (i != anns.length - 1) {
+                        throw new RuntimeException(
+                                "Further annotations are forbidden after 
@UnignedInteger");
+                    }
                     UnsignedInteger a = (UnsignedInteger) ann;
                     op.add(new UnsignedIntegerParser(a.value()), f);
                 } else if (ann instanceof TotalSize) {
-                    op.addSizeField(f);
+                        throw new UnsupportedOperationException("total size 
not yet implemented");
+
+                } else if (ann instanceof Nested) {
+                    // this needs to be the last annotation
+                    if (i != anns.length - 1) {
+                        throw new RuntimeException(
+                                "Futher annotations are forbidden after 
@Nested");
+                    }
+                    ObjectParser child = makeParser(f.getType());
+                    op.add(child, f);
+
                 } else if (ann instanceof FixedSizeArray) {
-                    throw new UnsupportedOperationException(
-                            "not yet implemented");
+                    FixedSizeArray a = (FixedSizeArray) ann;
+                    
+                    //op.add(new FixedSizeArrayParser(a.length(), ), fields)
+                    //throw new UnsupportedOperationException(
+                    //        "not yet implemented");
                     // look at anns[i+1]
                     // [...]
                 } else {
@@ -126,6 +154,7 @@
         }
         return op;
     }
+    
 
     /**
      * Given a byte array with a message, parse it into an object of type c. 
The
@@ -177,7 +206,7 @@
         ObjectParser p = makeParser(obj.getClass());
         return p.estimateSize(RefLocation.makeLocationsWith(obj));
     }
-    
+
     public static byte[] unparse(Object obj) {
         byte[] data = new byte[estimateSize(obj)];
         writeTo(obj, data, 0);

Modified: gnunet-java/src/org/gnunet/construct/FieldLocation.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/FieldLocation.java     2011-11-20 
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/construct/FieldLocation.java     2011-11-20 
23:28:02 UTC (rev 18226)
@@ -7,6 +7,7 @@
     private Object o;
     
     public FieldLocation(Field f, Object o) {
+        assert f != null;
         this.f = f;
         this.o = o;
     }
@@ -32,10 +33,8 @@
         try {
             return f.get(o);
         } catch (IllegalArgumentException e) {
-            // TODO Auto-generated catch block
             throw new RuntimeException();
         } catch (IllegalAccessException e) {
-            // TODO Auto-generated catch block
             throw new RuntimeException();
         }
     }

Modified: gnunet-java/src/org/gnunet/construct/ObjectParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/ObjectParser.java      2011-11-20 
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/construct/ObjectParser.java      2011-11-20 
23:28:02 UTC (rev 18226)
@@ -1,9 +1,12 @@
 package org.gnunet.construct;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.util.LinkedList;
 import java.util.List;
 
+import org.gnunet.construct.Construct.UnsignedInteger;
+
 class ParserRecord {
     Parser p;
     Field[] args;
@@ -15,6 +18,21 @@
 }
 
 public class ObjectParser implements Parser {
+    
+    /*
+    
+    
+    class TotalSizeParser implements Parser {
+    }
+    
+    
+    // the object parser stores the total size in the parsers before unparsing.
+    // TotalSize parsers do not affect parsing, except maybe for consistency 
checks
+    List<TotalSizeParser> total_size_parsers;
+    
+    
+    */
+    
 
     // parser with arguments
     List<ParserRecord> parser_records = new LinkedList<ParserRecord>();
@@ -32,16 +50,6 @@
     }
 
     /**
-     * Add a field which serves as storage for the byte size of the whole 
object
-     * 
-     * @param f
-     *            the relevant field
-     */
-    public void addSizeField(Field f) {
-        size_fields.add(f);
-    }
-
-    /**
      * Create locations from the Object's fields we are interested in
      * 
      * @param pr
@@ -49,6 +57,7 @@
      * @return
      */
     private Location[] getLocs(Field[] fs, Object obj) {
+        assert obj != null;
         Location[] locs = new Location[fs.length];
         for (int i = 0; i < locs.length; ++i) {
             locs[i] = new FieldLocation(fs[i], obj);
@@ -80,16 +89,6 @@
             parsed += x;
         }
 
-        for (Field f : size_fields) {
-            try {
-                f.set(obj, parsed);
-            } catch (IllegalArgumentException e) {
-                throw new RuntimeException();
-            } catch (IllegalAccessException e) {
-                throw new RuntimeException();
-            }
-        }
-
         loc.put(obj);
 
         return parsed;
@@ -98,11 +97,14 @@
     public int unparse(byte[] data, int offset, Location[] dest) {
         assert dest.length == 1;
         Object obj = dest[0].get();
+        assert obj != null;
 
+        int size = Construct.estimateSize(obj);
+
         int parsed = 0;
 
         for (ParserRecord pr : this.parser_records) {
-            
+
             parsed += pr.p
                     .unparse(data, offset + parsed, getLocs(pr.args, obj));
         }
@@ -111,8 +113,15 @@
 
     @Override
     public int estimateSize(Location[] args) {
+
         assert args.length == 1;
-        Object obj = args[0];
+        Object obj = args[0].get();
+
+        if (obj == null) {
+            throw new RuntimeException(
+                    "cannot deserialize null-reference as object");
+        }
+
         int size = 0;
         for (ParserRecord pr : this.parser_records) {
             // create locations from record

Modified: gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java     
2011-11-20 22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java     
2011-11-20 23:28:02 UTC (rev 18226)
@@ -64,6 +64,8 @@
     public int unparse(byte[] dst_data, int offset, Location[] src) {
         assert src.length == 1;
         Object obj = src[0].get();
+        assert obj != null;
+        
         BigInteger num;
         
         if (obj instanceof BigInteger) {

Modified: gnunet-java/src/org/gnunet/messages/ComplexTestMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/ComplexTestMessage.java 2011-11-20 
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/messages/ComplexTestMessage.java 2011-11-20 
23:28:02 UTC (rev 18226)
@@ -61,12 +61,12 @@
         p.add(lp, ComplexTestMessage.class.getField("stringTable"),
                 ComplexTestMessage.class.getField("stringTableSize"));
 
-        p.addSizeField(ComplexTestMessage.class.getField("mySize"));
+        //p.addSizeField(ComplexTestMessage.class.getField("mySize"));
 
         p.add(new UnsignedIntegerParser(2),
                 ComplexTestMessage.class.getField("storedMySize"));
 
-        p.addSizeField(ComplexTestMessage.class.getField("storedMySize"));
+        //p.addSizeField(ComplexTestMessage.class.getField("storedMySize"));
 
         return p;
     }

Modified: gnunet-java/src/org/gnunet/messages/MessageHeader.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/MessageHeader.java      2011-11-20 
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/messages/MessageHeader.java      2011-11-20 
23:28:02 UTC (rev 18226)
@@ -1,24 +1,20 @@
 package org.gnunet.messages;
 
+import org.gnunet.construct.Construct.Fill;
 import org.gnunet.construct.Construct.TotalSize;
 import org.gnunet.construct.Construct.UnsignedInteger;
-import org.gnunet.construct.Parser;
-import org.gnunet.construct.ObjectParser;
 
 public class MessageHeader {
 
+    @TotalSize
        @UnsignedInteger(2)
-       @TotalSize
        public int size;
        
     @UnsignedInteger(2)
     public int type;
     
     
-    public Parser getParser() {
-        ObjectParser p = new ObjectParser();
-        //p.addParser(new UnsignedIntegerParser(2, new FieldDest))
-    }
-
+    @Fill
+    byte[] body;
        
 }

Modified: gnunet-java/src/org/gnunet/messages/RelativeTimeNBO.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/RelativeTimeNBO.java    2011-11-20 
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/messages/RelativeTimeNBO.java    2011-11-20 
23:28:02 UTC (rev 18226)
@@ -1,6 +1,6 @@
 package org.gnunet.messages;
 
-import org.gnunet.construct.UnsignedInteger;
+import org.gnunet.construct.Construct.UnsignedInteger;
 import org.gnunet.util.RelativeTime;
 
 public class RelativeTimeNBO {
@@ -9,7 +9,7 @@
      * Value__ still in Java-byte order, needs to be converted to Network byte
      * order by the Construct class.
      */
-    @UnsignedInteger(64)
+    @UnsignedInteger(8)
     public long value__;
 
     public RelativeTimeNBO(long value) {

Modified: gnunet-java/src/org/gnunet/messages/SimpleTestMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/SimpleTestMessage.java  2011-11-20 
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/messages/SimpleTestMessage.java  2011-11-20 
23:28:02 UTC (rev 18226)
@@ -1,9 +1,8 @@
 package org.gnunet.messages;
 
+import org.gnunet.construct.Construct.Nested;
 import org.gnunet.construct.Construct.SignedInteger;
 import org.gnunet.construct.Construct.UnsignedInteger;
-import org.gnunet.construct.ObjectParser;
-import org.gnunet.construct.UnsignedIntegerParser;
 
 public class SimpleTestMessage {
     
@@ -12,4 +11,19 @@
     
     @SignedInteger(2)
     public short v2;
+    
+    @Nested
+    public SimpleTestMessage2 mn;
+    
+    
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof SimpleTestMessage)) {
+            return false;
+        }
+        SimpleTestMessage other = (SimpleTestMessage) obj;
+        
+        return v1 == other.v1 && v2 == other.v2 && mn.equals(other.mn);
+    }
 }

Added: gnunet-java/src/org/gnunet/messages/SimpleTestMessage2.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/SimpleTestMessage2.java                 
        (rev 0)
+++ gnunet-java/src/org/gnunet/messages/SimpleTestMessage2.java 2011-11-20 
23:28:02 UTC (rev 18226)
@@ -0,0 +1,20 @@
+package org.gnunet.messages;
+
+import org.gnunet.construct.Construct.UnsignedInteger;
+
+public class SimpleTestMessage2 {
+    
+    @UnsignedInteger(4)
+    public long value;
+    
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof SimpleTestMessage2)) {
+            return false;
+        }
+        SimpleTestMessage2 stm2 = (SimpleTestMessage2) obj;
+        return value == stm2.value;
+    }
+
+}

Added: gnunet-java/src/org/gnunet/messages/TestMessage3.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/TestMessage3.java                       
        (rev 0)
+++ gnunet-java/src/org/gnunet/messages/TestMessage3.java       2011-11-20 
23:28:02 UTC (rev 18226)
@@ -0,0 +1,14 @@
+package org.gnunet.messages;
+
+import org.gnunet.construct.Construct.FixedSizeArray;
+import org.gnunet.construct.Construct.UnsignedInteger;
+
+public class TestMessage3 {
+
+    @FixedSizeArray(length=10)
+    @UnsignedInteger(4)
+    public int[] arr;
+    
+    
+    
+}

Modified: gnunet-java/test/org/gnunet/construct/ConstructTest.java
===================================================================
--- gnunet-java/test/org/gnunet/construct/ConstructTest.java    2011-11-20 
22:48:41 UTC (rev 18225)
+++ gnunet-java/test/org/gnunet/construct/ConstructTest.java    2011-11-20 
23:28:02 UTC (rev 18226)
@@ -2,6 +2,8 @@
 
 import org.gnunet.messages.MessageHeader;
 import org.gnunet.messages.SimpleTestMessage;
+import org.gnunet.messages.SimpleTestMessage2;
+import org.gnunet.messages.TestMessage3;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -10,32 +12,46 @@
     @Test
     public void test_SimpleTestMessage_1() {
         ObjectParser op = Construct.makeParser(SimpleTestMessage.class);
-        byte[] a = { 0x02, 0x01, 0x00, 0x1c };
+        byte[] a = { 0x02, 0x01, // v1
+                0x00, 0x1c, // v2
+                0x00, 0x00, 0x00, 0x05 // nested
+        };
         SimpleTestMessage m = Construct.parseWith(op, a, 0);
 
         Assert.assertTrue(m.v1 == ((0x02 << 8) | 0x01));
         Assert.assertTrue(m.v2 == 0x1c);
 
-        Assert.assertEquals(4, Construct.estimateSize(m));
+        System.out.println(Construct.estimateSize(m));
+
+        Assert.assertEquals(8, Construct.estimateSize(m));
     }
 
     @Test
     public void test_SimpleTestMessage_2() {
         SimpleTestMessage m1 = new SimpleTestMessage();
-        
+
         m1.v1 = 42;
         m1.v2 = 420;
+        
+        m1.mn = new SimpleTestMessage2();
+        m1.mn.value = 300;
 
+
         byte[] data = Construct.unparse(m1);
-        
-        SimpleTestMessage m2 = Construct.parse(data, 0, 
SimpleTestMessage.class);
-        
-        Assert.assertEquals(m1.v1, m2.v1);
-        
-        Assert.assertEquals(m1.v2, m2.v2);
-        
-        
 
+        SimpleTestMessage m2 = Construct
+                .parse(data, 0, SimpleTestMessage.class);
+
+        Assert.assertEquals(m1, m2);
+
     }
+    
+    @Test
+    public void test_TestMessage3() {
+        TestMessage3 tm3 = new TestMessage3();
+        tm3.arr = new int[10];
+        
+        Assert.assertEquals(10*4, Construct.estimateSize(tm3));
+    }
 
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]