]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
DRYD-1221: Support media images in reports. (#323)
authorRay Lee <ray.lee@lyrasis.org>
Thu, 30 Mar 2023 17:21:44 +0000 (13:21 -0400)
committerGitHub <noreply@github.com>
Thu, 30 Mar 2023 17:21:44 +0000 (13:21 -0400)
services/blob/service/src/main/java/org/collectionspace/services/blob/BlobResource.java
services/media/service/src/main/java/org/collectionspace/services/media/MediaResource.java
services/report/service/pom.xml
services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceReportScriptlet.java [moved from services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/DefaultReportScriptlet.java with 93% similarity]
services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceRepositoryExtensionsRegistryFactory.java [new file with mode: 0644]
services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceRepositoryService.java [new file with mode: 0644]
services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportDocumentModelHandler.java
services/report/service/src/main/resources/jasperreports_extension.properties [new file with mode: 0644]

index 25051d64771ee224d1110271c610294398a9aa00..578373c0ee8de313fee3e31ef1ded9db960560ec 100644 (file)
@@ -121,7 +121,7 @@ public class BlobResource extends NuxeoBasedResource {
        return result;
     }
     
-    private InputStream getBlobContent(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx,
+    public InputStream getBlobContent(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx,
                String csid, 
                String derivativeTerm, 
                StringBuffer outMimeType) throws CSWebApplicationException {
index bc8de5746bbc534a398c879c15aa11c9d362c86d..485de8dca1f21f8c70403bf4520fed64a0b05a52 100644 (file)
@@ -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<PoxPayloadIn, PoxPayloadOut> 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<PoxPayloadIn, PoxPayloadOut> 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<PoxPayloadIn, PoxPayloadOut> 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,
index a6507bab9f255d9de27c31f1902391b46cbe41b3..d8d6ea198ecc9660bb4b92315d58f6aa36e3954a 100644 (file)
@@ -24,7 +24,7 @@
             <artifactId>org.collectionspace.services.account.service</artifactId>
             <version>${project.version}</version>
             <scope>provided</scope>
-        </dependency>            
+        </dependency>
         <dependency>
             <groupId>org.collectionspace.services</groupId>
             <artifactId>org.collectionspace.services.config</artifactId>
             <artifactId>org.collectionspace.services.collectionobject.jaxb</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.collectionspace.services</groupId>
+            <artifactId>org.collectionspace.services.media.service</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <!-- External dependencies -->
         <dependency>
             <groupId>junit</groupId>
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 76c618817f68e197bd4deb4fb67d3b6551a5a881..420daf730e81b3c68547593d4a4f62be94e956d4 100644 (file)
@@ -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 (file)
index 0000000..39f3c36
--- /dev/null
@@ -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 <T> List<T> getExtensions(Class<T> extensionType) {
+                       if (RepositoryService.class.equals(extensionType)) {
+                               return (List<T>) 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 (file)
index 0000000..bb29da9
--- /dev/null
@@ -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 extends Resource> K getResource(String uri, Class<K> 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;
+       }
+}
index 3d88c372ab3c2878e43704555974912835a4ad37..867d8d90d80c41f08632ce6da805b3c86f676e3c 100644 (file)
@@ -380,7 +380,7 @@ public class ReportDocumentModelHandler extends NuxeoDocumentModelHandler<Report
 
                                JasperDesign design = JRXmlLoader.load(sourceFilePath);
 
-                               design.setScriptletClass("org.collectionspace.services.report.nuxeo.DefaultReportScriptlet");
+                               design.setScriptletClass("org.collectionspace.services.report.jasperreports.CSpaceReportScriptlet");
 
                                JasperCompileManager.compileReportToFile(design, compiledFilePath);
                        }
diff --git a/services/report/service/src/main/resources/jasperreports_extension.properties b/services/report/service/src/main/resources/jasperreports_extension.properties
new file mode 100644 (file)
index 0000000..e5fe479
--- /dev/null
@@ -0,0 +1 @@
+net.sf.jasperreports.extension.registry.factory.cspace.repository=org.collectionspace.services.report.jasperreports.CSpaceRepositoryExtensionsRegistryFactory