gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r20802 - in gnunet-java: . .idea doc src/org/gnunet src/org


From: gnunet
Subject: [GNUnet-SVN] r20802 - in gnunet-java: . .idea doc src/org/gnunet src/org/gnunet/construct src/org/gnunet/construct/parsers src/org/gnunet/core src/org/gnunet/dht src/org/gnunet/util src/org/gnunet/util/getopt test/org/gnunet test/org/gnunet/construct test/org/gnunet/util
Date: Wed, 28 Mar 2012 21:35:54 +0200

Author: dold
Date: 2012-03-28 21:35:54 +0200 (Wed, 28 Mar 2012)
New Revision: 20802

Added:
   gnunet-java/src/org/gnunet/construct/Constructable.java
   gnunet-java/src/org/gnunet/construct/FixedSizeByteArray.java
   gnunet-java/src/org/gnunet/construct/parsers/FixedSizeByteArrayParser.java
   gnunet-java/src/org/gnunet/core/
   gnunet-java/src/org/gnunet/core/Core.java
   gnunet-java/src/org/gnunet/util/HashCodeMessage.java
   gnunet-java/src/org/gnunet/util/IntEnum.java
   gnunet-java/src/org/gnunet/util/PeerIdentityMessage.java
   gnunet-java/test/org/gnunet/util/
   gnunet-java/test/org/gnunet/util/GetoptTest.java
Removed:
   gnunet-java/test/org/gnunet/construct/GetoptTest.java
Modified:
   gnunet-java/.idea/workspace.xml
   gnunet-java/ISSUES
   gnunet-java/doc/gnunet-exercise.tex
   gnunet-java/src/org/gnunet/construct/Construct.java
   gnunet-java/src/org/gnunet/construct/MsgMap.txt
   gnunet-java/src/org/gnunet/construct/ReflectUtil.java
   gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java
   gnunet-java/src/org/gnunet/construct/parsers/DoubleParser.java
   gnunet-java/src/org/gnunet/construct/parsers/FillParser.java
   gnunet-java/src/org/gnunet/construct/parsers/FixedSizeArrayParser.java
   gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java
   gnunet-java/src/org/gnunet/construct/parsers/NestedParser.java
   gnunet-java/src/org/gnunet/construct/parsers/Parser.java
   gnunet-java/src/org/gnunet/construct/parsers/SequenceParser.java
   gnunet-java/src/org/gnunet/construct/parsers/StringParser.java
   gnunet-java/src/org/gnunet/construct/parsers/UnionParser.java
   gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java
   gnunet-java/src/org/gnunet/dht/DistributedHashTable.java
   gnunet-java/src/org/gnunet/util/AbsoluteTime.java
   gnunet-java/src/org/gnunet/util/Client.java
   gnunet-java/src/org/gnunet/util/HashCode.java
   gnunet-java/src/org/gnunet/util/Scheduler.java
   gnunet-java/src/org/gnunet/util/getopt/OptionAction.java
   gnunet-java/src/org/gnunet/util/getopt/Parser.java
Log:
many bugfixes, dht api almost working

Modified: gnunet-java/.idea/workspace.xml
===================================================================
--- gnunet-java/.idea/workspace.xml     2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/.idea/workspace.xml     2012-03-28 19:35:54 UTC (rev 20802)
@@ -5,32 +5,40 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" readonly="true" 
id="92cdd5e3-f1ea-4d90-81fc-cf0bd20d2d2e" name="Default" comment="">
-      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/test/org/gnunet/construct/parsers" />
-      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/test/org/gnunet/construct/parsers/IntegerParserTest.java"
 />
-      <change type="DELETED" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/MessageId.java" afterPath="" 
/>
-      <change type="DELETED" beforePath="$PROJECT_DIR$/lib/commons-io-2.1.jar" 
afterPath="" />
-      <change type="MOVED" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/GnunetHash.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/HashCode.java" />
-      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" 
afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/core" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/test/org/gnunet/util" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/Constructable.java" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/FixedSizeByteArray.java" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/FixedSizeByteArrayParser.java"
 />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/core/Core.java" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/HashCodeMessage.java" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/IntEnum.java" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/PeerIdentityMessage.java" />
+      <change type="MOVED" 
beforePath="$PROJECT_DIR$/test/org/gnunet/construct/GetoptTest.java" 
afterPath="$PROJECT_DIR$/test/org/gnunet/util/GetoptTest.java" />
       <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$/doc/gnunet-exercise.tex" 
afterPath="$PROJECT_DIR$/doc/gnunet-exercise.tex" />
       <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/ReflectUtil.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/ReflectUtil.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/ByteFillParser.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/ByteFillParser.java" 
/>
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/DoubleParser.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/DoubleParser.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/FillParser.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/FillParser.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/FixedSizeArrayParser.java"
 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/FixedSizeArrayParser.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/construct/parsers/NestedParser.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/NestedParser.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/Parser.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/Parser.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/SequenceParser.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/SequenceParser.java" 
/>
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/StringParser.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/StringParser.java" />
       <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/UnionParser.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/UnionParser.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java"
 
afterPath="$PROJECT_DIR$/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java"
 />
       <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java" />
-      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/nse/NetworkSizeEstimation.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/nse/NetworkSizeEstimation.java" />
-      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/statistics/Statistics.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/statistics/Statistics.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/GnunetMessage.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/GnunetMessage.java" />
-      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/MessageReceiver.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/MessageReceiver.java" />
-      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/PeerIdentity.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/PeerIdentity.java" />
-      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/Resolver.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/Resolver.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/HashCode.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/HashCode.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$/test/org/gnunet/construct/QueryMessage.java" 
afterPath="$PROJECT_DIR$/test/org/gnunet/construct/QueryMessage.java" />
-      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/test/org/gnunet/construct/SimpleTestMessage.java" 
afterPath="$PROJECT_DIR$/test/org/gnunet/construct/SimpleTestMessage.java" />
-      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/test/org/gnunet/construct/UnionTest.java" 
afterPath="$PROJECT_DIR$/test/org/gnunet/construct/UnionTest.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/getopt/OptionAction.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/getopt/OptionAction.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/getopt/Parser.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/getopt/Parser.java" />
     </list>
     <ignored path="gnunet-java.iws" />
     <ignored path=".idea/workspace.xml" />
@@ -88,67 +96,73 @@
   </component>
   <component name="FileEditorManager">
     <leaf>
-      <file leaf-file-name="Client.java" pinned="false" current="true" 
current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Client.java">
+      <file leaf-file-name="DistributedHashTable.java" pinned="false" 
current="true" current-in-tab="true">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="585" column="0" selection-start="21568" 
selection-end="21568" vertical-scroll-proportion="0.85470086">
-              <folding />
+            <state line="347" column="38" selection-start="9881" 
selection-end="9881" vertical-scroll-proportion="8.403134">
+              <folding>
+                <element signature="imports" expanded="true" />
+                <element signature="e#7850#7862#0" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="MessageTransmitter.java" pinned="false" 
current="false" current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/MessageTransmitter.java">
+      <file leaf-file-name="Parser.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/Parser.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="9" column="16" selection-start="320" 
selection-end="320" vertical-scroll-proportion="0.0">
+            <state line="7" column="17" selection-start="124" 
selection-end="124" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Scheduler.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Scheduler.java">
+      <file leaf-file-name="PeerIdentityMessage.java" pinned="false" 
current="false" current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/PeerIdentityMessage.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="169" column="20" selection-start="5910" 
selection-end="5910" vertical-scroll-proportion="0.0">
-              <folding />
+            <state line="9" column="0" selection-start="229" 
selection-end="229" vertical-scroll-proportion="0.0">
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Nested.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/Nested.java">
+      <file leaf-file-name="HashCodeMessage.java" pinned="false" 
current="false" current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/HashCodeMessage.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="17" column="37" selection-start="438" 
selection-end="438" vertical-scroll-proportion="0.0">
-              <folding />
+            <state line="5" column="13" selection-start="125" 
selection-end="125" vertical-scroll-proportion="0.0">
+              <folding>
+                <element signature="imports" 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="HashCode.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/HashCode.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="11" column="22" selection-start="282" 
selection-end="282" vertical-scroll-proportion="0.0">
-              <folding />
+            <state line="8" column="13" selection-start="183" 
selection-end="183" vertical-scroll-proportion="0.0">
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <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="NetworkSizeEstimation.java" pinned="false" 
current="false" current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/nse/NetworkSizeEstimation.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="311" column="5" selection-start="10236" 
selection-end="10236" vertical-scroll-proportion="0.0">
-              <folding>
-                <element signature="imports" expanded="true" />
-                <element signature="e#3514#3552#0" expanded="true" />
-              </folding>
+            <state line="21" column="13" selection-start="468" 
selection-end="468" vertical-scroll-proportion="0.0">
+              <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Resolver.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Resolver.java">
+      <file leaf-file-name="VariableSizeArrayParser.java" pinned="false" 
current="false" current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="16" column="10" selection-start="495" 
selection-end="495" vertical-scroll-proportion="0.0">
+            <state line="9" column="13" selection-start="224" 
selection-end="224" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
@@ -157,25 +171,28 @@
       <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="69" column="27" selection-start="2291" 
selection-end="2291" vertical-scroll-proportion="0.0">
+            <state line="70" column="0" selection-start="2408" 
selection-end="2408" vertical-scroll-proportion="-18.04">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="SimpleTestMessage.java" pinned="false" 
current="false" current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/SimpleTestMessage.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="1" column="0" selection-start="30" selection-end="30" 
vertical-scroll-proportion="0.0">
-              <folding />
+            <state line="89" column="40" selection-start="2767" 
selection-end="2769" vertical-scroll-proportion="-15.12">
+              <folding>
+                <element signature="imports" expanded="true" />
+                <element signature="e#3682#3720#0" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="QueryMessage.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/QueryMessage.java">
+      <file leaf-file-name="ConstructTest.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/ConstructTest.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="1" column="0" selection-start="30" selection-end="30" 
vertical-scroll-proportion="0.0">
+            <state line="50" column="0" selection-start="1335" 
selection-end="1335" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
@@ -191,22 +208,22 @@
   <component name="IdeDocumentHistory">
     <option name="changedFiles">
       <list>
