]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-4526: Adding missing classes to the repo.
authorRichard Millet <richard.millet@berkeley.edu>
Thu, 17 Nov 2011 08:38:15 +0000 (08:38 +0000)
committerRichard Millet <richard.millet@berkeley.edu>
Thu, 17 Nov 2011 08:38:15 +0000 (08:38 +0000)
services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoClientEmbedded.java [new file with mode: 0644]
services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoConnectorEmbedded.java [new file with mode: 0644]
services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoConnectorRemote.java [new file with mode: 0644]

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
new file mode 100644 (file)
index 0000000..821ded2
--- /dev/null
@@ -0,0 +1,462 @@
+/*\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
diff --git a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoConnectorEmbedded.java b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoConnectorEmbedded.java
new file mode 100644 (file)
index 0000000..af7c65a
--- /dev/null
@@ -0,0 +1,316 @@
+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
diff --git a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoConnectorRemote.java b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoConnectorRemote.java
new file mode 100644 (file)
index 0000000..2949e21
--- /dev/null
@@ -0,0 +1,263 @@
+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