You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2011/04/04 22:13:53 UTC

svn commit: r1088771 - in /chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main: java/org/apache/chemistry/opencmis/inmemory/server/ java/org/apache/chemistry/opencmis/inmemory/storedobj/api/ java/org/apache/ch...

Author: jens
Date: Mon Apr  4 20:13:53 2011
New Revision: 1088771

URL: http://svn.apache.org/viewvc?rev=1088771&view=rev
Log:
Create a config property for inmemory server that performs a regular clean of the repository. CMIS-350

Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryServiceFactoryImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/ObjectStore.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/webapp/WEB-INF/classes/repository.properties

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryServiceFactoryImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryServiceFactoryImpl.java?rev=1088771&r1=1088770&r2=1088771&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryServiceFactoryImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryServiceFactoryImpl.java Mon Apr  4 20:13:53 2011
@@ -19,9 +19,16 @@
 package org.apache.chemistry.opencmis.inmemory.server;
 
 import java.math.BigInteger;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
 import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
@@ -31,6 +38,8 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.server.CmisService;
 import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
 import org.apache.chemistry.opencmis.inmemory.ConfigConstants;
+import org.apache.chemistry.opencmis.inmemory.ConfigurationSettings;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.ObjectStore;
 import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoreManager;
 import org.apache.chemistry.opencmis.inmemory.storedobj.impl.StoreManagerFactory;
 import org.apache.chemistry.opencmis.inmemory.storedobj.impl.StoreManagerImpl;
@@ -52,7 +61,8 @@ public class InMemoryServiceFactoryImpl 
     private ThreadLocal<CmisServiceWrapper<InMemoryService>> threadLocalService = new ThreadLocal<CmisServiceWrapper<InMemoryService>>();
     private boolean fUseOverrideCtx = false;
     private StoreManager storeManager; // singleton root of everything
-
+    private CleanManager cleanManager = null;
+    
     @Override
     public void init(Map<String, String> parameters) {
         LOG.info("Initializing in-memory repository...");
@@ -62,20 +72,31 @@ public class InMemoryServiceFactoryImpl 
         if (null != overrideCtx)
             fUseOverrideCtx = true;
 
+        ConfigurationSettings.init(parameters);
+
         String repositoryClassName = (String) parameters.get(ConfigConstants.REPOSITORY_CLASS);
         if (null == repositoryClassName)
             repositoryClassName = StoreManagerImpl.class.getName();
 
         if (null == storeManager)
             storeManager = StoreManagerFactory.createInstance(repositoryClassName);
+        
+        Date deploymentTime = new Date();
+        String strDate = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US).format(deploymentTime);
 
+        parameters.put(ConfigConstants.DEPLOYMENT_TIME, strDate);
+        
         initStorageManager(parameters);
 
-        fillRepositoryIfConfigured(parameters);
+        fillRepositoryIfConfigured(parameters);                
+        
+        Long cleanInterval = ConfigurationSettings.getConfigurationValueAsLong(ConfigConstants.CLEAN_REPOSITORY_INTERVAL);
+        if (null != cleanInterval && cleanInterval > 0)
+            scheduleCleanRepositoryJob(cleanInterval);
 
         LOG.info("...initialized in-memory repository.");
     }
-
+    
     public static void setOverrideCallContext(CallContext ctx) {
         OVERRIDE_CTX = ctx;
     }
@@ -109,6 +130,8 @@ public class InMemoryServiceFactoryImpl 
 
     @Override
     public void destroy() {
+        if (null != cleanManager)
+            cleanManager.stopCleanRepositoryJob();
         threadLocalService = null;
     }
 
@@ -286,4 +309,42 @@ public class InMemoryServiceFactoryImpl 
           
     } // fillRepositoryIfConfigured
  
