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.common.vocabulary.nuxeo;
26 import java.util.ArrayList;
27 import java.util.List;
30 import javax.ws.rs.core.Response;
32 import org.collectionspace.services.client.AbstractCommonListUtils;
33 import org.collectionspace.services.client.AuthorityClient;
34 import org.collectionspace.services.client.CollectionSpaceClient;
35 import org.collectionspace.services.client.PayloadInputPart;
36 import org.collectionspace.services.client.VocabularyClient;
37 import org.collectionspace.services.client.PoxPayloadIn;
38 import org.collectionspace.services.client.PoxPayloadOut;
39 import org.collectionspace.services.client.workflow.WorkflowClient;
40 import org.collectionspace.services.common.ResourceMap;
41 import org.collectionspace.services.common.XmlTools;
42 import org.collectionspace.services.common.api.RefName;
43 import org.collectionspace.services.common.api.RefName.Authority;
44 import org.collectionspace.services.common.api.RefNameUtils;
45 import org.collectionspace.services.common.api.RefNameUtils.AuthorityInfo;
46 import org.collectionspace.services.common.api.RefNameUtils.AuthorityTermInfo;
47 import org.collectionspace.services.common.api.Tools;
48 import org.collectionspace.services.common.context.ServiceContext;
49 import org.collectionspace.services.common.document.DocumentException;
50 import org.collectionspace.services.common.document.DocumentHandler;
51 import org.collectionspace.services.common.document.DocumentNotFoundException;
52 import org.collectionspace.services.common.document.DocumentReferenceException;
53 import org.collectionspace.services.common.document.DocumentWrapper;
54 import org.collectionspace.services.common.vocabulary.AuthorityItemJAXBSchema;
55 import org.collectionspace.services.common.vocabulary.AuthorityJAXBSchema;
56 import org.collectionspace.services.common.vocabulary.AuthorityResource;
57 import org.collectionspace.services.common.vocabulary.AuthorityServiceUtils;
58 import org.collectionspace.services.common.vocabulary.RefNameServiceUtils.AuthorityItemSpecifier;
59 import org.collectionspace.services.common.vocabulary.RefNameServiceUtils.Specifier;
60 import org.collectionspace.services.common.vocabulary.RefNameServiceUtils.SpecifierForm;
61 import org.collectionspace.services.config.service.ObjectPartType;
62 import org.collectionspace.services.jaxb.AbstractCommonList;
63 import org.collectionspace.services.jaxb.AbstractCommonList.ListItem;
64 import org.collectionspace.services.lifecycle.TransitionDef;
65 import org.collectionspace.services.nuxeo.client.java.NuxeoDocumentModelHandler;
66 import org.collectionspace.services.nuxeo.client.java.CoreSessionInterface;
67 import org.collectionspace.services.nuxeo.client.java.RepositoryClientImpl;
68 import org.collectionspace.services.nuxeo.util.NuxeoUtils;
69 import org.dom4j.Document;
70 import org.dom4j.Element;
71 import org.nuxeo.ecm.core.api.ClientException;
72 import org.nuxeo.ecm.core.api.DocumentModel;
73 import org.slf4j.Logger;
74 import org.slf4j.LoggerFactory;
77 * AuthorityDocumentModelHandler
79 * $LastChangedRevision: $
82 public abstract class AuthorityDocumentModelHandler<AuthCommon>
83 extends NuxeoDocumentModelHandler<AuthCommon> {
85 private final Logger logger = LoggerFactory.getLogger(AuthorityDocumentModelHandler.class);
87 protected String authorityCommonSchemaName;
88 protected String authorityItemCommonSchemaName;
89 protected boolean shouldUpdateRevNumber = true; // default to updating the revision number
91 public AuthorityDocumentModelHandler(String authorityCommonSchemaName, String authorityItemCommonSchemaName) {
92 this.authorityCommonSchemaName = authorityCommonSchemaName;
93 this.authorityItemCommonSchemaName = authorityItemCommonSchemaName;
96 public void setShouldUpdateRevNumber(boolean flag) {
97 this.shouldUpdateRevNumber = flag;
100 public boolean getShouldUpdateRevNumber() {
101 return this.shouldUpdateRevNumber;
105 * The entity type expected from the JAX-RS Response object
107 public Class<String> getEntityResponseType() {
112 public void prepareSync() throws Exception {
113 this.setShouldUpdateRevNumber(AuthorityServiceUtils.DONT_UPDATE_REV); // Never update rev nums on sync operations
116 protected PayloadInputPart extractPart(Response res, String partLabel)
118 PoxPayloadIn input = new PoxPayloadIn((String)res.readEntity(getEntityResponseType()));
119 PayloadInputPart payloadInputPart = input.getPart(partLabel);
120 if (payloadInputPart == null) {
121 logger.error("Part " + partLabel + " was unexpectedly null.");
123 return payloadInputPart;
127 public boolean handleSync(DocumentWrapper<Object> wrapDoc) throws Exception {
128 boolean result = false;
129 ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx = getServiceContext();
130 Specifier specifier = (Specifier) wrapDoc.getWrappedObject();
132 // Get the rev number of the authority so we can compare with rev number of shared authority
134 DocumentModel docModel = NuxeoUtils.getDocFromSpecifier(ctx, getRepositorySession(), authorityCommonSchemaName, specifier);
135 Long localRev = (Long) NuxeoUtils.getProperyValue(docModel, AuthorityJAXBSchema.REV);
136 String shortId = (String) NuxeoUtils.getProperyValue(docModel, AuthorityJAXBSchema.SHORT_IDENTIFIER);
138 // Using the short ID of the local authority, create a URN specifier to retrieve the SAS authority
140 Specifier sasSpecifier = new Specifier(SpecifierForm.URN_NAME, shortId);
141 PoxPayloadIn sasPayloadIn = AuthorityServiceUtils.requestPayloadIn(ctx, sasSpecifier, getEntityResponseType());
143 // If the authority on the SAS is newer, synch all the items and then the authority record as well
146 Long sasRev = getRevision(sasPayloadIn);
147 if (sasRev > localRev) {
149 // First, sync all the authority items
151 syncAllItems(ctx, sasSpecifier);
153 // Next, sync the authority resource/record itself
155 AuthorityResource authorityResource = (AuthorityResource) ctx.getResource();
156 ctx.setProperty(AuthorityServiceUtils.SHOULD_UPDATE_REV_PROPERTY, AuthorityServiceUtils.DONT_UPDATE_REV); // Don't update the rev number, use the rev number for the SAS instance instead
157 PoxPayloadOut payloadOut = authorityResource.update(ctx, ctx.getResourceMap(), ctx.getUriInfo(), docModel.getName(),
159 if (payloadOut != null) {
160 ctx.setOutput(payloadOut);
169 * Get the list of authority items from the remote shared authority server (SAS) and try
170 * to synchronize them with the local items. If items exist on the remote but not the local, we'll create them.
172 protected int syncAllItems(ServiceContext ctx, Specifier sasAuthoritySpecifier) throws Exception {
176 int alreadySynched = 0;
178 int totalItemsProcessed = 0;
179 ArrayList<String> itemsInRemoteAuthority = new ArrayList<String>();
181 // Iterate over the list of items/terms in the remote authority
183 PoxPayloadIn sasPayloadInItemList = requestPayloadInItemList(ctx, sasAuthoritySpecifier);
184 List<Element> itemList = getItemList(sasPayloadInItemList);
185 if (itemList != null) {
186 for (Element e:itemList) {
187 String remoteRefName = XmlTools.getElementValue(e, "refName");
188 itemsInRemoteAuthority.add(remoteRefName);
189 long status = syncRemoteItemWithLocalItem(ctx, remoteRefName);
192 } else if (status == 0) {
197 totalItemsProcessed++;
201 // Now see if we need to deprecate or delete items that have been hard-deleted from the SAS but still exist
202 // locally. Subtract (remove) the list of remote items from the list of local items to determine which
203 // of the remote items have been hard deleted.
205 ArrayList<String> itemsInLocalAuthority = getItemsInLocalAuthority(ctx, sasAuthoritySpecifier);
206 if (itemsInLocalAuthority.removeAll(itemsInRemoteAuthority) == true) {
207 ArrayList<String> remainingItems = itemsInLocalAuthority; // now a subset of local items
209 // We now need to either hard-deleted or deprecate the remaining authorities
211 long processed = deleteOrDeprecateItems(ctx, remainingItems);
212 if (processed != remainingItems.size()) {
213 throw new Exception("Encountered unexpected exception trying to delete or deprecated authority items during synchronization.");
218 logger.info(String.format("Total number of items processed during sync: %d", totalItemsProcessed));
219 logger.info(String.format("Number of items synchronized: %d", synched));
220 logger.info(String.format("Number of items created during sync: %d", created));
221 logger.info(String.format("Number not needing synchronization: %d", alreadySynched));
233 private long deleteOrDeprecateItems(ServiceContext ctx, ArrayList<String> refNameList) throws Exception {
236 ArrayList<String> failureList = new ArrayList<String>();
237 for (String refName:refNameList) {
238 AuthorityTermInfo itemInfo = RefNameUtils.parseAuthorityTermInfo(refName);
239 AuthorityResource authorityResource = (AuthorityResource) ctx.getResource();
241 authorityResource.deleteAuthorityItem(ctx, itemInfo.inAuthority.csid, itemInfo.csid);
243 } catch (DocumentReferenceException de) {
244 logger.info(String.format("Authority item '%s' has existing references and cannot be removed during sync.",
246 boolean marked = markAuthorityItemAsDeprecated(ctx, itemInfo);
247 if (marked == true) {
250 } catch (Exception e) {
251 logger.warn(String.format("Unable to delete authority item '%s'", refName), e);
256 if (logger.isWarnEnabled() == true) {
257 if (result != refNameList.size()) {
258 logger.warn(String.format("Unable to delete or deprecate some authority items during synchronization with SAS. Deleted or deprecated %d of %d. See the services log file for details.",
259 result, refNameList.size()));
267 * Mark the authority item as deprecated.
273 private boolean markAuthorityItemAsDeprecated(ServiceContext ctx, AuthorityTermInfo itemInfo) throws Exception {
274 boolean result = false;
277 String itemCsid = itemInfo.csid;
278 DocumentModel docModel = NuxeoUtils.getDocFromCsid(ctx, (CoreSessionInterface)ctx.getCurrentRepositorySession(), itemCsid);
279 docModel.setProperty(authorityItemCommonSchemaName, AuthorityItemJAXBSchema.DEPRECATED,
280 new Boolean(AuthorityServiceUtils.DEPRECATED));
281 CoreSessionInterface session = (CoreSessionInterface) ctx.getCurrentRepositorySession();
282 session.saveDocument(docModel);
284 } catch (Exception e) {
285 logger.warn(String.format("Could not mark item '%s' as deprecated.", itemInfo.name), e);
293 * Gets the list of SAS related items in the local authority. We exlude items with the "proposed" flags because
294 * we want a list with only SAS created items.
296 * We need to add pagination support to this call!!!
303 private ArrayList<String> getItemsInLocalAuthority(ServiceContext ctx, Specifier specifier) throws Exception {
304 ArrayList<String> result = new ArrayList<String>();
306 ResourceMap resourceMap = ctx.getResourceMap();
307 String resourceName = ctx.getClient().getServiceName();
308 AuthorityResource authorityResource = (AuthorityResource) resourceMap.get(resourceName);
309 AbstractCommonList acl = authorityResource.getAuthorityItemList(ctx, specifier.value, ctx.getUriInfo());
310 List<ListItem> listItemList = acl.getListItem();
311 for (ListItem listItem:listItemList) {
312 Boolean proposed = getBooleanValue(listItem, AuthorityItemJAXBSchema.PROPOSED);
313 if (proposed == false) { // exclude "proposed" (i.e., local-only items)
314 result.add(AbstractCommonListUtils.ListItemGetElementValue(listItem, AuthorityItemJAXBSchema.REF_NAME));
321 private Boolean getBooleanValue(ListItem listItem, String name) {
322 Boolean result = null;
324 String value = AbstractCommonListUtils.ListItemGetElementValue(listItem, name);
326 result = Boolean.valueOf(value);
332 private String getStringValue(ListItem listItem, String name) {
333 return AbstractCommonListUtils.ListItemGetElementValue(listItem, AuthorityItemJAXBSchema.REF_NAME);
337 * This is a sync method.
339 * @param parentIdentifier - Must be in short-id-refname form -i.e., urn:cspace:name(shortid)
340 * @param itemIdentifier - Must be in short-id-refname form -i.e., urn:cspace:name(shortid)
343 protected void createLocalItem(ServiceContext ctx, String parentIdentifier, String itemIdentifier) throws Exception {
345 // Create a URN short ID specifier for the getting a copy of the remote authority item
347 Specifier authoritySpecifier = Specifier.getSpecifier(parentIdentifier);
348 Specifier itemSpecifier = Specifier.getSpecifier(itemIdentifier);
349 AuthorityItemSpecifier sasAuthorityItemSpecifier = new AuthorityItemSpecifier(authoritySpecifier, itemSpecifier);
351 // Get the remote payload
353 PoxPayloadIn sasPayloadIn = AuthorityServiceUtils.requestPayloadIn(sasAuthorityItemSpecifier,
354 ctx.getServiceName(), getEntityResponseType());
356 // Using the payload from the remote server, create a local copy of the item
358 AuthorityResource authorityResource = (AuthorityResource) ctx.getResource();
359 Response response = authorityResource.createAuthorityItemWithParentContext(ctx, authoritySpecifier.getURNValue(),
360 sasPayloadIn, AuthorityServiceUtils.DONT_UPDATE_REV, AuthorityServiceUtils.NOT_PROPOSED);
362 // Check the response for successful POST result
364 if (response.getStatus() != Response.Status.CREATED.getStatusCode()) {
365 throw new DocumentException(String.format("Could not create new authority item '%s' during synchronization of the '%s' authority.",
366 itemIdentifier, parentIdentifier));
369 // Handle the workflow state
371 authorityResource.updateItemWorkflowWithTransition(ctx, parentIdentifier, itemIdentifier,
372 WorkflowClient.WORKFLOWTRANSITION_LOCK, AuthorityServiceUtils.DONT_UPDATE_REV);
376 * Try to synchronize a remote item (using its refName) with a local item. If the local doesn't yet
377 * exist, we'll create it.
379 * -1 = sync not needed; i.e., already in sync
381 * 1 = local item was missing so we created it
387 protected long syncRemoteItemWithLocalItem(ServiceContext ctx, String itemRefName) throws Exception {
390 // Using the item refname (with no local CSID), create specifiers that we'll use to find the local versions
392 AuthorityTermInfo authorityTermInfo = RefNameUtils.parseAuthorityTermInfo(itemRefName);
393 String parentIdentifier = Specifier.createShortIdURNValue(authorityTermInfo.inAuthority.name);
394 String itemIdentifier = Specifier.createShortIdURNValue(authorityTermInfo.name);
396 // We'll use the Authority JAX-RS resource to peform sync operations (creates and updates)
398 AuthorityResource authorityResource = (AuthorityResource) ctx.getResource();
399 PoxPayloadOut localItemPayloadOut;
401 localItemPayloadOut = authorityResource.getAuthorityItemWithExistingContext(ctx, parentIdentifier, itemIdentifier);
402 } catch (DocumentNotFoundException dnf) {
404 // Document not found, means we need to create an item/term that exists only on the SAS
406 logger.info(String.format("Remote item with refname='%s' doesn't exist locally, so we'll create it.", itemRefName));
407 createLocalItem(ctx, parentIdentifier, itemIdentifier);
408 return 1; // exit with status of 1 means we created a new authority item
411 // If we get here, we know the item exists both locally and remotely, so we need to synchronize them.
415 PoxPayloadOut theUpdate = authorityResource.synchronizeItemWithExistingContext(ctx, parentIdentifier, itemIdentifier);
416 if (theUpdate != null) {
417 result = 0; // means we needed to sync this item with SAS
418 logger.debug(String.format("Sync'd authority item parent='%s' id='%s with SAS. Updated payload is: \n%s",
419 parentIdentifier, itemIdentifier, theUpdate.getXmlPayload()));
421 } catch (DocumentReferenceException de) { // Exception for items that still have records/resource referencing them.
423 logger.error(String.format("Could not sync authority item = '%s' because it has existing records referencing it.",
427 return result; // -1 = no sync needed/possible, 0 = sync'd, 1 = created new item
430 private PoxPayloadIn requestPayloadInItemList(ServiceContext ctx, Specifier specifier) throws Exception {
431 PoxPayloadIn result = null;
433 AuthorityClient client = (AuthorityClient) ctx.getClient();
434 Response res = client.readItemList(specifier.getURNValue(),
435 null, // partial term string
436 null // keyword string
439 int statusCode = res.getStatus();
441 // Check the status code of the response: does it match
442 // the expected response(s)?
443 if (logger.isDebugEnabled()) {
444 logger.debug(client.getClass().getCanonicalName() + ": status = " + statusCode);
447 result = new PoxPayloadIn((String)res.readEntity(getEntityResponseType())); // Get the entire response!
457 * Non standard injection of CSID into common part, since caller may access through
458 * shortId, and not know the CSID.
459 * @see org.collectionspace.services.nuxeo.client.java.RemoteDocumentModelHandlerImpl#extractPart(org.nuxeo.ecm.core.api.DocumentModel, java.lang.String, org.collectionspace.services.common.service.ObjectPartType)
462 protected Map<String, Object> extractPart(DocumentModel docModel, String schema, ObjectPartType partMeta)
464 Map<String, Object> unQObjectProperties = super.extractPart(docModel, schema, partMeta);
466 // Add the CSID to the common part
467 if (partMeta.getLabel().equalsIgnoreCase(authorityCommonSchemaName)) {
468 String csid = getCsid(docModel);//NuxeoUtils.extractId(docModel.getPathAsString());
469 unQObjectProperties.put("csid", csid);
472 return unQObjectProperties;
475 public void fillAllParts(DocumentWrapper<DocumentModel> wrapDoc, Action action) throws Exception {
476 super.fillAllParts(wrapDoc, action);
478 // Update the record's revision number on both CREATE and UPDATE actions, but not on SYNC
480 if (this.getShouldUpdateRevNumber() == true) { // We won't update rev numbers on synchronization with SAS
481 updateRevNumbers(wrapDoc);
485 protected void updateRevNumbers(DocumentWrapper<DocumentModel> wrapDoc) {
486 DocumentModel documentModel = wrapDoc.getWrappedObject();
487 Long rev = (Long)documentModel.getProperty(authorityCommonSchemaName, AuthorityJAXBSchema.REV);
493 documentModel.setProperty(authorityCommonSchemaName, AuthorityJAXBSchema.REV, rev);
497 * We consider workflow state changes as changes that should bump the revision number
499 * @see org.collectionspace.services.nuxeo.client.java.RemoteDocumentModelHandlerImpl#handleWorkflowTransition(org.collectionspace.services.common.document.DocumentWrapper, org.collectionspace.services.lifecycle.TransitionDef)
502 public void handleWorkflowTransition(DocumentWrapper<DocumentModel> wrapDoc, TransitionDef transitionDef) throws Exception {
503 // Update the revision number
504 updateRevNumbers(wrapDoc);
508 public void handleCreate(DocumentWrapper<DocumentModel> wrapDoc) throws Exception {
509 super.handleCreate(wrapDoc);
511 // Uncomment once debugged and App layer is read to integrate
512 // Experimenting with this uncommented now ...
513 handleDisplayNameAsShortIdentifier(wrapDoc.getWrappedObject(), authorityCommonSchemaName);
514 updateRefnameForAuthority(wrapDoc, authorityCommonSchemaName);//CSPACE-3178
517 protected String buildWhereForShortId(String name) {
518 return authorityCommonSchemaName
519 + ":" + AuthorityJAXBSchema.SHORT_IDENTIFIER
523 private boolean isUnique(DocumentModel docModel, String schemaName) throws DocumentException {
527 private boolean temp_isUnique(DocumentModel docModel, String schemaName) throws DocumentException {
528 boolean result = true;
530 ServiceContext ctx = this.getServiceContext();
531 String shortIdentifier = (String) docModel.getProperty(schemaName, AuthorityJAXBSchema.SHORT_IDENTIFIER);
532 String nxqlWhereClause = buildWhereForShortId(shortIdentifier);
534 DocumentWrapper<DocumentModel> searchResultWrapper = getRepositoryClient(ctx).findDoc(ctx, nxqlWhereClause);
535 if (searchResultWrapper != null) {
537 if (logger.isInfoEnabled() == true) {
538 DocumentModel searchResult = searchResultWrapper.getWrappedObject();
539 String debugMsg = String.format("Could not create a new authority with a short identifier of '%s', because one already exists with the same short identifer: CSID = '%s'",
540 shortIdentifier, searchResult.getName());
541 logger.trace(debugMsg);
544 } catch (DocumentNotFoundException e) {
545 // Not a problem, just means we couldn't find another authority with that short ID
552 * If no short identifier was provided in the input payload,
553 * generate a short identifier from the display name. Either way though,
554 * the short identifier needs to be unique.
556 private void handleDisplayNameAsShortIdentifier(DocumentModel docModel, String schemaName) throws Exception {
557 String shortIdentifier = (String) docModel.getProperty(schemaName, AuthorityJAXBSchema.SHORT_IDENTIFIER);
558 String displayName = (String) docModel.getProperty(schemaName, AuthorityJAXBSchema.DISPLAY_NAME);
559 String shortDisplayName = "";
560 String generateShortIdentifier = null;
561 if (Tools.isEmpty(shortIdentifier)) {
562 generateShortIdentifier = AuthorityIdentifierUtils.generateShortIdentifierFromDisplayName(displayName, shortDisplayName);
563 docModel.setProperty(schemaName, AuthorityJAXBSchema.SHORT_IDENTIFIER, shortIdentifier);
566 if (isUnique(docModel, schemaName) == false) {
567 String shortId = generateShortIdentifier == null ? shortIdentifier : generateShortIdentifier;
568 String errMsgVerb = generateShortIdentifier == null ? "supplied" : "generated";
569 String errMsg = String.format("The %s short identifier '%s' was not unique, so the new authority could not be created.",
570 errMsgVerb, shortId);
571 throw new DocumentException(errMsg);
576 * Generate a refName for the authority from the short identifier
579 * All refNames for authorities are generated. If a client supplies
580 * a refName, it will be overwritten during create (per this method)
581 * or discarded during update (per filterReadOnlyPropertiesForPart).
583 * @see #filterReadOnlyPropertiesForPart(Map<String, Object>, org.collectionspace.services.common.service.ObjectPartType)
586 protected void updateRefnameForAuthority(DocumentWrapper<DocumentModel> wrapDoc, String schemaName) throws Exception {
587 DocumentModel docModel = wrapDoc.getWrappedObject();
588 RefName.Authority authority = (Authority) getRefName(getServiceContext(), docModel);
589 String refName = authority.toString();
590 docModel.setProperty(schemaName, AuthorityJAXBSchema.REF_NAME, refName);
594 public RefName.RefNameInterface getRefName(ServiceContext ctx,
595 DocumentModel docModel) {
596 RefName.RefNameInterface refname = null;
599 String shortIdentifier = (String) docModel.getProperty(authorityCommonSchemaName, AuthorityJAXBSchema.SHORT_IDENTIFIER);
600 String displayName = (String) docModel.getProperty(authorityCommonSchemaName, AuthorityJAXBSchema.DISPLAY_NAME);
601 RefName.Authority authority = RefName.Authority.buildAuthority(ctx.getTenantName(),
602 ctx.getServiceName(),
603 null, // Only use shortId form!!!
607 } catch (Exception e) {
608 logger.error(e.getMessage(), e);
615 protected String getRefnameDisplayName(DocumentWrapper<DocumentModel> docWrapper) {
616 String result = null;
618 DocumentModel docModel = docWrapper.getWrappedObject();
619 ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx = this.getServiceContext();
620 RefName.Authority refname = (RefName.Authority)getRefName(ctx, docModel);
621 result = refname.getDisplayName();
626 public String getShortIdentifier(ServiceContext ctx, String authCSID, String schemaName) throws Exception {
627 String shortIdentifier = null;
628 CoreSessionInterface repoSession = null;
629 boolean releaseSession = false;
631 RepositoryClientImpl nuxeoRepoClient = (RepositoryClientImpl)this.getRepositoryClient(ctx);
633 repoSession = nuxeoRepoClient.getRepositorySession(ctx);
634 DocumentWrapper<DocumentModel> wrapDoc = nuxeoRepoClient.getDocFromCsid(ctx, repoSession, authCSID);
635 DocumentModel docModel = wrapDoc.getWrappedObject();
636 if (docModel == null) {
637 throw new DocumentNotFoundException(String.format("Could not find authority resource with CSID='%s'.", authCSID));
639 shortIdentifier = (String) docModel.getProperty(schemaName, AuthorityJAXBSchema.SHORT_IDENTIFIER);
640 } catch (ClientException ce) {
641 throw new RuntimeException("AuthorityDocHandler Internal Error: cannot get shortId!", ce);
643 if (repoSession != null) {
644 nuxeoRepoClient.releaseRepositorySession(ctx, repoSession);
648 return shortIdentifier;
652 * Filters out selected values supplied in an update request.
654 * @param objectProps the properties filtered out from the update payload
655 * @param partMeta metadata for the object to fill
658 public void filterReadOnlyPropertiesForPart(
659 Map<String, Object> objectProps, ObjectPartType partMeta) {
660 super.filterReadOnlyPropertiesForPart(objectProps, partMeta);
661 String commonPartLabel = getServiceContext().getCommonPartLabel();
662 if (partMeta.getLabel().equalsIgnoreCase(commonPartLabel)) {
663 objectProps.remove(AuthorityJAXBSchema.CSID);
664 objectProps.remove(AuthorityJAXBSchema.SHORT_IDENTIFIER);
665 objectProps.remove(AuthorityJAXBSchema.REF_NAME);