gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r19420 - in gnunet-java: . .idea .idea/inspectionProfiles .


From: gnunet
Subject: [GNUnet-SVN] r19420 - in gnunet-java: . .idea .idea/inspectionProfiles .idea/libraries src src/org/gnunet/construct src/org/gnunet/construct/parsers src/org/gnunet/service src/org/gnunet/util src/org/gnunet/util/getopt src/org/grothoff test/org/gnunet/construct test/org/gnunet/services
Date: Thu, 26 Jan 2012 08:36:44 +0100

Author: dold
Date: 2012-01-26 08:36:44 +0100 (Thu, 26 Jan 2012)
New Revision: 19420

Added:
   gnunet-java/src/org/gnunet/construct/MessageUnion.java
   gnunet-java/src/org/gnunet/construct/Union.java
   gnunet-java/src/org/gnunet/construct/UnionCase.java
   gnunet-java/src/org/gnunet/construct/parsers/UnionParser.java
   gnunet-java/src/org/gnunet/util/Resolver.java
   gnunet-java/src/org/gnunet/util/getopt/OptionAction.java
   gnunet-java/test/org/gnunet/construct/UnionTest.java
Removed:
   gnunet-java/src/org/gnunet/construct/TaggedUnion.java
   gnunet-java/src/org/gnunet/service/Resolver.java
   gnunet-java/src/org/gnunet/util/getopt/Argument.java
Modified:
   gnunet-java/.idea/inspectionProfiles/Project_Default.xml
   gnunet-java/.idea/libraries/lib.xml
   gnunet-java/.idea/workspace.xml
   gnunet-java/ISSUES
   gnunet-java/resolver
   gnunet-java/src/log4j.properties
   gnunet-java/src/org/gnunet/construct/Construct.java
   gnunet-java/src/org/gnunet/construct/MessageIdAnnotationProcessor.java
   gnunet-java/src/org/gnunet/construct/MessageLoader.java
   gnunet-java/src/org/gnunet/construct/MsgMap.txt
   gnunet-java/src/org/gnunet/construct/Nested.java
   gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java
   gnunet-java/src/org/gnunet/service/NetworkSizeEstimation.java
   gnunet-java/src/org/gnunet/util/AbsoluteTime.java
   gnunet-java/src/org/gnunet/util/Client.java
   gnunet-java/src/org/gnunet/util/Program.java
   gnunet-java/src/org/gnunet/util/RelativeTime.java
   gnunet-java/src/org/gnunet/util/Scheduler.java
   gnunet-java/src/org/gnunet/util/getopt/Option.java
   gnunet-java/src/org/gnunet/util/getopt/Parser.java
   gnunet-java/src/org/grothoff/Runabout.java
   gnunet-java/test/org/gnunet/construct/ByteFillMessage.java
   gnunet-java/test/org/gnunet/services/NetworkSizeEstimationServiceTest.java
Log:
implemented message unions, parameter parsing

Modified: gnunet-java/.idea/inspectionProfiles/Project_Default.xml
===================================================================
--- gnunet-java/.idea/inspectionProfiles/Project_Default.xml    2012-01-25 
23:19:25 UTC (rev 19419)
+++ gnunet-java/.idea/inspectionProfiles/Project_Default.xml    2012-01-26 
07:36:44 UTC (rev 19420)
@@ -40,7 +40,6 @@
     <inspection_tool class="AwaitWithoutCorrespondingSignal" enabled="true" 
level="WARNING" enabled_by_default="true" />
     <inspection_tool class="BadOddness" enabled="true" level="WARNING" 
enabled_by_default="true" />
     <inspection_tool class="BooleanMethodIsAlwaysInverted" enabled="false" 
level="WARNING" enabled_by_default="false" />
-    <inspection_tool class="BreakStatement" enabled="true" level="WARNING" 
enabled_by_default="true" />
     <inspection_tool class="BreakStatementWithLabel" enabled="true" 
level="WARNING" enabled_by_default="true" />
     <inspection_tool class="BusyWait" enabled="true" level="WARNING" 
enabled_by_default="true" />
     <inspection_tool class="CallToNativeMethodWhileLocked" enabled="true" 
level="WARNING" enabled_by_default="true" />

Modified: gnunet-java/.idea/libraries/lib.xml
===================================================================
--- gnunet-java/.idea/libraries/lib.xml 2012-01-25 23:19:25 UTC (rev 19419)
+++ gnunet-java/.idea/libraries/lib.xml 2012-01-26 07:36:44 UTC (rev 19420)
@@ -4,6 +4,7 @@
       <root url="jar://$PROJECT_DIR$/lib/slf4j-api-1.6.4.jar!/" />
       <root url="jar://$PROJECT_DIR$/lib/slf4j-log4j12-1.6.4.jar!/" />
       <root url="jar://$PROJECT_DIR$/lib/log4j-1.2.16.jar!/" />
+      <root url="jar://$PROJECT_DIR$/lib/annotations.jar!/" />
     </CLASSES>
     <JAVADOC />
     <SOURCES />

Modified: gnunet-java/.idea/workspace.xml
===================================================================
--- gnunet-java/.idea/workspace.xml     2012-01-25 23:19:25 UTC (rev 19419)
+++ gnunet-java/.idea/workspace.xml     2012-01-26 07:36:44 UTC (rev 19420)
@@ -2,10 +2,37 @@
 <project version="4">
   <component name="ChangeListManager">
     <list default="true" readonly="true" 
id="b4faf44d-8919-474e-bfab-5900bc40cc2b" name="Default" comment="">
-      <change type="MOVED" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/getopt/Parameter.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/getopt/Option.java" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/MessageUnion.java" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/Union.java" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/UnionParser.java" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/getopt/OptionAction.java" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/test/org/gnunet/construct/UnionTest.java" />
+      <change type="DELETED" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/getopt/Argument.java" 
afterPath="" />
+      <change type="MOVED" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/TaggedUnion.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/UnionCase.java" />
+      <change type="MOVED" 
beforePath="$PROJECT_DIR$/src/org/gnunet/service/Resolver.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/Resolver.java" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/resolver" 
afterPath="$PROJECT_DIR$/resolver" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" 
afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/.idea/libraries/lib.xml" 
afterPath="$PROJECT_DIR$/.idea/libraries/lib.xml" />
       <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/.idea/workspace.xml" 
afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/ISSUES" 
afterPath="$PROJECT_DIR$/ISSUES" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/log4j.properties" 
afterPath="$PROJECT_DIR$/src/log4j.properties" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/Construct.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/Construct.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/MessageIdAnnotationProcessor.java"
 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/MessageIdAnnotationProcessor.java"
 />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/MessageLoader.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/MessageLoader.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/MsgMap.txt" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/MsgMap.txt" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/Nested.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/Nested.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/IntegerParser.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/IntegerParser.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/service/NetworkSizeEstimation.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/service/NetworkSizeEstimation.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/AbsoluteTime.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/AbsoluteTime.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/Client.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/Client.java" />
       <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/Program.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/Program.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/RelativeTime.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/RelativeTime.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/Scheduler.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/Scheduler.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/getopt/Option.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/getopt/Option.java" />
       <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/getopt/Parser.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/getopt/Parser.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/grothoff/Runabout.java" 
afterPath="$PROJECT_DIR$/src/org/grothoff/Runabout.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/test/org/gnunet/construct/ByteFillMessage.java" 
afterPath="$PROJECT_DIR$/test/org/gnunet/construct/ByteFillMessage.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/test/org/gnunet/services/NetworkSizeEstimationServiceTest.java"
 
afterPath="$PROJECT_DIR$/test/org/gnunet/services/NetworkSizeEstimationServiceTest.java"
 />
     </list>
     <ignored path="gnunet-java.iws" />
     <ignored path=".idea/workspace.xml" />
@@ -63,94 +90,97 @@
   </component>
   <component name="FileEditorManager">
     <leaf>
-      <file leaf-file-name="Construct.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/Construct.java">
+      <file leaf-file-name="UnionParser.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/UnionParser.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="68" column="1" selection-start="2022" 
selection-end="2449" vertical-scroll-proportion="0.0">
+            <state line="68" column="0" selection-start="2086" 
selection-end="2086" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Parser.java" pinned="false" current="true" 
current-in-tab="true">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/getopt/Parser.java">
+      <file leaf-file-name="MessageLoader.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/MessageLoader.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="75" column="71" selection-start="2181" 
selection-end="2181" vertical-scroll-proportion="0.5641026">
+            <state line="106" column="68" selection-start="3991" 
selection-end="3991" vertical-scroll-proportion="0.0">
               <folding>
-                <element signature="e#1206#1221#0" expanded="true" />
-                <element signature="e#1283#1296#0" expanded="true" />
+                <element signature="e#1363#1393#0" expanded="true" />
               </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Program.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Program.java">
+      <file leaf-file-name="NetworkSizeEstimation.java" pinned="false" 
current="false" current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/service/NetworkSizeEstimation.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="31" column="8" selection-start="874" 
selection-end="874" vertical-scroll-proportion="0.0">
+            <state line="69" column="61" selection-start="1769" 
selection-end="1769" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="log4j.properties" pinned="false" current="false" 
current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/log4j.properties">
+      <file leaf-file-name="NetworkSizeEstimationServiceTest.java" 
pinned="false" current="false" current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/services/NetworkSizeEstimationServiceTest.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="2" column="50" selection-start="78" 
selection-end="78" vertical-scroll-proportion="0.0">
+            <state line="23" column="5" selection-start="747" 
selection-end="747" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="VarTestMessage.java" pinned="false" 
current="false" current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/VarTestMessage.java">
+      <file leaf-file-name="Construct.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/Construct.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="2" column="13" selection-start="44" 
selection-end="44" vertical-scroll-proportion="0.0">
-              <folding />
+            <state line="79" column="0" selection-start="2570" 
selection-end="2570" vertical-scroll-proportion="0.0">
+              <folding>
+                <element signature="e#3565#3603#0" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="NetworkSizeEstimationServiceTest.java" 
pinned="false" current="false" current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/services/NetworkSizeEstimationServiceTest.java">
+      <file leaf-file-name="Resolver.java" pinned="false" current="true" 
current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Resolver.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="13" column="13" selection-start="300" 
selection-end="300" vertical-scroll-proportion="0.0">
-              <folding />
+            <state line="40" column="27" selection-start="1171" 
selection-end="1171" vertical-scroll-proportion="0.6780627">
+              <folding>
+                <element signature="e#617#673#0" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="ByteFillParser.java" pinned="false" 
current="false" current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/ByteFillParser.java">
+      <file leaf-file-name="IntegerParser.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/IntegerParser.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="55" column="9" selection-start="1668" 
selection-end="1668" vertical-scroll-proportion="0.0">
+            <state line="42" column="13" selection-start="1133" 
selection-end="1133" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="NestedParser.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/NestedParser.java">
+      <file leaf-file-name="ISSUES" pinned="false" current="false" 
current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/ISSUES">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="46" column="25" selection-start="1441" 
selection-end="1441" vertical-scroll-proportion="0.0">
+            <state line="180" column="30" selection-start="6264" 
selection-end="6264" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Option.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/getopt/Option.java">
+      <file leaf-file-name="log4j.properties" pinned="false" current="false" 
current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/log4j.properties">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="13" column="27" selection-start="374" 
selection-end="374" vertical-scroll-proportion="0.0">
+            <state line="0" column="21" selection-start="21" 
selection-end="21" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Argument.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/getopt/Argument.java">
+      <file leaf-file-name="UnionTest.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/UnionTest.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="11" column="15" selection-start="303" 
selection-end="303" vertical-scroll-proportion="0.0">
+            <state line="11" column="23" selection-start="265" 
selection-end="265" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
@@ -166,22 +196,22 @@
   <component name="IdeDocumentHistory">
     <option name="changedFiles">
       <list>
-        <option value="$PROJECT_DIR$/src/org/gnunet/construct/Nested.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/Parser.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/SequenceParser.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/construct/Construct.java" 
/>
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/ByteFillParser.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/NestedParser.java" />
-        <option value="$PROJECT_DIR$/src/log4j.properties" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/util/getopt/RestArgs.java" 
/>
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/util/getopt/Arguments.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/util/getopt/Argument.java" 
/>
-        <option value="$PROJECT_DIR$/src/org/gnunet/service/Resolver.java" />
-        <option value="$PROJECT_DIR$/ISSUES" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/util/getopt/Parameter.java" />
         <option value="$PROJECT_DIR$/src/org/gnunet/util/getopt/Option.java" />
         <option value="$PROJECT_DIR$/src/org/gnunet/util/Program.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/MessageUnion.java" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/construct/MsgMap.txt" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/construct/Union.java" />
         <option value="$PROJECT_DIR$/src/org/gnunet/util/getopt/Parser.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/MessageIdAnnotationProcessor.java"
 />
