Skip to content

Commit

Permalink
Merge pull request #59 from TAMULib/configurable-metadata
Browse files Browse the repository at this point in the history
configurable label and description predicate precedence, configurable…
  • Loading branch information
jcreel committed Apr 12, 2019
2 parents 0336ffa + b6a7d16 commit 88308ad
Show file tree
Hide file tree
Showing 56 changed files with 820 additions and 730 deletions.
62 changes: 62 additions & 0 deletions src/main/java/edu/tamu/iiif/config/AbstractIiifConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package edu.tamu.iiif.config;

import java.util.ArrayList;
import java.util.List;

public abstract class AbstractIiifConfig {

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

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

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

private String url;

private String identifier;

public AbstractIiifConfig() {

}

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

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

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

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

public List<String> getMetadataPrefixes() {
return metadataPrefixes;
}

public void setMetadataPrefixes(List<String> metadataPrefixes) {
this.metadataPrefixes = metadataPrefixes;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public String getIdentifier() {
return identifier;
}

public void setIdentifier(String identifier) {
this.identifier = identifier;
}

}
27 changes: 27 additions & 0 deletions src/main/java/edu/tamu/iiif/config/DSpaceRdfIiifConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package edu.tamu.iiif.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "iiif.dspace")
public class DSpaceRdfIiifConfig extends AbstractIiifConfig {

private String webapp;

public DSpaceRdfIiifConfig() {
super();
setUrl("http://localhost:8080");
setIdentifier("dspace");
setWebapp("xmlui");
}

public String getWebapp() {
return webapp;
}

public void setWebapp(String webapp) {
this.webapp = webapp;
}

}
16 changes: 16 additions & 0 deletions src/main/java/edu/tamu/iiif/config/FedoraPcdmIiifConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package edu.tamu.iiif.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "iiif.fedora")
public class FedoraPcdmIiifConfig extends AbstractIiifConfig {

public FedoraPcdmIiifConfig() {
super();
setUrl("http://localhost:9000/fcrepo/rest");
setIdentifier("fedora");
}

}
5 changes: 3 additions & 2 deletions src/main/java/edu/tamu/iiif/constants/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
public class Constants {

// Repository Identifiers
public final static String DSPACE_RDF_IDENTIFIER = "${iiif.dspace.identifier.dspace-rdf}";
public final static String FEDORA_PCDM_IDENTIFIER = "${iiif.fedora.identifier.fedora-pcdm}";
public final static String DSPACE_RDF_IDENTIFIER = "${iiif.dspace.identifier}";
public final static String FEDORA_PCDM_IDENTIFIER = "${iiif.fedora.identifier}";

// Repository Conditions
public final static String DSPACE_RDF_CONDITION = "'${spring.profiles.include}'.contains('" + DSPACE_RDF_IDENTIFIER + "')";
Expand Down Expand Up @@ -56,6 +56,7 @@ public class Constants {
public final static String DUBLIN_CORE_TITLE_PREDICATE = DUBLIN_CORE_PREFIX + "title";
public final static String DUBLIN_CORE_IDENTIFIER_PREDICATE = DUBLIN_CORE_PREFIX + "identifier";
public final static String DUBLIN_CORE_DESCRIPTION_PREDICATE = DUBLIN_CORE_PREFIX + "description";
public final static String DUBLIN_CORE_DESCRIPTION_ABSTRACT_PREDICATE = DUBLIN_CORE_PREFIX + "description.abstract";

// Dublin Core Terms
public final static String DUBLIN_CORE_TERMS_PREFIX = "http://purl.org/dc/terms/";
Expand Down
8 changes: 2 additions & 6 deletions src/main/java/edu/tamu/iiif/model/rdf/RdfResource.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,6 @@ public Statement getStatementOfPropertyWithId(String id) {
return resource.getProperty(getProperty(id));
}

public StmtIterator getStatementsOfPropertyWithId(String id) {
return resource.listProperties(getProperty(id));
}

public NodeIterator getAllNodesOfPropertyWithId(String id) {
return model.listObjectsOfProperty(getProperty(id));
}
Expand All @@ -81,8 +77,8 @@ public ResIterator listResourcesWithPropertyWithId(String id) {
return model.listResourcesWithProperty(getProperty(id));
}

public boolean containsStatement(String propertyId, String value) {
StmtIterator stmtItr = getStatementsOfPropertyWithId(propertyId);
public boolean containsStatement(String uri, String value) {
StmtIterator stmtItr = resource.listProperties(getProperty(uri));
while (stmtItr.hasNext()) {
Statement stmnt = stmtItr.next();
if (stmnt.getResource().toString().equals(value)) {
Expand Down
37 changes: 33 additions & 4 deletions src/main/java/edu/tamu/iiif/service/AbstractManifestService.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package edu.tamu.iiif.service;

import static edu.tamu.iiif.constants.Constants.DUBLIN_CORE_PREFIX;
import static edu.tamu.iiif.constants.Constants.DUBLIN_CORE_TERMS_PREFIX;
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.StringUtility.encode;
import static edu.tamu.iiif.utility.StringUtility.encodeSpaces;
import static edu.tamu.iiif.utility.StringUtility.joinPath;
Expand Down Expand Up @@ -304,10 +303,34 @@ private String getResourceId(String url) throws InvalidUrlException {
return redisResourceRepo.getOrCreate(url).getId();
}

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

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

protected List<Metadata> getMetadata(RdfResource rdfResource) {
List<Metadata> metadata = new ArrayList<Metadata>();
metadata.addAll(getMetadata(rdfResource, DUBLIN_CORE_PREFIX));
metadata.addAll(getMetadata(rdfResource, DUBLIN_CORE_TERMS_PREFIX));
for (String metadataPrefix : getMetadataPrefixes()) {
metadata.addAll(getMetadata(rdfResource, metadataPrefix));
}
return metadata;
}

Expand All @@ -331,6 +354,12 @@ protected List<Metadata> getMetadata(RdfResource rdfResource) {

protected abstract String getRepositoryPath(String url);

protected abstract List<String> getLabelPrecedence();

protected abstract List<String> getDescriptionPrecedence();

protected abstract List<String> getMetadataPrefixes();

private Service getService(RdfResource rdfResource, String name) throws InvalidUrlException {
Service service = new ServiceImpl(getImageUri(rdfResource.getResource().getURI()));
service.setLabel(new PropertyValueSimpleImpl(name));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,8 @@
import static edu.tamu.iiif.constants.Constants.DSPACE_IS_PART_OF_REPOSITORY_PREDICATE;
import static edu.tamu.iiif.constants.Constants.DSPACE_IS_SUB_COMMUNITY_OF_PREDICATE;
import static edu.tamu.iiif.constants.Constants.DSPACE_RDF_CONDITION;
import static edu.tamu.iiif.constants.Constants.DUBLIN_CORE_TERMS_ABSTRACT;
import static edu.tamu.iiif.constants.Constants.DUBLIN_CORE_TERMS_DESCRIPTION;
import static edu.tamu.iiif.constants.Constants.DUBLIN_CORE_TERMS_TITLE;
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.getIdByPredicate;
import static edu.tamu.iiif.utility.RdfModelUtility.getObject;
import static edu.tamu.iiif.utility.StringUtility.encodeSpaces;
import static edu.tamu.iiif.utility.StringUtility.joinPath;
Expand All @@ -29,7 +25,7 @@

import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.NodeIterator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;

import de.digitalcollections.iiif.presentation.model.api.v2.Canvas;
Expand All @@ -39,6 +35,7 @@
import de.digitalcollections.iiif.presentation.model.impl.v2.CanvasImpl;
import de.digitalcollections.iiif.presentation.model.impl.v2.PropertyValueSimpleImpl;
import de.digitalcollections.iiif.presentation.model.impl.v2.SequenceImpl;
import edu.tamu.iiif.config.DSpaceRdfIiifConfig;
import edu.tamu.iiif.controller.ManifestRequest;
import edu.tamu.iiif.exception.InvalidUrlException;
import edu.tamu.iiif.model.rdf.RdfCanvas;
Expand All @@ -49,14 +46,8 @@
@ConditionalOnExpression(DSPACE_RDF_CONDITION)
public abstract class AbstractDSpaceRdfManifestService extends AbstractManifestService {

@Value("${iiif.dspace.url}")
protected String dspaceUrl;

@Value("${iiif.dspace.webapp}")
protected String dspaceWebapp;

@Value("${iiif.dspace.identifier.dspace-rdf}")
protected String dspaceRdfIdentifier;
@Autowired
protected DSpaceRdfIiifConfig config;

protected Sequence generateSequence(ManifestRequest request, RdfResource rdfResource) throws IOException, URISyntaxException {
String uri = rdfResource.getResource().getURI();
Expand All @@ -72,50 +63,26 @@ protected Canvas generateCanvas(ManifestRequest request, RdfResource rdfResource
String uri = rdfResource.getResource().getURI();
PropertyValueSimpleImpl label = new PropertyValueSimpleImpl(getBitstreamPath(uri));
String parameterizedUri = RdfModelUtility.getParameterizedId(uri, request);

RdfCanvas rdfCanvas = getDSpaceRdfCanvas(request, rdfResource);

Canvas canvas = new CanvasImpl(getDSpaceIiifCanvasUri(getHandlePath(parameterizedUri)), label, rdfCanvas.getHeight(), rdfCanvas.getWidth());

canvas.setImages(rdfCanvas.getImages());

return canvas;
}

protected PropertyValueSimpleImpl getTitle(RdfResource rdfResource) {
Optional<String> title = getObject(rdfResource, DUBLIN_CORE_TERMS_TITLE);
if (!title.isPresent()) {
String id = rdfResource.getResource().getURI();
title = Optional.of(getRepositoryContextIdentifier(id));
}
return new PropertyValueSimpleImpl(title.get());
}

protected PropertyValueSimpleImpl getDescription(RdfResource rdfResource) {
Optional<String> description = getObject(rdfResource, DUBLIN_CORE_TERMS_ABSTRACT);
if (!description.isPresent()) {
description = getObject(rdfResource, DUBLIN_CORE_TERMS_DESCRIPTION);
}
if (!description.isPresent()) {
description = Optional.of("No description available!");
}
return new PropertyValueSimpleImpl(description.get());
}

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

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

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

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

protected URI getDSpaceIiifCollectionUri(String handle) throws URISyntaxException {
Expand Down Expand Up @@ -175,27 +142,42 @@ protected String getMatcherHandle(String uri) {

@Override
protected String getIiifServiceUrl() {
return iiifServiceUrl + "/" + dspaceRdfIdentifier;
return iiifServiceUrl + "/" + config.getIdentifier();
}

@Override
protected String getRepositoryContextIdentifier(String url) {
return dspaceRdfIdentifier + ":" + getRepositoryPath(url);
return config.getIdentifier() + ":" + getRepositoryPath(url);
}

@Override
protected String getRepositoryPath(String url) {
return url.substring(dspaceUrl.length() + 1);
return url.substring(config.getUrl().length() + 1);
}

@Override
protected String getRepositoryType() {
return dspaceRdfIdentifier;
return config.getIdentifier();
}

@Override
protected String getRdfUrl(String handle) {
return joinPath(dspaceUrl, "rdf", "handle", handle);
return joinPath(config.getUrl(), "rdf", "handle", handle);
}

@Override
protected List<String> getLabelPrecedence() {
return config.getLabelPrecedence();
}

@Override
protected List<String> getDescriptionPrecedence() {
return config.getDescriptionPrecedence();
}

@Override
protected List<String> getMetadataPrefixes() {
return config.getMetadataPrefixes();
}

private URI getDSpaceIiifUri(String handle, String type) throws URISyntaxException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public String generateManifest(ManifestRequest request) throws IOException, URIS
String handle = extractHandle(context);
RdfResource rdfResource = getRdfResource(handle);
String url = rdfResource.getResource().getURI();
Canvas canvas = generateCanvas(request, new RdfResource(rdfResource, url.replace("rdf/handle", dspaceWebapp != null && dspaceWebapp.length() > 0 ? dspaceWebapp + "/bitstream" : "bitstream").replaceAll(handle, context)));
Canvas canvas = generateCanvas(request, new RdfResource(rdfResource, url.replace("rdf/handle", config.getWebapp() != null && config.getWebapp().length() > 0 ? config.getWebapp() + "/bitstream" : "bitstream").replaceAll(handle, context)));
return mapper.writeValueAsString(canvas);
}

Expand Down
Loading

0 comments on commit 88308ad

Please sign in to comment.