\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
\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
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
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
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
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
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
// 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