+        <option value="$PROJECT_DIR$/test/org/gnunet/construct/UnionTest.java" 
/>
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/UnionParser.java" />
+        <option value="$PROJECT_DIR$/src/log4j.properties" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/construct/Construct.java" 
/>
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/MessageLoader.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/service/NetworkSizeEstimation.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/IntegerParser.java" />
+        <option value="$PROJECT_DIR$/ISSUES" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/util/Resolver.java" />
       </list>
     </option>
   </component>
@@ -309,7 +339,7 @@
         </expanded-state>
         <selected-state>
           <State>
-            <id>JUnit issues</id>
+            <id>InstanceVariableInitialization</id>
           </State>
         </selected-state>
       </profile-state>
@@ -341,86 +371,6 @@
       <sortByType />
     </navigator>
     <panes>
-      <pane id="Scope">
-        <subPane subId="Project Files">
-          <PATH>
-            <PATH_ELEMENT USER_OBJECT="Root">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="gnunet-java">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT USER_OBJECT="Root">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="gnunet-java">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="src">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="org">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT USER_OBJECT="Root">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="gnunet-java">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="src">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="org">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="gnunet">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT USER_OBJECT="Root">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="gnunet-java">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="src">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="org">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="gnunet">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT USER_OBJECT="construct">
-              <option name="myItemId" value="" />
-              <option name="myItemType" value="" />
-            </PATH_ELEMENT>
-          </PATH>
-        </subPane>
-      </pane>
       <pane id="PackagesPane">
         <subPane>
           <PATH>
@@ -484,10 +434,6 @@
               <option name="myItemId" value="gnunet" />
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="services" />
-              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
           </PATH>
           <PATH>
             <PATH_ELEMENT>
@@ -620,10 +566,32 @@
               <option name="myItemId" value="gnunet" />
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
+          </PATH>
+          <PATH>
             <PATH_ELEMENT>
-              <option name="myItemId" value="service" />
+              <option name="myItemId" value="gnunet-java" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="gnunet-java" />
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="org" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="gnunet" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="exceptions" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
           </PATH>
           <PATH>
             <PATH_ELEMENT>
@@ -647,7 +615,7 @@
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
             <PATH_ELEMENT>
-              <option name="myItemId" value="exceptions" />
+              <option name="myItemId" value="construct" />
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
           </PATH>
@@ -676,6 +644,10 @@
               <option name="myItemId" value="construct" />
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="parsers" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
           </PATH>
           <PATH>
             <PATH_ELEMENT>
@@ -693,19 +665,99 @@
           </PATH>
         </subPane>
       </pane>
+      <pane id="Scope">
+        <subPane subId="Project Files">
+          <PATH>
+            <PATH_ELEMENT USER_OBJECT="Root">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="gnunet-java">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT USER_OBJECT="Root">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="gnunet-java">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="src">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="org">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT USER_OBJECT="Root">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="gnunet-java">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="src">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="org">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="gnunet">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT USER_OBJECT="Root">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="gnunet-java">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="src">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="org">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="gnunet">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT USER_OBJECT="construct">
+              <option name="myItemId" value="" />
+              <option name="myItemType" value="" />
+            </PATH_ELEMENT>
+          </PATH>
+        </subPane>
+      </pane>
     </panes>
   </component>
   <component name="PropertiesComponent">
     <property name="GenerateAntBuildDialog.generateIdeaHomeProperty" 
value="false" />
     <property name="GoToFile.includeJavaFiles" value="false" />
-    <property name="project.structure.last.edited" value="Modules" />
+    <property name="project.structure.last.edited" value="Libraries" />
     <property name="OverrideImplement.combined" value="true" />
     <property name="project.structure.proportion" value="0.15" />
     <property name="options.splitter.main.proportions" value="0.3" />
     <property name="GenerateAntBuildDialog.generateSingleFile" value="true" />
     <property name="recentsLimit" value="5" />
     <property name="MemberChooser.sorted" value="false" />
-    <property name="options.lastSelected" value="project.propCompiler" />
+    <property name="options.lastSelected" value="editing.templates" />
     <property name="GenerateAntBuildDialog.inclineRuntiemClasspath" 
value="true" />
     <property name="GenerateAntBuildDialog.forceTargetJdk" value="false" />
     <property name="project.structure.side.proportion" value="0.2" />
@@ -733,7 +785,7 @@
       <recent name="" />
     </key>
   </component>
-  <component name="RunManager" selected="JUnit.ConstructTest">
+  <component name="RunManager" selected="JUnit.UnionTest">
     <configuration default="false" name="StatisticsServiceTest" type="JUnit" 
factoryName="JUnit" temporary="true">
       <module name="gnunet-java" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
@@ -812,6 +864,28 @@
       <ConfigurationWrapper RunnerId="Run" />
       <method />
     </configuration>
+    <configuration default="false" name="UnionTest" type="JUnit" 
factoryName="JUnit" temporary="true">
+      <module name="gnunet-java" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" value="org.gnunet.construct" />
+      <option name="MAIN_CLASS_NAME" value="org.gnunet.construct.UnionTest" />
+      <option name="METHOD_NAME" />
+      <option name="TEST_OBJECT" value="class" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="moduleWithDependencies" />
+      </option>
+      <envs />
+      <patterns />
+      <RunnerSettings RunnerId="Run" />
+      <ConfigurationWrapper RunnerId="Run" />
+      <method />
+    </configuration>
     <configuration default="true" type="Remote" factoryName="Remote">
       <option name="USE_SOCKET_TRANSPORT" value="true" />
       <option name="SERVER_MODE" value="false" />
@@ -887,7 +961,7 @@
       </method>
     </configuration>
     <configuration default="false" name="Resolver" type="Application" 
factoryName="Application">
-      <option name="MAIN_CLASS_NAME" value="org.gnunet.service.Resolver" />
+      <option name="MAIN_CLASS_NAME" value="org.gnunet.util.Resolver" />
       <option name="VM_PARAMETERS" value="-ea" />
       <option name="PROGRAM_PARAMETERS" value="" />
       <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
@@ -902,11 +976,12 @@
       <ConfigurationWrapper RunnerId="Run" />
       <method />
     </configuration>
-    <list size="4">
+    <list size="5">
       <item index="0" class="java.lang.String" 
itemvalue="JUnit.StatisticsServiceTest" />
       <item index="1" class="java.lang.String" 
itemvalue="JUnit.NetworkSizeEstimationServiceTest" />
       <item index="2" class="java.lang.String" itemvalue="JUnit.ConstructTest" 
/>
       <item index="3" class="java.lang.String" 
itemvalue="Application.Resolver" />
+      <item index="4" class="java.lang.String" itemvalue="JUnit.UnionTest" />
     </list>
     <configuration name="&lt;template&gt;" type="WebApp" default="true" 
selected="false">
       <Host>localhost</Host>
@@ -979,25 +1054,25 @@
     <frame x="-6" y="17" width="1452" height="889" extended-state="0" />
     <editor active="true" />
     <layout>
-      <window_info id="Messages" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.2967033" sideWeight="0.49713057" order="7" side_tool="false" 
content_ui="tabs" />
       <window_info id="Changes" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.32967034" sideWeight="0.5" order="7" side_tool="false" 
content_ui="tabs" />
       <window_info id="Palette" active="false" anchor="right" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
-      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32967034" 
sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
       <window_info id="Ant Build" active="false" anchor="right" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.24098124" sideWeight="0.6710875" order="1" side_tool="false" 
content_ui="tabs" />
-      <window_info id="Structure" active="false" anchor="left" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.23015873" sideWeight="0.58928573" order="1" side_tool="false" 
content_ui="tabs" />
-      <window_info id="Project" active="false" anchor="left" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="true" weight="0.21933623" 
sideWeight="0.7032967" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.1826923" 
sideWeight="0.49426112" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.44230768" 
sideWeight="0.63708514" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.45054945" sideWeight="0.35786435" order="7" side_tool="true" 
content_ui="tabs" />
       <window_info id="Favorites" active="false" anchor="left" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
-      <window_info id="Event Log" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.45054945" sideWeight="0.35786435" order="7" side_tool="true" 
content_ui="tabs" />
-      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.41346154" 
sideWeight="0.9126984" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Version Control" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.32967034" sideWeight="0.0" order="7" side_tool="false" 
content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.1456044" sideWeight="0.0" order="7" side_tool="false" 
content_ui="tabs" />
+      <window_info id="Messages" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.2967033" sideWeight="0.49713057" order="7" side_tool="false" 
content_ui="tabs" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32967034" 
sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.23015873" sideWeight="0.58928573" order="1" side_tool="false" 
content_ui="tabs" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="true" weight="0.22655122" 
sideWeight="0.76236266" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.23763736" 
sideWeight="0.9126984" order="2" side_tool="false" content_ui="tabs" />
       <window_info id="Documentation" active="false" anchor="right" 
auto_hide="false" internal_type="DOCKED" type="FLOATING" visible="true" 
weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" 
x="88" y="109" width="1260" height="692" />
       <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" 
sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
       <window_info id="Message" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
-      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.48763737" 
sideWeight="0.49426112" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Commander" active="false" anchor="right" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Hierarchy" active="false" anchor="right" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
-      <window_info id="Inspection" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.3021978" sideWeight="0.5" order="5" side_tool="false" 
content_ui="tabs" />
+      <window_info id="Inspection" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.4945055" sideWeight="0.5" order="5" side_tool="false" 
content_ui="tabs" />
     </layout>
   </component>
   <component name="VcsContentAnnotationSettings">
@@ -1034,7 +1109,7 @@
     <option name="INCLUDE_TEXT_INTO_SHELF" value="false" />
     <option name="CREATE_PATCH_EXPAND_DETAILS_DEFAULT" value="true" />
     <option name="FORCE_NON_EMPTY_COMMENT" value="false" />
-    <option name="LAST_COMMIT_MESSAGE" value="rudimentary version of resolve 
tool completed" />
+    <option name="LAST_COMMIT_MESSAGE" value="implemented message unions, 
parameter parsing" />
     <option name="MAKE_NEW_CHANGELIST_ACTIVE" value="true" />
     <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false" />
     <option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT" value="false" />
@@ -1050,9 +1125,10 @@
     <MESSAGE value="NSE client almost working" />
     <MESSAGE value="added MsgMap update shell script" />
     <MESSAGE value="fixes / documentation" />
-    <MESSAGE value="fix" />
     <MESSAGE value="added libs" />
     <MESSAGE value="rudimentary version of resolve tool completed" />
