]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
Allowing timeout period to be a query param of the import request.
authorRichard Millet <remillet@berkeley.edu>
Tue, 12 Jun 2012 15:51:19 +0000 (08:51 -0700)
committerRichard Millet <remillet@berkeley.edu>
Tue, 12 Jun 2012 15:51:19 +0000 (08:51 -0700)
services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoClientEmbedded.java
services/imports/service/src/main/java/org/collectionspace/services/imports/nuxeo/ImportCommand.java

index 2c6b1d8c0efb5de5a0e8c472833498c21ba1d165..e31f25af451b085b68753e714fc241cff0ed5013 100644 (file)
 \r
 package org.collectionspace.services.nuxeo.client.java;\r
 \r
-import java.security.Principal;\r
 import java.util.Collection;\r
 import java.util.HashMap;\r
 import java.util.Iterator;\r
 import java.util.List;\r
 import java.util.Map;\r
-import java.util.Set;\r
+import java.util.Map.Entry;\r
 import java.util.Vector;\r
 \r
-import javax.security.auth.Subject;\r
 import javax.security.auth.login.AppConfigurationEntry;\r
-import javax.security.auth.login.LoginException;\r
-import javax.security.auth.login.LoginContext;\r
+import javax.transaction.TransactionManager;\r
 \r
 import org.apache.commons.logging.Log;\r
 import org.apache.commons.logging.LogFactory;\r
 import org.jboss.remoting.InvokerLocator;\r
 import org.nuxeo.common.collections.ListenerList;\r
-import org.nuxeo.ecm.core.api.ClientException;\r
-import org.nuxeo.ecm.core.api.local.ClientLoginModule;\r
-import org.nuxeo.ecm.core.api.local.LoginStack;\r
 import org.nuxeo.ecm.core.api.repository.Repository;\r
 import org.nuxeo.ecm.core.api.repository.RepositoryInstance;\r
 import org.nuxeo.ecm.core.api.repository.RepositoryInstanceHandler;\r
