gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r21953 - in gnunet-java: . src/org/gnunet/construct src/org/gnunet/construct/parsers test/org/gnunet/construct
Date: Wed, 13 Jun 2012 13:45:41 +0200

Author: dold
Date: 2012-06-13 13:45:41 +0200 (Wed, 13 Jun 2012)
New Revision: 21953

Added:
   gnunet-java/test/org/gnunet/construct/ConstructTest.java
Modified:
   gnunet-java/ISSUES
   gnunet-java/src/org/gnunet/construct/Construct.java
   gnunet-java/src/org/gnunet/construct/ReflectUtil.java
   gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java
   gnunet-java/src/org/gnunet/construct/parsers/DoubleParser.java
   gnunet-java/src/org/gnunet/construct/parsers/FillParser.java
   gnunet-java/src/org/gnunet/construct/parsers/FixedSizeArrayParser.java
   gnunet-java/src/org/gnunet/construct/parsers/FixedSizeByteArrayParser.java
   gnunet-java/src/org/gnunet/construct/parsers/IntegerFillParser.java
   gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java
   gnunet-java/src/org/gnunet/construct/parsers/NestedParser.java
   gnunet-java/src/org/gnunet/construct/parsers/Parser.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/UnionParser.java
   gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java
Log:
parser caching in construct now works again, implemented the new @FillWith 
syntax

Modified: gnunet-java/ISSUES
===================================================================
--- gnunet-java/ISSUES  2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/ISSUES  2012-06-13 11:45:41 UTC (rev 21953)
@@ -137,6 +137,9 @@
 
 ============================================================
 
+* test now run on the cobertura account :)
+ * see https://gnunet.org/cobertura/
+
 gnunet needs to compiled with --disable-nls to work on the cobertura accout
 
 

Modified: gnunet-java/src/org/gnunet/construct/Construct.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/Construct.java 2012-06-13 11:42:49 UTC 
(rev 21952)
+++ gnunet-java/src/org/gnunet/construct/Construct.java 2012-06-13 11:45:41 UTC 
(rev 21953)
@@ -142,20 +142,13 @@
             parser.add(pg.parser);
         }
 
+        parser.setFrameSizePath(pg.frameSizePath);
+
         return parser;
     }
 
-    public static Parser getParser(Class cls, List<Field> frameSizePath, 
List<Field> pathFromRoot) {
-        ParserGenerator pg = new ParserGenerator();
-        pg.frameSizePath = new ArrayList<Field>(frameSizePath);
-        pg.path = new ArrayList<Field>(pathFromRoot);
-        return getParser(cls, pg);
-    }
-
-    // has to be public, accessed by Runabout (todo: can we do something about 
this scope issue?)
-
     @SuppressWarnings("UnusedDeclaration")
