diff --git a/pom.xml b/pom.xml index 65ba25c..b01df62 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ edu.tamu ir-iiif-service - 0.6.0-RC2 + 0.6.0-RC3 IR IIIF Service diff --git a/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java b/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java index d74663a..6728c18 100644 --- a/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java +++ b/src/main/java/edu/tamu/iiif/service/AbstractManifestService.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; import javax.annotation.PostConstruct; @@ -43,10 +44,12 @@ import de.digitalcollections.iiif.presentation.model.api.v2.Image; import de.digitalcollections.iiif.presentation.model.api.v2.ImageResource; import de.digitalcollections.iiif.presentation.model.api.v2.Metadata; +import de.digitalcollections.iiif.presentation.model.api.v2.PropertyValue; import de.digitalcollections.iiif.presentation.model.api.v2.Sequence; import de.digitalcollections.iiif.presentation.model.api.v2.Service; import de.digitalcollections.iiif.presentation.model.api.v2.Thumbnail; import de.digitalcollections.iiif.presentation.model.impl.jackson.v2.IiifPresentationApiObjectMapper; +import de.digitalcollections.iiif.presentation.model.impl.v2.CanvasImpl; import de.digitalcollections.iiif.presentation.model.impl.v2.ImageImpl; import de.digitalcollections.iiif.presentation.model.impl.v2.ImageResourceImpl; import de.digitalcollections.iiif.presentation.model.impl.v2.MetadataImpl; @@ -332,6 +335,32 @@ protected Optional getThumbnail(List sequences) throws URIS return optionalThumbnail; } + protected Canvas getCanvasPage(Canvas canvas, int page) { + String id = canvas.getId().toString() + "?page=" + page; + PropertyValue label = new PropertyValueSimpleImpl(canvas.getLabel().getFirstValue() + "?page=" + page); + Canvas canvasPage = new CanvasImpl(id, label, canvas.getHeight(), canvas.getWidth()); + canvasPage.setImages(canvas.getImages().stream().map(i -> { + Image image = new ImageImpl(i.getId().toString().replace("/info.json", ";" + page + "/info.json")); + ImageResource ir = i.getResource(); + ImageResource imageResource = new ImageResourceImpl(ir.getId().toString().replace("/full/full/0/default.jpg", ";" + page + "/full/full/0/default.jpg")); + imageResource.setFormat(ir.getFormat()); + imageResource.setHeight(ir.getHeight()); + imageResource.setWidth(ir.getWidth()); + List services = ir.getServices().stream().map(s -> { + Service service = new ServiceImpl(s.getId().toString() + ";" + page); + service.setLabel(s.getLabel()); + service.setContext(s.getContext()); + service.setProfile(s.getProfile()); + return service; + }).collect(Collectors.toList()); + imageResource.setServices(services); + image.setResource(imageResource); + image.setOn(i.getOn()); + return image; + }).collect(Collectors.toList())); + return canvasPage; + } + private String getResourceId(String url) throws URISyntaxException { String id; try { diff --git a/src/main/java/edu/tamu/iiif/service/dspace/rdf/AbstractDSpaceRdfManifestService.java b/src/main/java/edu/tamu/iiif/service/dspace/rdf/AbstractDSpaceRdfManifestService.java index 96a28bb..42ecb50 100644 --- a/src/main/java/edu/tamu/iiif/service/dspace/rdf/AbstractDSpaceRdfManifestService.java +++ b/src/main/java/edu/tamu/iiif/service/dspace/rdf/AbstractDSpaceRdfManifestService.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.NodeIterator; @@ -30,17 +29,11 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import de.digitalcollections.iiif.presentation.model.api.v2.Canvas; -import de.digitalcollections.iiif.presentation.model.api.v2.Image; import de.digitalcollections.iiif.presentation.model.api.v2.ImageResource; -import de.digitalcollections.iiif.presentation.model.api.v2.PropertyValue; import de.digitalcollections.iiif.presentation.model.api.v2.Sequence; -import de.digitalcollections.iiif.presentation.model.api.v2.Service; import de.digitalcollections.iiif.presentation.model.impl.v2.CanvasImpl; -import de.digitalcollections.iiif.presentation.model.impl.v2.ImageImpl; -import de.digitalcollections.iiif.presentation.model.impl.v2.ImageResourceImpl; import de.digitalcollections.iiif.presentation.model.impl.v2.PropertyValueSimpleImpl; import de.digitalcollections.iiif.presentation.model.impl.v2.SequenceImpl; -import de.digitalcollections.iiif.presentation.model.impl.v2.ServiceImpl; import edu.tamu.iiif.config.model.AbstractIiifConfig; import edu.tamu.iiif.config.model.DSpaceRdfIiifConfig; import edu.tamu.iiif.controller.ManifestRequest; @@ -207,32 +200,6 @@ private List getCanvases(ManifestRequest request, RdfResource rdfResourc return canvases; } - private Canvas getCanvasPage(Canvas canvas, int page) { - String id = canvas.getId().toString() + "?page=" + page; - PropertyValue label = new PropertyValueSimpleImpl(canvas.getLabel().getFirstValue() + "?page=" + page); - Canvas canvasPage = new CanvasImpl(id, label, canvas.getHeight(), canvas.getWidth()); - canvasPage.setImages(canvas.getImages().stream().map(i -> { - Image image = new ImageImpl(i.getId().toString().replace("/info.json", ";" + page + "/info.json")); - ImageResource ir = i.getResource(); - ImageResource imageResource = new ImageResourceImpl(ir.getId().toString().replace("/full/full/0/default.jpg", ";" + page + "/full/full/0/default.jpg")); - imageResource.setFormat(ir.getFormat()); - imageResource.setHeight(ir.getHeight()); - imageResource.setWidth(ir.getWidth()); - List services = ir.getServices().stream().map(s -> { - Service service = new ServiceImpl(s.getId().toString() + ";" + page); - service.setLabel(s.getLabel()); - service.setContext(s.getContext()); - service.setProfile(s.getProfile()); - return service; - }).collect(Collectors.toList()); - imageResource.setServices(services); - image.setResource(imageResource); - image.setOn(i.getOn()); - return image; - }).collect(Collectors.toList())); - return canvasPage; - } - private RdfCanvas getDSpaceRdfCanvas(ManifestRequest request, RdfResource rdfResource, int page) throws URISyntaxException, URISyntaxException { String uri = rdfResource.getResource().getURI(); diff --git a/src/main/java/edu/tamu/iiif/service/fedora/pcdm/AbstractFedoraPcdmManifestService.java b/src/main/java/edu/tamu/iiif/service/fedora/pcdm/AbstractFedoraPcdmManifestService.java index b4f446a..0820d8c 100644 --- a/src/main/java/edu/tamu/iiif/service/fedora/pcdm/AbstractFedoraPcdmManifestService.java +++ b/src/main/java/edu/tamu/iiif/service/fedora/pcdm/AbstractFedoraPcdmManifestService.java @@ -28,8 +28,6 @@ import java.util.List; import java.util.Optional; -import com.fasterxml.jackson.core.JsonProcessingException; - import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.NodeIterator; import org.apache.jena.rdf.model.RDFNode; @@ -38,6 +36,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import com.fasterxml.jackson.core.JsonProcessingException; + import de.digitalcollections.iiif.presentation.model.api.v2.Canvas; import de.digitalcollections.iiif.presentation.model.api.v2.ImageResource; import de.digitalcollections.iiif.presentation.model.api.v2.Metadata; @@ -49,6 +49,7 @@ import edu.tamu.iiif.config.model.FedoraPcdmIiifConfig; import edu.tamu.iiif.controller.ManifestRequest; import edu.tamu.iiif.exception.NotFoundException; +import edu.tamu.iiif.model.CanvasWithInfo; import edu.tamu.iiif.model.OptionalImageWithInfo; import edu.tamu.iiif.model.rdf.RdfCanvas; import edu.tamu.iiif.model.rdf.RdfOrderedResource; @@ -70,23 +71,21 @@ protected Sequence generateSequence(ManifestRequest request, RdfResource rdfReso return sequence; } - protected Canvas generateCanvas(ManifestRequest request, RdfResource rdfResource, int page) throws IOException, URISyntaxException { + protected CanvasWithInfo generateCanvas(ManifestRequest request, RdfResource rdfResource, int page) throws IOException, URISyntaxException { String parameterizedId = RdfModelUtility.getParameterizedId(rdfResource.getResource().getURI(), request); PropertyValueSimpleImpl label = getLabel(rdfResource); - RdfCanvas rdfCanvas = getFedoraRdfCanvas(request, rdfResource, page); - Canvas canvas = new CanvasImpl(getFedoraIiifCanvasUri(parameterizedId), label, rdfCanvas.getHeight(), rdfCanvas.getWidth()); - canvas.setImages(rdfCanvas.getImages()); - List metadata = getMetadata(rdfResource); - if (!metadata.isEmpty()) { canvas.setMetadata(metadata); } + if (rdfCanvas.getImagesInfo().isEmpty()) { + return CanvasWithInfo.of(canvas, Optional.empty()); + } - return canvas; + return CanvasWithInfo.of(canvas, rdfCanvas.getImagesInfo().get(0)); } protected URI getFedoraIiifCollectionUri(String url) throws URISyntaxException { @@ -190,14 +189,12 @@ private URI getFedoraIiifUri(String url, String type) throws URISyntaxException private List getCanvases(ManifestRequest request, RdfResource rdfResource) throws IOException, URISyntaxException { List canvases = new ArrayList(); - Optional firstId = findObject(rdfResource.getModel(), IANA_FIRST_PREDICATE); Optional lastId = findObject(rdfResource.getModel(), IANA_LAST_PREDICATE); if (firstId.isPresent() && lastId.isPresent()) { Resource firstResource = rdfResource.getModel().getResource(firstId.get()); generateOrderedCanvases(request, new RdfOrderedResource(rdfResource.getModel(), firstResource, firstId.get(), lastId.get()), canvases); } - if (canvases.isEmpty()) { NodeIterator nodes = rdfResource.getNodesOfPropertyWithId(PCDM_HAS_MEMBER_PREDICATE); while (nodes.hasNext()) { @@ -208,18 +205,22 @@ private List getCanvases(ManifestRequest request, RdfResource rdfResourc RdfResource fileRdfResource = new RdfResource(fileModel, node.toString()); if (fileRdfResource.getResourceById(PCDM_HAS_FILE_PREDICATE) != null) { - Canvas canvas = generateCanvas(request, fileRdfResource, 0); - if (canvas.getImages().size() > 0) { - canvases.add(canvas); + CanvasWithInfo canvas = generateCanvas(request, fileRdfResource, 0); + if (canvas.getCanvas().getImages().size() > 0) { + canvases.add(canvas.getCanvas()); } } } } - if (canvases.isEmpty() && rdfResource.getResourceById(PCDM_HAS_FILE_PREDICATE) != null) { - Canvas canvas = generateCanvas(request, rdfResource, 0); - if (canvas.getImages().size() > 0) { - canvases.add(canvas); + CanvasWithInfo canvasWithInfo = generateCanvas(request, rdfResource, 0); + if (canvasWithInfo.getCanvasInfo().isPresent() && canvasWithInfo.getCanvasInfo().get().has("page_count")) { + int pageCount = canvasWithInfo.getCanvasInfo().get().at("/page_count").asInt(); + for (int page = 1; page <= pageCount; ++page) { + canvases.add(getCanvasPage(canvasWithInfo.getCanvas(), page)); + } + } else if (canvasWithInfo.getCanvas().getImages().size() > 0) { + canvases.add(canvasWithInfo.getCanvas()); } } @@ -240,9 +241,9 @@ private void generateOrderedCanvases(ManifestRequest request, RdfOrderedResource Model orderedModel = getFedoraRdfModel(id.get()); - Canvas canvas = generateCanvas(request, new RdfResource(orderedModel, id.get()), 0); - if (canvas.getImages().size() > 0) { - canvases.add(canvas); + CanvasWithInfo canvasWithInfo = generateCanvas(request, new RdfResource(orderedModel, id.get()), 0); + if (canvasWithInfo.getCanvas().getImages().size() > 0) { + canvases.add(canvasWithInfo.getCanvas()); } Optional nextId = findObject(model, IANA_NEXT_PREDICATE); diff --git a/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCanvasManifestService.java b/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCanvasManifestService.java index d75d993..48d14cc 100644 --- a/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCanvasManifestService.java +++ b/src/main/java/edu/tamu/iiif/service/fedora/pcdm/FedoraPcdmCanvasManifestService.java @@ -7,8 +7,8 @@ import org.springframework.stereotype.Service; -import de.digitalcollections.iiif.presentation.model.api.v2.Canvas; import edu.tamu.iiif.controller.ManifestRequest; +import edu.tamu.iiif.model.CanvasWithInfo; import edu.tamu.iiif.model.ManifestType; import edu.tamu.iiif.model.rdf.RdfResource; @@ -18,8 +18,8 @@ public class FedoraPcdmCanvasManifestService extends AbstractFedoraPcdmManifestS public String generateManifest(ManifestRequest request) throws IOException, URISyntaxException { String context = request.getContext(); RdfResource rdfResource = getRdfResourceByContextPath(context); - Canvas canvas = generateCanvas(request, rdfResource, 0); - return mapper.writeValueAsString(canvas); + CanvasWithInfo canvasWithInfo = generateCanvas(request, rdfResource, 0); + return mapper.writeValueAsString(canvasWithInfo.getCanvas()); } @Override