return result;
}
- private InputStream getBlobContent(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx,
+ public InputStream getBlobContent(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx,
String csid,
String derivativeTerm,
StringBuffer outMimeType) throws CSWebApplicationException {
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;
// }
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
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,
<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>
-package org.collectionspace.services.report.nuxeo;
+package org.collectionspace.services.report.jasperreports;
import java.util.HashSet;
import java.util.Set;
* 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";
--- /dev/null
+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;
+ }
+}
--- /dev/null
+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;
+ }
+}
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);
}
--- /dev/null
+net.sf.jasperreports.extension.registry.factory.cspace.repository=org.collectionspace.services.report.jasperreports.CSpaceRepositoryExtensionsRegistryFactory