Author: toad
Date: 2007-02-09 20:54:57 +0000 (Fri, 09 Feb 2007)
New Revision: 11718

Modified:
   trunk/freenet/src/freenet/client/FailureCodeTracker.java
   trunk/freenet/src/freenet/client/async/SingleFileInserter.java
   trunk/freenet/src/freenet/client/async/SplitFileInserter.java
   trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
   trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
   trunk/freenet/src/freenet/clients/http/N2NTMToadlet.java
   trunk/freenet/src/freenet/config/FilePersistentConfig.java
   trunk/freenet/src/freenet/config/SubConfig.java
   trunk/freenet/src/freenet/crypt/DSAGroup.java
   trunk/freenet/src/freenet/crypt/DSAPrivateKey.java
   trunk/freenet/src/freenet/crypt/DSAPublicKey.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodeStarter.java
   trunk/freenet/src/freenet/node/PeerManager.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/TextModeClientInterface.java
   trunk/freenet/src/freenet/node/ThrottleWindowManager.java
   trunk/freenet/src/freenet/node/fcp/AddPeer.java
   trunk/freenet/src/freenet/node/fcp/AllDataMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientGet.java
   trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientHelloMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientPut.java
   trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
   trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
   trunk/freenet/src/freenet/node/fcp/ClientPutDirMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientRequest.java
   trunk/freenet/src/freenet/node/fcp/DataFoundMessage.java
   trunk/freenet/src/freenet/node/fcp/EndListPeerNotesMessage.java
   trunk/freenet/src/freenet/node/fcp/FCPConnectionInputHandler.java
   trunk/freenet/src/freenet/node/fcp/FinishedCompressionMessage.java
   trunk/freenet/src/freenet/node/fcp/GetFailedMessage.java
   trunk/freenet/src/freenet/node/fcp/GetRequestStatusMessage.java
   trunk/freenet/src/freenet/node/fcp/IdentifierCollisionMessage.java
   trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java
   trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java
   trunk/freenet/src/freenet/node/fcp/PeerNote.java
   trunk/freenet/src/freenet/node/fcp/PeerRemoved.java
   trunk/freenet/src/freenet/node/fcp/PersistentGet.java
   trunk/freenet/src/freenet/node/fcp/PersistentPut.java
   trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java
   trunk/freenet/src/freenet/node/fcp/PersistentRequestRemovedMessage.java
   trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java
   trunk/freenet/src/freenet/node/fcp/PutFailedMessage.java
   trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java
   trunk/freenet/src/freenet/node/fcp/PutSuccessfulMessage.java
   trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java
   trunk/freenet/src/freenet/node/fcp/SSKKeypairMessage.java
   trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java
   trunk/freenet/src/freenet/node/fcp/StartedCompressionMessage.java
   trunk/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java
   trunk/freenet/src/freenet/node/fcp/SubscribedUSKUpdate.java
   trunk/freenet/src/freenet/node/fcp/URIGeneratedMessage.java
   trunk/freenet/src/freenet/node/fcp/UnknownNodeIdentifierMessage.java
   trunk/freenet/src/freenet/node/fcp/WatchGlobal.java
   trunk/freenet/src/freenet/support/SimpleFieldSet.java
   trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java
   trunk/freenet/src/freenet/support/io/FileBucket.java
   trunk/freenet/src/freenet/support/io/NullBucket.java
   trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
   trunk/freenet/src/freenet/support/io/RandomAccessFileBucket.java
   trunk/freenet/src/freenet/support/io/ReadOnlyFileSliceBucket.java
   trunk/freenet/src/freenet/support/io/TempFileBucket.java
   
trunk/freenet/src/freenet/support/math/BootstrappingDecayingRunningAverage.java
   trunk/freenet/src/freenet/support/math/TimeDecayingRunningAverage.java
   trunk/freenet/src/freenet/tools/AddRef.java
Log:
SimpleFieldSet: APIs must be as simple as possible AND NO SIMPLER.
Also some minor code cleanups.

Modified: trunk/freenet/src/freenet/client/FailureCodeTracker.java
===================================================================
--- trunk/freenet/src/freenet/client/FailureCodeTracker.java    2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/client/FailureCodeTracker.java    2007-02-09 
20:54:57 UTC (rev 11718)
@@ -117,7 +117,8 @@
        }

        /** Copy verbosely to a SimpleFieldSet */