@@ -73,7 +67,7 @@ public final class NuxeoClientEmbedded {
        \r
     private LoginHandler loginHandler;\r
 \r
-    private final List<RepositoryInstance> repositoryInstances;\r
+    private final HashMap<String, RepositoryInstance> repositoryInstances;\r
 \r
     private final ListenerList connectionListeners;\r
 \r
@@ -100,7 +94,7 @@ public final class NuxeoClientEmbedded {
         cfg = new AutoConfigurationService();\r
         loginHandler = loginHandler == null ? new DefaultLoginHandler()\r
                 : loginHandler;\r
-        repositoryInstances = new Vector<RepositoryInstance>();\r
+        repositoryInstances = new HashMap<String, RepositoryInstance>();\r
     }\r
 \r
     public static NuxeoClientEmbedded getInstance() {\r
@@ -280,11 +274,11 @@ public final class NuxeoClientEmbedded {
         locator = null;\r
         serverName = null;\r
         // close repository sessions if any\r
-        Iterator<RepositoryInstance> it = repositoryInstances.iterator();\r
+        Iterator<Entry<String, RepositoryInstance>> it = repositoryInstances.entrySet().iterator();\r
         while (it.hasNext()) {\r
-            RepositoryInstance repo = it.next();\r
+            Entry<String, RepositoryInstance> repo = it.next();\r
             try {\r
-                repo.close();\r
+                repo.getValue().close();\r
             } catch (Exception e) {\r
                 log.debug("Error while trying to close " + repo, e);\r
             }\r
@@ -382,11 +376,24 @@ public final class NuxeoClientEmbedded {
         return getRepositoryManager().getRepository(name);\r
     }\r
 \r
+    public RepositoryInstance openRepository(int timeoutSeconds) throws Exception {\r
+        return openRepository(null, timeoutSeconds);\r
+    }\r
+\r
     public RepositoryInstance openRepository() throws Exception {\r
-        return openRepository(null);\r
+        return openRepository(-1 /*default timeout period*/);\r
     }\r
 \r
-    public RepositoryInstance openRepository(String name) throws Exception {\r
+    public RepositoryInstance openRepository(String name, int timeoutSeconds) throws Exception {\r
+       if (timeoutSeconds > 0) {\r
+               TransactionManager transactionMgr = TransactionHelper.lookupTransactionManager();\r
+               transactionMgr.setTransactionTimeout(timeoutSeconds);\r
+               if (logger.isInfoEnabled()) {\r
+                       logger.info(String.format("Changing current request's transaction timeout period to %d seconds",\r
+                                       timeoutSeconds));\r
+               }\r
+       }\r
+       \r
        boolean startTransaction = TransactionHelper.startTransaction();\r
        if (startTransaction == false) {\r
                logger.warn("Could not start a Nuxeo transaction with the TransactionHelper class.");\r
@@ -399,27 +406,43 @@ public final class NuxeoClientEmbedded {
                repository = getRepositoryManager().getDefaultRepository();\r
         }\r
         RepositoryInstance repo = newRepositoryInstance(repository);\r
-        repositoryInstances.add(repo);\r
+       String key = repo.getSessionId();\r
+        repositoryInstances.put(key, repo);\r
+        if (logger.isTraceEnabled()) {\r
+               logger.trace("Added a new repository instance to our repo list.  Current count is now: "\r
+                               + repositoryInstances.size());\r
+        }\r
 \r
         return repo;\r
     }\r
 \r
     public void releaseRepository(RepositoryInstance repo) throws Exception {\r
+       String key = repo.getSessionId();\r
+\r
         try {\r
                repo.save();\r
             repo.close();\r
         } catch (Exception e) {\r
-               logger.error("Could not save and/or release the repository.", e);\r
+               logger.error("Possible data loss.  Could not save and/or release the repository.", e);\r
                throw e;\r
         } finally {\r
-            repositoryInstances.remove(repo);\r
+            RepositoryInstance wasRemoved = repositoryInstances.remove(key);\r
+            if (logger.isTraceEnabled()) {\r
+               if (wasRemoved != null) {\r
+                       logger.trace("Removed a repository instance from our repo list.  Current count is now: "\r
+                                       + repositoryInstances.size());\r
+               } else {\r
+                       logger.trace("Could not remove a repository instance from our repo list.  Current count is now: "\r
+                                       + repositoryInstances.size());\r
+               }\r
+            }\r
             TransactionHelper.commitOrRollbackTransaction();\r
         }\r
     }\r
 \r
-    public RepositoryInstance[] getRepositoryInstances() {\r
-        return repositoryInstances.toArray(new RepositoryInstance[repositoryInstances.size()]);\r
-    }\r
+//    public RepositoryInstance[] getRepositoryInstances() {\r
+//        return repositoryInstances.toArray(new RepositoryInstance[repositoryInstances.size()]);\r
+//    }\r
 \r
     public static RepositoryInstance newRepositoryInstance(Repository repository) {\r
         ClassLoader cl = Thread.currentThread().getContextClassLoader();\r
index cba6569b97001792f61c51e2dfa68e990dc212d1..faeddfecf0217c88e6837598a3ca9f00f2a291c0 100644 (file)
@@ -1,6 +1,7 @@
 package org.collectionspace.services.imports.nuxeo;\r
 \r
 import java.io.File;\r
+import java.util.Calendar;\r
 import java.util.HashMap;\r
 import java.util.Map;\r
 import java.util.TreeSet;\r
@@ -22,18 +23,24 @@ import org.nuxeo.ecm.core.io.impl.plugins.DocumentModelWriter;
 // based loosely on package org.nuxeo.ecm.shell.commands.io.ImportCommand;\r
 public class ImportCommand {\r
     private static final Log logger = LogFactory.getLog(ImportCommand.class);\r
+    private static final int DEFAULT_TX_TIMOUT = 600; //timeout period in seconds\r
 \r
     public String run(String src, String dest) throws Exception {\r
         File file = new File(src);\r
         ///cspace way of configuring client and auth:\r
         NuxeoClientEmbedded client = NuxeoConnectorEmbedded.getInstance().getClient();\r
-        RepositoryInstance  repoSession = client.openRepository();\r
+        RepositoryInstance  repoSession = client.openRepository(DEFAULT_TX_TIMOUT);\r
         try {\r
+               String msg = String.format("Start of import is Local time: %tT", Calendar.getInstance());\r
+               logger.debug(msg);\r
+               System.out.println(msg);\r
             return importTree(repoSession, file, dest);\r
         } catch (Exception e) {\r
             throw e;\r
         } finally {\r
-//            repository.close();\r
+               String msg = String.format("End of import is Local time: %tT", Calendar.getInstance());\r
+               logger.debug(msg);\r
+               System.out.println(msg);\r
             client.releaseRepository(repoSession);\r
         }\r
     }\r