+    class CleanManager {
+        
+        private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+        ScheduledFuture<?> cleanerHandle = null;
+        
+        public void startCleanRepositoryJob (long intervalInMinutes) {
+            
+            final Runnable cleaner = new Runnable() {
+                public void run() { 
+                    LOG.info("Cleaning repository as part of a scheduled maintenance job.");
+                    for(String repositoryId: storeManager.getAllRepositoryIds()) {
+                        ObjectStore store = storeManager.getObjectStore(repositoryId);
+                        store.clear();             
+                        fillRepositoryIfConfigured(ConfigurationSettings.getParameters());  
+                    }
+                    LOG.info("Repository cleaned. Freeing memory.");
+                    System.gc();
+                }
+            };
+            
+            LOG.info("Repository Clean Job starting clean job, interval " + intervalInMinutes + " min");
+            cleanerHandle =
+                scheduler.scheduleAtFixedRate(cleaner, intervalInMinutes, intervalInMinutes, TimeUnit.MINUTES);
+        }
+        
+        public void stopCleanRepositoryJob() {
+            LOG.info("Repository Clean Job cancelling clean job.");
+            boolean ok = cleanerHandle.cancel(true);
+            LOG.info("Repository Clean Job cancelled with result: " + ok);
+            scheduler.shutdownNow();
+        }
+    }
+
+    private void scheduleCleanRepositoryJob(long minutes) {                 
+        cleanManager = new CleanManager();
+        cleanManager.startCleanRepositoryJob(minutes);
+    }
+
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/ObjectStore.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/ObjectStore.java?rev=1088771&r1=1088770&r2=1088771&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/ObjectStore.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/ObjectStore.java Mon Apr  4 20:13:53 2011
@@ -109,4 +109,16 @@ public interface ObjectStore {
      * @return list of checked out documents in the repository
      */
     List<VersionedDocument> getCheckedOutDocuments(String orderBy);
+    
+    /**
+     * Clear repository and remove all data.
+     */
+    public void clear();
+    
+    /**
+     * For statistics: return the number of objects contained in the system
+     * @return
+     *      number of stored objects
+     */
+    public long getObjectCount();
 }
\ No newline at end of file

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java?rev=1088771&r1=1088770&r2=1088771&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java Mon Apr  4 20:13:53 2011
@@ -219,30 +219,21 @@ public class ObjectStoreImpl implements 
         Set<String> entries = fStoredObjectMap.keySet();
         return entries;
     }
+    
+    /**
+     * Clear repository and remove all data.
+     */
+    public void clear() {
+        lock();
+        fStoredObjectMap.clear();
+        storeObject(fRootFolder);
+        unlock();
+    }
 
-    // void renameAllIdsWithPrefix(String oldPath, String newPath) {
-    // Iterator<Entry<String, StoredObject>> it =
-    // fStoredObjectMap.entrySet().iterator();
-    // Map<String, StoredObject> newMap = new HashMap<String, StoredObject>();
-    // while (it.hasNext()) {
-    // Map.Entry<String, StoredObject> entry = (Map.Entry<String, StoredObject>)
-    // it
-    // .next();
-    //
-    // if (entry.getKey().startsWith(oldPath)) {
-    // if (entry.getValue() instanceof Path) {
-    // newPath = ((Path)entry.getValue()).getPath();
-    // it.remove(); // the only safe way to modify while iteration
-    // newMap.put(newPath, entry.getValue()); // we can't add to the current
-    // collection while
-    // // iterating
-    // }
-    // }
-    // }
-    // fStoredObjectMap.putAll(newMap); // add all at once when iteration is
-    // complete
-    // }
-
+    public long getObjectCount() {
+        return fStoredObjectMap.size();
+    }
+    
     // /////////////////////////////////////////
     // private helper methods
 

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/webapp/WEB-INF/classes/repository.properties
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/webapp/WEB-INF/classes/repository.properties?rev=1088771&r1=1088770&r2=1088771&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/webapp/WEB-INF/classes/repository.properties (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/webapp/WEB-INF/classes/repository.properties Mon Apr  4 20:13:53 2011
@@ -45,4 +45,6 @@ RepositoryFiller.DocumentProperty.0=Stri
 #RepositoryFiller.DocumentProperty.1=StringPropMV
   # properties to set for a folder
 #RepositoryFiller.FolderProperty.0=StringFolderProp
-  
+InMemoryServer.MaxContentSizeKB=4096
+InMemoryServer.CleanIntervalMinutes=2
+