-        <option value="$PROJECT_DIR$/src/org/gnunet/util/PeerIdentity.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/util/AbsoluteTime.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/util/MessageReceiver.java" 
/>
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/nse/NetworkSizeEstimation.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/util/Configuration.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/statistics/Statistics.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/util/GnunetMessage.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/MessageLoader.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/MessageIdAnnotationProcessor.java"
 />
-        <option value="$PROJECT_DIR$/src/org/gnunet/util/Resolver.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/construct/Nested.java" />
-        <option 
value="$PROJECT_DIR$/test/org/gnunet/construct/SimpleTestMessage.java" />
-        <option 
value="$PROJECT_DIR$/test/org/gnunet/construct/QueryMessage.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/UnionParser.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/construct/Construct.java" 
/>
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/FixedSizeByteArray.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/FixedSizeByteArrayParser.java"
 />
+        <option value="$PROJECT_DIR$/src/org/gnunet/util/HashCodeMessage.java" 
/>
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/ReflectUtil.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/Parser.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/FixedSizeArrayParser.java"
 />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/NestedParser.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/SequenceParser.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/ByteFillParser.java" />
         <option value="$PROJECT_DIR$/src/org/gnunet/util/Client.java" />
+        <option value="$PROJECT_DIR$/ISSUES" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/util/HashCode.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/util/PeerIdentityMessage.java" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/construct/Construct.java" 
/>
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/UnionParser.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java" />
       </list>
     </option>
   </component>
@@ -272,24 +289,6 @@
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
             <PATH_ELEMENT>
-              <option name="myItemId" value="test" />
-              <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>
-          <PATH>
-            <PATH_ELEMENT>
-              <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>
@@ -308,136 +307,6 @@
               <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="util" />
-              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <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>
-          <PATH>
-            <PATH_ELEMENT>
-              <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="nse" />
-              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <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="construct" />
-              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <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="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>
-              <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="lib" />
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
@@ -462,24 +331,33 @@
   </component>
   <component name="PropertiesComponent">
     <property name="GoToFile.includeJavaFiles" value="false" />
-    <property name="GoToClass.toSaveIncludeLibraries" value="false" />
+    <property name="OverrideImplement.combined" value="true" />
     <property name="options.splitter.main.proportions" value="0.3" />
-    <property name="options.lastSelected" 
value="preferences.externalResources" />
-    <property name="MemberChooser.sorted" value="false" />
     <property name="recentsLimit" value="5" />
+    <property name="MemberChooser.sorted" value="false" />
+    <property name="options.lastSelected" value="preferences.sourceCode.Java" 
/>
+    <property name="MemberChooser.copyJavadoc" value="false" />
+    <property name="GoToClass.toSaveIncludeLibraries" value="false" />
     <property name="MemberChooser.showClasses" value="true" />
     <property name="GoToClass.includeLibraries" value="false" />
-    <property name="options.searchVisible" value="true" />
-    <property name="options.splitter.details.proportions" value="0.2" />
-    <property name="MemberChooser.copyJavadoc" value="false" />
     <property name="dynamic.classpath" value="false" />
+    <property name="options.splitter.details.proportions" value="0.2" />
+    <property name="options.searchVisible" value="true" />
   </component>
   <component name="RecentsManager">
     <key name="IntroduceConstantDialog.RECENTS_KEY">
       <recent name="org.gnunet.nse.NetworkSizeEstimation.StartMessage" />
     </key>
+    <key name="CreateClassDialog.RecentsKey">
+      <recent name="org.gnunet.construct.parsers" />
+      <recent name="org.gnunet.dht" />
+      <recent name="org.gnunet.util" />
+    </key>
+    <key name="MoveClassesOrPackagesDialog.RECENTS_KEY">
+      <recent name="org.gnunet.util" />
+    </key>
   </component>
-  <component name="RunManager" selected="JUnit.IntegerParserTest">
+  <component name="RunManager" selected="JUnit.ConstructTest">
     <configuration default="false" name="IntegerParserTest" type="JUnit" 
factoryName="JUnit" temporary="true">
       <module name="gnunet-java" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
@@ -502,6 +380,54 @@
       <ConfigurationWrapper RunnerId="Run" />
       <method />
     </configuration>
+    <configuration default="false" name="GetoptTest" 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.util" />
+      <option name="MAIN_CLASS_NAME" value="org.gnunet.util.GetoptTest" />
+      <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="false" name="ConstructTest" 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.ConstructTest" />
+      <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="Debug">
+        <option name="DEBUG_PORT" value="" />
+        <option name="TRANSPORT" value="0" />
+        <option name="LOCAL" value="true" />
+      </RunnerSettings>
+      <ConfigurationWrapper RunnerId="Debug" />
+      <method />
+    </configuration>
     <configuration default="true" type="Remote" factoryName="Remote">
       <option name="USE_SOCKET_TRANSPORT" value="true" />
       <option name="SERVER_MODE" value="false" />
@@ -568,8 +494,10 @@
         <option name="Make" enabled="true" />
       </method>
     </configuration>
-    <list size="1">
+    <list size="3">
       <item index="0" class="java.lang.String" 
itemvalue="JUnit.IntegerParserTest" />
+      <item index="1" class="java.lang.String" itemvalue="JUnit.GetoptTest" />
+      <item index="2" class="java.lang.String" itemvalue="JUnit.ConstructTest" 
/>
     </list>
     <configuration name="&lt;template&gt;" type="TestNG" default="true" 
selected="false">
       <option name="MAIN_CLASS_NAME" />
@@ -633,16 +561,16 @@
     <layout>
       <window_info id="Changes" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.33" 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="Find" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" 
sideWeight="0.5" 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.4" 
sideWeight="0.5" order="3" 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.63736266" 
sideWeight="0.5" 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.3282967" 
sideWeight="0.5" 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.32967034" sideWeight="0.5" 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="Favorites" active="false" anchor="left" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.24982257" sideWeight="0.6318681" order="2" side_tool="true" 
content_ui="tabs" />
       <window_info id="Version Control" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.33" sideWeight="0.5" 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.32967034" sideWeight="0.5" 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.33" 
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.25" sideWeight="0.5" order="1" side_tool="true" content_ui="tabs" />
       <window_info id="Project" active="false" anchor="left" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="true" weight="0.24982257" 
sideWeight="0.6703297" 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.3282967" 
sideWeight="0.5" order="2" 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.32692307" 
sideWeight="0.5" order="2" 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.3997253" sideWeight="0.5" order="5" side_tool="false" 
content_ui="tabs" />
       <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" />
@@ -685,7 +613,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" />
+    <option name="LAST_COMMIT_MESSAGE" value="changed GnunetMessage to use 
unions" />
     <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" />
@@ -698,125 +626,133 @@
     <option name="UPDATE_GROUP_BY_CHANGELIST" value="false" />
     <option name="SHOW_FILE_HISTORY_AS_TREE" value="false" />
     <option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6" />
+    <MESSAGE value="changed GnunetMessage to use unions" />
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager />
   </component>
   <component name="editorHistoryManager">
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/MessageIdAnnotationProcessor.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Client.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="105" column="7" selection-start="4597" 
selection-end="4597" vertical-scroll-proportion="-13.6">
-          <folding>
-            <element signature="e#900#930#0" expanded="true" />
-          </folding>
+        <state line="179" column="28" selection-start="6291" 
selection-end="6291" vertical-scroll-proportion="0.0">
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/MessageHeader.java">
+    <entry file="file://$PROJECT_DIR$/ISSUES">
       <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="320" column="87" selection-start="11358" 
selection-end="11358" vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/GnunetMessage.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Scheduler.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="13" column="20" selection-start="318" selection-end="318" 
vertical-scroll-proportion="0.0">
+        <state line="37" column="13" selection-start="1209" 
selection-end="1209" vertical-scroll-proportion="0.0">
           <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/UnionTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="9" column="13" selection-start="221" selection-end="221" 
vertical-scroll-proportion="0.0">
+        <state line="8" 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/parsers/NestedParser.java">
+    <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/StringMessage.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="11" column="13" selection-start="269" selection-end="269" 
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/Union.java">
+    <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/VarTestMessage.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="10" column="18" selection-start="275" selection-end="275" 
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/Nested.java">
+    <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/ConstructTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="17" column="37" selection-start="438" selection-end="438" 
vertical-scroll-proportion="0.0">
+        <state line="50" column="0" selection-start="1335" 
selection-end="1335" 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$/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="11" column="22" selection-start="282" selection-end="282" 
vertical-scroll-proportion="0.0">
+        <state line="9" column="13" selection-start="224" selection-end="224" 
vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/SimpleTestMessage.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/nse/NetworkSizeEstimation.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="1" column="0" selection-start="30" selection-end="30" 
vertical-scroll-proportion="0.0">
+        <state line="21" column="13" selection-start="468" selection-end="468" 
vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/test/org/gnunet/construct/QueryMessage.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/HashCode.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="1" column="0" selection-start="30" selection-end="30" 
vertical-scroll-proportion="0.0">
-          <folding />
+        <state line="8" column="13" selection-start="183" selection-end="183" 
vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/UnionParser.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/HashCodeMessage.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="69" column="27" selection-start="2291" 
selection-end="2291" vertical-scroll-proportion="0.0">
-          <folding />
+        <state line="5" column="13" selection-start="125" selection-end="125" 
vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/construct/Construct.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/PeerIdentityMessage.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="311" column="5" selection-start="10236" 
selection-end="10236" vertical-scroll-proportion="0.0">
+        <state line="9" column="0" selection-start="229" selection-end="229" 
vertical-scroll-proportion="0.0">
           <folding>
             <element signature="imports" expanded="true" />
