From 5cbc7177e8edc1a19e85016bc618ebffe8a25b33 Mon Sep 17 00:00:00 2001 From: Richard Millet Date: Wed, 1 Aug 2012 14:21:29 -0700 Subject: [PATCH] CSPACE-5433: Left most of the code alone, but added a synchronization flag to the shared list item structure. Now this list item array gets modified only once and in a synchronized manner. --- .../AuthorityItemDocumentModelHandler.java | 102 ++++++++++-------- .../nuxeo/client/java/DocHandlerBase.java | 8 ++ .../config/src/main/resources/service.xsd | 1 + 3 files changed, 69 insertions(+), 42 deletions(-) diff --git a/services/authority/service/src/main/java/org/collectionspace/services/common/vocabulary/nuxeo/AuthorityItemDocumentModelHandler.java b/services/authority/service/src/main/java/org/collectionspace/services/common/vocabulary/nuxeo/AuthorityItemDocumentModelHandler.java index 56dff860e..22919c7aa 100644 --- a/services/authority/service/src/main/java/org/collectionspace/services/common/vocabulary/nuxeo/AuthorityItemDocumentModelHandler.java +++ b/services/authority/service/src/main/java/org/collectionspace/services/common/vocabulary/nuxeo/AuthorityItemDocumentModelHandler.java @@ -186,52 +186,70 @@ public abstract class AuthorityItemDocumentModelHandler return AuthorityItemJAXBSchema.TERM_DISPLAY_NAME.equals(elName) || VocabularyItemJAXBSchema.DISPLAY_NAME.equals(elName); } + /* + * (non-Javadoc) + * @see org.collectionspace.services.nuxeo.client.java.DocHandlerBase#getListItemsArray() + * + * Note: We're updating the "global" service and tenant bindings instance here -the list instance here is + * a reference to the tenant bindings instance in the singleton ServiceMain. + */ @Override public List getListItemsArray() throws DocumentException { List list = super.getListItemsArray(); - int nFields = list.size(); - // Ensure that each item in a list of Authority items includes - // a set of common fields, so we do not depend upon configuration - // for general logic. - boolean hasDisplayName = false; - boolean hasShortId = false; - boolean hasRefName = false; - boolean hasTermStatus = false; - for (int i = 0; i < nFields; i++) { - ListResultField field = list.get(i); - String elName = field.getElement(); - if (isTermDisplayName(elName) == true) { - hasDisplayName = true; - } else if (AuthorityItemJAXBSchema.SHORT_IDENTIFIER.equals(elName)) { - hasShortId = true; - } else if (AuthorityItemJAXBSchema.REF_NAME.equals(elName)) { - hasRefName = true; - } else if (AuthorityItemJAXBSchema.TERM_STATUS.equals(elName)) { - hasTermStatus = true; - } - } - ListResultField field; - if (!hasDisplayName) { - field = getListResultsDisplayNameField(); - list.add(field); //Note: We're updating the "global" service and tenant bindings instance here -the list instance here is a reference to the tenant bindings instance in the singleton ServiceMain. - } - if (!hasShortId) { - field = new ListResultField(); - field.setElement(AuthorityItemJAXBSchema.SHORT_IDENTIFIER); - field.setXpath(AuthorityItemJAXBSchema.SHORT_IDENTIFIER); - list.add(field); - } - if (!hasRefName) { - field = new ListResultField(); - field.setElement(AuthorityItemJAXBSchema.REF_NAME); - field.setXpath(AuthorityItemJAXBSchema.REF_NAME); - list.add(field); - } - if (!hasTermStatus) { - field = getListResultsTermStatusField(); - list.add(field); + + // One-time initialization for each authority item service. + if (isListItemArrayExtended() == false) { + synchronized(AuthorityItemDocumentModelHandler.class) { + if (isListItemArrayExtended() == false) { + int nFields = list.size(); + // Ensure that each item in a list of Authority items includes + // a set of common fields, so we do not depend upon configuration + // for general logic. + boolean hasDisplayName = false; + boolean hasShortId = false; + boolean hasRefName = false; + boolean hasTermStatus = false; + for (int i = 0; i < nFields; i++) { + ListResultField field = list.get(i); + String elName = field.getElement(); + if (isTermDisplayName(elName) == true) { + hasDisplayName = true; + } else if (AuthorityItemJAXBSchema.SHORT_IDENTIFIER.equals(elName)) { + hasShortId = true; + } else if (AuthorityItemJAXBSchema.REF_NAME.equals(elName)) { + hasRefName = true; + } else if (AuthorityItemJAXBSchema.TERM_STATUS.equals(elName)) { + hasTermStatus = true; + } + } + + ListResultField field; + if (!hasDisplayName) { + field = getListResultsDisplayNameField(); + list.add(field); + } + if (!hasShortId) { + field = new ListResultField(); + field.setElement(AuthorityItemJAXBSchema.SHORT_IDENTIFIER); + field.setXpath(AuthorityItemJAXBSchema.SHORT_IDENTIFIER); + list.add(field); + } + if (!hasRefName) { + field = new ListResultField(); + field.setElement(AuthorityItemJAXBSchema.REF_NAME); + field.setXpath(AuthorityItemJAXBSchema.REF_NAME); + list.add(field); + } + if (!hasTermStatus) { + field = getListResultsTermStatusField(); + list.add(field); + } + } + + setListItemArrayExtended(true); + } // end of synchronized block } - + return list; } diff --git a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/DocHandlerBase.java b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/DocHandlerBase.java index a70986917..d4dd49b95 100644 --- a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/DocHandlerBase.java +++ b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/DocHandlerBase.java @@ -141,6 +141,14 @@ public abstract class DocHandlerBase extends RemoteDocumentModelHandlerImpl getListItemsArray() throws DocumentException { return getDocHandlerParams().getListResultsFields().getListResultField(); } diff --git a/services/config/src/main/resources/service.xsd b/services/config/src/main/resources/service.xsd index 1c30a8f37..f059239c0 100644 --- a/services/config/src/main/resources/service.xsd +++ b/services/config/src/main/resources/service.xsd @@ -247,6 +247,7 @@ + -- 2.47.3