--- /dev/null
+/*\r
+ * (C) Copyright 2006-2010 Nuxeo SAS (http://nuxeo.com/) and contributors.\r
+ *\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the GNU Lesser General Public License\r
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at\r
+ * http://www.gnu.org/licenses/lgpl.html\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * Contributors:\r
+ * bstefanescu, jcarsique\r
+ *\r
+ * $Id$\r
+ */\r
+\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.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
+\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
+import org.nuxeo.ecm.core.api.repository.RepositoryManager;\r
+import org.nuxeo.ecm.core.client.ConnectionListener;\r
+import org.nuxeo.ecm.core.client.DefaultLoginHandler;\r
+import org.nuxeo.ecm.core.client.LoginHandler;\r
+import org.nuxeo.ecm.core.schema.SchemaManager;\r
+import org.nuxeo.ecm.core.schema.SchemaManagerImpl;\r
+import org.nuxeo.ecm.core.schema.TypeProvider;\r
+import org.nuxeo.runtime.api.Framework;\r
+import org.nuxeo.runtime.api.ServiceDescriptor;\r
+import org.nuxeo.runtime.api.ServiceManager;\r
+import org.nuxeo.runtime.api.login.LoginComponent;\r
+import org.nuxeo.runtime.api.login.LoginService;\r
+import org.nuxeo.runtime.api.login.SecurityDomain;\r
+import org.nuxeo.runtime.config.AutoConfigurationService;\r
+import org.nuxeo.runtime.remoting.RemotingService;\r
+import org.nuxeo.runtime.services.streaming.StreamingService;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+/**\r
+ * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>\r
+ *\r
+ */\r
+public final class NuxeoClientEmbedded {\r
+\r
+ private Logger logger = LoggerFactory.getLogger(NuxeoClientEmbedded.class);\r
+ \r
+ private LoginHandler loginHandler;\r
+ \r
+ private LoginContext loginContext = null;\r
+\r
+ private final List<RepositoryInstance> repositoryInstances;\r
+\r
+ private final ListenerList connectionListeners;\r
+\r
+ private InvokerLocator locator;\r
+\r
+ private String serverName;\r
+\r
+ private final AutoConfigurationService cfg;\r
+\r
+ private RepositoryManager repositoryMgr;\r
+\r
+ private boolean multiThreadedLogin = false;\r
+\r
+ private static final NuxeoClientEmbedded instance = new NuxeoClientEmbedded();\r
+\r
+ private static final Log log = LogFactory.getLog(NuxeoClientEmbedded.class);\r
+\r
+ /**\r
+ * Constructs a new NuxeoClient. NOTE: Using {@link #getInstance()} instead\r
+ * of this constructor is recommended.\r
+ */\r
+ public NuxeoClientEmbedded() {\r
+ connectionListeners = new ListenerList();\r
+ cfg = new AutoConfigurationService();\r
+ loginHandler = loginHandler == null ? new DefaultLoginHandler()\r
+ : loginHandler;\r
+ repositoryInstances = new Vector<RepositoryInstance>();\r
+ }\r
+\r
+ public static NuxeoClientEmbedded getInstance() {\r
+ return instance;\r
+ }\r
+\r
+ public void setMultiThreadedLogin(boolean useMultiThreadedLogin) {\r
+ multiThreadedLogin = useMultiThreadedLogin;\r
+ }\r
+\r
+ public boolean getMultiThreadedLogin() {\r
+ return multiThreadedLogin;\r
+ }\r
+\r
+ public synchronized void connect(String locator) throws Exception {\r
+ if (this.locator != null) {\r
+ throw new IllegalStateException("Client is already connected");\r
+ }\r
+ doConnect(AutoConfigurationService.createLocator(locator));\r
+ }\r
+\r
+ public synchronized void connect(InvokerLocator locator) throws Exception {\r
+ if (this.locator != null) {\r
+ throw new IllegalStateException("Client is already connected");\r
+ }\r
+ doConnect(locator);\r
+ }\r
+\r
+ public synchronized void connect(String host, int port) throws Exception {\r
+ if (locator != null) {\r
+ throw new IllegalStateException("Client is already connected");\r
+ }\r
+ doConnect(AutoConfigurationService.createLocator(host, port));\r
+ }\r
+\r
+ public synchronized void forceConnect(InvokerLocator locator)\r
+ throws Exception {\r
+ if (this.locator != null) {\r
+ disconnect();\r
+ }\r
+ doConnect(locator);\r
+ }\r
+\r
+ public synchronized void forceConnect(String locator) throws Exception {\r
+ if (this.locator != null) {\r
+ disconnect();\r
+ }\r
+ doConnect(AutoConfigurationService.createLocator(locator));\r
+ }\r
+\r
+ public synchronized void forceConnect(String host, int port)\r
+ throws Exception {\r
+ if (locator != null) {\r
+ disconnect();\r
+ }\r
+ doConnect(AutoConfigurationService.createLocator(host, port));\r
+ }\r
+\r
+ public synchronized void tryConnect(String host, int port) throws Exception {\r
+ if (locator != null) {\r
+ return; // do nothing\r
+ }\r
+ doConnect(AutoConfigurationService.createLocator(host, port));\r
+ }\r
+\r
+ public synchronized void tryConnect(String url) throws Exception {\r
+ if (locator != null) {\r
+ return; // do nothing\r
+ }\r
+ doConnect(AutoConfigurationService.createLocator(url));\r
+ }\r
+\r
+ public synchronized void tryConnect(InvokerLocator locator)\r
+ throws Exception {\r
+ if (this.locator != null) {\r
+ return; // do nothing\r
+ }\r
+ doConnect(locator);\r
+ }\r
+\r
+ private void doConnect(InvokerLocator locator) throws Exception {\r
+ this.locator = locator;\r
+ try {\r
+ cfg.load(locator);\r
+ // FIXME TODO workaround to work with nxruntime core 1.3.3\r
+ // --------------\r
+ String newPort = Framework.getProperty("org.nuxeo.runtime.1.3.3.streaming.port");\r
+ if (newPort != null) {\r
+ StreamingService streamingService = (StreamingService) Framework.getRuntime().getComponent(\r
+ StreamingService.NAME);\r
+ // streaming config\r
+ String oldLocator = streamingService.getServerLocator();\r
+ int p = oldLocator.lastIndexOf(':');\r
+ if (p > -1) {\r
+ String withoutPort = oldLocator.substring(0, p);\r
+ String serverLocator = withoutPort + ":" + newPort;\r
+ streamingService.stopManager();\r
+ streamingService.setServerLocator(serverLocator);\r
+ streamingService.setServer(false);\r
+ streamingService.startManager();\r
+ }\r
+ }\r
+ // FIXME TODO workaround for remote services\r
+ // -------------------------------\r
+ schemaRemotingWorkaround(locator.getHost());\r
+ // workaround for client login configuration - we need to make it\r
+ // not multi threaded\r
+ // TODO put an option for this in NuxeoClient\r
+ if (!multiThreadedLogin) {\r
+ LoginService ls = Framework.getService(LoginService.class);\r
+ SecurityDomain sysDomain = ls.getSecurityDomain(LoginComponent.SYSTEM_LOGIN);\r
+ SecurityDomain clientDomain = ls.getSecurityDomain(LoginComponent.CLIENT_LOGIN);\r
+ adaptClientSecurityDomain(sysDomain);\r
+ adaptClientSecurityDomain(clientDomain);\r
+ }\r
+ // ----------------\r
+ login();\r
+ } catch (Exception e) {\r
+ this.locator = null;\r
+ throw e;\r
+ }\r
+ fireConnected(this);\r
+ }\r
+\r
+ public static void adaptClientSecurityDomain(SecurityDomain sd) {\r
+ AppConfigurationEntry[] entries = sd.getAppConfigurationEntries();\r
+ if (entries != null) {\r
+ for (int i = 0; i < entries.length; i++) {\r
+ AppConfigurationEntry entry = entries[i];\r
+ if ("org.jboss.security.ClientLoginModule".equals(entry.getLoginModuleName())) {\r
+ Map<String, ?> opts = entry.getOptions();\r
+ Map<String, Object> newOpts = new HashMap<String, Object>(\r
+ opts);\r
+ newOpts.put("multi-threaded", "false");\r
+ entries[i] = new AppConfigurationEntry(\r
+ entry.getLoginModuleName(), entry.getControlFlag(),\r
+ entry.getOptions());\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Workaround for being able to load schemas from remote\r
+ * TODO integrate this in core\r
+ */\r
+ private static void schemaRemotingWorkaround(String host) throws Exception {\r
+ ServiceManager serviceManager = Framework.getLocalService(ServiceManager.class);\r
+ ServiceDescriptor sd = new ServiceDescriptor(TypeProvider.class, "core");\r
+ sd.setLocator("%TypeProviderBean");\r
+ serviceManager.registerService(sd);\r
+ TypeProvider typeProvider = Framework.getService(TypeProvider.class);\r
+ SchemaManager schemaMgr = Framework.getLocalService(SchemaManager.class);\r
+ ((SchemaManagerImpl) schemaMgr).importTypes(typeProvider);\r
+ }\r
+\r
+ public synchronized void disconnect() throws Exception {\r
+ if (locator == null) {\r
+ throw new IllegalStateException("Client is not connected");\r
+ }\r
+ doDisconnect();\r
+ }\r
+\r
+ public synchronized void tryDisconnect() throws Exception {\r
+ if (locator == null) {\r
+ return; // do nothing\r
+ }\r
+ doDisconnect();\r
+ }\r
+\r
+ private void doDisconnect() throws Exception {\r
+ locator = null;\r
+ serverName = null;\r
+ // close repository sessions if any\r
+ Iterator<RepositoryInstance> it = repositoryInstances.iterator();\r
+ while (it.hasNext()) {\r
+ RepositoryInstance repo = it.next();\r
+ try {\r
+ repo.close();\r
+ } catch (Exception e) {\r
+ log.debug("Error while trying to close " + repo, e);\r
+ }\r
+ it.remove();\r
+ }\r
+ // logout\r
+ logout();\r
+ repositoryMgr = null;\r
+ fireDisconnected(this);\r
+ }\r
+\r
+ public synchronized void reconnect() throws Exception {\r
+ if (locator == null) {\r
+ throw new IllegalStateException("Client is not connected");\r
+ }\r
+ InvokerLocator locator = this.locator;\r
+ disconnect();\r
+ connect(locator);\r
+ }\r
+\r
+ public AutoConfigurationService getConfigurationService() {\r
+ return cfg;\r
+ }\r
+\r
+ public synchronized String getServerName() {\r
+ if (locator == null) {\r
+ throw new IllegalStateException("Client is not connected");\r
+ }\r
+ if (serverName == null) {\r
+ if (cfg == null) { // compatibility\r
+ serverName = RemotingService.ping(locator.getHost(),\r
+ locator.getPort());\r
+ } else {\r
+ serverName = cfg.getServerConfiguration().getProductInfo();\r
+ }\r
+ }\r
+ return serverName;\r
+ }\r
+\r
+ public synchronized boolean isConnected() {\r
+ return true;\r
+ }\r
+\r
+ public String getServerHost() {\r
+ if (locator == null) {\r
+ throw new IllegalStateException("Client is not connected");\r
+ }\r
+ return locator.getHost();\r
+ }\r
+\r
+ public int getServerPort() {\r
+ if (locator == null) {\r
+ throw new IllegalStateException("Client is not connected");\r
+ }\r
+ return locator.getPort();\r
+ }\r
+\r
+ public InvokerLocator getLocator() {\r
+ return locator;\r
+ }\r
+\r
+ public synchronized LoginHandler getLoginHandler() {\r
+ return loginHandler;\r
+ }\r
+\r
+ public synchronized void setLoginHandler(LoginHandler loginHandler) {\r
+ this.loginHandler = loginHandler;\r
+ }\r
+\r
+ public synchronized void login() throws LoginException {\r
+ //\r
+ // Login as the Nuxeo system/admin user\r
+ this.login(null);\r
+ }\r
+ \r
+ public synchronized void login(String user) throws LoginException { \r
+ loginContext = Framework.loginAs(user);\r
+ if (logger.isDebugEnabled() == true) {\r
+ Subject subject = loginContext.getSubject();\r
+ Set<Principal> principals = subject.getPrincipals();\r
+ logger.debug("Nuxeo login performed with principals: ");\r
+ for (Principal principal : principals) {\r
+ logger.debug("[" + principal.getName() + "]");\r
+ }\r
+ }\r
+ }\r
+\r
+ public synchronized void logout() throws LoginException {\r
+ if (loginContext != null) {\r
+ loginContext.logout();\r
+ loginContext = null;\r
+ }\r
+ }\r
+\r
+ public RepositoryManager getRepositoryManager() throws Exception {\r
+ if (repositoryMgr == null) {\r
+ repositoryMgr = Framework.getService(RepositoryManager.class);\r
+ }\r
+ return repositoryMgr;\r
+ }\r
+\r
+ /**\r
+ * Gets the repositories available on the connected server.\r
+ *\r
+ * @return the repositories\r
+ */\r
+ public Repository[] getRepositories() throws Exception {\r
+ Collection<Repository> repos = getRepositoryManager().getRepositories();\r
+ return repos.toArray(new Repository[repos.size()]);\r
+ }\r
+\r
+ public Repository getDefaultRepository() throws Exception {\r
+ return getRepositoryManager().getDefaultRepository();\r
+ }\r
+\r
+ public Repository getRepository(String name) throws Exception {\r
+ return getRepositoryManager().getRepository(name);\r
+ }\r
+\r
+ public RepositoryInstance openRepository() throws Exception {\r
+ return openRepository(null);\r
+ }\r
+\r
+ public RepositoryInstance openRepository(String name) throws Exception {\r
+ Repository repository = null;\r
+ if (name != null) {\r
+ repository = getRepositoryManager().getRepository(name);\r
+ } else {\r
+ repository = getRepositoryManager().getDefaultRepository();\r
+ }\r
+ RepositoryInstance repo = newRepositoryInstance(repository);\r
+ repositoryInstances.add(repo);\r
+\r
+ return repo;\r
+ }\r
+\r
+ public void releaseRepository(RepositoryInstance repo) throws Exception {\r
+ try {\r
+ repo.close();\r
+ } finally {\r
+ repositoryInstances.remove(repo);\r
+ }\r
+ }\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
+ if (cl == null) {\r
+ cl = NuxeoClientEmbedded.class.getClassLoader();\r
+ }\r
+ return new RepositoryInstanceHandler(repository).getProxy();\r
+ }\r
+\r
+ public void addConnectionListener(ConnectionListener listener) {\r
+ connectionListeners.add(listener);\r
+ }\r
+\r
+ public void removeConnectionListener(ConnectionListener listener) {\r
+ connectionListeners.remove(listener);\r
+ }\r
+\r
+ private void fireDisconnected(NuxeoClientEmbedded client) {\r
+ Object[] listeners = connectionListeners.getListeners();\r
+ for (Object listener : listeners) {\r
+// ((ConnectionListener) listener).disconnected(client);\r
+ }\r
+ }\r
+\r
+ private void fireConnected(NuxeoClientEmbedded client) {\r
+ Object[] listeners = connectionListeners.getListeners();\r
+ for (Object listener : listeners) {\r
+// ((ConnectionListener) listener).connected(client);\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package org.collectionspace.services.nuxeo.client.java;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.util.Collection;\r
+import java.util.Hashtable;\r
+import java.util.Iterator;\r
+\r
+import javax.servlet.ServletConfig;\r
+import javax.servlet.ServletContext;\r
+\r
+//import org.collectionspace.services.common.RepositoryClientConfigType;\r
+import org.collectionspace.services.common.RepositoryClientConfigType;\r
+import org.collectionspace.services.nuxeo.util.NuxeoUtils;\r
+import org.nuxeo.ecm.core.api.CoreInstance;\r
+import org.nuxeo.ecm.core.api.DocumentModel;\r
+import org.nuxeo.ecm.core.api.DocumentModelList;\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.RepositoryManager;\r
+import org.nuxeo.ecm.core.client.DefaultLoginHandler;\r
+import org.nuxeo.ecm.core.client.NuxeoApp;\r
+//import org.nuxeo.ecm.core.client.NuxeoClient;\r
+import org.nuxeo.osgi.application.FrameworkBootstrap;\r
+import org.nuxeo.runtime.api.Framework;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+public class NuxeoConnectorEmbedded {\r
+ /*\r
+ <host>127.0.0.1</host>\r
+ <port>62474</port> <!-- java -->\r
+ */\r
+ private Logger logger = LoggerFactory.getLogger(NuxeoConnectorEmbedded.class);\r
+\r
+ public final static String NUXEO_CLIENT_DIR = "nuxeo-client";\r
+ public final static String NUXEO_SERVER_DIR = "nuxeo-server";\r
+\r
+ private static final String HOST = "127.0.0.1";\r
+ private static final int PORT = 62474;\r
+ \r
+ private final static String CSPACE_JEESERVER_HOME = "CSPACE_CONTAINER";\r
+ private final static String CSPACE_NUXEO_HOME = "CSPACE_NUXEO_HOME";\r
+ \r
+ private static final String NUXEO_CLIENT_USERNAME = "NUXEO_CLIENT_USERNAME";\r
+ private static final String NUXEO_CLIENT_PASSWORD = "NUXEO_CLIENT_PASSWORD";\r
+\r
+ private static final NuxeoConnectorEmbedded self = new NuxeoConnectorEmbedded();\r
+ private NuxeoClientEmbedded client;\r
+ private ServletContext servletContext = null;\r
+ private volatile boolean initialized = false; // use volatile for lazy\r
+ // initialization in\r
+ // singleton\r
+ private RepositoryClientConfigType repositoryClientConfig;\r
+ public FrameworkBootstrap fb;\r
+\r
+ private NuxeoConnectorEmbedded() {\r
+ }\r
+\r
+ public final static NuxeoConnectorEmbedded getInstance() {\r
+ return self;\r
+ }\r
+\r
+ private String getClientUserName() {\r
+ String username = System.getenv(NUXEO_CLIENT_USERNAME);\r
+ if (username == null) {\r
+ username = "Administrator";\r
+ }\r
+ return username;\r
+ }\r
+\r
+ private String getClientPassword() {\r
+ String password = System.getenv(NUXEO_CLIENT_PASSWORD);\r
+ if (password == null) {\r
+ password = "Administrator";\r
+ }\r
+ return password;\r
+ }\r
+ \r
+ private String getServerRootPath() {\r
+ String result = null;\r
+ \r
+ String prop = System.getenv(CSPACE_JEESERVER_HOME);\r
+ if (prop == null || prop.isEmpty()) {\r
+ logger.error("The following CollectionSpace services' environment variable needs to be set: " + CSPACE_JEESERVER_HOME);\r
+ }\r
+ \r
+ return result;\r
+ }\r
+ \r
+ private String getNuxeoServerPath(String serverRootPath) throws IOException {\r
+ String result = null;\r
+ //\r
+ // Look for the CSPACE_NUXEO_HOME environment variable that might contain the fully qualified path of the\r
+ // Nuxeo EP configuration directory.\r
+ //\r
+ String prop = System.getenv(CSPACE_NUXEO_HOME);\r
+ if (prop != null && !prop.isEmpty()) {\r
+ result = prop;\r
+ } else {\r
+ //\r
+ // Could not find the 'CSPACE_NUXEO_HOME' environment variable, so using the default location instead.\r
+ //\r
+ result = serverRootPath + "/" + NUXEO_SERVER_DIR;\r
+ }\r
+ \r
+ return result;\r
+ }\r
+ \r
+ private File getNuxeoServerDir(String serverRootPath) throws IOException {\r
+ File result = null;\r
+ String errMsg = null;\r
+ \r
+ String path = getNuxeoServerPath(serverRootPath);\r
+ if (path != null) {\r
+ File temp = new File(path);\r
+ if (temp.exists() == true) {\r
+ result = temp;\r
+ } else {\r
+ errMsg = "The Nuxeo EP configuration directory is missing or inaccessible at: '" + path + "'.";\r
+ }\r
+ }\r
+ \r
+ if (result == null) {\r
+ if (errMsg == null) {\r
+ path = path != null ? path : "<empty>";\r
+ errMsg = "Unknown error trying to find Nuxeo configuration: '" +\r
+ CSPACE_NUXEO_HOME + "' = " +\r
+ path;\r
+ }\r
+ throw new IOException(errMsg);\r
+ }\r
+ \r
+ return result;\r
+ }\r
+\r
+ //\r
+ // Start/boot the Nuxeo EP server instance\r
+ //\r
+ private void startNuxeoEP(String serverRootPath) throws Exception {\r
+ File nuxeoHomeDir = getNuxeoServerDir(serverRootPath);\r
+\r
+ if (logger.isInfoEnabled() == true) {\r
+ logger.info("Starting Nuxeo EP server from configuration at: "\r
+ + nuxeoHomeDir.getCanonicalPath());\r
+ }\r
+ \r
+ fb = new FrameworkBootstrap(NuxeoConnectorEmbedded.class.getClassLoader(),\r
+ nuxeoHomeDir);\r
+ fb.initialize();\r
+ fb.start();\r
+ }\r
+\r
+ /**\r
+ * release releases resources occupied by Nuxeo remoting client runtime\r
+ * \r
+ * @throws java.lang.Exception\r
+ */\r
+ public void release() throws Exception {\r
+ if (initialized == true) {\r
+ try {\r
+ client.tryDisconnect();\r
+ } catch (Exception e) {\r
+ logger.error("Failed to disconnect Nuxeo connection.", e);\r
+ throw e;\r
+ }\r
+ }\r
+ }\r
+\r
+ public void initialize(String serverRootPath,\r
+ RepositoryClientConfigType repositoryClientConfig,\r
+ ServletContext servletContext) throws Exception {\r
+ if (initialized == false) {\r
+ synchronized (this) {\r
+ if (initialized == false) {\r
+ this.servletContext = servletContext;\r
+ this.repositoryClientConfig = repositoryClientConfig;\r
+ startNuxeoEP(serverRootPath);\r
+ client = new NuxeoClientEmbedded();\r
+ initialized = true;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * releaseRepositorySession releases given repository session\r
+ * \r
+ * @param repoSession\r
+ * @throws java.lang.Exception\r
+ */\r
+ public void releaseRepositorySession(RepositoryInstance repoSession)\r
+ throws Exception {\r
+ if (repoSession != null) {\r
+ getClient().releaseRepository(repoSession);\r
+\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("releaseRepositorySession() released repository session");\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * getRepositorySession get session to default repository\r
+ * \r
+ * @return RepositoryInstance\r
+ * @throws java.lang.Exception\r
+ */\r
+ public RepositoryInstance getRepositorySession() throws Exception {\r
+ RepositoryInstance repoSession = getClient().openRepository();\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("getRepositorySession() opened repository session");\r
+ }\r
+ return repoSession;\r
+\r
+ // Repository repository =\r
+ // Framework.getService(RepositoryManager.class).getDefaultRepository();\r
+ // session = repository.open();\r
+\r
+ }\r
+\r
+ /**\r
+ * getClient get Nuxeo client for accessing Nuxeo services remotely using\r
+ * Nuxeo Java (EJB) Remote APIS\r
+ * \r
+ * @return NuxeoClient\r
+ * @throws java.lang.Exception\r
+ */\r
+ public NuxeoClientEmbedded getClient() throws Exception {\r
+ if (initialized == true) {\r
+ if (client.isConnected()) {\r
+ client.login();\r
+ return client;\r
+ } else {\r
+ client.forceConnect(this.HOST,\r
+ this.PORT);\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("getClient(): connection successful port="\r
+ + this.PORT);\r
+ }\r
+ return client;\r
+ }\r
+ }\r
+ String msg = "NuxeoConnector is not initialized!";\r
+ logger.error(msg);\r
+ throw new IllegalStateException(msg);\r
+ }\r
+\r
+ /**\r
+ * retrieveWorkspaceIds retrieves all workspace ids from default repository\r
+ * \r
+ * @param tenantDomain\r
+ * domain representing tenant\r
+ * @return\r
+ * @throws java.lang.Exception\r
+ */\r
+ public Hashtable<String, String> retrieveWorkspaceIds(String tenantDomain)\r
+ throws Exception {\r
+ RepositoryInstance repoSession = null;\r
+ Hashtable<String, String> workspaceIds = new Hashtable<String, String>();\r
+ try {\r
+ repoSession = getRepositorySession();\r
+ DocumentModel rootDoc = repoSession.getRootDocument();\r
+ DocumentModelList rootChildrenList = repoSession\r
+ .getChildren(rootDoc.getRef());\r
+ Iterator<DocumentModel> diter = rootChildrenList.iterator();\r
+ while (diter.hasNext()) {\r
+ DocumentModel domain = diter.next();\r
+ String domainPath = "/" + tenantDomain;\r
+ if (!domain.getPathAsString().equalsIgnoreCase(domainPath)) {\r
+ continue;\r
+ }\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("domain=" + domain.toString());\r
+ }\r
+ DocumentModelList domainChildrenList = repoSession\r
+ .getChildren(domain.getRef());\r
+ Iterator<DocumentModel> witer = domainChildrenList.iterator();\r
+ while (witer.hasNext()) {\r
+ DocumentModel childNode = witer.next();\r
+ if (NuxeoUtils.Workspaces.equalsIgnoreCase(childNode.getName())) { \r
+ DocumentModelList workspaceList = repoSession\r
+ .getChildren(childNode.getRef());\r
+ Iterator<DocumentModel> wsiter = workspaceList\r
+ .iterator();\r
+ while (wsiter.hasNext()) {\r
+ DocumentModel workspace = wsiter.next();\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("workspace name="\r
+ + workspace.getName() + " id="\r
+ + workspace.getId());\r
+ }\r
+ workspaceIds.put(workspace.getName().toLowerCase(),\r
+ workspace.getId());\r
+ }\r
+ }\r
+ }\r
+ }\r
+ } catch (Exception e) {\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("retrieveWorkspaceIds() caught exception ", e);\r
+ }\r
+ throw e;\r
+ } finally {\r
+ if (repoSession != null) {\r
+ releaseRepositorySession(repoSession);\r
+ }\r
+ }\r
+ return workspaceIds;\r
+ }\r
+ \r
+ @Deprecated\r
+ private void loadBundles() throws Exception {\r
+ }\r
+ \r
+}\r
--- /dev/null
+package org.collectionspace.services.nuxeo.client.java;\r
+\r
+import java.io.File;\r
+import java.util.Collection;\r
+import java.util.Hashtable;\r
+import java.util.Iterator;\r
+\r
+import org.collectionspace.services.common.RepositoryClientConfigType;\r
+import org.nuxeo.ecm.core.api.CoreInstance;\r
+import org.nuxeo.ecm.core.api.DocumentModel;\r
+import org.nuxeo.ecm.core.api.DocumentModelList;\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.RepositoryManager;\r
+import org.nuxeo.ecm.core.client.DefaultLoginHandler;\r
+import org.nuxeo.ecm.core.client.NuxeoApp;\r
+import org.nuxeo.ecm.core.client.NuxeoClient;\r
+import org.nuxeo.osgi.application.FrameworkBootstrap;\r
+import org.nuxeo.runtime.api.Framework;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+public class NuxeoConnectorRemote {\r
+ public FrameworkBootstrap fb;\r
+ public final static String NUXEO_CLIENT_DIR = "nuxeo-client";\r
+ private Logger logger = LoggerFactory.getLogger(NuxeoConnectorRemote.class);\r
+ private static final NuxeoConnectorRemote self = new NuxeoConnectorRemote();\r
+ private static final String NUXEO_CLIENT_USERNAME = "NUXEO_CLIENT_USERNAME";\r
+ private static final String NUXEO_CLIENT_PASSWORD = "NUXEO_CLIENT_PASSWORD";\r
+ private NuxeoClient client;\r
+ private volatile boolean initialized = false; // use volatile for lazy\r
+ // initialization in\r
+ // singleton\r
+ private RepositoryClientConfigType repositoryClientConfig;\r
+\r
+ private NuxeoConnectorRemote() {\r
+ }\r
+\r
+ public final static NuxeoConnectorRemote getInstance() {\r
+ return self;\r
+ }\r
+\r
+ private String getClientUserName(\r
+ RepositoryClientConfigType repositoryClientConfig) {\r
+ String username = System.getenv(NUXEO_CLIENT_USERNAME);\r
+ if (username == null) {\r
+ username = repositoryClientConfig.getUser();\r
+ }\r
+ return username;\r
+ }\r
+\r
+ private String getClientPassword(\r
+ RepositoryClientConfigType repositoryClientConfig) {\r
+ String password = System.getenv(NUXEO_CLIENT_PASSWORD);\r
+ if (password == null) {\r
+ password = repositoryClientConfig.getPassword();\r
+ }\r
+ return password;\r
+ }\r
+\r
+ private void startNuxeoEP() throws Exception {\r
+ String nuxeoHome = "nuxeo-client/";\r
+ String serverRootDir = System.getProperty("jboss.server.home.dir");\r
+ if (serverRootDir == null) {\r
+ serverRootDir = "."; // assume server is started from server root,\r
+ // e.g. server/cspace\r
+ }\r
+ File nuxeoHomeDir = new File(serverRootDir + File.separator + nuxeoHome);\r
+ logger.info("Loading Nuxeo configuration from: "\r
+ + nuxeoHomeDir.getAbsolutePath());\r
+ if (nuxeoHomeDir.exists() == false) {\r
+ String msg = "Library bundles requried to deploy Nuxeo client not found: "\r
+ + " directory named nuxeo-client with bundles does not exist in "\r
+ + serverRootDir;\r
+ logger.error(msg);\r
+ throw new IllegalStateException(msg);\r
+ }\r
+ fb = new FrameworkBootstrap(NuxeoConnectorRemote.class.getClassLoader(),\r
+ nuxeoHomeDir);\r
+ fb.initialize();\r
+ fb.start();\r
+ }\r
+\r
+ /**\r
+ * release releases resources occupied by Nuxeo remoting client runtime\r
+ * \r
+ * @throws java.lang.Exception\r
+ */\r
+ public void release() throws Exception {\r
+ if (initialized == true) {\r
+ try {\r
+ client.tryDisconnect();\r
+ } catch (Exception e) {\r
+ logger.error("Failed to disconnect Nuxeo connection.", e);\r
+ throw e;\r
+ }\r
+ }\r
+ }\r
+\r
+ public void initialize(RepositoryClientConfigType repositoryClientConfig)\r
+ throws Exception {\r
+ if (initialized == false) {\r
+ synchronized (this) {\r
+ if (initialized == false) {\r
+ try {\r
+ this.repositoryClientConfig = repositoryClientConfig;\r
+ startNuxeoEP();\r
+ // client = NuxeoClient.getInstance();\r
+ client = new NuxeoClient();\r
+ String username = getClientUserName(repositoryClientConfig);\r
+ String password = getClientPassword(repositoryClientConfig);\r
+ DefaultLoginHandler loginHandler = new DefaultLoginHandler(\r
+ username, password);\r
+ client.setLoginHandler(loginHandler);\r
+ client.tryConnect(repositoryClientConfig.getHost(),\r
+ repositoryClientConfig.getPort());\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("initialize(): connection successful port="\r
+ + repositoryClientConfig.getPort());\r
+ }\r
+ initialized = true;\r
+ } catch (Exception e) {\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("Caught exception while initializing",\r
+ e);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * releaseRepositorySession releases given repository session\r
+ * \r
+ * @param repoSession\r
+ * @throws java.lang.Exception\r
+ */\r
+ public void releaseRepositorySession(RepositoryInstance repoSession)\r
+ throws Exception {\r
+ if (repoSession != null) {\r
+ getClient().releaseRepository(repoSession);\r
+\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("releaseRepositorySession() released repository session");\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * getRepositorySession get session to default repository\r
+ * \r
+ * @return RepositoryInstance\r
+ * @throws java.lang.Exception\r
+ */\r
+ public RepositoryInstance getRepositorySession() throws Exception {\r
+ RepositoryInstance repoSession = getClient().openRepository();\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("getRepositorySession() opened repository session");\r
+ }\r
+ return repoSession;\r
+\r
+ // Repository repository =\r
+ // Framework.getService(RepositoryManager.class).getDefaultRepository();\r
+ // session = repository.open();\r
+\r
+ }\r
+\r
+ /**\r
+ * getClient get Nuxeo client for accessing Nuxeo services remotely using\r
+ * Nuxeo Java (EJB) Remote APIS\r
+ * \r
+ * @return NuxeoClient\r
+ * @throws java.lang.Exception\r
+ */\r
+ public NuxeoClient getClient() throws Exception {\r
+ if (initialized == true) {\r
+ if (client.isConnected()) {\r
+ client.login();\r
+ return client;\r
+ } else {\r
+ client.forceConnect(repositoryClientConfig.getHost(),\r
+ repositoryClientConfig.getPort());\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("getClient(): connection successful port="\r
+ + repositoryClientConfig.getPort());\r
+ }\r
+ return client;\r
+ }\r
+ }\r
+ String msg = "NuxeoConnector is not initialized!";\r
+ logger.error(msg);\r
+ throw new IllegalStateException(msg);\r
+ }\r
+\r
+ /**\r
+ * retrieveWorkspaceIds retrieves all workspace ids from default repository\r
+ * \r
+ * @param tenantDomain\r
+ * domain representing tenant\r
+ * @return\r
+ * @throws java.lang.Exception\r
+ */\r
+ public Hashtable<String, String> retrieveWorkspaceIds(String tenantDomain)\r
+ throws Exception {\r
+ RepositoryInstance repoSession = null;\r
+ Hashtable<String, String> workspaceIds = new Hashtable<String, String>();\r
+ try {\r
+ repoSession = getRepositorySession();\r
+ DocumentModel rootDoc = repoSession.getRootDocument();\r
+ DocumentModelList rootChildrenList = repoSession\r
+ .getChildren(rootDoc.getRef());\r
+ Iterator<DocumentModel> diter = rootChildrenList.iterator();\r
+ while (diter.hasNext()) {\r
+ DocumentModel domain = diter.next();\r
+ String domainPath = "/" + tenantDomain;\r
+ if (!domain.getPathAsString().equalsIgnoreCase(domainPath)) {\r
+ continue;\r
+ }\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("domain=" + domain.toString());\r
+ }\r
+ DocumentModelList domainChildrenList = repoSession\r
+ .getChildren(domain.getRef());\r
+ Iterator<DocumentModel> witer = domainChildrenList.iterator();\r
+ while (witer.hasNext()) {\r
+ DocumentModel childNode = witer.next();\r
+ if ("Workspaces".equalsIgnoreCase(childNode.getName())) {\r
+ DocumentModelList workspaceList = repoSession\r
+ .getChildren(childNode.getRef());\r
+ Iterator<DocumentModel> wsiter = workspaceList\r
+ .iterator();\r
+ while (wsiter.hasNext()) {\r
+ DocumentModel workspace = wsiter.next();\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("workspace name="\r
+ + workspace.getName() + " id="\r
+ + workspace.getId());\r
+ }\r
+ workspaceIds.put(workspace.getName().toLowerCase(),\r
+ workspace.getId());\r
+ }\r
+ }\r
+ }\r
+ }\r
+ } catch (Exception e) {\r
+ if (logger.isDebugEnabled()) {\r
+ logger.debug("retrieveWorkspaceIds() caught exception ", e);\r
+ }\r
+ throw e;\r
+ } finally {\r
+ if (repoSession != null) {\r
+ releaseRepositorySession(repoSession);\r
+ }\r
+ }\r
+ return workspaceIds;\r
+ }\r
+ \r
+ @Deprecated\r
+ private void loadBundles() throws Exception {\r
+ }\r
+ \r
+}\r