1 package org.collectionspace.services.nuxeo.client.java;
\r
4 import java.util.Collection;
\r
5 import java.util.Hashtable;
\r
6 import java.util.Iterator;
\r
8 import org.collectionspace.services.config.RepositoryClientConfigType;
\r
9 import org.nuxeo.ecm.core.api.CoreInstance;
\r
10 import org.nuxeo.ecm.core.api.DocumentModel;
\r
11 import org.nuxeo.ecm.core.api.DocumentModelList;
\r
12 import org.nuxeo.ecm.core.api.repository.Repository;
\r
13 import org.nuxeo.ecm.core.api.repository.RepositoryInstance;
\r
14 import org.nuxeo.ecm.core.api.repository.RepositoryManager;
\r
15 import org.nuxeo.ecm.core.client.DefaultLoginHandler;
\r
16 import org.nuxeo.ecm.core.client.NuxeoApp;
\r
17 import org.nuxeo.ecm.core.client.NuxeoClient;
\r
18 import org.nuxeo.osgi.application.FrameworkBootstrap;
\r
19 import org.nuxeo.runtime.api.Framework;
\r
20 import org.slf4j.Logger;
\r
21 import org.slf4j.LoggerFactory;
\r
23 public class NuxeoConnectorRemote {
\r
24 public FrameworkBootstrap fb;
\r
25 public final static String NUXEO_CLIENT_DIR = "nuxeo-client";
\r
26 private Logger logger = LoggerFactory.getLogger(NuxeoConnectorRemote.class);
\r
27 private static final NuxeoConnectorRemote self = new NuxeoConnectorRemote();
\r
28 private static final String NUXEO_CLIENT_USERNAME = "NUXEO_CLIENT_USERNAME";
\r
29 private static final String NUXEO_CLIENT_PASSWORD = "NUXEO_CLIENT_PASSWORD";
\r
30 private NuxeoClient client;
\r
31 private volatile boolean initialized = false; // use volatile for lazy
\r
32 // initialization in
\r
34 private RepositoryClientConfigType repositoryClientConfig;
\r
36 private NuxeoConnectorRemote() {
\r
39 public final static NuxeoConnectorRemote getInstance() {
\r
43 private String getClientUserName(
\r
44 RepositoryClientConfigType repositoryClientConfig) {
\r
45 String username = System.getenv(NUXEO_CLIENT_USERNAME);
\r
46 if (username == null) {
\r
47 username = repositoryClientConfig.getUser();
\r
52 private String getClientPassword(
\r
53 RepositoryClientConfigType repositoryClientConfig) {
\r
54 String password = System.getenv(NUXEO_CLIENT_PASSWORD);
\r
55 if (password == null) {
\r
56 password = repositoryClientConfig.getPassword();
\r
61 private void startNuxeoEP() throws Exception {
\r
62 String nuxeoHome = "nuxeo-client/";
\r
63 String serverRootDir = System.getProperty("jboss.server.home.dir");
\r
64 if (serverRootDir == null) {
\r
65 serverRootDir = "."; // assume server is started from server root,
\r
66 // e.g. server/cspace
\r
68 File nuxeoHomeDir = new File(serverRootDir + File.separator + nuxeoHome);
\r
69 logger.info("Loading Nuxeo configuration from: "
\r
70 + nuxeoHomeDir.getAbsolutePath());
\r
71 if (nuxeoHomeDir.exists() == false) {
\r
72 String msg = "Library bundles requried to deploy Nuxeo client not found: "
\r
73 + " directory named nuxeo-client with bundles does not exist in "
\r
76 throw new IllegalStateException(msg);
\r
78 fb = new FrameworkBootstrap(NuxeoConnectorRemote.class.getClassLoader(),
\r
85 * release releases resources occupied by Nuxeo remoting client runtime
\r
87 * @throws java.lang.Exception
\r
89 public void release() throws Exception {
\r
90 if (initialized == true) {
\r
92 client.tryDisconnect();
\r
93 } catch (Exception e) {
\r
94 logger.error("Failed to disconnect Nuxeo connection.", e);
\r
100 public void initialize(RepositoryClientConfigType repositoryClientConfig)
\r
102 if (initialized == false) {
\r
103 synchronized (this) {
\r
104 if (initialized == false) {
\r
106 this.repositoryClientConfig = repositoryClientConfig;
\r
108 // client = NuxeoClient.getInstance();
\r
109 client = new NuxeoClient();
\r
110 String username = getClientUserName(repositoryClientConfig);
\r
111 String password = getClientPassword(repositoryClientConfig);
\r
112 DefaultLoginHandler loginHandler = new DefaultLoginHandler(
\r
113 username, password);
\r
114 client.setLoginHandler(loginHandler);
\r
115 client.tryConnect(repositoryClientConfig.getHost(),
\r
116 repositoryClientConfig.getPort());
\r
117 if (logger.isDebugEnabled()) {
\r
118 logger.debug("initialize(): connection successful port="
\r
119 + repositoryClientConfig.getPort());
\r
121 initialized = true;
\r
122 } catch (Exception e) {
\r
123 if (logger.isDebugEnabled()) {
\r
124 logger.debug("Caught exception while initializing",
\r
134 * releaseRepositorySession releases given repository session
\r
136 * @param repoSession
\r
137 * @throws java.lang.Exception
\r
139 public void releaseRepositorySession(RepositoryInstance repoSession)
\r
141 if (repoSession != null) {
\r
142 getClient().releaseRepository(repoSession);
\r
144 if (logger.isDebugEnabled()) {
\r
145 logger.debug("releaseRepositorySession() released repository session");
\r
151 * getRepositorySession get session to default repository
\r
153 * @return RepositoryInstance
\r
154 * @throws java.lang.Exception
\r
156 public RepositoryInstance getRepositorySession() throws Exception {
\r
157 RepositoryInstance repoSession = getClient().openRepository();
\r
158 if (logger.isDebugEnabled()) {
\r
159 logger.debug("getRepositorySession() opened repository session");
\r
161 return repoSession;
\r
163 // Repository repository =
\r
164 // Framework.getService(RepositoryManager.class).getDefaultRepository();
\r
165 // session = repository.open();
\r
170 * getClient get Nuxeo client for accessing Nuxeo services remotely using
\r
171 * Nuxeo Java (EJB) Remote APIS
\r
173 * @return NuxeoClient
\r
174 * @throws java.lang.Exception
\r
176 public NuxeoClient getClient() throws Exception {
\r
177 if (initialized == true) {
\r
178 if (client.isConnected()) {
\r
182 client.forceConnect(repositoryClientConfig.getHost(),
\r
183 repositoryClientConfig.getPort());
\r
184 if (logger.isDebugEnabled()) {
\r
185 logger.debug("getClient(): connection successful port="
\r
186 + repositoryClientConfig.getPort());
\r
191 String msg = "NuxeoConnector is not initialized!";
\r
193 throw new IllegalStateException(msg);
\r
197 * retrieveWorkspaceIds retrieves all workspace ids from default repository
\r
199 * @param tenantDomain
\r
200 * domain representing tenant
\r
202 * @throws java.lang.Exception
\r
204 public Hashtable<String, String> retrieveWorkspaceIds(String tenantDomain)
\r
206 RepositoryInstance repoSession = null;
\r
207 Hashtable<String, String> workspaceIds = new Hashtable<String, String>();
\r
209 repoSession = getRepositorySession();
\r
210 DocumentModel rootDoc = repoSession.getRootDocument();
\r
211 DocumentModelList rootChildrenList = repoSession
\r
212 .getChildren(rootDoc.getRef());
\r
213 Iterator<DocumentModel> diter = rootChildrenList.iterator();
\r
214 while (diter.hasNext()) {
\r
215 DocumentModel domain = diter.next();
\r
216 String domainPath = "/" + tenantDomain;
\r
217 if (!domain.getPathAsString().equalsIgnoreCase(domainPath)) {
\r
220 if (logger.isDebugEnabled()) {
\r
221 logger.debug("domain=" + domain.toString());
\r
223 DocumentModelList domainChildrenList = repoSession
\r
224 .getChildren(domain.getRef());
\r
225 Iterator<DocumentModel> witer = domainChildrenList.iterator();
\r
226 while (witer.hasNext()) {
\r
227 DocumentModel childNode = witer.next();
\r
228 if ("Workspaces".equalsIgnoreCase(childNode.getName())) {
\r
229 DocumentModelList workspaceList = repoSession
\r
230 .getChildren(childNode.getRef());
\r
231 Iterator<DocumentModel> wsiter = workspaceList
\r
233 while (wsiter.hasNext()) {
\r
234 DocumentModel workspace = wsiter.next();
\r
235 if (logger.isDebugEnabled()) {
\r
236 logger.debug("workspace name="
\r
237 + workspace.getName() + " id="
\r
238 + workspace.getId());
\r
240 workspaceIds.put(workspace.getName().toLowerCase(),
\r
241 workspace.getId());
\r
246 } catch (Exception e) {
\r
247 if (logger.isDebugEnabled()) {
\r
248 logger.debug("retrieveWorkspaceIds() caught exception ", e);
\r
252 if (repoSession != null) {
\r
253 releaseRepositorySession(repoSession);
\r
256 return workspaceIds;
\r
260 private void loadBundles() throws Exception {
\r