-    public static class ParserGenerator extends Runabout {
+    static class ParserGenerator extends Runabout {
 
         // the field we are currently generating a parser for
         Field field;
@@ -181,33 +174,9 @@
         private ParserGenerator() {
         }
 
-        private static List<Field> getFieldPathFromString(final String p, 
final Class root) {
-            Class current = root;
-
-            String[] components = p.split("[.]");
-
-            List<Field> fp = new ArrayList<Field>(components.length);
-            for (String member : components) {
-                Field f;
-                try {
-                    f = current.getField(member);
-                } catch (NoSuchFieldException e) {
-                    throw new AssertionError("invalid field path, component " 
+ member + " not found");
-                }
-
-                fp.add(f);
-
-                current = f.getType();
-            }
-
-            return fp;
-
-        }
-
         public void visit(Union u) {
-            parser = new UnionParser(frameSizePath, u.optional(),
-                    (Class<MessageUnion>) field.getType(),
-                    getFieldPathFromString(u.tag(), c), field, path);
+            parser = new UnionParser(u.optional(), (Class<MessageUnion>) 
field.getType(),
+                    ReflectUtil.getFieldPathFromString(u.tag(), c), field);
         }
 
         public void visit(FrameSize ts) {
@@ -267,7 +236,7 @@
         }
 
         public void visit(IntegerFill i) {
-            parser = new IntegerFillParser(frameSizePath, field, i.signed(), 
i.bitSize() / 8);
+            parser = new IntegerFillParser(field, i.signed(), i.bitSize() / 8);
         }
 
         public void visit(NestedMessage n) {
@@ -282,7 +251,7 @@
                 ParserGenerator pg = new ParserGenerator();
                 Parser p = getParser((Class<Message>) nestedField.getType(), 
pg);
 
-                parser = new NestedParser(p, pg.frameSizePath, n.optional(), 
nestedField, true);
+                parser = new NestedParser(p, n.optional(), nestedField, true);
 
             } else {
                 Field old_f = field;
@@ -295,19 +264,13 @@
 
                 path = old_path;
                 c = old_c;
-                LinkedList<Field> copy = frameSizePath == null ? null : new 
LinkedList<Field>(frameSizePath);
 
-                parser = new NestedParser(p, copy, n.optional(), old_f, false);
+                parser = new NestedParser(p, n.optional(), old_f, false);
             }
         }
 
         public void visit(ByteFill bf) {
-            if (frameSizePath == null) {
-                throw new AssertionError(
-                        "no total size found before variable size element");
-            }
-
-            parser = new ByteFillParser(frameSizePath, field);
+            parser = new ByteFillParser(field);
         }
 
 
@@ -315,7 +278,6 @@
             Field f = field;
             int elemNumber = fsa.length();
 
-            //noinspection unchecked
             getParser((Class<? extends Message>) field.getType()
                     .getComponentType(), this);
 
@@ -337,26 +299,31 @@
         }
 
         public void visit(FillWith fw) {
-            Field f = field;
-            Class old_c = c;
+            annotationsIdx++;
+            // if there's no further annotation, act like there is @Nested
+            if (annotationsIdx >= annotations.length) {
+                Parser p = getParser((Class<? extends Message>) 
field.getType().getComponentType());
+                parser = new FillParser(p, field);
+            } else {
+                FillWithParserRunabout r = new FillWithParserRunabout(field);
+                r.visitAppropriate(annotations[annotationsIdx]);
+                if (r.p == null) {
+                    throw new AssertionError();
+                }
+                parser = r.p;
+            }
 
-            Parser p = getParser((Class<? extends Message>) field.getType()
-                    .getComponentType(), this);
 
-            parser = new FillParser(p, frameSizePath, f);
+
         }
 
         public void visit(VariableSizeArray vsa) {
-            Field f = field;
-            Class old_c = c;
-
-
             Parser p = getParser((Class<? extends Message>) field.getType()
-                    .getComponentType(), this);
+                    .getComponentType());
 
             try {
-                parser = new VariableSizeArrayParser(p, old_c.getField(vsa
-                        .lengthField()), f);
+                parser = new VariableSizeArrayParser(p, c.getField(vsa
+                        .lengthField()), field);
 
             } catch (SecurityException e) {
                 throw new AssertionError(
@@ -366,7 +333,7 @@
             } catch (NoSuchFieldException e) {
                 throw new AssertionError(String.format(
                         "VariableSizeArray: length field '%s' does not exist 
in class %s",
-                        vsa.lengthField(), old_c));
+                        vsa.lengthField(), c));
             }
         }
 
@@ -384,6 +351,40 @@
         }
     }
 
