r26787 - trunk/freenet/src/freenet/support

[email protected] Tue, 14 Apr 2009 18:17:30 +0000
Newsgroups gmane.network.freenet.cvs
Message-ID <[email protected]>
Author: saces
Date: 2009-04-14 18:17:30 +0000 (Tue, 14 Apr 2009)
New Revision: 26787

Added:
   trunk/freenet/src/freenet/support/ContainerSizeEstimator.java
Log:
helper class to estaminate container size 

Added: trunk/freenet/src/freenet/support/ContainerSizeEstimator.java
===================================================================
--- trunk/freenet/src/freenet/support/ContainerSizeEstimator.java	                        (rev 0)
+++ trunk/freenet/src/freenet/support/ContainerSizeEstimator.java	2009-04-14 18:17:30 UTC (rev 26787)
@@ -0,0 +1,118 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.support;
+
+import java.util.HashMap;
+import java.util.Set;
+
+import freenet.client.ArchiveManager.ARCHIVE_TYPE;
+import freenet.client.async.ManifestElement;
+
+/**
+ * Helper class to estaminate the container size,
+ * @author saces
+ *
+ */
+public final class ContainerSizeEstimator {
+	
+	public static final ARCHIVE_TYPE DEFAULT_ARCHIVE_TYPE = ARCHIVE_TYPE.TAR;
+	
+	public final static class ContainerSize {
+		
+		private long _sizeFiles;
+		private long _sizeFilesNoLimit;
+		private long _sizeSubTrees;
+		private long _sizeSubTreesNoLimit;
+		
+		private ContainerSize() {
+			_sizeFiles = 0;
+			_sizeFilesNoLimit = 0;
+			_sizeSubTrees = 0;
+			_sizeSubTreesNoLimit = 0;
+		}
+
+		public long getSizeTotal() {
+			return _sizeFiles+_sizeSubTrees;
+		}
+		
+		public long getSizeTotalNoLimit() {
+			return _sizeFilesNoLimit+_sizeSubTreesNoLimit;
+		}
+
+		public long getSizeFiles() {
+			return _sizeFiles;
+		}
+
+		public long getSizeFilesNoLimit() {
+			return _sizeFilesNoLimit;
+		}
+
+		public long getSizeSubTrees() {
+			return _sizeSubTrees;
+		}
+
+		public long getSizeSubTreesNoLimit() {
+			return _sizeSubTreesNoLimit;
+		}
+	}
+	
+	
+	private ContainerSizeEstimator() {}
+	
+	public static ContainerSize getSubTreeSize(HashMap<String, Object> metadata, long maxItemSize, long maxContainerSize, int maxDeep) {
+		ContainerSize result = new ContainerSize();
+		getSubTreeSize(metadata, result, maxItemSize, maxContainerSize, maxDeep);
+		return result;
+	}	
+	
+	private static void getSubTreeSize(HashMap<String, Object> metadata, ContainerSize result, long maxItemSize, long maxContainerSize,int maxDeep) {
+		Set<String> set = metadata.keySet();
+		// files
+		for(String name:set) {
+			Object o = metadata.get(name);
+			if (o instanceof ManifestElement) {
+				ManifestElement me = (ManifestElement)o;
+				long itemsize = me.getSize();
+				if (itemsize > -1) {
+					result._sizeFilesNoLimit += getContainerItemSize(me.getSize());
+					if (itemsize > maxItemSize)
+						result._sizeFiles += 512;  // spare for redirect
+					else
+						result._sizeFiles += getContainerItemSize(me.getSize());
+					if (result._sizeFiles > maxContainerSize) break;
+				}
+			}
+		}
+		// sub dirs
+		if (maxDeep > 0) {
+			for(String name:set) {
+				Object o = metadata.get(name);
+				if (o instanceof HashMap) {
+					result._sizeSubTrees += 512;
+					@SuppressWarnings("unchecked")
+					HashMap<String, Object> hm = (HashMap<String, Object>) o;
+					ContainerSize tempResult = new ContainerSize();
+					getSubTreeSize(hm, tempResult, maxItemSize, (maxContainerSize-result._sizeSubTrees), maxDeep-1);
+					result._sizeSubTrees += tempResult.getSizeTotal();
+					result._sizeSubTreesNoLimit += tempResult.getSizeTotalNoLimit();
+					if (result._sizeSubTrees > maxContainerSize) break;
+				}
+			}
+		}
+	}
+
+	public static long getContainerItemSize(long size) {
+		return getContainerItemSize(DEFAULT_ARCHIVE_TYPE, size);
+	}
+	
+	private static long getContainerItemSize(ARCHIVE_TYPE archiveType, long size) {
+		if (archiveType == ARCHIVE_TYPE.TAR)
+			return tarItemSize(size);
+		throw new UnsupportedOperationException("TODO, only TAR supportet atm.");
+	}
+
+	public static final long tarItemSize(long size) {
+		return 512 + (((size + 511) / 512) * 512);
+	}
+}


Property changes on: trunk/freenet/src/freenet/support/ContainerSizeEstimator.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain