From d32b55d5e3731797c727ab1519091aeefaa48752 Mon Sep 17 00:00:00 2001 From: William Welling Date: Mon, 7 Sep 2020 11:14:25 -0500 Subject: [PATCH 1/4] condition on content type for collection resource inclusion --- .../iiif/service/AbstractManifestService.java | 80 +++++++++++-------- .../DSpaceRdfCollectionManifestService.java | 6 +- .../FedoraPcdmCollectionManifestService.java | 10 ++- 3 files changed, 59 insertions(+), 37 deletions(-) diff --git a/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java b/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java index 9dd9716..2b82603 100644 --- a/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java +++ b/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java @@ -36,6 +36,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; +import org.springframework.util.MimeType; +import org.springframework.util.MimeTypeUtils; import org.springframework.web.client.RestTemplate; import de.digitalcollections.iiif.presentation.model.api.v2.Canvas; @@ -189,41 +191,13 @@ protected Optional generateImage(ManifestRequest request, RdfResource rdf } protected Optional generateImageResource(ManifestRequest request, RdfResource rdfResource) throws URISyntaxException { - String url = rdfResource.getResource().getURI(); - Optional optionalImageResource = Optional.empty(); - Optional optionalMimeType = getMimeType(url); - - boolean include = false; - - if (optionalMimeType.isPresent()) { - - String mimeType = optionalMimeType.get(); + String url = rdfResource.getResource().getURI(); - logger.debug("Mime type: " + mimeType); + Optional optionalMimeType = getMimeType(url); - if (mimeType.contains(SEMI_COLON)) { - mimeType = mimeType.split(SEMI_COLON)[0]; - } - - include = mimeType.startsWith(IMAGE) || mimeType.equals(APPLICATION_PDF); - if (include) { - String allowed = request.getAllowed(); - if (allowed.length() > 0) { - logger.debug("Allowed: " + allowed); - include = allowed.contains(mimeType); - } else { - String disallowed = request.getDisallowed(); - if (disallowed.length() > 0) { - logger.debug("Disallowed: " + disallowed); - include = !disallowed.contains(mimeType); - } - } - } - } else { - logger.warn("Unable to get mime type: " + url); - } + boolean include = optionalMimeType.isPresent() ? includeResource(request, optionalMimeType.get()) : false; if (include) { logger.info("Including: " + url); @@ -232,7 +206,6 @@ protected Optional generateImageResource(ManifestRequest request, Optional imageInfoNode = getImageInfo(infoUri.toString()); if (imageInfoNode.isPresent()) { - ImageResource imageResource = new ImageResourceImpl(getImageFullUrl(url)); imageResource.setFormat(optionalMimeType.get()); @@ -254,6 +227,49 @@ protected Optional generateImageResource(ManifestRequest request, return optionalImageResource; } + protected boolean includeResource(ManifestRequest request, RdfResource rdfResource) { + boolean include = false; + + String url = rdfResource.getResource().getURI(); + + Optional optionalMimeType = getMimeType(url); + + if (optionalMimeType.isPresent()) { + include = includeResource(request, optionalMimeType.get()); + } else { + logger.warn("Unable to get mime type: " + url); + } + + return include; + } + + private boolean includeResource(ManifestRequest request, String mimeType) { + boolean include = false; + + logger.debug("Mime type: " + mimeType); + + if (mimeType.contains(SEMI_COLON)) { + mimeType = mimeType.split(SEMI_COLON)[0]; + } + + include = mimeType.startsWith(IMAGE) || mimeType.equals(APPLICATION_PDF); + if (include) { + String allowed = request.getAllowed(); + if (allowed.length() > 0) { + logger.debug("Allowed: " + allowed); + include = allowed.contains(mimeType); + } else { + String disallowed = request.getDisallowed(); + if (disallowed.length() > 0) { + logger.debug("Disallowed: " + disallowed); + include = !disallowed.contains(mimeType); + } + } + } + + return include; + } + protected String fetchImageInfo(String url) throws NotFoundException { Optional imageInfo = Optional.ofNullable(restTemplate.getForObject(url, String.class)); if (imageInfo.isPresent()) { diff --git a/src/main/java/edu/tamu/iiif/service/dspace/rdf/DSpaceRdfCollectionManifestService.java b/src/main/java/edu/tamu/iiif/service/dspace/rdf/DSpaceRdfCollectionManifestService.java index ceefa4e..723fd1e 100644 --- a/src/main/java/edu/tamu/iiif/service/dspace/rdf/DSpaceRdfCollectionManifestService.java +++ b/src/main/java/edu/tamu/iiif/service/dspace/rdf/DSpaceRdfCollectionManifestService.java @@ -81,9 +81,11 @@ private List getResourceManifests(ManifestRequest request, Rd NodeIterator hasBitstreamIterator = rdfResource.getAllNodesOfPropertyWithId(DSPACE_HAS_BITSTREAM_PREDICATE); while (hasBitstreamIterator.hasNext()) { String hasBitstreamHandlePath = getHandlePath(hasBitstreamIterator.next().toString()); - String parameterizedHasBitstreamHandlePath = RdfModelUtility.getParameterizedId(hasBitstreamHandlePath, request); RdfResource hasBitstreamRdfResource = getRdfResourceByContextPath(hasBitstreamHandlePath); - manifests.add(new ManifestReferenceImpl(getDSpaceIiifPresentationUri(parameterizedHasBitstreamHandlePath), getLabel(hasBitstreamRdfResource))); + if (includeResource(request, hasBitstreamRdfResource)) { + String parameterizedHasBitstreamHandlePath = RdfModelUtility.getParameterizedId(hasBitstreamHandlePath, request); + manifests.add(new ManifestReferenceImpl(getDSpaceIiifPresentationUri(parameterizedHasBitstreamHandlePath), getLabel(hasBitstreamRdfResource))); + } } } else { NodeIterator hasItemIterator = rdfResource.getAllNodesOfPropertyWithId(DSPACE_HAS_ITEM_PREDICATE); diff --git a/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCollectionManifestService.java b/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCollectionManifestService.java index c96d3ca..b8ec526 100644 --- a/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCollectionManifestService.java +++ b/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCollectionManifestService.java @@ -106,15 +106,19 @@ private List getResourceManifests(ManifestRequest request, Rd while (nodes.hasNext()) { RDFNode node = nodes.next(); String parameterizedId = RdfModelUtility.getParameterizedId(node.toString(), request); - manifests.add(new ManifestReferenceImpl(getFedoraIiifPresentationUri(parameterizedId), getLabel(getRdfResourceByUrl(node.toString())))); + RdfResource hasMemberRdfResource = getRdfResourceByUrl(node.toString()); + manifests.add(new ManifestReferenceImpl(getFedoraIiifPresentationUri(parameterizedId), getLabel(hasMemberRdfResource))); } } if (manifests.isEmpty()) { ResIterator resources = rdfResource.listResourcesWithPropertyWithId(PCDM_HAS_FILE_PREDICATE); while (resources.hasNext()) { Resource resource = resources.next(); - String parameterizedId = RdfModelUtility.getParameterizedId(resource.getURI(), request); - manifests.add(new ManifestReferenceImpl(getFedoraIiifPresentationUri(parameterizedId), getLabel(getRdfResourceByUrl(resource.getURI())))); + RdfResource hasFileRdfResource = getRdfResourceByUrl(resource.getURI()); + if (includeResource(request, hasFileRdfResource)) { + String parameterizedId = RdfModelUtility.getParameterizedId(resource.getURI(), request); + manifests.add(new ManifestReferenceImpl(getFedoraIiifPresentationUri(parameterizedId), getLabel(hasFileRdfResource))); + } } } return manifests; From 1fa5270ea214bbc18649b70e5a56619a22f9b4c1 Mon Sep 17 00:00:00 2001 From: William Welling Date: Mon, 7 Sep 2020 11:14:48 -0500 Subject: [PATCH 2/4] increment patch version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2171cfe..5a81d9e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ edu.tamu ir-iiif-service - 0.5.1 + 0.5.2 war IR IIIF Service From 1fe0bc875ee060d366c241a3cb736c2fdacab9ab Mon Sep 17 00:00:00 2001 From: William Welling Date: Mon, 7 Sep 2020 11:32:16 -0500 Subject: [PATCH 3/4] lookup mimetype by resource url --- .../edu/tamu/iiif/service/AbstractManifestService.java | 4 +--- .../dspace/rdf/DSpaceRdfCollectionManifestService.java | 7 ++++--- .../fedora/pcdm/FedoraPcdmCollectionManifestService.java | 7 ++++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java b/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java index 2b82603..af4f3b9 100644 --- a/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java +++ b/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java @@ -227,11 +227,9 @@ protected Optional generateImageResource(ManifestRequest request, return optionalImageResource; } - protected boolean includeResource(ManifestRequest request, RdfResource rdfResource) { + protected boolean includeResourceWithUrl(ManifestRequest request, String url) { boolean include = false; - String url = rdfResource.getResource().getURI(); - Optional optionalMimeType = getMimeType(url); if (optionalMimeType.isPresent()) { diff --git a/src/main/java/edu/tamu/iiif/service/dspace/rdf/DSpaceRdfCollectionManifestService.java b/src/main/java/edu/tamu/iiif/service/dspace/rdf/DSpaceRdfCollectionManifestService.java index 723fd1e..0f05f04 100644 --- a/src/main/java/edu/tamu/iiif/service/dspace/rdf/DSpaceRdfCollectionManifestService.java +++ b/src/main/java/edu/tamu/iiif/service/dspace/rdf/DSpaceRdfCollectionManifestService.java @@ -80,9 +80,10 @@ private List getResourceManifests(ManifestRequest request, Rd if (isItem(rdfResource.getModel())) { NodeIterator hasBitstreamIterator = rdfResource.getAllNodesOfPropertyWithId(DSPACE_HAS_BITSTREAM_PREDICATE); while (hasBitstreamIterator.hasNext()) { - String hasBitstreamHandlePath = getHandlePath(hasBitstreamIterator.next().toString()); - RdfResource hasBitstreamRdfResource = getRdfResourceByContextPath(hasBitstreamHandlePath); - if (includeResource(request, hasBitstreamRdfResource)) { + String resourceUrl = hasBitstreamIterator.next().toString(); + if (includeResourceWithUrl(request, resourceUrl)) { + String hasBitstreamHandlePath = getHandlePath(resourceUrl); + RdfResource hasBitstreamRdfResource = getRdfResourceByContextPath(hasBitstreamHandlePath); String parameterizedHasBitstreamHandlePath = RdfModelUtility.getParameterizedId(hasBitstreamHandlePath, request); manifests.add(new ManifestReferenceImpl(getDSpaceIiifPresentationUri(parameterizedHasBitstreamHandlePath), getLabel(hasBitstreamRdfResource))); } diff --git a/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCollectionManifestService.java b/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCollectionManifestService.java index b8ec526..cf1c771 100644 --- a/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCollectionManifestService.java +++ b/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCollectionManifestService.java @@ -114,9 +114,10 @@ private List getResourceManifests(ManifestRequest request, Rd ResIterator resources = rdfResource.listResourcesWithPropertyWithId(PCDM_HAS_FILE_PREDICATE); while (resources.hasNext()) { Resource resource = resources.next(); - RdfResource hasFileRdfResource = getRdfResourceByUrl(resource.getURI()); - if (includeResource(request, hasFileRdfResource)) { - String parameterizedId = RdfModelUtility.getParameterizedId(resource.getURI(), request); + String resourceUrl = resource.getURI(); + if (includeResourceWithUrl(request, resourceUrl)) { + RdfResource hasFileRdfResource = getRdfResourceByUrl(resourceUrl); + String parameterizedId = RdfModelUtility.getParameterizedId(resourceUrl, request); manifests.add(new ManifestReferenceImpl(getFedoraIiifPresentationUri(parameterizedId), getLabel(hasFileRdfResource))); } } From e8ae3e547a91183bc20ee33c953f8993733a4b7f Mon Sep 17 00:00:00 2001 From: William Welling Date: Mon, 7 Sep 2020 11:43:32 -0500 Subject: [PATCH 4/4] catch rest client exception --- .../tamu/iiif/service/AbstractManifestService.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java b/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java index af4f3b9..0caa012 100644 --- a/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java +++ b/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java @@ -36,8 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; -import org.springframework.util.MimeType; -import org.springframework.util.MimeTypeUtils; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import de.digitalcollections.iiif.presentation.model.api.v2.Canvas; @@ -459,8 +458,12 @@ private Optional getImageInfo(String url) { } private Optional getMimeType(String url) { - HttpHeaders headers = restTemplate.headForHeaders(url); - return Optional.ofNullable(headers.getFirst(HttpHeaders.CONTENT_TYPE)); + try { + HttpHeaders headers = restTemplate.headForHeaders(url); + return Optional.ofNullable(headers.getFirst(HttpHeaders.CONTENT_TYPE)); + } catch (RestClientException e) { + return Optional.empty(); + } } private Metadata buildMetadata(String label, String value) {