gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r18421 - in gnunet-java: src/org/gnunet/construct src/org/g


From: gnunet
Subject: [GNUnet-SVN] r18421 - in gnunet-java: src/org/gnunet/construct src/org/gnunet/construct/parsers src/org/gnunet/messages test/org/gnunet/construct
Date: Thu, 1 Dec 2011 14:05:51 +0100

Author: dold
Date: 2011-12-01 14:05:50 +0100 (Thu, 01 Dec 2011)
New Revision: 18421

Added:
   gnunet-java/src/org/gnunet/messages/VarTestMessage.java
Modified:
   gnunet-java/src/org/gnunet/construct/ByteFill.java
   gnunet-java/src/org/gnunet/construct/Construct.java
   gnunet-java/src/org/gnunet/construct/Fill.java
   gnunet-java/src/org/gnunet/construct/FixedSizeArray.java
   gnunet-java/src/org/gnunet/construct/FrameSize.java
   gnunet-java/src/org/gnunet/construct/VariableSizeArray.java
   gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java
   gnunet-java/src/org/gnunet/construct/parsers/FieldParser.java
   gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java
   gnunet-java/src/org/gnunet/construct/parsers/SequenceParser.java
   gnunet-java/src/org/gnunet/construct/parsers/StringParser.java
   gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java
   gnunet-java/test/org/gnunet/construct/ConstructTest.java
Log:
implemented / fixed variable size array parser

Modified: gnunet-java/src/org/gnunet/construct/ByteFill.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/ByteFill.java  2011-12-01 12:14:30 UTC 
(rev 18420)
+++ gnunet-java/src/org/gnunet/construct/ByteFill.java  2011-12-01 13:05:50 UTC 
(rev 18421)
@@ -6,7 +6,7 @@
 import java.lang.annotation.Target;
 
 /**
- * Fills a byte array with the rest of the message in the current frame.
+ * Fills a byte array with the remaining data of the current frame.
  * 
  * @author Florian Dold
  * 

Modified: gnunet-java/src/org/gnunet/construct/Construct.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/Construct.java 2011-12-01 12:14:30 UTC 
(rev 18420)
+++ gnunet-java/src/org/gnunet/construct/Construct.java 2011-12-01 13:05:50 UTC 
(rev 18421)
@@ -2,6 +2,7 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -15,6 +16,7 @@
 import org.gnunet.construct.parsers.Parser;
 import org.gnunet.construct.parsers.SequenceParser;
 import org.gnunet.construct.parsers.StringParser;
+import org.gnunet.construct.parsers.VariableSizeArrayParser;
 import org.gnunet.messages.Message;
 import org.grothoff.Runabout;
 
@@ -64,8 +66,8 @@
 
     
     /**
+     * Create a Parser for a sub-class of Message.
      * 
-     * 
      * @param c
      * @return
      */
