/** * PODD is an OWL ontology database used for scientific project management * * Copyright (C) 2009-2013 The University Of Queensland * * This program is free software: you can redistribute it and/or modify it under the terms of the * GNU Affero General Public License as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License along with this program. * If not, see <http://www.gnu.org/licenses/>. */ package com.github.podd.impl.data; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import org.openrdf.model.Model; import org.openrdf.model.Resource; import org.openrdf.model.URI; import org.openrdf.model.Value; import org.openrdf.model.vocabulary.RDF; import org.openrdf.model.vocabulary.RDFS; import org.semanticweb.owlapi.model.IRI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.podd.api.data.SPARQLDataReference; import com.github.podd.api.data.SPARQLDataReferenceProcessor; import com.github.podd.utils.DebugUtils; import com.github.podd.utils.PODD; /** * Processor for File References of type <i>http://purl.org/podd/ns/poddBase#SPARQLDataReference</i> * * @author Peter Ansell p_ansell@yahoo.com */ public class SPARQLDataReferenceProcessorImpl implements SPARQLDataReferenceProcessor { private final Logger log = LoggerFactory.getLogger(this.getClass()); @Override public boolean canHandle(final Model rdfStatements) { if(rdfStatements == null || rdfStatements.isEmpty()) { return false; } for(final URI fileType : this.getTypes()) { final Model matchingModels = rdfStatements.filter((Resource)null, RDF.TYPE, fileType); if(!matchingModels.isEmpty()) { return true; } } return false; } @Override public Collection<SPARQLDataReference> createReferences(final Model rdfStatements) { if(rdfStatements == null || rdfStatements.isEmpty()) { return null; } final Set<SPARQLDataReference> results = new HashSet<SPARQLDataReference>(); for(final URI fileType : this.getTypes()) { final Set<Resource> fileRefUris = rdfStatements.filter(null, RDF.TYPE, fileType).subjects(); for(final Resource fileRef : fileRefUris) { final Model model = rdfStatements.filter(fileRef, null, null); if(this.log.isDebugEnabled()) { DebugUtils.printContents(model); } final SPARQLDataReference fileReference = new SPARQLDataReferenceImpl(); // note: artifact ID is not available to us in here and must be added externally if(fileRef instanceof URI) { fileReference.setObjectIri(IRI.create((URI)fileRef)); } final Set<Value> label = model.filter(fileRef, RDFS.LABEL, null).objects(); if(!label.isEmpty()) { fileReference.setLabel(label.iterator().next().stringValue()); } final Set<Value> graph = model.filter(fileRef, PODD.PODD_BASE_HAS_SPARQL_GRAPH, null).objects(); if(!graph.isEmpty()) { fileReference.setGraph(graph.iterator().next().stringValue()); } final Set<Value> alias = model.filter(fileRef, PODD.PODD_BASE_HAS_ALIAS, null).objects(); if(!alias.isEmpty()) { fileReference.setRepositoryAlias(alias.iterator().next().stringValue()); } final Model linksToFileReference = rdfStatements.filter(null, null, fileRef); // TODO: Need to use a SPARQL query to verify that the property is a sub-property of // PODD Contains if(!linksToFileReference.isEmpty()) { for(final Resource nextResource : linksToFileReference.subjects()) { if(nextResource instanceof URI) { fileReference.setParentIri(IRI.create((URI)nextResource)); break; } } fileReference .setParentPredicateIRI(IRI.create(linksToFileReference.predicates().iterator().next())); } results.add(fileReference); } } return results; } @Override public Set<URI> getTypes() { return Collections.singleton(PODD.PODD_BASE_DATA_REFERENCE_TYPE_SPARQL); } }