From ac77050b57f777977eca7c3d69090e732fe6d933 Mon Sep 17 00:00:00 2001 From: Michael Ritter Date: Tue, 18 Nov 2025 16:43:48 -0700 Subject: [PATCH] DRYD-1939: Search > Update AdvancedSearch to Spec (#487) * Update advanced search xsd to match spec * Update natural history extension to match stored data * Add NAGPRA extension xsd * Create additional classes to map CollectionObject data to the AdvancedSearchListItem fields --- services/advancedsearch/jaxb/pom.xml | 5 + .../advancedsearch/model/AgentModel.java | 92 ++++++++ .../model/BriefDescriptionListModel.java | 27 +-- .../model/ContentConceptListModel.java | 36 ++-- .../model/FieldCollectionModel.java | 54 +++++ .../model/NAGPRACategoryModel.java | 22 ++ .../model/ObjectNameListModel.java | 47 +++- .../model/ObjectProductionModel.java | 35 +++ .../ResponsibleDepartmentsListModel.java | 35 +-- .../advancedsearch/model/TaxonModel.java | 37 ++++ .../model/TitleGroupListModel.java | 26 ++- .../main/resources/advanced-search_common.xsd | 34 ++- .../advancedsearch/model/AgentModelTest.java | 112 ++++++++++ .../model/BriefDescriptionListModelTest.java | 36 ++++ .../advancedsearch/AdvancedSearch.java | 96 ++------- .../AdvancedSearchConstants.java | 2 +- .../AdvancedSearchJAXBContext.java | 5 +- .../mapper/CollectionObjectMapper.java | 172 +++++++++++++++ .../client/CollectionSpaceClient.java | 1 + .../client/CollectionObjectFactory.java | 4 +- .../test/CollectionObjectServiceTest.java | 2 +- .../resources/collectionobjects_common.xsd | 16 +- .../resources/collectionobjects_nagpra.xsd | 113 ++++++++++ .../collectionobjects_naturalhistory.xsd | 204 +++++++++--------- 24 files changed, 923 insertions(+), 290 deletions(-) create mode 100644 services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/AgentModel.java create mode 100644 services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/FieldCollectionModel.java create mode 100644 services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/NAGPRACategoryModel.java create mode 100644 services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ObjectProductionModel.java create mode 100644 services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/TaxonModel.java create mode 100644 services/advancedsearch/jaxb/src/test/java/org/collectionspace/services/advancedsearch/model/AgentModelTest.java create mode 100644 services/advancedsearch/jaxb/src/test/java/org/collectionspace/services/advancedsearch/model/BriefDescriptionListModelTest.java create mode 100644 services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/mapper/CollectionObjectMapper.java create mode 100644 services/collectionobject/jaxb/src/main/resources/collectionobjects_nagpra.xsd diff --git a/services/advancedsearch/jaxb/pom.xml b/services/advancedsearch/jaxb/pom.xml index ca9c5f3c0..110fcc0bb 100644 --- a/services/advancedsearch/jaxb/pom.xml +++ b/services/advancedsearch/jaxb/pom.xml @@ -23,6 +23,11 @@ org.collectionspace.services.collectionobject.jaxb ${project.version} + + org.collectionspace.services + org.collectionspace.services.common-api + ${project.version} + diff --git a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/AgentModel.java b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/AgentModel.java new file mode 100644 index 000000000..bfab77633 --- /dev/null +++ b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/AgentModel.java @@ -0,0 +1,92 @@ +package org.collectionspace.services.advancedsearch.model; + +import java.util.Objects; +import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import org.collectionspace.services.collectionobject.CollectionobjectsCommon; +import org.collectionspace.services.collectionobject.ObjectProductionOrganizationGroup; +import org.collectionspace.services.collectionobject.ObjectProductionOrganizationGroupList; +import org.collectionspace.services.collectionobject.ObjectProductionPeopleGroup; +import org.collectionspace.services.collectionobject.ObjectProductionPeopleGroupList; +import org.collectionspace.services.collectionobject.ObjectProductionPersonGroup; +import org.collectionspace.services.collectionobject.ObjectProductionPersonGroupList; + +public class AgentModel { + + public static Optional agent(CollectionobjectsCommon collectionObject) { + if (collectionObject == null) { + return Optional.empty(); + } + + ObjectProductionPersonGroupList persons = collectionObject.getObjectProductionPersonGroupList(); + ObjectProductionOrganizationGroupList orgs = collectionObject.getObjectProductionOrganizationGroupList(); + ObjectProductionPeopleGroupList people = collectionObject.getObjectProductionPeopleGroupList(); + return Stream.>of( + () -> personAgent(persons), + () -> orgAgent(orgs), + () -> peopleAgent(people)) + .map(Supplier::get) + .filter(Objects::nonNull) + .findFirst(); + } + + private static AgentWithRole personAgent(ObjectProductionPersonGroupList personGroupList) { + AgentWithRole agent = null; + if (personGroupList != null && !personGroupList.getObjectProductionPersonGroup().isEmpty()) { + ObjectProductionPersonGroup personGroup = personGroupList.getObjectProductionPersonGroup().get(0); + String person = personGroup.getObjectProductionPerson(); + if (person != null && !person.isEmpty()) { + agent = new AgentWithRole(person); + agent.role = personGroup.getObjectProductionPersonRole(); + } + } + return agent; + } + + private static AgentWithRole orgAgent(ObjectProductionOrganizationGroupList organizationGroupList) { + AgentWithRole agent = null; + if (organizationGroupList != null && !organizationGroupList.getObjectProductionOrganizationGroup().isEmpty()) { + ObjectProductionOrganizationGroup orgGroup = + organizationGroupList.getObjectProductionOrganizationGroup().get(0); + String org = orgGroup.getObjectProductionOrganization(); + if (org != null && !org.isEmpty()) { + agent = new AgentWithRole(org); + agent.role = orgGroup.getObjectProductionOrganizationRole(); + } + } + return agent; + } + + private static AgentWithRole peopleAgent(ObjectProductionPeopleGroupList peopleGroupList) { + AgentWithRole agent = null; + if (peopleGroupList != null && !peopleGroupList.getObjectProductionPeopleGroup().isEmpty()) { + ObjectProductionPeopleGroup peopleGroup = peopleGroupList.getObjectProductionPeopleGroup().get(0); + String people = peopleGroup.getObjectProductionPeople(); + if (people != null && !people.isEmpty()) { + agent = new AgentWithRole(people); + agent.role = peopleGroup.getObjectProductionPeopleRole(); + } + } + return agent; + } + + public static class AgentWithRole { + private final String agent; + private String role; + + public AgentWithRole(final String agent) { + this.agent = agent; + } + + public String getAgent() { + return agent; + } + + public String getRole() { + return role; + } + } + +} diff --git a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/BriefDescriptionListModel.java b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/BriefDescriptionListModel.java index 9cf87ccaf..1216984c1 100644 --- a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/BriefDescriptionListModel.java +++ b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/BriefDescriptionListModel.java @@ -5,22 +5,25 @@ import java.util.List; import org.collectionspace.services.collectionobject.BriefDescriptionList; public class BriefDescriptionListModel { - private static int DESCRIPTION_LENGTH = 55; + private static final int DESCRIPTION_LENGTH = 255; + public static String briefDescriptionListToDisplayString(BriefDescriptionList bdList) { List bds = bdList.getBriefDescription(); - String returnString = ""; - // "Display first 55 (?) characters..." from https://docs.google.com/spreadsheets/d/103jyxa2oCtt8U0IQ25xsOyIxqwKvPNXlcCtcjGlT5tQ/edit?gid=0#gid=0 - // FIXME the above business logic is inadequate because there are numerous brief descriptions - if(null != bds) { - if(!bds.isEmpty()) { - // get the 1st 55 characters of the 1st defined brief description if there is one - if(null != bds.get(0)) { - int length = bds.get(0).length(); - returnString = bds.get(0).substring(0, (length >= DESCRIPTION_LENGTH) ? DESCRIPTION_LENGTH : length); + StringBuilder buf = new StringBuilder(); + if (null != bds) { + if (!bds.isEmpty()) { + // get the 1st 255 characters of the 1st defined brief description if there is one + String description = bds.get(0); + if (null != description) { + int length = description.length(); + buf.append(description); + if (length > DESCRIPTION_LENGTH) { + buf.replace(DESCRIPTION_LENGTH, buf.length(), "..."); + } } - + } } - return returnString; + return buf.toString(); } } diff --git a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ContentConceptListModel.java b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ContentConceptListModel.java index 57a50a391..ae45b7ad6 100644 --- a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ContentConceptListModel.java +++ b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ContentConceptListModel.java @@ -1,35 +1,25 @@ package org.collectionspace.services.advancedsearch.model; -import java.util.ArrayList; import java.util.List; -import org.collectionspace.services.collectionobject.ContentConceptList; +import org.collectionspace.services.advancedsearch.ContentConcepts; +import org.collectionspace.services.advancedsearch.ObjectFactory; +import org.collectionspace.services.collectionobject.CollectionobjectsCommon; public class ContentConceptListModel { - public static String contentConceptListDisplayString(ContentConceptList conceptList) { - List displayConcepts = new ArrayList(); - if(null != conceptList) { - List concepts = conceptList.getContentConcept(); - for (String conceptRefname : concepts) { - displayConcepts.add(displayNameFromRefName(conceptRefname)); + public static ContentConcepts contentConceptList(CollectionobjectsCommon collectionObject) { + ContentConcepts concepts = null; + final ObjectFactory objectFactory = new ObjectFactory(); + + if (collectionObject != null && collectionObject.getContentConcepts() != null) { + List objectConcepts = collectionObject.getContentConcepts().getContentConcept(); + if (!objectConcepts.isEmpty()) { + concepts = objectFactory.createContentConcepts(); + concepts.getContentConcept().addAll(objectConcepts); } } - return String.join(",", displayConcepts); - } - - private static String displayNameFromRefName(String refname) { - // e.g. - // urn:cspace:core.collectionspace.org:conceptauthorities:name(concept):item:name(FooConcept1749234493809)'FooConcept' - // -> FooConcept - // TODO: there is probably code somewhere for doing this - String displayName = refname; - if(refname.indexOf("'") < refname.lastIndexOf("'")) { - displayName = refname.substring(refname.indexOf("'")+1, refname.lastIndexOf("'")); - } - - return displayName; + return concepts; } - } diff --git a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/FieldCollectionModel.java b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/FieldCollectionModel.java new file mode 100644 index 000000000..4acfa6085 --- /dev/null +++ b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/FieldCollectionModel.java @@ -0,0 +1,54 @@ +package org.collectionspace.services.advancedsearch.model; + +import java.util.List; +import java.util.Optional; + +import org.collectionspace.services.collectionobject.CollectionobjectsCommon; +import org.collectionspace.services.collectionobject.StructuredDateGroup; + +public class FieldCollectionModel { + + public static String fieldCollectionPlace(CollectionobjectsCommon common) { + String fieldCollectionPlace = null; + if (common != null && common.getFieldCollectionPlaces() != null) { + List places = common.getFieldCollectionPlaces().getFieldCollectionPlace(); + if (!places.isEmpty()) { + fieldCollectionPlace = places.get(0); + } + } + return fieldCollectionPlace; + } + + public static String fieldCollectionSite(CollectionobjectsCommon common) { + String fieldCollectionSite = null; + if (common != null && common.getFieldCollectionSites() != null) { + List sites = common.getFieldCollectionSites().getFieldCollectionSite(); + if (!sites.isEmpty()) { + fieldCollectionSite = sites.get(0); + } + } + return fieldCollectionSite; + } + + public static String fieldCollectionDate(CollectionobjectsCommon common) { + String fieldCollectionDate = null; + if (common != null && common.getFieldCollectionDateGroup() != null) { + StructuredDateGroup fieldCollectionDateGroup = common.getFieldCollectionDateGroup(); + fieldCollectionDate = fieldCollectionDateGroup.getDateDisplayDate(); + } + return fieldCollectionDate; + } + + + public static Optional fieldCollector(CollectionobjectsCommon common) { + String fieldCollector = null; + if (common != null && common.getFieldCollectors() != null) { + final List fieldCollectors = common.getFieldCollectors().getFieldCollector(); + if (!fieldCollectors.isEmpty()) { + fieldCollector = fieldCollectors.get(0); + } + } + + return Optional.ofNullable(fieldCollector); + } +} diff --git a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/NAGPRACategoryModel.java b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/NAGPRACategoryModel.java new file mode 100644 index 000000000..a45a160f3 --- /dev/null +++ b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/NAGPRACategoryModel.java @@ -0,0 +1,22 @@ +package org.collectionspace.services.advancedsearch.model; + +import org.collectionspace.services.advancedsearch.NagpraCategories; +import org.collectionspace.services.advancedsearch.ObjectFactory; +import org.collectionspace.services.collectionobject.domain.nagpra.CollectionObjectsNAGPRA; + +public class NAGPRACategoryModel { + + public static NagpraCategories napgraCategories(CollectionObjectsNAGPRA nagpra) { + final ObjectFactory asObjectFactory = new ObjectFactory(); + final CollectionObjectsNAGPRA.NagpraCategories objectNAGPRACategories = nagpra.getNagpraCategories(); + + NagpraCategories searchCategories = null; + if (objectNAGPRACategories != null && !objectNAGPRACategories.getNagpraCategory().isEmpty()) { + searchCategories = asObjectFactory.createNagpraCategories(); + searchCategories.getNagpraCategory().addAll(objectNAGPRACategories.getNagpraCategory()); + } + + return searchCategories; + } + +} diff --git a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ObjectNameListModel.java b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ObjectNameListModel.java index a084882a6..09024828d 100644 --- a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ObjectNameListModel.java +++ b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ObjectNameListModel.java @@ -2,22 +2,47 @@ package org.collectionspace.services.advancedsearch.model; import java.util.List; +import org.collectionspace.services.collectionobject.CollectionobjectsCommon; import org.collectionspace.services.collectionobject.ObjectNameGroup; -import org.collectionspace.services.collectionobject.ObjectNameList; +import org.collectionspace.services.common.api.RefNameUtils; public class ObjectNameListModel { - public static String objectNameListToDisplayString(ObjectNameList onList) { - List objectNameGroups = onList.getObjectNameGroup(); - String returnString = ""; - if(null != objectNameGroups ) { - if(!objectNameGroups.isEmpty()) { - ObjectNameGroup objectNameGroup = objectNameGroups.get(0); - if(null != objectNameGroup.getObjectName()) { - returnString = objectNameGroup.getObjectName(); + + /** + * @param collectionObject The CollectionObject Common part + * @return The value of the objectNameControlled field + */ + public static String objectNameControlled(final CollectionobjectsCommon collectionObject) { + String objectNameControlled = null; + + if (collectionObject != null && collectionObject.getObjectNameList() != null) { + final List objectNameGroups = collectionObject.getObjectNameList().getObjectNameGroup(); + if (!objectNameGroups.isEmpty()) { + final ObjectNameGroup objectNameGroup = objectNameGroups.get(0); + try { + objectNameControlled = RefNameUtils.getDisplayName(objectNameGroup.getObjectNameControlled()); + } catch (IllegalArgumentException ignored) { } } } - - return returnString; + + return objectNameControlled; + } + + /** + * @param collectionObject The CollectionObject Common part + * @return The value of the objectName field + */ + public static String objectName(final CollectionobjectsCommon collectionObject) { + String objectName = null; + if (collectionObject!= null && collectionObject.getObjectNameList() != null) { + final List objectNameGroups = collectionObject.getObjectNameList().getObjectNameGroup(); + if (!objectNameGroups.isEmpty()) { + final ObjectNameGroup objectNameGroup = objectNameGroups.get(0); + objectName = objectNameGroup.getObjectName(); + } + } + + return objectName; } } diff --git a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ObjectProductionModel.java b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ObjectProductionModel.java new file mode 100644 index 000000000..9f865efd0 --- /dev/null +++ b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ObjectProductionModel.java @@ -0,0 +1,35 @@ +package org.collectionspace.services.advancedsearch.model; + +import java.util.List; + +import org.collectionspace.services.collectionobject.CollectionobjectsCommon; +import org.collectionspace.services.collectionobject.ObjectProductionDateGroupList; +import org.collectionspace.services.collectionobject.ObjectProductionPlaceGroup; + +public class ObjectProductionModel { + + public static String objectProductionDate(CollectionobjectsCommon collectionObject) { + String date = null; + if (collectionObject != null && collectionObject.getObjectProductionDateGroupList() != null) { + ObjectProductionDateGroupList dateGroup = collectionObject.getObjectProductionDateGroupList(); + if (!dateGroup.getObjectProductionDateGroup().isEmpty()) { + date = dateGroup.getObjectProductionDateGroup().get(0).getDateDisplayDate(); + } + } + return date; + } + + public static String objectProductionPlace(CollectionobjectsCommon collectionObject) { + String place = null; + if (collectionObject != null && collectionObject.getObjectProductionPlaceGroupList() != null) { + List placeGroup = collectionObject.getObjectProductionPlaceGroupList() + .getObjectProductionPlaceGroup(); + + if (!placeGroup.isEmpty()) { + place = placeGroup.get(0).getObjectProductionPlace(); + } + } + + return place; + } +} diff --git a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ResponsibleDepartmentsListModel.java b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ResponsibleDepartmentsListModel.java index 1c192bc2a..862742de5 100644 --- a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ResponsibleDepartmentsListModel.java +++ b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/ResponsibleDepartmentsListModel.java @@ -1,34 +1,19 @@ package org.collectionspace.services.advancedsearch.model; -import java.util.List; - -import org.collectionspace.services.advancedsearch.ObjectFactory; -import org.collectionspace.services.advancedsearch.ResponsibleDepartment; -import org.collectionspace.services.advancedsearch.ResponsibleDepartmentsList; +import org.collectionspace.services.collectionobject.CollectionobjectsCommon; import org.collectionspace.services.collectionobject.ResponsibleDepartmentList; public class ResponsibleDepartmentsListModel { - private static ObjectFactory objectFactory = new ObjectFactory(); - public static ResponsibleDepartmentsList responsibleDepartmentListToResponsibleDepartmentsList(ResponsibleDepartmentList rdList) { - ResponsibleDepartmentsList responsibleDepartmentList = objectFactory.createResponsibleDepartmentsList(); - // NOTE "Display all values separated by comma", from https://docs.google.com/spreadsheets/d/103jyxa2oCtt8U0IQ25xsOyIxqwKvPNXlcCtcjGlT5tQ/edit?gid=0#gid=0 - List responsibleDepartmentNames = rdList.getResponsibleDepartment(); - if(null != responsibleDepartmentNames) { - for(String responsibleDepartmentName : responsibleDepartmentNames) { - ResponsibleDepartment responsibleDepartment = objectFactory.createResponsibleDepartment(); - responsibleDepartment.setName(responsibleDepartmentName); - responsibleDepartmentList.getResponsibleDepartment().add(responsibleDepartment); - } - } - return responsibleDepartmentList; - } - public static String responsibleDepartmentsListDisplayString(ResponsibleDepartmentsList rdl) { - String rdlString = ""; - if (null != rdl && null != rdl.getResponsibleDepartment() && rdl.getResponsibleDepartment().size() > 0) { - ResponsibleDepartment rd = rdl.getResponsibleDepartment().get(0); - rdlString = rd.getName(); + public static String responsibleDepartmentString(CollectionobjectsCommon collectionObject) { + String responsibleDepartment = null; + if (collectionObject != null && collectionObject.getResponsibleDepartments() != null) { + ResponsibleDepartmentList responsibleDepartments = collectionObject.getResponsibleDepartments(); + if (!responsibleDepartments.getResponsibleDepartment().isEmpty()) { + responsibleDepartment = responsibleDepartments.getResponsibleDepartment().get(0); + } } - return rdlString; + return responsibleDepartment; } + } diff --git a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/TaxonModel.java b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/TaxonModel.java new file mode 100644 index 000000000..1be0f9c25 --- /dev/null +++ b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/TaxonModel.java @@ -0,0 +1,37 @@ +package org.collectionspace.services.advancedsearch.model; + +import java.util.List; + +import org.collectionspace.services.collectionobject.CollectionobjectsCommon; +import org.collectionspace.services.collectionobject.domain.naturalhistory_extension.CollectionobjectsNaturalhistory; +import org.collectionspace.services.collectionobject.domain.naturalhistory_extension.TaxonomicIdentGroup; +import org.collectionspace.services.collectionobject.domain.naturalhistory_extension.TaxonomicIdentGroupList; + +public class TaxonModel { + + public static String taxon(final CollectionobjectsNaturalhistory naturalHistory) { + String taxon = null; + if (naturalHistory != null && naturalHistory.getTaxonomicIdentGroupList() != null) { + TaxonomicIdentGroupList taxonomicIdentGroupList = naturalHistory.getTaxonomicIdentGroupList(); + List taxonomicIdentGroups = taxonomicIdentGroupList.getTaxonomicIdentGroup(); + if (!taxonomicIdentGroups.isEmpty()) { + TaxonomicIdentGroup taxonGroup = taxonomicIdentGroups.get(0); + taxon = taxonGroup.getTaxon(); + } + } + + return taxon; + } + + public static String preservationForm(final CollectionobjectsCommon common) { + String form = null; + if (common != null && common.getForms() != null) { + List forms = common.getForms().getForm(); + if (!forms.isEmpty()) { + form = forms.get(0); + } + } + + return form; + } +} diff --git a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/TitleGroupListModel.java b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/TitleGroupListModel.java index 6b9844d42..7b55a5dad 100644 --- a/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/TitleGroupListModel.java +++ b/services/advancedsearch/jaxb/src/main/java/org/collectionspace/services/advancedsearch/model/TitleGroupListModel.java @@ -6,20 +6,24 @@ import org.collectionspace.services.collectionobject.TitleGroup; import org.collectionspace.services.collectionobject.TitleGroupList; public class TitleGroupListModel { + + /** + * @param tlList The TitleGroupList + * @return the value of the title field for the first TitleGroup + */ public static String titleGroupListToDisplayString(TitleGroupList tlList) { - String returnString = ""; + if (tlList == null) { + return null; + } + + String title = null; List titleGroups = tlList.getTitleGroup(); - // "Title: Display 1st Title OR 1st Controlled Nomenclature combined with Uncontrolled Nomenclature OR 1st Taxon with Preservation Form" from https://docs.google.com/spreadsheets/d/103jyxa2oCtt8U0IQ25xsOyIxqwKvPNXlcCtcjGlT5tQ/edit?gid=0#gid=0 - // FIXME: we are not fully implementing the above logic below - if(null != titleGroups) { - if(!titleGroups.isEmpty()) { - TitleGroup titleGroup = titleGroups.get(0); - if(null != titleGroup.getTitle()) { - returnString = titleGroup.getTitle(); - } - } + + if (!titleGroups.isEmpty() && titleGroups.get(0) != null) { + TitleGroup titleGroup = titleGroups.get(0); + title = titleGroup.getTitle(); } - return returnString; + return title; } } diff --git a/services/advancedsearch/jaxb/src/main/resources/advanced-search_common.xsd b/services/advancedsearch/jaxb/src/main/resources/advanced-search_common.xsd index 7e07e92db..2ba600497 100644 --- a/services/advancedsearch/jaxb/src/main/resources/advanced-search_common.xsd +++ b/services/advancedsearch/jaxb/src/main/resources/advanced-search_common.xsd @@ -25,17 +25,15 @@ - + - - - - + - + + - + @@ -53,15 +51,29 @@ - - - - + + + + + + + + + + + + + + + + + + diff --git a/services/advancedsearch/jaxb/src/test/java/org/collectionspace/services/advancedsearch/model/AgentModelTest.java b/services/advancedsearch/jaxb/src/test/java/org/collectionspace/services/advancedsearch/model/AgentModelTest.java new file mode 100644 index 000000000..60435490a --- /dev/null +++ b/services/advancedsearch/jaxb/src/test/java/org/collectionspace/services/advancedsearch/model/AgentModelTest.java @@ -0,0 +1,112 @@ +package org.collectionspace.services.advancedsearch.model; + +import java.util.Optional; +import java.util.UUID; + +import org.collectionspace.services.advancedsearch.model.AgentModel.AgentWithRole; +import org.collectionspace.services.collectionobject.CollectionobjectsCommon; +import org.collectionspace.services.collectionobject.ObjectFactory; +import org.collectionspace.services.collectionobject.ObjectProductionOrganizationGroup; +import org.collectionspace.services.collectionobject.ObjectProductionOrganizationGroupList; +import org.collectionspace.services.collectionobject.ObjectProductionPeopleGroup; +import org.collectionspace.services.collectionobject.ObjectProductionPeopleGroupList; +import org.collectionspace.services.collectionobject.ObjectProductionPersonGroup; +import org.collectionspace.services.collectionobject.ObjectProductionPersonGroupList; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * Basic tests to ensure that the preferred ordering is used for the Agent and Agent Role response data + */ +public class AgentModelTest { + + private ObjectFactory objectFactory; + private ObjectProductionPersonGroupList personGroupList; + private ObjectProductionOrganizationGroupList orgGroupList; + private ObjectProductionPeopleGroupList peopleGroupList; + + @BeforeClass + public void setup() { + objectFactory = new ObjectFactory(); + + ObjectProductionPersonGroup personGroup = objectFactory.createObjectProductionPersonGroup(); + personGroup.setObjectProductionPerson(UUID.randomUUID().toString()); + personGroup.setObjectProductionPersonRole(UUID.randomUUID().toString()); + personGroupList = objectFactory.createObjectProductionPersonGroupList(); + personGroupList.getObjectProductionPersonGroup().add(personGroup); + + ObjectProductionOrganizationGroup orgGroup = objectFactory.createObjectProductionOrganizationGroup(); + orgGroup.setObjectProductionOrganization(UUID.randomUUID().toString()); + orgGroup.setObjectProductionOrganizationRole(UUID.randomUUID().toString()); + orgGroupList = objectFactory.createObjectProductionOrganizationGroupList(); + orgGroupList.getObjectProductionOrganizationGroup().add(orgGroup); + + ObjectProductionPeopleGroup peopleGroup = objectFactory.createObjectProductionPeopleGroup(); + peopleGroup.setObjectProductionPeople(UUID.randomUUID().toString()); + peopleGroup.setObjectProductionPeopleRole(UUID.randomUUID().toString()); + peopleGroupList = objectFactory.createObjectProductionPeopleGroupList(); + peopleGroupList.getObjectProductionPeopleGroup().add(peopleGroup); + } + + @Test + public void testOrderWithProductionPerson() { + final ObjectProductionPersonGroup agentGroup = personGroupList.getObjectProductionPersonGroup().get(0); + final String expectedAgent = agentGroup.getObjectProductionPerson(); + final String expectedRole = agentGroup.getObjectProductionPersonRole(); + + final CollectionobjectsCommon common = objectFactory.createCollectionobjectsCommon(); + common.setObjectProductionPersonGroupList(personGroupList); + common.setObjectProductionOrganizationGroupList(orgGroupList); + common.setObjectProductionPeopleGroupList(peopleGroupList); + + final Optional agentWithRole = AgentModel.agent(common); + Assert.assertTrue(agentWithRole.isPresent()); + + final AgentWithRole agent = agentWithRole.get(); + Assert.assertEquals(agent.getAgent(), expectedAgent); + Assert.assertEquals(agent.getRole(), expectedRole); + } + + @Test + public void testOrderWithProductionOrganization() { + final ObjectProductionOrganizationGroup agentGroup = orgGroupList.getObjectProductionOrganizationGroup().get(0); + final String expectedAgent = agentGroup.getObjectProductionOrganization(); + final String expectedRole = agentGroup.getObjectProductionOrganizationRole(); + + final CollectionobjectsCommon common = objectFactory.createCollectionobjectsCommon(); + common.setObjectProductionOrganizationGroupList(orgGroupList); + common.setObjectProductionPeopleGroupList(peopleGroupList); + + final Optional agentWithRole = AgentModel.agent(common); + Assert.assertTrue(agentWithRole.isPresent()); + + final AgentWithRole agent = agentWithRole.get(); + Assert.assertEquals(agent.getAgent(), expectedAgent); + Assert.assertEquals(agent.getRole(), expectedRole); + } + + @Test + public void testOrderWithProductionPeople() { + final ObjectProductionPeopleGroup agentGroup = peopleGroupList.getObjectProductionPeopleGroup().get(0); + final String expectedAgent = agentGroup.getObjectProductionPeople(); + final String expectedRole = agentGroup.getObjectProductionPeopleRole(); + + final CollectionobjectsCommon common = objectFactory.createCollectionobjectsCommon(); + common.setObjectProductionPeopleGroupList(peopleGroupList); + + final Optional agentWithRole = AgentModel.agent(common); + Assert.assertTrue(agentWithRole.isPresent()); + + final AgentWithRole agent = agentWithRole.get(); + Assert.assertEquals(agent.getAgent(), expectedAgent); + Assert.assertEquals(agent.getRole(), expectedRole); + } + + @Test + public void testAllEmpty() { + final CollectionobjectsCommon common = objectFactory.createCollectionobjectsCommon(); + final Optional agentWithRole = AgentModel.agent(common); + Assert.assertFalse(agentWithRole.isPresent()); + } +} \ No newline at end of file diff --git a/services/advancedsearch/jaxb/src/test/java/org/collectionspace/services/advancedsearch/model/BriefDescriptionListModelTest.java b/services/advancedsearch/jaxb/src/test/java/org/collectionspace/services/advancedsearch/model/BriefDescriptionListModelTest.java new file mode 100644 index 000000000..b86f7bf6c --- /dev/null +++ b/services/advancedsearch/jaxb/src/test/java/org/collectionspace/services/advancedsearch/model/BriefDescriptionListModelTest.java @@ -0,0 +1,36 @@ +package org.collectionspace.services.advancedsearch.model; + +import org.apache.commons.lang3.RandomStringUtils; +import org.collectionspace.services.collectionobject.BriefDescriptionList; +import org.collectionspace.services.collectionobject.ObjectFactory; +import org.testng.Assert; +import org.testng.annotations.Test; + +/** + * Test that we truncate the Brief Description when required + */ +public class BriefDescriptionListModelTest { + private final ObjectFactory objectFactory = new ObjectFactory(); + + @Test + public void testShortBriefDescription() { + final String description = "short description"; + final BriefDescriptionList briefDescriptionList = objectFactory.createBriefDescriptionList(); + briefDescriptionList.getBriefDescription().add(description); + + Assert.assertEquals(BriefDescriptionListModel.briefDescriptionListToDisplayString(briefDescriptionList), + description); + + } + + @Test + public void testTruncatedBriefDescription() { + String longDescription = RandomStringUtils.randomAlphabetic(300); + final BriefDescriptionList briefDescriptionList = objectFactory.createBriefDescriptionList(); + briefDescriptionList.getBriefDescription().add(longDescription); + + String truncated = BriefDescriptionListModel.briefDescriptionListToDisplayString(briefDescriptionList); + Assert.assertTrue(longDescription.length() > truncated.length()); + Assert.assertTrue(truncated.endsWith("...")); + } +} \ No newline at end of file diff --git a/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearch.java b/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearch.java index 91856347b..932487746 100644 --- a/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearch.java +++ b/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearch.java @@ -1,10 +1,8 @@ package org.collectionspace.services.advancedsearch; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; - import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -16,21 +14,11 @@ import javax.ws.rs.core.UriInfo; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; -import org.collectionspace.collectionspace_core.CollectionSpaceCore; import org.collectionspace.services.MediaJAXBSchema; import org.collectionspace.services.advancedsearch.AdvancedsearchCommonList.AdvancedsearchListItem; -import org.collectionspace.services.advancedsearch.model.BriefDescriptionListModel; -import org.collectionspace.services.advancedsearch.model.ContentConceptListModel; -import org.collectionspace.services.advancedsearch.model.ObjectNameListModel; -import org.collectionspace.services.advancedsearch.model.ResponsibleDepartmentsListModel; -import org.collectionspace.services.advancedsearch.model.TitleGroupListModel; -import org.collectionspace.services.client.CollectionObjectClient; -import org.collectionspace.services.client.CollectionSpaceClient; +import org.collectionspace.services.advancedsearch.mapper.CollectionObjectMapper; import org.collectionspace.services.client.IQueryManager; -import org.collectionspace.services.client.PayloadOutputPart; -import org.collectionspace.services.client.PoxPayloadOut; import org.collectionspace.services.collectionobject.CollectionObjectResource; -import org.collectionspace.services.collectionobject.CollectionobjectsCommon; import org.collectionspace.services.common.AbstractCollectionSpaceResourceImpl; import org.collectionspace.services.common.UriInfoWrapper; import org.collectionspace.services.common.context.RemoteServiceContextFactory; @@ -44,7 +32,6 @@ import org.collectionspace.services.nuxeo.client.handler.UnfilteredDocumentModel import org.collectionspace.services.relation.RelationsCommonList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; import org.w3c.dom.Element; /** @@ -55,11 +42,8 @@ import org.w3c.dom.Element; @Produces("application/xml") public class AdvancedSearch extends AbstractCollectionSpaceResourceImpl { + // FIXME: it's not great to hardcode either of these private static final String FIELDS_RETURNED = "uri|csid|refName|blobCsid|updatedAt|objectId|objectNumber|objectName|title|computedCurrentLocation|responsibleDepartments|responsibleDepartment|contentConcepts|briefDescription"; - // FIXME: it's not great to hardcode this here - private static final String COMMON_PART_NAME = CollectionObjectClient.SERVICE_NAME - + CollectionSpaceClient.PART_LABEL_SEPARATOR - + CollectionSpaceClient.PART_COMMON_LABEL; private final Logger logger = LoggerFactory.getLogger(AdvancedSearch.class); private final CollectionObjectResource cor = new CollectionObjectResource(); @@ -86,10 +70,7 @@ public class AdvancedSearch cor.setDocumentHandlerClass(UnfilteredDocumentModelHandler.class); ObjectFactory objectFactory = new ObjectFactory(); - // the list to return AdvancedsearchCommonList resultsList = objectFactory.createAdvancedsearchCommonList(); - // FIXME: this shouldn't be necessary? - resultsList.advancedsearchListItem = new ArrayList<>(); AbstractCommonList abstractCommonList = cor.getList(uriInfo); if (!(abstractCommonList instanceof CSDocumentModelList)) { @@ -105,78 +86,27 @@ public class AdvancedSearch throw new RuntimeException("Unable to create unmarshaller for AdvancedSearch", e); } + final CollectionObjectMapper responseMapper = new CollectionObjectMapper(unmarshaller); for (CSDocumentModelResponse response : collectionObjectList.getResponseList()) { - PoxPayloadOut outputPayload = response.getPayload(); - PayloadOutputPart corePart = outputPayload.getPart(CollectionSpaceClient.COLLECTIONSPACE_CORE_SCHEMA); - PayloadOutputPart commonPart = outputPayload.getPart(COMMON_PART_NAME); - CollectionSpaceCore core; - CollectionobjectsCommon collectionObject; - - try { - core = (CollectionSpaceCore) unmarshaller.unmarshal((Document) corePart.getBody()); - collectionObject = (CollectionobjectsCommon) unmarshaller.unmarshal((Document) commonPart.getBody()); - } catch (JAXBException e) { - throw new RuntimeException(e); - } - String csid = response.getCsid(); UriInfoWrapper wrappedUriInfo = new UriInfoWrapper(uriInfo); List blobCsids = findBlobCsids(csid, wrappedUriInfo); - AdvancedsearchListItem listItem = objectFactory.createAdvancedsearchCommonListAdvancedsearchListItem(); - if (core != null) { - listItem.setCsid(csid); - listItem.setRefName(core.getRefName()); - listItem.setUri(core.getUri()); - listItem.setUpdatedAt(core.getUpdatedAt()); - } else { - logger.warn("advancedsearch: could not find collectionspace_core associated with csid {}", csid); - } - - if (collectionObject != null) { - listItem.setObjectNumber(collectionObject.getObjectNumber()); - listItem.setBriefDescription(BriefDescriptionListModel - .briefDescriptionListToDisplayString(collectionObject.getBriefDescriptions())); - listItem.setComputedCurrentLocation(collectionObject.getComputedCurrentLocation()); - listItem.setObjectName( - ObjectNameListModel.objectNameListToDisplayString(collectionObject.getObjectNameList())); - listItem.setTitle( - TitleGroupListModel.titleGroupListToDisplayString(collectionObject.getTitleGroupList())); - ResponsibleDepartmentsList rdl = ResponsibleDepartmentsListModel - .responsibleDepartmentListToResponsibleDepartmentsList( - collectionObject.getResponsibleDepartments()); - listItem.setResponsibleDepartments(rdl); - listItem.setResponsibleDepartment( - ResponsibleDepartmentsListModel.responsibleDepartmentsListDisplayString(rdl)); - - listItem.setContentConcepts( - ContentConceptListModel.contentConceptListDisplayString(collectionObject.getContentConcepts())); - - // from media resource - if (blobCsids.size() > 0) { - listItem.setBlobCsid(blobCsids.get(0)); + AdvancedsearchListItem listItem = responseMapper.asListItem(response, blobCsids); + if (listItem != null) { + if (markRelated != null) { + RelationsCommonList relationsList = relations.getRelationForSubject(markRelated, csid, uriInfo); + listItem.setRelated(!relationsList.getRelationListItem().isEmpty()); } - // add the populated item to the results resultsList.getAdvancedsearchListItem().add(listItem); - } else { - logger.warn("advancedsearch: could not find CollectionobjectsCommon associated with csid {}", csid); - } - - if (markRelated != null) { - RelationsCommonList relationsList = relations.getRelationForSubject(markRelated, csid, uriInfo); - listItem.setRelated(!relationsList.getRelationListItem().isEmpty()); } } - // NOTE: I think this is necessary for the front end to know what to do with - // what's returned (?) - AbstractCommonList abstractList = (AbstractCommonList) resultsList; - abstractList.setItemsInPage(collectionObjectList.getItemsInPage()); - abstractList.setPageNum(collectionObjectList.getPageNum()); - abstractList.setPageSize(collectionObjectList.getPageSize()); - abstractList.setTotalItems(collectionObjectList.getTotalItems()); - // FIXME: is there a way to generate this rather than hardcode it? - abstractList.setFieldsReturned(FIELDS_RETURNED); + resultsList.setItemsInPage(collectionObjectList.getItemsInPage()); + resultsList.setPageNum(collectionObjectList.getPageNum()); + resultsList.setPageSize(collectionObjectList.getPageSize()); + resultsList.setTotalItems(collectionObjectList.getTotalItems()); + resultsList.setFieldsReturned(FIELDS_RETURNED); return resultsList; } diff --git a/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearchConstants.java b/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearchConstants.java index cf5c32654..98d287977 100644 --- a/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearchConstants.java +++ b/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearchConstants.java @@ -1,7 +1,7 @@ package org.collectionspace.services.advancedsearch; /** - * Maybe better as an enum type? + * Constants for the AdvancedSearch API */ public interface AdvancedSearchConstants { diff --git a/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearchJAXBContext.java b/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearchJAXBContext.java index ae2bd1206..9a1bb24d9 100644 --- a/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearchJAXBContext.java +++ b/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/AdvancedSearchJAXBContext.java @@ -5,6 +5,8 @@ import javax.xml.bind.JAXBException; import org.collectionspace.collectionspace_core.CollectionSpaceCore; import org.collectionspace.services.collectionobject.CollectionobjectsCommon; +import org.collectionspace.services.collectionobject.domain.nagpra.CollectionObjectsNAGPRA; +import org.collectionspace.services.collectionobject.domain.naturalhistory_extension.CollectionobjectsNaturalhistory; /** * Singleton for the {@link JAXBContext} which the AdvancedSearch will use @@ -18,7 +20,8 @@ public final class AdvancedSearchJAXBContext { private AdvancedSearchJAXBContext() { try { - jaxbContext = JAXBContext.newInstance(CollectionSpaceCore.class, CollectionobjectsCommon.class); + jaxbContext = JAXBContext.newInstance(CollectionSpaceCore.class, CollectionobjectsCommon.class, + CollectionobjectsNaturalhistory.class, CollectionObjectsNAGPRA.class); } catch (JAXBException e) { throw new RuntimeException("Unable to create JAXBContext for AdvancedSearch"); } diff --git a/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/mapper/CollectionObjectMapper.java b/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/mapper/CollectionObjectMapper.java new file mode 100644 index 000000000..3b83c2751 --- /dev/null +++ b/services/advancedsearch/service/src/main/java/org/collectionspace/services/advancedsearch/mapper/CollectionObjectMapper.java @@ -0,0 +1,172 @@ +package org.collectionspace.services.advancedsearch.mapper; + +import static org.collectionspace.services.client.CollectionSpaceClient.COLLECTIONSPACE_CORE_SCHEMA; +import static org.collectionspace.services.client.CollectionSpaceClient.NAGPRA_EXTENSION_NAME; +import static org.collectionspace.services.client.CollectionSpaceClient.NATURALHISTORY_EXT_EXTENSION_NAME; +import static org.collectionspace.services.client.CollectionSpaceClient.PART_COMMON_LABEL; +import static org.collectionspace.services.client.CollectionSpaceClient.PART_LABEL_SEPARATOR; + +import java.util.List; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import org.collectionspace.collectionspace_core.CollectionSpaceCore; +import org.collectionspace.services.advancedsearch.AdvancedsearchCommonList.AdvancedsearchListItem; +import org.collectionspace.services.advancedsearch.ObjectFactory; +import org.collectionspace.services.advancedsearch.model.AgentModel; +import org.collectionspace.services.advancedsearch.model.BriefDescriptionListModel; +import org.collectionspace.services.advancedsearch.model.ContentConceptListModel; +import org.collectionspace.services.advancedsearch.model.FieldCollectionModel; +import org.collectionspace.services.advancedsearch.model.NAGPRACategoryModel; +import org.collectionspace.services.advancedsearch.model.ObjectNameListModel; +import org.collectionspace.services.advancedsearch.model.ObjectProductionModel; +import org.collectionspace.services.advancedsearch.model.ResponsibleDepartmentsListModel; +import org.collectionspace.services.advancedsearch.model.TaxonModel; +import org.collectionspace.services.advancedsearch.model.TitleGroupListModel; +import org.collectionspace.services.client.CollectionObjectClient; +import org.collectionspace.services.client.PayloadOutputPart; +import org.collectionspace.services.client.PoxPayloadOut; +import org.collectionspace.services.collectionobject.CollectionobjectsCommon; +import org.collectionspace.services.collectionobject.domain.nagpra.CollectionObjectsNAGPRA; +import org.collectionspace.services.collectionobject.domain.naturalhistory_extension.CollectionobjectsNaturalhistory; +import org.collectionspace.services.nuxeo.client.handler.CSDocumentModelList.CSDocumentModelResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; + +/** + * A class for mapping {@link CSDocumentModelResponse} to {@link AdvancedsearchListItem}. + * + * @since 8.3.0 + */ +public class CollectionObjectMapper { + + private static final Logger logger = LoggerFactory.getLogger(CollectionObjectMapper.class); + + private static final String COMMON_PART_NAME = + CollectionObjectClient.SERVICE_NAME + PART_LABEL_SEPARATOR + PART_COMMON_LABEL; + + private static final String NATHIST_PART_NAME = + CollectionObjectClient.SERVICE_NAME + PART_LABEL_SEPARATOR + NATURALHISTORY_EXT_EXTENSION_NAME; + + private static final String NAGPRA_PART_NAME = + CollectionObjectClient.SERVICE_NAME + PART_LABEL_SEPARATOR + NAGPRA_EXTENSION_NAME; + + private final ObjectFactory objectFactory; + private final Unmarshaller unmarshaller; + + public CollectionObjectMapper(Unmarshaller unmarshaller) { + this.unmarshaller = unmarshaller; + this.objectFactory = new ObjectFactory(); + } + + /** + * Map a {@link CSDocumentModelResponse} to a {@link AdvancedsearchListItem}. This looks at the response for each + * of the collectionspace_core, collectionobjects_common, collectionobjects_nagpra, and + * collectionobjects_naturalhistory_extension parts and pulls fields out of each based on the search specification. + * We don't differentiate between profiles here and instead return everything available for the ui. + *

+ * Note that this doesn't handle the {@link AdvancedsearchListItem#setRelated(Boolean)} as that requires access to + * the RelationResource. Maybe worth doing through an additional parameter. + * @param response The response from the CollectionObjectResource for a single object + * @param blobCsids The blobs associated with the object + * @return the advanced search list item + */ + public AdvancedsearchListItem asListItem(final CSDocumentModelResponse response, final List blobCsids) { + // todo: what makes sense here? + if (response == null || response.getPayload() == null) { + return objectFactory.createAdvancedsearchCommonListAdvancedsearchListItem(); + } + + final AdvancedsearchListItem item = objectFactory.createAdvancedsearchCommonListAdvancedsearchListItem(); + + final PoxPayloadOut outputPayload = response.getPayload(); + + final CollectionSpaceCore core = + unmarshall(CollectionSpaceCore.class, COLLECTIONSPACE_CORE_SCHEMA, outputPayload, unmarshaller); + + final CollectionobjectsCommon collectionObject = + unmarshall(CollectionobjectsCommon.class, COMMON_PART_NAME, outputPayload, unmarshaller); + + final CollectionObjectsNAGPRA objectsNAGPRA = + unmarshall(CollectionObjectsNAGPRA.class, NAGPRA_PART_NAME, outputPayload, unmarshaller); + + final CollectionobjectsNaturalhistory naturalHistory = + unmarshall(CollectionobjectsNaturalhistory.class, NATHIST_PART_NAME, outputPayload, unmarshaller); + + final String csid = response.getCsid(); + item.setCsid(csid); + if (core != null) { + item.setRefName(core.getRefName()); + item.setUri(core.getUri()); + item.setUpdatedAt(core.getUpdatedAt()); + } else { + logger.warn("advancedsearch: could not find collectionspace_core associated with csid {}", csid); + } + + if (collectionObject != null) { + item.setObjectNumber(collectionObject.getObjectNumber()); + item.setBriefDescription(BriefDescriptionListModel.briefDescriptionListToDisplayString( + collectionObject.getBriefDescriptions())); + item.setComputedCurrentLocation(collectionObject.getComputedCurrentLocation()); + + item.setTitle(TitleGroupListModel.titleGroupListToDisplayString(collectionObject.getTitleGroupList())); + item.setResponsibleDepartment( + ResponsibleDepartmentsListModel.responsibleDepartmentString(collectionObject)); + + item.setObjectName(ObjectNameListModel.objectName(collectionObject)); + item.setObjectNameControlled(ObjectNameListModel.objectNameControlled(collectionObject)); + + item.setContentConcepts(ContentConceptListModel.contentConceptList(collectionObject)); + + // Field collection items (place, site, date, collector, role) + item.setFieldCollectionPlace(FieldCollectionModel.fieldCollectionPlace(collectionObject)); + item.setFieldCollectionSite(FieldCollectionModel.fieldCollectionSite(collectionObject)); + item.setFieldCollectionDate(FieldCollectionModel.fieldCollectionDate(collectionObject)); + FieldCollectionModel.fieldCollector(collectionObject).ifPresent(collector -> { + item.setFieldCollector(collector); + item.setFieldCollectorRole("field collector"); // todo: how would we i18n this? + }); + + // Object Production Information (place, date, agent, agent role) + item.setObjectProductionDate(ObjectProductionModel.objectProductionDate(collectionObject)); + item.setObjectProductionPlace(ObjectProductionModel.objectProductionPlace(collectionObject)); + + AgentModel.agent(collectionObject).ifPresent(agent -> { + item.setAgent(agent.getAgent()); + item.setAgentRole(agent.getRole()); + }); + + item.setForm(TaxonModel.preservationForm(collectionObject)); + + // from media resource + if (blobCsids.size() > 0) { + item.setBlobCsid(blobCsids.get(0)); + } + } else { + logger.warn("advancedsearch: could not find CollectionobjectsCommon associated with csid {}", csid); + } + + if (naturalHistory != null) { + item.setTaxon(TaxonModel.taxon(naturalHistory)); + } + + if (objectsNAGPRA != null) { + item.setNagpraCategories(NAGPRACategoryModel.napgraCategories(objectsNAGPRA)); + } + + return item; + } + + public T unmarshall(Class clazz, String namespace, PoxPayloadOut out, Unmarshaller unmarshaller) { + PayloadOutputPart part = out.getPart(namespace); + if (part == null) { + return null; + } + + try { + return clazz.cast(unmarshaller.unmarshal((Document) part.getBody())); + } catch (JAXBException e) { + throw new RuntimeException(e); + } + } +} diff --git a/services/client/src/main/java/org/collectionspace/services/client/CollectionSpaceClient.java b/services/client/src/main/java/org/collectionspace/services/client/CollectionSpaceClient.java index 8324310e8..d57aee8ea 100644 --- a/services/client/src/main/java/org/collectionspace/services/client/CollectionSpaceClient.java +++ b/services/client/src/main/java/org/collectionspace/services/client/CollectionSpaceClient.java @@ -98,6 +98,7 @@ public interface CollectionSpaceClient - + + @@ -217,6 +218,7 @@ + @@ -815,6 +817,18 @@ + + + + + + + + + + + + diff --git a/services/collectionobject/jaxb/src/main/resources/collectionobjects_nagpra.xsd b/services/collectionobject/jaxb/src/main/resources/collectionobjects_nagpra.xsd new file mode 100644 index 000000000..bfc3b8d2a --- /dev/null +++ b/services/collectionobject/jaxb/src/main/resources/collectionobjects_nagpra.xsd @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/services/collectionobject/jaxb/src/main/resources/collectionobjects_naturalhistory.xsd b/services/collectionobject/jaxb/src/main/resources/collectionobjects_naturalhistory.xsd index 5be1b09c1..a501ca71e 100644 --- a/services/collectionobject/jaxb/src/main/resources/collectionobjects_naturalhistory.xsd +++ b/services/collectionobject/jaxb/src/main/resources/collectionobjects_naturalhistory.xsd @@ -2,7 +2,7 @@ - - - - - - - - + + + + + + + + + + @@ -54,94 +47,91 @@ - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + -- 2.47.3