in taverna-robundle/src/main/java/org/apache/taverna/robundle/manifest/RDFToManifest.java [184:423]
public void readTo(InputStream manifestResourceAsStream, Manifest manifest,
URI manifestResourceBaseURI) throws IOException, RiotException {
OntModel model = new RDFToManifest().getOntModel();
model.add(jsonLdAsJenaModel(manifestResourceAsStream,
manifestResourceBaseURI));
URI root = manifestResourceBaseURI.resolve("/");
Individual researchObj = findRO(model, root);
if (researchObj == null)
throw new IOException("root ResearchObject not found - "
+ "Not a valid RO Bundle manifest");
// isDescribedBy URI
for (Individual manifestResource : listObjectProperties(researchObj,
ore.isDescribedBy)) {
String uriStr = manifestResource.getURI();
if (uriStr == null) {
logger.warning("Skipping manifest without URI: "
+ manifestResource);
continue;
}
// URI relative = relativizeFromBase(uriStr, root);
Path path = manifest.getBundle().getFileSystem().provider()
.getPath(URI.create(uriStr));
manifest.getManifest().add(path);
}
// createdBy
List<Agent> creators = getAgents(root, researchObj, pav.createdBy);
if (!creators.isEmpty()) {
manifest.setCreatedBy(creators.get(0));
if (creators.size() > 1) {
logger.warning("Ignoring additional createdBy agents");
}
}
// createdOn
RDFNode created = researchObj.getPropertyValue(pav.createdOn);
manifest.setCreatedOn(literalAsFileTime(created));
// history
List<Path> history = new ArrayList<Path> ();
for (Individual histItem : listObjectProperties (researchObj, prov.AQ.has_provenance)) {
history.add(Bundles.uriToBundlePath(manifest.getBundle(), relativizeFromBase(histItem.getURI(), root)));
}
manifest.setHistory(history);
// authoredBy
List<Agent> authors = getAgents(root, researchObj, pav.authoredBy);
if (!authors.isEmpty()) {
manifest.setAuthoredBy(authors);
}
// authoredOn
RDFNode authored = researchObj.getPropertyValue(pav.authoredOn);
manifest.setAuthoredOn(literalAsFileTime(authored));
// retrievedFrom
RDFNode retrievedNode = researchObj.getPropertyValue(pav.retrievedFrom);
if (retrievedNode != null) {
try {
manifest.setRetrievedFrom(new URI(retrievedNode.asResource().getURI()));
} catch (URISyntaxException ex) {
logger.log(Level.WARNING, "Error creating URI for retrievedFrom: " +
retrievedNode.asResource().getURI(), ex);
}
}
// retrievedBy
List<Agent> retrievers = getAgents(root, researchObj, pav.retrievedBy);
if (!retrievers.isEmpty()) {
manifest.setRetrievedBy(retrievers.get(0));
if (retrievers.size() > 1) {
logger.warning("Ignoring additional retrievedBy agents");
}
}
// retrievedOn
RDFNode retrieved = researchObj.getPropertyValue(pav.retrievedOn);
manifest.setRetrievedOn(literalAsFileTime(retrieved));
// conformsTo
for (Individual standard : listObjectProperties(researchObj,
ro.conformsTo)) {
if (standard.isURIResource()) {
URI uri;
try {
uri = new URI(standard.getURI());
} catch (URISyntaxException ex) {
logger.log(Level.WARNING, "Invalid URI for conformsTo: " +
standard, ex);
continue;
}
if (! manifest.getConformsTo().contains(uri)) {
manifest.getConformsTo().add(uri);
}
}
}
// Aggregates
for (Individual aggrResource : listObjectProperties(researchObj, ore.aggregates)) {
String uriStr = aggrResource.getURI();
// PathMetadata meta = new PathMetadata();
if (uriStr == null) {
logger.warning("Skipping aggregation without URI: "
+ aggrResource);
continue;
}
PathMetadata meta = manifest.getAggregation(relativizeFromBase(
uriStr, root));
Set<Individual> proxies = listObjectProperties(aggrResource,
bundle.hasProxy);
if (proxies.isEmpty()) {
// FIXME: Jena does not follow OWL properties paths from hasProxy
proxies = listObjectProperties(aggrResource, bundle.bundledAs);
}
if (!proxies.isEmpty()) {
// Should really only be one anyway
Individual proxy = proxies.iterator().next();
String proxyUri = null;
if (proxy.getURI() != null) {
proxyUri = proxy.getURI();
} else if (proxy.getSameAs() != null) {
proxyUri = proxy.getSameAs().getURI();
}
Proxy proxyInManifest = meta.getOrCreateBundledAs();
if (proxyUri != null) {
proxyInManifest.setURI(relativizeFromBase(proxyUri, root));
}
RDFNode eName = proxy.getPropertyValue(ro.entryName);
if (eName != null && eName.isLiteral()) {
proxyInManifest.setFilename(eName.asLiteral().getString());;
}
RDFNode folder = proxy.getPropertyValue(bundle.inFolder);
if (folder != null && folder.isURIResource()) {
URI folderUri = URI.create(folder.asResource().getURI());
if (! folderUri.resolve("/").equals(manifest.getBaseURI())) {
logger.warning("Invalid bundledAs folder, outside base URI of RO: " + folderUri);
continue;
}
Path folderPath = Paths.get(folderUri);
// Note: folder need NOT exist in zip file, so we don't need to do
// Files.createDirectories(folderPath);
proxyInManifest.setFolder(folderPath);
}
}
// createdBy
creators = getAgents(root, aggrResource, pav.createdBy);
if (!creators.isEmpty()) {
meta.setCreatedBy(creators.get(0));
if (creators.size() > 1) {
logger.warning("Ignoring additional createdBy agents for "
+ meta);
}
}
// createdOn
meta.setCreatedOn(literalAsFileTime(aggrResource
.getPropertyValue(pav.createdOn)));
// retrievedFrom
RDFNode retrievedAggrNode = aggrResource.getPropertyValue(pav.retrievedFrom);
if (retrievedAggrNode != null) {
try {
meta.setRetrievedFrom(new URI(retrievedAggrNode.asResource().getURI()));
} catch (URISyntaxException ex) {
logger.log(Level.WARNING, "Error creating URI for retrievedFrom: " +
retrievedAggrNode.asResource().getURI(), ex);
}
}
// retrievedBy
List<Agent> retrieversAggr = getAgents(root, aggrResource, pav.retrievedBy);
if (!retrieversAggr.isEmpty()) {
meta.setRetrievedBy(retrieversAggr.get(0));
if (retrieversAggr.size() > 1) {
logger.warning("Ignoring additional retrievedBy agents for "
+ meta);
}
}
// retrievedOn
RDFNode retrievedAggr = aggrResource.getPropertyValue(pav.retrievedOn);
meta.setRetrievedOn(literalAsFileTime(retrievedAggr));
// conformsTo
for (Individual standard : listObjectProperties(aggrResource,
ro.conformsTo)) {
if (standard.getURI() != null) {
meta.setConformsTo(relativizeFromBase(standard.getURI(),
root));
}
}
// format
RDFNode mediaType = aggrResource.getPropertyValue(DCTerms.format);
if (mediaType != null && mediaType.isLiteral()) {
meta.setMediatype(mediaType.asLiteral().getLexicalForm());
}
}
for (Individual ann : listObjectProperties(researchObj, bundle.hasAnnotation)) {
/*
* Normally just one body per annotation, but just in case we'll
* iterate and split them out (as our PathAnnotation can only keep a
* single setContent() at a time)
*/
for (Individual body : listObjectProperties(
model.getOntResource(ann), oa.hasBody)) {
if (! body.isURIResource()) {
logger.warning("Can't find annotation body for anonymous "
+ body);
continue;
}
PathAnnotation pathAnn = new PathAnnotation();
pathAnn.setContent(relativizeFromBase(body.getURI(), root));
if (ann.getURI() != null)
pathAnn.setUri(relativizeFromBase(ann.getURI(), root));
else if (ann.getSameAs() != null
&& ann.getSameAs().getURI() != null)
pathAnn.setUri(relativizeFromBase(ann.getSameAs().getURI(),
root));
// Handle multiple about/hasTarget
for (Individual target : listObjectProperties(ann, oa.hasTarget))
if (target.getURI() != null)
pathAnn.getAboutList().add(
relativizeFromBase(target.getURI(), root));
manifest.getAnnotations().add(pathAnn);
}
}
}