]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
1f2330ab684dcaa2129d6040e6ceef6d15bbd281
[tmp/jakarta-migration.git] /
1 /*\r
2  * (C) Copyright 2006-2010 Nuxeo SAS (http://nuxeo.com/) and contributors.\r
3  *\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the GNU Lesser General Public License\r
6  * (LGPL) version 2.1 which accompanies this distribution, and is available at\r
7  * http://www.gnu.org/licenses/lgpl.html\r
8  *\r
9  * This library is distributed in the hope that it will be useful,\r
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
12  * Lesser General Public License for more details.\r
13  *\r
14  * Contributors:\r
15  *     bstefanescu, jcarsique\r
16  *\r
17  * $Id$\r
18  */\r
19 \r
20 package org.collectionspace.services.nuxeo.client.java;\r
21 \r
22 import java.util.Collection;\r
23 import java.util.HashMap;\r
24 import java.util.Iterator;\r
25 import java.util.Map;\r
26 import java.util.Map.Entry;\r
27 \r
28 import javax.security.auth.login.AppConfigurationEntry;\r
29 import javax.transaction.TransactionManager;\r
30 \r
31 import org.apache.commons.logging.Log;\r
32 import org.apache.commons.logging.LogFactory;\r
33 import org.collectionspace.services.config.tenant.RepositoryDomainType;\r
34 import org.jboss.remoting.InvokerLocator;\r
35 import org.nuxeo.common.collections.ListenerList;\r
36 import org.nuxeo.ecm.core.api.repository.Repository;\r
37 import org.nuxeo.ecm.core.api.repository.RepositoryInstance;\r
38 import org.nuxeo.ecm.core.api.repository.RepositoryInstanceHandler;\r
39 import org.nuxeo.ecm.core.api.repository.RepositoryManager;\r
40 import org.nuxeo.ecm.core.client.ConnectionListener;\r
41 import org.nuxeo.ecm.core.client.DefaultLoginHandler;\r
42 import org.nuxeo.ecm.core.client.LoginHandler;\r
43 //import org.nuxeo.ecm.core.repository.RepositoryDescriptor;\r
44 import org.nuxeo.ecm.core.schema.SchemaManager;\r
45 import org.nuxeo.ecm.core.schema.SchemaManagerImpl;\r
46 import org.nuxeo.ecm.core.schema.TypeProvider;\r
47 import org.nuxeo.runtime.api.Framework;\r
48 import org.nuxeo.runtime.api.ServiceDescriptor;\r
49 import org.nuxeo.runtime.api.ServiceManager;\r
50 import org.nuxeo.runtime.api.login.LoginComponent;\r
51 import org.nuxeo.runtime.api.login.LoginService;\r
52 import org.nuxeo.runtime.api.login.SecurityDomain;\r
53 import org.nuxeo.runtime.config.AutoConfigurationService;\r
54 import org.nuxeo.runtime.remoting.RemotingService;\r
55 import org.nuxeo.runtime.services.streaming.StreamingService;\r
56 import org.nuxeo.runtime.transaction.TransactionHelper;\r
57 import org.slf4j.Logger;\r
58 import org.slf4j.LoggerFactory;\r
59 \r
60 /**\r
61  * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>\r
62  *\r
63  */\r
64 public final class NuxeoClientEmbedded {\r
65 \r
66         private Logger logger = LoggerFactory.getLogger(NuxeoClientEmbedded.class);\r
67         \r
68     private LoginHandler loginHandler;\r
69 \r
70     private final HashMap<String, RepositoryInstance> repositoryInstances;\r
71 \r
72     private final ListenerList connectionListeners;\r
73 \r
74     private InvokerLocator locator;\r
75 \r
76     private String serverName;\r
77 \r
78     private final AutoConfigurationService cfg;\r
79 \r
80     private RepositoryManager repositoryMgr;\r
81 \r
82     private static final NuxeoClientEmbedded instance = new NuxeoClientEmbedded();\r
83 \r
84     private static final Log log = LogFactory.getLog(NuxeoClientEmbedded.class);\r
85 \r
86     /**\r
87      * Constructs a new NuxeoClient. NOTE: Using {@link #getInstance()} instead\r
88      * of this constructor is recommended.\r
89      */\r
90     public NuxeoClientEmbedded() {\r
91         connectionListeners = new ListenerList();\r
92         cfg = new AutoConfigurationService();\r
93         loginHandler = loginHandler == null ? new DefaultLoginHandler()\r
94                 : loginHandler;\r
95         repositoryInstances = new HashMap<String, RepositoryInstance>();\r
96     }\r
97 \r
98     public static NuxeoClientEmbedded getInstance() {\r
99         return instance;\r
100     }\r
101 \r
102     @Deprecated\r
103     private synchronized void disconnect() throws Exception {\r
104         if (locator == null) {\r
105             throw new IllegalStateException("Client is not connected");\r
106         }\r
107         doDisconnect();\r
108     }\r
109 \r
110     public synchronized void tryDisconnect() throws Exception {\r
111         if (locator == null) {\r
112             return; // do nothing\r
113         }\r
114         doDisconnect();\r
115     }\r
116 \r
117     private void doDisconnect() throws Exception {\r
118         locator = null;\r
119         serverName = null;\r
120         // close repository sessions if any\r
121         Iterator<Entry<String, RepositoryInstance>> it = repositoryInstances.entrySet().iterator();\r
122         while (it.hasNext()) {\r
123             Entry<String, RepositoryInstance> repo = it.next();\r
124             try {\r
125                 repo.getValue().close();\r
126             } catch (Exception e) {\r
127                 log.debug("Error while trying to close " + repo, e);\r
128             }\r
129             it.remove();\r
130         }\r
131 \r
132         repositoryMgr = null;\r
133     }\r
134 \r
135     public synchronized String getServerName() {\r
136         if (locator == null) {\r
137             throw new IllegalStateException("Client is not connected");\r
138         }\r
139         if (serverName == null) {\r
140             if (cfg == null) { // compatibility\r
141                 serverName = RemotingService.ping(locator.getHost(),\r
142                         locator.getPort());\r
143             } else {\r
144                 serverName = cfg.getServerConfiguration().getProductInfo();\r
145             }\r
146         }\r
147         return serverName;\r
148     }\r
149 \r
150     public synchronized boolean isConnected() {\r
151         return true;\r
152     }\r
153 \r
154     public InvokerLocator getLocator() {\r
155         return locator;\r
156     }\r
157 \r
158     public synchronized LoginHandler getLoginHandler() {\r
159         return loginHandler;\r
160     }\r
161 \r
162     public synchronized void setLoginHandler(LoginHandler loginHandler) {\r
163         this.loginHandler = loginHandler;\r
164     }\r
165 \r
166     public RepositoryManager getRepositoryManager() throws Exception {\r
167         if (repositoryMgr == null) {\r
168             repositoryMgr = Framework.getService(RepositoryManager.class);\r
169         }\r
170         return repositoryMgr;\r
171     }\r
172 \r
173     /**\r
174      * Gets the repositories available on the connected server.\r
175      *\r
176      * @return the repositories\r
177      */\r
178     public Repository[] getRepositories() throws Exception {\r
179         Collection<Repository> repos = getRepositoryManager().getRepositories();\r
180         return repos.toArray(new Repository[repos.size()]);\r
181     }\r
182 \r
183     public Repository getDefaultRepository() throws Exception {\r
184         return getRepositoryManager().getDefaultRepository();\r
185     }\r
186 \r
187     public Repository getRepository(String name) throws Exception {\r
188         return getRepositoryManager().getRepository(name);\r
189     }\r
190 \r
191     /*\r
192      * Open a Nuxeo repo session using the passed in repoDomain and use the default tx timeout period\r
193      */\r
194     public RepositoryInstance openRepository(RepositoryDomainType repoDomain) throws Exception {\r
195         return openRepository(repoDomain.getRepositoryName(), -1);\r
196     }\r
197     \r
198     /*\r
199      * Open a Nuxeo repo session using the passed in repoDomain and use the default tx timeout period\r
200      */\r
201     public RepositoryInstance openRepository(String repoName) throws Exception {\r
202         return openRepository(repoName, -1);\r
203     }    \r
204 \r
205     /*\r
206      * Open a Nuxeo repo session using the default repo with the specified (passed in) tx timeout period\r
207      */\r
208     @Deprecated\r
209     public RepositoryInstance openRepository(int timeoutSeconds) throws Exception {\r
210         return openRepository(null, timeoutSeconds);\r
211     }\r
212 \r
213     /*\r
214      * Open a Nuxeo repo session using the default repo with the default tx timeout period\r
215      */\r
216     @Deprecated\r
217     public RepositoryInstance openRepository() throws Exception {\r
218         return openRepository(null, -1 /*default timeout period*/);\r
219     }\r
220 \r
221     public RepositoryInstance openRepository(String repoName, int timeoutSeconds) throws Exception {\r
222         RepositoryInstance result = null;\r
223         \r
224         if (timeoutSeconds > 0) {\r
225                 TransactionManager transactionMgr = TransactionHelper.lookupTransactionManager();\r
226                 transactionMgr.setTransactionTimeout(timeoutSeconds);\r
227                 if (logger.isInfoEnabled()) {\r
228                         logger.info(String.format("Changing current request's transaction timeout period to %d seconds",\r
229                                         timeoutSeconds));\r
230                 }\r
231         }\r
232         \r
233         //  REM 10/29/2013 - We may want to add this clause if (!TransactionHelper.isTransactionActive()) {\r
234         boolean startTransaction = TransactionHelper.startTransaction();\r
235         if (startTransaction == false) {\r
236                 logger.warn("Could not start a Nuxeo transaction with the TransactionHelper class.");\r
237         }\r
238         \r
239         Repository repository = null;\r
240         if (repoName != null) {\r
241                 repository = getRepositoryManager().getRepository(repoName);\r
242         } else {\r
243                 repository = getRepositoryManager().getDefaultRepository(); // Add a log info statement here stating that since no repo name was given we'll use the default repo instead\r
244         }\r
245         \r
246         if (repository != null) {\r
247                 result = newRepositoryInstance(repository);\r
248                 String key = result.getSessionId();\r
249                 repositoryInstances.put(key, result);\r
250                 if (logger.isTraceEnabled()) {\r
251                         logger.trace("Added a new repository instance to our repo list.  Current count is now: "\r
252                                         + repositoryInstances.size());\r
253                 }\r
254         } else {\r
255                 String errMsg = String.format("Could not open a session to the Nuxeo repository='%s'", repoName);\r
256                 logger.error(errMsg);\r
257                 throw new Exception(errMsg);\r
258         }\r
259 \r
260         return result;\r
261     }\r
262 \r
263     public void releaseRepository(RepositoryInstance repo) throws Exception {\r
264         String key = repo.getSessionId();\r
265 \r
266         try {\r
267                 repo.save();\r
268             repo.close();\r
269         } catch (Exception e) {\r
270                 logger.error("Possible data loss.  Could not save and/or release the repository.", e);\r
271                 throw e;\r
272         } finally {\r
273             RepositoryInstance wasRemoved = repositoryInstances.remove(key);\r
274             if (logger.isTraceEnabled()) {\r
275                 if (wasRemoved != null) {\r
276                         logger.trace("Removed a repository instance from our repo list.  Current count is now: "\r
277                                         + repositoryInstances.size());\r
278                 } else {\r
279                         logger.trace("Could not remove a repository instance from our repo list.  Current count is now: "\r
280                                         + repositoryInstances.size());\r
281                 }\r
282             }\r
283             //if (TransactionHelper.isTransactionActiveOrMarkedRollback())\r
284             TransactionHelper.commitOrRollbackTransaction();\r
285         }\r
286     }\r
287 \r
288     public static RepositoryInstance newRepositoryInstance(Repository repository) {\r
289         return new RepositoryInstanceHandler(repository).getProxy(); // Why a proxy here?\r
290     }\r
291 \r
292 }\r