From 4de539bec19219f7bcb01004bc9c92195ac7ee11 Mon Sep 17 00:00:00 2001 From: Michael Ritter Date: Thu, 11 Dec 2025 15:15:42 -0700 Subject: [PATCH] DRYD-1982: Add blobAltText to advanced search (#489) --- .../main/resources/advanced-search_common.xsd | 51 +++++++++--------- .../advancedsearch/AdvancedSearch.java | 24 +++++---- .../mapper/CollectionObjectMapper.java | 11 ++-- .../services/MediaJAXBSchema.java | 53 ++++++++++--------- 4 files changed, 74 insertions(+), 65 deletions(-) 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 2ba600497..50fb31c20 100644 --- a/services/advancedsearch/jaxb/src/main/resources/advanced-search_common.xsd +++ b/services/advancedsearch/jaxb/src/main/resources/advanced-search_common.xsd @@ -45,35 +45,36 @@ - - + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - + + + + + - - + + 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 932487746..b30045e08 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,7 +1,8 @@ package org.collectionspace.services.advancedsearch; import java.util.Collections; -import java.util.List; +import java.util.Map; +import java.util.function.Predicate; import java.util.stream.Collectors; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -90,9 +91,9 @@ public class AdvancedSearch for (CSDocumentModelResponse response : collectionObjectList.getResponseList()) { String csid = response.getCsid(); UriInfoWrapper wrappedUriInfo = new UriInfoWrapper(uriInfo); - List blobCsids = findBlobCsids(csid, wrappedUriInfo); + Map blobInfo = findBlobInfo(csid, wrappedUriInfo); - AdvancedsearchListItem listItem = responseMapper.asListItem(response, blobCsids); + AdvancedsearchListItem listItem = responseMapper.asListItem(response, blobInfo); if (listItem != null) { if (markRelated != null) { RelationsCommonList relationsList = relations.getRelationForSubject(markRelated, csid, uriInfo); @@ -118,7 +119,7 @@ public class AdvancedSearch * @param wrappedUriInfo The wrapped (mutable) UriInfo of the incoming query that ultimately triggered this call * @return A possibly-empty list of strings of the blob CSIDs associated with CSID */ - private List findBlobCsids(String csid, UriInfoWrapper wrappedUriInfo) { + private Map findBlobInfo(String csid, UriInfoWrapper wrappedUriInfo) { MultivaluedMap wrappedQueryParams = wrappedUriInfo.getQueryParameters(); wrappedQueryParams.clear(); wrappedQueryParams.add(IQueryManager.SEARCH_RELATED_TO_CSID_AS_SUBJECT, csid); @@ -127,16 +128,19 @@ public class AdvancedSearch wrappedQueryParams.add("sortBy", "media_common:title"); AbstractCommonList associatedMedia = mr.getList(wrappedUriInfo); if (associatedMedia == null || associatedMedia.getListItem() == null) { - return Collections.emptyList(); + return Collections.emptyMap(); } - return associatedMedia.getListItem().stream() + Predicate tagFilter = (element -> MediaJAXBSchema.blobCsid.equals(element.getTagName()) || + MediaJAXBSchema.altText.equals(element.getTagName())); + Predicate tagNotEmpty = (element -> element.getTextContent() != null && + !element.getTextContent().isEmpty()); + + return associatedMedia.getListItem().stream() .filter(item -> item != null && item.getAny() != null) .flatMap(li -> li.getAny().stream()) - .filter(element -> MediaJAXBSchema.blobCsid.equals(element.getTagName())) - .map(Element::getTextContent) - .filter(blobCsid -> blobCsid != null && !blobCsid.isEmpty()) - .collect(Collectors.toList()); + .filter(tagFilter.and(tagNotEmpty)) + .collect(Collectors.toMap(Element::getTagName, Element::getTextContent)); } @Override 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 index 3b83c2751..4dd3622e4 100644 --- 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 @@ -6,10 +6,11 @@ import static org.collectionspace.services.client.CollectionSpaceClient.NATURALH 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 java.util.Map; 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.ObjectFactory; import org.collectionspace.services.advancedsearch.model.AgentModel; @@ -71,7 +72,8 @@ public class CollectionObjectMapper { * @param blobCsids The blobs associated with the object * @return the advanced search list item */ - public AdvancedsearchListItem asListItem(final CSDocumentModelResponse response, final List blobCsids) { + public AdvancedsearchListItem asListItem(final CSDocumentModelResponse response, + final Map blobInfo) { // todo: what makes sense here? if (response == null || response.getPayload() == null) { return objectFactory.createAdvancedsearchCommonListAdvancedsearchListItem(); @@ -139,8 +141,9 @@ public class CollectionObjectMapper { item.setForm(TaxonModel.preservationForm(collectionObject)); // from media resource - if (blobCsids.size() > 0) { - item.setBlobCsid(blobCsids.get(0)); + if (!blobInfo.isEmpty()) { + item.setBlobCsid(blobInfo.get(MediaJAXBSchema.blobCsid)); + item.setBlobAltText(blobInfo.get(MediaJAXBSchema.altText)); } } else { logger.warn("advancedsearch: could not find CollectionobjectsCommon associated with csid {}", csid); diff --git a/services/media/jaxb/src/main/java/org/collectionspace/services/MediaJAXBSchema.java b/services/media/jaxb/src/main/java/org/collectionspace/services/MediaJAXBSchema.java index 0a41337ce..c54bf7c68 100644 --- a/services/media/jaxb/src/main/java/org/collectionspace/services/MediaJAXBSchema.java +++ b/services/media/jaxb/src/main/java/org/collectionspace/services/MediaJAXBSchema.java @@ -1,30 +1,31 @@ -/** - * - */ package org.collectionspace.services; +/** + * Field names for the Media Schema + */ public interface MediaJAXBSchema { - final static String contributor = "contributor"; - final static String copyrightStatement = "copyrightStatement"; - final static String coverage = "coverage"; - final static String creator = "creator"; - final static String dates = "dates"; - final static String dateCreated = "dateCreated"; - final static String dateModified = "dateModified"; - final static String description = "description"; - final static String dimensions = "dimensions"; - final static String filename = "filename"; - final static String format = "format"; - final static String identificationNumber = "identificationNumber"; - final static String languages = "languages"; - final static String location = "location"; - final static String publisher = "publisher"; - final static String relation = "relation"; - final static String rightsHolder = "rightsHolder"; - final static String source = "source"; - final static String subjects = "subjects"; - final static String title = "title"; - final static String type = "type"; - final static String uri = "uri"; - final static String blobCsid = "blobCsid"; + String altText = "altText"; + String contributor = "contributor"; + String copyrightStatement = "copyrightStatement"; + String coverage = "coverage"; + String creator = "creator"; + String dates = "dates"; + String dateCreated = "dateCreated"; + String dateModified = "dateModified"; + String description = "description"; + String dimensions = "dimensions"; + String filename = "filename"; + String format = "format"; + String identificationNumber = "identificationNumber"; + String languages = "languages"; + String location = "location"; + String publisher = "publisher"; + String relation = "relation"; + String rightsHolder = "rightsHolder"; + String source = "source"; + String subjects = "subjects"; + String title = "title"; + String type = "type"; + String uri = "uri"; + String blobCsid = "blobCsid"; } -- 2.47.3