Author: toad
Date: 2005-10-26 19:38:23 +0000 (Wed, 26 Oct 2005)
New Revision: 7454

Removed:
   trunk/freenet/src/freenet/client/ArchiveContext.java
   trunk/freenet/src/freenet/client/ArchiveElement.java
Modified:
   trunk/freenet/src/freenet/client/ArchiveHandler.java
   trunk/freenet/src/freenet/client/ArchiveManager.java
   trunk/freenet/src/freenet/client/Fetcher.java
   trunk/freenet/src/freenet/client/FetcherContext.java
   trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
   trunk/freenet/src/freenet/keys/ClientKey.java
   trunk/freenet/src/freenet/keys/FreenetURI.java
Log:
More work on archive simplification.

Deleted: trunk/freenet/src/freenet/client/ArchiveContext.java
===================================================================
--- trunk/freenet/src/freenet/client/ArchiveContext.java        2005-10-26 
18:55:15 UTC (rev 7453)
+++ trunk/freenet/src/freenet/client/ArchiveContext.java        2005-10-26 
19:38:23 UTC (rev 7454)
@@ -1,25 +0,0 @@
-package freenet.client;
-
-import java.util.HashSet;
-
-import freenet.keys.ClientKey;
-import freenet.keys.FreenetURI;
-
-/**
- * Object passed down a full fetch, including all the recursion.
- * Used, at present, for detecting archive fetch loops, hence the
- * name.
- */
-public class ArchiveContext {
-
-       HashSet soFar = new HashSet();
-       int maxArchiveLevels;
-       
-       public synchronized void doLoopDetection(ClientKey key) throws 
ArchiveFailureException {
-               if(!soFar.add(key))
-                       throw new ArchiveFailureException("Archive loop 
detected");
-               if(soFar.size() > maxArchiveLevels)
-                       throw new 
ArchiveFailureException(ArchiveFailureException.TOO_MANY_LEVELS);
-       }
-
-}

Deleted: trunk/freenet/src/freenet/client/ArchiveElement.java
===================================================================
--- trunk/freenet/src/freenet/client/ArchiveElement.java        2005-10-26 
18:55:15 UTC (rev 7453)
+++ trunk/freenet/src/freenet/client/ArchiveElement.java        2005-10-26 
19:38:23 UTC (rev 7454)
@@ -1,55 +0,0 @@
-package freenet.client;
-
-import freenet.keys.ClientKey;
-import freenet.keys.FreenetURI;
-import freenet.support.Bucket;
-
-/**
- * An element in an archive. Does synchronization (on fetches, to avoid
- * having to do them twice), checks cache, does fetch, adds to cache.
- *
- * DO LOOP DETECTION!
- */
-public class ArchiveElement {
-
-       ArchiveElement(ArchiveManager manager, FreenetURI uri, String filename, 
short archiveType) {
-               this.manager = manager;
-               this.key = uri;
-               this.filename = filename;
-               this.archiveType = archiveType;
-       }
-       
-       final ArchiveManager manager;
-       final ClientKey key;
-       final String filename;
-       final short archiveType;
-       
-       /**
-        * Fetch the element.
-        * If fetchContext is null, return null unless the data is cached.
-        * @throws ArchiveFailureException If there was a fatal error in the 
archive extraction. 
-        * @throws ArchiveRestartException If the archive changed, and 
therefore we need to
-        * restart the request.
-        * @throws FetchException If we could not fetch the key.
-        * @throws MetadataParseException If the key's metadata was invalid.
-        */
-       public Bucket get(ArchiveContext archiveContext, FetcherContext 
fetchContext, boolean inSplitZipManifest) 
-       throws ArchiveFailureException, MetadataParseException, FetchException, 
ArchiveRestartException {
-               
-               archiveContext.doLoopDetection(key);
-               // AFTER the loop check (possible deadlocks)
-               synchronized(this) {
-                       // Synchronized during I/O to avoid doing it twice
-                       Bucket cached = manager.getCached(key, filename);
-                       if(cached != null) return cached;
-                       if(fetchContext == null) return null;
-                       Fetcher fetcher = new Fetcher(key, fetchContext, 
archiveContext);
-                       FetchResult result = 
fetcher.realRun(inSplitZipManifest);
-                       if(result.succeeded()) {
-                               manager.extractToCache(key, archiveType, 
result.data, archiveContext);
-                               return manager.getCached(key, filename);
-                       } else
-                               throw new ArchiveFailureException("Fetch 
failed");
-               }
-       }
-}

Modified: trunk/freenet/src/freenet/client/ArchiveHandler.java
===================================================================
--- trunk/freenet/src/freenet/client/ArchiveHandler.java        2005-10-26 
18:55:15 UTC (rev 7453)
+++ trunk/freenet/src/freenet/client/ArchiveHandler.java        2005-10-26 
19:38:23 UTC (rev 7454)
@@ -28,8 +28,8 @@
         * @throws FetchException If the container could not be fetched.
         * @throws MetadataParseException If there was an error parsing 
intermediary metadata.
         */
-       public Bucket getMetadata(ArchiveContext archiveContext, FetcherContext 
fetchContext) throws ArchiveFailureException, ArchiveRestartException, 
MetadataParseException, FetchException {
-               return get(".metadata", archiveContext, fetchContext, false);
+       public Bucket getMetadata(ArchiveContext archiveContext, FetcherContext 
fetchContext, ClientMetadata dm, int recursionLevel) throws 
ArchiveFailureException, ArchiveRestartException, MetadataParseException, 
FetchException {
+               return get(".metadata", archiveContext, fetchContext, dm, 
recursionLevel);
        }
 
        /**
@@ -42,9 +42,9 @@
         * @throws FetchException 
         * @throws MetadataParseException 
         */
-       public synchronized Bucket get(String internalName, ArchiveContext 
archiveContext, FetcherContext fetchContext, boolean inSplitZipManifest) throws 
ArchiveFailureException, ArchiveRestartException, MetadataParseException, 
FetchException {
+       public synchronized Bucket get(String internalName, ArchiveContext 
archiveContext, FetcherContext fetchContext, ClientMetadata dm, int 
recursionLevel) throws ArchiveFailureException, ArchiveRestartException, 
MetadataParseException, FetchException {
                ArchiveElement element = 
                        manager.makeElement(key, internalName, archiveType);
-               return element.get(archiveContext, fetchContext, 
inSplitZipManifest);
+               return element.get(fetchContext, dm, recursionLevel, 
archiveContext);
        }
 }

Modified: trunk/freenet/src/freenet/client/ArchiveManager.java
===================================================================
--- trunk/freenet/src/freenet/client/ArchiveManager.java        2005-10-26 
18:55:15 UTC (rev 7453)
+++ trunk/freenet/src/freenet/client/ArchiveManager.java        2005-10-26 
19:38:23 UTC (rev 7454)
@@ -55,13 +55,13 @@
        final int maxArchiveHandlers;
        final LRUHashtable archiveHandlers;
        
-       public synchronized void putCached(ClientKey key, ArchiveHandler zip) {
+       public synchronized void putCached(FreenetURI key, ArchiveHandler zip) {
                archiveHandlers.push(key, zip);
                while(archiveHandlers.size() > maxArchiveHandlers)
                        ((ArchiveHandler) archiveHandlers.popKey()).finalize();
        }
 
-       public ArchiveHandler getCached(ClientKey key) {
+       public ArchiveHandler getCached(FreenetURI key) {
                ArchiveHandler handler = (ArchiveHandler) 
archiveHandlers.get(key);
                archiveHandlers.push(key, handler);
                return handler;
@@ -104,7 +104,7 @@
         * @param key The key of the archive that we are extracting data from.
         * @return An archive handler. 
         */
-       public synchronized ArchiveHandler makeHandler(ClientKey key, short 
archiveType) {
+       public synchronized ArchiveHandler makeHandler(FreenetURI key, short 
archiveType) {
                ArchiveHandler handler = getCached(key);
                if(handler != null) return handler;
                handler = new ArchiveHandler(this, key, archiveType);

Modified: trunk/freenet/src/freenet/client/Fetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/Fetcher.java       2005-10-26 18:55:15 UTC 
(rev 7453)
+++ trunk/freenet/src/freenet/client/Fetcher.java       2005-10-26 19:38:23 UTC 
(rev 7454)
@@ -55,9 +55,10 @@
         * @throws FetchException If we could not fetch the data.
         * @throws MetadataParseException If we could not parse the metadata.
         * @throws ArchiveFailureException If we could not extract data from an 
archive.
+        * @throws ArchiveRestartException 
         */
        FetchResult realRun(ClientMetadata dm, int recursionLevel, FreenetURI 
uri) 
-       throws FetchException, MetadataParseException, ArchiveFailureException {
+       throws FetchException, MetadataParseException, ArchiveFailureException, 
ArchiveRestartException {
                ClientKey key = ClientKey.getBaseKey(uri);
                LinkedList metaStrings = uri.listMetaStrings();
                
@@ -88,7 +89,7 @@
                
                Metadata metadata = Metadata.construct(data);
                
-               return runMetadata(recursionLevel, key, metaStrings, metadata, 
null, key.toURI());
+               return runMetadata(dm, recursionLevel, key, metaStrings, 
metadata, null, key.getURI());
        }
        
        /**
@@ -104,8 +105,9 @@
         * converted to a FetchException above.
         * @throws ArchiveFailureException If extracting data from an archive 
failed.
         * @throws FetchException If the fetch failed for some reason.
+        * @throws ArchiveRestartException 
         */
-       private FetchResult runMetadata(ClientMetadata dm, int recursionLevel, 
ClientKey key, LinkedList metaStrings, Metadata metadata, ArchiveHandler 
container, FreenetURI thisKey) throws MetadataParseException, FetchException, 
ArchiveFailureException {
+       private FetchResult runMetadata(ClientMetadata dm, int recursionLevel, 
ClientKey key, LinkedList metaStrings, Metadata metadata, ArchiveHandler 
container, FreenetURI thisKey) throws MetadataParseException, FetchException, 
ArchiveFailureException, ArchiveRestartException {
                
                if(metadata.isSimpleManifest()) {
                        String name = (String) metaStrings.removeFirst();
@@ -114,30 +116,28 @@
                                metadata = metadata.getDefaultDocument();
                        } else {
                                metadata = metadata.getDocument(name);
-                               thisKey = (FreenetURI) thisKey.clone();
                                thisKey = thisKey.pushMetaString(name);
                        }
                        return runMetadata(dm, recursionLevel, key, 
metaStrings, metadata, container, thisKey);
                } else if(metadata.isArchiveManifest()) {
-                       container = ctx.archiveManager.makeHandler(key, 
metadata.getArchiveType());
-                       Bucket metadataBucket = 
container.getMetadata(archiveContext, ctx);
+                       container = ctx.archiveManager.makeHandler(thisKey, 
metadata.getArchiveType());
+                       Bucket metadataBucket = 
container.getMetadata(archiveContext, ctx, dm, recursionLevel);
                        metadata = Metadata.construct(metadataBucket);
                        return runMetadata(dm, recursionLevel+1, key, 
metaStrings, metadata, container, thisKey);
                } else if(metadata.isArchiveInternalRedirect()) {
                        if(container == null)
                                throw new 
FetchException(FetchException.NOT_IN_ARCHIVE);
                        else {
-                               // FIXME
-                               Bucket result = 
container.get(metadata.getZIPInternalName(), archiveContext, ctx, false);
+                               Bucket result = 
container.get(metadata.getZIPInternalName(), archiveContext, ctx, dm, 
recursionLevel);
                                
dm.mergeNoOverwrite(metadata.getClientMetadata());
                                return new FetchResult(dm, result);
                        }
                } else if(metadata.isMultiLevelMetadata()) {
                        // Doesn't have to be a splitfile; could be from a ZIP 
or a plain file.
                        metadata.setSimpleRedirect();
-                       FetchResult res = runMetadata(dm, recursionLevel, key, 
metaStrings, metadata, container);
+                       FetchResult res = runMetadata(dm, recursionLevel, key, 
metaStrings, metadata, container, thisKey);
                        metadata = Metadata.construct(res.data);
-                       return runMetadata(dm, recursionLevel, key, 
metaStrings, metadata, container);
+                       return runMetadata(dm, recursionLevel, key, 
metaStrings, metadata, container, thisKey);
                } else if(metadata.isSingleFileRedirect()) {
                        FreenetURI uri = metadata.getSingleTarget();
                        dm.mergeNoOverwrite(metadata.getClientMetadata());
@@ -146,6 +146,9 @@
                        SplitFetcher sf = new SplitFetcher(metadata, 
ctx.maxTempLength, archiveContext, ctx);
                        Bucket sfResult = sf.fetch(); // will throw in event of 
error
                        return new FetchResult(dm, sfResult);
+               } else {
+                       Logger.error(this, "Don't know what to do with 
metadata: "+metadata);
+                       throw new 
FetchException(FetchException.UNKNOWN_METADATA);
                }
        }
 

Modified: trunk/freenet/src/freenet/client/FetcherContext.java
===================================================================
--- trunk/freenet/src/freenet/client/FetcherContext.java        2005-10-26 
18:55:15 UTC (rev 7453)
+++ trunk/freenet/src/freenet/client/FetcherContext.java        2005-10-26 
19:38:23 UTC (rev 7454)
@@ -9,26 +9,21 @@
        final SimpleLowLevelClient client;
        final long maxOutputLength;
        final long maxTempLength;
-       final int maxRedirects;
-       final int maxLevels;
-       final int maxArchiveRecursionLevel;
        final ArchiveManager archiveManager;
        final BucketFactory bucketFactory;
+       final int maxRecursionLevel;
        final int maxArchiveRestarts;
        
        public FetcherContext(SimpleLowLevelClient client, long curMaxLength, 
-                       long curMaxTempLength, int maxRedirects, int maxLevels, 
int maxArchives,
-                       int maxArchiveRestarts, ArchiveManager archiveManager, 
-                       BucketFactory bucketFactory) {
+                       long curMaxTempLength, int maxRecursionLevel, int 
maxArchiveRestarts,
+                       ArchiveManager archiveManager, BucketFactory 
bucketFactory) {
                this.client = client;
                this.maxOutputLength = curMaxLength;
                this.maxTempLength = curMaxTempLength;
-               this.maxRedirects = maxRedirects;
-               this.maxLevels = maxLevels;
-               this.maxArchiveRecursionLevel = maxArchives;
-               this.maxArchiveRestarts = maxArchiveRestarts;
                this.archiveManager = archiveManager;
                this.bucketFactory = bucketFactory;
+               this.maxRecursionLevel = maxRecursionLevel;
+               this.maxArchiveRestarts = maxArchiveRestarts;
        }
 
 }

Modified: trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
===================================================================
--- trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java     
2005-10-26 18:55:15 UTC (rev 7453)
+++ trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java     
2005-10-26 19:38:23 UTC (rev 7454)
@@ -11,9 +11,7 @@
        private final BucketFactory bucketFactory;
        private long curMaxLength;
        private long curMaxTempLength;
-       static final int MAX_REDIRECTS = 10;
-       static final int MAX_METADATA_LEVELS = 5;
-       static final int MAX_ARCHIVE_LEVELS = 5;
+       static final int MAX_RECURSION = 10;
        static final int MAX_ARCHIVE_RESTARTS = 2;
        
        public HighLevelSimpleClientImpl(SimpleLowLevelClient client, 
ArchiveManager mgr, BucketFactory bf) {
@@ -32,7 +30,7 @@
 
        public FetchResult fetch(FreenetURI uri) throws FetchException {
                FetcherContext context = new FetcherContext(client, 
curMaxLength, curMaxLength, 
-                               MAX_REDIRECTS, MAX_METADATA_LEVELS, 
MAX_ARCHIVE_LEVELS, MAX_ARCHIVE_RESTARTS, archiveManager, bucketFactory);
+                               MAX_RECURSION, MAX_ARCHIVE_RESTARTS, 
archiveManager, bucketFactory);
                Fetcher f = new Fetcher(uri, context, new ArchiveContext());
                return f.run();
        }

Modified: trunk/freenet/src/freenet/keys/ClientKey.java
===================================================================
--- trunk/freenet/src/freenet/keys/ClientKey.java       2005-10-26 18:55:15 UTC 
(rev 7453)
+++ trunk/freenet/src/freenet/keys/ClientKey.java       2005-10-26 19:38:23 UTC 
(rev 7454)
@@ -1,5 +1,7 @@
 package freenet.keys;
 
+import freenet.client.ArchiveHandler;
+
 /**
  * Base class for client keys.
  * Client keys are decodable. Node keys are not.
@@ -16,4 +18,6 @@
         */
        public abstract boolean isMetadata();
 
+       public abstract FreenetURI getURI();
+
 }

Modified: trunk/freenet/src/freenet/keys/FreenetURI.java
===================================================================
--- trunk/freenet/src/freenet/keys/FreenetURI.java      2005-10-26 18:55:15 UTC 
(rev 7453)
+++ trunk/freenet/src/freenet/keys/FreenetURI.java      2005-10-26 19:38:23 UTC 
(rev 7454)
@@ -50,6 +50,30 @@
        private String[] metaStr;
        private byte[] routingKey, cryptoKey, extra;
 
+       public Object clone() {
+               return new FreenetURI(this);
+       }
+       
+       private FreenetURI(FreenetURI uri) {
+               keyType = uri.keyType;
+               docName = uri.docName;
+               metaStr = new String[uri.metaStr.length];
+               for(int i=0;i<metaStr.length;i++)
+                       metaStr[i] = uri.metaStr[i];
+               if(uri.routingKey != null) {
+                       routingKey = new byte[uri.routingKey.length];
+                       System.arraycopy(uri.routingKey, 0, routingKey, 0, 
routingKey.length);
+               }
+               if(uri.cryptoKey != null) {
+                       cryptoKey = new byte[uri.cryptoKey.length];
+                       System.arraycopy(uri.cryptoKey, 0, cryptoKey, 0, 
cryptoKey.length);
+               }
+               if(uri.extra != null) {
+                       extra = new byte[uri.extra.length];
+                       System.arraycopy(uri.extra, 0, extra, 0, extra.length);
+               }
+       }
+       
        public FreenetURI(String keyType, String docName) {
                this(keyType, docName, (String[]) null, null, null, null);
        }
@@ -230,6 +254,19 @@
        }
 
        /**
+        * Returns a copy of this URI with the given string added as a new meta 
string.
+        */
+       public FreenetURI pushMetaString(String name) {
+               if(metaStr == null)
+                       metaStr = new String[] { name };
+               else {
+                       String[] newMetaStr = new String[metaStr.length+1];
+                       System.arraycopy(metaStr, 0, newMetaStr, 0, 
metaStr.length);
+                       return setMetaString(newMetaStr);
+               }
+       }
+       
+       /**
         * Returns a copy of this URI with the those meta strings appended.
         */
        public FreenetURI addMetaStrings(String[] strs) {

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to