Skip to content

Commit

Permalink
Merge pull request #85 from TAMULib/manifest-improvements
Browse files Browse the repository at this point in the history
afford metadata exclusion, multiple values for dedicated properties
  • Loading branch information
wwelling committed May 21, 2020
2 parents 13efc1b + 57fb0c4 commit a7f8472
Show file tree
Hide file tree
Showing 28 changed files with 511 additions and 411 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<jena-libs.version>3.2.0</jena-libs.version>
<iiif-presentation.version>3.2.5</iiif-presentation.version>
<iiif-presentation.version>3.2.6</iiif-presentation.version>
<!-- must be valid uri with scheme file or classpath -->
<!-- e.g. file:/var/ir-iiif-service/config, classpath:/config -->
<config.uri>classpath:/config/</config.uri>
Expand Down
40 changes: 25 additions & 15 deletions src/main/java/edu/tamu/iiif/config/model/AbstractIiifConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,18 @@

public abstract class AbstractIiifConfig {

private List<String> labelPrecedence = new ArrayList<String>();
private List<String> labelPredicates = new ArrayList<String>();

private List<String> descriptionPrecedence = new ArrayList<String>();
private List<String> descriptionPredicates = new ArrayList<String>();

private List<String> attributionPrecedence = new ArrayList<String>();
private List<String> attributionPredicates = new ArrayList<String>();

private List<String> licensePrecedence = new ArrayList<String>();

private List<String> metadataPrefixes = new ArrayList<String>();

private List<String> metadataExclusion = new ArrayList<String>();

private String url;

private String identifier;
Expand All @@ -25,28 +27,28 @@ public AbstractIiifConfig() {
contextAsMetadata = true;
}

public List<String> getLabelPrecedence() {
return labelPrecedence;
public List<String> getLabelPredicates() {
return labelPredicates;
}

public void setLabelPrecedence(List<String> labelPrecedence) {
this.labelPrecedence = labelPrecedence;
public void setLabelPredicates(List<String> labelPredicates) {
this.labelPredicates = labelPredicates;
}

public List<String> getDescriptionPrecedence() {
return descriptionPrecedence;
public List<String> getDescriptionPredicates() {
return descriptionPredicates;
}

public void setDescriptionPrecedence(List<String> descriptionPrecedence) {
this.descriptionPrecedence = descriptionPrecedence;
public void setDescriptionPredicates(List<String> descriptionPredicates) {
this.descriptionPredicates = descriptionPredicates;
}

public List<String> getAttributionPrecedence() {
return attributionPrecedence;
public List<String> getAttributionPredicates() {
return attributionPredicates;
}

public void setAttributionPrecedence(List<String> attributionPrecedence) {
this.attributionPrecedence = attributionPrecedence;
public void setAttributionPredicates(List<String> attributionPredicates) {
this.attributionPredicates = attributionPredicates;
}

public List<String> getLicensePrecedence() {
Expand All @@ -65,6 +67,14 @@ public void setMetadataPrefixes(List<String> metadataPrefixes) {
this.metadataPrefixes = metadataPrefixes;
}

public List<String> getMetadataExclusion() {
return metadataExclusion;
}

public void setMetadataExclusion(List<String> metadataExclusion) {
this.metadataExclusion = metadataExclusion;
}

public String getUrl() {
return url;
}
Expand Down
46 changes: 17 additions & 29 deletions src/main/java/edu/tamu/iiif/service/AbstractManifestService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import static edu.tamu.iiif.constants.Constants.IIIF_IMAGE_API_CONTEXT;
import static edu.tamu.iiif.constants.Constants.IIIF_IMAGE_API_LEVEL_ZERO_PROFILE;
import static edu.tamu.iiif.utility.RdfModelUtility.createRdfModel;
import static edu.tamu.iiif.utility.RdfModelUtility.getObject;
import static edu.tamu.iiif.utility.RdfModelUtility.getObjects;
import static edu.tamu.iiif.utility.StringUtility.encode;
import static edu.tamu.iiif.utility.StringUtility.encodeSpaces;
import static edu.tamu.iiif.utility.StringUtility.joinPath;
Expand Down Expand Up @@ -317,46 +317,31 @@ private String getResourceId(String url) throws URISyntaxException {
}

protected PropertyValueSimpleImpl getLabel(RdfResource rdfResource) {
Optional<String> title = Optional.empty();
for (String labelPredicate : getConfig().getLabelPrecedence()) {
title = getObject(rdfResource, labelPredicate);
if (title.isPresent()) {
return new PropertyValueSimpleImpl(title.get());
}
List<String> labels = getObjects(rdfResource, getConfig().getLabelPredicates());
if (labels.isEmpty()) {
String id = rdfResource.getResource().getURI();
return new PropertyValueSimpleImpl(getRepositoryContextIdentifier(id));
}
String id = rdfResource.getResource().getURI();
return new PropertyValueSimpleImpl(getRepositoryContextIdentifier(id));
return new PropertyValueSimpleImpl(labels);
}

protected Optional<PropertyValueSimpleImpl> getDescription(RdfResource rdfResource) {
Optional<String> description = Optional.empty();
for (String descriptionPredicate : getConfig().getDescriptionPrecedence()) {
description = getObject(rdfResource, descriptionPredicate);
if (description.isPresent()) {
return Optional.of(new PropertyValueSimpleImpl(description.get()));
}
}
return Optional.empty();
List<String> descriptions = getObjects(rdfResource, getConfig().getDescriptionPredicates());
return descriptions.isEmpty() ? Optional.empty() : Optional.of(new PropertyValueSimpleImpl(descriptions));
}

protected Optional<PropertyValueSimpleImpl> getAttribution(RdfResource rdfResource) {
Optional<String> attribution = Optional.empty();
for (String attributionPredicate : getConfig().getAttributionPrecedence()) {
attribution = getObject(rdfResource, attributionPredicate);
if (attribution.isPresent()) {
return Optional.of(new PropertyValueSimpleImpl(attribution.get()));
}
}
return Optional.empty();
List<String> attributions = getObjects(rdfResource, getConfig().getAttributionPredicates());
return attributions.isEmpty() ? Optional.empty() : Optional.of(new PropertyValueSimpleImpl(attributions));
}

protected Optional<String> getLicense(RdfResource rdfResource) {
Optional<String> license = Optional.empty();
for (String licensePredicate : getConfig().getLicensePrecedence()) {
license = getObject(rdfResource, licensePredicate);
if (license.isPresent()) {
return Optional.of(license.get());
List<String> licenses = getObjects(rdfResource, licensePredicate);
if (licenses.isEmpty()) {
continue;
}
return Optional.of(licenses.get(0));
}
return Optional.empty();
}
Expand Down Expand Up @@ -408,6 +393,9 @@ private Collection<Metadata> getMetadata(RdfResource rdfResource, String prefix)
while (statements.hasNext()) {
Statement statement = statements.nextStatement();
Property predicate = statement.getPredicate();
if (getConfig().getMetadataExclusion().contains(predicate.toString())) {
continue;
}
String resourceUrl = rdfResource.getResource().getURI();
String statementUrl = statement.getSubject().getURI();
boolean match = getMatcherHandle(resourceUrl).equals(getMatcherHandle(statementUrl));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import static edu.tamu.iiif.constants.Constants.DSPACE_RDF_CONDITION;
import static edu.tamu.iiif.constants.Constants.PRESENTATION_IDENTIFIER;
import static edu.tamu.iiif.constants.Constants.SEQUENCE_IDENTIFIER;
import static edu.tamu.iiif.utility.RdfModelUtility.getObject;
import static edu.tamu.iiif.utility.RdfModelUtility.hasObject;
import static edu.tamu.iiif.utility.StringUtility.encodeSpaces;
import static edu.tamu.iiif.utility.StringUtility.joinPath;

Expand Down Expand Up @@ -70,19 +70,19 @@ protected Canvas generateCanvas(ManifestRequest request, RdfResource rdfResource
}

protected boolean isTopLevelCommunity(Model model) {
return getObject(model, DSPACE_IS_PART_OF_REPOSITORY_PREDICATE).isPresent();
return hasObject(model, DSPACE_IS_PART_OF_REPOSITORY_PREDICATE);
}

protected boolean isSubcommunity(Model model) {
return getObject(model, DSPACE_IS_SUB_COMMUNITY_OF_PREDICATE).isPresent();
return hasObject(model, DSPACE_IS_SUB_COMMUNITY_OF_PREDICATE);
}

protected boolean isCollection(Model model) {
return getObject(model, DSPACE_IS_PART_OF_COMMUNITY_PREDICATE).isPresent();
return hasObject(model, DSPACE_IS_PART_OF_COMMUNITY_PREDICATE);
}

protected boolean isItem(Model model) {
return getObject(model, DSPACE_IS_PART_OF_COLLECTION_PREDICATE).isPresent();
return hasObject(model, DSPACE_IS_PART_OF_COLLECTION_PREDICATE);
}

protected URI getDSpaceIiifCollectionUri(String handle) throws URISyntaxException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import static edu.tamu.iiif.constants.Constants.PRESENTATION_IDENTIFIER;
import static edu.tamu.iiif.constants.Constants.RDF_TYPE_PREDICATE;
import static edu.tamu.iiif.constants.Constants.SEQUENCE_IDENTIFIER;
import static edu.tamu.iiif.utility.RdfModelUtility.getObject;
import static edu.tamu.iiif.utility.RdfModelUtility.findObject;
import static edu.tamu.iiif.utility.StringUtility.joinPath;

import java.io.IOException;
Expand Down Expand Up @@ -191,10 +191,10 @@ private URI getFedoraIiifUri(String url, String type) throws URISyntaxException
private List<Canvas> getCanvases(ManifestRequest request, RdfResource rdfResource) throws IOException, URISyntaxException {
List<Canvas> canvases = new ArrayList<Canvas>();

Optional<String> firstId = getObject(rdfResource.getModel(), IANA_FIRST_PREDICATE);
Optional<String> firstId = findObject(rdfResource.getModel(), IANA_FIRST_PREDICATE);

if (firstId.isPresent()) {
Optional<String> lastId = getObject(rdfResource.getModel(), IANA_LAST_PREDICATE);
Optional<String> lastId = findObject(rdfResource.getModel(), IANA_LAST_PREDICATE);

if (lastId.isPresent()) {
Resource firstResource = rdfResource.getModel().getResource(firstId.get());
Expand Down Expand Up @@ -234,10 +234,10 @@ private void generateOrderedCanvases(ManifestRequest request, RdfOrderedResource

Model model = getFedoraRdfModel(rdfOrderedSequence.getResource().getURI());

Optional<String> id = getObject(model, ORE_PROXY_FOR_PREDICATE);
Optional<String> id = findObject(model, ORE_PROXY_FOR_PREDICATE);

if (!id.isPresent()) {
id = getObject(model, ORE_PROXY_FOR_PREDICATE.replace("#", "/"));
id = findObject(model, ORE_PROXY_FOR_PREDICATE.replace("#", "/"));
}

if (id.isPresent()) {
Expand All @@ -249,7 +249,7 @@ private void generateOrderedCanvases(ManifestRequest request, RdfOrderedResource
canvases.add(canvas);
}

Optional<String> nextId = getObject(model, IANA_NEXT_PREDICATE);
Optional<String> nextId = findObject(model, IANA_NEXT_PREDICATE);

if (nextId.isPresent()) {
Resource resource = rdfOrderedSequence.getModel().getResource(nextId.get());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import static edu.tamu.iiif.constants.Constants.PCDM_HAS_FILE_PREDICATE;
import static edu.tamu.iiif.constants.Constants.PCDM_HAS_MEMBER_PREDICATE;
import static edu.tamu.iiif.model.ManifestType.COLLECTION;
import static edu.tamu.iiif.utility.RdfModelUtility.getObject;
import static edu.tamu.iiif.utility.RdfModelUtility.findObject;

import java.io.IOException;
import java.net.URI;
Expand Down Expand Up @@ -123,10 +123,10 @@ private List<ManifestReference> getResourceManifests(ManifestRequest request, Rd
private List<ManifestReference> gatherResourceManifests(ManifestRequest request, RdfResource rdfResource) throws URISyntaxException, IOException {
List<ManifestReference> manifests = new ArrayList<ManifestReference>();

Optional<String> firstId = getObject(rdfResource.getModel(), IANA_FIRST_PREDICATE);
Optional<String> firstId = findObject(rdfResource.getModel(), IANA_FIRST_PREDICATE);

if (firstId.isPresent()) {
Optional<String> lastId = getObject(rdfResource.getModel(), IANA_LAST_PREDICATE);
Optional<String> lastId = findObject(rdfResource.getModel(), IANA_LAST_PREDICATE);

if (lastId.isPresent()) {
Resource firstResource = rdfResource.getModel().getResource(firstId.get());
Expand All @@ -141,10 +141,10 @@ private void gatherResourceManifests(ManifestRequest request, RdfOrderedResource

Model model = getFedoraRdfModel(rdfOrderedResource.getResource().getURI());

Optional<String> id = getObject(model, ORE_PROXY_FOR_PREDICATE);
Optional<String> id = findObject(model, ORE_PROXY_FOR_PREDICATE);

if (!id.isPresent()) {
id = getObject(model, ORE_PROXY_FOR_PREDICATE.replace("#", "/"));
id = findObject(model, ORE_PROXY_FOR_PREDICATE.replace("#", "/"));
}

if (id.isPresent()) {
Expand All @@ -153,7 +153,7 @@ private void gatherResourceManifests(ManifestRequest request, RdfOrderedResource

manifests.add(new ManifestReferenceImpl(getFedoraIiifPresentationUri(parameterizedActualId), getLabel(getRdfResourceByUrl(id.get()))));

Optional<String> nextId = getObject(model, IANA_NEXT_PREDICATE);
Optional<String> nextId = findObject(model, IANA_NEXT_PREDICATE);

if (nextId.isPresent()) {
Resource resource = rdfOrderedResource.getModel().getResource(nextId.get());
Expand Down
44 changes: 38 additions & 6 deletions src/main/java/edu/tamu/iiif/utility/RdfModelUtility.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
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.ModelFactory;
Expand All @@ -21,17 +25,45 @@ public static Model createRdfModel(String rdf) {
return model;
}

public static Optional<String> getObject(Model model, String uri) {
Optional<String> id = Optional.empty();
public static boolean hasObject(Model model, String uri) {
NodeIterator firstNodeItr = model.listObjectsOfProperty(model.getProperty(uri));
if (firstNodeItr.hasNext()) {
id = Optional.of(firstNodeItr.next().toString());
return true;
}
return id;
return false;
}

public static Optional<String> getObject(RdfResource rdfResource, String uri) {
return getObject(rdfResource.getModel(), uri);
public static Optional<String> findObject(Model model, String uri) {
NodeIterator firstNodeItr = model.listObjectsOfProperty(model.getProperty(uri));
if (firstNodeItr.hasNext()) {
return Optional.of(firstNodeItr.next().toString());
}
return Optional.empty();
}

public static Optional<String> findObject(RdfResource rdfResource, String uri) {
return findObject(rdfResource.getModel(), uri);
}

public static List<String> getObjects(Model model, String uri) {
List<String> values = new ArrayList<String>();
NodeIterator firstNodeItr = model.listObjectsOfProperty(model.getProperty(uri));
while (firstNodeItr.hasNext()) {
values.add(firstNodeItr.next().toString());
}
return values;
}

public static List<String> getObjects(RdfResource rdfResource, String uri) {
return getObjects(rdfResource.getModel(), uri);
}

public static List<String> getObjects(RdfResource rdfResource, List<String> uris) {
return uris.stream()
.map(uri -> getObjects(rdfResource, uri))
.flatMap(Collection::stream)
.distinct()
.collect(Collectors.toList());
}

public static String getParameterizedId(final String id, ManifestRequest request) {
Expand Down
Loading

0 comments on commit a7f8472

Please sign in to comment.