+
+    private static class FillWithParserRunabout extends Runabout {
+        public Parser p;
+        private Field f;
+
+        public FillWithParserRunabout(Field f) {
+            this.f = f;
+        }
+
+        public void visit(Int8 x) {
+            p = new IntegerFillParser(f, true, 1);
+        }
+        public void visit(Int16 x) {
+            p = new IntegerFillParser(f, true, 2);
+        }
+        public void visit(Int32 x) {
+            p = new IntegerFillParser(f, true, 4);
+        }
+        public void visit(UInt8 x) {
+            p = new IntegerFillParser(f, false, 1);
+        }
+        public void visit(UInt16 x) {
+            p = new IntegerFillParser(f, false, 2);
+        }
+        public void visit(UInt32 x) {
+            p = new IntegerFillParser(f, false, 4);
+        }
+        public void visit(NestedMessage n) {
+            Parser componentParser = getParser((Class<? extends Message>) 
f.getType().getComponentType());
+            p = new FillParser(componentParser, f);
+        }
+
+    }
+
     /**
      * Serialize a given message object to a binary byte array. The fields of
      * the object are expected to be annotated with annotations from the
@@ -421,7 +422,7 @@
 
     public static void patch(Message m) {
         Parser p = getParser(m.getClass());
-        p.patch(m, p.getSize(m), m);
+        p.patch(m, p.getSize(m), null, m);
     }
 
 }

Modified: gnunet-java/src/org/gnunet/construct/ReflectUtil.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/ReflectUtil.java       2012-06-13 
11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/ReflectUtil.java       2012-06-13 
11:45:41 UTC (rev 21953)
@@ -24,6 +24,7 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigInteger;
+import java.util.ArrayList;
 import java.util.List;
 
 public class ReflectUtil {
@@ -200,4 +201,68 @@
                     String.format("Cannot access private field %s in class 
%s", f, obj.getClass()));
         }
     }
+
+
+    public static int justGetInt(Object obj, List<Field> path) {
+        for (int i = 0; i < path.size() - 1; ++i) {
+            try {
+                obj = path.get(i).get(obj);
+            } catch (IllegalArgumentException e) {
+                throw new RuntimeException(e);
+            } catch (IllegalAccessException e) {
+                throw new AssertionError("cannot access field " + path.get(i)
+                        + " of " + obj.getClass());
+            }
+        }
+
+        try {
+            return path.get(path.size() - 1).getInt(obj);
+        } catch (IllegalAccessException e) {
+            throw new AssertionError("cannot access field " + 
path.get(path.size() - 1)
+                    + " of " + obj.getClass());
+        }
+    }
+
+    public static void justSetInt(Object obj, List<Field> path, int val) {
+        for (int i = 0; i < path.size() - 1; ++i) {
+            try {
+                obj = path.get(i).get(obj);
+            } catch (IllegalArgumentException e) {
+                throw new RuntimeException(e);
+            } catch (IllegalAccessException e) {
+                throw new AssertionError("cannot access field " + path.get(i)
+                        + " of " + obj.getClass());
+            }
+        }
+
+        try {
+            path.get(path.size() - 1).setInt(obj, val);
+        } catch (IllegalAccessException e) {
+            throw new AssertionError("cannot access field " + 
path.get(path.size() - 1)
+                    + " of " + obj.getClass());
+        }
+    }
+
+
+    public static List<Field> getFieldPathFromString(final String p, final 
Class root) {
+        Class current = root;
+
+        String[] components = p.split("[.]");
+
+        List<Field> fp = new ArrayList<Field>(components.length);
+        for (String member : components) {
+            Field f;
+            try {
+                f = current.getField(member);
+            } catch (NoSuchFieldException e) {
+                throw new AssertionError("invalid field path, component " + 
member + " not found");
+            }
+
+            fp.add(f);
+
+            current = f.getType();
+        }
+
+        return fp;
+    }
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java    
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java    
2012-06-13 11:45:41 UTC (rev 21953)
@@ -42,22 +42,12 @@
 public class ByteFillParser implements Parser {
     private static final Logger logger = LoggerFactory
             .getLogger(ByteFillParser.class);
-
-    /**
-     * The total size path stores where the total size field is located,
-     * relative to the frame object.
-     */
-    private final List<Field> totalSizePath;
     
-    private final ReflectUtil.NumField totalSizeField;
-    
     private final Field targetField;
 
 
