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