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

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

Reply via email to