-            <element signature="e#3514#3552#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Resolver.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/construct/Construct.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="16" column="10" selection-start="495" selection-end="495" 
vertical-scroll-proportion="0.0">
-          <folding />
+        <state line="89" column="40" selection-start="2767" 
selection-end="2769" vertical-scroll-proportion="-15.12">
+          <folding>
+            <element signature="imports" expanded="true" />
+            <element signature="e#3682#3720#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Scheduler.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/Parser.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="169" column="20" selection-start="5910" 
selection-end="5910" vertical-scroll-proportion="0.0">
+        <state line="7" column="17" selection-start="124" selection-end="124" 
vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/MessageTransmitter.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/UnionParser.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="9" column="16" selection-start="320" selection-end="320" 
vertical-scroll-proportion="0.0">
+        <state line="70" column="0" selection-start="2408" 
selection-end="2408" vertical-scroll-proportion="-18.04">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Client.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="585" column="0" selection-start="21568" 
selection-end="21568" vertical-scroll-proportion="0.85470086">
-          <folding />
+        <state line="347" column="38" selection-start="9881" 
selection-end="9881" vertical-scroll-proportion="8.403134">
+          <folding>
+            <element signature="imports" expanded="true" />
+            <element signature="e#7850#7862#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>

Modified: gnunet-java/ISSUES
===================================================================
--- gnunet-java/ISSUES  2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/ISSUES  2012-03-28 19:35:54 UTC (rev 20802)
@@ -310,4 +310,27 @@
 
 }
 
-public interface GnunetMessageBody extends MessageUnion { }
\ No newline at end of file
+public interface GnunetMessageBody extends MessageUnion { }
+
+
+
+
+------------------------------------------------------------------------
+
+* gnunet-service-dht -h produces segfault
+* block type "any" does not work on request (gnunet-dht-get always changes any 
to test)
+
+* SendMessage: comment on peer field ambiguous
+
+* should we support the TEST message, how should service_test be implemented?
+
+* DHT:
+ * why is there no ack from the dht that a put request has been received?
+ * how unique is the UID? globally? per connection?
+  * by looking at the sources: (client,uid) identifies a request unambiguously
+ * what is a "dealy do"? ;) (see dht.h)
+ * why does the ClientGetStopMessage include the Hash? Isn't the 64-bit UID 
sufficient?
+
+* advantages / disadvantages of queueing messages (in client and core)
+
+* should I check in stuff like the installer binary etc.?
\ No newline at end of file

Modified: gnunet-java/doc/gnunet-exercise.tex
===================================================================
--- gnunet-java/doc/gnunet-exercise.tex 2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/doc/gnunet-exercise.tex 2012-03-28 19:35:54 UTC (rev 20802)
@@ -23,8 +23,13 @@
 
 
 \section{Prerequisites}
-This tutorial assumes that you have gnunet$\geq$0.9.2 installed and running on 
your system.
+This tutorial assumes that you have gnunet$\geq$0.9.2 installed on your system.
 Instructions on how to do this can be found at 
\url{https://gnunet.org/installation}.
+Make sure that the default gnunet services are running by typing
+\begin{lstlisting}
+gnunet-arm -I
+\end{lstlisting}
+The running services should be at least core,... (TODO)
 
 \section{Installing gnunet-java}
 You can either check out the latest version of gnunet-java with
@@ -40,7 +45,7 @@
 on your command line.
 
 \section{First Steps}
-Programs to communicate with gnunet are located unter the tools/ directory. 
You can add this directory to your path,
+Programs to communicate with gnunet are located unter the bin/ directory. You 
can add this directory to your path,
 otherwise you have to prefix every command with this directory.
 
 To test if everything is working, try to run the program gnunet-nse. This 
should show you the estimated current size
@@ -48,6 +53,8 @@
 
 \subsection{Project Layout}
 
+\section{Creating an extension}
+
 \subsection{A simple gnunet-java program}
 
 \subsubsection{The skeleton for every program}

Modified: gnunet-java/src/org/gnunet/construct/Construct.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/Construct.java 2012-03-28 19:27:29 UTC 
(rev 20801)
+++ gnunet-java/src/org/gnunet/construct/Construct.java 2012-03-28 19:35:54 UTC 
(rev 20802)
@@ -3,6 +3,8 @@
 import org.gnunet.construct.parsers.*;
 import org.gnunet.exceptions.InterfaceViolationException;
 import org.grothoff.Runabout;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
@@ -14,6 +16,11 @@
  * @author Christian Grothoff
  */
 public class Construct {
+    private static final Logger logger = LoggerFactory
+            .getLogger(Construct.class);
+
+
+
     private static HashMap<Class<? extends Message>, Parser> parserCache = new 
HashMap<Class<? extends Message>, Parser>(100);
 
     /**
@@ -66,17 +73,19 @@
     }
 
     private static Parser getParser(Class<? extends Message> c,
-                                    ParserGenerator pg) {
+                                    final 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)) {
+            pg.c = c;
             Annotation[] as = f.getAnnotations();
             if (as.length == 0 || f.isSynthetic() || 
Modifier.isStatic(f.getModifiers())) {
                 continue;
@@ -265,6 +274,13 @@
             parser = new FixedSizeArrayParser(elemNumber, parser, f);
         }
 
+        public void visit(FixedSizeByteArray fsba) {
+            Field f = field;
+            int elemNumber = fsba.length();
+
+            parser = new FixedSizeByteArrayParser(elemNumber, f);
+        }
+
         public void visit(Double d) {
             if (!field.getType().equals(java.lang.Double.TYPE)) {
                 throw new InterfaceViolationException("@Double target must be 
a primitive 'double' field");
@@ -291,8 +307,8 @@
                                 vsa.lengthField()));
             } catch (NoSuchFieldException e) {
                 throw new InterfaceViolationException(String.format(
-                        "VariableSizeArray: length field '%s' does not exist",
-                        vsa.lengthField()));
+                        "VariableSizeArray: length field '%s' does not exist 
in class %s",
+                        vsa.lengthField(), old_c));
             }
         }
     }
@@ -334,7 +350,7 @@
 
     public static void patch(Message m) {
         Parser p = getParser(m.getClass());
-        p.patch(m, p.getSize(m));
+        p.patch(m, p.getSize(m), m);
     }
 
 }

Added: gnunet-java/src/org/gnunet/construct/Constructable.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/Constructable.java                     
        (rev 0)
+++ gnunet-java/src/org/gnunet/construct/Constructable.java     2012-03-28 
19:35:54 UTC (rev 20802)
@@ -0,0 +1,8 @@
+package org.gnunet.construct;
+
+/**
+ * Implemented by classes that know how to serialize/deserialize themselves.
+ */
+public interface Constructable {
+    // todo
+}

Added: gnunet-java/src/org/gnunet/construct/FixedSizeByteArray.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/FixedSizeByteArray.java                
                (rev 0)
+++ gnunet-java/src/org/gnunet/construct/FixedSizeByteArray.java        
2012-03-28 19:35:54 UTC (rev 20802)
@@ -0,0 +1,19 @@
+package org.gnunet.construct;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * An array of bytes with static size.
+ *
+ * @author Florian Dold
+ *
+ */
address@hidden(RetentionPolicy.RUNTIME)
address@hidden(ElementType.FIELD)
+public @interface FixedSizeByteArray {
+    int length();
+}
\ No newline at end of file

Modified: gnunet-java/src/org/gnunet/construct/MsgMap.txt
===================================================================
--- gnunet-java/src/org/gnunet/construct/MsgMap.txt     2012-03-28 19:27:29 UTC 
(rev 20801)
+++ gnunet-java/src/org/gnunet/construct/MsgMap.txt     2012-03-28 19:35:54 UTC 
(rev 20802)
@@ -9,5 +9,9 @@
 org.gnunet.util.GnunetMessage$Body|4=org.gnunet.util.Resolver$GetMessage
 
org.gnunet.util.GnunetMessage$Body|323=org.gnunet.nse.NetworkSizeEstimation$UpdateMessage
 org.gnunet.util.GnunetMessage$Body|5=org.gnunet.util.Resolver$ResolverResponse
+org.gnunet.util.GnunetMessage$Body|143=org.gnunet.dht.DistributedHashTable$DHTClientGetMessage
+org.gnunet.util.GnunetMessage$Body|142=org.gnunet.dht.DistributedHashTable$DHTClientPutMessage
 
org.gnunet.util.GnunetMessage$Body|321=org.gnunet.nse.NetworkSizeEstimation$StartMessage
-# generated 2012/03/26 19:15:26
+org.gnunet.util.GnunetMessage$Body|144=org.gnunet.dht.DistributedHashTable$DHTClientGetStopMessage
+org.gnunet.util.GnunetMessage$Body|145=org.gnunet.dht.DistributedHashTable$DHTClientResultMessage
+# generated 2012/03/28 21:13:11

Modified: gnunet-java/src/org/gnunet/construct/ReflectUtil.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/ReflectUtil.java       2012-03-28 
19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/ReflectUtil.java       2012-03-28 
19:35:54 UTC (rev 20802)
@@ -34,7 +34,6 @@
         BIGNUM, BYTE_PRIM, SHORT_PRIM, INT_PRIM, LONG_PRIM, CHAR_PRIM
     }
 
-
     /**
      * Convenience wrapper for a field that stores a numeric value.
      */
@@ -147,9 +146,10 @@
             try {
                 obj = fl.get(i).get(obj);
             } catch (IllegalArgumentException e) {
-                throw new RuntimeException();
+                throw new RuntimeException(e);
             } catch (IllegalAccessException e) {
-                throw new RuntimeException();
+                throw new InterfaceViolationException("cannot access field " + 
fl.get(i)
+                        + " of " + obj.getClass());
             }
         }
         return obj;

