[Top][All Lists]
[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);
+ }
+
+}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r21953 - in gnunet-java: . src/org/gnunet/construct src/org/gnunet/construct/parsers test/org/gnunet/construct,
gnunet <=