@@ -86,6 +88,7 @@
             ParserGenerator pg) {
 
         SequenceParser parser = new SequenceParser(null);
+        pg.c = c;
 
         Field[] fs = c.getFields();
         for (Field f : fs) {
@@ -111,6 +114,8 @@
         Field field;
         Annotation[] annotations;
         int annotationsIdx;
+        
+        Class c;
 
         FieldParser parser;
 
@@ -126,7 +131,6 @@
         }
 
         public void visit(FrameSize ts) {
-            // set total_size_path to path
 
             total_size_path = new LinkedList<Field>(path);
             total_size_path.add(field);
@@ -139,7 +143,6 @@
 
         }
 
-        // Integer Types
 
         public void visit(UInt8 i) {
             parser = new IntegerParser(1, IntegerParser.UNSIGNED, field);
@@ -216,7 +219,26 @@
 
             parser = new FixedSizeArrayParser(elemNumber, parser, f);
         }
+        
+        
+        public void visit(VariableSizeArray vsa) {
+            Field f = field;
+            Class old_c = c;
+            
+            getParser((Class<? extends Message>) field.getType()
+                    .getComponentType(), this);
 
+            try {
+                System.out.println(c);
+                parser = new VariableSizeArrayParser(parser, 
old_c.getField(vsa.lengthField()), f);
+                
+            } catch (SecurityException e) {
+                throw new RuntimeException();
+            } catch (NoSuchFieldException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
     }
 
     /**
@@ -259,5 +281,23 @@
         Parser p = getParser(m.getClass());
         p.patchSizeFields(m, p.getSize(m));
     }
+    
+    public enum NumFieldType {
+            BIGNUM, BYTE_PRIM, SHORT_PRIM, INT_PRIM, LONG_PRIM
+    }
+    
+    public static NumFieldType getNumFieldType(Field f) {
+        if (f.getType().equals(BigInteger.class)) {
+            return NumFieldType.BIGNUM;
+        } else if (f.getType().equals(Long.TYPE)) {
+            return NumFieldType.LONG_PRIM;
+        } else if (f.getType().equals(Short.TYPE)) {
+            return NumFieldType.SHORT_PRIM;
+        } else if (f.getType().equals(java.lang.Integer.TYPE)) {
+            return NumFieldType.INT_PRIM;
+        } else {
+            throw new RuntimeException("target type not supported");
+        }
+    }
 
 }

Modified: gnunet-java/src/org/gnunet/construct/Fill.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/Fill.java      2011-12-01 12:14:30 UTC 
(rev 18420)
+++ gnunet-java/src/org/gnunet/construct/Fill.java      2011-12-01 13:05:50 UTC 
(rev 18421)
@@ -6,7 +6,7 @@
 import java.lang.annotation.Target;
 
 /**
- * Fills a byte array with the rest of the message in the buffer.
+ * Fills an array of messages with the rest of the message in the buffer.
  * 
  * @author Florian Dold
  * 

Modified: gnunet-java/src/org/gnunet/construct/FixedSizeArray.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/FixedSizeArray.java    2011-12-01 
12:14:30 UTC (rev 18420)
+++ gnunet-java/src/org/gnunet/construct/FixedSizeArray.java    2011-12-01 
13:05:50 UTC (rev 18421)
@@ -5,6 +5,11 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+/**
+ * Parse an array of messages with fixed size.
+ * @author Florian Dold
+ *
+ */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.FIELD)
 public @interface FixedSizeArray {

Modified: gnunet-java/src/org/gnunet/construct/FrameSize.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/FrameSize.java 2011-12-01 12:14:30 UTC 
(rev 18420)
+++ gnunet-java/src/org/gnunet/construct/FrameSize.java 2011-12-01 13:05:50 UTC 
(rev 18421)
@@ -6,8 +6,8 @@
 import java.lang.annotation.Target;
 
 /**
+ * Marker for the field storing the size of the enclosing frame in bytes.
  * 
- * 
  * @author Florian Dold
  * 
  */

Modified: gnunet-java/src/org/gnunet/construct/VariableSizeArray.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/VariableSizeArray.java 2011-12-01 
12:14:30 UTC (rev 18420)
+++ gnunet-java/src/org/gnunet/construct/VariableSizeArray.java 2011-12-01 
13:05:50 UTC (rev 18421)
@@ -8,7 +8,5 @@
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.FIELD)
 public @interface VariableSizeArray {
-    // set to empty string to make the array extend to fill the available
-    // space
     String lengthField();
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java    
2011-12-01 12:14:30 UTC (rev 18420)
+++ gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java    
2011-12-01 13:05:50 UTC (rev 18421)
@@ -13,9 +13,9 @@
  * 
  */
 public class ByteFillParser extends FieldParser {
-    FieldParser p;
+    private FieldParser p;
 
-    List<Field> totalSizePath;
+    private List<Field> totalSizePath;
 
     public ByteFillParser(List<Field> totalSizePath, Field field) {
         super(field);
@@ -27,7 +27,7 @@
         return Array.getLength(getFieldValue(src));
     }
 
-    public int getSizeFieldValue(Message m) {
+    private int getSizeFieldValue(Message m) {
         Object obj = m;
         for (Field f : totalSizePath) {
 
@@ -83,22 +83,22 @@
             }
 
         }
-        
+
         Field f = totalSizePath.get(totalSizePath.size() - 1);
 
+        // XXX: is there a better way to do this? => yes, with switch / 
NumFieldType
         try {
-            if (f.getType().equals(Long.TYPE)){
+            if (f.getType().equals(Long.TYPE)) {
                 f.setLong(obj, frameSize);
-            } else if (f.getType().equals(Integer.TYPE)){
+            } else if (f.getType().equals(Integer.TYPE)) {
                 f.setInt(obj, frameSize);
-            } else if (f.getType().equals(Short.TYPE)){
+            } else if (f.getType().equals(Short.TYPE)) {
                 f.setShort(obj, (short) frameSize);
-            } else if (f.getType().equals(Long.TYPE)){
+            } else if (f.getType().equals(Long.TYPE)) {
                 f.setLong(obj, frameSize);
             } else {
                 throw new RuntimeException("unexpected target type");
             }
-            
 
         } catch (IllegalArgumentException e) {
             throw new RuntimeException(e);

Modified: gnunet-java/src/org/gnunet/construct/parsers/FieldParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/FieldParser.java       
2011-12-01 12:14:30 UTC (rev 18420)
+++ gnunet-java/src/org/gnunet/construct/parsers/FieldParser.java       
2011-12-01 13:05:50 UTC (rev 18421)
@@ -33,15 +33,6 @@
         }
     }
     
-    public Object getFieldValueLong(final Object obj) {
-        try {
-            return field.getLong(obj);
-        } catch (final IllegalArgumentException e) {
-            throw new RuntimeException();
-        } catch (final IllegalAccessException e) {
-            throw new RuntimeException();
-        }
-    }
     
     public void setFieldValue(final Object obj, final Object val) {
         try {

Modified: gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java     
2011-12-01 12:14:30 UTC (rev 18420)
+++ gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java     
2011-12-01 13:05:50 UTC (rev 18421)
@@ -3,6 +3,7 @@
 import java.lang.reflect.Field;
 import java.math.BigInteger;
 
+import org.gnunet.construct.Construct;
 import org.gnunet.messages.Message;
 
 public class IntegerParser extends FieldParser {
@@ -13,29 +14,16 @@
     
     private final boolean isSigned;
 
-    static enum FieldType {
-        BIGNUM, BYTE_PRIM, SHORT_PRIM, INT_PRIM, LONG_PRIM
-    }
 
-    private FieldType ft;
+    private Construct.NumFieldType ft;
 
     public IntegerParser(final int byteSize, final boolean isSigned,
             final Field f) {
         super(f);
         this.byteSize = byteSize;
         this.isSigned = isSigned;
-
-        if (f.getType().equals(BigInteger.class)) {
-            ft = FieldType.BIGNUM;
-        } else if (f.getType().equals(Long.TYPE)) {
-            ft = FieldType.LONG_PRIM;
-        } else if (f.getType().equals(Short.TYPE)) {
-            ft = FieldType.SHORT_PRIM;
-        } else if (f.getType().equals(Integer.TYPE)) {
-            ft = FieldType.INT_PRIM;
-        } else {
-            throw new RuntimeException("target type not supported");
-        }
+        
+        ft = Construct.getNumFieldType(f);
     }
 
     @Override
@@ -59,7 +47,6 @@
         final BigInteger num = new BigInteger(numData);
 
         try {
-
             switch (ft) {
             case SHORT_PRIM:
                 field.setShort(dstObj, num.shortValue());

Modified: gnunet-java/src/org/gnunet/construct/parsers/SequenceParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/SequenceParser.java    
2011-12-01 12:14:30 UTC (rev 18420)
+++ gnunet-java/src/org/gnunet/construct/parsers/SequenceParser.java    
2011-12-01 13:05:50 UTC (rev 18421)
@@ -6,6 +6,11 @@
 
 import org.gnunet.messages.Message;
 
+/**
+ * A Sequence of Parsers that operate on the same object.
+ * @author Florian Dold
+ *
+ */
 public class SequenceParser extends FieldParser {
 
     private final List<FieldParser> childParsers = new 
LinkedList<FieldParser>();
@@ -50,7 +55,6 @@
     public void patchSizeFields(Message m, int frameSize) {
         for (final FieldParser p : childParsers) {
             p.patchSizeFields(m, frameSize);
-        }
-        
+        }  
     }
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/StringParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/StringParser.java      
2011-12-01 12:14:30 UTC (rev 18420)
+++ gnunet-java/src/org/gnunet/construct/parsers/StringParser.java      
2011-12-01 13:05:50 UTC (rev 18421)
@@ -32,7 +32,6 @@
             length++;
         }
 
-
         final byte[] stringData = new byte[length];
 
         System.arraycopy(srcData, offset, stringData, 0, length);

Modified: 
gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java   
2011-12-01 12:14:30 UTC (rev 18420)
+++ gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java   
2011-12-01 13:05:50 UTC (rev 18421)
@@ -25,7 +25,6 @@
             throw new RuntimeException("array not initialized");
         }
         
-        
         for (int i = 0; i < Array.getLength(arr); ++i) {
             size += elemParser.getSize((Message) Array.get(arr, i));
         }
@@ -82,8 +81,22 @@
 
     @Override
     public void patchSizeFields(Message m, int frameSize) {
-        //XXX: should this patch the length field, too?
-        return;
+        int size = Array.getLength(getFieldValue(m));
+        try {
+            if (sizeField.getType().equals(Long.TYPE)) {
+                sizeField.setLong(m, size);
+            } else if (sizeField.getType().equals(Integer.TYPE)) {
+                sizeField.setInt(m, size);
+            } else if (sizeField.getType().equals(Short.TYPE)) {
+                sizeField.setShort(m, (short) size);
+            } else {
+                throw new RuntimeException("unexpected target type");
+            }
+        } catch (IllegalArgumentException e) {
+            throw new RuntimeException(e);
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException();
+        }
     }
 
 }

Added: gnunet-java/src/org/gnunet/messages/VarTestMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/VarTestMessage.java                     
        (rev 0)
+++ gnunet-java/src/org/gnunet/messages/VarTestMessage.java     2011-12-01 
13:05:50 UTC (rev 18421)
@@ -0,0 +1,12 @@
+package org.gnunet.messages;
+
+import org.gnunet.construct.UInt16;
+import org.gnunet.construct.VariableSizeArray;
+
+public class VarTestMessage implements Message {
+    @UInt16
+    public long length;
+    
+    @VariableSizeArray(lengthField="length")
+    public SimpleTestMessage2[] msgs;
+}

Modified: gnunet-java/test/org/gnunet/construct/ConstructTest.java
===================================================================
--- gnunet-java/test/org/gnunet/construct/ConstructTest.java    2011-12-01 
12:14:30 UTC (rev 18420)
+++ gnunet-java/test/org/gnunet/construct/ConstructTest.java    2011-12-01 
13:05:50 UTC (rev 18421)
@@ -8,12 +8,34 @@
 import org.gnunet.messages.SimpleTestMessage2;
 import org.gnunet.messages.SizeTestMessage;
 import org.gnunet.messages.StringMessage;
+import org.gnunet.messages.VarTestMessage;
 import org.junit.Assert;
 import org.junit.Test;
 
 public class ConstructTest {
     
     @Test
+    public void test_VarTestMessage() {
+        VarTestMessage vtm = new VarTestMessage();
+        vtm.length = 5;
+        vtm.msgs = new SimpleTestMessage2[5];
+        for (int i=0; i < 5; ++i) {
+            vtm.msgs[i] = new SimpleTestMessage2();
+            vtm.msgs[i].value = i;
+        }
+        
+        byte[] a = Construct.toBinary(vtm);
+        
+        VarTestMessage vtm2 = Construct.parseAs(a, 0, VarTestMessage.class);
+        
+        Assert.assertEquals(vtm.length, vtm2.length);
+        for (int i=0; i < 5; ++i) {
+            Assert.assertEquals(vtm.msgs[i].value, vtm2.msgs[i].value);
+        }
+        
+    }
+    
+    @Test
     public void test_SimpleTestMessage() {
         SimpleTestMessage stm = new SimpleTestMessage();
         stm.v1 = 20;




reply via email to

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