[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r18226 - in gnunet-java: . src/org/gnunet/construct src/org
From: |
gnunet |
Subject: |
[GNUnet-SVN] r18226 - in gnunet-java: . src/org/gnunet/construct src/org/gnunet/messages test/org/gnunet/construct |
Date: |
Mon, 21 Nov 2011 00:28:02 +0100 |
Author: dold
Date: 2011-11-21 00:28:02 +0100 (Mon, 21 Nov 2011)
New Revision: 18226
Added:
gnunet-java/src/org/gnunet/messages/SimpleTestMessage2.java
gnunet-java/src/org/gnunet/messages/TestMessage3.java
Modified:
gnunet-java/ISSUES
gnunet-java/src/org/gnunet/construct/Construct.java
gnunet-java/src/org/gnunet/construct/FieldLocation.java
gnunet-java/src/org/gnunet/construct/ObjectParser.java
gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java
gnunet-java/src/org/gnunet/messages/ComplexTestMessage.java
gnunet-java/src/org/gnunet/messages/MessageHeader.java
gnunet-java/src/org/gnunet/messages/RelativeTimeNBO.java
gnunet-java/src/org/gnunet/messages/SimpleTestMessage.java
gnunet-java/test/org/gnunet/construct/ConstructTest.java
Log:
tests
Modified: gnunet-java/ISSUES
===================================================================
--- gnunet-java/ISSUES 2011-11-20 22:48:41 UTC (rev 18225)
+++ gnunet-java/ISSUES 2011-11-20 23:28:02 UTC (rev 18226)
@@ -49,9 +49,11 @@
-
* advantages of the "new" parsing/unparsing package
* parsers are decoupled from annotations
* => parsers could be pre-compiled
* parsers are only constructed once per class
+
+
+ * what about TotalSize?
\ No newline at end of file
Modified: gnunet-java/src/org/gnunet/construct/Construct.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/Construct.java 2011-11-20 22:48:41 UTC
(rev 18225)
+++ gnunet-java/src/org/gnunet/construct/Construct.java 2011-11-20 23:28:02 UTC
(rev 18226)
@@ -5,12 +5,8 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import java.lang.reflect.Array;
import java.lang.reflect.Field;
-import java.math.BigInteger;
-import java.nio.ByteBuffer;
-import org.grothoff.Runabout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -89,6 +85,17 @@
String charset() default "UTF-8";
}
+ /**
+ * Fill a byte array with the rest of the message in the buffer
+ *
+ * @author dold
+ *
+ */
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.FIELD)
+ public @interface Fill {
+ }
+
public static <T> T parseWith(Parser p, byte[] data, int offset) {
RefLocation rl = new RefLocation();
Location[] locs = { rl };
@@ -101,21 +108,42 @@
ObjectParser op = new ObjectParser(cls);
- for (Field f : cls.getFields()) {
+ for (Field f : cls.getDeclaredFields()) {
Annotation[] anns = f.getAnnotations();
for (int i = 0; i < anns.length; ++i) {
Annotation ann = anns[i];
if (ann instanceof SignedInteger) {
+ if (i != anns.length - 1) {
+ throw new RuntimeException(
+ "Further annotations are forbidden after
@SignedInteger");
+ }
SignedInteger a = (SignedInteger) ann;
op.add(new SignedIntegerParser(a.value()), f);
} else if (ann instanceof UnsignedInteger) {
+ if (i != anns.length - 1) {
+ throw new RuntimeException(
+ "Further annotations are forbidden after
@UnignedInteger");
+ }
UnsignedInteger a = (UnsignedInteger) ann;
op.add(new UnsignedIntegerParser(a.value()), f);
} else if (ann instanceof TotalSize) {
- op.addSizeField(f);
+ throw new UnsupportedOperationException("total size
not yet implemented");
+
+ } else if (ann instanceof Nested) {
+ // this needs to be the last annotation
+ if (i != anns.length - 1) {
+ throw new RuntimeException(
+ "Futher annotations are forbidden after
@Nested");
+ }
+ ObjectParser child = makeParser(f.getType());
+ op.add(child, f);
+
} else if (ann instanceof FixedSizeArray) {
- throw new UnsupportedOperationException(
- "not yet implemented");
+ FixedSizeArray a = (FixedSizeArray) ann;
+
+ //op.add(new FixedSizeArrayParser(a.length(), ), fields)
+ //throw new UnsupportedOperationException(
+ // "not yet implemented");
// look at anns[i+1]
// [...]
} else {
@@ -126,6 +154,7 @@
}
return op;
}
+
/**
* Given a byte array with a message, parse it into an object of type c.
The
@@ -177,7 +206,7 @@
ObjectParser p = makeParser(obj.getClass());
return p.estimateSize(RefLocation.makeLocationsWith(obj));
}
-
+
public static byte[] unparse(Object obj) {
byte[] data = new byte[estimateSize(obj)];
writeTo(obj, data, 0);
Modified: gnunet-java/src/org/gnunet/construct/FieldLocation.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/FieldLocation.java 2011-11-20
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/construct/FieldLocation.java 2011-11-20
23:28:02 UTC (rev 18226)
@@ -7,6 +7,7 @@
private Object o;
public FieldLocation(Field f, Object o) {
+ assert f != null;
this.f = f;
this.o = o;
}
@@ -32,10 +33,8 @@
try {
return f.get(o);
} catch (IllegalArgumentException e) {
- // TODO Auto-generated catch block
throw new RuntimeException();
} catch (IllegalAccessException e) {
- // TODO Auto-generated catch block
throw new RuntimeException();
}
}
Modified: gnunet-java/src/org/gnunet/construct/ObjectParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/ObjectParser.java 2011-11-20
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/construct/ObjectParser.java 2011-11-20
23:28:02 UTC (rev 18226)
@@ -1,9 +1,12 @@
package org.gnunet.construct;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.List;
+import org.gnunet.construct.Construct.UnsignedInteger;
+
class ParserRecord {
Parser p;
Field[] args;
@@ -15,6 +18,21 @@
}
public class ObjectParser implements Parser {
+
+ /*
+
+
+ class TotalSizeParser implements Parser {
+ }
+
+
+ // the object parser stores the total size in the parsers before unparsing.
+ // TotalSize parsers do not affect parsing, except maybe for consistency
checks
+ List<TotalSizeParser> total_size_parsers;
+
+
+ */
+
// parser with arguments
List<ParserRecord> parser_records = new LinkedList<ParserRecord>();
@@ -32,16 +50,6 @@
}
/**
- * Add a field which serves as storage for the byte size of the whole
object
- *
- * @param f
- * the relevant field
- */
- public void addSizeField(Field f) {
- size_fields.add(f);
- }
-
- /**
* Create locations from the Object's fields we are interested in
*
* @param pr
@@ -49,6 +57,7 @@
* @return
*/
private Location[] getLocs(Field[] fs, Object obj) {
+ assert obj != null;
Location[] locs = new Location[fs.length];
for (int i = 0; i < locs.length; ++i) {
locs[i] = new FieldLocation(fs[i], obj);
@@ -80,16 +89,6 @@
parsed += x;
}
- for (Field f : size_fields) {
- try {
- f.set(obj, parsed);
- } catch (IllegalArgumentException e) {
- throw new RuntimeException();
- } catch (IllegalAccessException e) {
- throw new RuntimeException();
- }
- }
-
loc.put(obj);
return parsed;
@@ -98,11 +97,14 @@
public int unparse(byte[] data, int offset, Location[] dest) {
assert dest.length == 1;
Object obj = dest[0].get();
+ assert obj != null;
+ int size = Construct.estimateSize(obj);
+
int parsed = 0;
for (ParserRecord pr : this.parser_records) {
-
+
parsed += pr.p
.unparse(data, offset + parsed, getLocs(pr.args, obj));
}
@@ -111,8 +113,15 @@
@Override
public int estimateSize(Location[] args) {
+
assert args.length == 1;
- Object obj = args[0];
+ Object obj = args[0].get();
+
+ if (obj == null) {
+ throw new RuntimeException(
+ "cannot deserialize null-reference as object");
+ }
+
int size = 0;
for (ParserRecord pr : this.parser_records) {
// create locations from record
Modified: gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java
2011-11-20 22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java
2011-11-20 23:28:02 UTC (rev 18226)
@@ -64,6 +64,8 @@
public int unparse(byte[] dst_data, int offset, Location[] src) {
assert src.length == 1;
Object obj = src[0].get();
+ assert obj != null;
+
BigInteger num;
if (obj instanceof BigInteger) {
Modified: gnunet-java/src/org/gnunet/messages/ComplexTestMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/ComplexTestMessage.java 2011-11-20
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/messages/ComplexTestMessage.java 2011-11-20
23:28:02 UTC (rev 18226)
@@ -61,12 +61,12 @@
p.add(lp, ComplexTestMessage.class.getField("stringTable"),
ComplexTestMessage.class.getField("stringTableSize"));
- p.addSizeField(ComplexTestMessage.class.getField("mySize"));
+ //p.addSizeField(ComplexTestMessage.class.getField("mySize"));
p.add(new UnsignedIntegerParser(2),
ComplexTestMessage.class.getField("storedMySize"));
- p.addSizeField(ComplexTestMessage.class.getField("storedMySize"));
+ //p.addSizeField(ComplexTestMessage.class.getField("storedMySize"));
return p;
}
Modified: gnunet-java/src/org/gnunet/messages/MessageHeader.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/MessageHeader.java 2011-11-20
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/messages/MessageHeader.java 2011-11-20
23:28:02 UTC (rev 18226)
@@ -1,24 +1,20 @@
package org.gnunet.messages;
+import org.gnunet.construct.Construct.Fill;
import org.gnunet.construct.Construct.TotalSize;
import org.gnunet.construct.Construct.UnsignedInteger;
-import org.gnunet.construct.Parser;
-import org.gnunet.construct.ObjectParser;
public class MessageHeader {
+ @TotalSize
@UnsignedInteger(2)
- @TotalSize
public int size;
@UnsignedInteger(2)
public int type;
- public Parser getParser() {
- ObjectParser p = new ObjectParser();
- //p.addParser(new UnsignedIntegerParser(2, new FieldDest))
- }
-
+ @Fill
+ byte[] body;
}
Modified: gnunet-java/src/org/gnunet/messages/RelativeTimeNBO.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/RelativeTimeNBO.java 2011-11-20
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/messages/RelativeTimeNBO.java 2011-11-20
23:28:02 UTC (rev 18226)
@@ -1,6 +1,6 @@
package org.gnunet.messages;
-import org.gnunet.construct.UnsignedInteger;
+import org.gnunet.construct.Construct.UnsignedInteger;
import org.gnunet.util.RelativeTime;
public class RelativeTimeNBO {
@@ -9,7 +9,7 @@
* Value__ still in Java-byte order, needs to be converted to Network byte
* order by the Construct class.
*/
- @UnsignedInteger(64)
+ @UnsignedInteger(8)
public long value__;
public RelativeTimeNBO(long value) {
Modified: gnunet-java/src/org/gnunet/messages/SimpleTestMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/SimpleTestMessage.java 2011-11-20
22:48:41 UTC (rev 18225)
+++ gnunet-java/src/org/gnunet/messages/SimpleTestMessage.java 2011-11-20
23:28:02 UTC (rev 18226)
@@ -1,9 +1,8 @@
package org.gnunet.messages;
+import org.gnunet.construct.Construct.Nested;
import org.gnunet.construct.Construct.SignedInteger;
import org.gnunet.construct.Construct.UnsignedInteger;
-import org.gnunet.construct.ObjectParser;
-import org.gnunet.construct.UnsignedIntegerParser;
public class SimpleTestMessage {
@@ -12,4 +11,19 @@
@SignedInteger(2)
public short v2;
+
+ @Nested
+ public SimpleTestMessage2 mn;
+
+
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof SimpleTestMessage)) {
+ return false;
+ }
+ SimpleTestMessage other = (SimpleTestMessage) obj;
+
+ return v1 == other.v1 && v2 == other.v2 && mn.equals(other.mn);
+ }
}
Added: gnunet-java/src/org/gnunet/messages/SimpleTestMessage2.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/SimpleTestMessage2.java
(rev 0)
+++ gnunet-java/src/org/gnunet/messages/SimpleTestMessage2.java 2011-11-20
23:28:02 UTC (rev 18226)
@@ -0,0 +1,20 @@
+package org.gnunet.messages;
+
+import org.gnunet.construct.Construct.UnsignedInteger;
+
+public class SimpleTestMessage2 {
+
+ @UnsignedInteger(4)
+ public long value;
+
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof SimpleTestMessage2)) {
+ return false;
+ }
+ SimpleTestMessage2 stm2 = (SimpleTestMessage2) obj;
+ return value == stm2.value;
+ }
+
+}
Added: gnunet-java/src/org/gnunet/messages/TestMessage3.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/TestMessage3.java
(rev 0)
+++ gnunet-java/src/org/gnunet/messages/TestMessage3.java 2011-11-20
23:28:02 UTC (rev 18226)
@@ -0,0 +1,14 @@
+package org.gnunet.messages;
+
+import org.gnunet.construct.Construct.FixedSizeArray;
+import org.gnunet.construct.Construct.UnsignedInteger;
+
+public class TestMessage3 {
+
+ @FixedSizeArray(length=10)
+ @UnsignedInteger(4)
+ public int[] arr;
+
+
+
+}
Modified: gnunet-java/test/org/gnunet/construct/ConstructTest.java
===================================================================
--- gnunet-java/test/org/gnunet/construct/ConstructTest.java 2011-11-20
22:48:41 UTC (rev 18225)
+++ gnunet-java/test/org/gnunet/construct/ConstructTest.java 2011-11-20
23:28:02 UTC (rev 18226)
@@ -2,6 +2,8 @@
import org.gnunet.messages.MessageHeader;
import org.gnunet.messages.SimpleTestMessage;
+import org.gnunet.messages.SimpleTestMessage2;
+import org.gnunet.messages.TestMessage3;
import org.junit.Assert;
import org.junit.Test;
@@ -10,32 +12,46 @@
@Test
public void test_SimpleTestMessage_1() {
ObjectParser op = Construct.makeParser(SimpleTestMessage.class);
- byte[] a = { 0x02, 0x01, 0x00, 0x1c };
+ byte[] a = { 0x02, 0x01, // v1
+ 0x00, 0x1c, // v2
+ 0x00, 0x00, 0x00, 0x05 // nested
+ };
SimpleTestMessage m = Construct.parseWith(op, a, 0);
Assert.assertTrue(m.v1 == ((0x02 << 8) | 0x01));
Assert.assertTrue(m.v2 == 0x1c);
- Assert.assertEquals(4, Construct.estimateSize(m));
+ System.out.println(Construct.estimateSize(m));
+
+ Assert.assertEquals(8, Construct.estimateSize(m));
}
@Test
public void test_SimpleTestMessage_2() {
SimpleTestMessage m1 = new SimpleTestMessage();
-
+
m1.v1 = 42;
m1.v2 = 420;
+
+ m1.mn = new SimpleTestMessage2();
+ m1.mn.value = 300;
+
byte[] data = Construct.unparse(m1);
-
- SimpleTestMessage m2 = Construct.parse(data, 0,
SimpleTestMessage.class);
-
- Assert.assertEquals(m1.v1, m2.v1);
-
- Assert.assertEquals(m1.v2, m2.v2);
-
-
+ SimpleTestMessage m2 = Construct
+ .parse(data, 0, SimpleTestMessage.class);
+
+ Assert.assertEquals(m1, m2);
+
}
+
+ @Test
+ public void test_TestMessage3() {
+ TestMessage3 tm3 = new TestMessage3();
+ tm3.arr = new int[10];
+
+ Assert.assertEquals(10*4, Construct.estimateSize(tm3));
+ }
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r18226 - in gnunet-java: . src/org/gnunet/construct src/org/gnunet/messages test/org/gnunet/construct,
gnunet <=