From: Ray Lee Date: Thu, 30 Mar 2023 17:21:44 +0000 (-0400) Subject: DRYD-1221: Support media images in reports. (#323) X-Git-Url: https://git.aero2k.de/?a=commitdiff_plain;h=0f01469d733173a2218d4b530441dfe7b7f138b2;p=tmp%2Fjakarta-migration.git DRYD-1221: Support media images in reports. (#323) --- diff --git a/services/blob/service/src/main/java/org/collectionspace/services/blob/BlobResource.java b/services/blob/service/src/main/java/org/collectionspace/services/blob/BlobResource.java index 25051d647..578373c0e 100644 --- a/services/blob/service/src/main/java/org/collectionspace/services/blob/BlobResource.java +++ b/services/blob/service/src/main/java/org/collectionspace/services/blob/BlobResource.java @@ -121,7 +121,7 @@ public class BlobResource extends NuxeoBasedResource { return result; } - private InputStream getBlobContent(ServiceContext ctx, + public InputStream getBlobContent(ServiceContext ctx, String csid, String derivativeTerm, StringBuffer outMimeType) throws CSWebApplicationException { diff --git a/services/media/service/src/main/java/org/collectionspace/services/media/MediaResource.java b/services/media/service/src/main/java/org/collectionspace/services/media/MediaResource.java index bc8de5746..485de8dca 100644 --- a/services/media/service/src/main/java/org/collectionspace/services/media/MediaResource.java +++ b/services/media/service/src/main/java/org/collectionspace/services/media/MediaResource.java @@ -42,6 +42,8 @@ import org.jboss.resteasy.util.HttpResponseCodes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.InputStream; + import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; @@ -109,16 +111,24 @@ public class MediaResource extends NuxeoBasedResource { // } private String getBlobCsid(String mediaCsid) throws Exception { - String result = null; - - ServiceContext mediaContext = createServiceContext(); - BlobInput blobInput = BlobUtil.getBlobInput(mediaContext); - blobInput.setSchemaRequested(true); - get(mediaCsid, mediaContext); //this call sets the blobInput.blobCsid field for us - result = blobInput.getBlobCsid(); - ensureCSID(result, READ); - - return result; + return getBlobCsid(mediaCsid, true); + } + + private String getBlobCsid(String mediaCsid, boolean requireNotNull) throws Exception { + ServiceContext mediaContext = createServiceContext(); + + BlobInput blobInput = BlobUtil.getBlobInput(mediaContext); + blobInput.setSchemaRequested(true); + + get(mediaCsid, mediaContext); // This call sets the blobInput.blobCsid field for us + + String result = blobInput.getBlobCsid(); + + if (requireNotNull) { + ensureCSID(result, READ); + } + + return result; } @Override @@ -336,6 +346,27 @@ public class MediaResource extends NuxeoBasedResource { return result; } + public InputStream getDerivativeContent(String csid, String derivativeTerm) { + InputStream contentStream = null; + + try { + ensureCSID(csid, READ); + + String blobCsid = this.getBlobCsid(csid, false); + + if (blobCsid != null) { + ServiceContext blobContext = createServiceContext(BlobClient.SERVICE_NAME); + StringBuffer mimeType = new StringBuffer(); + + contentStream = getBlobResource().getBlobContent(blobContext, blobCsid, derivativeTerm, mimeType); + } + } catch (Exception e) { + throw bigReThrow(e, ServiceMessages.READ_FAILED, csid); + } + + return contentStream; + } + @GET @Path("{csid}/blob/derivatives/{derivativeTerm}") public byte[] getDerivative(@PathParam("csid") String csid, diff --git a/services/report/service/pom.xml b/services/report/service/pom.xml index a6507bab9..d8d6ea198 100644 --- a/services/report/service/pom.xml +++ b/services/report/service/pom.xml @@ -24,7 +24,7 @@ org.collectionspace.services.account.service ${project.version} provided - + org.collectionspace.services org.collectionspace.services.config @@ -55,6 +55,11 @@ org.collectionspace.services.collectionobject.jaxb ${project.version} + + org.collectionspace.services + org.collectionspace.services.media.service + ${project.version} + junit diff --git a/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/DefaultReportScriptlet.java b/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceReportScriptlet.java similarity index 93% rename from services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/DefaultReportScriptlet.java rename to services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceReportScriptlet.java index 76c618817..420daf730 100644 --- a/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/DefaultReportScriptlet.java +++ b/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceReportScriptlet.java @@ -1,4 +1,4 @@ -package org.collectionspace.services.report.nuxeo; +package org.collectionspace.services.report.jasperreports; import java.util.HashSet; import java.util.Set; @@ -18,8 +18,8 @@ import org.slf4j.LoggerFactory; * fields to de-urn are supplied in the deurnfields parameter, as a comma-delimited list. If "*" is * specified, all string-typed fields are de-urned. */ -public class DefaultReportScriptlet extends JRDefaultScriptlet { - private final Logger logger = LoggerFactory.getLogger(DefaultReportScriptlet.class); +public class CSpaceReportScriptlet extends JRDefaultScriptlet { + private final Logger logger = LoggerFactory.getLogger(CSpaceReportScriptlet.class); private static String DEURN_FIELDS_PARAM = "deurnfields"; diff --git a/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceRepositoryExtensionsRegistryFactory.java b/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceRepositoryExtensionsRegistryFactory.java new file mode 100644 index 000000000..39f3c3698 --- /dev/null +++ b/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceRepositoryExtensionsRegistryFactory.java @@ -0,0 +1,30 @@ +package org.collectionspace.services.report.jasperreports; + +import java.util.Collections; +import java.util.List; + +import net.sf.jasperreports.engine.JRPropertiesMap; +import net.sf.jasperreports.extensions.ExtensionsRegistry; +import net.sf.jasperreports.extensions.ExtensionsRegistryFactory; +import net.sf.jasperreports.repo.RepositoryService; + +public class CSpaceRepositoryExtensionsRegistryFactory implements ExtensionsRegistryFactory { + + private static final RepositoryService repositoryService = new CSpaceRepositoryService(); + + private static final ExtensionsRegistry extensionsRegistry = new ExtensionsRegistry() { + @Override + public List getExtensions(Class extensionType) { + if (RepositoryService.class.equals(extensionType)) { + return (List) Collections.singletonList(repositoryService); + } + + return null; + } + }; + + @Override + public ExtensionsRegistry createRegistry(String registryId, JRPropertiesMap properties) { + return extensionsRegistry; + } +} diff --git a/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceRepositoryService.java b/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceRepositoryService.java new file mode 100644 index 000000000..bb29da982 --- /dev/null +++ b/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceRepositoryService.java @@ -0,0 +1,83 @@ +package org.collectionspace.services.report.jasperreports; + +import java.io.InputStream; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang.StringUtils; +import org.collectionspace.services.client.MediaClient; +import org.collectionspace.services.common.ResourceMap; +import org.collectionspace.services.media.MediaResource; +import org.jboss.resteasy.spi.ResteasyProviderFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.sf.jasperreports.repo.InputStreamResource; +import net.sf.jasperreports.repo.RepositoryService; +import net.sf.jasperreports.repo.Resource; + +public class CSpaceRepositoryService implements RepositoryService { + final static Logger logger = LoggerFactory.getLogger(CSpaceRepositoryService.class); + + public static final String CSPACE_PROTOCOL = "cspace://"; + public static final Pattern MEDIA_CONTENT_PATH_PATTERN = Pattern.compile("^/?media/(.*?)/blob/derivatives/(.*?)/content$"); + + @Override + public Resource getResource(String uri) { + return getResource(uri, InputStreamResource.class); + } + + @Override + public K getResource(String uri, Class resourceType) { + if ( + InputStreamResource.class.equals(resourceType) + && uri.startsWith(CSPACE_PROTOCOL)) + { + return ((K) getCSpaceResource(uri.substring(CSPACE_PROTOCOL.length()))); + } + + return null; + } + + @Override + public void saveResource(String uri, Resource resource) { + // Not implemented + } + + private InputStreamResource getCSpaceResource(String resourcePath) { + Matcher matcher = MEDIA_CONTENT_PATH_PATTERN.matcher(resourcePath); + + if (matcher.matches()) { + String mediaCsid = matcher.group(1); + String derivative = matcher.group(2); + + return getMediaContentResource(mediaCsid, derivative); + } + + return null; + } + + private InputStreamResource getMediaContentResource(String mediaCsid, String derivative) { + if (StringUtils.isNotEmpty(mediaCsid) && StringUtils.isNotEmpty(derivative)) { + ResourceMap resourceMap = ResteasyProviderFactory.getContextData(ResourceMap.class); + MediaResource mediaResource = (MediaResource) resourceMap.get(MediaClient.SERVICE_NAME); + + InputStream contentStream = null; + + try { + contentStream = mediaResource.getDerivativeContent(mediaCsid, derivative); + } catch (Exception e) { + logger.warn("Error getting {} derivative for media csid {}: {}", derivative, mediaCsid, e.getMessage()); + } + + if (contentStream != null) { + InputStreamResource inputStreamResource = new InputStreamResource(); + inputStreamResource.setInputStream(contentStream); + + return inputStreamResource; + } + } + + return null; + } +} diff --git a/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportDocumentModelHandler.java b/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportDocumentModelHandler.java index 3d88c372a..867d8d90d 100644 --- a/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportDocumentModelHandler.java +++ b/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportDocumentModelHandler.java @@ -380,7 +380,7 @@ public class ReportDocumentModelHandler extends NuxeoDocumentModelHandler