-    public ByteFillParser(List<Field> totalSizePath, Field field) {
+    public ByteFillParser(Field field) {
         targetField = field;
-        this.totalSizePath = totalSizePath;
-        totalSizeField = new 
ReflectUtil.NumField(totalSizePath.get(totalSizePath.size() - 1));
     }
 
     @Override
@@ -68,7 +58,7 @@
 
     @Override
     public int parse(ByteBuffer srcBuf, int frameOffset, Message frameObj, 
Message dst, List<Field> frameSizePath) {
-        int frameSize = (int) 
totalSizeField.get(ReflectUtil.followFieldPathToParent(totalSizePath, 
frameObj));
+        int frameSize = ReflectUtil.justGetInt(frameObj, frameSizePath);
         int remaining = frameOffset + frameSize - srcBuf.position();
 
         if (remaining < 0) {
@@ -97,8 +87,8 @@
     }
 
     @Override
-    public void patch(Message message, int frameSize, Message frameObject) {
+    public void patch(Message message, int frameSize, List<Field> 
frameSizePath, Message frameObject) {
         // the size field is contained in the frameObject
-        totalSizeField.set(ReflectUtil.followFieldPathToParent(totalSizePath, 
frameObject), frameSize);
+        ReflectUtil.justSetInt(frameObject, frameSizePath, frameSize);
     }
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/DoubleParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/DoubleParser.java      
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/DoubleParser.java      
2012-06-13 11:45:41 UTC (rev 21953)
@@ -64,7 +64,7 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize, Message frameObj) {
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj) {
         // nothing to do here
     }
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/FillParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/FillParser.java        
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/FillParser.java        
2012-06-13 11:45:41 UTC (rev 21953)
@@ -38,14 +38,9 @@
 
     private final Field targetField;
 
-    private final List<Field> totalSizePath;
-    private final ReflectUtil.NumField totalSizeField;
-
-    public FillParser(Parser p, List<Field> totalSizePath, Field field) {
+    public FillParser(Parser p, Field field) {
         targetField = field;
         elemParser = p;
-        this.totalSizePath = totalSizePath;
-        totalSizeField = new 
ReflectUtil.NumField(totalSizePath.get(totalSizePath.size() - 1));
     }
 
     @Override
@@ -67,7 +62,7 @@
     public int parse(ByteBuffer srcBuf, int frameOffset,
                      Message frameObj, final Message dstObj, List<Field> 
frameSizePath) {
 
-        final int frameSize = (int) 
totalSizeField.get(ReflectUtil.followFieldPathToParent(totalSizePath, 
frameObj));
+        final int frameSize = ReflectUtil.justGetInt(dstObj, frameSizePath);
         int remaining = frameOffset + frameSize - srcBuf.position();
         int size = 0;
 
@@ -101,8 +96,13 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize, Message frameObj) {
-        totalSizeField.set(ReflectUtil.followFieldPathToParent(totalSizePath, 
m), frameSize);
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj) {
+        if (frameSizePath == null) {
+            throw new AssertionError();
+        }
+        ReflectUtil.justSetInt(frameObj, frameSizePath, frameSize);
+
+        // todo: patch nested messages
     }
 
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/FixedSizeArrayParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/FixedSizeArrayParser.java      
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/FixedSizeArrayParser.java      
2012-06-13 11:45:41 UTC (rev 21953)
@@ -89,10 +89,10 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize, Message frameObj) {
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj) {
         final Object arr = ReflectUtil.justGet(m, targetField);
         for (int i = 0; i < Array.getLength(arr); ++i) {
-            elemParser.patch((Message) Array.get(arr, i), frameSize, frameObj);
+            elemParser.patch((Message) Array.get(arr, i), frameSize, null, 
frameObj);
         }
     }
 }

Modified: 
gnunet-java/src/org/gnunet/construct/parsers/FixedSizeByteArrayParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/FixedSizeByteArrayParser.java  
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/FixedSizeByteArrayParser.java  
2012-06-13 11:45:41 UTC (rev 21953)
@@ -60,7 +60,7 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize, Message frameObj) {
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj) {
         // nothing to do
     }
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/IntegerFillParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/IntegerFillParser.java 
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/IntegerFillParser.java 
2012-06-13 11:45:41 UTC (rev 21953)
@@ -29,18 +29,13 @@
 import java.util.List;
 
 public class IntegerFillParser implements Parser {
-
-    private final List<Field> totalSizePath;
-    private final ReflectUtil.NumField totalSizeField;
     private final Field targetField;
     private final boolean signed;
     private final int byteSize;
 
-    public IntegerFillParser(List<Field> totalSizePath, Field targetField,
+    public IntegerFillParser(Field targetField,
                              boolean signed, int byteSize ) {
 
-        this.totalSizePath = totalSizePath;
-        this.totalSizeField = new 
ReflectUtil.NumField(totalSizePath.get(totalSizePath.size() - 1));
         this.targetField = targetField;
         this.signed = signed;
         this.byteSize = byteSize;
@@ -60,7 +55,7 @@
 
     @Override
     public int parse(ByteBuffer srcBuf, int frameStart, Message frameObj, 
Message dstObj, List<Field> frameSizePath) {
-        final int frameSize = (int) 
totalSizeField.get(ReflectUtil.followFieldPathToParent(totalSizePath, 
frameObj));
+        final int frameSize = ReflectUtil.justGetInt(frameObj, frameSizePath);
         int remaining = frameStart + frameSize - srcBuf.position();
 
         throw new UnsupportedOperationException("not yet implemented");
@@ -84,7 +79,7 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize, Message frameObj) {
-        totalSizeField.set(ReflectUtil.followFieldPathToParent(totalSizePath, 
frameObj), frameSize);
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj) {
+        ReflectUtil.justSetInt(frameObj, frameSizePath, frameSize);
     }
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java     
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java     
2012-06-13 11:45:41 UTC (rev 21953)
@@ -79,7 +79,7 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize, Message frameObj) {
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj) {
         // nothing to do
     }
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/NestedParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/NestedParser.java      
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/NestedParser.java      
2012-06-13 11:45:41 UTC (rev 21953)
@@ -33,16 +33,14 @@
     private final Field targetField;
 
     private final Parser nestedParser;
-    private List<Field> frameSizePath;
     private boolean newFrame;
 
     boolean optional;
 
-    public NestedParser(final Parser p, List<Field> frameSizePath, boolean 
optional, final Field f, boolean newFrame) {
+    public NestedParser(final Parser p, boolean optional, final Field f, 
boolean newFrame) {
         targetField = f;
         this.optional = optional;
         this.nestedParser = p;
-        this.frameSizePath = frameSizePath;
         this.newFrame = newFrame;
     }
 
@@ -52,11 +50,6 @@
         return nestedParser.getSize(inner);
     }
 
-    private int getSizeFieldValue(Message m) {
-        Object obj = ReflectUtil.followFieldPath(frameSizePath, m);
-        return ((Number) obj).intValue();
-    }
-
     @Override
     public int parse(final ByteBuffer srcBuf, int frameOffset, Message 
frameObj, final Message dstObj, List<Field>
             frameSizePath) {
@@ -67,7 +60,7 @@
 
 
         if (optional) {
-            int remaining = frameOffset + getSizeFieldValue(frameObj) - 
srcBuf.position();
+            int remaining = frameOffset + ReflectUtil.justGetInt(frameObj, 
frameSizePath) - srcBuf.position();
             if (remaining < 0) {
                 throw new ProtocolViolation("remaining size negative");
             }
@@ -83,7 +76,7 @@
         ReflectUtil.justSet(dstObj, targetField, 
ReflectUtil.justInstantiate(targetField.getType()));
 
         return nestedParser.parse(srcBuf, frameOffset,
-                frameObj, (Message) ReflectUtil.justGet(dstObj, targetField), 
null);
+                frameObj, (Message) ReflectUtil.justGet(dstObj, targetField), 
frameSizePath);
     }
 
     @Override
@@ -92,13 +85,13 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize, Message frameObj) {
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj) {
         Message nestedMessage = (Message) ReflectUtil.justGet(m, targetField);
 
         if (newFrame) {
-            nestedParser.patch(nestedMessage, 
nestedParser.getSize(nestedMessage), m);
+            nestedParser.patch(nestedMessage, 
nestedParser.getSize(nestedMessage), null, m);
         } else {
-            nestedParser.patch(nestedMessage, frameSize, frameObj);
+            nestedParser.patch(nestedMessage, frameSize, frameSizePath, 
frameObj);
         }
     }
 

Modified: gnunet-java/src/org/gnunet/construct/parsers/Parser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/Parser.java    2012-06-13 
11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/Parser.java    2012-06-13 
11:45:41 UTC (rev 21953)
@@ -64,8 +64,9 @@
      *
      * @param m the message object to patch
      * @param frameSize the size of the containing message
+     * @param frameSizePath
      * @param frameObj the object containing the message (and possibly size 
fields)
      */
-    public void patch(Message m, int frameSize, Message frameObj);
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj);
 
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/SequenceParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/SequenceParser.java    
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/SequenceParser.java    
2012-06-13 11:45:41 UTC (rev 21953)
@@ -35,6 +35,7 @@
 public class SequenceParser implements Parser {
 
     private final List<Parser> childParsers = new LinkedList<Parser>();
+    private List<Field> myFrameSizePath;
 
     public SequenceParser() {
     }
@@ -57,7 +58,9 @@
                      Message frameObj, final Message dst, List<Field> 
frameSizePath) {
         int size = 0;
         for (final Parser p : childParsers) {
-            size += p.parse(srcBuf, frameOffset, frameObj, dst, null);
+            List<Field> path;
+            size += p.parse(srcBuf, frameOffset, frameObj, dst,
+                    frameSizePath == null ? myFrameSizePath : frameSizePath);
         }
         return size;
     }