-       public synchronized void copyToFieldSet(SimpleFieldSet sfs, String 
prefix, boolean verbose) {
+       public synchronized SimpleFieldSet toFieldSet(boolean verbose) {
+               SimpleFieldSet sfs = new SimpleFieldSet();
                Iterator keys = map.keySet().iterator();
                while(keys.hasNext()) {
                        Integer k = (Integer) keys.next();
@@ -126,10 +127,11 @@
                        // prefix.num.Description=<code description>
                        // prefix.num.Count=<count>
                        if(verbose)
-                               
sfs.put(prefix+Integer.toString(code)+".Description", 
+                               
sfs.putSingle(Integer.toString(code)+".Description", 
                                                insert ? 
InserterException.getMessage(code) : FetchException.getMessage(code));
-                       sfs.put(prefix+Integer.toString(code)+".Count", 
Integer.toString(item.x));
+                       sfs.putSingle(Integer.toString(code)+".Count", 
Integer.toString(item.x));
                }
+               return sfs;
        }

        public synchronized boolean isOneCodeOnly() {

Modified: trunk/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileInserter.java      
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/client/async/SingleFileInserter.java      
2007-02-09 20:54:57 UTC (rev 11718)
@@ -582,7 +582,7 @@
                                curMetadataPutter = metadataPutter;
                        }
                        SimpleFieldSet fs = new SimpleFieldSet();
-                       fs.put("Type", "SplitHandler");
+                       fs.putSingle("Type", "SplitHandler");
                        if(curSFI != null)
                                fs.put("SplitFileInserter", 
curSFI.getProgressFieldset());
                        if(curMetadataPutter != null)

Modified: trunk/freenet/src/freenet/client/async/SplitFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileInserter.java       
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/client/async/SplitFileInserter.java       
2007-02-09 20:54:57 UTC (rev 11718)
@@ -48,18 +48,18 @@
                SimpleFieldSet fs = new SimpleFieldSet();
                // don't save basic infrastructure such as ctx and parent
                // only save details of the request
-               fs.put("Type", "SplitFileInserter");
-               fs.put("DataLength", Long.toString(dataLength));
-               fs.put("CompressionCodec", Short.toString(compressionCodec));
-               fs.put("SplitfileCodec", Short.toString(splitfileAlgorithm));
-               fs.put("Finished", Boolean.toString(finished));
-               fs.put("SegmentSize", Integer.toString(segmentSize));
-               fs.put("CheckSegmentSize", Integer.toString(checkSegmentSize));
+               fs.putSingle("Type", "SplitFileInserter");
+               fs.putSingle("DataLength", Long.toString(dataLength));
+               fs.putSingle("CompressionCodec", 
Short.toString(compressionCodec));
+               fs.putSingle("SplitfileCodec", 
Short.toString(splitfileAlgorithm));
+               fs.putSingle("Finished", Boolean.toString(finished));
+               fs.putSingle("SegmentSize", Integer.toString(segmentSize));
+               fs.putSingle("CheckSegmentSize", 
Integer.toString(checkSegmentSize));
                SimpleFieldSet segs = new SimpleFieldSet();
                for(int i=0;i<segments.length;i++) {
                        segs.put(Integer.toString(i), 
segments[i].getProgressFieldset());
                }
-               segs.put("Count", Integer.toString(segments.length));
+               segs.putSingle("Count", Integer.toString(segments.length));
                fs.put("Segments", segs);
                return fs;
        }

Modified: trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java        
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java        
2007-02-09 20:54:57 UTC (rev 11718)
@@ -230,19 +230,19 @@

        public synchronized SimpleFieldSet getProgressFieldset() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Type", "SplitFileInserterSegment");
-               fs.put("Finished", Boolean.toString(finished));
+               fs.putSingle("Type", "SplitFileInserterSegment");
+               fs.putSingle("Finished", Boolean.toString(finished));
                // If true, check blocks which are null are finished 
-               fs.put("Encoded", Boolean.toString(encoded));
+               fs.putSingle("Encoded", Boolean.toString(encoded));
                // If true, data blocks which are null are finished
-               fs.put("Started", Boolean.toString(started));
-               errors.copyToFieldSet(fs, "Errors.", false);
+               fs.putSingle("Started", Boolean.toString(started));
+               fs.put("Errors", errors.toFieldSet(false));
                SimpleFieldSet dataFS = new SimpleFieldSet();
-               dataFS.put("Count", Integer.toString(dataBlocks.length));
+               dataFS.putSingle("Count", Integer.toString(dataBlocks.length));
                for(int i=0;i<dataBlocks.length;i++) {
                        SimpleFieldSet block = new SimpleFieldSet();
                        if(dataURIs[i] != null)
-                               block.put("URI", dataURIs[i].toString());
+                               block.putSingle("URI", dataURIs[i].toString());
                        SingleBlockInserter sbi =
                                dataBlockInserters[i];
                        // If started, then sbi = null => block finished.
@@ -270,11 +270,11 @@
                }
                fs.put("DataBlocks", dataFS);
                SimpleFieldSet checkFS = new SimpleFieldSet();
-               checkFS.put("Count", Integer.toString(checkBlocks.length));
+               checkFS.putSingle("Count", 
Integer.toString(checkBlocks.length));
                for(int i=0;i<checkBlocks.length;i++) {
                        SimpleFieldSet block = new SimpleFieldSet();
                        if(checkURIs[i] != null)
-                               block.put("URI", checkURIs[i].toString());
+                               block.putSingle("URI", checkURIs[i].toString());
                        SingleBlockInserter sbi =
                                checkBlockInserters[i];
                        // If encoded, then sbi == null => block finished

Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java       
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java       
2007-02-09 20:54:57 UTC (rev 11718)
@@ -669,7 +669,7 @@
                        SimpleFieldSet fs;

                        try {
-                               fs = new SimpleFieldSet(ref.toString());
+                               fs = new SimpleFieldSet(ref.toString(), false);
                                fs.setEndMarker("End"); // It's always End ; 
the regex above doesn't always grok this
                        } catch (IOException e) {
                                this.sendErrorPage(ctx, 200, "Failed To Add 
Node", "Unable to parse the given text as a node reference ("+e+"). Please try 
again.");

Modified: trunk/freenet/src/freenet/clients/http/N2NTMToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/N2NTMToadlet.java    2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/clients/http/N2NTMToadlet.java    2007-02-09 
20:54:57 UTC (rev 11718)
@@ -133,12 +133,12 @@
                                        try {
                                                long now = 
System.currentTimeMillis();
                                                SimpleFieldSet fs = new 
SimpleFieldSet();
-                                               fs.put("type", 
Integer.toString(Node.N2N_TEXT_MESSAGE_TYPE_USERALERT));
-                                               fs.put("source_nodename", 
Base64.encode(node.getMyName().getBytes()));
-                                               fs.put("target_nodename", 
Base64.encode(pn.getName().getBytes()));
-                                               fs.put("text", 
Base64.encode(message.getBytes()));
-                                               fs.put("composedTime", 
Long.toString(now));
-                                               fs.put("sentTime", 
Long.toString(now));
+                                               fs.putSingle("type", 
Integer.toString(Node.N2N_TEXT_MESSAGE_TYPE_USERALERT));
+                                               fs.putSingle("source_nodename", 
Base64.encode(node.getMyName().getBytes()));
+                                               fs.putSingle("target_nodename", 
Base64.encode(pn.getName().getBytes()));
+                                               fs.putSingle("text", 
Base64.encode(message.getBytes()));
+                                               fs.putSingle("composedTime", 
Long.toString(now));
+                                               fs.putSingle("sentTime", 
Long.toString(now));
                                                Message n2ntm;
                                                if(Version.buildNumber() < 
1000) {  // FIXME/TODO: This test shouldn't be needed eventually
                                                        n2ntm = 
DMT.createNodeToNodeTextMessage(Node.N2N_TEXT_MESSAGE_TYPE_USERALERT, 
node.getMyName(), pn.getName(), message);

Modified: trunk/freenet/src/freenet/config/FilePersistentConfig.java
===================================================================
--- trunk/freenet/src/freenet/config/FilePersistentConfig.java  2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/config/FilePersistentConfig.java  2007-02-09 
20:54:57 UTC (rev 11718)
@@ -96,7 +96,7 @@
                try {
                        LineReadingInputStream lis = new 
LineReadingInputStream(bis);
                        // Config file is UTF-8 too!
-                       return new SimpleFieldSet(lis, 32768, 128, true, true);
+                       return new SimpleFieldSet(lis, 32768, 128, true, true, 
true); // FIXME? advanced users may edit the config file, hence true?
                } finally {
                        try {
                                fis.close();

Modified: trunk/freenet/src/freenet/config/SubConfig.java
===================================================================
--- trunk/freenet/src/freenet/config/SubConfig.java     2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/config/SubConfig.java     2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -210,7 +210,7 @@
                                        Logger.minor(this, "Skipping "+key+" - 
"+o.isDefault());
                                continue;
                        }
-                       fs.put(key, o.getValueString());
+                       fs.putSingle(key, o.getValueString());
                        if(logMINOR)
                                Logger.minor(this, "Key="+prefix+'.'+key+" 
value="+o.getValueString());
                }

Modified: trunk/freenet/src/freenet/crypt/DSAGroup.java
===================================================================
--- trunk/freenet/src/freenet/crypt/DSAGroup.java       2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/crypt/DSAGroup.java       2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -342,9 +342,9 @@

        public SimpleFieldSet asFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("p", Base64.encode(p.toByteArray()));
-               fs.put("q", Base64.encode(q.toByteArray()));
-               fs.put("g", Base64.encode(g.toByteArray()));
+               fs.putSingle("p", Base64.encode(p.toByteArray()));
+               fs.putSingle("q", Base64.encode(q.toByteArray()));
+               fs.putSingle("g", Base64.encode(g.toByteArray()));
                return fs;
        }


Modified: trunk/freenet/src/freenet/crypt/DSAPrivateKey.java
===================================================================
--- trunk/freenet/src/freenet/crypt/DSAPrivateKey.java  2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/crypt/DSAPrivateKey.java  2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -71,7 +71,7 @@

        public SimpleFieldSet asFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("x", Base64.encode(x.toByteArray()));
+               fs.putSingle("x", Base64.encode(x.toByteArray()));
                return fs;
        }


Modified: trunk/freenet/src/freenet/crypt/DSAPublicKey.java
===================================================================
--- trunk/freenet/src/freenet/crypt/DSAPublicKey.java   2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/crypt/DSAPublicKey.java   2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -188,7 +188,7 @@

        public SimpleFieldSet asFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("y", Base64.encode(y.toByteArray()));
+               fs.putSingle("y", Base64.encode(y.toByteArray()));
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-02-09 19:47:51 UTC (rev 
11717)
+++ trunk/freenet/src/freenet/node/Node.java    2007-02-09 20:54:57 UTC (rev 
11718)
@@ -526,7 +526,7 @@
                FileInputStream fis = new FileInputStream(filename);
                InputStreamReader isr = new InputStreamReader(fis);
                BufferedReader br = new BufferedReader(isr);
-               SimpleFieldSet fs = new SimpleFieldSet(br);
+               SimpleFieldSet fs = new SimpleFieldSet(br, false);
                br.close();
                // Read contents
                String[] udp = fs.getAll("physical.udp");
@@ -642,8 +642,14 @@
                        myARKNumber = 0;
                } else {
                        ark = null;
-                       s = fs.get("old-ark.number");
-                       privARK = fs.get("old-ark.privURI");
+                       // FIXME remove in a few versions; back compat support 
for 1012 only
+                       // and not very important; remove in 1014??
+                       // Note that "old-ark" doesn't work because it is 
stripped by the manually
+                       // posted references filter.
+                       s = fs.get("oldark.number");
+                       if(s == null) s = fs.get("old-ark.number");
+                       privARK = fs.get("oldark.privURI");
+                       if(privARK == null) privARK = fs.get("old-ark.privURI");
                        try {
                                if(privARK != null) {
                                        FreenetURI uri = new 
FreenetURI(privARK);
@@ -1347,10 +1353,10 @@

                SimpleFieldSet throttleFS = null;
                try {
-                       throttleFS = SimpleFieldSet.readFrom(persistTarget);
+                       throttleFS = SimpleFieldSet.readFrom(persistTarget, 
false);
                } catch (IOException e) {
                        try {
-                               throttleFS = 
SimpleFieldSet.readFrom(persistTemp);
+                               throttleFS = 
SimpleFieldSet.readFrom(persistTemp, false);
                        } catch (FileNotFoundException e1) {
                                // Ignore
                        } catch (IOException e1) {
@@ -1734,9 +1740,9 @@
        public SimpleFieldSet exportPrivateFieldSet() {
                SimpleFieldSet fs = exportPublicFieldSet(false);
                fs.put("dsaPrivKey", myPrivKey.asFieldSet());
-               fs.put("ark.privURI", this.myARK.getInsertURI().toString(false, 
false));
+               fs.putSingle("ark.privURI", 
this.myARK.getInsertURI().toString(false, false));
                if(myOldARK != null) {
-                       fs.put("old-ark.privURI", 
this.myOldARK.getInsertURI().toString(false, false));
+                       fs.putSingle("oldark.privURI", 
this.myOldARK.getInsertURI().toString(false, false));
                }
                return fs;
        }
@@ -1761,34 +1767,40 @@
                Peer[] ips = ipDetector.getPrimaryIPAddress();
                if(ips != null) {
                        for(int i=0;i<ips.length;i++)
-                               fs.put("physical.udp", ips[i].toString()); // 
Keep; important that node know all our IPs
+                               fs.putAppend("physical.udp", 
ips[i].toString()); // Keep; important that node know all our IPs
                }
-               fs.put("identity", Base64.encode(myIdentity)); // FIXME 
!forSetup after 11104 is mandatory
-               fs.put("location", 
Double.toString(lm.getLocation().getValue())); // FIXME maybe !forSetup; see 
#943
-               fs.put("version", Version.getVersionString()); // Keep, vital 
that peer know our version. For example, some types may be sent in different 
formats to different node versions (e.g. Peer).
-               fs.put("testnet", Boolean.toString(testnetEnabled)); // Vital 
that peer know this!
-               fs.put("lastGoodVersion", Version.getLastGoodVersionString()); 
// Also vital
+               fs.putSingle("identity", Base64.encode(myIdentity)); // FIXME 
!forSetup after 11104 is mandatory
+               fs.putSingle("location", 
Double.toString(lm.getLocation().getValue())); // FIXME maybe !forSetup; see 
#943
+               fs.putSingle("version", Version.getVersionString()); // Keep, 
vital that peer know our version. For example, some types may be sent in 
different formats to different node versions (e.g. Peer).
+               fs.putSingle("testnet", Boolean.toString(testnetEnabled)); // 
Vital that peer know this!
+               fs.putSingle("lastGoodVersion", 
Version.getLastGoodVersionString()); // Also vital
                if(testnetEnabled)
-                       fs.put("testnetPort", 
Integer.toString(testnetHandler.getPort())); // Useful, saves a lot of 
complexity
-               fs.put("myName", myName); // FIXME see #942
+                       fs.putSingle("testnetPort", 
Integer.toString(testnetHandler.getPort())); // Useful, saves a lot of 
complexity
+               fs.putSingle("myName", myName); // FIXME see #942
                if(!forSetup) {
                        // These are invariant. They cannot change on 
connection setup. They can safely be excluded.
                        fs.put("dsaGroup", myCryptoGroup.asFieldSet());
                        fs.put("dsaPubKey", myPubKey.asFieldSet());
                }
-               fs.put("ark.number", Long.toString(this.myARKNumber)); // Can 
be changed on setup
-               fs.put("ark.pubURI", this.myARK.getURI().toString(false, 
false)); // Can be changed on setup
+               fs.putSingle("ark.number", Long.toString(this.myARKNumber)); // 
Can be changed on setup
+               fs.putSingle("ark.pubURI", this.myARK.getURI().toString(false, 
false)); // Can be changed on setup
                if(myOldARK != null) {
-                       fs.put("old-ark.number", 
Long.toString(this.myOldARKNumber));
-                       fs.put("old-ark.pubURI", 
this.myOldARK.getURI().toString(false, false));
+                       fs.putSingle("oldark.number", 
Long.toString(this.myOldARKNumber));
+                       fs.putSingle("oldark.pubURI", 
this.myOldARK.getURI().toString(false, false));
                }

                synchronized (referenceSync) {
                        if(myReferenceSignature == null || mySignedReference == 
null || !mySignedReference.equals(fs.toOrderedString())){
-                               mySignedReference = fs.toOrderedString();       
+                               mySignedReference = fs.toOrderedString();
+                               if(logMINOR) Logger.minor(this, "Signing 
reference:\n"+mySignedReference);

                                try{
-                                       myReferenceSignature = 
DSA.sign(myCryptoGroup, myPrivKey, new BigInteger(1, 
SHA256.digest(mySignedReference.getBytes("UTF-8"))), random);
+                                       byte[] ref = 
mySignedReference.getBytes("UTF-8");
+                                       BigInteger m = new BigInteger(1, 
SHA256.digest(ref));
+                                       if(logMINOR) Logger.minor(this, "m = 
"+m.toString(16));
+                                       myReferenceSignature = 
DSA.sign(myCryptoGroup, myPrivKey, m, random);
+                                       if(!DSA.verify(myPubKey, 
myReferenceSignature, m))
+                                               Logger.normal(this, "Signature 
failed!");
                                } catch(UnsupportedEncodingException e){
                                        //duh ?
                                        Logger.error(this, "Error while signing 
the node identity!"+e);
@@ -1797,10 +1809,10 @@
                                        exit(EXIT_CRAPPY_JVM);
                                }
                        }
-                       fs.put("sig", myReferenceSignature.toString());
+                       fs.putSingle("sig", myReferenceSignature.toString());
                }

-               if(logMINOR) Logger.minor(this, "My reference: "+fs);
+               if(logMINOR) Logger.minor(this, "My reference: 
"+fs.toOrderedString());
                return fs;
        }

@@ -1810,24 +1822,24 @@
        public SimpleFieldSet exportVolatileFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
                long now = System.currentTimeMillis();
-               fs.put("isUsingWrapper", Boolean.toString(isUsingWrapper()));
+               fs.putSingle("isUsingWrapper", 
Boolean.toString(isUsingWrapper()));
                long nodeUptimeSeconds = 0;
                synchronized(this) {
-                       fs.put("startupTime", Long.toString(startupTime));
+                       fs.putSingle("startupTime", Long.toString(startupTime));
                        nodeUptimeSeconds = (now - startupTime) / 1000;
-                       fs.put("uptimeSeconds", 
Long.toString(nodeUptimeSeconds));
+                       fs.putSingle("uptimeSeconds", 
Long.toString(nodeUptimeSeconds));
                }
-               fs.put("averagePingTime", 
Double.toString(getNodeAveragePingTime()));
-               fs.put("bwlimitDelayTime", 
Double.toString(getBwlimitDelayTime()));
-               fs.put("networkSizeEstimateSession", 
Integer.toString(getNetworkSizeEstimate(-1)));
+               fs.putSingle("averagePingTime", 
Double.toString(getNodeAveragePingTime()));
+               fs.putSingle("bwlimitDelayTime", 
Double.toString(getBwlimitDelayTime()));
+               fs.putSingle("networkSizeEstimateSession", 
Integer.toString(getNetworkSizeEstimate(-1)));
                int networkSizeEstimate24hourRecent = 
getNetworkSizeEstimate(now - (24*60*60*1000));  // 24 hours
-               fs.put("networkSizeEstimate24hourRecent", 
Integer.toString(networkSizeEstimate24hourRecent));
+               fs.putSingle("networkSizeEstimate24hourRecent", 
Integer.toString(networkSizeEstimate24hourRecent));
                int networkSizeEstimate48hourRecent = 
getNetworkSizeEstimate(now - (48*60*60*1000));  // 48 hours
-               fs.put("networkSizeEstimate48hourRecent", 
Integer.toString(networkSizeEstimate48hourRecent));
-               fs.put("routingMissDistance", 
Double.toString(routingMissDistance.currentValue()));
-               fs.put("backedOffPercent", 
Double.toString(backedOffPercent.currentValue()));
-               fs.put("pInstantReject", 
Double.toString(pRejectIncomingInstantly()));
-               fs.put("unclaimedFIFOSize", 
Integer.toString(usm.getUnclaimedFIFOSize()));
+               fs.putSingle("networkSizeEstimate48hourRecent", 
Integer.toString(networkSizeEstimate48hourRecent));
+               fs.putSingle("routingMissDistance", 
Double.toString(routingMissDistance.currentValue()));
+               fs.putSingle("backedOffPercent", 
Double.toString(backedOffPercent.currentValue()));
+               fs.putSingle("pInstantReject", 
Double.toString(pRejectIncomingInstantly()));
+               fs.putSingle("unclaimedFIFOSize", 
Integer.toString(usm.getUnclaimedFIFOSize()));

                /* gather connection statistics */
                PeerNodeStatus[] peerNodeStatuses = getPeerNodeStatuses();
@@ -1857,24 +1869,24 @@
                int numberOfSimpleConnected = numberOfConnected + 
numberOfRoutingBackedOff;
                int numberOfNotConnected = numberOfTooNew + numberOfTooOld + 
numberOfDisconnected + numberOfNeverConnected + numberOfDisabled + 
numberOfBursting + numberOfListening + numberOfListenOnly;

-               fs.put("numberOfConnected", 
Integer.toString(numberOfConnected));
-               fs.put("numberOfRoutingBackedOff", 
Integer.toString(numberOfRoutingBackedOff));
-               fs.put("numberOfTooNew", Integer.toString(numberOfTooNew));
-               fs.put("numberOfTooOld", Integer.toString(numberOfTooOld));
-               fs.put("numberOfDisconnected", 
Integer.toString(numberOfDisconnected));
-               fs.put("numberOfNeverConnected", 
Integer.toString(numberOfNeverConnected));
-               fs.put("numberOfDisabled", Integer.toString(numberOfDisabled));
-               fs.put("numberOfBursting", Integer.toString(numberOfBursting));
-               fs.put("numberOfListening", 
Integer.toString(numberOfListening));
-               fs.put("numberOfListenOnly", 
Integer.toString(numberOfListenOnly));
+               fs.putSingle("numberOfConnected", 
Integer.toString(numberOfConnected));
+               fs.putSingle("numberOfRoutingBackedOff", 
Integer.toString(numberOfRoutingBackedOff));
+               fs.putSingle("numberOfTooNew", 
Integer.toString(numberOfTooNew));
+               fs.putSingle("numberOfTooOld", 
Integer.toString(numberOfTooOld));
+               fs.putSingle("numberOfDisconnected", 
Integer.toString(numberOfDisconnected));
+               fs.putSingle("numberOfNeverConnected", 
Integer.toString(numberOfNeverConnected));
+               fs.putSingle("numberOfDisabled", 
Integer.toString(numberOfDisabled));
+               fs.putSingle("numberOfBursting", 
Integer.toString(numberOfBursting));
+               fs.putSingle("numberOfListening", 
Integer.toString(numberOfListening));
+               fs.putSingle("numberOfListenOnly", 
Integer.toString(numberOfListenOnly));

-               fs.put("numberOfSimpleConnected", 
Integer.toString(numberOfSimpleConnected));
-               fs.put("numberOfNotConnected", 
Integer.toString(numberOfNotConnected));
+               fs.putSingle("numberOfSimpleConnected", 
Integer.toString(numberOfSimpleConnected));
+               fs.putSingle("numberOfNotConnected", 
Integer.toString(numberOfNotConnected));

-               fs.put("numberOfInserts", Integer.toString(getNumInserts()));
-               fs.put("numberOfRequests", Integer.toString(getNumRequests()));
-               fs.put("numberOfTransferringRequests", 
Integer.toString(getNumTransferringRequests()));
-               fs.put("numberOfARKFetchers", 
Integer.toString(getNumARKFetchers()));
+               fs.putSingle("numberOfInserts", 
Integer.toString(getNumInserts()));
+               fs.putSingle("numberOfRequests", 
Integer.toString(getNumRequests()));
+               fs.putSingle("numberOfTransferringRequests", 
Integer.toString(getNumTransferringRequests()));
+               fs.putSingle("numberOfARKFetchers", 
Integer.toString(getNumARKFetchers()));

                long[] total = IOStatisticCollector.getTotalIO();
                long total_output_rate = (total[0]) / nodeUptimeSeconds;
@@ -1882,19 +1894,19 @@
                long totalPayloadOutput = getTotalPayloadSent();
                long total_payload_output_rate = totalPayloadOutput / 
nodeUptimeSeconds;
                int total_payload_output_percent = (int) (100 * 
totalPayloadOutput / total[0]);
-               fs.put("totalOutputBytes", Long.toString(total[0]));
-               fs.put("totalOutputRate", Long.toString(total_output_rate));
-               fs.put("totalPayloadOutputBytes", 
Long.toString(totalPayloadOutput));
-               fs.put("totalPayloadOutputRate", 
Long.toString(total_payload_output_rate));
-               fs.put("totalPayloadOutputPercent", 
Integer.toString(total_payload_output_percent));
-               fs.put("totalInputBytes", Long.toString(total[1]));
-               fs.put("totalInputRate", Long.toString(total_input_rate));
+               fs.putSingle("totalOutputBytes", Long.toString(total[0]));
+               fs.putSingle("totalOutputRate", 
Long.toString(total_output_rate));
+               fs.putSingle("totalPayloadOutputBytes", 
Long.toString(totalPayloadOutput));
+               fs.putSingle("totalPayloadOutputRate", 
Long.toString(total_payload_output_rate));
+               fs.putSingle("totalPayloadOutputPercent", 
Integer.toString(total_payload_output_percent));
+               fs.putSingle("totalInputBytes", Long.toString(total[1]));
+               fs.putSingle("totalInputRate", Long.toString(total_input_rate));
                long[] rate = getNodeIOStats();
                long delta = (rate[5] - rate[2]) / 1000;
                long recent_output_rate = (rate[3] - rate[0]) / delta;
                long recent_input_rate = (rate[4] - rate[1]) / delta;
-               fs.put("recentOutputRate", Long.toString(recent_output_rate));
-               fs.put("recentInputRate", Long.toString(recent_input_rate));
+               fs.putSingle("recentOutputRate", 
Long.toString(recent_output_rate));
+               fs.putSingle("recentInputRate", 
Long.toString(recent_input_rate));

                String [] routingBackoffReasons = 
getPeerNodeRoutingBackoffReasons();
                if(routingBackoffReasons.length != 0) {
@@ -1906,12 +1918,12 @@
                double swaps = (double)getSwaps();
                double noSwaps = (double)getNoSwaps();
                double numberOfRemotePeerLocationsSeenInSwaps = 
(double)getNumberOfRemotePeerLocationsSeenInSwaps();
-               fs.put("numberOfRemotePeerLocationsSeenInSwaps", 
Double.toString(numberOfRemotePeerLocationsSeenInSwaps));
+               fs.putSingle("numberOfRemotePeerLocationsSeenInSwaps", 
Double.toString(numberOfRemotePeerLocationsSeenInSwaps));
                double avgConnectedPeersPerNode = 0.0;
                if ((numberOfRemotePeerLocationsSeenInSwaps > 0.0) && ((swaps > 
0.0) || (noSwaps > 0.0))) {
                        avgConnectedPeersPerNode = 
numberOfRemotePeerLocationsSeenInSwaps/(swaps+noSwaps);
                }
-               fs.put("avgConnectedPeersPerNode", 
Double.toString(avgConnectedPeersPerNode));
+               fs.putSingle("avgConnectedPeersPerNode", 
Double.toString(avgConnectedPeersPerNode));

                int startedSwaps = getStartedSwaps();
                int swapsRejectedAlreadyLocked = 
getSwapsRejectedAlreadyLocked();
@@ -1940,20 +1952,20 @@
                if ((swaps > 0.0) && (noSwaps > 0.0)) {
                        swapsPerNoSwaps = swaps/noSwaps;
                }
-               fs.put("locationChangePerSession", 
Double.toString(locationChangePerSession));
-               fs.put("locationChangePerSwap", 
Double.toString(locationChangePerSwap));
-               fs.put("locationChangePerMinute", 
Double.toString(locationChangePerMinute));
-               fs.put("swapsPerMinute", Double.toString(swapsPerMinute));
-               fs.put("noSwapsPerMinute", Double.toString(noSwapsPerMinute));
-               fs.put("swapsPerNoSwaps", Double.toString(swapsPerNoSwaps));
-               fs.put("swaps", Double.toString(swaps));
-               fs.put("noSwaps", Double.toString(noSwaps));
-               fs.put("startedSwaps", Integer.toString(startedSwaps));
-               fs.put("swapsRejectedAlreadyLocked", 
Integer.toString(swapsRejectedAlreadyLocked));
-               fs.put("swapsRejectedNowhereToGo", 
Integer.toString(swapsRejectedNowhereToGo));
-               fs.put("swapsRejectedRateLimit", 
Integer.toString(swapsRejectedRateLimit));
-               fs.put("swapsRejectedLoop", 
Integer.toString(swapsRejectedLoop));
-               fs.put("swapsRejectedRecognizedID", 
Integer.toString(swapsRejectedRecognizedID));
+               fs.putSingle("locationChangePerSession", 
Double.toString(locationChangePerSession));
+               fs.putSingle("locationChangePerSwap", 
Double.toString(locationChangePerSwap));
+               fs.putSingle("locationChangePerMinute", 
Double.toString(locationChangePerMinute));
+               fs.putSingle("swapsPerMinute", Double.toString(swapsPerMinute));
+               fs.putSingle("noSwapsPerMinute", 
Double.toString(noSwapsPerMinute));
+               fs.putSingle("swapsPerNoSwaps", 
Double.toString(swapsPerNoSwaps));
+               fs.putSingle("swaps", Double.toString(swaps));
+               fs.putSingle("noSwaps", Double.toString(noSwaps));
+               fs.putSingle("startedSwaps", Integer.toString(startedSwaps));
+               fs.putSingle("swapsRejectedAlreadyLocked", 
Integer.toString(swapsRejectedAlreadyLocked));
+               fs.putSingle("swapsRejectedNowhereToGo", 
Integer.toString(swapsRejectedNowhereToGo));
+               fs.putSingle("swapsRejectedRateLimit", 
Integer.toString(swapsRejectedRateLimit));
+               fs.putSingle("swapsRejectedLoop", 
Integer.toString(swapsRejectedLoop));
+               fs.putSingle("swapsRejectedRecognizedID", 
Integer.toString(swapsRejectedRecognizedID));

                long fix32kb = 32 * 1024;
                long cachedKeys = getChkDatacache().keyCount();
@@ -1979,25 +1991,25 @@
                long overallAccesses = storeAccesses + cacheAccesses;
                double avgStoreAccessRate = 
(double)overallAccesses/(double)nodeUptimeSeconds;

-               fs.put("cachedKeys", Long.toString(cachedKeys));
-               fs.put("cachedSize", Long.toString(cachedSize));
-               fs.put("storeKeys", Long.toString(storeKeys));
-               fs.put("storeSize", Long.toString(storeSize));
-               fs.put("overallKeys", Long.toString(overallKeys));
-               fs.put("overallSize", Long.toString(overallSize));
-               fs.put("maxOverallKeys", Long.toString(maxOverallKeys));
-               fs.put("maxOverallSize", Long.toString(maxOverallSize));
-               fs.put("percentOverallKeysOfMax", 
Double.toString(percentOverallKeysOfMax));
-               fs.put("cachedStoreHits", Long.toString(cachedStoreHits));
-               fs.put("cachedStoreMisses", Long.toString(cachedStoreMisses));
-               fs.put("cacheAccesses", Long.toString(cacheAccesses));
-               fs.put("percentCachedStoreHitsOfAccesses", 
Double.toString(percentCachedStoreHitsOfAccesses));
-               fs.put("storeHits", Long.toString(storeHits));
-               fs.put("storeMisses", Long.toString(storeMisses));
-               fs.put("storeAccesses", Long.toString(storeAccesses));
-               fs.put("percentStoreHitsOfAccesses", 
Double.toString(percentStoreHitsOfAccesses));
-               fs.put("overallAccesses", Long.toString(overallAccesses));
-               fs.put("avgStoreAccessRate", 
Double.toString(avgStoreAccessRate));
+               fs.putSingle("cachedKeys", Long.toString(cachedKeys));
+               fs.putSingle("cachedSize", Long.toString(cachedSize));
+               fs.putSingle("storeKeys", Long.toString(storeKeys));
+               fs.putSingle("storeSize", Long.toString(storeSize));
+               fs.putSingle("overallKeys", Long.toString(overallKeys));
+               fs.putSingle("overallSize", Long.toString(overallSize));
+               fs.putSingle("maxOverallKeys", Long.toString(maxOverallKeys));
+               fs.putSingle("maxOverallSize", Long.toString(maxOverallSize));
+               fs.putSingle("percentOverallKeysOfMax", 
Double.toString(percentOverallKeysOfMax));
+               fs.putSingle("cachedStoreHits", Long.toString(cachedStoreHits));
+               fs.putSingle("cachedStoreMisses", 
Long.toString(cachedStoreMisses));
+               fs.putSingle("cacheAccesses", Long.toString(cacheAccesses));
+               fs.putSingle("percentCachedStoreHitsOfAccesses", 
Double.toString(percentCachedStoreHitsOfAccesses));
+               fs.putSingle("storeHits", Long.toString(storeHits));
+               fs.putSingle("storeMisses", Long.toString(storeMisses));
+               fs.putSingle("storeAccesses", Long.toString(storeAccesses));
+               fs.putSingle("percentStoreHitsOfAccesses", 
Double.toString(percentStoreHitsOfAccesses));
+               fs.putSingle("overallAccesses", Long.toString(overallAccesses));
+               fs.putSingle("avgStoreAccessRate", 
Double.toString(avgStoreAccessRate));

                Runtime rt = Runtime.getRuntime();
                float freeMemory = (float) rt.freeMemory();
@@ -2010,12 +2022,12 @@
                int threadCount = Thread.activeCount();
                int availableCpus = rt.availableProcessors();

-               fs.put("freeJavaMemory", Long.toString((long)freeMemory));
-               fs.put("usedJavaMemory", Long.toString(usedJavaMem));
-               fs.put("allocatedJavaMemory", Long.toString(allocatedJavaMem));
-               fs.put("maximumJavaMemory", Long.toString(maxJavaMem));
-               fs.put("availableCPUs", Integer.toString(availableCpus));
-               fs.put("runningThreadCount", Integer.toString(threadCount));
+               fs.putSingle("freeJavaMemory", Long.toString((long)freeMemory));
+               fs.putSingle("usedJavaMemory", Long.toString(usedJavaMem));
+               fs.putSingle("allocatedJavaMemory", 
Long.toString(allocatedJavaMem));
+               fs.putSingle("maximumJavaMemory", Long.toString(maxJavaMem));
+               fs.putSingle("availableCPUs", Integer.toString(availableCpus));
+               fs.putSingle("runningThreadCount", 
Integer.toString(threadCount));

                return fs;
        }
@@ -2957,7 +2969,7 @@
                Logger.normal(this, "Received N2NM from 
'"+source.getPeer()+"'");
                SimpleFieldSet fs = null;
                try {
-                       fs = new SimpleFieldSet(new 
String(messageData.getData(), "UTF-8"));
+                       fs = new SimpleFieldSet(new 
String(messageData.getData(), "UTF-8"), false);
                } catch (IOException e) {
                        Logger.error(this, "IOException while parsing node to 
node message data", e);
                        return;
@@ -2965,15 +2977,15 @@
                if(fs.get("type") != null) {
                        fs.removeValue("type");
                }
-               fs.put("type", Integer.toString(type));
+               fs.putOverwrite("type", Integer.toString(type));
                if(fs.get("receivedTime") != null) {
                        fs.removeValue("receivedTime");
                }
-               fs.put("receivedTime", 
Long.toString(System.currentTimeMillis()));
+               fs.putOverwrite("receivedTime", 
Long.toString(System.currentTimeMillis()));
                if(fs.get("receivedAs") != null) {
                        fs.removeValue("receivedAs");
                }
-               fs.put("receivedAs", "nodeToNodeMessage");
+               fs.putOverwrite("receivedAs", "nodeToNodeMessage");
                int fileNumber = source.writeNewExtraPeerDataFile( fs, 
EXTRA_PEER_DATA_TYPE_N2NTM);
                if( fileNumber == -1 ) {
                        Logger.error( this, "Failed to write N2NTM to extra 
peer data file for peer "+source.getPeer());
@@ -3002,12 +3014,12 @@
                String text = (String) 
m.getObject(DMT.NODE_TO_NODE_MESSAGE_TEXT);
                Logger.normal(this, "Received N2NTM from '"+source_nodename+"' 
to '"+target_nodename+"': "+text);
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("type", Integer.toString(type));
-               fs.put("source_nodename", 
Base64.encode(source_nodename.getBytes()));
-               fs.put("target_nodename", 
Base64.encode(target_nodename.getBytes()));
-               fs.put("text", Base64.encode(text.getBytes()));
-               fs.put("receivedTime", 
Long.toString(System.currentTimeMillis()));
-               fs.put("receivedAs", "nodeToNodeTextMessage");
+               fs.putSingle("type", Integer.toString(type));
+               fs.putSingle("source_nodename", 
Base64.encode(source_nodename.getBytes()));
+               fs.putSingle("target_nodename", 
Base64.encode(target_nodename.getBytes()));
+               fs.putSingle("text", Base64.encode(text.getBytes()));
+               fs.putSingle("receivedTime", 
Long.toString(System.currentTimeMillis()));
+               fs.putSingle("receivedAs", "nodeToNodeTextMessage");
                int fileNumber = source.writeNewExtraPeerDataFile( fs, 
EXTRA_PEER_DATA_TYPE_N2NTM);
                if( fileNumber == -1 ) {
                        Logger.error( this, "Failed to write N2NTM to extra 
peer data file for peer "+source.getPeer());

Modified: trunk/freenet/src/freenet/node/NodeStarter.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeStarter.java     2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/node/NodeStarter.java     2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -341,13 +341,13 @@
                configFS.put("fproxy.enabled", false);
                configFS.put("fcp.enabled", false);
                configFS.put("console.enabled", false);
-               configFS.put("pluginmanager.loadplugin", "");
+               configFS.putSingle("pluginmanager.loadplugin", "");
                configFS.put("node.updater.enabled", false);
-               configFS.put("node.tempDir", new File(portDir, 
"temp").toString());
-               configFS.put("node.storeDir", new File(portDir, 
"store").toString());
-               configFS.put("node.persistentTempDir", new File(portDir, 
"persistent").toString());
-               configFS.put("node.throttleFile", new File(portDir, 
"throttle.dat").toString());
-               configFS.put("node.nodeDir", portDir.toString());
+               configFS.putSingle("node.tempDir", new File(portDir, 
"temp").toString());
+               configFS.putSingle("node.storeDir", new File(portDir, 
"store").toString());
+               configFS.putSingle("node.persistentTempDir", new File(portDir, 
"persistent").toString());
+               configFS.putSingle("node.throttleFile", new File(portDir, 
"throttle.dat").toString());
+               configFS.putSingle("node.nodeDir", portDir.toString());
                configFS.put("node.maxHTL", maxHTL);
                configFS.put("node.testingDropPacketsEvery", dropProb);
                configFS.put("node.swapRequestSendInterval", swapInterval);

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java     2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/node/PeerManager.java     2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -105,7 +105,7 @@
             while(true) {
                 // Read a single NodePeer
                 SimpleFieldSet fs;
-                fs = new SimpleFieldSet(br);
+                fs = new SimpleFieldSet(br, false);
                 PeerNode pn;
                 try {
                     pn = new PeerNode(fs, node, true);

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -424,9 +424,9 @@
                                        if(peerCryptoGroup == null) errCause += 
" (No peer crypto group)";
                                        if(peerPubKey == null) errCause += " 
(No peer public key)";
                                        if(failed) errCause += " (VERIFICATION 
FAILED)";
-                                       Logger.error(this, "The integrity of 
the reference has been compromized!"+errCause);
+                                       Logger.error(this, "The integrity of 
the reference has been compromized!"+errCause+" fs was\n"+fs.toOrderedString());
                                        this.isSignatureVerificationSuccessfull 
= false;
-                                       fs.put("sig", signature);
+                                       fs.putSingle("sig", signature);
                                                throw new 
ReferenceSignatureVerificationException("The integrity of the reference has 
been compromized!"+errCause);
                                }else
                                        this.isSignatureVerificationSuccessfull 
= true;
@@ -1660,7 +1660,7 @@
         BufferedReader br = new BufferedReader(isr);
         SimpleFieldSet fs;
         try {
-            fs = new SimpleFieldSet(br);
+            fs = new SimpleFieldSet(br, false);
         } catch (IOException e) {
             Logger.error(this, "Impossible: e", e);
             return;
@@ -1877,31 +1877,31 @@
     public synchronized SimpleFieldSet exportMetadataFieldSet() {
        SimpleFieldSet fs = new SimpleFieldSet();
        if(detectedPeer != null)
-               fs.put("detected.udp", detectedPeer.toString());
+               fs.putSingle("detected.udp", detectedPeer.toString());
        if(lastReceivedPacketTime() > 0)
-               fs.put("timeLastReceivedPacket", 
Long.toString(timeLastReceivedPacket));
+               fs.putSingle("timeLastReceivedPacket", 
Long.toString(timeLastReceivedPacket));
        if(timeLastConnected() > 0)
-               fs.put("timeLastConnected", Long.toString(timeLastConnected));
+               fs.putSingle("timeLastConnected", 
Long.toString(timeLastConnected));
        if(timeLastRoutable() > 0)
-               fs.put("timeLastRoutable", Long.toString(timeLastRoutable));
+               fs.putSingle("timeLastRoutable", 
Long.toString(timeLastRoutable));
        if(getPeerAddedTime() > 0)
-               fs.put("peerAddedTime", Long.toString(peerAddedTime));
+               fs.putSingle("peerAddedTime", Long.toString(peerAddedTime));
        if(neverConnected)
-               fs.put("neverConnected", "true");
+               fs.putSingle("neverConnected", "true");
        if(isDisabled)
-               fs.put("isDisabled", "true");
+               fs.putSingle("isDisabled", "true");
        if(isListenOnly)
-               fs.put("isListenOnly", "true");
+               fs.putSingle("isListenOnly", "true");
        if(isBurstOnly)
-               fs.put("isBurstOnly", "true");
+               fs.putSingle("isBurstOnly", "true");
        if(ignoreSourcePort)
-               fs.put("ignoreSourcePort", "true");
+               fs.putSingle("ignoreSourcePort", "true");
        if(allowLocalAddresses)
-               fs.put("allowLocalAddresses", "true");
+               fs.putSingle("allowLocalAddresses", "true");
        if(hadRoutableConnectionCount > 0)
-               fs.put("hadRoutableConnectionCount", 
Long.toString(hadRoutableConnectionCount));
+               fs.putSingle("hadRoutableConnectionCount", 
Long.toString(hadRoutableConnectionCount));
        if(routableConnectionCheckCount > 0)
-               fs.put("routableConnectionCheckCount", 
Long.toString(routableConnectionCheckCount));
+               fs.putSingle("routableConnectionCheckCount", 
Long.toString(routableConnectionCheckCount));
        return fs;
        }

@@ -1912,24 +1912,24 @@
                SimpleFieldSet fs = new SimpleFieldSet();
                long now = System.currentTimeMillis();
                synchronized(this) {
-                       fs.put("averagePingTime", 
Double.toString(averagePingTime()));
+                       fs.putSingle("averagePingTime", 
Double.toString(averagePingTime()));
                        long idle = now - lastReceivedPacketTime();
                        if(idle > (60 * 1000)) {  // 1 minute
-                               fs.put("idle", Long.toString(idle));
+                               fs.putSingle("idle", Long.toString(idle));
                        }
                        if(peerAddedTime > 1) {
-                               fs.put("peerAddedTime", 
Long.toString(peerAddedTime));
+                               fs.putSingle("peerAddedTime", 
Long.toString(peerAddedTime));
                        }
-                       fs.put("lastRoutingBackoffReason", 
lastRoutingBackoffReason);
-                       fs.put("routingBackoffPercent", 
Double.toString(backedOffPercent.currentValue() * 100));
-                       fs.put("routingBackoff", 
Long.toString((Math.max(routingBackedOffUntil - now, 0))));
-                       fs.put("routingBackoffLength", 
Integer.toString(routingBackoffLength));
-                       fs.put("overloadProbability", 
Double.toString(getPRejected() * 100));
-                       fs.put("percentTimeRoutableConnection", 
Double.toString(getPercentTimeRoutableConnection() * 100));
-                       fs.put("totalBytesIn", Long.toString(totalBytesIn));
-                       fs.put("totalBytesOut", Long.toString(totalBytesOut));
+                       fs.putSingle("lastRoutingBackoffReason", 
lastRoutingBackoffReason);
+                       fs.putSingle("routingBackoffPercent", 
Double.toString(backedOffPercent.currentValue() * 100));
+                       fs.putSingle("routingBackoff", 
Long.toString((Math.max(routingBackedOffUntil - now, 0))));
+                       fs.putSingle("routingBackoffLength", 
Integer.toString(routingBackoffLength));
+                       fs.putSingle("overloadProbability", 
Double.toString(getPRejected() * 100));
+                       fs.putSingle("percentTimeRoutableConnection", 
Double.toString(getPercentTimeRoutableConnection() * 100));
+                       fs.putSingle("totalBytesIn", 
Long.toString(totalBytesIn));
+                       fs.putSingle("totalBytesOut", 
Long.toString(totalBytesOut));
                }
-               fs.put("status", getPeerNodeStatusString());
+               fs.putSingle("status", getPeerNodeStatusString());
                return fs;
        }

@@ -1939,23 +1939,23 @@
     public synchronized SimpleFieldSet exportFieldSet() {
         SimpleFieldSet fs = new SimpleFieldSet();
         if(getLastGoodVersion() != null)
-               fs.put("lastGoodVersion", lastGoodVersion);
+               fs.putSingle("lastGoodVersion", lastGoodVersion);
                for(int i=0;i<nominalPeer.size();i++) {
-                       fs.put("physical.udp", nominalPeer.get(i).toString());
+                       fs.putSingle("physical.udp", 
nominalPeer.get(i).toString());
                }
-        fs.put("identity", getIdentityString());
-        fs.put("location", Double.toString(currentLocation.getValue()));
-        fs.put("testnet", Boolean.toString(testnetEnabled));
-        fs.put("version", version);
-        fs.put("myName", getName());
+        fs.putSingle("identity", getIdentityString());
+        fs.putSingle("location", Double.toString(currentLocation.getValue()));
+        fs.putSingle("testnet", Boolean.toString(testnetEnabled));
+        fs.putSingle("version", version);
+        fs.putSingle("myName", getName());
         if(peerCryptoGroup != null)
                fs.put("dsaGroup", peerCryptoGroup.asFieldSet());
         if(peerPubKey != null)
                fs.put("dsaPubKey", peerPubKey.asFieldSet());
                if(myARK != null) {
                        // Decrement it because we keep the number we would 
like to fetch, not the last one fetched.
-                       fs.put("ark.number", 
Long.toString(myARK.suggestedEdition - 1));
-                       fs.put("ark.pubURI", myARK.getBaseSSK().toString(false, 
false));
+                       fs.putSingle("ark.number", 
Long.toString(myARK.suggestedEdition - 1));
+                       fs.putSingle("ark.pubURI", 
myARK.getBaseSSK().toString(false, false));
                }
         return fs;
     }
@@ -2628,7 +2628,7 @@
                SimpleFieldSet fs = null;
                try {
                        // Read in the single SimpleFieldSet
-                       fs = new SimpleFieldSet(br);
+                       fs = new SimpleFieldSet(br, false);
                } catch (EOFException e3) {
                        // End of file, fine
                } catch (IOException e4) {
@@ -2704,11 +2704,11 @@
                                if(fs.get("senderFileNumber") != null) {
                                        fs.removeValue("senderFileNumber");
                                }
-                               fs.put("senderFileNumber", 
String.valueOf(fileNumber));
+                               fs.putOverwrite("senderFileNumber", 
String.valueOf(fileNumber));
                                if(fs.get("sentTime") != null) {
                                        fs.removeValue("sentTime");
                                }
-                               fs.put("sentTime", 
Long.toString(System.currentTimeMillis()));
+                               fs.putOverwrite("sentTime", 
Long.toString(System.currentTimeMillis()));

                                try {
                                        n2ntm = 
DMT.createNodeToNodeMessage(Node.N2N_TEXT_MESSAGE_TYPE_USERALERT, 
fs.toString().getBytes("UTF-8"));
@@ -2731,7 +2731,7 @@
                        }
                        if(!sendSuccess) {
                                
synchronized(queuedToSendN2NTMExtraPeerDataFileNumbers) {
-                                       fs.put("extraPeerDataType", 
Integer.toString(extraPeerDataType));
+                                       fs.putOverwrite("extraPeerDataType", 
Integer.toString(extraPeerDataType));
                                        fs.removeValue("sentTime");
                                        
queuedToSendN2NTMExtraPeerDataFileNumbers.add(Integer.toString(fileNumber));
                                }
@@ -2745,7 +2745,7 @@
        public int writeNewExtraPeerDataFile(SimpleFieldSet fs, int 
extraPeerDataType) {
                String extraPeerDataDirPath = node.getExtraPeerDataDir();
                if(extraPeerDataType > 0)
-                       fs.put("extraPeerDataType", 
Integer.toString(extraPeerDataType));
+                       fs.putOverwrite("extraPeerDataType", 
Integer.toString(extraPeerDataType));
                File extraPeerDataPeerDir = new 
File(extraPeerDataDirPath+File.separator+getIdentityString());
                if(!extraPeerDataPeerDir.exists()) {
                        if(!extraPeerDataPeerDir.mkdir()) {
@@ -2853,7 +2853,7 @@
        public boolean rewriteExtraPeerDataFile(SimpleFieldSet fs, int 
extraPeerDataType, int fileNumber) {
                String extraPeerDataDirPath = node.getExtraPeerDataDir();
                if(extraPeerDataType > 0)
-                       fs.put("extraPeerDataType", 
Integer.toString(extraPeerDataType));
+                       fs.putOverwrite("extraPeerDataType", 
Integer.toString(extraPeerDataType));
                File extraPeerDataPeerDir = new 
File(extraPeerDataDirPath+File.separator+getIdentityString());
                if(!extraPeerDataPeerDir.exists()) {
                        Logger.error(this, "Extra peer data directory for peer 
does not exist: "+extraPeerDataPeerDir.getPath());
@@ -2904,8 +2904,8 @@
                        localFileNumber = privateDarknetCommentFileNumber;
                }
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("peerNoteType", 
Integer.toString(Node.PEER_NOTE_TYPE_PRIVATE_DARKNET_COMMENT));
-               fs.put("privateDarknetComment", 
Base64.encode(comment.getBytes()));
+               fs.putSingle("peerNoteType", 
Integer.toString(Node.PEER_NOTE_TYPE_PRIVATE_DARKNET_COMMENT));
+               fs.putSingle("privateDarknetComment", 
Base64.encode(comment.getBytes()));
                if(localFileNumber == -1) {
                        localFileNumber = writeNewExtraPeerDataFile(fs, 
Node.EXTRA_PEER_DATA_TYPE_PEER_NOTE);
                        synchronized(privateDarknetComment) {
@@ -2980,7 +2980,7 @@

                SimpleFieldSet fs;
                try {
-                       fs = new SimpleFieldSet(ref);
+                       fs = new SimpleFieldSet(ref, false);
                        if(logMINOR) Logger.minor(this, "Got ARK for "+this);
                        gotARK(fs, edition);
                } catch (IOException e) {

Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2007-02-09 
20:54:57 UTC (rev 11718)
@@ -952,7 +952,7 @@
         SimpleFieldSet fs;
         System.out.println("Connecting to:\r\n"+content);
         try {
-            fs = new SimpleFieldSet(content);
+            fs = new SimpleFieldSet(content, false);
         } catch (IOException e) {
             System.err.println("Did not parse: "+e);
             e.printStackTrace();

Modified: trunk/freenet/src/freenet/node/ThrottleWindowManager.java
===================================================================
--- trunk/freenet/src/freenet/node/ThrottleWindowManager.java   2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/ThrottleWindowManager.java   2007-02-09 
20:54:57 UTC (rev 11718)
@@ -57,7 +57,7 @@

        public SimpleFieldSet exportFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Type", "ThrottleWindowManager");
+               fs.putSingle("Type", "ThrottleWindowManager");
                fs.put("TotalPackets", _totalPackets);
                fs.put("DroppedPackets", _droppedPackets);
                fs.put("SimulatedWindowSize", _simulatedWindowSize);

Modified: trunk/freenet/src/freenet/node/fcp/AddPeer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/AddPeer.java     2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/AddPeer.java     2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -68,7 +68,7 @@
                                throw new 
MessageInvalidException(ProtocolErrorMessage.REF_PARSE_ERROR, "Error parsing 
ref from URL <"+urlString+ '>', null, false);
                        }
                        try {
-                               fs = new SimpleFieldSet(ref.toString());
+                               fs = new SimpleFieldSet(ref.toString(), false);
                        } catch (IOException e) {
                                throw new 
MessageInvalidException(ProtocolErrorMessage.REF_PARSE_ERROR, "Error parsing 
ref from URL <"+urlString+">: "+e.getMessage(), null, false);
                        }
@@ -99,7 +99,7 @@
                                throw new 
MessageInvalidException(ProtocolErrorMessage.REF_PARSE_ERROR, "Error parsing 
ref from file <"+fileString+ '>', null, false);
                        }
                        try {
-                               fs = new SimpleFieldSet(ref.toString());
+                               fs = new SimpleFieldSet(ref.toString(), false);
                        } catch (IOException e) {
                                throw new 
MessageInvalidException(ProtocolErrorMessage.REF_PARSE_ERROR, "Error parsing 
ref from file <"+fileString+">: "+e.getMessage(), null, false);
                        }

Modified: trunk/freenet/src/freenet/node/fcp/AllDataMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/AllDataMessage.java      2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/AllDataMessage.java      2007-02-09 
20:54:57 UTC (rev 11718)
@@ -31,9 +31,9 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("DataLength", Long.toString(dataLength));
-               fs.put("Identifier", identifier);
-               if(global) fs.put("Global", "true");
+               fs.putSingle("DataLength", Long.toString(dataLength));
+               fs.putSingle("Identifier", identifier);
+               if(global) fs.putSingle("Global", "true");
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java   2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java   2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -487,29 +487,29 @@
        // different (it can store detailed state).
        public synchronized SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet(); // we will need 
multi-level later...
-               fs.put("Type", "GET");
-               fs.put("URI", uri.toString(false, false));
-               fs.put("Identifier", identifier);
-               fs.put("Verbosity", Integer.toString(verbosity));
-               fs.put("PriorityClass", Short.toString(priorityClass));
-               fs.put("ReturnType", 
ClientGetMessage.returnTypeString(returnType));
-               fs.put("Persistence", persistenceTypeString(persistenceType));
-               fs.put("ClientName", client.name);
+               fs.putSingle("Type", "GET");
+               fs.putSingle("URI", uri.toString(false, false));
+               fs.putSingle("Identifier", identifier);
+               fs.putSingle("Verbosity", Integer.toString(verbosity));
+               fs.putSingle("PriorityClass", Short.toString(priorityClass));
+               fs.putSingle("ReturnType", 
ClientGetMessage.returnTypeString(returnType));
+               fs.putSingle("Persistence", 
persistenceTypeString(persistenceType));
+               fs.putSingle("ClientName", client.name);
                if(targetFile != null)
-                       fs.put("Filename", targetFile.getPath());
+                       fs.putSingle("Filename", targetFile.getPath());
                if(tempFile != null)
-                       fs.put("TempFilename", tempFile.getPath());
+                       fs.putSingle("TempFilename", tempFile.getPath());
                if(clientToken != null)
-                       fs.put("ClientToken", clientToken);
-               fs.put("IgnoreDS", Boolean.toString(fctx.ignoreStore));
-               fs.put("DSOnly", Boolean.toString(fctx.localRequestOnly));
-               fs.put("MaxRetries", 
Integer.toString(fctx.maxNonSplitfileRetries));
-               fs.put("Finished", Boolean.toString(finished));
-               fs.put("Succeeded", Boolean.toString(succeeded));
+                       fs.putSingle("ClientToken", clientToken);
+               fs.putSingle("IgnoreDS", Boolean.toString(fctx.ignoreStore));
+               fs.putSingle("DSOnly", Boolean.toString(fctx.localRequestOnly));
+               fs.putSingle("MaxRetries", 
Integer.toString(fctx.maxNonSplitfileRetries));
+               fs.putSingle("Finished", Boolean.toString(finished));
+               fs.putSingle("Succeeded", Boolean.toString(succeeded));
                if(finished) {
                        if(succeeded) {
-                               fs.put("FoundDataLength", 
Long.toString(foundDataLength));
-                               fs.put("FoundDataMimeType", foundDataMimeType);
+                               fs.putSingle("FoundDataLength", 
Long.toString(foundDataLength));
+                               fs.putSingle("FoundDataMimeType", 
foundDataMimeType);
                                if(postFetchProtocolErrorMessage != null) {
                                        fs.put("PostFetchProtocolError", 
postFetchProtocolErrorMessage.getFieldSet());
                                }
@@ -523,7 +523,7 @@
                if(returnType == ClientGetMessage.RETURN_TYPE_DIRECT && 
!(succeeded == false && returnBucket == null)) {
                        bucketToFS(fs, "ReturnBucket", false, returnBucket);
                }
-               fs.put("Global", Boolean.toString(client.isGlobalQueue));
+               fs.putSingle("Global", Boolean.toString(client.isGlobalQueue));
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java    2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java    2007-02-09 
20:54:57 UTC (rev 11718)
@@ -187,14 +187,14 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("IgnoreDS", Boolean.toString(ignoreDS));
-               fs.put("URI", uri.toString(false, false));
-               fs.put("Identifier", identifier);
-               fs.put("Verbosity", Integer.toString(verbosity));
-               fs.put("ReturnType", getReturnTypeString());
-               fs.put("MaxSize", Long.toString(maxSize));
-               fs.put("MaxTempSize", Long.toString(maxTempSize));
-               fs.put("MaxRetries", Integer.toString(maxRetries));
+               fs.putSingle("IgnoreDS", Boolean.toString(ignoreDS));
+               fs.putSingle("URI", uri.toString(false, false));
+               fs.putSingle("Identifier", identifier);
+               fs.putSingle("Verbosity", Integer.toString(verbosity));
+               fs.putSingle("ReturnType", getReturnTypeString());
+               fs.putSingle("MaxSize", Long.toString(maxSize));
+               fs.putSingle("MaxTempSize", Long.toString(maxTempSize));
+               fs.putSingle("MaxRetries", Integer.toString(maxRetries));
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/ClientHelloMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientHelloMessage.java  2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientHelloMessage.java  2007-02-09 
20:54:57 UTC (rev 11718)
@@ -30,8 +30,8 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet sfs = new SimpleFieldSet();
-               sfs.put("Name", clientName);
-               sfs.put("ExpectedVersion", clientExpectedVersion);
+               sfs.putSingle("Name", clientName);
+               sfs.putSingle("ExpectedVersion", clientExpectedVersion);
                return sfs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPut.java   2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientPut.java   2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -310,25 +310,25 @@
        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = super.getFieldSet();
                // This is all fixed, so no need for synchronization.
-               fs.put("Metadata.ContentType", clientMetadata.getMIMEType());
-               fs.put("UploadFrom", 
ClientPutMessage.uploadFromString(uploadFrom));
+               fs.putSingle("Metadata.ContentType", 
clientMetadata.getMIMEType());
+               fs.putSingle("UploadFrom", 
ClientPutMessage.uploadFromString(uploadFrom));
                if(uploadFrom == ClientPutMessage.UPLOAD_FROM_DISK) {
-                       fs.put("Filename", origFilename.getPath());
+                       fs.putSingle("Filename", origFilename.getPath());
                } else if(uploadFrom == ClientPutMessage.UPLOAD_FROM_DIRECT) {
                        if(!finished) {
                                // the bucket is a persistent encrypted temp 
bucket
                                bucketToFS(fs, "TempBucket", true, data);
                        }
                } else if(uploadFrom == ClientPutMessage.UPLOAD_FROM_REDIRECT) {
-                       fs.put("TargetURI", targetURI.toString());
+                       fs.putSingle("TargetURI", targetURI.toString());
                }
                if(putter != null)  {
                        SimpleFieldSet sfs = putter.getProgressFieldset();
                        fs.put("progress", sfs);
                }
                if(targetFilename != null)
-                       fs.put("TargetFilename", targetFilename);
-               fs.put("EarlyEncode", Boolean.toString(earlyEncode));
+                       fs.putSingle("TargetFilename", targetFilename);
+               fs.putSingle("EarlyEncode", Boolean.toString(earlyEncode));
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutBase.java       2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutBase.java       2007-02-09 
20:54:57 UTC (rev 11718)
@@ -260,25 +260,25 @@

        public synchronized SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet(); // we will need 
multi-level later...
-               fs.put("Type", getTypeName());
-               fs.put("URI", uri.toString(false, false));
-               fs.put("Identifier", identifier);
-               fs.put("Verbosity", Integer.toString(verbosity));
-               fs.put("PriorityClass", Short.toString(priorityClass));
-               fs.put("Persistence", 
ClientRequest.persistenceTypeString(persistenceType));
-               fs.put("ClientName", client.name);
-               fs.put("ClientToken", clientToken);
-               fs.put("DontCompress", Boolean.toString(ctx.dontCompress));
-               fs.put("MaxRetries", Integer.toString(ctx.maxInsertRetries));
-               fs.put("Finished", Boolean.toString(finished));
-               fs.put("Succeeded", Boolean.toString(succeeded));
-               fs.put("GetCHKOnly", Boolean.toString(getCHKOnly));
+               fs.putSingle("Type", getTypeName());
+               fs.putSingle("URI", uri.toString(false, false));
+               fs.putSingle("Identifier", identifier);
+               fs.putSingle("Verbosity", Integer.toString(verbosity));
+               fs.putSingle("PriorityClass", Short.toString(priorityClass));
+               fs.putSingle("Persistence", 
ClientRequest.persistenceTypeString(persistenceType));
+               fs.putSingle("ClientName", client.name);
+               fs.putSingle("ClientToken", clientToken);
+               fs.putSingle("DontCompress", 
Boolean.toString(ctx.dontCompress));
+               fs.putSingle("MaxRetries", 
Integer.toString(ctx.maxInsertRetries));
+               fs.putSingle("Finished", Boolean.toString(finished));
+               fs.putSingle("Succeeded", Boolean.toString(succeeded));
+               fs.putSingle("GetCHKOnly", Boolean.toString(getCHKOnly));
                if(generatedURI != null)
-                       fs.put("GeneratedURI", generatedURI.toString(false, 
false));
+                       fs.putSingle("GeneratedURI", 
generatedURI.toString(false, false));
                if(finished && (!succeeded))
                        // Should have a putFailedMessage... unless there is a 
race condition.
                        fs.put("PutFailed", 
putFailedMessage.getFieldSet(false));
-               fs.put("Global", Boolean.toString(client.isGlobalQueue));
+               fs.putSingle("Global", Boolean.toString(client.isGlobalQueue));
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDir.java        2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDir.java        2007-02-09 
20:54:57 UTC (rev 11718)
@@ -203,32 +203,32 @@
                // Flatten the hierarchy, it can be reconstructed on restarting.
                // Storing it directly would be a PITA.
                ManifestElement[] elements = 
SimpleManifestPutter.flatten(manifestElements);
-               fs.put("DefaultName", defaultName);
+               fs.putSingle("DefaultName", defaultName);
                for(int i=0;i<elements.length;i++) {
                        String num = Integer.toString(i);
                        ManifestElement e = elements[i];
                        String name = e.getName();
                        String mimeOverride = e.getMimeTypeOverride();
                        SimpleFieldSet subset = new SimpleFieldSet();
-                       subset.put("Name", name);
+                       subset.putSingle("Name", name);
                        if(mimeOverride != null)
-                               subset.put("Metadata.ContentType", 
mimeOverride);
+                               subset.putSingle("Metadata.ContentType", 
mimeOverride);
                        FreenetURI target = e.getTargetURI();
                        if(target != null) {
-                               subset.put("UploadFrom", "redirect");
-                               subset.put("TargetURI", target.toString());
+                               subset.putSingle("UploadFrom", "redirect");
+                               subset.putSingle("TargetURI", 
target.toString());
                        } else {
                                Bucket data = e.getData();
                                // What to do with the bucket?
                                // It is either a persistent encrypted bucket 
or a file bucket ...
-                               subset.put("DataLength", 
Long.toString(e.getSize()));
+                               subset.putSingle("DataLength", 
Long.toString(e.getSize()));
                                if(data instanceof FileBucket) {
-                                       subset.put("UploadFrom", "disk");
-                                       subset.put("Filename", 
((FileBucket)data).getFile().getPath());
+                                       subset.putSingle("UploadFrom", "disk");
+                                       subset.putSingle("Filename", 
((FileBucket)data).getFile().getPath());
                                } else if(finished) {
-                                       subset.put("UploadFrom", "direct");
+                                       subset.putSingle("UploadFrom", 
"direct");
                                } else if(data instanceof 
PaddedEphemerallyEncryptedBucket) {
-                                       subset.put("UploadFrom", "direct");
+                                       subset.putSingle("UploadFrom", 
"direct");
                                        // the bucket is a persistent encrypted 
temp bucket
                                        bucketToFS(fs, "TempBucket", false, 
data);
                                } else {

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDirMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDirMessage.java 2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDirMessage.java 2007-02-09 
20:54:57 UTC (rev 11718)
@@ -119,17 +119,17 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet sfs = new SimpleFieldSet();
-               sfs.put("URI", uri.toString());
-               sfs.put("Identifier", identifier);
-               sfs.put("Verbosity", Integer.toString(verbosity));
-               sfs.put("MaxRetries", Integer.toString(maxRetries));
-               sfs.put("ClientToken", clientToken);
-               sfs.put("GetCHKOnly", Boolean.toString(getCHKOnly));
-               sfs.put("PriorityClass", Short.toString(priorityClass));
-               sfs.put("PersistenceType", 
ClientRequest.persistenceTypeString(persistenceType));
-               sfs.put("DontCompress", Boolean.toString(dontCompress));
-               sfs.put("Global", Boolean.toString(global));
-               sfs.put("DefaultName", defaultName);
+               sfs.putSingle("URI", uri.toString());
+               sfs.putSingle("Identifier", identifier);
+               sfs.putSingle("Verbosity", Integer.toString(verbosity));
+               sfs.putSingle("MaxRetries", Integer.toString(maxRetries));
+               sfs.putSingle("ClientToken", clientToken);
+               sfs.putSingle("GetCHKOnly", Boolean.toString(getCHKOnly));
+               sfs.putSingle("PriorityClass", Short.toString(priorityClass));
+               sfs.putSingle("PersistenceType", 
ClientRequest.persistenceTypeString(persistenceType));
+               sfs.putSingle("DontCompress", Boolean.toString(dontCompress));
+               sfs.putSingle("Global", Boolean.toString(global));
+               sfs.putSingle("DefaultName", defaultName);
                return sfs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java    2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java    2007-02-09 
20:54:57 UTC (rev 11718)
@@ -195,28 +195,28 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet sfs = new SimpleFieldSet();
-               sfs.put("URI", uri.toString());
-               sfs.put("Identifier", identifier);
-               sfs.put("Verbosity", Integer.toString(verbosity));
-               sfs.put("MaxRetries", Integer.toString(maxRetries));
-               sfs.put("Metadata.ContentType", contentType);
-               sfs.put("ClientToken", clientToken);
+               sfs.putSingle("URI", uri.toString());
+               sfs.putSingle("Identifier", identifier);
+               sfs.putSingle("Verbosity", Integer.toString(verbosity));
+               sfs.putSingle("MaxRetries", Integer.toString(maxRetries));
+               sfs.putSingle("Metadata.ContentType", contentType);
+               sfs.putSingle("ClientToken", clientToken);
                if(uploadFromType == UPLOAD_FROM_DIRECT) {
-                       sfs.put("UploadFrom", "direct");
-                       sfs.put("DataLength", Long.toString(dataLength));
+                       sfs.putSingle("UploadFrom", "direct");
+                       sfs.putSingle("DataLength", Long.toString(dataLength));
                } else if(uploadFromType == UPLOAD_FROM_DISK) {
-                       sfs.put("UploadFrom", "disk");
-                       sfs.put("Filename", origFilename.getAbsolutePath());
-                       sfs.put("DataLength", Long.toString(dataLength));
+                       sfs.putSingle("UploadFrom", "disk");
+                       sfs.putSingle("Filename", 
origFilename.getAbsolutePath());
+                       sfs.putSingle("DataLength", Long.toString(dataLength));
                } else if(uploadFromType == UPLOAD_FROM_REDIRECT) {
-                       sfs.put("UploadFrom", "redirect");
-                       sfs.put("TargetURI", redirectTarget.toString());
+                       sfs.putSingle("UploadFrom", "redirect");
+                       sfs.putSingle("TargetURI", redirectTarget.toString());
                }
-               sfs.put("GetCHKOnly", Boolean.toString(getCHKOnly));
-               sfs.put("PriorityClass", Short.toString(priorityClass));
-               sfs.put("PersistenceType", 
ClientRequest.persistenceTypeString(persistenceType));
-               sfs.put("DontCompress", Boolean.toString(dontCompress));
-               sfs.put("Global", Boolean.toString(global));
+               sfs.putSingle("GetCHKOnly", Boolean.toString(getCHKOnly));
+               sfs.putSingle("PriorityClass", Short.toString(priorityClass));
+               sfs.putSingle("PersistenceType", 
ClientRequest.persistenceTypeString(persistenceType));
+               sfs.putSingle("DontCompress", Boolean.toString(dontCompress));
+               sfs.putSingle("Global", Boolean.toString(global));
                return sfs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientRequest.java       2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientRequest.java       2007-02-09 
20:54:57 UTC (rev 11718)
@@ -136,7 +136,7 @@
        }

        public static ClientRequest readAndRegister(BufferedReader br, 
FCPServer server) throws IOException {
-               SimpleFieldSet fs = new SimpleFieldSet(br);
+               SimpleFieldSet fs = new SimpleFieldSet(br, false);
                String clientName = fs.get("ClientName");
                boolean isGlobal = Fields.stringToBool(fs.get("Global"), false);
                if(clientName == null && !isGlobal) {

Modified: trunk/freenet/src/freenet/node/fcp/DataFoundMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/DataFoundMessage.java    2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/DataFoundMessage.java    2007-02-09 
20:54:57 UTC (rev 11718)
@@ -30,10 +30,10 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
-               if(global) fs.put("Global", "true");
-               fs.put("Metadata.ContentType", mimeType);
-               fs.put("DataLength", Long.toString(dataLength));
+               fs.putSingle("Identifier", identifier);
+               if(global) fs.putSingle("Global", "true");
+               fs.putSingle("Metadata.ContentType", mimeType);
+               fs.putSingle("DataLength", Long.toString(dataLength));
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/EndListPeerNotesMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/EndListPeerNotesMessage.java     
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/EndListPeerNotesMessage.java     
2007-02-09 20:54:57 UTC (rev 11718)
@@ -17,7 +17,7 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet sfs = new SimpleFieldSet();
-               sfs.put("NodeIdentifier", nodeIdentifier);
+               sfs.putSingle("NodeIdentifier", nodeIdentifier);
                return sfs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/FCPConnectionInputHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPConnectionInputHandler.java   
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/FCPConnectionInputHandler.java   
2007-02-09 20:54:57 UTC (rev 11718)
@@ -53,7 +53,7 @@
                                return;
                        }
                        if(messageType.equals("")) continue;
-                       fs = new SimpleFieldSet(lis, 4096, 128, true, true);
+                       fs = new SimpleFieldSet(lis, 4096, 128, true, true, 
true);
                        FCPMessage msg;
                        try {
                                msg = FCPMessage.create(messageType, fs, 
handler.bf, handler.server.core.persistentTempBucketFactory);

Modified: trunk/freenet/src/freenet/node/fcp/FinishedCompressionMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FinishedCompressionMessage.java  
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/FinishedCompressionMessage.java  
2007-02-09 20:54:57 UTC (rev 11718)
@@ -25,11 +25,11 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
-               fs.put("Codec", Integer.toString(codec));
-               fs.put("OriginalSize", Long.toString(origSize));
-               fs.put("CompressedSize", Long.toString(compressedSize));
-               if(global) fs.put("Global", "true");
+               fs.putSingle("Identifier", identifier);
+               fs.putSingle("Codec", Integer.toString(codec));
+               fs.putSingle("OriginalSize", Long.toString(origSize));
+               fs.putSingle("CompressedSize", Long.toString(compressedSize));
+               if(global) fs.putSingle("Global", "true");
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/GetFailedMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/GetFailedMessage.java    2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/GetFailedMessage.java    2007-02-09 
20:54:57 UTC (rev 11718)
@@ -101,28 +101,28 @@
         */
        public SimpleFieldSet getFieldSet(boolean verbose) {
                SimpleFieldSet sfs = new SimpleFieldSet();
-               sfs.put("Code", Integer.toString(code));
+               sfs.putSingle("Code", Integer.toString(code));
                if(verbose)
-                       sfs.put("CodeDescription", codeDescription);
+                       sfs.putSingle("CodeDescription", codeDescription);
                if(extraDescription != null)
-                       sfs.put("ExtraDescription", extraDescription);
+                       sfs.putSingle("ExtraDescription", extraDescription);
                if(verbose)
-                       sfs.put("Fatal", Boolean.toString(isFatal));
+                       sfs.putSingle("Fatal", Boolean.toString(isFatal));
                if(tracker != null) {
-                       tracker.copyToFieldSet(sfs, "Errors.", verbose);
+                       sfs.put("Errors", tracker.toFieldSet(verbose));
                }
                if(verbose)
-                       sfs.put("ShortCodeDescription", shortCodeDescription);
-               sfs.put("Identifier", identifier);
+                       sfs.putSingle("ShortCodeDescription", 
shortCodeDescription);
+               sfs.putSingle("Identifier", identifier);
                if(expectedDataLength > -1) {
-                       sfs.put("ExpectedDataLength", 
Long.toString(expectedDataLength));
+                       sfs.putSingle("ExpectedDataLength", 
Long.toString(expectedDataLength));
                }
                if(expectedMimeType != null)
-                       sfs.put("ExpectedMetadata.ContentType", 
expectedMimeType);
+                       sfs.putSingle("ExpectedMetadata.ContentType", 
expectedMimeType);
                if(finalizedExpected)
-                       sfs.put("FinalizedExpected", "true");
+                       sfs.putSingle("FinalizedExpected", "true");
                if(redirectURI != null)
-                       sfs.put("RedirectURI", redirectURI.toString(false, 
false));
+                       sfs.putSingle("RedirectURI", 
redirectURI.toString(false, false));
                return sfs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/GetRequestStatusMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/GetRequestStatusMessage.java     
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/GetRequestStatusMessage.java     
2007-02-09 20:54:57 UTC (rev 11718)
@@ -22,7 +22,7 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
+               fs.putSingle("Identifier", identifier);
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/IdentifierCollisionMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/IdentifierCollisionMessage.java  
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/IdentifierCollisionMessage.java  
2007-02-09 20:54:57 UTC (rev 11718)
@@ -18,8 +18,8 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet sfs = new SimpleFieldSet();
-               sfs.put("Identifier", identifier);
-               if(global) sfs.put("Global", "true");
+               sfs.putSingle("Identifier", identifier);
+               if(global) sfs.putSingle("Global", "true");
                return sfs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java     
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java     
2007-02-09 20:54:57 UTC (rev 11718)
@@ -52,11 +52,11 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
-               fs.put("Global", Boolean.toString(global));
-               fs.put("PriorityClass", Short.toString(priorityClass));
+               fs.putSingle("Identifier", identifier);
+               fs.putSingle("Global", Boolean.toString(global));
+               fs.putSingle("PriorityClass", Short.toString(priorityClass));
                if(clientToken != null)
-                       fs.put("ClientToken", clientToken);
+                       fs.putSingle("ClientToken", clientToken);
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java    2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java    2007-02-09 
20:54:57 UTC (rev 11718)
@@ -62,15 +62,15 @@
        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet sfs = new SimpleFieldSet();
                // FIXME
-               sfs.put("FCPVersion", "2.0");
-               sfs.put("Node", "Fred");
-               sfs.put("Version", Version.getVersionString());
+               sfs.putSingle("FCPVersion", "2.0");
+               sfs.putSingle("Node", "Fred");
+               sfs.putSingle("Version", Version.getVersionString());
                sfs.put("Build", Version.buildNumber());
-               sfs.put("Revision", Version.cvsRevision);
+               sfs.putSingle("Revision", Version.cvsRevision);
                sfs.put("ExtBuild", NodeStarter.extBuildNumber);
-               sfs.put("ExtRevision", NodeStarter.extRevisionNumber);
-               sfs.put("Testnet", Boolean.toString(node == null ? false : 
node.isTestnetEnabled()));
-               sfs.put("CompressionCodecs", 
Integer.toString(Compressor.countCompressAlgorithms()));
+               sfs.putSingle("ExtRevision", NodeStarter.extRevisionNumber);
+               sfs.putSingle("Testnet", Boolean.toString(node == null ? false 
: node.isTestnetEnabled()));
+               sfs.putSingle("CompressionCodecs", 
Integer.toString(Compressor.countCompressAlgorithms()));
                return sfs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/PeerNote.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PeerNote.java    2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PeerNote.java    2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -22,9 +22,9 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("NodeIdentifier", nodeIdentifier);
-               fs.put("PeerNoteType", Integer.toString(peerNoteType));
-               fs.put("NoteText", Base64.encode(noteText.getBytes(), true));
+               fs.putSingle("NodeIdentifier", nodeIdentifier);
+               fs.putSingle("PeerNoteType", Integer.toString(peerNoteType));
+               fs.putSingle("NoteText", Base64.encode(noteText.getBytes(), 
true));
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/PeerRemoved.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PeerRemoved.java 2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PeerRemoved.java 2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -19,8 +19,8 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identity", identity);
-               fs.put("NodeIdentifier", nodeIdentifier);
+               fs.putSingle("Identity", identity);
+               fs.putSingle("NodeIdentifier", nodeIdentifier);
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/PersistentGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentGet.java       2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PersistentGet.java       2007-02-09 
20:54:57 UTC (rev 11718)
@@ -50,18 +50,18 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
-               fs.put("URI", uri.toString(false, false));
+               fs.putSingle("Identifier", identifier);
+               fs.putSingle("URI", uri.toString(false, false));
                fs.put("Verbosity", verbosity);
-               fs.put("ReturnType", 
ClientGetMessage.returnTypeString(returnType));
-               fs.put("PersistenceType", 
ClientRequest.persistenceTypeString(persistenceType));
+               fs.putSingle("ReturnType", 
ClientGetMessage.returnTypeString(returnType));
+               fs.putSingle("PersistenceType", 
ClientRequest.persistenceTypeString(persistenceType));
                if(returnType == ClientGetMessage.RETURN_TYPE_DISK) {
-                       fs.put("Filename", targetFile.getAbsolutePath());
-                       fs.put("TempFilename", tempFile.getAbsolutePath());
+                       fs.putSingle("Filename", targetFile.getAbsolutePath());
+                       fs.putSingle("TempFilename", 
tempFile.getAbsolutePath());
                }
                fs.put("PriorityClass", priorityClass);
                if(clientToken != null)
-                       fs.put("ClientToken", clientToken);
+                       fs.putSingle("ClientToken", clientToken);
                fs.put("Global", global);
                fs.put("Started", started);
                fs.put("MaxRetries", maxRetries);

Modified: trunk/freenet/src/freenet/node/fcp/PersistentPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentPut.java       2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PersistentPut.java       2007-02-09 
20:54:57 UTC (rev 11718)
@@ -52,27 +52,27 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
-               fs.put("URI", uri.toString(false, false));
+               fs.putSingle("Identifier", identifier);
+               fs.putSingle("URI", uri.toString(false, false));
                fs.put("Verbosity", verbosity);
                fs.put("PriorityClass", priorityClass);
-               fs.put("UploadFrom", 
ClientPutMessage.uploadFromString(uploadFrom));
-               fs.put("Persistence", 
ClientRequest.persistenceTypeString(persistenceType));
+               fs.putSingle("UploadFrom", 
ClientPutMessage.uploadFromString(uploadFrom));
+               fs.putSingle("Persistence", 
ClientRequest.persistenceTypeString(persistenceType));
                if(origFilename != null)
-                       fs.put("Filename", origFilename.getAbsolutePath());
+                       fs.putSingle("Filename", 
origFilename.getAbsolutePath());
                if(targetURI != null)
-                       fs.put("TargetURI", targetURI.toString());
+                       fs.putSingle("TargetURI", targetURI.toString());
                if(mimeType != null)
-                       fs.put("Metadata.ContentType", mimeType);
+                       fs.putSingle("Metadata.ContentType", mimeType);
                fs.put("Global", global);
                if(size != -1)
                        fs.put("DataLength", size);
                if(token != null)
-                       fs.put("ClientToken", token);
+                       fs.putSingle("ClientToken", token);
                fs.put("Started", started);
                fs.put("MaxRetries", maxRetries);
                if(targetFilename != null)
-                       fs.put("TargetFilename", targetFilename);
+                       fs.putSingle("TargetFilename", targetFilename);
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java    2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java    2007-02-09 
20:54:57 UTC (rev 11718)
@@ -48,39 +48,39 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
-               fs.put("URI", uri.toString(false, false));
-               fs.put("Verbosity", Integer.toString(verbosity));
-               fs.put("Persistence", 
ClientRequest.persistenceTypeString(persistenceType));
-               fs.put("PriorityClass", Short.toString(priorityClass));
-               fs.put("Global", Boolean.toString(global));
+               fs.putSingle("Identifier", identifier);
+               fs.putSingle("URI", uri.toString(false, false));
+               fs.put("Verbosity", verbosity);
+               fs.putSingle("Persistence", 
ClientRequest.persistenceTypeString(persistenceType));
+               fs.put("PriorityClass", priorityClass);
+               fs.putSingle("Global", Boolean.toString(global));
                SimpleFieldSet files = new SimpleFieldSet();
                // Flatten the hierarchy, it can be reconstructed on restarting.
                // Storing it directly would be a PITA.
                ManifestElement[] elements = 
SimpleManifestPutter.flatten(manifestElements);
-               fs.put("DefaultName", defaultName);
+               fs.putSingle("DefaultName", defaultName);
                for(int i=0;i<elements.length;i++) {
                        String num = Integer.toString(i);
                        ManifestElement e = elements[i];
                        String mimeOverride = e.getMimeTypeOverride();
                        SimpleFieldSet subset = new SimpleFieldSet();
                        FreenetURI tempURI = e.getTargetURI();
-                       subset.put("Name", e.getName());
+                       subset.putSingle("Name", e.getName());
                        if(tempURI != null) {
-                               subset.put("UploadFrom", "redirect");
-                               subset.put("TargetURI", tempURI.toString());
+                               subset.putSingle("UploadFrom", "redirect");
+                               subset.putSingle("TargetURI", 
tempURI.toString());
                        } else {
                                Bucket data = e.getData();
-                               subset.put("DataLength", 
Long.toString(e.getSize()));
+                               subset.put("DataLength", e.getSize());
                                if(mimeOverride != null)
-                                       subset.put("Metadata.ContentType", 
mimeOverride);
+                                       
subset.putSingle("Metadata.ContentType", mimeOverride);
                                // What to do with the bucket?
                                // It is either a persistent encrypted bucket 
or a file bucket ...
                                if(data instanceof FileBucket) {
-                                       subset.put("UploadFrom", "disk");
-                                       subset.put("Filename", 
((FileBucket)data).getFile().getPath());
+                                       subset.putSingle("UploadFrom", "disk");
+                                       subset.putSingle("Filename", 
((FileBucket)data).getFile().getPath());
                                } else if((data instanceof 
PaddedEphemerallyEncryptedBucket) || (data == null)) {
-                                       subset.put("UploadFrom", "direct");
+                                       subset.putSingle("UploadFrom", 
"direct");
                                } else {
                                        throw new IllegalStateException("Don't 
know what to do with bucket: "+data);
                                }
@@ -89,8 +89,8 @@
                }
                fs.put("Files", files);
                if(token != null)
-                       fs.put("ClientToken", token);
-               fs.put("Started", Boolean.toString(started));
+                       fs.putSingle("ClientToken", token);
+               fs.put("Started", started);
                fs.put("MaxRetries", maxRetries);
                return fs;
        }

Modified: 
trunk/freenet/src/freenet/node/fcp/PersistentRequestRemovedMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentRequestRemovedMessage.java     
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PersistentRequestRemovedMessage.java     
2007-02-09 20:54:57 UTC (rev 11718)
@@ -21,8 +21,8 @@

     public SimpleFieldSet getFieldSet() {
         SimpleFieldSet fs = new SimpleFieldSet();
-        fs.put("Identifier", ident);
-        if(global) fs.put("Global", "true");
+        fs.putSingle("Identifier", ident);
+        if(global) fs.putSingle("Global", "true");
         return fs;
     }


Modified: trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java        
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java        
2007-02-09 20:54:57 UTC (rev 11718)
@@ -125,14 +125,14 @@
        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet sfs = new SimpleFieldSet();
                if(ident != null)
-                       sfs.put("Identifier", ident);
-               sfs.put("Code", Integer.toString(code));
-               sfs.put("CodeDescription", codeDescription());
+                       sfs.putSingle("Identifier", ident);
+               sfs.put("Code", code);
+               sfs.putSingle("CodeDescription", codeDescription());
                if(extra != null)
-                       sfs.put("ExtraDescription", extra);
-               sfs.put("Fatal", Boolean.toString(fatal));
+                       sfs.putSingle("ExtraDescription", extra);
+               sfs.put("Fatal", fatal);
                if(global)
-                       sfs.put("Global", "true");
+                       sfs.putSingle("Global", "true");
                return sfs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/PutFailedMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PutFailedMessage.java    2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PutFailedMessage.java    2007-02-09 
20:54:57 UTC (rev 11718)
@@ -80,22 +80,22 @@

        public SimpleFieldSet getFieldSet(boolean verbose) {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
-               if(global) fs.put("Global", "true");
-               fs.put("Code", Integer.toString(code));
+               fs.putSingle("Identifier", identifier);
+               if(global) fs.putSingle("Global", "true");
+               fs.put("Code", code);
                if(verbose)
-                       fs.put("CodeDescription", codeDescription);
+                       fs.putSingle("CodeDescription", codeDescription);
                if(extraDescription != null)
-                       fs.put("ExtraDescription", extraDescription);
+                       fs.putSingle("ExtraDescription", extraDescription);
                if(tracker != null) {
-                       tracker.copyToFieldSet(fs, "Errors.", verbose);
+                       fs.put("Errors", tracker.toFieldSet(verbose));
                }
                if(verbose)
-                       fs.put("Fatal", Boolean.toString(isFatal));
+                       fs.put("Fatal", isFatal);
                if(verbose)
-                       fs.put("ShortCodeDescription", shortCodeDescription);
+                       fs.putSingle("ShortCodeDescription", 
shortCodeDescription);
                if(expectedURI != null)
-                       fs.put("ExpectedURI", expectedURI.toString());
+                       fs.putSingle("ExpectedURI", expectedURI.toString());
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java 2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java 2007-02-09 
20:54:57 UTC (rev 11718)
@@ -21,10 +21,10 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
-               if(global) fs.put("Global", "true");
+               fs.putSingle("Identifier", identifier);
+               if(global) fs.putSingle("Global", "true");
                if(uri != null)
-                       fs.put("URI", uri.toString(false, false));
+                       fs.putSingle("URI", uri.toString(false, false));
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/PutSuccessfulMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PutSuccessfulMessage.java        
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PutSuccessfulMessage.java        
2007-02-09 20:54:57 UTC (rev 11718)
@@ -21,11 +21,11 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
-               if(global) fs.put("Global", "true");
+               fs.putSingle("Identifier", identifier);
+               if(global) fs.putSingle("Global", "true");
                // FIXME debug and remove!
                if(uri != null)
-                       fs.put("URI", uri.toString());
+                       fs.putSingle("URI", uri.toString());
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java     
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java     
2007-02-09 20:54:57 UTC (rev 11718)
@@ -25,7 +25,7 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
+               fs.putSingle("Identifier", identifier);
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/SSKKeypairMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/SSKKeypairMessage.java   2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/SSKKeypairMessage.java   2007-02-09 
20:54:57 UTC (rev 11718)
@@ -21,10 +21,10 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet sfs = new SimpleFieldSet();
-               sfs.put("InsertURI", insertURI.toString());
-               sfs.put("RequestURI", requestURI.toString());
+               sfs.putSingle("InsertURI", insertURI.toString());
+               sfs.putSingle("RequestURI", requestURI.toString());
                if(identifier != null) // is optional on these two only
-                       sfs.put("Identifier", identifier);
+                       sfs.putSingle("Identifier", identifier);
                return sfs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java       
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java       
2007-02-09 20:54:57 UTC (rev 11718)
@@ -21,14 +21,14 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Total", Integer.toString(event.totalBlocks));
-               fs.put("Required", Integer.toString(event.minSuccessfulBlocks));
-               fs.put("Failed", Integer.toString(event.failedBlocks));
-               fs.put("FatallyFailed", 
Integer.toString(event.fatallyFailedBlocks));
-               fs.put("Succeeded",Integer.toString(event.fetchedBlocks));
-               fs.put("FinalizedTotal", 
Boolean.toString(event.finalizedTotal));
-               fs.put("Identifier", ident);
-               if(global) fs.put("Global", "true");
+               fs.put("Total", event.totalBlocks);
+               fs.put("Required", event.minSuccessfulBlocks);
+               fs.put("Failed", event.failedBlocks);
+               fs.put("FatallyFailed", event.fatallyFailedBlocks);
+               fs.put("Succeeded",event.fetchedBlocks);
+               fs.put("FinalizedTotal", event.finalizedTotal);
+               fs.putSingle("Identifier", ident);
+               if(global) fs.putSingle("Global", "true");
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/StartedCompressionMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/StartedCompressionMessage.java   
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/StartedCompressionMessage.java   
2007-02-09 20:54:57 UTC (rev 11718)
@@ -21,9 +21,9 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
-               fs.put("Codec", Integer.toString(codec));
-               if(global) fs.put("Global", "true");
+               fs.putSingle("Identifier", identifier);
+               fs.put("Codec", codec);
+               if(global) fs.putSingle("Global", "true");
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java 2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java 2007-02-09 
20:54:57 UTC (rev 11718)
@@ -48,8 +48,8 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("URI", key.getURI().toString());
-               fs.put("DontPoll", Boolean.toString(dontPoll));
+               fs.putSingle("URI", key.getURI().toString());
+               fs.put("DontPoll", dontPoll);
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/SubscribedUSKUpdate.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/SubscribedUSKUpdate.java 2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/SubscribedUSKUpdate.java 2007-02-09 
20:54:57 UTC (rev 11718)
@@ -23,9 +23,9 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Identifier", identifier);
-               fs.put("Edition", Long.toString(edition));
-               fs.put("URI", key.getURI().toString());
+               fs.putSingle("Identifier", identifier);
+               fs.put("Edition", edition);
+               fs.putSingle("URI", key.getURI().toString());
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/URIGeneratedMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/URIGeneratedMessage.java 2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/URIGeneratedMessage.java 2007-02-09 
20:54:57 UTC (rev 11718)
@@ -19,8 +19,8 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("URI", uri.toString());
-               fs.put("Identifier", identifier);
+               fs.putSingle("URI", uri.toString());
+               fs.putSingle("Identifier", identifier);
                return fs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/UnknownNodeIdentifierMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/UnknownNodeIdentifierMessage.java        
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/UnknownNodeIdentifierMessage.java        
2007-02-09 20:54:57 UTC (rev 11718)
@@ -16,7 +16,7 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet sfs = new SimpleFieldSet();
-               sfs.put("NodeIdentifier", nodeIdentifier);
+               sfs.putSingle("NodeIdentifier", nodeIdentifier);
                return sfs;
        }


Modified: trunk/freenet/src/freenet/node/fcp/WatchGlobal.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/WatchGlobal.java 2007-02-09 19:47:51 UTC 
(rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/WatchGlobal.java 2007-02-09 20:54:57 UTC 
(rev 11718)
@@ -28,8 +28,8 @@

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Enabled", Boolean.toString(enabled));
-               fs.put("VerbosityMask", Integer.toString(verbosityMask));
+               fs.put("Enabled", enabled);
+               fs.put("VerbosityMask", verbosityMask);
                return fs;
        }


Modified: trunk/freenet/src/freenet/support/SimpleFieldSet.java
===================================================================
--- trunk/freenet/src/freenet/support/SimpleFieldSet.java       2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/SimpleFieldSet.java       2007-02-09 
20:54:57 UTC (rev 11718)
@@ -32,10 +32,18 @@
     private String endMarker;
     static public final char MULTI_LEVEL_CHAR = '.';

-    public SimpleFieldSet(BufferedReader br) throws IOException {
+    /**
+     * Construct a SimpleFieldSet from reading a BufferedReader.
+     * @param br
+     * @param allowMultiple If true, multiple lines with the same field name 
will be
+     * combined; if false, the constructor will throw.
+     * @throws IOException If the buffer could not be read, or if there was a 
formatting
+     * problem.
+     */
+    public SimpleFieldSet(BufferedReader br, boolean allowMultiple) throws 
IOException {
         values = new HashMap();
                subsets = null;
-        read(br);
+        read(br, allowMultiple);
     }

     public SimpleFieldSet(SimpleFieldSet sfs){
@@ -44,10 +52,10 @@
        endMarker = sfs.endMarker;
     }

-    public SimpleFieldSet(LineReader lis, int maxLineLength, int 
lineBufferSize, boolean tolerant, boolean utf8OrIso88591) throws IOException {
+    public SimpleFieldSet(LineReader lis, int maxLineLength, int 
lineBufferSize, boolean tolerant, boolean utf8OrIso88591, boolean 
allowMultiple) throws IOException {
        values = new HashMap();
                subsets = null;
-       read(lis, maxLineLength, lineBufferSize, tolerant, utf8OrIso88591);
+       read(lis, maxLineLength, lineBufferSize, tolerant, utf8OrIso88591, 
allowMultiple);
     }

     /**
@@ -62,12 +70,12 @@
      * Construct from a string.
      * @throws IOException if the string is too short or invalid.
      */
-    public SimpleFieldSet(String content) throws IOException {
+    public SimpleFieldSet(String content, boolean allowMultiple) throws 
IOException {
        values = new HashMap();
        subsets = null;
         StringReader sr = new StringReader(content);
         BufferedReader br = new BufferedReader(sr);
-           read(br);
+           read(br, allowMultiple);
     }

     /**
@@ -76,8 +84,9 @@
      * blah=blah
      * blah=blah
      * End
+     * @param allowMultiple 
      */
-    private void read(BufferedReader br) throws IOException {
+    private void read(BufferedReader br, boolean allowMultiple) throws 
IOException {
         boolean firstLine = true;
         while(true) {
             String line = br.readLine();
@@ -91,7 +100,7 @@
                 // Mapping
                 String before = line.substring(0, index);
                 String after = line.substring(index+1);
-                put(before, after);
+                put(before, after, allowMultiple, false);
             } else {
                endMarker = line;
                return;
@@ -108,7 +117,7 @@
      * End
      * @param utfOrIso88591 If true, read as UTF-8, otherwise read as 
ISO-8859-1.
      */
-    private void read(LineReader br, int maxLength, int bufferSize, boolean 
tolerant, boolean utfOrIso88591) throws IOException {
+    private void read(LineReader br, int maxLength, int bufferSize, boolean 
tolerant, boolean utfOrIso88591, boolean allowMultiple) throws IOException {
         boolean firstLine = true;
         while(true) {
             String line = br.readLine(maxLength, bufferSize, utfOrIso88591);
@@ -127,7 +136,7 @@
                 // Mapping
                 String before = line.substring(0, index);
                 String after = line.substring(index+1);
-                put(before, after);
+                put(before, after, allowMultiple, false);
             } else {
                endMarker = line;
                return;
@@ -175,15 +184,54 @@
 //     return (String[]) v.toArray();
        }

-       public synchronized void put(String key, String value) {
+    /**
+     * Set a key to a value. If the value already exists, throw 
IllegalStateException.
+     * @param key The key.
+     * @param value The value.
+     */
+    public void putSingle(String key, String value) {
+       if(!put(key, value, false, false))
+               throw new IllegalStateException("Value already exists: 
"+value+" but want to set "+key+" to "+value);
+    }
+    
+    /**
+     * Aggregating put. Set a key to a value, if the value already exists, 
append to it. 
+     * @param key The key.
+     * @param value The value.
+     */
+    public void putAppend(String key, String value) {
+       put(key, value, true, false);
+    }
+    
+    /**
+     * Set a key to a value, overwriting any existing value if present.
+     * @param key The key.
+     * @param value The value.
+     */
+    public void putOverwrite(String key, String value) {
+       put(key, value, false, true);
+    }
+    
+    /**
+     * Set a key to a value.
+     * @param key The key.
+     * @param value The value.
+     * @param allowMultiple If true, if the key already exists then the value 
will be
+     * appended to the existing value. If false, we return false to indicate 
that the
+     * old value is unchanged.
+     * @return True unless allowMultiple was false and there was a 
pre-existing value,
+     * or value was null.
+     */
+       private synchronized final boolean put(String key, String value, 
boolean allowMultiple, boolean overwrite) {
                int idx;
-               if(value == null) return;
+               if(value == null) return false;
                if((idx = key.indexOf(MULTI_LEVEL_CHAR)) == -1) {
                        String x = (String) values.get(key);

-                       if(x == null) {
+                       if(x == null || overwrite) {
                                values.put(key, value);
                        } else {
+                               if(!allowMultiple) return false;
                                values.put(key, ((String)values.get(key))+ ';' 
+value);
                        }
                } else {
@@ -197,32 +245,33 @@
                                fs = new SimpleFieldSet();
                                subsets.put(before, fs);
                        }
-                       fs.put(after, value);
+                       fs.put(after, value, allowMultiple, overwrite);
                }
+               return true;
     }

        public void put(String key, int value) {
-               put(key, Integer.toString(value));
+               put(key, Integer.toString(value), false, false);
        }

        public void put(String key, long value) {
-               put(key, Long.toString(value));
+               put(key, Long.toString(value), false, false);
        }

        public void put(String key, short value) {
-               put(key, Short.toString(value));
+               put(key, Short.toString(value), false, false);
        }

        public void put(String key, char c) {
-               put(key, ""+c);
+               put(key, ""+c, false, false);
        }

        public void put(String key, boolean b) {
-               put(key, Boolean.toString(b));
+               put(key, Boolean.toString(b), false, false);
        }

        public void put(String key, double windowSize) {
-               put(key, Double.toString(windowSize));
+               put(key, Double.toString(windowSize), false, false);
        }

     /**
@@ -476,7 +525,7 @@
                return (String[]) subsets.keySet().toArray(new 
String[subsets.size()]);
        }

-       public static SimpleFieldSet readFrom(File f) throws IOException {
+       public static SimpleFieldSet readFrom(File f, boolean allowMultiple) 
throws IOException {
                FileInputStream fis = null;
                try {
                        fis = new FileInputStream(f);
@@ -490,7 +539,7 @@
                                return null;
                        }
                        BufferedReader br = new BufferedReader(isr);
-                       SimpleFieldSet fs = new SimpleFieldSet(br);
+                       SimpleFieldSet fs = new SimpleFieldSet(br, 
allowMultiple);
                        br.close();
                        fis = null;
                        return fs;

Modified: trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java 2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java 2007-02-09 
20:54:57 UTC (rev 11718)
@@ -73,7 +73,7 @@
                        return null;
                }
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Type", "DelayedFreeBucket");
+               fs.putSingle("Type", "DelayedFreeBucket");
                if(bucket instanceof SerializableToFieldSetBucket) {
                        fs.put("Underlying", 
((SerializableToFieldSetBucket)bucket).toFieldSet());
                } else {

Modified: trunk/freenet/src/freenet/support/io/FileBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/FileBucket.java        2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/FileBucket.java        2007-02-09 
20:54:57 UTC (rev 11718)
@@ -349,8 +349,8 @@
        public synchronized SimpleFieldSet toFieldSet() {
                if(deleteOnFinalize) return null;
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Type", "FileBucket");
-               fs.put("Filename", file.toString());
+               fs.putSingle("Type", "FileBucket");
+               fs.putSingle("Filename", file.toString());
                fs.put("Length", length);
                return fs;
        }

Modified: trunk/freenet/src/freenet/support/io/NullBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/NullBucket.java        2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/NullBucket.java        2007-02-09 
20:54:57 UTC (rev 11718)
@@ -67,7 +67,7 @@

        public SimpleFieldSet toFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Type", "NullBucket");
+               fs.putSingle("Type", "NullBucket");
                return fs;
        }
 }

Modified: 
trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java  
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java  
2007-02-09 20:54:57 UTC (rev 11718)
@@ -350,12 +350,12 @@

        public SimpleFieldSet toFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Type", "PaddedEphemerallyEncryptedBucket");
+               fs.putSingle("Type", "PaddedEphemerallyEncryptedBucket");
                synchronized(this) {
                        fs.put("DataLength", dataLength);
                }
                if(key != null) {
-                       fs.put("DecryptKey", HexUtil.bytesToHex(key));
+                       fs.putSingle("DecryptKey", HexUtil.bytesToHex(key));
                } else {
                        Logger.error(this, "Cannot serialize because no key");
                        return null;
@@ -368,7 +368,7 @@
                }
                fs.put("MinPaddedSize", minPaddedSize);
                if(!brokenEncryption)
-                       fs.put("CryptoType", "aes256");
+                       fs.putSingle("CryptoType", "aes256");
                return fs;
        }


Modified: trunk/freenet/src/freenet/support/io/RandomAccessFileBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/RandomAccessFileBucket.java    
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/RandomAccessFileBucket.java    
2007-02-09 20:54:57 UTC (rev 11718)
@@ -462,8 +462,8 @@

        public synchronized SimpleFieldSet toFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Type", "RandomAccessFileBucket");
-               fs.put("Filename", file.toString());
+               fs.putSingle("Type", "RandomAccessFileBucket");
+               fs.putSingle("Filename", file.toString());
                fs.put("Offset", offset);
                fs.put("Length", len);
                return fs;

Modified: trunk/freenet/src/freenet/support/io/ReadOnlyFileSliceBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/ReadOnlyFileSliceBucket.java   
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/ReadOnlyFileSliceBucket.java   
2007-02-09 20:54:57 UTC (rev 11718)
@@ -145,8 +145,8 @@

        public SimpleFieldSet toFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Type", "ReadOnlyFileSliceBucket");
-               fs.put("Filename", file.toString());
+               fs.putSingle("Type", "ReadOnlyFileSliceBucket");
+               fs.putSingle("Filename", file.toString());
                fs.put("Offset", startAt);
                fs.put("Length", length);
                return fs;

Modified: trunk/freenet/src/freenet/support/io/TempFileBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/TempFileBucket.java    2007-02-09 
19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/TempFileBucket.java    2007-02-09 
20:54:57 UTC (rev 11718)
@@ -435,7 +435,7 @@

        public SimpleFieldSet toFieldSet() {
                SimpleFieldSet fs = super.toFieldSet();
-               fs.put("Type", "TempFileBucket");
+               fs.putSingle("Type", "TempFileBucket");
                return fs;
        }
 }

Modified: 
trunk/freenet/src/freenet/support/math/BootstrappingDecayingRunningAverage.java
===================================================================
--- 
trunk/freenet/src/freenet/support/math/BootstrappingDecayingRunningAverage.java 
    2007-02-09 19:47:51 UTC (rev 11717)
+++ 
trunk/freenet/src/freenet/support/math/BootstrappingDecayingRunningAverage.java 
    2007-02-09 20:54:57 UTC (rev 11718)
@@ -156,7 +156,7 @@

        public synchronized SimpleFieldSet exportFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Type", "BootstrappingDecayingRunningAverage");
+               fs.putSingle("Type", "BootstrappingDecayingRunningAverage");
                fs.put("CurrentValue", currentValue);
                fs.put("Reports", reports);
                fs.put("Zeros", zeros);

Modified: trunk/freenet/src/freenet/support/math/TimeDecayingRunningAverage.java
===================================================================
--- trunk/freenet/src/freenet/support/math/TimeDecayingRunningAverage.java      
2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/math/TimeDecayingRunningAverage.java      
2007-02-09 20:54:57 UTC (rev 11718)
@@ -233,7 +233,7 @@

        public synchronized SimpleFieldSet exportFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet();
-               fs.put("Type", "TimeDecayingRunningAverage");
+               fs.putSingle("Type", "TimeDecayingRunningAverage");
                fs.put("CurrentValue", curValue);
                fs.put("Started", started);
                fs.put("TotalReports", totalReports);

Modified: trunk/freenet/src/freenet/tools/AddRef.java
===================================================================
--- trunk/freenet/src/freenet/tools/AddRef.java 2007-02-09 19:47:51 UTC (rev 
11717)
+++ trunk/freenet/src/freenet/tools/AddRef.java 2007-02-09 20:54:57 UTC (rev 
11718)
@@ -54,8 +54,8 @@
                        OutputStream os = fcpSocket.getOutputStream();

                        try{
-                               sfs.put("Name", "AddRef");
-                               sfs.put("ExpectedVersion", "2.0");
+                               sfs.putSingle("Name", "AddRef");
+                               sfs.putSingle("ExpectedVersion", "2.0");
                                fcpm = FCPMessage.create("ClientHello", sfs);
                                fcpm.send(os);
                                os.flush();
@@ -74,7 +74,7 @@
                        }

                        try{
-                               sfs = SimpleFieldSet.readFrom(reference);
+                               sfs = SimpleFieldSet.readFrom(reference, false);
                                fcpm = FCPMessage.create(AddPeer.name, sfs);
                                fcpm.send(os);
                                os.flush();
@@ -114,7 +114,7 @@
                                String line = lis.readLine(128, 128, true);
                                int index = line.indexOf('=');
                                if(index == -1 || line.startsWith("End")) 
return sfs;
-                               sfs.put(line.substring(0, index), 
line.substring(index+1));
+                               sfs.putSingle(line.substring(0, index), 
line.substring(index+1));
                        }
                }catch(IOException e){
                        return sfs;


Reply via email to