]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
bada25bd77b9a33e913da7e12f39d29cf84a0605
[tmp/jakarta-migration.git] /
1 package org.collectionspace.services.nuxeo.client.java;\r
2 \r
3 import java.io.File;\r
4 import java.util.Collection;\r
5 import java.util.Hashtable;\r
6 import java.util.Iterator;\r
7 \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
22 \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
33                                                                                                         // singleton\r
34         private RepositoryClientConfigType repositoryClientConfig;\r
35 \r
36         private NuxeoConnectorRemote() {\r
37         }\r
38 \r
39         public final static NuxeoConnectorRemote getInstance() {\r
40                 return self;\r
41         }\r
42 \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
48                 }\r
49                 return username;\r
50         }\r
51 \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
57                 }\r
58                 return password;\r
59         }\r
60 \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
67                 }\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
74                                         + serverRootDir;\r
75                         logger.error(msg);\r
76                         throw new IllegalStateException(msg);\r
77                 }\r
78                 fb = new FrameworkBootstrap(NuxeoConnectorRemote.class.getClassLoader(),\r
79                                 nuxeoHomeDir);\r
80                 fb.initialize();\r
81                 fb.start();\r
82         }\r
83 \r
84         /**\r
85          * release releases resources occupied by Nuxeo remoting client runtime\r
86          * \r
87          * @throws java.lang.Exception\r
88          */\r
89         public void release() throws Exception {\r
90                 if (initialized == true) {\r
91                         try {\r
92                                 client.tryDisconnect();\r
93                         } catch (Exception e) {\r
94                                 logger.error("Failed to disconnect Nuxeo connection.", e);\r
95                                 throw e;\r
96                         }\r
97                 }\r
98         }\r
99 \r
100         public void initialize(RepositoryClientConfigType repositoryClientConfig)\r
101                         throws Exception {\r
102                 if (initialized == false) {\r
103                         synchronized (this) {\r
104                                 if (initialized == false) {\r
105                                         try {\r
106                                                 this.repositoryClientConfig = repositoryClientConfig;\r
107                                                 startNuxeoEP();\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
120                                                 }\r
121                                                 initialized = true;\r
122                                         } catch (Exception e) {\r
123                                                 if (logger.isDebugEnabled()) {\r
124                                                         logger.debug("Caught exception while initializing",\r
125                                                                         e);\r
126                                                 }\r
127                                         }\r
128                                 }\r
129                         }\r
130                 }\r
131         }\r
132 \r
133         /**\r
134          * releaseRepositorySession releases given repository session\r
135          * \r
136          * @param repoSession\r
137          * @throws java.lang.Exception\r
138          */\r
139         public void releaseRepositorySession(RepositoryInstance repoSession)\r
140                         throws Exception {\r
141                 if (repoSession != null) {\r
142                         getClient().releaseRepository(repoSession);\r
143 \r
144                         if (logger.isDebugEnabled()) {\r
145                                 logger.debug("releaseRepositorySession() released repository session");\r
146                         }\r
147                 }\r
148         }\r
149 \r
150         /**\r
151          * getRepositorySession get session to default repository\r
152          * \r
153          * @return RepositoryInstance\r
154          * @throws java.lang.Exception\r
155          */\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
160                 }\r
161                 return repoSession;\r
162 \r
163                 // Repository repository =\r
164                 // Framework.getService(RepositoryManager.class).getDefaultRepository();\r
165                 // session = repository.open();\r
166 \r
167         }\r
168 \r
169         /**\r
170          * getClient get Nuxeo client for accessing Nuxeo services remotely using\r
171          * Nuxeo Java (EJB) Remote APIS\r
172          * \r
173          * @return NuxeoClient\r
174          * @throws java.lang.Exception\r
175          */\r
176         public NuxeoClient getClient() throws Exception {\r
177                 if (initialized == true) {\r
178                         if (client.isConnected()) {\r
179                                 client.login();\r
180                                 return client;\r
181                         } else {\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
187                                 }\r
188                                 return client;\r
189                         }\r
190                 }\r
191                 String msg = "NuxeoConnector is not initialized!";\r
192                 logger.error(msg);\r
193                 throw new IllegalStateException(msg);\r
194         }\r
195 \r
196         /**\r
197          * retrieveWorkspaceIds retrieves all workspace ids from default repository\r
198          * \r
199          * @param tenantDomain\r
200          *            domain representing tenant\r
201          * @return\r
202          * @throws java.lang.Exception\r
203          */\r
204         public Hashtable<String, String> retrieveWorkspaceIds(String tenantDomain)\r
205                         throws Exception {\r
206                 RepositoryInstance repoSession = null;\r
207                 Hashtable<String, String> workspaceIds = new Hashtable<String, String>();\r
208                 try {\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
218                                         continue;\r
219                                 }\r
220                                 if (logger.isDebugEnabled()) {\r
221                                         logger.debug("domain=" + domain.toString());\r
222                                 }\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
232                                                                 .iterator();\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
239                                                         }\r
240                                                         workspaceIds.put(workspace.getName().toLowerCase(),\r
241                                                                         workspace.getId());\r
242                                                 }\r
243                                         }\r
244                                 }\r
245                         }\r
246                 } catch (Exception e) {\r
247                         if (logger.isDebugEnabled()) {\r
248                                 logger.debug("retrieveWorkspaceIds() caught exception ", e);\r
249                         }\r
250                         throw e;\r
251                 } finally {\r
252                         if (repoSession != null) {\r
253                                 releaseRepositorySession(repoSession);\r
254                         }\r
255                 }\r
256                 return workspaceIds;\r
257         }\r
258         \r
259         @Deprecated\r
260     private void loadBundles() throws Exception {\r
261     }\r
262         \r
263 }\r