+    <MESSAGE value="fix" />
+    <MESSAGE value="implemented message unions, parameter parsing" />
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager />
@@ -1062,93 +1138,125 @@
     <option name="FILTER_TARGETS" value="false" />
   </component>
   <component name="editorHistoryManager">
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/SequenceParser.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/getopt/Parser.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="39" column="20" selection-start="1014" 
selection-end="1014" vertical-scroll-proportion="0.0" />
+        <state line="51" column="8" selection-start="1569" 
selection-end="1569" vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="e#1109#1117#0" expanded="true" />
+          </folding>
+        </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/IntegerParser.java">
+    <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/StringMessage.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="8" column="13" selection-start="202" selection-end="202" 
vertical-scroll-proportion="0.0" />
+        <state line="2" column="13" selection-start="44" selection-end="44" 
vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/FixedSizeArrayParser.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/MessageIdAnnotationProcessor.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="7" column="13" selection-start="155" selection-end="155" 
vertical-scroll-proportion="0.0" />
+        <state line="107" column="85" selection-start="4974" 
selection-end="4974" vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="imports" expanded="true" />
+            <element signature="e#1053#1083#0" expanded="true" />
+          </folding>
+        </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/FillParser.java">
+    <entry file="file://$PROJECT_DIR$/src/org/grothoff/Runabout.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="17" column="4" selection-start="397" selection-end="397" 
vertical-scroll-proportion="0.0" />
+        <state line="113" column="7" selection-start="4566" 
selection-end="4566" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/ISSUES">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/construct/MsgMap.txt">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="151" column="10" selection-start="4917" 
selection-end="4917" vertical-scroll-proportion="0.43251088" />
+        <state line="11" column="0" selection-start="661" selection-end="661" 
vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/service/Resolver.java">
+    <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/ConstructTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="155" column="12" selection-start="4980" 
selection-end="4980" vertical-scroll-proportion="0.0" />
+        <state line="7" column="13" selection-start="123" selection-end="123" 
vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/construct/Construct.java">
+    <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/UnionTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="68" column="1" selection-start="2022" 
selection-end="2449" vertical-scroll-proportion="0.0" />
+        <state line="11" column="23" selection-start="265" selection-end="265" 
vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/log4j.properties">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/UnionParser.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="2" column="50" selection-start="78" selection-end="78" 
vertical-scroll-proportion="0.0" />
+        <state line="68" column="0" selection-start="2086" 
selection-end="2086" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/VarTestMessage.java">
+    <entry file="file://$PROJECT_DIR$/src/log4j.properties">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="2" column="13" selection-start="44" selection-end="44" 
vertical-scroll-proportion="0.0" />
+        <state line="0" column="21" selection-start="21" selection-end="21" 
vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/services/NetworkSizeEstimationServiceTest.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/construct/Construct.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="13" column="13" selection-start="300" selection-end="300" 
vertical-scroll-proportion="0.0" />
+        <state line="79" column="0" selection-start="2570" 
selection-end="2570" vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="e#3565#3603#0" expanded="true" />
+          </folding>
+        </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/ByteFillParser.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/MessageLoader.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="55" column="9" selection-start="1668" 
selection-end="1668" vertical-scroll-proportion="0.0" />
+        <state line="106" column="68" selection-start="3991" 
selection-end="3991" vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="e#1363#1393#0" expanded="true" />
+          </folding>
+        </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/NestedParser.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/service/NetworkSizeEstimation.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="46" column="25" selection-start="1441" 
selection-end="1441" vertical-scroll-proportion="0.0">
+        <state line="69" column="61" selection-start="1769" 
selection-end="1769" vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/getopt/Argument.java">
+    <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/services/NetworkSizeEstimationServiceTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="11" column="15" selection-start="303" selection-end="303" 
vertical-scroll-proportion="0.0" />
+        <state line="23" column="5" selection-start="747" selection-end="747" 
vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/getopt/Option.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/IntegerParser.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="13" column="27" selection-start="374" selection-end="374" 
vertical-scroll-proportion="0.0">
+        <state line="42" column="13" selection-start="1133" 
selection-end="1133" vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Program.java">
+    <entry file="file://$PROJECT_DIR$/ISSUES">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="31" column="8" selection-start="874" selection-end="874" 
vertical-scroll-proportion="0.0">
+        <state line="180" column="30" selection-start="6264" 
selection-end="6264" vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/getopt/Parser.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Resolver.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="75" column="71" selection-start="2181" 
selection-end="2181" vertical-scroll-proportion="0.5641026">
+        <state line="40" column="27" selection-start="1171" 
selection-end="1171" vertical-scroll-proportion="0.6780627">
           <folding>
-            <element signature="e#1206#1221#0" expanded="true" />
-            <element signature="e#1283#1296#0" expanded="true" />
+            <element signature="e#617#673#0" expanded="true" />
           </folding>
         </state>
       </provider>

Modified: gnunet-java/ISSUES
===================================================================
--- gnunet-java/ISSUES  2012-01-25 23:19:25 UTC (rev 19419)
+++ gnunet-java/ISSUES  2012-01-26 07:36:44 UTC (rev 19420)
@@ -173,3 +173,9 @@
        @Uint32 reserved; @Nested RelativeTimeMsg ts; @Double double est; 
@Double double dev;
      }
 
+
+
+================================================
+
+* AF_* etc. seem to be system specific
+* inconsistent message formats

Modified: gnunet-java/resolver
===================================================================
--- gnunet-java/resolver        2012-01-25 23:19:25 UTC (rev 19419)
+++ gnunet-java/resolver        2012-01-26 07:36:44 UTC (rev 19420)
@@ -2,4 +2,4 @@
 
 DIR=`dirname $0`
 
-java -ea -cp "$DIR/bin/:$DIR/lib/*" org.gnunet.service.Resolver "$@"
+java -ea -cp "$DIR/bin/:$DIR/lib/*" org.gnunet.util.Resolver "$@"

Modified: gnunet-java/src/log4j.properties
===================================================================
--- gnunet-java/src/log4j.properties    2012-01-25 23:19:25 UTC (rev 19419)
+++ gnunet-java/src/log4j.properties    2012-01-26 07:36:44 UTC (rev 19420)
@@ -1,4 +1,4 @@
-log4j.rootLogger=FATAL, A1
+log4j.rootLogger=WARN, A1
 
 log4j.appender.A1=org.apache.log4j.ConsoleAppender
 

