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:
6 * http://www.collectionspace.org
7 * http://wiki.collectionspace.org
9 * Copyright 2009 University of California at Berkeley
11 * Licensed under the Educational Community License (ECL), Version 2.0.
12 * You may not use this file except in compliance with this License.
14 * You may obtain a copy of the ECL 2.0 License at
16 * https://source.collectionspace.org/collection-space/LICENSE.txt
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.
24 package org.collectionspace.services.person.nuxeo;
26 import java.util.Iterator;
27 import java.util.ArrayList;
28 import java.util.Arrays;
29 import java.util.List;
32 import org.collectionspace.services.PersonJAXBSchema;
33 import org.collectionspace.services.common.document.DocumentFilter;
34 import org.collectionspace.services.common.document.DocumentWrapper;
35 import org.collectionspace.services.common.service.ObjectPartType;
36 import org.collectionspace.services.nuxeo.client.java.RemoteDocumentModelHandlerImpl;
37 import org.collectionspace.services.nuxeo.util.NuxeoUtils;
38 import org.collectionspace.services.person.PersonsCommon;
39 import org.collectionspace.services.person.PersonsCommonList;
40 import org.collectionspace.services.person.PersonsCommonList.PersonListItem;
41 import org.nuxeo.ecm.core.api.DocumentModel;
42 import org.nuxeo.ecm.core.api.DocumentModelList;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
47 * PersonDocumentModelHandler
49 * $LastChangedRevision: $
56 public class PersonDocumentModelHandler
57 extends RemoteDocumentModelHandlerImpl<PersonsCommon, PersonsCommonList> {
59 private final Logger logger = LoggerFactory.getLogger(PersonDocumentModelHandler.class);
61 * Common part schema label
63 private static final String COMMON_PART_LABEL = "persons_common";
66 * person is used to stash JAXB object to use when handle is called
67 * for Action.CREATE, Action.UPDATE or Action.GET
69 private PersonsCommon person;
71 * personList is stashed when handle is called
74 private PersonsCommonList personList;
77 * inAuthority is the parent OrgAuthority for this context
79 private String inAuthority;
81 public String getInAuthority() {
85 public void setInAuthority(String inAuthority) {
86 this.inAuthority = inAuthority;
91 public void handleCreate(DocumentWrapper<DocumentModel> wrapDoc) throws Exception {
92 // first fill all the parts of the document
93 super.handleCreate(wrapDoc);
94 handleDisplayName(wrapDoc.getWrappedObject());
98 public void handleUpdate(DocumentWrapper<DocumentModel> wrapDoc) throws Exception {
99 super.handleUpdate(wrapDoc);
100 handleDisplayName(wrapDoc.getWrappedObject());
103 private void handleDisplayName(DocumentModel docModel) throws Exception {
104 String commonPartLabel = getServiceContext().getCommonPartLabel("persons");
105 Boolean displayNameComputed = (Boolean) docModel.getProperty(commonPartLabel,
106 PersonJAXBSchema.DISPLAY_NAME_COMPUTED);
107 if (displayNameComputed) {
108 String displayName = prepareDefaultDisplayName(
109 (String)docModel.getProperty(commonPartLabel, PersonJAXBSchema.FORE_NAME ),
110 (String)docModel.getProperty(commonPartLabel, PersonJAXBSchema.MIDDLE_NAME ),
111 (String)docModel.getProperty(commonPartLabel, PersonJAXBSchema.SUR_NAME ),
112 (String)docModel.getProperty(commonPartLabel, PersonJAXBSchema.BIRTH_DATE ),
113 (String)docModel.getProperty(commonPartLabel, PersonJAXBSchema.DEATH_DATE )
115 docModel.setProperty(commonPartLabel, PersonJAXBSchema.DISPLAY_NAME,
121 * Produces a default displayName from the basic name and dates fields.
122 * @see PersonAuthorityClientUtils.prepareDefaultDisplayName() which
123 * duplicates this logic, until we define a service-general utils package
124 * that is neither client nor service specific.
133 private static String prepareDefaultDisplayName(
134 String foreName, String middleName, String surName,
135 String birthDate, String deathDate ) throws Exception {
136 StringBuilder newStr = new StringBuilder();
137 final String sep = " ";
138 final String dateSep = "-";
139 List<String> nameStrings =
140 Arrays.asList(foreName, middleName, surName);
141 boolean firstAdded = false;
142 for(String partStr : nameStrings ){
143 if(null != partStr ) {
147 newStr.append(partStr);
151 // Now we add the dates. In theory could have dates with no name, but that is their problem.
152 boolean foundBirth = false;
153 if(null != birthDate) {
157 newStr.append(birthDate);
158 newStr.append(dateSep); // Put this in whether there is a death date or not
161 if(null != deathDate) {
166 newStr.append(dateSep);
168 newStr.append(deathDate);
170 return newStr.toString();
174 * getCommonPart get associated person
178 public PersonsCommon getCommonPart() {
183 * setCommonPart set associated person
187 public void setCommonPart(PersonsCommon person) {
188 this.person = person;
192 * getCommonPartList get associated person (for index/GET_ALL)
196 public PersonsCommonList getCommonPartList() {
201 public void setCommonPartList(PersonsCommonList personList) {
202 this.personList = personList;
206 protected Map<String, Object> extractPart(DocumentModel docModel, String schema, ObjectPartType partMeta)
208 Map<String, Object> unQObjectProperties = super.extractPart(docModel, schema, partMeta);
210 // Add the CSID to the common part
211 if (partMeta.getLabel().equalsIgnoreCase(COMMON_PART_LABEL)) {
212 String csid = NuxeoUtils.extractId(docModel.getPathAsString());
213 unQObjectProperties.put("csid", csid);
216 return unQObjectProperties;
220 public PersonsCommon extractCommonPart(DocumentWrapper wrapDoc)
222 throw new UnsupportedOperationException();
226 public void fillCommonPart(PersonsCommon personObject, DocumentWrapper wrapDoc) throws Exception {
227 throw new UnsupportedOperationException();
231 public PersonsCommonList extractCommonPartList(DocumentWrapper wrapDoc)
233 PersonsCommonList coList = new PersonsCommonList();
235 DocumentModelList docList = (DocumentModelList) wrapDoc.getWrappedObject();
237 List<PersonsCommonList.PersonListItem> list =
238 coList.getPersonListItem();
240 DocumentFilter filter = getDocumentFilter();
241 long pageNum, pageSize;
246 pageSize = filter.getPageSize();
247 pageNum = filter.getOffset()/pageSize;
249 coList.setPageNum(pageNum);
250 coList.setPageSize(pageSize);
251 coList.setTotalItems(docList.totalSize());
252 //FIXME: iterating over a long list of documents is not a long term
253 //strategy...need to change to more efficient iterating in future
254 Iterator<DocumentModel> iter = docList.iterator();
255 String commonPartLabel = getServiceContext().getCommonPartLabel("persons");
256 while(iter.hasNext()){
257 DocumentModel docModel = iter.next();
258 PersonListItem ilistItem = new PersonListItem();
259 ilistItem.setDisplayName((String)
260 docModel.getProperty(commonPartLabel, PersonJAXBSchema.DISPLAY_NAME));
261 ilistItem.setRefName((String)
262 docModel.getProperty(commonPartLabel, PersonJAXBSchema.REF_NAME));
263 String id = NuxeoUtils.extractId(docModel.getPathAsString());
264 ilistItem.setUri("/personauthorities/"+inAuthority+"/items/" + id);
265 ilistItem.setCsid(id);
269 if(logger.isDebugEnabled()){
270 logger.debug("Caught exception in extractCommonPartList", e);
278 * getQProperty converts the given property to qualified schema property
283 public String getQProperty(String prop) {
284 return PersonConstants.NUXEO_SCHEMA_NAME + ":" + prop;