Mir goes GPL
[mir.git] / source / mir / storage / store / StoreContainer.java
index 53256d7..914277b 100755 (executable)
@@ -1,3 +1,34 @@
+/*
+ * Copyright (C) 2001, 2002  The Mir-coders group
+ *
+ * This file is part of Mir.
+ *
+ * Mir is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Mir is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mir; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * In addition, as a special exception, The Mir-coders gives permission to link
+ * the code of this program with the com.oreilly.servlet library, any library
+ * licensed under the Apache Software License, The Sun (tm) Java Advanced
+ * Imaging library (JAI), The Sun JIMI library (or with modified versions of
+ * the above that use the same license as the above), and distribute linked
+ * combinations including the two.  You must obey the GNU General Public
+ * License in all respects for all of the code used other than the above
+ * mentioned libraries.  If you modify this file, you may extend this exception
+ * to your version of the file, but you are not obligated to do so.  If you do
+ * not wish to do so, delete this exception statement from your version.
+ */
+
 package mir.storage.store;
 
 /**
@@ -16,7 +47,8 @@ package mir.storage.store;
  */
 
 import java.util.*;
-import mir.misc.Logfile;
+import javax.servlet.http.*;
+import mir.misc.*;
 
 public class StoreContainer {
 
@@ -26,17 +58,24 @@ public class StoreContainer {
 
        private LinkedList          container;
        private StoreContainerType  stocType;
-       private int                 maxSize=DEFAULT_SIZE;
-       private int                 uniqueId;
+       private int                 maxSize=DEFAULT_SIZE, uniqueId;
   private int                 addCount=0,removeCount=0,storeOutCount;
   private int                 hitCount=0,missCount=0;
+  private static ObjectStore  o_store = ObjectStore.getInstance();
 
-       private StoreContainer() {};
+       // avoid construction without parameters
+  private StoreContainer() {};
 
        public StoreContainer(StoreContainerType stoc_type) {
                this.uniqueId=++uniqueCounter;
                this.stocType=stoc_type;
                this.container=new LinkedList();
+    int defaultSize = stoc_type.getDefaultSize();
+    String confProperty = stoc_type.getConfPrefix()+".DefaultSize";
+    String confedSize = o_store.getConfProperty(confProperty);
+    if ( confedSize!=null ) {
+      this.maxSize = StringUtil.parseInt (confedSize, defaultSize);
+    }
        }
 
        public StoreContainer(StoreContainerType stoc_type, int maxSize) {
@@ -44,9 +83,11 @@ public class StoreContainer {
                this.maxSize=maxSize;
        }
 
+
+
        public synchronized StorableObject use(StoreIdentifier sid) {
     int hit = container.indexOf(sid);
-    if (hit>0) {
+    if (hit>=0) {
       StoreIdentifier hitSid = (StoreIdentifier)container.get(hit);
                  if ( hitSid!=null ) {
          hitCount++;
@@ -143,6 +184,11 @@ public class StoreContainer {
         *  @return       String
         */
        public String toString() {
+    return toHtml(null);
+       }
+
+  public String toHtml(HttpServletRequest req) {
+    boolean showingContent=false;
     float hitRatio=0;
     long divisor=hitCount+missCount;
     if (divisor>0) hitRatio=(float)hitCount/(float)divisor;
@@ -150,14 +196,35 @@ public class StoreContainer {
 
                StringBuffer sb = new StringBuffer("StoreContainer id: ");
                sb.append(uniqueId).append(" for ");
-               sb.append(stocType.toString()).append("\n  [current/maximum size: ");
+               sb.append(stocType.toString());
+    if ( req!=null ) {
+      String show = req.getParameter("stoc_show");
+      if ( show!=null && show.equals(""+uniqueId) ) {
+        // show all entries in container
+        sb.append(" [<b>showing</b>]");
+        showingContent=true;
+      }
+      else
+        sb.append(" [<a href=\"?stoc_show="+uniqueId+"\">show</a>]");
+    }
+    sb.append("\n  [current/maximum size: ");
                sb.append(container.size()).append("/").append(maxSize);
                sb.append("]\n  [added/stored out/removed: ").append(addCount).append("/");
     sb.append(storeOutCount).append("/").append(removeCount).append("]\n  [hit/miss/ratio: ");
     sb.append(hitCount).append("/").append(missCount).append("/");
     sb.append(hitRatio).append("%]\n");
 
-    /** @todo list members ? */
+    if (showingContent) {
+      sb.append("  <b>Container contains following references:</b>\n  ");
+      ListIterator it = container.listIterator();
+      while ( it.hasNext() ) {
+        StoreIdentifier sid = (StoreIdentifier)it.next();
+        sb.append(sid.toString()).append("\n  ");
+      }
+      sb.append("<b>End of List</b>\n\n");
+
+    }
+
                return sb.toString();
        }