@@ -72,9 +75,13 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize, Message frameObj) {
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj) {
         for (final Parser p : childParsers) {
-            p.patch(m, frameSize, frameObj);
-        }  
+            p.patch(m, frameSize, frameSizePath == null ? myFrameSizePath : 
frameSizePath, frameObj);
+        }
     }
+
+    public void setFrameSizePath(List<Field> frameSizePath) {
+        this.myFrameSizePath = frameSizePath;
+    }
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/StringParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/StringParser.java      
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/StringParser.java      
2012-06-13 11:45:41 UTC (rev 21953)
@@ -124,7 +124,7 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize, Message frameObj) {
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj) {
         // nothing to patch
     }
 

Modified: gnunet-java/src/org/gnunet/construct/parsers/UnionParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/UnionParser.java       
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/UnionParser.java       
2012-06-13 11:45:41 UTC (rev 21953)
@@ -32,48 +32,38 @@
 // unchecked casts are necessary
 @SuppressWarnings("unchecked")
 public class UnionParser implements Parser {
-    private final List<Field> frameSizePath;
 
     private final Field targetField;
 
     private final List<Field> unionTagPath;
     private final ReflectUtil.NumField unionTagField;
     private final Class<? extends MessageUnion> unionType;
-    
-    private final List<Field> pathFromRoot;
 
     boolean optional;
 
-    public UnionParser(List<Field> frameSizePath, boolean optional, Class<? 
extends MessageUnion> unionType,
-                       List<Field> unionTagPath, Field f, List<Field> path) {
+    public UnionParser(boolean optional, Class<? extends MessageUnion> 
unionType,
+                       List<Field> unionTagPath, Field f) {
         targetField = f;
         this.optional = optional;
-        this.frameSizePath = frameSizePath;
         this.unionTagPath = unionTagPath;
         this.unionTagField = new 
ReflectUtil.NumField(unionTagPath.get(unionTagPath.size() - 1));
         this.unionType = unionType;
-        this.pathFromRoot = path;
     }
 
     @Override
     public int getSize(final Message src) {
         Class cls = ReflectUtil.justGet(src, targetField).getClass();
 
-        Parser parser = Construct.getParser(cls, frameSizePath, pathFromRoot);
+        Parser parser = Construct.getParser(cls);
 
         return parser.getSize((Message)ReflectUtil.justGet(src, targetField));
     }
 
-    private int getSizeFieldValue(Message m) {
-        Object obj = ReflectUtil.followFieldPath(frameSizePath, m);
-        return ((Number) obj).intValue();
-    }
-
     @Override
     public int parse(final ByteBuffer srcBuf, int frameOffset, Message 
frameObj, final Message dstObj, List<Field>
             frameSizePath) {
         if (optional) {
-            int remaining = frameOffset + getSizeFieldValue(frameObj) - 
srcBuf.position();
+            int remaining = frameOffset + ReflectUtil.justGetInt(frameObj, 
frameSizePath) - srcBuf.position();
             if (remaining <= 0) {
                 if (!optional) {
                     throw new ProtocolViolation("not optional");
@@ -93,15 +83,15 @@
 
         final Message theUnion = (Message) ReflectUtil.justGet(dstObj, 
targetField);
 
-        Parser parser = Construct.getParser(cls, this.frameSizePath, 
pathFromRoot);
+        Parser parser = Construct.getParser(cls);
 
-        return parser.parse(srcBuf, frameOffset, frameObj, theUnion, null);
+        return parser.parse(srcBuf, frameOffset, frameObj, theUnion, 
frameSizePath);
     }
 
     @Override
     public int write(final ByteBuffer dstBuf, final Message src) {
         final Class currentUnionClass = ReflectUtil.justGet(src, 
targetField).getClass();
-        final Parser p = Construct.getParser(currentUnionClass, frameSizePath, 
pathFromRoot);
+        final Parser p = Construct.getParser(currentUnionClass);
 
         return p.write(dstBuf, (Message) ReflectUtil.justGet(src, 
targetField));
     }
@@ -112,11 +102,11 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize, Message frameObj) {
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj) {
         final Class currentUnionClass = ReflectUtil.justGet(m, 
targetField).getClass();
-        final Parser p = Construct.getParser(currentUnionClass, frameSizePath, 
pathFromRoot);
+        final Parser p = Construct.getParser(currentUnionClass);
 
-        p.patch((Message) ReflectUtil.justGet(m, targetField), frameSize, 
frameObj);
+        p.patch((Message) ReflectUtil.justGet(m, targetField), frameSize, 
frameSizePath, frameObj);
         
         unionTagField.set(ReflectUtil.followFieldPathToParent(unionTagPath, m),
                getTag(m));

Modified: 
gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java   
2012-06-13 11:42:49 UTC (rev 21952)
+++ gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java   
2012-06-13 11:45:41 UTC (rev 21953)
@@ -92,7 +92,7 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize, Message frameObj) {
+    public void patch(Message m, int frameSize, List<Field> frameSizePath, 
Message frameObj) {
         int size = Array.getLength(ReflectUtil.justGet(m, targetField));
         sizeField.set(m, size);
     }

Added: gnunet-java/test/org/gnunet/construct/ConstructTest.java
===================================================================
--- gnunet-java/test/org/gnunet/construct/ConstructTest.java                    
        (rev 0)
+++ gnunet-java/test/org/gnunet/construct/ConstructTest.java    2012-06-13 
11:45:41 UTC (rev 21953)
@@ -0,0 +1,30 @@
+package org.gnunet.construct;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Florian Dold
+ */
+public class ConstructTest {
+    public static class ByteFillTestMessage implements Message {
+        @FrameSize
+        @UInt32
+        public int frameSize;
+        @ByteFill
+        public byte[] bytes;
+    }
+
+    @Test
+    public void test_ByteFill() {
+        ByteFillTestMessage msg = new ByteFillTestMessage();
+        msg.bytes = new byte[]{0,1,2,3};
+        Construct.patch(msg);
+        byte[] bin = Construct.toBinary(msg);
+
+        ByteFillTestMessage msg_r = Construct.parseAs(bin, 
ByteFillTestMessage.class);
+
+        Assert.assertArrayEquals(new byte[]{0,1,2,3}, msg_r.bytes);
+    }
+
+}




reply via email to

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