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