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