Modified: gnunet-java/src/org/gnunet/construct/Construct.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/Construct.java 2012-01-25 23:19:25 UTC 
(rev 19419)
+++ gnunet-java/src/org/gnunet/construct/Construct.java 2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -36,7 +36,7 @@
         try {
             m = c.newInstance();
         } catch (InstantiationException e) {
-            throw new InterfaceViolationException("Cannot instantiate 
Message");
+            throw new InterfaceViolationException("Cannot instantiate " + c);
         } catch (IllegalAccessException e) {
             throw new InterfaceViolationException(
                     String.format("Cannot instantiate Message %s (illegal 
access)", c));
@@ -78,13 +78,14 @@
     private static Parser getParser(Class<? extends Message> c,
                                     ParserGenerator pg) {
 
+        
         SequenceParser parser = new SequenceParser();
         pg.c = c;
 
         if (!Modifier.isPublic(c.getModifiers())) {
             throw new InterfaceViolationException(String.format("Construct 
Message %s not declared public", c));
         }
-        
+
         for (Field f : getMessageFields(c)) {
             Annotation[] as = f.getAnnotations();
             if (as.length == 0 || f.isSynthetic() || 
Modifier.isStatic(f.getModifiers())) {
@@ -135,6 +136,16 @@
         private ParserGenerator() {
         }
 
+        public void visit(Union u) {
+            try {
+                parser = new UnionParser(frameSizePath, u.optional(), 
field.getType().getCanonicalName(),
+                        c.getField(u.tag()), field);
+            } catch (NoSuchFieldException e) {
+                throw new InterfaceViolationException(String.format("field 
'%s' does not exist in class '%s'", u.tag(), c));
+            }
+
+        }
+
         public void visit(FrameSize ts) {
 
             frameSizePath = new LinkedList<Field>(path);
@@ -210,7 +221,7 @@
             Parser p = getParser(ct, this);
 
             path = old_path;
-            parser = new NestedParser(p, frameSizePath, n.optional(), old_f);
+            parser = new NestedParser(p, new LinkedList<Field>(frameSizePath), 
n.optional(), old_f);
         }
 
         public void visit(ByteFill bf) {
@@ -222,6 +233,7 @@
             parser = new ByteFillParser(frameSizePath, field);
         }
 
+
         public void visit(FixedSizeArray fsa) {
             Field f = field;
             int elemNumber = fsa.length();
@@ -234,7 +246,7 @@
         }
 
         public void visit(Double d) {
-            if(!field.getType().equals(java.lang.Double.TYPE)) {
+            if (!field.getType().equals(java.lang.Double.TYPE)) {
                 throw new InterfaceViolationException("@Double target must be 
a primitive 'double' field");
             }
             parser = new DoubleParser(field);
@@ -287,6 +299,9 @@
      * @return number of bytes required, -1 on error
      */
     public static int getSize(Message m) {
+        if (m == null) {
+            return 0;
+        }
         Parser p = getParser(m.getClass());
         return p.getSize(m);
     }

Modified: gnunet-java/src/org/gnunet/construct/MessageIdAnnotationProcessor.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/MessageIdAnnotationProcessor.java      
2012-01-25 23:19:25 UTC (rev 19419)
+++ gnunet-java/src/org/gnunet/construct/MessageIdAnnotationProcessor.java      
2012-01-26 07:36:44 UTC (rev 19420)
@@ -4,35 +4,42 @@
 import javax.lang.model.SourceVersion;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
+import javax.lang.model.type.TypeMirror;
+import javax.lang.model.util.Elements;
+import javax.lang.model.util.Types;
 import javax.tools.Diagnostic;
 import javax.tools.FileObject;
 import javax.tools.StandardLocation;
 import java.io.IOException;
 import java.io.Writer;
+import java.lang.Integer;
 import java.lang.annotation.Annotation;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 
 /**
  * Creates a resource file 'MsgMap.txt' in the package 'org.gnunet.construct'.
- * Restriction: The MessageId annotation currently does not work with inner 
classes
  */
address@hidden({"org.gnunet.construct.MessageId"})
address@hidden({"org.gnunet.construct.MessageId", 
"org.gnunet.construct.UnionCase"})
 @SupportedSourceVersion(SourceVersion.RELEASE_6)
 public class MessageIdAnnotationProcessor extends AbstractProcessor {
-    HashMap<java.lang.Integer, String> msgmap = new HashMap<java.lang.Integer, 
String>();
+    Map<Integer, String> msgmap = new HashMap<java.lang.Integer, String>(100);
+    Map<String, Map<Integer, String>> unionmap = new HashMap<String, 
Map<Integer, String>>(100);
+    private Types types;
+    private Elements elements;
 
+
     @Override
     public boolean process(Set<? extends TypeElement> typeElements, 
RoundEnvironment roundEnvironment) {
         if (roundEnvironment.errorRaised()) {
             return false;
         }
 
+        this.types = processingEnv.getTypeUtils();
+        this.elements = processingEnv.getElementUtils();
+
         if (roundEnvironment.processingOver()) {
             Filer filer = processingEnv.getFiler();
             FileObject outfile;
@@ -49,8 +56,14 @@
                     w.write("" + e.getKey() + "=" + e.getValue() + "\n");
                 }
 
-                DateFormat fmt =  new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+                for (Map.Entry<String, Map<Integer, String>> outerEntry : 
unionmap.entrySet()) {
+                    for (Map.Entry<Integer, String> innerEntry : 
outerEntry.getValue().entrySet()) {
+                        w.write(""+ innerEntry.getKey() + "|" + 
outerEntry.getKey() + "=" + innerEntry.getValue() + "\n");
+                    }
+                }
 
+                DateFormat fmt = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+
                 w.write("# generated " + fmt.format(new Date()) + "\n");
                 w.close();
             } catch (IOException e) {
@@ -75,25 +88,56 @@
                     }
                 }
             }
+            for (Element e : 
roundEnvironment.getElementsAnnotatedWith(UnionCase.class)) {
+                UnionCase ann = e.getAnnotation(UnionCase.class);
+                String targetName = getClassName(e);
+                // get the uppermost parent class that implements 
MessageUnion. This is the union type.
+                // processingEnv.getElementUtils().
+                
//processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "element :" + 
e.toString());
+                List<? extends TypeMirror> parents = 
processingEnv.getTypeUtils().directSupertypes(e.asType());
+                TypeMirror msg = 
elements.getTypeElement("org.gnunet.construct.MessageUnion").asType();
+                TypeMirror unionInterface = null;
+                for (TypeMirror p : parents) {
+                    if (types.isSubtype(p, msg)) {
+                        unionInterface = p;
+                        break;
+                    }
+                }
+                if (unionInterface == null) {
+                    
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, String.format(
+                            "class %s annotated with @UnionCase does not 
implement an interface inheriting MessageUnion", e.getSimpleName()));
+                    return false;
+                }
+                String unionName = unionInterface.toString();
+                if (!unionmap.containsKey(unionName)) {
+                    unionmap.put(unionName, new HashMap<Integer, String>(10));
+                }
+                unionmap.get(unionName).put(ann.value(), getClassName(e));
+            }
         }
 
         return false;
     }
-    
+
+    /**
+     * Get the fully qualified class name, where packages are seperated with 
'.', and
+     * inner classes are separated with '$'
+     *
+     * @param e the Element representing a class
+     * @return the fully qualified class name
+     */
     String getClassName(Element e) {
         assert e.getKind().isClass();
-        
+
         String name = e.getSimpleName().toString();
         String pkg = 
processingEnv.getElementUtils().getPackageOf(e).getQualifiedName().toString() + 
".";
-        
+
         String outer = "";
-        
+
         while ((e = e.getEnclosingElement()) != null && e.getKind().isClass()) 
{
             outer = e.getSimpleName() + "$" + outer;
         }
-        
 
         return pkg + outer + name;
-
     }
 }

Modified: gnunet-java/src/org/gnunet/construct/MessageLoader.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/MessageLoader.java     2012-01-25 
23:19:25 UTC (rev 19419)
+++ gnunet-java/src/org/gnunet/construct/MessageLoader.java     2012-01-26 
07:36:44 UTC (rev 19420)
@@ -33,9 +33,11 @@
 import java.lang.Integer;
 import java.net.URL;
 import java.util.HashMap;
+import java.util.Map;
 
 public class MessageLoader {
     private static HashMap<java.lang.Integer, String> msgmap = new 
HashMap<Integer, String>();
+    private static Map<String, Map<Integer, String>> unionmap = new 
HashMap<String, Map<Integer, String>>(100);
 
     static {
         loadMessageMap();
@@ -61,11 +63,24 @@
                 }
                 String[] m = line.split("=");
                 if (m.length != 2) {
-                    throw new RuntimeException("invalid message map format");
+                    throw new RuntimeException("invalid message map format 
(separation by '=')");
                 }
-                int id = java.lang.Integer.parseInt(m[0].trim());
+                String[] left = m[0].split("\\|");
                 String fqn = m[1].trim();
-                msgmap.put(id, fqn);
+                if (left.length == 1) {
+                    int id = java.lang.Integer.parseInt(m[0].trim());
+                    msgmap.put(id, fqn);
+                } else if (left.length == 2) {
+                    int id = java.lang.Integer.parseInt(left[0].trim());
+                    String unionInterface = left[1];
+                    if (!unionmap.containsKey(unionInterface)) {
+                        unionmap.put(unionInterface, new HashMap<Integer, 
String>());
+                    }
+                    unionmap.get(unionInterface).put(id, fqn);
+                } else {
+                    throw new RuntimeException("invalid message map format 
(left hand side)");
+                }
+
             }
         } catch (IOException e) {
             throw new RuntimeException("could not read message map");
@@ -88,4 +103,26 @@
         
         return Construct.parseAs(data, offset, msgClass);
     }
+    
+    public static Class loadUnionClass(String unionType, int type) {
+        Map<Integer, String> map = unionmap.get(unionType);
+        if (map == null) {
+            throw new InternalLogicError("don't know how to handle unions of 
type '"+unionType+"'");
+        }
+        
+        String className = map.get(type);
+        if (className == null) {
+            throw new MessageFormatException("don't know how to translate 
message of type " + type);
+        }
+
+        ClassLoader cl = ClassLoader.getSystemClassLoader();
+        Class msgClass;
+        try {
+            msgClass = cl.loadClass(className);
+        } catch (ClassNotFoundException e) {
+            throw new InternalLogicError(String.format("message class '%s' not 
found in classpath", className));
+        }
+
+        return msgClass;
+    }
 }

Added: gnunet-java/src/org/gnunet/construct/MessageUnion.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/MessageUnion.java                      
        (rev 0)
+++ gnunet-java/src/org/gnunet/construct/MessageUnion.java      2012-01-26 
07:36:44 UTC (rev 19420)
@@ -0,0 +1,7 @@
+package org.gnunet.construct;
+
+/**
+ * Marker interface for Message Unions
+ */
+public interface MessageUnion extends Message {
+}

Modified: gnunet-java/src/org/gnunet/construct/MsgMap.txt
===================================================================
--- gnunet-java/src/org/gnunet/construct/MsgMap.txt     2012-01-25 23:19:25 UTC 
(rev 19419)
+++ gnunet-java/src/org/gnunet/construct/MsgMap.txt     2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -1,7 +1,11 @@
-987=org.gnunet.construct.SizeTestMessage
+5=org.gnunet.util.Resolver$ResolverResponse
 291=org.gnunet.construct.QueryMessage
-323=org.gnunet.service.NetworkSizeEstimation.NSE_UpdateMessage
-5=org.gnunet.service.Resolver.ResolverResponse
-321=org.gnunet.service.NetworkSizeEstimation.NSE_StartMessage
+323=org.gnunet.service.NetworkSizeEstimation$NSE_UpdateMessage
+321=org.gnunet.service.NetworkSizeEstimation$NSE_StartMessage
 3210=org.gnunet.construct.SimpleTestMessage
-# generated 2012/01/18 15:14:33
+987=org.gnunet.construct.SizeTestMessage
+0|org.gnunet.construct.UnionTest.TestUnion=org.gnunet.construct.UnionTest$TestUnionCase0
+1|org.gnunet.construct.UnionTest.TestUnion=org.gnunet.construct.UnionTest$TestUnionCase1
+3|org.gnunet.util.Resolver.AddressUnion=org.gnunet.util.Resolver$AddressString
+45|org.gnunet.util.Resolver.AddressUnion=org.gnunet.util.Resolver$AddressBinary
+# generated 2012/01/25 18:47:40

Modified: gnunet-java/src/org/gnunet/construct/Nested.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/Nested.java    2012-01-25 23:19:25 UTC 
(rev 19419)
+++ gnunet-java/src/org/gnunet/construct/Nested.java    2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -16,4 +16,5 @@
 public @interface Nested {
     boolean newFrame() default false;
     boolean optional() default false;
+    String unionTag() default "";
 }
\ No newline at end of file

Deleted: gnunet-java/src/org/gnunet/construct/TaggedUnion.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/TaggedUnion.java       2012-01-25 
23:19:25 UTC (rev 19419)
+++ gnunet-java/src/org/gnunet/construct/TaggedUnion.java       2012-01-26 
07:36:44 UTC (rev 19420)
@@ -1,16 +0,0 @@
-package org.gnunet.construct;
-
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
address@hidden(RetentionPolicy.RUNTIME)
address@hidden(ElementType.FIELD)
-public @interface TaggedUnion {
-    // path to the tag
-    String tag();
-    String[] keys();
-    Class[] values();
-}
\ No newline at end of file

Added: gnunet-java/src/org/gnunet/construct/Union.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/Union.java                             
(rev 0)
+++ gnunet-java/src/org/gnunet/construct/Union.java     2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -0,0 +1,14 @@
+package org.gnunet.construct;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
address@hidden(ElementType.FIELD)
address@hidden(RetentionPolicy.RUNTIME)
+public @interface Union {
+    String tag();
+    boolean optional() default false;
+}
\ No newline at end of file

Copied: gnunet-java/src/org/gnunet/construct/UnionCase.java (from rev 19281, 
gnunet-java/src/org/gnunet/construct/TaggedUnion.java)
===================================================================
--- gnunet-java/src/org/gnunet/construct/UnionCase.java                         
(rev 0)
+++ gnunet-java/src/org/gnunet/construct/UnionCase.java 2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -0,0 +1,13 @@
+package org.gnunet.construct;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
address@hidden(RetentionPolicy.SOURCE)
address@hidden(ElementType.TYPE)
+public @interface UnionCase {
+    int value();
+}
\ No newline at end of file

Modified: gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java     
2012-01-25 23:19:25 UTC (rev 19419)
+++ gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java     
2012-01-26 07:36:44 UTC (rev 19420)
@@ -37,7 +37,7 @@
         try {
             switch (ft) {
             case BYTE_PRIM:
-                field.setShort(dstObj, readShort(srcData, offset));
+                field.setByte(dstObj, readByte(srcData, offset));
                 break;
             case SHORT_PRIM:
                 field.setShort(dstObj, readShort(srcData, offset));
@@ -55,7 +55,7 @@
             }
 
         } catch (IllegalArgumentException e) {
-            throw new RuntimeException();
+            throw new RuntimeException(e);
         } catch (IllegalAccessException e) {
             throw new RuntimeException();
         }

Added: gnunet-java/src/org/gnunet/construct/parsers/UnionParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/UnionParser.java               
                (rev 0)
+++ gnunet-java/src/org/gnunet/construct/parsers/UnionParser.java       
2012-01-26 07:36:44 UTC (rev 19420)
@@ -0,0 +1,88 @@
+package org.gnunet.construct.parsers;
+
+import org.gnunet.construct.Construct;
+import org.gnunet.construct.Message;
+import org.gnunet.construct.MessageLoader;
+import org.gnunet.exceptions.MessageFormatException;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+
+public class UnionParser extends FieldParser {
+    private List<Field> frameSizePath;
+
+    private Field unionTag;
+    private String unionType;
+
+    boolean optional;
+
+    public UnionParser(List<Field> frameSizePath, boolean optional, String 
unionType, Field unionTag, Field f) {
+        super(f);
+        this.optional = optional;
+        this.frameSizePath = frameSizePath;
+        this.unionTag = unionTag;
+        this.unionType = unionType;
+    }
+
+    @Override
+    public int getSize(final Message src) {
+        return Construct.getSize((Message) getFieldValue(src));
+    }
+
+    private int getSizeFieldValue(Message m) {
+        Object obj = Construct.ReflectionUtil.followFieldPath(frameSizePath, 
m);
+        return ((Number) obj).intValue();
+    }
+
+    @Override
+    public int parse(final byte[] src_data, final int offset,
+                     int frameOffset, Message frameObj, final Message dstObj) {
+
+
+        if (optional) {
+            int remaining = (frameOffset + getSizeFieldValue(frameObj)) - 
offset;
+            if (remaining <= 0) {
+                if (!optional) {
+                    throw new MessageFormatException("not optional");
+                }
+                setFieldValue(dstObj, null);
+                return 0;
+            }
+        }
+
+        Class cls = null;
+        try {
+            cls = MessageLoader.loadUnionClass(unionType, ((Number) 
unionTag.get(dstObj)).intValue());
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException();
+        }
+        try {
+            setFieldValue(dstObj, cls.newInstance());
+        } catch (InstantiationException e) {
+            throw new RuntimeException(e);
+            //throw new InterfaceViolationException("cannot instantiate class 
" + cls);
+        } catch (IllegalAccessException e) {
+
+        }
+
+
+        return Construct.getParser((Class<? extends Message>) 
getFieldValue(dstObj).getClass())
+                .parse(src_data, offset, frameOffset, frameObj, (Message) 
getFieldValue(dstObj));
+    }
+
+    @Override
+    public int write(final byte[] dst_data, final int offset, final Message 
src) {
+        return Construct.getParser((Class<? extends Message>) 
getFieldValue(src).getClass())
+                .write(dst_data, offset, (Message) getFieldValue(src));
+    }
+
+    @Override
+    public void patch(Message m, int frameSize) {
+        // todo: nested/opaque frames
+        Parser p = Construct.getParser((Class<? extends Message>) 
getFieldValue(m).getClass());
+
+        p.patch((Message) getFieldValue(m), frameSize);
+    }
+
+}

Modified: gnunet-java/src/org/gnunet/service/NetworkSizeEstimation.java
===================================================================
--- gnunet-java/src/org/gnunet/service/NetworkSizeEstimation.java       
2012-01-25 23:19:25 UTC (rev 19419)
+++ gnunet-java/src/org/gnunet/service/NetworkSizeEstimation.java       
2012-01-26 07:36:44 UTC (rev 19420)
@@ -68,7 +68,6 @@
                 throw new MessageFormatException("got unexcpected message");
             }
             NSE_UpdateMessage uMsg = (NSE_UpdateMessage) msg;
-            System.out.println("got message back!");
 
             for (NSE_Subscriber s : subscribers) {
                 s.update(AbsoluteTime.fromNetwork(uMsg.timestamp), 
uMsg.sizeEstimate, uMsg.stdDeviation);

Deleted: gnunet-java/src/org/gnunet/service/Resolver.java
===================================================================
--- gnunet-java/src/org/gnunet/service/Resolver.java    2012-01-25 23:19:25 UTC 
(rev 19419)
+++ gnunet-java/src/org/gnunet/service/Resolver.java    2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -1,211 +0,0 @@
-package org.gnunet.service;
-
-
-import org.gnunet.construct.*;
-import org.gnunet.exceptions.InterfaceViolationException;
-import org.gnunet.exceptions.MessageFormatException;
-import org.gnunet.util.*;
-import org.gnunet.util.getopt.Argument;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.Inet4Address;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Arrays;
-
-public class Resolver {
-    private static final Logger logger = LoggerFactory
-            .getLogger(Resolver.class);
-
-    @SuppressWarnings("InstanceVariableMayNotBeInitialized")
-    public static class GetMessage implements Message {
-        final static int MSG_ID = 4;
-
-        static final int DIRECTION_GET_IP = 0;
-        static final int DIRECTION_GET_NAME = 1;
-        static final int AF_INET = 2;
-        // .. more constants to come
-
-        @Nested
-        public MessageHeader header;
-        
-        @UInt32
-        public int direction;
-        @UInt32
-        public int domain;
-        @ByteFill
-        public byte[] addr;
-    }
-
-    @MessageId(ResolverResponse.MSG_ID)
-    public static class ResolverResponse implements Message {
-        final static int MSG_ID = 5;
-        @Nested
-        public MessageHeader header;
-        @Nested(optional = true)
-        public ResponseBody responseBody;
-    }
-
-    public static class ResponseBody implements Message {
-        @UInt32
-        public int domain;
-        @ByteFill
-        public byte[] addr;
-        
-        // @Nested(union_on="direction")
-       // AddressUnion address;
-    }
-    /*
-    interface AddressUnion extends Message {}
-    @UnionCase(value=3)
-    public static class AddressString implements AddressUnion
-    {   
-        @ZeroTerminatedString
-        public String addr;
-    }
-    
-    @UnionCase(value=45)
-    public static class AddressBinary implements AddressUnion
-    {   
-        @ByteFill
-        public byte[] addr;
-    }
-*/
-
-    public interface HostnameCallback {
-        public void onHostname(String hostname);
-
-        public void onFinished();
-    }
-
-    public interface AddressCallback {
-        public void onAddress(InetAddress addr);
-
-        public void onFinished();
-    }
-
-
-    Client client = null;
-
-    public void connect(Configuration cfg) {
-        if (client != null) {
-            throw new InterfaceViolationException("connect called twice");
-        }
-        client = new Client("resolver", new BootstrapResolver(), cfg);
-    }
-
-    public void resolveHostname(String hostname, RelativeTime timeout, final 
AddressCallback cb) {
-        if (client == null) {
-            throw new InterfaceViolationException("must connect Resolver 
before using");
-        }
-
-        final GetMessage req = new GetMessage();
-        req.header = new MessageHeader();
-        req.header.messageType = GetMessage.MSG_ID;
-        req.direction = GetMessage.DIRECTION_GET_IP;
-        req.domain = GetMessage.AF_INET;
-        byte[] addr = hostname.getBytes();
-        // add 0-byte
-        req.addr = Arrays.copyOf(addr, addr.length + 1);
-
-        req.header.messageSize = Construct.getSize(req);
-
-        logger.debug("" + req.header.messageSize);
-
-
-        client.notifyTransmitReady(
-                Construct.getSize(req),
-                RelativeTime.FOREVER, true,
-                new MessageTransmitter() {
-                    @Override
-                    public void transmit(Client.MessageSink sink) {
-                        sink.send(req);
-
-                        client.receive(new MessageReceiver() {
-                            @Override
-                            public void process(Message msg) {
-                                ResolverResponse gmsg = (ResolverResponse) msg;
-                                if (gmsg.responseBody != null) {
-                                    try {
-                                        InetAddress in_addr = 
Inet4Address.getByAddress(
-                                                
Arrays.copyOfRange(gmsg.responseBody.addr, 0, 4));
-                                        cb.onAddress(in_addr);
-                                        client.receive(this, 
RelativeTime.FOREVER);
-                                    } catch (UnknownHostException e) {
-                                        throw new 
MessageFormatException("malformed address");
-                                    }
-                                } else {
-                                    cb.onFinished();
-                                }
-                            }
-
-                            @Override
-                            public void handleTimeout() {
-                                throw new RuntimeException("unreachable");
-                            }
-                        }, RelativeTime.FOREVER);
-
-                    }
-
-                    @Override
-                    public void handleTimeout() {
-                        throw new RuntimeException("unreachable");
-                    }
-                });
-
-    }
-
-    private static Resolver singletonInstance = null;
-
-    public static Resolver getInstance() {
-        if (singletonInstance == null) {
-            singletonInstance = new Resolver();
-        }
-        return singletonInstance;
-    }
-
-
-    public static void main(final String[] argv) {
-        new Program(argv) {
-            // @Argument(name="HOSTNAME")  public String hostname;
-            
-            @Override
-            public void run() {
-               for (String hostname : this.unprocessedArgs)
-               {
-                System.out.println("resolving hostname '" + hostname + "'");
-                Resolver.getInstance().resolveHostname(hostname, 
RelativeTime.FOREVER, new AddressCallback() {
-                    @Override
-                    public void onAddress(InetAddress addr) {
-                        System.out.println(addr);
-                    }
-
-                    @Override
-                    public void onFinished() {
-                        System.out.println("done.");
-                    }
-                });
-               }
-            }
-
-        }.start();
-    }
-
-
-    /**
-     * Resolver used to connect to the resolver service itself, solving the 
chicken and egg-problem.
-     * Only loopback and ip addresses can be "resolved", no real domain names
-     */
-    private class BootstrapResolver extends Resolver {
-        public BootstrapResolver() {
-        }
-
-        @Override
-        public void connect(Configuration cfg) {
-            throw new UnsupportedOperationException("Bootstrap resolver does 
not need to be connected");
-        }
-
-    }
-
-}

Modified: gnunet-java/src/org/gnunet/util/AbsoluteTime.java
===================================================================
--- gnunet-java/src/org/gnunet/util/AbsoluteTime.java   2012-01-25 23:19:25 UTC 
(rev 19419)
+++ gnunet-java/src/org/gnunet/util/AbsoluteTime.java   2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -28,7 +28,7 @@
  * 
  * @author Florian Dold
  */
-public class AbsoluteTime implements Comparable {
+public class AbsoluteTime implements Comparable<AbsoluteTime> {
     private static final Logger logger = LoggerFactory
             .getLogger(AbsoluteTime.class);
 
@@ -107,11 +107,18 @@
     }
 
     @Override
-    public int compareTo(final Object o) {
-        // TODO Auto-generated method stub
-        return 0;
+    public int compareTo(AbsoluteTime o) {
+        return Long.signum(this.abs_value - o.abs_value);
     }
+    
+    @Override
+    public boolean equals(Object other) {
+        return other instanceof AbsoluteTime && compareTo((AbsoluteTime) 
other) == 0;
+    }
 
+
+
+
     /**
      * Calculates the difference between two absolute times.
      * 
@@ -199,10 +206,6 @@
     }
 
     public static AbsoluteTime fromNetwork(AbsoluteTimeMessage m) {
-        if (m.value__ < 0) {
-            return AbsoluteTime.FOREVER;
-        } else {
-            return new AbsoluteTime(m.value__);
-        }
+        return m.value__ < 0 ? AbsoluteTime.FOREVER : new 
AbsoluteTime(m.value__);
     }
 }

Modified: gnunet-java/src/org/gnunet/util/Client.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Client.java 2012-01-25 23:19:25 UTC (rev 
19419)
+++ gnunet-java/src/org/gnunet/util/Client.java 2012-01-26 07:36:44 UTC (rev 
19420)
@@ -25,22 +25,20 @@
 import org.gnunet.construct.MessageLoader;
 import org.gnunet.exceptions.ConfigurationException;
 import org.gnunet.exceptions.InterfaceViolationException;
-import org.gnunet.service.Resolver;
 import org.gnunet.util.Scheduler.Task;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOError;
 import java.io.IOException;
-import java.net.ConnectException;
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
-import java.nio.channels.ClosedChannelException;
 import java.nio.channels.SocketChannel;
 import java.nio.channels.spi.SelectorProvider;
 import java.util.Arrays;
+import java.util.LinkedList;
 
-
 /**
  * Represents a connection to a service.
  */
@@ -60,12 +58,7 @@
     private ByteBuffer transmitBuffer = 
ByteBuffer.allocate(INITIAL_BUFFER_SIZE);
 
     private MessageTransmitter nextTransmitter = null;
-    private boolean connected = false;
-    private String serviceName;
-    private Configuration cfg;
-    private Resolver resolver;
 
-
     /**
      * Represents a request for transmission.
      */
@@ -169,7 +162,7 @@
         public void run(Context ctx) {
             try {
                 int n = chan.write(transmitBuffer);
-                logger.debug("chan has written "+n + " bytes");
+                logger.debug("chan has written " + n + " bytes");
             } catch (IOException e) {
                 throw new IOError(e);
             }
@@ -206,35 +199,98 @@
         }
     }
 
-    private class ConnectHelper implements Task {
+    private class ConnectHelper implements Task, Resolver.AddressCallback {
+        private boolean resolveActive = false;
+        private LinkedList<InetAddress> addrList = new 
LinkedList<InetAddress>();
+        private String hostname;
+        private int port;
+        private RelativeTime backoff = RelativeTime.MILLISECOND;
+
+        public ConnectHelper(String hostname, int port) {
+            this.hostname = hostname;
+            this.port = port;
+        }
+
         @Override
         public void run(Context ctx) {
-            finishConnect();
+            connectStep();
         }
+        
+        private void increaseBackoff() {
+            backoff = RelativeTime.max(backoff.multiply(2), 
RelativeTime.SECOND);
+        }
+        private void resetBackoff() {
+            backoff = RelativeTime.MILLISECOND;
+        }
 
-        public void finishConnect() {
+
+        /**
+         * Execute the next step in connecting to a service.
+         * Automatically schedules further steps if necessary.
+         */
+        public void connectStep() {
+            if (chan == null) {
+                try {
+                    chan = SelectorProvider.provider().openSocketChannel();
+                    chan.configureBlocking(false);
+                } catch (IOException e) {
+                    // this is fatal, no retry necessary
+                    throw new IOError(e);
+                }
+            }
+            if (chan.isConnected()) {
+                return;
+            }
             try {
-                if (chan.finishConnect()) {
-                    logger.debug("finished connect");
-                    connected = true;
-                    if (currentTransmit == null && nextTransmitter != null) {
-                        MessageTransmitter t = nextTransmitter;
-                        nextTransmitter = null;
-                        startTransmit(t);
+                if (chan.isConnectionPending()) {
+                    if (chan.finishConnect()) {
+                        logger.debug("finished connect");
+                        // start transmit if request for transmit is pending
+                        if (currentTransmit == null && nextTransmitter != 
null) {
+                            MessageTransmitter t = nextTransmitter;
+                            nextTransmitter = null;
+                            startTransmit(t);
+                        }
+                    } else {
+                        logger.debug("still not finished");
+                        Scheduler.add(this, backoff);
+                        this.increaseBackoff();
                     }
                 } else {
-                    logger.debug("still not finished");
-                    Scheduler.addDelayed(new RelativeTime(5), this);
+                    InetAddress addr = addrList.poll();
+                    if (addr == null && !resolveActive) {
+                        startResolve();
+                    } else {
+                        logger.debug("connecting to " + addr + " on " + port);
+                        chan.connect(new InetSocketAddress(addr, port));
+                        resetBackoff();
+                        Scheduler.add(this, backoff);
+                    }
                 }
-            } catch (ConnectException e) {
-                logger.debug("got connect exception");
-                Scheduler.addDelayed(new RelativeTime(5), this);
-            } catch (ClosedChannelException e) {
-                do_connect();
             } catch (IOException e) {
-                throw new IOError(e);
+                logger.debug("got exception while connecting, retrying", e);
+                chan = null;
+                Scheduler.add(this, backoff);
+                increaseBackoff();
             }
         }
+
+        @Override
+        public void onAddress(InetAddress addr) {
+            addrList.add(addr);
+            connectStep();
+        }
+
+        @Override
+        public void onFinished() {
+            this.resolveActive = false;
+            Scheduler.add(this, backoff);
+        }
+
+        public void startResolve() {
+            this.resolveActive = true;
+            Resolver.getInstance().resolveHostname(hostname, 
RelativeTime.FOREVER, this);
+        }
     }
 
 
@@ -245,48 +301,22 @@
      * @param cfg         configuration to use
      */
     public Client(String serviceName, Configuration cfg) {
-        this(serviceName, Resolver.getInstance(), cfg);
-    }
-
-
-    /**
-     * Get a connection with a service, using a specific resolver.
-     * Used mainly while the default resolver is not yet available / for 
connecting to the resolver service.
-     *
-     * @param serviceName name of the service
-     * @param resolver    the resolver to use
-     * @param cfg         configuration to use
-     */
-    public Client(String serviceName, Resolver resolver, Configuration cfg) {
-        this.serviceName = serviceName;
-        this.cfg = cfg;
-        this.resolver = resolver;
-
-        do_connect();
-    }
-
-    private void do_connect() {
+        // get port of this service from the configuration
         int port = (int) cfg.getValueNumer(serviceName, "PORT");
+        // ... and check for validity
         if (port > 0xFFFF || port <= 0) {
-            throw new ConfigurationException(String.format("'%s' is not a 
valid Port", port));
+            throw new ConfigurationException(String.format("'%s' is not a 
valid port", port));
         }
+        // ditto for hostname
         String hostname = cfg.getValueString(serviceName, "HOSTNAME");
-        try {
-            chan = SelectorProvider.provider().openSocketChannel();
-            chan.configureBlocking(false);
-        } catch (IOException e) {
-            // this is fatal, no retry necessary
-            throw new IOError(e);
+        // todo: further validity checks
+        if (hostname.isEmpty()) {
+            throw new ConfigurationException(String.format("hostname of 
service '%s' empty", serviceName));
         }
-        try {
-            chan.connect(new InetSocketAddress("::1" /*hostname*/, port));
-        } catch (IOException e) {
-            // todo: retry until connect possible
-            logger.warn("Failed to connect to " + hostname + " at port " + 
port);
-            throw new IOError(e);
-        }
-        ConnectHelper ct = new ConnectHelper();
-        ct.finishConnect();
+        // create a connect helper
+        ConnectHelper connectHelper = new ConnectHelper(hostname, port);
+        // start with the first step
+        connectHelper.connectStep();
     }
 
     /**
@@ -358,7 +388,7 @@
      * @param timeout     after how long should we give up (and call
      *                    notify with buf NULL and size 0)?
      * @param autoRetry   if the connection to the service dies, should we
-     *                    automatically re-connect and retry (within the 
timeout period)
+     *                    automatically re-connectStep and retry (within the 
timeout period)
      *                    or should we immediately fail in this case?  Pass 
GNUNET_YES
      *                    if the caller does not care about temporary 
connection errors,
      *                    for example because the protocol is stateless
@@ -375,7 +405,7 @@
             transmitBuffer = ByteBuffer.allocate(size);
             logger.debug("bigger transmitBuffer allocated");
         }
-        if (currentTransmit == null && connected) {
+        if (currentTransmit == null && chan != null && chan.isConnected()) {
             startTransmit(transmitter);
             return new TransmitHandle() {
                 @Override
@@ -386,7 +416,7 @@
         } else {
             if (!timeout.isForever()) {
                 TransmitTimeoutHelper h = new 
TransmitTimeoutHelper(transmitter, size);
-                nextTransmitTimeout = Scheduler.addDelayed(timeout, h);
+                nextTransmitTimeout = Scheduler.add(h, timeout);
             }
             nextTransmitter = transmitter;
             return new TransmitHandle() {

Modified: gnunet-java/src/org/gnunet/util/Program.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Program.java        2012-01-25 23:19:25 UTC 
(rev 19419)
+++ gnunet-java/src/org/gnunet/util/Program.java        2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -1,24 +1,41 @@
 package org.gnunet.util;
 
-import org.gnunet.service.Resolver;
 import org.gnunet.util.getopt.Option;
+import org.gnunet.util.getopt.OptionAction;
 import org.gnunet.util.getopt.Parser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public abstract class Program {
+    private static final Logger logger = LoggerFactory
+            .getLogger(Resolver.class);
 
+
     protected final Configuration cfg = new Configuration();
 
 
-
     @Option(shortname = "c", longname = "config",
             description = "Path of the configuration file",
-            action ="store-string")
+            argumentName = "FILENAME",
+            action = OptionAction.STORE_STRING)
     public String cfgFileName;
 
-    
+    @Option(shortname = "h", longname = "help",
+            description = "print this help message",
+            action = OptionAction.SET)
+    public boolean printHelp;
+
+    @Option(shortname = "v", longname = "version",
+            description = "display version information",
+            action = OptionAction.SET)
+    public boolean showVersion;
+
+
     protected final String[] unprocessedArgs;
 
+    private Parser optParser;
 
+
     /**
      * A program with the desired environment for a gnunet utility.
      * While executing the scheduler is guaranteed to run, command arguments 
are parsed,
@@ -27,33 +44,43 @@
      * @param args
      */
     public Program(String[] args) {
-        // rargs = GetOptParser.parse (args, this);
-        unprocessedArgs = args;
-        
-        try {
-            Parser.parse(this, unprocessedArgs);
-        } catch (Parser.ArgumentError e) {
-            System.err.println(e.getMessage());
-            System.exit(-1);
+        optParser = new Parser(this);
+        unprocessedArgs = optParser.parse(args);
+
+        cfg.loadDefaults();
+
+        if (cfgFileName != null) {
+            logger.debug("loading extra config file");
+            cfg.parse(cfgFileName);
         }
 
-        cfg.loadDefaults();
+        Resolver.getInstance().setConfiguration(cfg);
     }
+
+    protected String getHelpDescription() {
+        return "gnunet-java tool";
+    }
     
-    public Program() {
-        this(new String[]{});
+    protected String getVersionDescription() {
+        return "development version of gnunet-java";
     }
 
     /**
      * Start the Program as the initial Task of the Scheduler.
      */
     public final void start() {
-        Resolver.getInstance().connect(cfg);
-        Scheduler.run(new Scheduler.Task() {
-            public void run(Scheduler.Task.Context c) {
-                Program.this.run();
-            }
-        });
+        if (showVersion) {
+            System.out.println(getVersionDescription());
+        } else if (printHelp) {
+            System.out.println(getHelpDescription());
+            System.out.print(optParser.getHelp());
+        } else {
+            Scheduler.run(new Scheduler.Task() {
+                public void run(Scheduler.Task.Context c) {
+                    Program.this.run();
+                }
+            });
+        }
     }
 
     /**

Modified: gnunet-java/src/org/gnunet/util/RelativeTime.java
===================================================================
--- gnunet-java/src/org/gnunet/util/RelativeTime.java   2012-01-25 23:19:25 UTC 
(rev 19419)
+++ gnunet-java/src/org/gnunet/util/RelativeTime.java   2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -98,10 +98,10 @@
     /**
      * Return the maximum of two relative time values.
      * 
-     * @return max(this, other)
+     * @return max(t1, t2)
      */
-    public RelativeTime max(final RelativeTime other) {
-        return rel_value >= other.rel_value ? this : other;
+    public static RelativeTime max(RelativeTime t1, RelativeTime t2) {
+        return t1.rel_value >= t2.rel_value ? t1 : t2;
     }
 
     /**
@@ -109,8 +109,8 @@
      * 
      * @return min(this, other)
      */
-    public RelativeTime min(final RelativeTime other) {
-        return rel_value <= other.rel_value ? this : other;
+    public RelativeTime min(RelativeTime t1, RelativeTime t2) {
+        return t1.rel_value <= t2.rel_value ? t1 : t2;
     }
 
     /**

Copied: gnunet-java/src/org/gnunet/util/Resolver.java (from rev 19281, 
gnunet-java/src/org/gnunet/service/Resolver.java)
===================================================================
--- gnunet-java/src/org/gnunet/util/Resolver.java                               
(rev 0)
+++ gnunet-java/src/org/gnunet/util/Resolver.java       2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -0,0 +1,403 @@
+package org.gnunet.util;
+
+
+import org.gnunet.construct.*;
+import org.gnunet.exceptions.InterfaceViolationException;
+import org.gnunet.exceptions.MessageFormatException;
+import org.gnunet.util.getopt.Option;
+import org.gnunet.util.getopt.OptionAction;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+
+public class Resolver {
+    private static final Logger logger = LoggerFactory
+            .getLogger(Resolver.class);
+    private Configuration cfg;
+
+    @SuppressWarnings("InstanceVariableMayNotBeInitialized")
+    public static class GetMessage implements Message {
+        final static int MSG_ID = 4;
+
+        static final int DIRECTION_GET_IP = 0;
+        static final int DIRECTION_GET_NAME = 1;
+        static final int AF_UNSPEC = 0;
+        static final int AF_INET = 2;
+        static final int AF_INET6 = 10;
+
+        @Nested
+        public MessageHeader header;
+
+        @UInt32
+        public int direction;
+        @UInt32
+        public int domain;
+        @ByteFill
+        public byte[] addr;
+    }
+
+
+    @MessageId(ResolverResponse.MSG_ID)
+    public static class ResolverResponse implements Message {
+        final static int MSG_ID = 5;
+        @Nested
+        public MessageHeader header;
+        @Nested(optional = true)
+        public ResponseBody responseBody;
+    }
+
+
+    public static class ResponseBody implements Message {
+        @UInt8
+        public int domain;
+        public
+        @UInt8
+        byte pad1;
+        public
+        @UInt8
+        byte pad2;
+        public
+        @UInt8
+        byte pad3;
+        @ByteFill
+        public byte[] addr;
+
+        // @Nested(union_on="direction")
+        // AddressUnion address;
+    }
+
+    public interface AddressUnion extends MessageUnion {
+    }
+
+    @UnionCase(value = 3)
+    public static class AddressString implements AddressUnion {
+        @ZeroTerminatedString
+        public String addr;
+    }
+
+    @UnionCase(value = 45)
+    public static class AddressBinary implements AddressUnion {
+        @ByteFill
+        public byte[] addr;
+    }
+
+
+    /* @Nullable */
+    public InetAddress getInet4AddressFromString(String ip) {
+        String[] components = ip.split(".");
+        if (components.length != 4) {
+            return null;
+        }
+        byte[] addr = new byte[4];
+        for (int i = 0; i < 4; ++i) {
+            try {
+                addr[i] = Byte.parseByte(components[i]);
+            } catch (NumberFormatException e) {
+                return null;
+            }
+        }
+        try {
+            return Inet4Address.getByAddress(ip, addr);
+        } catch (UnknownHostException e) {
+            throw new AssertionError();
+        }
+    }
+
+    public InetAddress getInet6AddressFromString(String ip) {
+        String[] components = ip.split(":");
+        if (components.length > 8) {
+            return null;
+        }
+        byte[] addr = new byte[16];
+        boolean substituted = false;
+        for (int i = 0; i < 16; ++i) {
+            if (components[i].isEmpty()) {
+                if (substituted) {
+                    // only one substitution
+                    return null;
+                }
+                i = 16 - i - (components.length - 1);
+            } else {
+                try {
+                    addr[i] = Byte.parseByte(components[i], 16);
+                } catch (NumberFormatException e) {
+                    return null;
+                }
+            }
+        }
+        try {
+            return Inet6Address.getByAddress(ip, addr);
+        } catch (UnknownHostException e) {
+            return null;
+        }
+    }
+
+
+    /**
+     * Get address from numeric textual IP address. May be IPv4 or IPv6
+     *
+     * @return null if address is not numeric, the corresponding InetAddress 
object otherwise
+     */
+    /* @Nullable */
+    public InetAddress getInetAddressFromString(String ip) {
+        // check for IPv4-address:
+        InetAddress inAddr = getInet4AddressFromString(ip);
+        if (inAddr != null) {
+            return inAddr;
+        }
+        return getInet4AddressFromString(ip);
+    }
+
+
+    public interface HostnameCallback {
+        public void onHostname(String hostname);
+
+        public void onFinished();
+    }
+
+    public interface AddressCallback {
+        public void onAddress(InetAddress addr);
+
+        public void onFinished();
+    }
+
+
+    Client client = null;
+
+    private void connect(Configuration cfg) {
+        if (client != null) {
+            throw new InterfaceViolationException("connectStep called twice");
+        }
+
+    }
+
+    public InetAddress resolveHostnameLocal(String hostname) {
+        if (hostname.equals("localhost") || hostname.equals("ip6-localhost")) {
+            try {
+                return InetAddress.getByName(hostname);
+            } catch (UnknownHostException e) {
+                return null;
+            }
+        }
+        return getInetAddressFromString(hostname);
+    }
+
+
+    public void setConfiguration(Configuration cfg) {
+        this.cfg = cfg;
+    }
+
+    private void lazyConnect() {
+        if (client == null) {
+            if (cfg == null) {
+                throw new InterfaceViolationException("Resolver has no 
Configuration");
+            }
+            client = new Client("resolver", cfg);
+        }
+    }
+    
+    
+    public void resolveReverse(InetAddress inAddr, RelativeTime timeout, 
HostnameCallback cb) {
+
+        lazyConnect();
+
+        byte[] addr = inAddr.getAddress();
+        final GetMessage gmsg = new GetMessage();
+        gmsg.header = new MessageHeader();
+        gmsg.header.messageType = GetMessage.MSG_ID;
+        gmsg.direction = GetMessage.DIRECTION_GET_NAME;
+        if (addr.length == 4) {
+            gmsg.domain = GetMessage.AF_INET;
+        } else if (addr.length == 16) {
+            gmsg.domain = GetMessage.AF_INET6;
+        } else {
+            throw new RuntimeException("invalid InetAddress");
+        }
+
+        gmsg.addr = Arrays.copyOf(addr, 16);
+
+        gmsg.header.messageSize = Construct.getSize(gmsg);
+        
+        
+        
+        System.out.println("msgsize: " + gmsg.header.messageSize);
+        System.out.println("really: " + (Construct.toBinary(gmsg).length));
+
+
+
+        client.notifyTransmitReady(gmsg.header.messageSize, timeout, true, new 
MessageTransmitter() {
+            @Override
+            public void transmit(Client.MessageSink sink) {
+                sink.send(gmsg);
+                System.out.println("transmitting");
+
+                client.receive(new MessageReceiver() {
+                    @Override
+                    public void process(Message msg) {
+                        System.out.println("receiving");
+                        ResolverResponse resp = (ResolverResponse) msg;
+                        System.out.println(resp.responseBody.domain);
+                    }
+
+                    @Override
+                    public void handleTimeout() {
+                    }
+                }, RelativeTime.FOREVER);
+
+            }
+
+
+            @Override
+            public void handleTimeout() {
+            }
+        });
+
+    }
+    
+
+    public void resolveHostname(String hostname, RelativeTime timeout, final 
AddressCallback cb) {
+        // try if hostname is numeric IP or loopback
+        InetAddress inetAddr = resolveHostnameLocal(hostname);
+        if (inetAddr != null) {
+            cb.onAddress(inetAddr);
+            cb.onFinished();
+            return;
+        }
+
+        lazyConnect();
+
+        final GetMessage req = new GetMessage();
+        req.header = new MessageHeader();
+        req.header.messageType = GetMessage.MSG_ID;
+        req.direction = GetMessage.DIRECTION_GET_IP;
+        req.domain = GetMessage.AF_UNSPEC;
+        byte[] addr = hostname.getBytes();
+        // add 0-byte
+        req.addr = Arrays.copyOf(addr, addr.length + 1);
+
+        req.header.messageSize = Construct.getSize(req);
+
+        logger.debug("" + req.header.messageSize);
+
+
+        client.notifyTransmitReady(
+                Construct.getSize(req),
+                RelativeTime.FOREVER, true,
+                new MessageTransmitter() {
+                    @Override
+                    public void transmit(Client.MessageSink sink) {
+                        sink.send(req);
+
+                        client.receive(new MessageReceiver() {
+                            @Override
+                            public void process(Message msg) {
+                                ResolverResponse gmsg = (ResolverResponse) msg;
+                                if (gmsg.responseBody != null) {
+                                    try {
+                                        InetAddress in_addr;
+                                        if (gmsg.responseBody.domain == 
GetMessage.AF_INET) {
+                                            in_addr = InetAddress.getByAddress(
+                                                    
Arrays.copyOfRange(gmsg.responseBody.addr, 0, 4));
+
+                                        } else if (gmsg.responseBody.domain == 
GetMessage.AF_INET6) {
+                                            in_addr = 
Inet6Address.getByAddress(
+                                                    
Arrays.copyOfRange(gmsg.responseBody.addr, 0, 16));
+                                        } else {
+                                            throw new 
MessageFormatException("unknown AF_* domain");
+                                        }
+
+                                        cb.onAddress(in_addr);
+                                        client.receive(this, 
RelativeTime.FOREVER);
+                                    } catch (UnknownHostException e) {
+                                        throw new 
MessageFormatException("malformed address");
+                                    }
+                                } else {
+                                    cb.onFinished();
+                                }
+                            }
+
+                            @Override
+                            public void handleTimeout() {
+                                throw new RuntimeException("unreachable");
+                            }
+                        }, RelativeTime.FOREVER);
+
+                    }
+
+                    @Override
+                    public void handleTimeout() {
+                        throw new RuntimeException("unreachable");
+                    }
+                });
+
+    }
+
+    private static Resolver singletonInstance = null;
+
+    public static Resolver getInstance() {
+        if (singletonInstance == null) {
+            singletonInstance = new Resolver();
+        }
+        return singletonInstance;
+    }
+
+
+    public static void main(final String[] argv) {
+        new Program(argv) {
+            @Option(shortname = "r", longname = "reverse",
+                    description = "do reverse dns lookup",
+                    action = OptionAction.SET)
+            boolean isReverse;
+
+            @Override
+            public void run() {
+                if (isReverse) {
+                    try {
+                        
Resolver.getInstance().resolveReverse(Inet4Address.getByName("173.194.69.105"), 
RelativeTime.FOREVER,
+                                new HostnameCallback() {
+                                    @Override
+                                    public void onHostname(String hostname) {
+                                    }
+
+                                    @Override
+                                    public void onFinished() {
+                                    }
+                                });
+                    } catch (UnknownHostException e) {
+                        throw new RuntimeException("bla");
+                    }
+                } else {
+                    resolve();
+                }
+
+            }
+
+            public void resolve() {
+                for (String hostname : this.unprocessedArgs) {
+                    System.out.println("resolving hostname '" + hostname + 
"'");
+                    Resolver.getInstance().resolveHostname(hostname, 
RelativeTime.FOREVER, new AddressCallback() {
+                        @Override
+                        public void onAddress(InetAddress addr) {
+                            System.out.println(addr);
+                        }
+
+                        @Override
+                        public void onFinished() {
+                            System.out.println("done.");
+                        }
+                    });
+                }
+            }
+
+            @Override
+            protected String getHelpDescription() {
+                return "tool for forward and reverse DNS lookup";
+            }
+        }.start();
+    }
+}

Modified: gnunet-java/src/org/gnunet/util/Scheduler.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Scheduler.java      2012-01-25 23:19:25 UTC 
(rev 19419)
+++ gnunet-java/src/org/gnunet/util/Scheduler.java      2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -20,6 +20,7 @@
 
 package org.gnunet.util;
 
+import org.gnunet.exceptions.InterfaceViolationException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -124,8 +125,7 @@
 
         @Override
         public int compareTo(final TimeoutTask o) {
-            return new Long(this.timeout.getMilliseconds()).compareTo(o.timeout
-                    .getMilliseconds());
+            return this.timeout.compareTo(o.timeout);
         }
 
         public void registerSelect(SelectableChannel sc, int op) {
@@ -250,11 +250,8 @@
         queueReady(tid);
     }
 
-    public static TaskIdentifier addDelayed(final RelativeTime delay,
-                                            final Task task) {
-        return addSelect(Priority.KEEP, null, delay, null, null, task);
-    }
 
+
     /**
      * Schedule a new task to be run as soon as possible. The task will be run
      * with the priority of the calling task.
@@ -263,12 +260,18 @@
      * @return unique task identifier for the job only valid until "task" is
      *         started!
      */
-    public static TaskIdentifier addNow(final Task task) {
+    public static TaskIdentifier add(Task task) {
         return addSelect(Priority.KEEP, null, RelativeTime.ZERO, null, null,
                 task);
     }
 
 
+
+    public static TaskIdentifier add(Task task, RelativeTime delay) {
+        return addSelect(Priority.KEEP, null, delay, null, null, task);
+    }
+
+
     /**
      * Schedule a new task to be run with a specified delay or when any of
      * the specified file descriptor sets is ready.  The delay can be used
@@ -310,17 +313,19 @@
         timeoutTask.rs = rs == null ? 
Collections.<SelectableChannel>emptySet() : new HashSet<SelectableChannel>(rs);
         timeoutTask.ws = ws == null ? 
Collections.<SelectableChannel>emptySet() : new HashSet<SelectableChannel>(ws);
 
+        if (delay.isForever() && timeoutTask.ws.isEmpty() && 
timeoutTask.rs.isEmpty()) {
+            throw new InterfaceViolationException("unschedulable task 
created");
+        }
+
         timeoutTask.register();
 
-
-        if (delay.equals(RelativeTime.FOREVER) || (delay.getMilliseconds() == 
0)) {
+        if (delay.isForever()) {
             pending.add(timeoutTask);
         } else {
             pending_timeout.add(timeoutTask);
         }
 
         return timeoutTask;
-
     }
 
     public static TaskIdentifier addRead(RelativeTime timeout,
@@ -414,10 +419,11 @@
             // check if any timeouts occured
             while (true) {
                 TimeoutTask t = pending_timeout.peek();
-                // timeout tasks are stored in a heap, we just have to look at 
the first task
-                if (t == null || t.timeout.equals(AbsoluteTime.FOREVER) || 
t.timeout.compareTo(now) < 0) {
+                if (t == null || t.timeout.compareTo(now) > 0) {
+                    // timeout tasks are stored in a heap, we just have to 
look at the first task
                     break;
                 } else {
+                    // timeout occured
                     t.deregister();
                     t.ctx.reasons = EnumSet.of(Reason.TIMEOUT);
                     queueReady(t);
@@ -425,11 +431,14 @@
                 }
             }
 
+
+
             if (ready_count > 0) {
                 timeout = RelativeTime.ZERO;
             } else if (!pending_timeout.isEmpty()) {
+
                 timeout = pending_timeout.element().timeout.getDifference(now);
-                assert timeout.getMilliseconds() > 0;
+
             } else {
                 timeout = RelativeTime.FOREVER;
             }
@@ -439,9 +448,9 @@
                 if (timeout.getMilliseconds() == 0) {
                     selector.selectNow();
                 } else {
-                    logger.debug("starting to select with timeout");
+                    //logger.debug("starting to select with timeout");
                     selector.select(timeout.getMilliseconds());
-                    logger.debug("select with timeout ended");
+                    //logger.debug("select with timeout ended");
                 }
             } catch (IOException e) {
                 throw new IOError(e);

Deleted: gnunet-java/src/org/gnunet/util/getopt/Argument.java
===================================================================
--- gnunet-java/src/org/gnunet/util/getopt/Argument.java        2012-01-25 
23:19:25 UTC (rev 19419)
+++ gnunet-java/src/org/gnunet/util/getopt/Argument.java        2012-01-26 
07:36:44 UTC (rev 19420)
@@ -1,14 +0,0 @@
-package org.gnunet.util.getopt;
-
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
address@hidden(RetentionPolicy.RUNTIME)
address@hidden(ElementType.FIELD)
-public @interface Argument {
-    String name();
-
-}

Modified: gnunet-java/src/org/gnunet/util/getopt/Option.java
===================================================================
--- gnunet-java/src/org/gnunet/util/getopt/Option.java  2012-01-25 23:19:25 UTC 
(rev 19419)
+++ gnunet-java/src/org/gnunet/util/getopt/Option.java  2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -11,6 +11,14 @@
 public @interface Option {
     public String shortname();
     public String longname();
-    public String action();
+    /**
+     * Possible values: "store-string", "set", "reset", "count", "store-int"
+     */
+    public OptionAction action();
+    /*
+     * Name of the Option's argument(s), empty string of option takes no 
arguments
+     *
+     */
+    public String argumentName() default "";
     public String description();
 }

Added: gnunet-java/src/org/gnunet/util/getopt/OptionAction.java
===================================================================
--- gnunet-java/src/org/gnunet/util/getopt/OptionAction.java                    
        (rev 0)
+++ gnunet-java/src/org/gnunet/util/getopt/OptionAction.java    2012-01-26 
07:36:44 UTC (rev 19420)
@@ -0,0 +1,6 @@
+package org.gnunet.util.getopt;
+
+
+public enum OptionAction {
+    SET, RESET, STORE_STRING, STORE_INT, INCREMENT
+}

Modified: gnunet-java/src/org/gnunet/util/getopt/Parser.java
===================================================================
--- gnunet-java/src/org/gnunet/util/getopt/Parser.java  2012-01-25 23:19:25 UTC 
(rev 19419)
+++ gnunet-java/src/org/gnunet/util/getopt/Parser.java  2012-01-26 07:36:44 UTC 
(rev 19420)
@@ -1,21 +1,19 @@
 package org.gnunet.util.getopt;
 
+import org.gnunet.exceptions.InterfaceViolationException;
+
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 
 
 public class Parser {
-
     public static class ArgumentError extends RuntimeException {
         public ArgumentError(String s) {
             super(s);
         }
     }
 
-
     static class OptionField {
         Option opt;
         Field f;
@@ -26,18 +24,8 @@
         }
     }
 
-    static class ArgumentField {
-        Argument arg;
-        Field f;
-
-        public ArgumentField(Argument arg, Field f) {
-            this.arg = arg;
-            this.f = f;
-        }
-    }
-
     // todo: unify with Construct.getMessageFields
-    private static List<Field> getFields(Class c) {
+    private List<Field> getFields(Class c) {
         LinkedList<Field> fields = new 
LinkedList<Field>(Arrays.asList(c.getDeclaredFields()));
         while ((c = c.getSuperclass()) != null) {
             fields.addAll(0, Arrays.asList(c.getDeclaredFields()));
@@ -45,74 +33,172 @@
         return fields;
     }
 
-    public static void parse(Object o, String[] args) {
+    private Map<String, OptionField> longOpt = new HashMap<String, 
OptionField>();
+    private Map<String, OptionField> shortOpt = new HashMap<String, 
OptionField>();
 
-        LinkedList<ArgumentField> argFields = new LinkedList<ArgumentField>();
-        LinkedList<OptionField> optFields = new LinkedList<OptionField>();
+    private Collection<Option> options = new LinkedList<Option>();
 
-        for (Field f : getFields(o.getClass())) {
+    private Object targetObject;
+
+    public Parser(Object targetObject) {
+        this.targetObject = targetObject;
+        // gather option annotations
+        for (Field f : getFields(targetObject.getClass())) {
             if (f.isSynthetic() || Modifier.isStatic(f.getModifiers())) {
                 continue;
             }
-            Argument a = f.getAnnotation(Argument.class);
-            if (a != null) {
-                argFields.add(new ArgumentField(a, f));
-            }
             // todo: validity checking of annotations
             Option opt = f.getAnnotation(Option.class);
             if (opt != null) {
-                optFields.add(new OptionField(opt, f));
+                if (opt.shortname().length() != 1) {
+                    throw new InterfaceViolationException("short name must be 
of length 1");
+                }
+
+                f.setAccessible(true);
+
+                longOpt.put(opt.longname(), new OptionField(opt, f));
+                shortOpt.put(opt.shortname(), new OptionField(opt, f));
+                options.add(opt);
             }
         }
-        LinkedList<String> posArgs = new LinkedList();
+    }
 
-        int p = 0;
-
-        while (p < args.length) {
-            if (args[p].equals("--")) {
-                throw new UnsupportedOperationException();
+    public String getHelp() {
+        StringBuilder helpString = new StringBuilder();
+        for (Option opt : options) {
+            StringBuilder line = new StringBuilder();
+            line.append("  -");
+            line.append(opt.shortname());
+            line.append(" --");
+            line.append(opt.longname());
+            if (!opt.argumentName().isEmpty()) {
+                line.append("=");
+                line.append(opt.argumentName());
             }
-            if (args[p].startsWith("--")) {
-                throw new UnsupportedOperationException("long option");
+            while (line.length() < 30) {
+                line.append(" ");
             }
-            if (args[p].startsWith("-")) {
-                // option
-                throw new UnsupportedOperationException("short option");
-            }
+            helpString.append(line);
+            helpString.append(" ");
+            helpString.append(opt.description());
+            helpString.append("\n");
 
-            // [...]
+        }
+        return helpString.toString();
+    }
 
-            posArgs.add(args[p]);
+    /**
+     * Parses the given arguments, and sets the target object's fields
+     * according to its annotations.
+     *
+     * @param args array with the program arguments
+     * @return positional arguments
+     */
+    public String[] parse(String[] args) {
+        // unprocessed positional args
+        Deque<String> posArgs = new LinkedList<String>();
 
-            p++;
-        }
+        int p = 0;
 
-        for (Field f : getFields(o.getClass())) {
-            if (f.isSynthetic() || Modifier.isStatic(f.getModifiers())) {
-                continue;
+        while (p < args.length) {
+            // arguments after single "--" are all positional
+            if (args[p].equals("--")) {
+                posArgs.addAll(Arrays.asList(args).subList(p + 1, 
args.length));
+                break;
             }
-            Argument a = f.getAnnotation(Argument.class);
-            if (a != null) {
-                if (posArgs.isEmpty()) {
-                    throw new ArgumentError("argument " + a.name() + " 
missing");
+
+            if (args[p].startsWith("--")) {
+                String longOptionString = args[p].substring(2);
+                String[] components = longOptionString.split("=", 2);
+                OptionField of = longOpt.get(components[0]);
+                if (of == null) {
+                    throw new ArgumentError(String.format("unknown long 
option: %s", args[p]));
                 }
-                if (f.getType().equals(String.class)) {
+                try {
+                    switch (of.opt.action()) {
+                        case SET:
+                            if (!of.f.getType().equals(Boolean.TYPE)) {
+                                throw new InterfaceViolationException("action 
SET only valid on boolean member");
+                            }
+                            of.f.set(targetObject, true);
+                            break;
+                        case RESET:
+                            if (!of.f.getType().equals(Boolean.TYPE)) {
+                                throw new InterfaceViolationException("action 
RESET only valid on boolean member");
+                            }
+                            of.f.set(targetObject, true);
+                            break;
+                        case STORE_STRING:
+                            if (!of.f.getType().equals(String.class)) {
+                                throw new InterfaceViolationException("action 
STORE_STRING only valid on boolean member");
+                            }
+                            if (components.length == 1) {
+                                throw new ArgumentError("missing string 
argument to option " + of.opt.longname());
+                            }
+                            of.f.set(targetObject, components[1]);
+                            break;
+                        case STORE_INT:
+                            throw new UnsupportedOperationException("not yet 
implemented");
+                        case INCREMENT:
+                            throw new UnsupportedOperationException("not yet 
implemented");
+                    }
+                } catch (IllegalAccessException e) {
+                    throw new InterfaceViolationException(
+                            String.format("cannot acces member %s with @Option 
annotation", of.f.getName()));
+                }
+            } else if (args[p].length() > 1 && args[p].startsWith("-")) {
+                for (int i = 1; i < args[p].length(); ++i) {
+                    OptionField of = shortOpt.get(args[p].substring(i, i+1));
+                    if (of == null) {
+                        throw new ArgumentError(String.format("unknown short 
option: -%s", args[p].charAt(i)));
+                    }
                     try {
-                        f.setAccessible(true);
-                        f.set(o, posArgs.pollFirst());
+                        switch (of.opt.action()) {
+                            case SET:
+                                if (!of.f.getType().equals(Boolean.TYPE)) {
+                                    throw new 
InterfaceViolationException("action SET only valid on boolean member");
+                                }
+                                of.f.set(targetObject, true);
+                                break;
+                            case RESET:
+                                if (!of.f.getType().equals(Boolean.TYPE)) {
+                                    throw new 
InterfaceViolationException("action RESET only valid on boolean member");
+                                }
+                                of.f.set(targetObject, true);
+                                break;
+                            case STORE_STRING:
+                                if (!of.f.getType().equals(String.class)) {
+                                    throw new 
InterfaceViolationException("action STORE_STRING only valid on boolean member");
+                                }
+                                if (i != 1 || args[p].length() != 2) {
+                                    throw new ArgumentError("short options 
with argument may not be combined");
+                                }
+                                p++;
+                                if (args.length <= p) {
+                                    throw new ArgumentError("missing string 
argument to option -" + of.opt.shortname());
+                                }
+
+                                of.f.set(targetObject, p);
+                                break;
+                            case STORE_INT:
+                                throw new UnsupportedOperationException("not 
yet implemented");
+                            case INCREMENT:
+                                throw new UnsupportedOperationException("not 
yet implemented");
+                        }
                     } catch (IllegalAccessException e) {
-                        throw new RuntimeException(e);
+                        throw new ArgumentError(
+                                String.format("cannot acces member %s with 
@Option annotation", of.f.getName()));
                     }
-                } else {
-                    throw new RuntimeException("target type not yet 
supported");
                 }
+
+            } else {
+                posArgs.add(args[p]);
             }
-        }
 
-        if (!posArgs.isEmpty()) {
-            throw new ArgumentError("too many arguments");
+            p++;
         }
 
+        return posArgs.toArray(args);
     }
 
 }

Modified: gnunet-java/src/org/grothoff/Runabout.java
===================================================================
--- gnunet-java/src/org/grothoff/Runabout.java  2012-01-25 23:19:25 UTC (rev 
19419)
+++ gnunet-java/src/org/grothoff/Runabout.java  2012-01-26 07:36:44 UTC (rev 
19420)
@@ -237,8 +237,7 @@
                     Class viC = args[0];
                     if (result.get(viC) != null)
                         continue;
-                    Code co = null;
-                    co = makeCode(viC);
+                    Code co = makeCode(viC);
                     if (co == null)
                         throw new RunaboutException("Could not create/load 
dynamic code!");
                     result.put(viC, co);

Modified: gnunet-java/test/org/gnunet/construct/ByteFillMessage.java
===================================================================
--- gnunet-java/test/org/gnunet/construct/ByteFillMessage.java  2012-01-25 
23:19:25 UTC (rev 19419)
+++ gnunet-java/test/org/gnunet/construct/ByteFillMessage.java  2012-01-26 
07:36:44 UTC (rev 19420)
@@ -1,12 +1,6 @@
 package org.gnunet.construct;
 
-/**
- * Created by IntelliJ IDEA.
- * User: dold
- * Date: 1/17/12
- * Time: 10:20 PM
- * To change this template use File | Settings | File Templates.
- */
+
 public class ByteFillMessage implements Message {
     @Nested
     public MessageHeader header;

Added: gnunet-java/test/org/gnunet/construct/UnionTest.java
===================================================================
--- gnunet-java/test/org/gnunet/construct/UnionTest.java                        
        (rev 0)
+++ gnunet-java/test/org/gnunet/construct/UnionTest.java        2012-01-26 
07:36:44 UTC (rev 19420)
@@ -0,0 +1,44 @@
+package org.gnunet.construct;
+
+
+import org.junit.Test;
+
+public class UnionTest {
+    public static interface TestUnion extends MessageUnion {}
+    
+    @UnionCase(0)
+    public static class TestUnionCase0 implements TestUnion {
+        @Int8
+        public int val;
+    } 
+    
+    @UnionCase(1)
+    public static class TestUnionCase1 implements  TestUnion{
+        @ZeroTerminatedString
+        public String str;
+    }
+
+    public static class UnionTestMessage implements Message {
+        @Int16
+        public int tag;
+        @Union(tag = "tag")
+        public TestUnion instance;
+    }
+
+
+
+    @Test
+    public void test_Union() {
+        UnionTestMessage utm = new UnionTestMessage();
+        utm.tag = 0;
+        utm.instance = new TestUnionCase0();
+        ((TestUnionCase0)utm.instance).val = 20;
+
+        byte[] a = Construct.toBinary(utm);
+        
+        System.out.println(a.length);
+        
+        UnionTestMessage utm2 = Construct.parseAs(a, 0, 
UnionTestMessage.class);
+
+    }
+}

Modified: 
gnunet-java/test/org/gnunet/services/NetworkSizeEstimationServiceTest.java
===================================================================
--- gnunet-java/test/org/gnunet/services/NetworkSizeEstimationServiceTest.java  
2012-01-25 23:19:25 UTC (rev 19419)
+++ gnunet-java/test/org/gnunet/services/NetworkSizeEstimationServiceTest.java  
2012-01-26 07:36:44 UTC (rev 19420)
@@ -11,7 +11,7 @@
 import java.io.IOError;
 import java.io.IOException;
 
-public class NetworkSizeEstimationServiceTest{
+public class NetworkSizeEstimationServiceTest {
     class TestSubscriber implements NetworkSizeEstimation.NSE_Subscriber {
         public boolean success = false;
         NetworkSizeEstimation svc;




reply via email to

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