]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
4619f619634f1f5d9c52989f938c9b56fcbf6fa2
[tmp/jakarta-migration.git] /
1 /**
2  *  This document is a part of the source code and related artifacts
3  *  for CollectionSpace, an open source collections management system
4  *  for museums and related institutions:
5
6  *  http://www.collectionspace.org
7  *  http://wiki.collectionspace.org
8
9  *  Copyright 2009 University of California at Berkeley
10
11  *  Licensed under the Educational Community License (ECL), Version 2.0.
12  *  You may not use this file except in compliance with this License.
13
14  *  You may obtain a copy of the ECL 2.0 License at
15
16  *  https://source.collectionspace.org/collection-space/LICENSE.txt
17
18  *  Unless required by applicable law or agreed to in writing, software
19  *  distributed under the License is distributed on an "AS IS" BASIS,
20  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  *  See the License for the specific language governing permissions and
22  *  limitations under the License.
23  */
24 package org.collectionspace.services.nuxeo.client.java;
25
26 import java.util.List;
27 import java.util.Map;
28
29 import org.collectionspace.services.client.PoxPayloadIn;
30 import org.collectionspace.services.client.PoxPayloadOut;
31 import org.collectionspace.services.common.authorityref.AuthorityRefList;
32 import org.collectionspace.services.common.context.ServiceContext;
33 import org.collectionspace.services.common.datetime.GregorianCalendarDateTimeUtils;
34 import org.collectionspace.services.common.document.AbstractMultipartDocumentHandlerImpl;
35 import org.collectionspace.services.common.document.DocumentFilter;
36 import org.collectionspace.services.common.document.DocumentWrapper;
37 import org.collectionspace.services.common.document.DocumentHandler.Action;
38 import org.collectionspace.services.nuxeo.client.*;
39 import org.collectionspace.services.nuxeo.util.NuxeoUtils;
40 import org.collectionspace.services.common.profile.Profiler;
41 import org.collectionspace.services.common.repository.RepositoryClient;
42 import org.collectionspace.services.common.repository.RepositoryClientFactory;
43 import org.collectionspace.services.common.vocabulary.RefNameServiceUtils.AuthRefConfigInfo;
44
45 import org.nuxeo.ecm.core.api.ClientException;
46 import org.nuxeo.ecm.core.api.DocumentModel;
47 import org.nuxeo.ecm.core.api.DocumentModelList;
48 import org.nuxeo.ecm.core.api.model.PropertyException;
49 import org.nuxeo.ecm.core.api.repository.RepositoryInstance;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52
53 /**
54  * DocumentModelHandler is a base abstract Nuxeo document handler
55  * using Nuxeo Java Remote APIs for CollectionSpace services
56  *
57  * $LastChangedRevision: $
58  * $LastChangedDate: $
59  */
60 public abstract class DocumentModelHandler<T, TL>
61         extends AbstractMultipartDocumentHandlerImpl<T, TL, DocumentModel, DocumentModelList> {
62
63     private final Logger logger = LoggerFactory.getLogger(DocumentModelHandler.class);
64     private RepositoryInstance repositorySession;
65     //key=schema, value=documentpart
66
67     public final static String COLLECTIONSPACE_CORE_SCHEMA = "collectionspace_core";
68     public final static String COLLECTIONSPACE_CORE_TENANTID = "tenantId";
69     public final static String COLLECTIONSPACE_CORE_URI = "uri";
70     public final static String COLLECTIONSPACE_CORE_CREATED_AT = "createdAt";
71     public final static String COLLECTIONSPACE_CORE_UPDATED_AT = "updatedAt";
72     public final static String COLLECTIONSPACE_CORE_CREATED_BY = "createdBy";
73     public final static String COLLECTIONSPACE_CORE_UPDATED_BY = "updatedBy";
74
75     /*
76      * We're using the "name" field of Nuxeo's DocumentModel to store
77      * the CSID.
78      */
79     public String getCsid(DocumentModel docModel) {
80         return NuxeoUtils.getCsid(docModel);
81     }
82
83     public String getUri(DocumentModel docModel) {
84         return getServiceContextPath()+getCsid(docModel);
85     }
86         
87     public RepositoryClient<PoxPayloadIn, PoxPayloadOut> getRepositoryClient(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx) {
88         RepositoryClient<PoxPayloadIn, PoxPayloadOut> repositoryClient = RepositoryClientFactory.getInstance().getClient(ctx.getRepositoryClientName());
89         return repositoryClient;
90     }
91
92     /**
93      * getRepositorySession returns Nuxeo Repository Session
94      * @return
95      */
96     public RepositoryInstance getRepositorySession() {
97         
98         return repositorySession;
99     }
100
101     /**
102      * setRepositorySession sets repository session
103      * @param repoSession
104      */
105     public void setRepositorySession(RepositoryInstance repoSession) {
106         this.repositorySession = repoSession;
107     }
108
109     @Override
110     public void handleCreate(DocumentWrapper<DocumentModel> wrapDoc) throws Exception {
111         // TODO for sub-docs - check to see if the current service context is a multipart input, 
112         // OR a docfragment, and call a variant to fill the DocModel.
113         fillAllParts(wrapDoc, Action.CREATE);
114         handleCoreValues(wrapDoc, Action.CREATE);
115     }
116     
117     // TODO for sub-docs - Add completeCreate in which we look for set-aside doc fragments 
118     // and create the subitems. We will create service contexts with the doc fragments
119     // and then call 
120
121
122     @Override
123     public void handleUpdate(DocumentWrapper<DocumentModel> wrapDoc) throws Exception {
124         // TODO for sub-docs - check to see if the current service context is a multipart input, 
125         // OR a docfragment, and call a variant to fill the DocModel.
126         fillAllParts(wrapDoc, Action.UPDATE);
127         handleCoreValues(wrapDoc, Action.UPDATE);
128     }
129
130     @Override
131     public void handleGet(DocumentWrapper<DocumentModel> wrapDoc) throws Exception {
132         extractAllParts(wrapDoc);
133     }
134
135     @Override
136     public void handleGetAll(DocumentWrapper<DocumentModelList> wrapDoc) throws Exception {
137         Profiler profiler = new Profiler(this, 2);
138         profiler.start();
139         setCommonPartList(extractCommonPartList(wrapDoc));
140         profiler.stop();
141     }
142
143     @Override
144     public abstract void completeUpdate(DocumentWrapper<DocumentModel> wrapDoc) throws Exception;
145
146     @Override
147     public abstract void extractAllParts(DocumentWrapper<DocumentModel> wrapDoc) throws Exception;
148
149     @Override
150     public abstract T extractCommonPart(DocumentWrapper<DocumentModel> wrapDoc) throws Exception;
151
152     @Override
153     public abstract void fillAllParts(DocumentWrapper<DocumentModel> wrapDoc, Action action) throws Exception;
154
155     @Override
156     public abstract void fillCommonPart(T obj, DocumentWrapper<DocumentModel> wrapDoc) throws Exception;
157
158     @Override
159     public abstract TL extractCommonPartList(DocumentWrapper<DocumentModelList> wrapDoc) throws Exception;
160
161     @Override
162     public abstract T getCommonPart();
163
164     @Override
165     public abstract void setCommonPart(T obj);
166
167     @Override
168     public abstract TL getCommonPartList();
169
170     @Override
171     public abstract void setCommonPartList(TL obj);
172     
173     @Override
174     public DocumentFilter createDocumentFilter() {
175         DocumentFilter filter = new NuxeoDocumentFilter(this.getServiceContext());
176         return filter;
177     }
178     
179     /**
180      * Gets the authority refs.
181      *
182      * @param docWrapper the doc wrapper
183      * @param authRefFields the auth ref fields
184      * @return the authority refs
185      * @throws PropertyException the property exception
186      */
187     abstract public AuthorityRefList getAuthorityRefs(String csid,
188                 List<AuthRefConfigInfo> authRefsInfo) throws PropertyException;    
189
190     private void handleCoreValues(DocumentWrapper<DocumentModel> docWrapper, 
191                 Action action)  throws ClientException {
192         DocumentModel documentModel = docWrapper.getWrappedObject();
193         String now = GregorianCalendarDateTimeUtils.timestampUTC();
194         ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx = getServiceContext();
195         String userId = ctx.getUserId();
196         if(action==Action.CREATE) {
197             //
198             // Add the tenant ID value to the new entity
199             //
200                 String tenantId = ctx.getTenantId();
201             documentModel.setProperty(COLLECTIONSPACE_CORE_SCHEMA,
202                     COLLECTIONSPACE_CORE_TENANTID, tenantId);
203             //
204             // Add the uri value to the new entity
205             //
206             documentModel.setProperty(COLLECTIONSPACE_CORE_SCHEMA,
207                     COLLECTIONSPACE_CORE_URI, getUri(documentModel));
208                 //
209                 // Add the CSID to the DublinCore title so we can see the CSID in the default
210                 // Nuxeo webapp.
211                 //
212                 try {
213                 documentModel.setProperty("dublincore", "title",
214                         documentModel.getName());
215                 } catch (Exception x) {
216                         if (logger.isWarnEnabled() == true) {
217                                 logger.warn("Could not set the Dublin Core 'title' field on document CSID:" +
218                                                 documentModel.getName());
219                         }
220                 }
221             documentModel.setProperty(COLLECTIONSPACE_CORE_SCHEMA,
222                     COLLECTIONSPACE_CORE_CREATED_AT, now);
223             documentModel.setProperty(COLLECTIONSPACE_CORE_SCHEMA,
224                     COLLECTIONSPACE_CORE_CREATED_BY, userId);
225         }
226         if(action==Action.CREATE || action==Action.UPDATE) {
227             documentModel.setProperty(COLLECTIONSPACE_CORE_SCHEMA,
228                     COLLECTIONSPACE_CORE_UPDATED_AT, now);
229             documentModel.setProperty(COLLECTIONSPACE_CORE_SCHEMA,
230                     COLLECTIONSPACE_CORE_UPDATED_BY, userId);
231         }
232     }
233
234 }