Modified: gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java    
2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/parsers/ByteFillParser.java    
2012-03-28 19:35:54 UTC (rev 20802)
@@ -77,7 +77,8 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize) {
-        totalSizeField.set(ReflectUtil.followFieldPathToParent(totalSizePath, 
m), frameSize);
+    public void patch(Message message, int frameSize, Message frameObject) {
+        // the size field is contained in the frameObject
+        totalSizeField.set(ReflectUtil.followFieldPathToParent(totalSizePath, 
frameObject), frameSize);
     }
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/DoubleParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/DoubleParser.java      
2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/parsers/DoubleParser.java      
2012-03-28 19:35:54 UTC (rev 20802)
@@ -44,7 +44,7 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize) {
+    public void patch(Message m, int frameSize, Message frameObj) {
         // nothing to do here
     }
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/FillParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/FillParser.java        
2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/parsers/FillParser.java        
2012-03-28 19:35:54 UTC (rev 20802)
@@ -82,7 +82,7 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize) {
+    public void patch(Message m, int frameSize, Message frameObj) {
         totalSizeField.set(ReflectUtil.followFieldPathToParent(totalSizePath, 
m), frameSize);
     }
 

Modified: gnunet-java/src/org/gnunet/construct/parsers/FixedSizeArrayParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/FixedSizeArrayParser.java      
2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/parsers/FixedSizeArrayParser.java      
2012-03-28 19:35:54 UTC (rev 20802)
@@ -67,10 +67,10 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize) {
+    public void patch(Message m, int frameSize, Message frameObj) {
         final Object arr = ReflectUtil.justGet(m, targetField);
         for (int i = 0; i < Array.getLength(arr); ++i) {
-            elemParser.patch((Message) Array.get(arr, i), frameSize);
+            elemParser.patch((Message) Array.get(arr, i), frameSize, frameObj);
         }
     }
 }

Added: 
gnunet-java/src/org/gnunet/construct/parsers/FixedSizeByteArrayParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/FixedSizeByteArrayParser.java  
                        (rev 0)
