]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
f7aeb66ef053d23eec2fb4e46df596be3ffbcc9d
[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     public RepositoryInstance openRepository(String repoName, int timeoutSeconds) throws Exception {\r
159         RepositoryInstance result = null;\r
160         \r
161         if (timeoutSeconds > 0) {\r
162                 TransactionManager transactionMgr = TransactionHelper.lookupTransactionManager();\r
163                 transactionMgr.setTransactionTimeout(timeoutSeconds);\r
164                 if (logger.isInfoEnabled()) {\r
165                         logger.info(String.format("Changing current request's transaction timeout period to %d seconds",\r
166                                         timeoutSeconds));\r
167                 }\r
168         }\r
169         \r
170         boolean startedTransaction = false;\r
171         if (TransactionHelper.isTransactionActive() == false) {\r
172                 startedTransaction = TransactionHelper.startTransaction();\r
173                 if (startedTransaction == false) {\r
174                         String errMsg = "Could not start a Nuxeo transaction with the TransactionHelper class.";\r
175                         logger.error(errMsg);\r
176                         throw new Exception(errMsg);\r
177                 }\r
178         } else {\r
179                 logger.warn("A request to start a new transaction was made, but a transaction is already open.");\r
180         }\r
181         \r
182         Repository repository = null;\r
183         if (repoName != null) {\r
184                 repository = getRepositoryManager().getRepository(repoName);\r
185         } else {\r
186                 repository = getRepositoryManager().getDefaultRepository();\r
187                 logger.warn(String.format("Using default repository '%s' because no name was specified.", repository.getName()));\r
188         }\r
189         \r
190         if (repository != null) {\r
191                 result = newRepositoryInstance(repository);\r
192                 if (result != null) {\r
193                         String key = result.getSessionId();\r
194                         repositoryInstances.put(key, result);\r
195                         if (logger.isTraceEnabled()) {\r
196                                 logger.trace(String.format("A new transaction was started on thread '%d' : %s.",\r
197                                                 Thread.currentThread().getId(), startedTransaction ? "true" : "false"));\r
198                                 logger.trace(String.format("Added a new repository instance to our repo list.  Current count is now: %d",\r
199                                                 repositoryInstances.size()));\r
200                         }\r
201                 } else {\r
202                         String errMsg = String.format("Could not create a new repository instance for '%s' repository.", repository.getName());\r
203                         logger.error(errMsg);\r
204                         throw new Exception(errMsg);\r
205                 }\r
206         } else {\r
207                 String errMsg = String.format("Could not open a session to the Nuxeo repository='%s'", repoName);\r
208                 logger.error(errMsg);\r
209                 throw new Exception(errMsg);\r
210         }\r
211 \r
212         return result;\r
213     }\r
214 \r
215     public void releaseRepository(RepositoryInstance repo) throws Exception {\r
216         String key = repo.getSessionId();\r
217 \r
218         try {\r
219                 repo.save();\r
220             repo.close();\r
221         } catch (Exception e) {\r
222                 logger.error("Possible data loss.  Could not save and/or release the repository.", e);\r
223                 throw e;\r
224         } finally {\r
225             RepositoryInstance wasRemoved = repositoryInstances.remove(key);\r
226             if (logger.isTraceEnabled()) {\r
227                 if (wasRemoved != null) {\r
228                         logger.trace("Removed a repository instance from our repo list.  Current count is now: "\r
229                                         + repositoryInstances.size());\r
230                 } else {\r
231                         logger.trace("Could not remove a repository instance from our repo list.  Current count is now: "\r
232                                         + repositoryInstances.size());\r
233                 }\r
234             }\r
235             if (TransactionHelper.isTransactionActiveOrMarkedRollback() == true) {\r
236                 TransactionHelper.commitOrRollbackTransaction();\r
237                 logger.trace(String.format("Transaction closed on thread '%d'", Thread.currentThread().getId()));\r
238             }\r
239         }\r
240     }\r
241 \r
242     public static RepositoryInstance newRepositoryInstance(Repository repository) {\r
243         return new RepositoryInstanceHandler(repository).getProxy(); // Why a proxy here?\r
244     }\r
245 \r
246 }\r