]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
c9d6ed6dae476f7f757c32305c9a496acb3621cd
[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.Entry;\r
26 \r
27 import javax.transaction.TransactionManager;\r
28 \r
29 import org.apache.commons.logging.Log;\r
30 import org.apache.commons.logging.LogFactory;\r
31 import org.collectionspace.services.config.tenant.RepositoryDomainType;\r
32 import org.jboss.remoting.InvokerLocator;\r
33 import org.nuxeo.ecm.core.api.repository.Repository;\r
34 import org.nuxeo.ecm.core.api.repository.RepositoryInstance;\r
35 import org.nuxeo.ecm.core.api.repository.RepositoryInstanceHandler;\r
36 import org.nuxeo.ecm.core.api.repository.RepositoryManager;\r
37 import org.nuxeo.ecm.core.client.DefaultLoginHandler;\r
38 import org.nuxeo.ecm.core.client.LoginHandler;\r
39 //import org.nuxeo.ecm.core.repository.RepositoryDescriptor;\r
40 import org.nuxeo.runtime.api.Framework;\r
41 import org.nuxeo.runtime.transaction.TransactionHelper;\r
42 import org.slf4j.Logger;\r
43 import org.slf4j.LoggerFactory;\r
44 \r
45 /**\r
46  * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>\r
47  *\r
48  */\r
49 public final class NuxeoClientEmbedded {\r
50 \r
51         private Logger logger = LoggerFactory.getLogger(NuxeoClientEmbedded.class);\r
52         \r
53     private LoginHandler loginHandler;\r
54 \r
55     private final HashMap<String, RepositoryInstance> repositoryInstances;\r
56 \r
57     private InvokerLocator locator;\r
58 \r
59     private RepositoryManager repositoryMgr;\r
60 \r
61     private static final NuxeoClientEmbedded instance = new NuxeoClientEmbedded();\r
62 \r
63     private static final Log log = LogFactory.getLog(NuxeoClientEmbedded.class);\r
64 \r
65     /**\r
66      * Constructs a new NuxeoClient. NOTE: Using {@link #getInstance()} instead\r
67      * of this constructor is recommended.\r
68      */\r
69     public NuxeoClientEmbedded() {\r
70         loginHandler = loginHandler == null ? new DefaultLoginHandler()\r
71                 : loginHandler;\r
72         repositoryInstances = new HashMap<String, RepositoryInstance>();\r
73     }\r
74 \r
75     public static NuxeoClientEmbedded getInstance() {\r
76         return instance;\r
77     }\r
78 \r
79     public synchronized void tryDisconnect() throws Exception {\r
80         if (locator == null) {\r
81             return; // do nothing\r
82         }\r
83         doDisconnect();\r
84     }\r
85 \r
86     private void doDisconnect() throws Exception {\r
87         locator = null;\r
88         // close repository sessions if any\r
89         Iterator<Entry<String, RepositoryInstance>> it = repositoryInstances.entrySet().iterator();\r
90         while (it.hasNext()) {\r
91             Entry<String, RepositoryInstance> repo = it.next();\r
92             try {\r
93                 repo.getValue().close();\r
94             } catch (Exception e) {\r
95                 log.debug("Error while trying to close " + repo, e);\r
96             }\r
97             it.remove();\r
98         }\r
99 \r
100         repositoryMgr = null;\r
101     }\r
102 \r
103     public synchronized boolean isConnected() {\r
104         return true;\r
105     }\r
106 \r
107     public InvokerLocator getLocator() {\r
108         return locator;\r
109     }\r
110 \r
111     public synchronized LoginHandler getLoginHandler() {\r
112         return loginHandler;\r
113     }\r
114 \r
115     public synchronized void setLoginHandler(LoginHandler loginHandler) {\r
116         this.loginHandler = loginHandler;\r
117     }\r
118 \r
119     public RepositoryManager getRepositoryManager() throws Exception {\r
120         if (repositoryMgr == null) {\r
121             repositoryMgr = Framework.getService(RepositoryManager.class);\r
122         }\r
123         return repositoryMgr;\r
124     }\r
125 \r
126     /**\r
127      * Gets the repositories available on the connected server.\r
128      *\r
129      * @return the repositories\r
130      */\r
131     public Repository[] getRepositories() throws Exception {\r
132         Collection<Repository> repos = getRepositoryManager().getRepositories();\r
133         return repos.toArray(new Repository[repos.size()]);\r
134     }\r
135 \r
136     public Repository getDefaultRepository() throws Exception {\r
137         return getRepositoryManager().getDefaultRepository();\r
138     }\r
139 \r
140     public Repository getRepository(String name) throws Exception {\r
141         return getRepositoryManager().getRepository(name);\r
142     }\r
143 \r
144     /*\r
145      * Open a Nuxeo repo session using the passed in repoDomain and use the default tx timeout period\r
146      */\r
147     public RepositoryInstance openRepository(RepositoryDomainType repoDomain) throws Exception {\r
148         return openRepository(repoDomain.getRepositoryName(), -1);\r
149     }\r
150     \r
151     /*\r
152      * Open a Nuxeo repo session using the passed in repoDomain and use the default tx timeout period\r
153      */\r
154     public RepositoryInstance openRepository(String repoName) throws Exception {\r
155         return openRepository(repoName, -1);\r
156     }    \r
157 \r
158     /*\r
159      * Open a Nuxeo repo session using the default repo with the specified (passed in) tx timeout period\r
160      */\r
161     @Deprecated\r
162     public RepositoryInstance openRepository(int timeoutSeconds) throws Exception {\r
163         return openRepository(null, timeoutSeconds);\r
164     }\r
165 \r
166     /*\r
167      * Open a Nuxeo repo session using the default repo with the default tx timeout period\r
168      */\r
169     @Deprecated\r
170     public RepositoryInstance openRepository() throws Exception {\r
171         return openRepository(null, -1 /*default timeout period*/);\r
172     }\r
173 \r
174     public RepositoryInstance openRepository(String repoName, int timeoutSeconds) throws Exception {\r
175         RepositoryInstance result = null;\r
176         \r
177         if (timeoutSeconds > 0) {\r
178                 TransactionManager transactionMgr = TransactionHelper.lookupTransactionManager();\r
179                 transactionMgr.setTransactionTimeout(timeoutSeconds);\r
180                 if (logger.isInfoEnabled()) {\r
181                         logger.info(String.format("Changing current request's transaction timeout period to %d seconds",\r
182                                         timeoutSeconds));\r
183                 }\r
184         }\r
185         \r
186         boolean startedTransaction = false;\r
187         if (TransactionHelper.isTransactionActive() == false) {\r
188                 startedTransaction = TransactionHelper.startTransaction();\r
189                 if (startedTransaction == false) {\r
190                         String errMsg = "Could not start a Nuxeo transaction with the TransactionHelper class.";\r
191                         logger.error(errMsg);\r
192                         throw new Exception(errMsg);\r
193                 }\r
194         } else {\r
195                 logger.warn("A request to start a new transaction was made, but a transaction is already open.");\r
196         }\r
197         \r
198         Repository repository = null;\r
199         if (repoName != null) {\r
200                 repository = getRepositoryManager().getRepository(repoName);\r
201         } else {\r
202                 repository = getRepositoryManager().getDefaultRepository();\r
203                 logger.warn(String.format("Using default repository '%s' because no name was specified.", repository.getName()));\r
204         }\r
205         \r
206         if (repository != null) {\r
207                 result = newRepositoryInstance(repository);\r
208                 if (result != null) {\r
209                         String key = result.getSessionId();\r
210                         repositoryInstances.put(key, result);\r
211                         if (logger.isTraceEnabled()) {\r
212                                 logger.trace(String.format("A new transaction was started on thread '%d' : %s.",\r
213                                                 Thread.currentThread().getId(), startedTransaction ? "true" : "false"));\r
214                                 logger.trace(String.format("Added a new repository instance to our repo list.  Current count is now: %d",\r
215                                                 repositoryInstances.size()));\r
216                         }\r
217                 } else {\r
218                         String errMsg = String.format("Could not create a new repository instance for '%s' repository.", repository.getName());\r
219                         logger.error(errMsg);\r
220                         throw new Exception(errMsg);\r
221                 }\r
222         } else {\r
223                 String errMsg = String.format("Could not open a session to the Nuxeo repository='%s'", repoName);\r
224                 logger.error(errMsg);\r
225                 throw new Exception(errMsg);\r
226         }\r
227 \r
228         return result;\r
229     }\r
230 \r
231     public void releaseRepository(RepositoryInstance repo) throws Exception {\r
232         String key = repo.getSessionId();\r
233 \r
234         try {\r
235                 repo.save();\r
236             repo.close();\r
237         } catch (Exception e) {\r
238                 logger.error("Possible data loss.  Could not save and/or release the repository.", e);\r
239                 throw e;\r
240         } finally {\r
241             RepositoryInstance wasRemoved = repositoryInstances.remove(key);\r
242             if (logger.isTraceEnabled()) {\r
243                 if (wasRemoved != null) {\r
244                         logger.trace("Removed a repository instance from our repo list.  Current count is now: "\r
245                                         + repositoryInstances.size());\r
246                 } else {\r
247                         logger.trace("Could not remove a repository instance from our repo list.  Current count is now: "\r
248                                         + repositoryInstances.size());\r
249                 }\r
250             }\r
251             if (TransactionHelper.isTransactionActiveOrMarkedRollback() == true) {\r
252                 TransactionHelper.commitOrRollbackTransaction();\r
253                 logger.trace(String.format("Transaction closed on thread '%d'", Thread.currentThread().getId()));\r
254             }\r
255         }\r
256     }\r
257 \r
258     public static RepositoryInstance newRepositoryInstance(Repository repository) {\r
259         return new RepositoryInstanceHandler(repository).getProxy(); // Why a proxy here?\r
260     }\r
261 \r
262 }\r