+++ gnunet-java/src/org/gnunet/construct/parsers/FixedSizeByteArrayParser.java  
2012-03-28 19:35:54 UTC (rev 20802)
@@ -0,0 +1,46 @@
+package org.gnunet.construct.parsers;
+
+import org.gnunet.construct.Message;
+import org.gnunet.construct.ReflectUtil;
+import org.gnunet.exceptions.InterfaceViolationException;
+
+import java.lang.reflect.Field;
+import java.nio.ByteBuffer;
+
+public class FixedSizeByteArrayParser implements Parser {
+    private final int elemNumber;
+    private final Field targetField;
+
+    public FixedSizeByteArrayParser(int elemNumber, Field f) {
+        this.elemNumber = elemNumber;
+        this.targetField = f;
+    }
+
+    @Override
+    public int getSize(Message srcObj) {
+        return elemNumber;
+    }
+
+    @Override
+    public int parse(ByteBuffer srcBuf, int frameStart, Message frameObj, 
Message dstObj) {
+        byte[] data = new byte[elemNumber];
+        srcBuf.get(data);
+        ReflectUtil.justSet(dstObj, targetField, data);
+        return elemNumber;
+    }
+
+    @Override
+    public int write(ByteBuffer dstBuf, Message srcObj) {
+        byte[] data = (byte[]) ReflectUtil.justGet(srcObj, targetField);
+        if (data.length != elemNumber) {
+            throw new InterfaceViolationException("fixed size array has wrong 
size");
+        }
+        dstBuf.put(data);
+        return elemNumber;
+    }
+
+    @Override
+    public void patch(Message m, int frameSize, Message frameObj) {
+        // nothing to do
+    }
+}

Modified: gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java     
2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/parsers/IntegerParser.java     
2012-03-28 19:35:54 UTC (rev 20802)
@@ -56,7 +56,7 @@
 
 
     @Override
-    public void patch(Message m, int frameSize) {
+    public void patch(Message m, int frameSize, Message frameObj) {
         // nothing to do
     }
 

Modified: gnunet-java/src/org/gnunet/construct/parsers/NestedParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/NestedParser.java      
2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/parsers/NestedParser.java      
2012-03-28 19:35:54 UTC (rev 20802)
@@ -65,9 +65,9 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize) {
+    public void patch(Message m, int frameSize, Message frameObj) {
         // todo: nested/opaque frames
-        nestedParser.patch(m, frameSize);
+        nestedParser.patch(m, frameSize, frameObj);
 
     }
 

Modified: gnunet-java/src/org/gnunet/construct/parsers/Parser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/Parser.java    2012-03-28 
19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/parsers/Parser.java    2012-03-28 
19:35:54 UTC (rev 20802)
@@ -38,10 +38,11 @@
      * Parser-dependent method; sets members of the Message m (or Messages 
nested in m) which are
      * values inferable by the parser.
      * Examples: Union tags, size fields.
-     * 
+     *
      * @param m the message object to patch
      * @param frameSize the size of the containing message
+     * @param frameObj the object containing the message (and possibly size 
fields)
      */
-    public void patch(Message m, int frameSize);
+    public void patch(Message m, int frameSize, Message frameObj);
 
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/SequenceParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/SequenceParser.java    
2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/parsers/SequenceParser.java    
2012-03-28 19:35:54 UTC (rev 20802)
@@ -51,9 +51,9 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize) {
+    public void patch(Message m, int frameSize, Message frameObj) {
         for (final Parser p : childParsers) {
-            p.patch(m, frameSize);
+            p.patch(m, frameSize, frameObj);
         }  
     }
 }

Modified: gnunet-java/src/org/gnunet/construct/parsers/StringParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/StringParser.java      
2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/parsers/StringParser.java      
2012-03-28 19:35:54 UTC (rev 20802)
@@ -103,7 +103,7 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize) {
+    public void patch(Message m, int frameSize, Message frameObj) {
         // nothing to patch
     }
 

Modified: gnunet-java/src/org/gnunet/construct/parsers/UnionParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/UnionParser.java       
2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/parsers/UnionParser.java       
2012-03-28 19:35:54 UTC (rev 20802)
@@ -34,7 +34,11 @@
 
     @Override
     public int getSize(final Message src) {
-        return Construct.getSize((Message) ReflectUtil.justGet(src, 
targetField));
+        Class cls = ReflectUtil.justGet(src, targetField).getClass();
+
+        Parser parser = Construct.getParser(cls, frameSizePath, pathFromRoot);
+
+        return parser.getSize((Message)ReflectUtil.justGet(src, targetField));
     }
 
     private int getSizeFieldValue(Message m) {
@@ -44,8 +48,6 @@
 
     @Override
     public int parse(final ByteBuffer srcBuf, int frameOffset, Message 
frameObj, final Message dstObj) {
-
-
         if (optional) {
             int remaining = frameOffset + getSizeFieldValue(frameObj) - 
srcBuf.position();
             if (remaining <= 0) {
@@ -75,7 +77,7 @@
     @Override
     public int write(final ByteBuffer dstBuf, final Message src) {
         final Class currentUnionClass = ReflectUtil.justGet(src, 
targetField).getClass();
-        final Parser p = Construct.getParser(currentUnionClass);
+        final Parser p = Construct.getParser(currentUnionClass, frameSizePath, 
pathFromRoot);
 
         return p.write(dstBuf, (Message) ReflectUtil.justGet(src, 
targetField));
     }
@@ -85,12 +87,11 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize) {
-        // todo: nested/opaque frames
+    public void patch(Message m, int frameSize, Message frameObj) {
         final Class currentUnionClass = ReflectUtil.justGet(m, 
targetField).getClass();
-        final Parser p = Construct.getParser(currentUnionClass);
+        final Parser p = Construct.getParser(currentUnionClass, frameSizePath, 
pathFromRoot);
 
-        p.patch((Message) ReflectUtil.justGet(m, targetField), frameSize);
+        p.patch((Message) ReflectUtil.justGet(m, targetField), frameSize, 
frameObj);
         
         unionTagField.set(ReflectUtil.followFieldPathToParent(unionTagPath, m),
                getTag(m));

Modified: 
gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java   
2012-03-28 19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/construct/parsers/VariableSizeArrayParser.java   
2012-03-28 19:35:54 UTC (rev 20802)
@@ -69,7 +69,7 @@
     }
 
     @Override
-    public void patch(Message m, int frameSize) {
+    public void patch(Message m, int frameSize, Message frameObj) {
         int size = Array.getLength(ReflectUtil.justGet(m, targetField));
         sizeField.set(m, size);
     }

Added: gnunet-java/src/org/gnunet/core/Core.java
===================================================================
--- gnunet-java/src/org/gnunet/core/Core.java                           (rev 0)
+++ gnunet-java/src/org/gnunet/core/Core.java   2012-03-28 19:35:54 UTC (rev 
20802)
@@ -0,0 +1,20 @@
+package org.gnunet.core;
+
+import org.gnunet.util.Cancelable;
+import org.gnunet.util.Configuration;
+
+public class Core {
+
+    public interface CoreCallback {
+
+    }
+
+    public Core(Configuration cfg, int queueSize, boolean inboundHeaderOnly, 
boolean outboundHeaderOnly,
+                CoreCallback cb) {
+
+    }
+
+    public Cancelable notifyTransmitReady() {
+        return null;
+    }
+}

Modified: gnunet-java/src/org/gnunet/dht/DistributedHashTable.java
===================================================================
--- gnunet-java/src/org/gnunet/dht/DistributedHashTable.java    2012-03-28 
19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/dht/DistributedHashTable.java    2012-03-28 
19:35:54 UTC (rev 20802)
@@ -1,17 +1,20 @@
 package org.gnunet.dht;
 
-import org.gnunet.construct.Message;
-import org.gnunet.construct.MessageHeader;
-import org.gnunet.construct.Nested;
-import org.gnunet.construct.UInt32;
+import org.gnunet.construct.*;
+import org.gnunet.exceptions.InterfaceViolationException;
 import org.gnunet.util.*;
 import org.gnunet.util.getopt.Option;
 import org.gnunet.util.getopt.OptionAction;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
 
 public class DistributedHashTable {
+    private static final Logger logger = LoggerFactory
+            .getLogger(DistributedHashTable.class);
 
     enum BlockType {
         /**
@@ -63,90 +66,307 @@
          */
         NAMERECORD(11);
 
-        private final int val;
-        BlockType(int i) {
-            val = i;
+        private int val;
+
+        BlockType(int val) {
+            this.val = val;
         }
     }
 
+
     enum RouteOption {
         /**
          * Default.  Do nothing special.
          */
         NONE(0),
-
         /**
          * Each peer along the way should look at 'enc' (otherwise
          * only the k-peers closest to the key should look at it).
          */
         DEMULTIPLEX_EVERYWHERE(1),
-
         /**
          * We should keep track of the route that the message
          * took in the P2P network.
          */
         RECORD_ROUTE(2),
-
         /**
          * This is a 'FIND-PEER' request, so approximate results are fine.
          */
         FIND_PEER(4),
-
         /**
          * Possible message option for query key randomization.
          */
-        RO_BART(8);
+        BART(8);
 
-        private final int val;
-        RouteOption(int i) {
-            val = i;
+        private int val;
+
+        RouteOption(int val) {
+            this.val = val;
         }
     }
 
-
-    public static class DHTClientGetMessage implements Message {
+    @UnionCase(143)
+    public static class DHTClientGetMessage implements GnunetMessage.Body {
+        /**
+         * Combination of RouteOption.*
+         */
+        @UInt32
+        public int options;
+        @UInt32
+        public int desiredReplicationLevel;
+        @UInt32
+        public int type;
         @Nested
-        public MessageHeader header;
+        public HashCodeMessage key;
+        @UInt64
+        public long uniqueId;
+        @ByteFill
+        public byte[] xquery;
+    }
 
+    @UnionCase(142)
+    public static class DHTClientPutMessage implements GnunetMessage.Body {
+        /**
+         * Type of data to insert, one of BlockType.*
+         */
         @UInt32
+        public int type;
+        /**
+         * Combination of RouteOption.*
+         */
+        @UInt32
         public int options;
+        @UInt32
+        public int desiredReplicationLevel;
+        @Nested
+        public AbsoluteTimeMessage expiration;
+        @Nested
+        public HashCodeMessage hash;
+        @ByteFill
+        public byte[] data;
+    }
 
+    @UnionCase(144)
+    public static class DHTClientGetStopMessage implements GnunetMessage.Body {
+        @UInt32
+        public int reserved = 0;
+        @UInt64
+        long unique_id;
+        @Nested
+        public HashCodeMessage key;
     }
 
+    @UnionCase(145)
+    public static class DHTClientResultMessage implements GnunetMessage.Body {
+        @UInt32
+        public int type;
+        @UInt32
+        public int putPathLength;
+        @UInt32
+        public int getPathLength;
+        @UInt64
+        public long uid;
+        @Nested
+        public AbsoluteTimeMessage expiration;
+        @Nested
+        public HashCodeMessage key;
+        @VariableSizeArray(lengthField = "putPathLength")
+        public PeerIdentityMessage[] putPath;
+        @VariableSizeArray(lengthField = "getPathLength")
+        public PeerIdentityMessage[] getPath;
+        @ByteFill
+        public byte[] data;
+    }
 
+
+    public interface ResultCallback {
+        public void handleResult(AbsoluteTime expiration, HashCode key,
+                                 List<PeerIdentity> getPath, 
List<PeerIdentity> putPath,
+                                 BlockType type, byte[] data);
+    }
+
+    enum PutResult {
+        OK, TIMEOUT
+    }
+
+    public interface Continuation {
+        public void call(PutResult r);
+    }
+
+
     private Client client;
-    
+    private long uid = 1;
+
+    /**
+     * Create a connection with the DHT service.
+     *
+     * @param cfg the configuration to use
+     */
     public DistributedHashTable(Configuration cfg) {
         client = new Client("dht", cfg);
     }
 
-    public interface Continuation {
-        public void done();
+
+    /**
+     * @param key              key
+     * @param data             data
+     * @param replicationLevel
+     * @param routeOptions
+     * @param type
+     * @param expiration
+     * @param timeout
+     * @param cont
+     */
+    public void put(HashCode key, byte[] data, int replicationLevel, 
EnumSet<RouteOption> routeOptions,
+                    BlockType type, AbsoluteTime expiration,
+                    RelativeTime timeout, final Continuation cont) {
+        final DHTClientPutMessage cpm = new DHTClientPutMessage();
+        cpm.data = data;
+        cpm.hash = key.asMessage();
+        cpm.desiredReplicationLevel = replicationLevel;
+        cpm.expiration = expiration.asMessage();
+        cpm.type = type.val;
+
+        client.notifyTransmitReady(timeout, true,
+                new MessageTransmitter() {
+                    @Override
+                    public void transmit(Client.MessageSink sink) {
+                        sink.send(cpm);
+                        // is there no way to get an ack from the dht service?
+                        cont.call(PutResult.OK);
+                    }
+
+                    @Override
+                    public void handleError(Client.TransmitError error) {
+                        cont.call(PutResult.TIMEOUT);
+                    }
+                });
     }
 
-    public interface ResultCallback {
-        public void handleResult(AbsoluteTime expiration, HashCode key,
-                            List<PeerIdentity> getPath, List<PeerIdentity> 
putPath,
-                            BlockType type, byte[] data);
+
+    private class GetRequest implements Cancelable {
+        public long uid;
+        public HashCode key;
+        public ResultCallback cb;
+        public AbsoluteTime deadline;
+
+        public GetRequest() {
+            uid = DistributedHashTable.this.uid++;
+        }
+
+        public void cancel() {
+            if (!activeRequests.contains(this)) {
+                throw new InterfaceViolationException("cancel called on 
invalid request");
+            }
+
+            activeRequests.remove(this);
+
+            if (activeRequests.isEmpty()) {
+                receiveHandle.cancel();
+            }
+
+            client.notifyTransmitReady(RelativeTime.FOREVER, false, new 
MessageTransmitter() {
+                @Override
+                public void transmit(Client.MessageSink sink) {
+                    final DHTClientGetStopMessage sm = new 
DHTClientGetStopMessage();
+                    sm.key = key.asMessage();
+                    sm.unique_id = uid;
+                    sink.send(sm);
+                }
+
+                @Override
+                public void handleError(Client.TransmitError error) {
+                }
+            });
+        }
     }
 
+    List<GetRequest> activeRequests = new ArrayList<GetRequest>(5);
 
+    Client.ReceiveHandle receiveHandle = null;
 
 
-    public void put(HashCode key, int replicationLevel, EnumSet<RouteOption> 
routeOptions,
-                    BlockType type, byte[] data, AbsoluteTime expiration,
-                    RelativeTime timeout, Continuation cont) {
+    public class ResponseDispatcher implements MessageReceiver {
+        @Override
+        public void process(GnunetMessage.Body msg) {
+            receiveHandle = null;
 
+            DHTClientResultMessage rm = (DHTClientResultMessage) msg;
+            GetRequest request = null;
+
+            for (GetRequest r : activeRequests) {
+                if (r.uid == rm.uid) {
+                    request = r;
+                    break;
+                }
+            }
+            if (request == null) {
+                logger.warn("received response on invalid UID");
+            } else {
+                
request.cb.handleResult(AbsoluteTime.fromNetwork(rm.expiration),
+                        HashCode.fromMessage(rm.key), null, null, 
BlockType.TEST, rm.data);
+
+                if (request.deadline.isDue()) {
+                    request.cancel();
+                }
+            }
+
+            if (!activeRequests.isEmpty()) {
+                receiveHandle = client.receive(RelativeTime.FOREVER, rh);
+            }
+        }
+
+        @Override
+        public void handleError(Client.ReceiveError e) {
+        }
     }
 
+
+    private AbsoluteTime earliestDeadline;
+
+    private Scheduler.Task deadlineTask;
+
+
+    private final ResponseDispatcher rh = new ResponseDispatcher();
+
+
     public Cancelable startGet(RelativeTime timeout, BlockType type, HashCode 
key,
-                               int replicatoin, EnumSet<RouteOption> 
routeOptions,
+                               int replication, int routeOptions,
                                byte[] xquery, ResultCallback cb) {
-        return null;
+
+        GetRequest request = new GetRequest();
+        request.key = key;
+        request.cb = cb;
+        request.deadline = timeout.toAbsolute();
+
+        final DHTClientGetMessage getMessage = new DHTClientGetMessage();
+        getMessage.desiredReplicationLevel = replication;
+        getMessage.key = key.asMessage();
+        getMessage.options = routeOptions;
+        getMessage.xquery = xquery;
+        getMessage.type = type.val;
+        getMessage.uniqueId = request.uid;
+
+        activeRequests.add(request);
+
+        if (receiveHandle == null) {
+            receiveHandle = client.receive(RelativeTime.FOREVER, rh);
+        }
+        client.notifyTransmitReady(timeout, false, new MessageTransmitter() {
+            @Override
+            public void transmit(Client.MessageSink sink) {
+                sink.send(getMessage);
+            }
+
+            @Override
+            public void handleError(Client.TransmitError error) {
+            }
+        });
+
+        return request;
     }
 
 
-
     public static void main(String[] args) {
         new Program(args) {
             @Option(action = OptionAction.SET,
@@ -159,37 +379,67 @@
                     shortname = "d",
                     longname = "data",
                     description = "data (only used with --put)")
-            String data=null;
+            String data = null;
 
             @Option(action = OptionAction.STORE_STRING,
                     shortname = "k",
                     longname = "key",
                     description = "key used for the operation")
-            String key=null;
+            String key = null;
 
             @Option(action = OptionAction.STORE_STRING,
                     shortname = "t",
                     longname = "type",
                     description = "type of data used in this operation")
-            String type=null;
+            String type = null;
 
             @Option(action = OptionAction.STORE_STRING,
                     shortname = "e",
                     longname = "expire",
-                    description = "expiration")
-            String expiration=null;
+                    description = "expiration (ony use with --put)")
+            String expiration = null;
 
 
-            @Option(action = OptionAction.STORE_STRING,
+            @Option(action = OptionAction.STORE_NUMBER,
                     shortname = "r",
                     longname = "replication",
                     description = "desired replication (only used with --put)")
-            String replication=null;
+            int replication = 5;
 
 
-
             public void run() {
+                if (key == null) {
+                    System.out.println("key required");
+                    return;
+                }
 
+                DistributedHashTable dht = new DistributedHashTable(cfg);
+
+                if (modePut) {
+                    if (data == null) {
+                        System.out.println("data required on put");
+                        return;
+                    }
+
+                    dht.put(new HashCode(key), data.getBytes(), replication, 
EnumSet.of(RouteOption.NONE),
+                            BlockType.TEST, 
AbsoluteTime.now().add(RelativeTime.HOUR),
+                            RelativeTime.FOREVER, new Continuation() {
+                        @Override
+                        public void call(PutResult r) {
+                            System.out.println("put request sent");
+                        }
+                    });
+                } else {
+                    dht.startGet(RelativeTime.SECOND, BlockType.TEST, new 
HashCode(key), replication, 0,
+                            new byte[0], new ResultCallback() {
+                        @Override
+                        public void handleResult(AbsoluteTime expiration, 
HashCode key, List<PeerIdentity>
+                                getPath, List<PeerIdentity> putPath, BlockType 
type, byte[] data) {
+                            System.out.println("got result:");
+                            System.out.println(new String(data));
+                        }
+                    });
+                }
             }
         }.start();
     }

Modified: gnunet-java/src/org/gnunet/util/AbsoluteTime.java
===================================================================
--- gnunet-java/src/org/gnunet/util/AbsoluteTime.java   2012-03-28 19:27:29 UTC 
(rev 20801)
+++ gnunet-java/src/org/gnunet/util/AbsoluteTime.java   2012-03-28 19:35:54 UTC 
(rev 20802)
@@ -217,7 +217,7 @@
         return new AbsoluteTime(abs_value - duration.getMilliseconds());
     }
 
-    public AbsoluteTimeMessage toNetwork() {
+    public AbsoluteTimeMessage asMessage() {
         return new AbsoluteTimeMessage(this);
     }
 

Modified: gnunet-java/src/org/gnunet/util/Client.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Client.java 2012-03-28 19:27:29 UTC (rev 
20801)
+++ gnunet-java/src/org/gnunet/util/Client.java 2012-03-28 19:35:54 UTC (rev 
20802)
@@ -336,7 +336,6 @@
             gm.body = m;
             Construct.patch(gm);
             gm.header.messageSize = Construct.getSize(gm);
-            System.out.println("size: " + Construct.getSize(gm));
             byte[] b = Construct.toBinary(gm);
             if (b.length != gm.header.messageSize) {
                 throw new InternalLogicError(
@@ -403,7 +402,7 @@
         }
     }
 
-    public void initiateResolve() {
+    private void initiateResolve() {
         if (resolveHandle != null) {
             return;
         }
@@ -463,7 +462,6 @@
                             currentTransmitHelper.start();
                         }
                         if (currentReceiveHelper != null && 
!currentReceiveHelper.working) {
-                            System.out.println("starting receive");
                             currentReceiveHelper.schedule();
                         }
                     }
@@ -499,6 +497,9 @@
         connectNextAddress();
     }
 
+    /**
+     * Cancel all pending receive requests. Reconnect to the service if not 
already connected.
+     */
     public void reconnect() {
         if (currentReceiveHelper != null) {
             currentReceiveHelper.cancel();
@@ -536,7 +537,6 @@
             currentReceiveHelper.schedule();
         }
 
-
         return new ReceiveHandle() {
             @Override
             public void cancel() {
@@ -604,12 +604,19 @@
 
     /**
      * Disconnect from the service. Cancel all pending recveive/transmit 
requests.
-     * todo: introduce finishPendingWrites parameter
      */
     public void disconnect() {
         disconnect(false);
     }
 
+    /**
+     * Disconnect from the service. Cancel all pending receive requests.
+     *
+     * If finishPendingRewrites is true, the client will only disconnect
+     * after the data in the transmit buffer has been transmitted.
+     *
+     * @param finishPendingWrites true if the client should finish 
transmitting pending messages
+     */
     public void disconnect(boolean finishPendingWrites) {
         if (!finishPendingWrites || !currentTransmitHelper.notifyDone()) {
             if (currentTransmitHelper != null) {

Modified: gnunet-java/src/org/gnunet/util/HashCode.java
===================================================================
--- gnunet-java/src/org/gnunet/util/HashCode.java       2012-03-28 19:27:29 UTC 
(rev 20801)
+++ gnunet-java/src/org/gnunet/util/HashCode.java       2012-03-28 19:35:54 UTC 
(rev 20802)
@@ -1,9 +1,48 @@
 package org.gnunet.util;
 
 
+import org.gnunet.exceptions.InterfaceViolationException;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
 public class HashCode {
-    private byte[] data;
+    private final byte[] data;
+
     public HashCode(byte[] hash) {
+        if (hash.length != 64) {
+            throw new InterfaceViolationException("HashCode has to have length 
64");
+        }
         data = hash;
     }
+
+    /**
+     * Create a HashCode of the String using SHA-512
+     * @param s
+     */
+    public HashCode(String s) {
+        MessageDigest digest;
+        try {
+            digest = MessageDigest.getInstance("SHA-512");
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("crypto algorithm required but not 
provided");
+        }
+        byte[] data = digest.digest(s.getBytes());
+        if (data.length != 64) {
+            throw new RuntimeException("error in SHA512 algorithm");
+        }
+        this.data = data;
+    }
+
+    public static HashCode fromMessage(HashCodeMessage m) {
+        return new HashCode(m.data);
+    }
+
+
+    public HashCodeMessage asMessage() {
+        HashCodeMessage hcm = new HashCodeMessage();
+        hcm.data = data;
+        return hcm;
+    }
+
 }
\ No newline at end of file

Added: gnunet-java/src/org/gnunet/util/HashCodeMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/util/HashCodeMessage.java                        
        (rev 0)
+++ gnunet-java/src/org/gnunet/util/HashCodeMessage.java        2012-03-28 
19:35:54 UTC (rev 20802)
@@ -0,0 +1,9 @@
+package org.gnunet.util;
+
+import org.gnunet.construct.FixedSizeByteArray;
+import org.gnunet.construct.Message;
+
+public class HashCodeMessage implements Message {
+    @FixedSizeByteArray(length = 64)
+    public byte[] data;
+}

Added: gnunet-java/src/org/gnunet/util/IntEnum.java
===================================================================
--- gnunet-java/src/org/gnunet/util/IntEnum.java                                
(rev 0)
+++ gnunet-java/src/org/gnunet/util/IntEnum.java        2012-03-28 19:35:54 UTC 
(rev 20802)
@@ -0,0 +1,16 @@
+package org.gnunet.util;
+
+
+public interface IntEnum {
+    public int getInt();
+}
+
+
+/*
+Template for IntEnums:
+class $NAME$ implements IntEnum {
+    private final int val;
+    public int getInt() { return val; }
+    public $NAME$(int i) { val = i; }
+}
+*/
\ No newline at end of file

Added: gnunet-java/src/org/gnunet/util/PeerIdentityMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/util/PeerIdentityMessage.java                    
        (rev 0)
+++ gnunet-java/src/org/gnunet/util/PeerIdentityMessage.java    2012-03-28 
19:35:54 UTC (rev 20802)
@@ -0,0 +1,9 @@
+package org.gnunet.util;
+
+import org.gnunet.construct.FixedSizeByteArray;
+import org.gnunet.construct.Message;
+
+public class PeerIdentityMessage implements Message {
+    @FixedSizeByteArray(length = 64)
+    public byte[] data;
+}

Modified: gnunet-java/src/org/gnunet/util/Scheduler.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Scheduler.java      2012-03-28 19:27:29 UTC 
(rev 20801)
+++ gnunet-java/src/org/gnunet/util/Scheduler.java      2012-03-28 19:35:54 UTC 
(rev 20802)
@@ -58,6 +58,12 @@
         Set<Channel> readableSet = null;
         Set<Channel> writeableSet = null;
         Set<Channel> connectedSet = null;
+        public RunContext() {
+
+        }
+        public RunContext(Set<Reason> reasons) {
+            this.reasons = reasons;
+        }
     }
 
     public static interface Task {

Modified: gnunet-java/src/org/gnunet/util/getopt/OptionAction.java
===================================================================
--- gnunet-java/src/org/gnunet/util/getopt/OptionAction.java    2012-03-28 
19:27:29 UTC (rev 20801)
+++ gnunet-java/src/org/gnunet/util/getopt/OptionAction.java    2012-03-28 
19:35:54 UTC (rev 20802)
@@ -2,5 +2,5 @@
 
 
 public enum OptionAction {
-    SET, RESET, STORE_STRING, STORE_INT, INCREMENT
+    SET, RESET, STORE_STRING, STORE_NUMBER, INCREMENT
 }

Modified: gnunet-java/src/org/gnunet/util/getopt/Parser.java
===================================================================
--- gnunet-java/src/org/gnunet/util/getopt/Parser.java  2012-03-28 19:27:29 UTC 
(rev 20801)
+++ gnunet-java/src/org/gnunet/util/getopt/Parser.java  2012-03-28 19:35:54 UTC 
(rev 20802)
@@ -1,5 +1,6 @@
 package org.gnunet.util.getopt;
 
+import org.gnunet.construct.ReflectUtil;
 import org.gnunet.exceptions.InterfaceViolationException;
 
 import java.lang.reflect.Field;
@@ -99,8 +100,127 @@
         return helpString.toString();
     }
 
+    public void doLongOpt(final LinkedList<String> argsList, Field 
targetField, Option option, String right) {
+        try {
+            Class targetFieldType = targetField.getType();
+            switch (option.action()) {
+                case SET:
+                    if (!targetFieldType.equals(Boolean.TYPE)) {
+                        throw new InterfaceViolationException("action SET only 
valid on boolean member");
+                    }
+                    targetField.set(targetObject, true);
+                    break;
+                case RESET:
+                    if (!targetFieldType.equals(Boolean.TYPE)) {
+                        throw new InterfaceViolationException("action RESET 
only valid on boolean member");
+                    }
+                    targetField.set(targetObject, false);
+                    break;
+                case STORE_STRING:
+                    if (!targetFieldType.equals(String.class)) {
+                        throw new InterfaceViolationException("action 
STORE_STRING only valid on boolean member");
+                    }
+                    if (right == null) {
+                        argsList.removeFirst();
+                        if (argsList.isEmpty()) {
+                            throw new ArgumentError("missing string argument 
to option " + option.longname());
+                        }
+                        targetField.set(targetObject, argsList.getFirst());
+                    } else {
+                        targetField.set(targetObject, right);
+                    }
+                    break;
+                case STORE_NUMBER:
+                    ReflectUtil.NumField nf = new 
ReflectUtil.NumField(targetField);
+                    String numString;
+                    if (right == null) {
+                        argsList.removeFirst();
+                        if (argsList.isEmpty()) {
+                            throw new ArgumentError("missing number argument 
to option " + option.longname());
+                        }
+                        numString = argsList.getFirst();
+                    } else {
+                        numString = right;
+                    }
+                    try {
+                        nf.set(targetObject, Long.parseLong(numString));
+                    } catch (NumberFormatException e) {
+                        throw new ArgumentError("error in number format to 
option " + option.longname());
+                    }
+                    break;
+                case INCREMENT:
+                    throw new UnsupportedOperationException("not yet 
implemented");
+            }
+        } catch (IllegalAccessException e) {
+            throw new InterfaceViolationException(
+                    String.format("cannot acces member %s with @Option 
annotation", targetField.getName()));
+        }
+    }
 
+    public boolean doShortOpt(final LinkedList<String> argsList, Field 
targetField, Option option, String shortName) {
+        try {
+            switch (option.action()) {
+                case SET:
+                    if (!targetField.getType().equals(Boolean.TYPE)) {
+                        throw new InterfaceViolationException("action SET only 
valid on boolean member");
+                    }
+                    targetField.set(targetObject, true);
+                    break;
+                case RESET:
+                    if (!targetField.getType().equals(Boolean.TYPE)) {
+                        throw new InterfaceViolationException("action RESET 
only valid on boolean member");
+                    }
+                    targetField.set(targetObject, false);
+                    break;
+                case STORE_STRING:
+                    if (!targetField.getType().equals(String.class)) {
+                        throw new InterfaceViolationException("action 
STORE_STRING only valid on boolean " +
+                                "member");
+                    }
+                    if (argsList.getFirst().length() == 2) { // -X
+                        argsList.removeFirst();
+                        if (argsList.isEmpty()) {
+                            throw new ArgumentError(String.format("no argument 
for short option '%s'",
+                                    shortName));
+                        }
+                        targetField.set(targetObject, argsList.getFirst());
+                    } else {
+                        targetField.set(targetObject, 
argsList.getFirst().substring(2)); // -Pxxx...
+                    }
+                    // consumed entire shortopt
+                    return true;
+                case STORE_NUMBER:
+                    ReflectUtil.NumField nf = new 
ReflectUtil.NumField(targetField);
+                    String numString;
+                    boolean consumed;
+                    if (argsList.getFirst().length() == 2) { // -X
+                        argsList.removeFirst();
+                        if (argsList.isEmpty()) {
+                            throw new ArgumentError("missing number argument 
to option " + option.longname());
+                        }
+                        numString = argsList.getFirst();
+                        consumed = false;
+                    } else {
+                        numString = argsList.getFirst().substring(2);
+                        consumed = true;
+                    }
+                    try {
+                        nf.set(targetObject, Long.parseLong(numString));
+                    } catch (NumberFormatException e) {
+                        throw new ArgumentError("error in number format to 
option " + option.longname());
+                    }
+                    return consumed;
+                case INCREMENT:
+                    throw new UnsupportedOperationException("not yet 
implemented");
+            }
+        } catch (IllegalAccessException e) {
+            throw new ArgumentError(
+                    String.format("cannot acces member %s with @Option 
annotation", targetField.getName()));
+        }
+        return false; // did not consume entire shortopt -Xxxxxx
+    }
 
+
     /**
      * Parses the given arguments, and sets the target object's fields
      * according to its annotations.
@@ -112,119 +232,52 @@
         // unprocessed positional args
         Deque<String> positionalArgs = new LinkedList<String>();
 
-        // current part of args that is being looked at
-        int p = 0;
+        LinkedList<String> argsList = new 
LinkedList<String>(Arrays.asList(args));
 
-        while (p < args.length) {
+        while (!argsList.isEmpty()) {
             // arguments after single "--" are all positional
-            if (args[p].equals("--")) {
-                positionalArgs.addAll(Arrays.asList(args).subList(p + 1, 
args.length));
+            if (argsList.getFirst().equals("--")) {
+                argsList.removeFirst();
+                positionalArgs.addAll(argsList);
                 break;
             }
             // long args
-            if (args[p].startsWith("--")) {
+            if (argsList.getFirst().startsWith("--")) {
                 // remove leading slashes
-                String longOptionString = args[p].substring(2);
+                String longOptionString = argsList.getFirst().substring(2);
                 // maybe it is in the format --opt=val
                 String[] components = longOptionString.split("=", 2);
                 OptionField of = longOpt.get(components[0]);
                 if (of == null) {
                     throw new ArgumentError(String.format("unknown long 
option: '%s'", components[0]));
                 }
-                Option option = of.opt;
-                Field field = of.f;
-                try {
-                    Class targetFieldType = of.f.getType();
-                    switch (of.opt.action()) {
-                        case SET:
-                            if (!targetFieldType.equals(Boolean.TYPE)) {
-                                throw new InterfaceViolationException("action 
SET only valid on boolean member");
-                            }
-                            of.f.set(targetObject, true);
-                            break;
-                        case RESET:
-                            if (!targetFieldType.equals(Boolean.TYPE)) {
-                                throw new InterfaceViolationException("action 
RESET only valid on boolean member");
-                            }
-                            of.f.set(targetObject, false);
-                            break;
-                        case STORE_STRING:
-                            if (!targetFieldType.equals(String.class)) {
-                                throw new InterfaceViolationException("action 
STORE_STRING only valid on boolean member");
-                            }
-                            if (components.length == 1) {
-                                p++;
-                                if (p >= args.length) {
-                                    throw new ArgumentError("missing string 
argument to option " + of.opt.longname());
-                                }
-                                of.f.set(targetObject, args[p]);
-                            } else {
-                                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("-")) {
-                SHORTOPT:
-                for (int i = 1; i < args[p].length(); ++i) {
-                    String optShortName =args[p].substring(i, i + 1);
+                String right = (components.length == 2) ? components[1] : null;
+                doLongOpt(argsList, of.f, of.opt, right);
+            } else if (argsList.getFirst().length() > 1 && 
argsList.getFirst().startsWith("-")) {
+                for (int i = 1; i < argsList.getFirst().length(); ++i) {
+                    String optShortName = argsList.getFirst().substring(i, i + 
1);
                     OptionField of = shortOpt.get(optShortName);
                     if (of == null) {
-                        throw new ArgumentError(String.format("unknown short 
option: -%s", args[p].charAt(i)));
-                    }
-                    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, false);
-                                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) {
-                                    throw new ArgumentError("short options 
with argument must be seperate");
-                                }
-                                if (args[p].length() == 2) { // -X
-                                    p++;
-                                    if (p >= args.length) {
-                                        throw new 
ArgumentError(String.format("no argument for short option '%s'", optShortName));
-                                    }
-                                    of.f.set(targetObject, args[p]);
-                                } else {
-                                    of.f.set(targetObject, 
args[p].substring(2)); // -Pxxx...
-                                }
-                                break SHORTOPT;
-                            case STORE_INT:
-                                throw new UnsupportedOperationException("not 
yet implemented");
-                            case INCREMENT:
-                                throw new UnsupportedOperationException("not 
yet implemented");
-                        }
-                    } catch (IllegalAccessException e) {
                         throw new ArgumentError(
-                                String.format("cannot acces member %s with 
@Option annotation", of.f.getName()));
+                                String.format("unknown short option: -%s", 
argsList.getFirst().charAt(i)));
                     }
+
+                    boolean consumed = doShortOpt(argsList, of.f, of.opt, 
optShortName);
+
+                    if (consumed && i != 1) {
+                        throw new ArgumentError("short options with argument 
must be seperate");
+                    }
+
+                    if (consumed) {
+                        break;
+                    }
+
                 }
             } else {
-                positionalArgs.add(args[p]);
+                positionalArgs.add(argsList.getFirst());
             }
 
-            p++;
+            argsList.removeFirst();
         }
 
         return positionalArgs.toArray(new String[positionalArgs.size()]);

Deleted: gnunet-java/test/org/gnunet/construct/GetoptTest.java
===================================================================
--- gnunet-java/test/org/gnunet/construct/GetoptTest.java       2012-03-28 
19:27:29 UTC (rev 20801)
+++ gnunet-java/test/org/gnunet/construct/GetoptTest.java       2012-03-28 
19:35:54 UTC (rev 20802)
@@ -1,172 +0,0 @@
-package org.gnunet.construct;
-
-
-import org.gnunet.util.getopt.Option;
-import org.gnunet.util.getopt.OptionAction;
-import org.gnunet.util.getopt.Parser;
-import org.junit.Assert;
-import org.junit.Test;
-
-class Target {
-    @Option(
-            action = OptionAction.STORE_STRING,
-            shortname = "s",
-            longname = "string",
-            argumentName = "SOME_STRING",
-            description = "just some string"
-    )
-    String someString;
-
-    @Option(
-            action = OptionAction.SET,
-            shortname = "y",
-            longname = "set",
-            description = "enable, default disabled"
-    )
-    boolean set = false;
-
-    @Option(
-            action = OptionAction.RESET,
-            shortname = "n",
-            longname = "reset",
-            description = "disable, default enabled"
-    )
-    boolean reset = true;
-
-
-    @Option(
-            action = OptionAction.INCREMENT,
-            shortname = "i",
-            longname = "inc",
-            description = "increment a counter"
-    )
-    int counter = 0;
-
-    @Option(
-            action = OptionAction.STORE_INT,
-            shortname = "w",
-            longname = "value",
-            description = "some value"
-    )
-    int intVal = 0;
-}
-
-public class GetoptTest {
-
-    @Test
-    public void test_str() {
-        Target t = new Target();
-        Parser p = new Parser(t);
-
-        t.someString = null;
-
-        // argument after shortopt
-        p.parse(new String[]{"-s", "foo"});
-        Assert.assertEquals("foo", t.someString);
-        
-        t.someString = null;
-        
-        // argument directly with shortopt
-        p.parse(new String[]{"-sfoo"});
-        Assert.assertEquals("foo", t.someString);
-
-        t.someString = null;
-
-        p.parse(new String[]{"--string=foo"});
-        Assert.assertEquals("foo", t.someString);
-
-        t.someString = null;
-
-        p.parse(new String[]{"--string", "foo"});
-        Assert.assertEquals("foo", t.someString);
-
-
-        t.someString = null;
-
-        // last argument counts
-        p.parse(new String[]{"--string", "bar", "--string", "foo"});
-        Assert.assertEquals("foo", t.someString);
-        
-        t.someString = null;
-        
-        boolean thrown;
-                
-        thrown = false;
-        
-        // absence of argument throws ArgumentError (longopt)
-        try {
-            p.parse(new String[]{"--string"});
-        } catch (Parser.ArgumentError e) {
-            thrown = true;
-        }
-        
-        Assert.assertTrue(thrown);
-        
-        thrown = false;
-        // absence of argument throws ArgumentError (shortopt)
-        try {
-            p.parse(new String[]{"-s"});
-        } catch (Parser.ArgumentError e) {
-            thrown = true;
-        }
-
-        Assert.assertTrue(thrown);
-        
-        t.someString = null;
-        
-        // a way to specify an empty string
-        p.parse(new String[]{"--string="});
-        Assert.assertEquals("", t.someString);
-    }
-
-    @Test
-    public void test_help() {
-        Target t = new Target();
-        Parser p = new Parser(t);
-        
-        String help = p.getHelp();
-        
-        Assert.assertTrue(help.contains("--string"));
-        Assert.assertTrue(help.contains("-s"));
-
-        Assert.assertTrue(help.contains("-y"));
-        Assert.assertTrue(help.contains("--set"));
-    }
-
-
-    @Test
-    public void test_bool() {
-        Target t = new Target();
-        Parser p = new Parser(t);
-        
-        p.parse(new String[]{"--set", "--reset"});
-        Assert.assertTrue(t.set);
-        Assert.assertTrue(!t.reset);
-        
-        t.set = false;
-        t.reset = true;
-
-        p.parse(new String[]{"-y", "-n"});
-
-        Assert.assertTrue(t.set);
-        Assert.assertTrue(!t.reset);
-
-        t.set = false;
-        t.reset = true;
-
-        p.parse(new String[]{"-yn"});
-
-        Assert.assertTrue(t.set);
-        Assert.assertTrue(!t.reset);
-    }
-    
-    @Test
-    public void test_positional() {
-        Target t = new Target();
-        Parser p = new Parser(t);
-        
-        String[] rest = p.parse(new String[]{"--string=bla", "foo", "bar", 
"--set", "--", "--reset", "baz"});
-        
-        Assert.assertArrayEquals(new String[]{"foo", "bar", "--reset", "baz"}, 
rest);
-    }
-}

Copied: gnunet-java/test/org/gnunet/util/GetoptTest.java (from rev 20590, 
gnunet-java/test/org/gnunet/construct/GetoptTest.java)
===================================================================
--- gnunet-java/test/org/gnunet/util/GetoptTest.java                            
(rev 0)
+++ gnunet-java/test/org/gnunet/util/GetoptTest.java    2012-03-28 19:35:54 UTC 
(rev 20802)
@@ -0,0 +1,200 @@
+package org.gnunet.util;
+
+
+import org.gnunet.util.getopt.Option;
+import org.gnunet.util.getopt.OptionAction;
+import org.gnunet.util.getopt.Parser;
+import org.junit.Assert;
+import org.junit.Test;
+
+class Target {
+    @Option(
+            action = OptionAction.STORE_STRING,
+            shortname = "s",
+            longname = "string",
+            argumentName = "SOME_STRING",
+            description = "just some string"
+    )
+    String someString;
+
+    @Option(
+            action = OptionAction.SET,
+            shortname = "y",
+            longname = "set",
+            description = "enable, default disabled"
+    )
+    boolean set = false;
+
+    @Option(
+            action = OptionAction.RESET,
+            shortname = "n",
+            longname = "reset",
+            description = "disable, default enabled"
+    )
+    boolean reset = true;
+
+
+    @Option(
+            action = OptionAction.INCREMENT,
+            shortname = "i",
+            longname = "inc",
+            description = "increment a counter"
+    )
+    int counter = 0;
+
+    @Option(
+            action = OptionAction.STORE_NUMBER,
+            shortname = "w",
+            longname = "value",
+            description = "some value"
+    )
+    int intVal = 0;
+}
+
+public class GetoptTest {
+
+    @Test
+    public void test_str() {
+        Target t = new Target();
+        Parser p = new Parser(t);
+
+        t.someString = null;
+
+        // argument after shortopt
+        p.parse(new String[]{"-s", "foo"});
+        Assert.assertEquals("foo", t.someString);
+        
+        t.someString = null;
+        
+        // argument directly with shortopt
+        p.parse(new String[]{"-sfoo"});
+        Assert.assertEquals("foo", t.someString);
+
+        t.someString = null;
+
+        p.parse(new String[]{"--string=foo"});
+        Assert.assertEquals("foo", t.someString);
+
+        t.someString = null;
+
+        p.parse(new String[]{"--string", "foo"});
+        Assert.assertEquals("foo", t.someString);
+
+
+        t.someString = null;
+
+        // last argument counts
+        p.parse(new String[]{"--string", "bar", "--string", "foo"});
+        Assert.assertEquals("foo", t.someString);
+        
+        t.someString = null;
+        
+        boolean thrown;
+                
+        thrown = false;
+        
+        // absence of argument throws ArgumentError (longopt)
+        try {
+            p.parse(new String[]{"--string"});
+        } catch (Parser.ArgumentError e) {
+            thrown = true;
+        }
+        
+        Assert.assertTrue(thrown);
+        
+        thrown = false;
+        // absence of argument throws ArgumentError (shortopt)
+        try {
+            p.parse(new String[]{"-s"});
+        } catch (Parser.ArgumentError e) {
+            thrown = true;
+        }
+
+        Assert.assertTrue(thrown);
+        
+        t.someString = null;
+        
+        // a way to specify an empty string
+        p.parse(new String[]{"--string="});
+        Assert.assertEquals("", t.someString);
+    }
+
+    @Test
+    public void test_help() {
+        Target t = new Target();
+        Parser p = new Parser(t);
+        
+        String help = p.getHelp();
+        
+        Assert.assertTrue(help.contains("--string"));
+        Assert.assertTrue(help.contains("-s"));
+
+        Assert.assertTrue(help.contains("-y"));
+        Assert.assertTrue(help.contains("--set"));
+    }
+
+
+    @Test
+    public void test_bool() {
+        Target t = new Target();
+        Parser p = new Parser(t);
+        
+        p.parse(new String[]{"--set", "--reset"});
+        Assert.assertTrue(t.set);
+        Assert.assertTrue(!t.reset);
+        
+        t.set = false;
+        t.reset = true;
+
+        p.parse(new String[]{"-y", "-n"});
+
+        Assert.assertTrue(t.set);
+        Assert.assertTrue(!t.reset);
+
+        t.set = false;
+        t.reset = true;
+
+        p.parse(new String[]{"-yn"});
+
+        Assert.assertTrue(t.set);
+        Assert.assertTrue(!t.reset);
+    }
+    
+    @Test
+    public void test_positional() {
+        Target t = new Target();
+        Parser p = new Parser(t);
+        
+        String[] rest = p.parse(new String[]{"--string=bla", "foo", "bar", 
"--set", "--", "--reset", "baz"});
+        
+        Assert.assertArrayEquals(new String[]{"foo", "bar", "--reset", "baz"}, 
rest);
+    }
+
+    @Test
+    public void test_long() {
+        Target t = new Target();
+        Parser p = new Parser(t);
+
+        String[] rest;
+
+        rest = p.parse(new String[]{"-w5"});
+        Assert.assertEquals(5, t.intVal);
+
+        rest = p.parse(new String[]{"--value=6"});
+        Assert.assertEquals(6, t.intVal);
+
+        rest = p.parse(new String[]{"--value", "7"});
+        Assert.assertEquals(7, t.intVal);
+
+        rest = p.parse(new String[]{"--value", "-7"});
+        Assert.assertEquals(-7, t.intVal);
+
+        boolean thrown = false;
+        try {
+            rest = p.parse(new String[]{"--value", "x"});
+        } catch (Parser.ArgumentError e) {
+            thrown = true;
+        }
+        Assert.assertTrue(thrown);
+    }
+}




reply via email to

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