Author: alexdma
Date: Thu Jun 18 17:10:58 2015
New Revision: 1686278
URL: http://svn.apache.org/r1686278
Log:
* initial steps at renaming ontonet to ontologymanager (STANBOL-672)
* Using locks and minimizing graph iteration for ontology imports - closes
STANBOL-1428
* HTML view shows ontology dependencies - closes STANBOL-1426, refs STANBOL-695
* introduced failOnMissingImports configuration, to be set from the Felix
console - closes STANBOL-1427
* verified that service endpoints are up wrt. changes to the TcManager. Can now
close STANBOL-1393
Added:
stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/RootResource.java
stanbol/trunk/ontologymanager/web/src/main/resources/templates/html/org/apache/stanbol/ontologymanager/web/resources/RootResource/
stanbol/trunk/ontologymanager/web/src/main/resources/templates/html/org/apache/stanbol/ontologymanager/web/resources/RootResource/conflict.ftl
stanbol/trunk/ontologymanager/web/src/main/resources/templates/html/org/apache/stanbol/ontologymanager/web/resources/RootResource/index.ftl
stanbol/trunk/ontologymanager/web/src/main/resources/templates/html/org/apache/stanbol/ontologymanager/web/resources/RootResource/ontology.ftl
stanbol/trunk/ontologymanager/web/src/main/resources/templates/html/org/apache/stanbol/ontologymanager/web/resources/RootResource/webview.ftl
Removed:
stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/util/OntologyStatsResource.java
stanbol/trunk/ontologymanager/web/src/main/resources/templates/html/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/
Modified:
stanbol/trunk/ontologymanager/generic/servicesapi/src/main/java/org/apache/stanbol/ontologymanager/servicesapi/ontology/OntologyProvider.java
stanbol/trunk/ontologymanager/generic/servicesapi/src/main/java/org/apache/stanbol/ontologymanager/servicesapi/util/OntologyUtils.java
stanbol/trunk/ontologymanager/multiplexer/clerezza/src/main/java/org/apache/stanbol/ontologymanager/multiplexer/clerezza/ontology/ClerezzaOntologyProvider.java
stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource.java
Modified:
stanbol/trunk/ontologymanager/generic/servicesapi/src/main/java/org/apache/stanbol/ontologymanager/servicesapi/ontology/OntologyProvider.java
URL:
http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/generic/servicesapi/src/main/java/org/apache/stanbol/ontologymanager/servicesapi/ontology/OntologyProvider.java?rev=1686278&r1=1686277&r2=1686278&view=diff
==============================================================================
---
stanbol/trunk/ontologymanager/generic/servicesapi/src/main/java/org/apache/stanbol/ontologymanager/servicesapi/ontology/OntologyProvider.java
(original)
+++
stanbol/trunk/ontologymanager/generic/servicesapi/src/main/java/org/apache/stanbol/ontologymanager/servicesapi/ontology/OntologyProvider.java
Thu Jun 18 17:10:58 2015
@@ -94,6 +94,11 @@ public interface OntologyProvider<S> {
*/
public String RESOLVE_IMPORTS =
"org.apache.stanbol.ontologymanager.ontonet.resolveImports";
+ /**
+ * The key used to configure the default import failure policy for this
provider.
+ */
+ public String MISSING_IMPORTS_FAIL =
"org.apache.stanbol.ontologymanager.ontonet.failOnMissingImports";
+
boolean addAlias(OWLOntologyID primaryKey, OWLOntologyID alias);
OWLOntologyID createBlankOntologyEntry(OWLOntologyID publicKey);
Modified:
stanbol/trunk/ontologymanager/generic/servicesapi/src/main/java/org/apache/stanbol/ontologymanager/servicesapi/util/OntologyUtils.java
URL:
http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/generic/servicesapi/src/main/java/org/apache/stanbol/ontologymanager/servicesapi/util/OntologyUtils.java?rev=1686278&r1=1686277&r2=1686278&view=diff
==============================================================================
---
stanbol/trunk/ontologymanager/generic/servicesapi/src/main/java/org/apache/stanbol/ontologymanager/servicesapi/util/OntologyUtils.java
(original)
+++
stanbol/trunk/ontologymanager/generic/servicesapi/src/main/java/org/apache/stanbol/ontologymanager/servicesapi/util/OntologyUtils.java
Thu Jun 18 17:10:58 2015
@@ -105,9 +105,11 @@ public final class OntologyUtils {
List<String> result = new ArrayList<String>();
for (String f : preferredFormats)
if (supported.contains(f)) result.add(f);
+ /*
// The non-preferred supported formats on the tail in any order
for (String f : supported)
if (!result.contains(f)) result.add(f);
+ */
return result;
}
Modified:
stanbol/trunk/ontologymanager/multiplexer/clerezza/src/main/java/org/apache/stanbol/ontologymanager/multiplexer/clerezza/ontology/ClerezzaOntologyProvider.java
URL:
http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/multiplexer/clerezza/src/main/java/org/apache/stanbol/ontologymanager/multiplexer/clerezza/ontology/ClerezzaOntologyProvider.java?rev=1686278&r1=1686277&r2=1686278&view=diff
==============================================================================
---
stanbol/trunk/ontologymanager/multiplexer/clerezza/src/main/java/org/apache/stanbol/ontologymanager/multiplexer/clerezza/ontology/ClerezzaOntologyProvider.java
(original)
+++
stanbol/trunk/ontologymanager/multiplexer/clerezza/src/main/java/org/apache/stanbol/ontologymanager/multiplexer/clerezza/ontology/ClerezzaOntologyProvider.java
Thu Jun 18 17:10:58 2015
@@ -53,6 +53,7 @@ import java.util.Set;
import java.util.SortedSet;
import java.util.Stack;
import java.util.TreeSet;
+import java.util.concurrent.locks.Lock;
import org.apache.clerezza.rdf.core.Literal;
import org.apache.clerezza.rdf.core.LiteralFactory;
@@ -64,6 +65,7 @@ import org.apache.clerezza.rdf.core.Trip
import org.apache.clerezza.rdf.core.TypedLiteral;
import org.apache.clerezza.rdf.core.UriRef;
import org.apache.clerezza.rdf.core.access.EntityAlreadyExistsException;
+import org.apache.clerezza.rdf.core.access.LockableMGraph;
import org.apache.clerezza.rdf.core.access.TcManager;
import org.apache.clerezza.rdf.core.access.TcProvider;
import org.apache.clerezza.rdf.core.impl.TripleImpl;
@@ -95,6 +97,7 @@ import org.apache.stanbol.ontologymanage
import org.apache.stanbol.ontologymanager.servicesapi.io.Origin;
import org.apache.stanbol.ontologymanager.servicesapi.ontology.Multiplexer;
import
org.apache.stanbol.ontologymanager.servicesapi.ontology.OntologyHandleException;
+import
org.apache.stanbol.ontologymanager.servicesapi.ontology.OntologyLoadingException;
import
org.apache.stanbol.ontologymanager.servicesapi.ontology.OntologyProvider;
import
org.apache.stanbol.ontologymanager.servicesapi.ontology.OrphanOntologyKeyException;
import org.apache.stanbol.ontologymanager.servicesapi.scope.Scope;
@@ -225,9 +228,6 @@ public class ClerezzaOntologyProvider im
IRI ontologyIri = publicKey.getOntologyIRI(), versionIri =
publicKey.getVersionIRI();
if (ontologyIri == null) throw new IllegalArgumentException(
"Cannot build a UriRef resource on an anonymous public
key!");
-
- log.debug("Searching for a meta graph entry for public key:");
- log.debug(" -- {}", publicKey);
UriRef match = null;
LiteralFactory lf = LiteralFactory.getInstance();
TypedLiteral oiri = lf.createTypedLiteral(new
UriRef(ontologyIri.toString()));
@@ -264,7 +264,6 @@ public class ClerezzaOntologyProvider im
}
}
}
- log.debug("Matching UriRef in graph : {}", match);
if (match == null) {
return new UriRef(OntologyUtils.encode(publicKey));
} else {
@@ -298,6 +297,9 @@ public class ClerezzaOntologyProvider im
OWLOntologyID getReverseMapping(UriRef graphName) {
// Logical mappings first.
+
+ log.info("GRAPH NAME {}", graphName);
+
Iterator<Triple> it = graph.filter(null, MAPS_TO_GRAPH_URIREF,
graphName);
while (it.hasNext()) {
Resource obj = it.next().getSubject();
@@ -368,9 +370,11 @@ public class ClerezzaOntologyProvider im
void removeMapping(OWLOntologyID ontologyReference) {
Iterator<Triple> it =
graph.filter(buildResource(ontologyReference), MAPS_TO_GRAPH_URIREF, null);
- // I expect a concurrent modification exception here, but we can
deal with it later.
+ // To avoid concurrent modification exceptions
+ Collection<Triple> removeUs = new HashSet<Triple>();
while (it.hasNext())
- graph.remove(it.next());
+ removeUs.add(it.next());
+ graph.removeAll(removeUs);
}
void setMapping(OWLOntologyID ontologyReference, UriRef graphName) {
@@ -388,6 +392,8 @@ public class ClerezzaOntologyProvider im
private static final boolean _RESOLVE_IMPORTS_DEFAULT = true;
+ private static final boolean _MISSING_IMPORTS_FAIL_DEFAULT = true;
+
protected Multiplexer descriptor = null;
@Property(name = OntologyProvider.IMPORT_POLICY, options = {
@@ -438,6 +444,9 @@ public class ClerezzaOntologyProvider im
@Property(name = OntologyProvider.RESOLVE_IMPORTS, boolValue =
_RESOLVE_IMPORTS_DEFAULT)
protected boolean resolveImports = _RESOLVE_IMPORTS_DEFAULT;
+ @Property(name = OntologyProvider.MISSING_IMPORTS_FAIL, boolValue =
_MISSING_IMPORTS_FAIL_DEFAULT)
+ protected boolean failMissingImports = _MISSING_IMPORTS_FAIL_DEFAULT;
+
/*
* Do not use SCR reference here: this might be different from the
registered WeightedTcProvider services
* : when supplied, it overrides TcManager
@@ -508,6 +517,11 @@ public class ClerezzaOntologyProvider im
} catch (Exception ex) {
resolveImports = _RESOLVE_IMPORTS_DEFAULT; // Should be already
assigned though
}
+ try {
+ failMissingImports = (Boolean)
(configuration.get(OntologyProvider.MISSING_IMPORTS_FAIL));
+ } catch (Exception ex) {
+ failMissingImports = _MISSING_IMPORTS_FAIL_DEFAULT; // Should be
already assigned though
+ }
Object importPolicy =
configuration.get(OntologyProvider.IMPORT_POLICY);
if (importPolicy == null) {
@@ -611,7 +625,7 @@ public class ClerezzaOntologyProvider im
*/
private void fillImportsReverse(OWLOntologyID importing,
List<OWLOntologyID> reverseImports,
- List<OWLOntologyID> level1Imports) {
+ List<OWLOntologyID> level1Imports) throws
OntologyHandleException {
log.debug("Filling reverse imports for {}", importing);
// Add the importing ontology first
@@ -623,13 +637,28 @@ public class ClerezzaOntologyProvider im
= getStoredOntology(/* getPublicKey */(importing), MGraph.class,
false);
Iterator<Triple> it = graph.filter(null, RDF.type, OWL.Ontology);
if (!it.hasNext()) return;
+ log.debug("Import list follows:");
Iterator<Triple> it2 = graph.filter(it.next().getSubject(),
OWL.imports, null);
while (it2.hasNext()) {
// obj is the *original* import target
Resource obj = it2.next().getObject();
+ log.debug(" * {}", obj);
if (obj instanceof UriRef) {
// Right now getKey() is returning the "private" storage ID
String key = getKey(IRI.create(((UriRef)
obj).getUnicodeString()));
+ log.debug(" ... with key {}", key);
+ if (key == null) {
+ if (failMissingImports) throw new OntologyHandleException(
+ "Failed to retrieve storage key for ontology "
+ + obj
+ + ". To prevent these exceptions from
being thrown, please unset property "
+ +
"'org.apache.stanbol.ontologymanager.ontonet.failOnMissingImports'");
+ else {
+ log.warn("null key for {}!", obj);
+ log.warn("Will ignore since 'failOnMissingImports' is
unset.");
+ continue;
+ }
+ }
// TODO this will not be needed when getKey() and
getPublicKey() return the proper public key.
OWLOntologyID oid = keymap.getReverseMapping(new UriRef(key));
// Check used for breaking cycles in the import graph.
@@ -638,6 +667,9 @@ public class ClerezzaOntologyProvider im
if (level1Imports != null) level1Imports.add(oid);
fillImportsReverse(oid, reverseImports, null);
}
+ } else {
+ log.warn("Unexpected type for resource {}.", obj);
+ log.warn(" ... Expected {}, found {}", UriRef.class,
obj.getClass());
}
}
}
@@ -1130,6 +1162,8 @@ public class ClerezzaOntologyProvider im
if (sup != null && !formats.contains(sup)) formats.add(sup);
}
+ log.debug("Will try {} supported formats", formats.size());
+
for (String currentFormat : formats) {
try {
final URLConnection con =
location.toURI().toURL().openConnection();
@@ -1149,7 +1183,10 @@ public class ClerezzaOntologyProvider im
} catch (UnsupportedFormatException e) {
log.debug("FAILURE format {} (unsupported). Trying next one.",
currentFormat);
continue;
+ } catch (OntologyLoadingException e) {
+ throw new OntologyLoadingException(e);
} catch (Exception e) {
+ // From here we should only be expecting parser-specific
exceptions.
log.debug("FAILURE format {} (parse error). Will try next
one.", currentFormat);
continue;
}
@@ -1157,7 +1194,9 @@ public class ClerezzaOntologyProvider im
// No parser worked, return null.
log.error("All parsers failed, giving up.");
- return null;
+ log.error("Failing location was <{}>", location);
+ throw new OntologyLoadingException("Failed to parse an ontology from
location <" + location + ">");
+ // return null;
}
@Override
@@ -1309,43 +1348,61 @@ public class ClerezzaOntologyProvider im
mappedIds += " , " + alias;
}
+ // Resolve imports.
// Do this AFTER registering the ontology, otherwise import cycles
will cause infinite loops.
if (resolveImports) {
// Scan resources of type owl:Ontology, but only get the first.
- Iterator<Triple> it = targetGraph.filter(null, RDF.type,
OWL.Ontology);
- if (it.hasNext()) {
- // Scan import statements for the one owl:Ontology considered.
- Iterator<Triple> it2 =
targetGraph.filter(it.next().getSubject(), OWL.imports, null);
- while (it2.hasNext()) {
- Resource obj = it2.next().getObject();
- log.info("Resolving import target {}", obj);
- if (obj instanceof UriRef) try {
- // TODO try locals first
- UriRef target = (UriRef) obj;
- OWLOntologyID id = new
OWLOntologyID(IRI.create(target.getUnicodeString()));
- if (keymap.getMapping(id) == null) { // Check if it's
not there already.
- if (isOfflineMode()) throw new RuntimeException(
- "Cannot load imported ontology " + obj
- + " while Stanbol is in offline
mode.");
- // TODO manage origins for imported ontologies too?
- OWLOntologyID id2 =
loadInStore(IRI.create(((UriRef) obj).getUnicodeString()),
- null, false);
+ NonLiteral ontologySubject = null;
+ List<UriRef> importTargets = new LinkedList<UriRef>();
+ Lock l = null; // There could be locking iterators...
+ if (targetGraph instanceof LockableMGraph) {
+ l = ((LockableMGraph) targetGraph).getLock().readLock();
+ l.lock();
+ }
+ try {
+ Iterator<Triple> it = targetGraph.filter(null, RDF.type,
OWL.Ontology);
+ if (it.hasNext()) ontologySubject = it.next().getSubject();
+ if (ontologySubject != null) {
+ // Scan import statements for the one owl:Ontology
considered.
+ it = targetGraph.filter(ontologySubject, OWL.imports,
null);
+ while (it.hasNext()) {
+ Resource obj = it.next().getObject();
+ if (obj instanceof UriRef) importTargets.add((UriRef)
obj);
+ }
+ }
+ } finally {
+ if (l != null) l.unlock();
+ }
+ for (UriRef importTgt : importTargets)
+ try {
+ log.info("Resolving import target {}", importTgt);
+ OWLOntologyID id = new
OWLOntologyID(IRI.create(importTgt.getUnicodeString()));
+ if (keymap.getMapping(id) == null) { // Check if it's not
there already.
+ if (isOfflineMode()) throw new RuntimeException(
+ "Cannot load imported ontology " + importTgt
+ + " while Stanbol is in offline
mode.");
+ // TODO manage origins for imported ontologies too?
+ try {
+ IRI irimp =
IRI.create(importTgt.getUnicodeString());
+ OWLOntologyID id2 = loadInStore(irimp, null,
false);
if (id2 != null) id = id2;
- log.info("Import {} resolved.", obj);
- log.debug("");
- } else {
- log.info("Requested import already stored. Setting
dependency only.");
+ log.info("<== SUCCESS");
+ } catch (OntologyLoadingException e) {
+ log.warn("<== FAIL");
+ if (failMissingImports) throw e;
+ else log.warn("Import from IRI <{}> failed, but
will not abort due to permissive failed import handling set for this ontology
provider.");
}
- descriptor.setDependency(primaryKey, id);
- } catch (UnsupportedFormatException e) {
- log.warn("Failed to parse format for resource " + obj,
e);
- // / XXX configure to continue?
- } catch (IOException e) {
- log.warn("Failed to load ontology from resource " +
obj, e);
- // / XXX configure to continue?
+ } else {
+ log.info("Requested import already stored. Setting
dependency only.");
}
+ descriptor.setDependency(primaryKey, id);
+ } catch (UnsupportedFormatException e) {
+ log.warn("Failed to parse format for resource " +
importTgt, e);
+ // / XXX configure to continue?
+ } catch (IOException e) {
+ log.warn("Failed to load ontology from resource " +
importTgt, e);
+ // / XXX configure to continue?
}
- }
}
log.debug(" Ontology {}", mappedIds);
@@ -1442,7 +1499,11 @@ public class ClerezzaOntologyProvider im
List<OWLOntologyID> revImps = new Stack<OWLOntologyID>();
List<OWLOntologyID> lvl1 = new Stack<OWLOntologyID>();
- fillImportsReverse(keymap.getReverseMapping(graphName), revImps, lvl1);
+ try {
+ fillImportsReverse(keymap.getReverseMapping(graphName), revImps,
lvl1);
+ } catch (OntologyHandleException e) {
+ throw new OWLOntologyCreationException(e);
+ }
// If not set to merge (either by policy of by force), adopt the set
import policy.
if (!forceMerge &&
!ImportManagementPolicy.MERGE.equals(getImportManagementPolicy())) {
Modified:
stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource.java
URL:
http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource.java?rev=1686278&r1=1686277&r2=1686278&view=diff
==============================================================================
---
stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource.java
(original)
+++
stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource.java
Thu Jun 18 17:10:58 2015
@@ -17,939 +17,49 @@
package org.apache.stanbol.ontologymanager.web.resources;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
-import static javax.ws.rs.core.MediaType.MULTIPART_FORM_DATA;
import static javax.ws.rs.core.MediaType.TEXT_HTML;
-import static javax.ws.rs.core.MediaType.TEXT_PLAIN;
-import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
-import static javax.ws.rs.core.Response.Status.CONFLICT;
-import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR;
-import static javax.ws.rs.core.Response.Status.NOT_FOUND;
-import static javax.ws.rs.core.Response.Status.NO_CONTENT;
-import static javax.ws.rs.core.Response.Status.UNSUPPORTED_MEDIA_TYPE;
-//import static org.apache.stanbol.commons.web.base.CorsHelper.addCORSOrigin;
-import static
org.apache.stanbol.commons.web.base.format.KRFormat.FUNCTIONAL_OWL;
-import static
org.apache.stanbol.commons.web.base.format.KRFormat.FUNCTIONAL_OWL_TYPE;
-import static
org.apache.stanbol.commons.web.base.format.KRFormat.MANCHESTER_OWL;
-import static
org.apache.stanbol.commons.web.base.format.KRFormat.MANCHESTER_OWL_TYPE;
-import static org.apache.stanbol.commons.web.base.format.KRFormat.N3;
-import static org.apache.stanbol.commons.web.base.format.KRFormat.N3_TYPE;
-import static org.apache.stanbol.commons.web.base.format.KRFormat.N_TRIPLE;
-import static
org.apache.stanbol.commons.web.base.format.KRFormat.N_TRIPLE_TYPE;
-import static org.apache.stanbol.commons.web.base.format.KRFormat.OWL_XML;
-import static org.apache.stanbol.commons.web.base.format.KRFormat.OWL_XML_TYPE;
import static org.apache.stanbol.commons.web.base.format.KRFormat.RDF_JSON;
-import static
org.apache.stanbol.commons.web.base.format.KRFormat.RDF_JSON_TYPE;
import static org.apache.stanbol.commons.web.base.format.KRFormat.RDF_XML;
-import static org.apache.stanbol.commons.web.base.format.KRFormat.RDF_XML_TYPE;
import static org.apache.stanbol.commons.web.base.format.KRFormat.TURTLE;
-import static org.apache.stanbol.commons.web.base.format.KRFormat.TURTLE_TYPE;
import static org.apache.stanbol.commons.web.base.format.KRFormat.X_TURTLE;
-import static
org.apache.stanbol.commons.web.base.format.KRFormat.X_TURTLE_TYPE;
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
import java.net.URI;
-//import com.sun.jersey.api.view.ImplicitProduces;
-//import com.sun.jersey.multipart.BodyPart;
-//import com.sun.jersey.multipart.FormDataBodyPart;
-//import com.sun.jersey.multipart.FormDataMultiPart;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import javax.ws.rs.core.Response.Status;
-import javax.ws.rs.core.UriInfo;
-import org.apache.clerezza.jaxrs.utils.form.MultiPartBody;
-import org.apache.clerezza.rdf.core.Graph;
-import org.apache.clerezza.rdf.core.MGraph;
-import org.apache.clerezza.rdf.core.Triple;
-import org.apache.clerezza.rdf.core.TripleCollection;
-import org.apache.clerezza.rdf.core.UriRef;
-import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
-import org.apache.clerezza.rdf.core.impl.TripleImpl;
-import org.apache.clerezza.rdf.core.serializedform.Parser;
-import org.apache.clerezza.rdf.core.serializedform.UnsupportedFormatException;
-import org.apache.clerezza.rdf.ontologies.OWL;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
-import org.apache.stanbol.commons.owl.util.OWL2Constants;
-import org.apache.stanbol.commons.owl.util.OWLUtils;
-import org.apache.stanbol.commons.owl.util.URIUtils;
-import org.apache.stanbol.commons.web.viewable.Viewable;
-//import org.apache.stanbol.commons.web.base.ContextHelper;
-import
org.apache.stanbol.ontologymanager.multiplexer.clerezza.collector.MGraphMultiplexer;
-import
org.apache.stanbol.ontologymanager.registry.api.RegistryContentException;
-import org.apache.stanbol.ontologymanager.registry.api.RegistryManager;
-import org.apache.stanbol.ontologymanager.registry.api.model.Library;
-import
org.apache.stanbol.ontologymanager.servicesapi.collector.OntologyCollector;
-import org.apache.stanbol.ontologymanager.servicesapi.io.OntologyInputSource;
-import org.apache.stanbol.ontologymanager.servicesapi.io.Origin;
-import org.apache.stanbol.ontologymanager.servicesapi.ontology.Multiplexer;
-import
org.apache.stanbol.ontologymanager.servicesapi.ontology.OntologyHandleException;
-import
org.apache.stanbol.ontologymanager.servicesapi.ontology.OntologyLoadingException;
-import
org.apache.stanbol.ontologymanager.servicesapi.ontology.OntologyProvider;
-import
org.apache.stanbol.ontologymanager.servicesapi.ontology.OrphanOntologyKeyException;
-import org.apache.stanbol.ontologymanager.servicesapi.scope.OntologySpace;
-import org.apache.stanbol.ontologymanager.servicesapi.scope.Scope;
-import org.apache.stanbol.ontologymanager.servicesapi.scope.ScopeManager;
-import org.apache.stanbol.ontologymanager.servicesapi.session.Session;
-import org.apache.stanbol.ontologymanager.servicesapi.session.SessionManager;
-import org.apache.stanbol.ontologymanager.servicesapi.util.OntologyUtils;
-import
org.apache.stanbol.ontologymanager.sources.owlapi.OntologyContentInputSource;
-import org.semanticweb.owlapi.model.AddImport;
-import org.semanticweb.owlapi.model.IRI;
-import org.semanticweb.owlapi.model.OWLDataFactory;
-import org.semanticweb.owlapi.model.OWLImportsDeclaration;
-import org.semanticweb.owlapi.model.OWLOntology;
-import org.semanticweb.owlapi.model.OWLOntologyChange;
-import org.semanticweb.owlapi.model.OWLOntologyCreationException;
-import org.semanticweb.owlapi.model.OWLOntologyID;
-import org.semanticweb.owlapi.model.RemoveImport;
-import org.semanticweb.owlapi.model.SetOntologyID;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
- * Provides the basic HTTP methods for storing and managing ontologies
regardless of them belonging to a
- * specific network, scope or session.
- *
- * @author anuzzolese, alexdma
+ * This will gradually replace the old /ontonet endpoint
*
+ * @author alexdma
+ *
*/
@Component
@Service(Object.class)
@Property(name = "javax.ws.rs", boolValue = true)
-@Path("/ontonet")
-// @ImplicitProduces(MediaType.TEXT_HTML + ";qs=2")
-public class OntoNetRootResource extends AbstractOntologyAccessResource {
-
- private Logger log = LoggerFactory.getLogger(getClass());
-
- @Reference
- protected ScopeManager onManager;
-
- /*
- * Placeholder for the OntologyProvider to be fetched from the servlet
context.
- */
- @Reference
- protected OntologyProvider<?> ontologyProvider;
-
- /*
- * Placeholder for the OntologyProvider to be fetched from the servlet
context.
- */
- @Reference
- protected RegistryManager registryManager;
-
- @Reference
- protected SessionManager sessionManager;
-
- public OntoNetRootResource() {
- super();
- // this.servletContext = servletContext;
- // this.ontologyProvider = (OntologyProvider<?>)
ContextHelper.getServiceFromContext(
- // OntologyProvider.class, servletContext);
- // this.onManager = (ScopeManager)
ContextHelper.getServiceFromContext(ScopeManager.class,
- // servletContext);
- // this.sessionManager = (SessionManager)
ContextHelper.getServiceFromContext(SessionManager.class,
- // servletContext);
- // this.registryManager = (RegistryManager)
ContextHelper.getServiceFromContext(RegistryManager.class,
- // servletContext);
- }
-
- /*
- * TODO before implementing removal, we need OWL dependency checks. Also,
this is quite a strong method
- * and would be best implemented with RESTful authentication.
- */
- // @DELETE
- public Response clear(@Context HttpHeaders headers) {
- ResponseBuilder rb = Response.ok();
- // addCORSOrigin(servletContext, rb, headers);
- return rb.build();
- }
-
- @PUT
- @Path("/{ontologyId:.+}")
- public Response createOntologyEntry(@PathParam("ontologyId") String
ontologyId,
- @Context HttpHeaders headers,
- @Context UriInfo uriInfo) {
- OWLOntologyID key = OntologyUtils.decode(ontologyId);
- ResponseBuilder rb;
- if (ontologyProvider.listAllRegisteredEntries().contains(key)) {
- rb = Response.status(CONFLICT);
- } else {
- ontologyProvider.createBlankOntologyEntry(key);
- rb = Response.created(uriInfo.getRequestUri());
- }
- // addCORSOrigin(servletContext, rb, headers);
- return rb.build();
- }
-
- @DELETE
- @Path("/{ontologyId:.+}")
- public Response deleteOntology(@PathParam("ontologyId") String ontologyId,
@Context HttpHeaders headers) {
- OWLOntologyID key = OntologyUtils.decode(ontologyId);
- ResponseBuilder rb;
- try {
- if (!ontologyProvider.hasOntology(key)) {
- rb = Response.status(NOT_FOUND);
- } else {
- try {
- // TODO check aliases!
- ontologyProvider.removeOntology(key);
- rb = Response.ok();
- } catch (OntologyHandleException e) {
- rb = Response.status(CONFLICT);
- }
- }
- } catch (OrphanOntologyKeyException e) {
- log.warn("Orphan ontology key {}. No associated graph found in
store.", e.getOntologyKey());
- rb = Response.status(NOT_FOUND);
- }
- // addCORSOrigin(servletContext, rb, headers);
- return rb.build();
- }
-
- public Set<String> getAliases(final OWLOntologyID ontologyId) {
- // TODO use rdfViewable instead of Vieable to make separation of
- // presentation and application logic cleaner
- return AccessController.doPrivileged(new
PrivilegedAction<Set<String>>() {
- @Override
- public Set<String> run() {
- Set<String> aliases = new HashSet<String>();
- for (OWLOntologyID alias :
ontologyProvider.listAliases(ontologyId)) {
- aliases.add(OntologyUtils.encode(alias));
- }
- return aliases;
- }
- });
-
- }
-
- private MGraph getGraph(String ontologyId, boolean merged, URI requestUri)
{
- long before = System.currentTimeMillis();
-
- OWLOntologyID key = OntologyUtils.decode(ontologyId);
-
- log.debug("Will try to retrieve ontology {} from provider.", key);
- /*
- * Export directly to MGraph since the OWLOntologyWriter uses
(de-)serializing converters for the
- * other formats.
- *
- * Use oTemp for the "real" graph and o for the graph that will be
exported. This is due to the fact
- * that in o we want to change import statements, but we do not want
these changes to be stored
- * permanently.
- */
- MGraph o = null, oTemp = null;
- try {
- oTemp = ontologyProvider.getStoredOntology(key, MGraph.class,
merged);
- } catch (Exception ex) {
- log.warn("Retrieval of ontology with ID " + key + " failed.", ex);
- }
-
- if (oTemp == null) {
- log.debug("Ontology {} missing from provider. Trying
libraries...", key);
- // TODO remove once registry supports OWLOntologyID as public key.
- IRI iri = URIUtils.sanitize(IRI.create(ontologyId));
- // See if we can touch a library. TODO: replace with event model
on the ontology provider.
- int minSize = -1;
- IRI smallest = null;
- for (Library lib : registryManager.getLibraries(iri)) {
- int size = lib.getChildren().length;
- if (minSize < 1 || size < minSize) {
- smallest = lib.getIRI();
- minSize = size;
- }
- }
- if (smallest != null) {
- log.debug("Selected library for ontology {} is {} .", iri,
smallest);
- try {
- oTemp =
registryManager.getLibrary(smallest).getOntology(iri, MGraph.class);
- } catch (RegistryContentException e) {
- log.warn("The content of library " + smallest + " could
not be accessed.", e);
- }
- }
- }
-
- // This is needed because we need to change import statements. No need
to use a more efficient but
- // resource-intensive IndexedMGraph, since both o and oTemp will be
GC'ed after serialization.
- if (oTemp != null) {
- o = new SimpleMGraph(oTemp);
- }
-
- if (o == null) {
- log.debug("Ontology {} not found in any ontology provider or
library.", ontologyId);
- return null;
- }
-
- log.debug("Retrieved ontology {} .", ontologyId);
-
- // Rewrite imports
- String uri = uriInfo.getRequestUri().toString();
- URI base = URI.create(uri.substring(0, uri.lastIndexOf(ontologyId) -
1));
-
- // Rewrite import statements
- /*
- * TODO manage import rewrites better once the container ID is fully
configurable (i.e. instead of
- * going upOne() add "session" or "ontology" if needed).
- */
- Iterator<Triple> imports = o.filter(null, OWL.imports, null);
- Set<Triple> oldImports = new HashSet<Triple>();
- while (imports.hasNext()) {
- oldImports.add(imports.next());
- }
- for (Triple t : oldImports) {
- // construct new statement
- String s = ((UriRef) t.getObject()).getUnicodeString();
- if (s.contains("::")) {
- s = s.substring(s.indexOf("::") + 2, s.length());
- }
- UriRef target = new UriRef(base + "/" + s);
- o.add(new TripleImpl(t.getSubject(), OWL.imports, target));
- // remove old statement
- o.remove(t);
- }
-
- // Versioning.
- OWLOntologyID id = OWLUtils.extractOntologyID(o);
- if (id != null && !id.isAnonymous() && id.getVersionIRI() == null) {
- UriRef viri = new UriRef(requestUri.toString());
- log.debug("Setting version IRI for export : {}", viri);
- o.add(new TripleImpl(new UriRef(id.getOntologyIRI().toString()),
new UriRef(
- OWL2Constants.OWL_VERSION_IRI), viri));
- }
-
- log.debug("Exported as Clerezza Graph in {} ms. Handing over to
writer.", System.currentTimeMillis()
-
- before);
- return o;
- }
-
- public Set<String> getHandles(final OWLOntologyID ontologyId) {
- // TODO use rdfViewable instead of Vieable to make separation of
- // presentation and application logic cleaner
- return AccessController.doPrivileged(new
PrivilegedAction<Set<String>>() {
- @Override
- public Set<String> run() {
- Set<String> handles = new HashSet<String>();
- if (onManager != null) {
- for (Scope scope : onManager.getRegisteredScopes()) {
- if (scope.getCoreSpace().hasOntology(ontologyId)
- || scope.getCustomSpace().hasOntology(ontologyId))
{
- handles.add(scope.getID());
- }
- }
- }
- if (sessionManager != null) {
- for (String sesId :
sessionManager.getRegisteredSessionIDs()) {
- if
(sessionManager.getSession(sesId).hasOntology(ontologyId)) {
- handles.add(sesId);
- }
- }
- }
- return handles;
- }
- });
-
- }
+@Path("/ontologymanager")
+public class OntoNetRootResource extends RootResource {
@GET
+ @Override
@Produces(TEXT_HTML)
public Response getHtmlInfo(@Context HttpHeaders headers) {
- ResponseBuilder rb = Response.ok(new Viewable("index", this));
- rb.header(HttpHeaders.CONTENT_TYPE, TEXT_HTML + "; charset=utf-8");
- // addCORSOrigin(servletContext, rb, headers);
- return rb.build();
+ return Response.seeOther(URI.create("/ontonet")).build();
}
@GET
+ @Override
@Produces({RDF_XML, TURTLE, X_TURTLE, APPLICATION_JSON, RDF_JSON})
public Response getMetaGraph(@Context HttpHeaders headers) {
- ResponseBuilder rb =
Response.ok(ontologyProvider.getMetaGraph(Graph.class));
- // addCORSOrigin(servletContext, rb, headers);
- return rb.build();
- }
-
- public SortedSet<OWLOntologyID> getOntologies() {
- // As this method is invoked from the template it would be too late
- // to handle AccessControlExceptionS
- // TODO use rdfViewable instead of Vieable to make separation of
- // presentation and application logic cleaner
- return AccessController.doPrivileged(new
PrivilegedAction<SortedSet<OWLOntologyID>>() {
- @Override
- public SortedSet<OWLOntologyID> run() {
- // No orphans included.
- SortedSet<OWLOntologyID> filtered = new
TreeSet<OWLOntologyID>();
- Set<OWLOntologyID> orphans = ontologyProvider.listOrphans();
- for (OWLOntologyID id : ontologyProvider.getPublicKeys()) {
- if (id != null && !orphans.contains(id)) {
- filtered.add(id);
- }
- }
- return filtered;
- }
- });
- }
-
- public Set<OWLOntologyID> getOrphans() {
- // As this method is invoked from the template it would be too late
- // to handle AccessControlExceptionS
- // TODO use rdfViewable instead of Vieable to make separation of
- // presentation and application logic cleaner
- return AccessController.doPrivileged(new
PrivilegedAction<Set<OWLOntologyID>>() {
-
- @Override
- public Set<OWLOntologyID> run() {
- return ontologyProvider.listOrphans();
- }
- });
- }
-
- private OWLOntology getOWLOntology(String ontologyId, boolean merge, URI
requestUri) {
- long before = System.currentTimeMillis();
- IRI iri = URIUtils.sanitize(IRI.create(ontologyId));
- log.debug("Will try to retrieve ontology {} from provider.", iri);
- // TODO be selective: if the ontology is small enough, use OWLOntology
otherwise export to Graph.
- OWLOntology o = null;
- try {
- // XXX Guarantee that there MUST always be an entry for any
decoded ontology ID submitted.
- OWLOntologyID id = OntologyUtils.decode(ontologyId);
- o = ontologyProvider.getStoredOntology(id, OWLOntology.class,
merge);
- } catch (Exception ex) {
- log.warn("Retrieval of ontology with ID " + iri + " failed.", ex);
- }
-
- if (o == null) {
- log.debug("Ontology {} missing from provider. Trying
libraries...", iri);
- // See if we can touch a library. TODO: replace with event model
on the ontology provider.
- int minSize = -1;
- IRI smallest = null;
- for (Library lib : registryManager.getLibraries(iri)) {
- int size = lib.getChildren().length;
- if (minSize < 1 || size < minSize) {
- smallest = lib.getIRI();
- minSize = size;
- }
- }
- if (smallest != null) {
- log.debug("Selected library for ontology {} is {} .", iri,
smallest);
- try {
- o = registryManager.getLibrary(smallest).getOntology(iri,
OWLOntology.class);
- } catch (RegistryContentException e) {
- log.warn("The content of library " + smallest + " could
not be accessed.", e);
- }
- }
- }
-
- if (o == null) {
- log.debug("Ontology {} not found in any ontology provider or
library.", iri);
- return null;
- }
-
- log.debug("Retrieved ontology {} .", iri);
- // Rewrite import statements - no ontology collector to do it for us
here.
- URI base = URI.create(getPublicBaseUri() + "ontonet/");
- List<OWLOntologyChange> changes = new ArrayList<OWLOntologyChange>();
- OWLDataFactory df = o.getOWLOntologyManager().getOWLDataFactory();
-
- // TODO manage import rewrites better once the container ID is fully
configurable.
- for (OWLImportsDeclaration oldImp : o.getImportsDeclarations()) {
- changes.add(new RemoveImport(o, oldImp));
- String s = oldImp.getIRI().toString();
- if (s.contains("::")) {
- s = s.substring(s.indexOf("::") + 2, s.length());
- }
- IRI target = IRI.create(base + s);
- changes.add(new AddImport(o, df.getOWLImportsDeclaration(target)));
- }
-
- // Versioning.
- OWLOntologyID id = o.getOntologyID();
- if (!id.isAnonymous() && id.getVersionIRI() == null) {
- IRI viri = IRI.create(requestUri);
- log.debug("Setting version IRI for export : {}", viri);
- changes.add(new SetOntologyID(o, new
OWLOntologyID(id.getOntologyIRI(), viri)));
- }
-
- o.getOWLOntologyManager().applyChanges(changes);
- log.debug("Exported as Clerezza Graph in {} ms. Handing over to
writer.", System.currentTimeMillis()
-
- before);
- return o;
- }
-
- public int getSize(final OWLOntologyID ontologyId) {
- // TODO use rdfViewable instead of Vieable to make separation of
- // presentation and application logic cleaner
- return AccessController.doPrivileged(new PrivilegedAction<Integer>() {
- @Override
- public Integer run() {
- Multiplexer desc = new
MGraphMultiplexer(ontologyProvider.getMetaGraph(MGraph.class));
- return desc.getSize(ontologyId);
- }
- });
-
- }
-
- @GET
- @Path("/{ontologyId:.+}")
- @Produces(value = {APPLICATION_JSON, N3, N_TRIPLE, RDF_JSON})
- public Response getStandaloneGraph(@PathParam("ontologyId") String
ontologyId,
- @DefaultValue("false")
@QueryParam("meta") boolean meta,
- @DefaultValue("false")
@QueryParam("merge") boolean merged,
- @Context UriInfo uriInfo,
- @Context HttpHeaders headers) {
-
- if (meta) {
- return getMetadata(ontologyId, uriInfo, headers);
- }
-
- ResponseBuilder rb;
- if (ontologyId == null || ontologyId.isEmpty()) {
- rb = Response.status(BAD_REQUEST);
- }
- OWLOntologyID key = OntologyUtils.decode(ontologyId);
- if (ontologyProvider.listOrphans().contains(key)) {
- rb = Response.status(NO_CONTENT);
- } else {
- TripleCollection o = getGraph(ontologyId, merged,
uriInfo.getRequestUri());
- rb = o == null ? Response.status(NOT_FOUND) : Response.ok(o);
- }
- // addCORSOrigin(servletContext, rb, headers);
- return rb.build();
- }
-
- /**
- * Gets the ontology with the given identifier in its version managed by
the session.
- *
- * @param sessionId
- * the session identifier.
- * @param ontologyId
- * the ontology identifier.
- * @param uriInfo
- * @param headers
- * @return the requested managed ontology, or {@link Status#NOT_FOUND} if
either the sessionn does not
- * exist, or the if the ontology either does not exist or is not
managed.
- */
- @GET
- @Path("/{ontologyId:.+}")
- @Produces(value = {RDF_XML, TURTLE, X_TURTLE, MANCHESTER_OWL,
FUNCTIONAL_OWL, OWL_XML, TEXT_PLAIN})
- public Response getStandaloneOntology(@PathParam("ontologyId") String
ontologyId,
- @DefaultValue("false")
@QueryParam("merge") boolean merged,
- @Context UriInfo uriInfo,
- @Context HttpHeaders headers) {
- ResponseBuilder rb;
- if (ontologyId == null || ontologyId.isEmpty()) {
- rb = Response.status(BAD_REQUEST);
- }
- OWLOntologyID key = OntologyUtils.decode(ontologyId);
- if (ontologyProvider.listOrphans().contains(key)) {
- rb = Response.status(NO_CONTENT);
- } else {
- OWLOntology o = getOWLOntology(ontologyId, merged,
uriInfo.getRequestUri());
- rb = o == null ? Response.status(NOT_FOUND) : Response.ok(o);
- }
- // addCORSOrigin(servletContext, rb, headers);
- return rb.build();
- }
-
- public Response getMetadata(@PathParam("ontologyId") String ontologyId,
- @Context UriInfo uriInfo,
- @Context HttpHeaders headers) {
- ResponseBuilder rb;
- UriRef me = new UriRef(getPublicBaseUri() + "ontonet/" + ontologyId);
- MGraph mGraph = new SimpleMGraph();
- for (String alias : getAliases(OntologyUtils.decode(ontologyId))) {
- mGraph.add(new TripleImpl(new UriRef(getPublicBaseUri() +
"ontonet/" + alias), OWL.sameAs, me));
- }
- rb = Response.ok(mGraph);
- // addCORSOrigin(servletContext, rb, headers);
- return rb.build();
- }
-
- @POST
- @Path("/{ontologyId:.+}")
- @Consumes({MULTIPART_FORM_DATA})
- @Produces({TEXT_HTML, TEXT_PLAIN, RDF_XML, TURTLE, X_TURTLE, N3})
- public Response loadOntologyContent(@PathParam("ontologyId") String
ontologyId,
- MultiPartBody data,
- @Context HttpHeaders headers) {
- ResponseBuilder rb = performLoadOntology(data, headers,
- Origin.create(OntologyUtils.decode(ontologyId)));
- // rb.header(HttpHeaders.CONTENT_TYPE, TEXT_HTML + "; charset=utf-8");
- // addCORSOrigin(servletContext, rb, headers);
- return rb.build();
- }
-
- protected ResponseBuilder performLoadOntology(MultiPartBody data,
HttpHeaders headers, Origin<?>... keys) {
- log.debug(" post(MultiPartBody data)");
- ResponseBuilder rb = null;
-
- IRI location = null;
- byte[] file = null; // If found, it takes precedence over location.
- String format = null;
- List<OWLOntologyID> aliases = new ArrayList<OWLOntologyID>();
-
- if (data.getFormFileParameterValues("file").length > 0) {
- file = data.getFormFileParameterValues("file")[0].getContent();
- }
- // else {
- if (data.getTextParameterValues("format").length > 0) {
- String value = data.getTextParameterValues("format")[0];
- if (!value.equals("auto")) {
- format = value;
- }
- }
- if (data.getTextParameterValues("url").length > 0) {
- String value = data.getTextParameterValues("url")[0];
- try {
- URI.create(value); // To throw 400 if malformed.
- location = IRI.create(value);
- } catch (Exception ex) {
- log.error("Malformed IRI for " + value, ex);
- throw new WebApplicationException(ex, BAD_REQUEST);
- }
- }
- if (data.getTextParameterValues("alias").length > 0) {
- for (String value : data.getTextParameterValues("alias")) {
- if (!"null".equals(value)) {
- try {
- aliases.add(OntologyUtils.decode(value));
- } catch (Exception ex) {
- log.error("Malformed public key for " + value, ex);
- throw new WebApplicationException(ex, BAD_REQUEST);
- }
- }
- }
- }
-
- log.debug("Parameters:");
- log.debug("file: {}", file);
- log.debug("url: {}", location);
- log.debug("format: {}", format);
- log.debug("alias: {}", aliases);
-
- // Then add the file
- OWLOntologyID key = null;
- if (file != null && file.length > 0) {
-
- /*
- * Because the ontology provider's load method could fail after
only one attempt without resetting
- * the stream, we might have to do that ourselves.
- */
- List<String> formats;
- if (format != null && !format.trim().isEmpty()) {
- formats = Collections.singletonList(format);
- } else // The RESTful API has its own list of preferred formats
- {
- formats = Arrays.asList(RDF_XML, TURTLE, X_TURTLE, N3,
N_TRIPLE, OWL_XML, FUNCTIONAL_OWL,
- MANCHESTER_OWL, RDF_JSON);
- }
- int unsupported = 0, failed = 0;
- Iterator<String> itf = formats.iterator();
- if (!itf.hasNext()) {
- throw new OntologyLoadingException("No suitable format found
or defined.");
- }
- do {
- String f = itf.next();
- try {
- // Re-instantiate the stream on every attempt
- InputStream content = new BufferedInputStream(new
ByteArrayInputStream(file));
- // ClerezzaOWLUtils.guessOntologyID(new
FileInputStream(file), Parser.getInstance(), f);
- OWLOntologyID guessed = OWLUtils.guessOntologyID(content,
Parser.getInstance(), f);
-
- if (guessed != null && !guessed.isAnonymous() &&
ontologyProvider.hasOntology(guessed)) {
- rb = Response.status(Status.CONFLICT);
- this.submitted = guessed;
- if
(headers.getAcceptableMediaTypes().contains(MediaType.TEXT_HTML_TYPE)) {
- rb.entity(new Viewable("/imports/409.ftl", this));
- rb.header(HttpHeaders.CONTENT_TYPE,
MediaType.TEXT_HTML + "; charset=utf-8");
- }
- break;
- } else {
- content = new BufferedInputStream(new
ByteArrayInputStream(file));
- key = ontologyProvider.loadInStore(content, f, true,
keys);
- }
- } catch (UnsupportedFormatException e) {
- log.warn(
- "POST method failed for media type {}. This should not
happen (should fail earlier)",
- headers.getMediaType());
- // rb = Response.status(UNSUPPORTED_MEDIA_TYPE);
- unsupported++;
- } catch (IOException e) {
- log.debug(">>> FAILURE format {} (I/O error)", f);
- failed++;
- } catch (Exception e) { // SAXParseException and others
- log.debug(">>> FAILURE format {} (parse error)", f);
- failed++;
- }
- } while ((key == null/* || key.isAnonymous() */) && itf.hasNext());
- if ((key == null || key.isAnonymous()) && rb == null) {
- if (failed > 0) {
- throw new WebApplicationException(BAD_REQUEST);
- } else if (unsupported > 0) {
- throw new WebApplicationException(UNSUPPORTED_MEDIA_TYPE);
- }
- }
- } else if (location != null) {
- try { // Here we try every format supported by the Java API
- key = ontologyProvider.loadInStore(location, null, true, keys);
- } catch (Exception e) {
- log.error("Failed to load ontology from " + location, e);
- throw new WebApplicationException(e, BAD_REQUEST);
- }
- } else if (!aliases.isEmpty()) // No content but there are aliases.
- {
- for (Origin<?> origin : keys) {
- if (origin.getReference() instanceof OWLOntologyID) {
- OWLOntologyID primary = ((OWLOntologyID)
origin.getReference());
- if (ontologyProvider.getStatus(primary) !=
org.apache.stanbol.ontologymanager.servicesapi.ontology.OntologyProvider.Status.NO_MATCH)
{
- for (OWLOntologyID alias : aliases) {
- try {
- if (ontologyProvider.addAlias(primary, alias)
&& key == null) {
- key = alias;
- }
- } catch (IllegalArgumentException ex) {
- log.warn("Cannot add alias");
- log.warn(" ... ontology key: {}", primary);
- log.warn(" ... alias: {}", alias);
- log.warn(" ... reason: ", ex);
- continue;
- }
- }
- }
- }
- }
- } else {
- log.error("Bad request");
- log.error(" file is: {}", file);
- throw new WebApplicationException(BAD_REQUEST);
- }
-
- if (key != null && !key.isAnonymous()) {
- String uri = OntologyUtils.encode(key);
- if (uri != null && !uri.isEmpty()) {
- rb = Response.ok();
- if
(headers.getAcceptableMediaTypes().contains(MediaType.TEXT_HTML_TYPE)) {
- rb.entity(new Viewable("index", this));
- rb.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML +
"; charset=utf-8");
- }
- } else {
- rb = Response.ok();
- }
- } else if (rb == null) {
- rb = Response.status(Status.INTERNAL_SERVER_ERROR);
- }
- return rb;
- }
-
- /**
- * Helper method to make sure a ResponseBuilder is created on every
conditions, so that it is then
- * possible to enable CORS on it afterwards.
- *
- * @param ontologyId
- * @return
- */
- protected ResponseBuilder performShowOntology(String ontologyId) {
- if (ontologyId == null || ontologyId.isEmpty()) {
- return Response.status(BAD_REQUEST);
- }
- OWLOntologyID key = OntologyUtils.decode(ontologyId);
- if (ontologyProvider.listOrphans().contains(key)) {
- return Response.status(NO_CONTENT);
- }
- OWLOntology o = getOWLOntology(ontologyId, false,
uriInfo.getRequestUri());
- if (o == null) {
- return Response.status(NOT_FOUND);
- }
- // try {
- Set<OntologyCollector> handles = new HashSet<OntologyCollector>();
- if (onManager != null) {
- for (Scope scope : onManager.getRegisteredScopes()) {
- if (scope.getCoreSpace().hasOntology(key)) {
- handles.add(scope.getCoreSpace());
- }
- if (scope.getCustomSpace().hasOntology(key)) {
- handles.add(scope.getCustomSpace());
- }
- }
- }
- if (sessionManager != null) {
- for (String sesId : sessionManager.getRegisteredSessionIDs()) {
- if (sessionManager.getSession(sesId).hasOntology(key)) {
- handles.add(sessionManager.getSession(sesId));
- }
- }
- }
- // ByteArrayOutputStream out = new ByteArrayOutputStream();
- // o.getOWLOntologyManager().saveOntology(o, new
ManchesterOWLSyntaxOntologyFormat(), out);
- return Response.ok(new Viewable("ontology",
- // new OntologyPrettyPrintResource(servletContext,
- // uriInfo, out)
- new OntologyStatsResource(uriInfo, key, o,
ontologyProvider.listAliases(key), handles)));
- // } catch (OWLOntologyStorageException e) {
- // throw new WebApplicationException(e, INTERNAL_SERVER_ERROR);
- // }
+ return Response.seeOther(URI.create("/ontonet")).build();
}
- @POST
- @Consumes({MULTIPART_FORM_DATA})
- @Produces({TEXT_HTML, TEXT_PLAIN, RDF_XML, TURTLE, X_TURTLE, N3})
- public Response postOntology(MultiPartBody data, @Context HttpHeaders
headers) {
- ResponseBuilder rb = performLoadOntology(data, headers);
- // rb.header(HttpHeaders.CONTENT_TYPE, TEXT_HTML + "; charset=utf-8");
- // addCORSOrigin(servletContext, rb, headers);
- return rb.build();
- }
-
- @GET
- @Path("/{ontologyId:.+}")
- @Produces(TEXT_HTML)
- public Response showOntology(@PathParam("ontologyId") String ontologyId,
- @Context HttpHeaders headers,
- @Context UriInfo uriInfo) {
- ResponseBuilder rb = performShowOntology(ontologyId);
- rb.header(HttpHeaders.CONTENT_TYPE, TEXT_HTML + "; charset=utf-8");
- // addCORSOrigin(servletContext, rb, headers);
- return rb.build();
- }
-
- /**
- * POSTs an ontology content as application/x-www-form-urlencoded
- *
- * @param content
- * @param headers
- * @return
- */
- @POST
- @Consumes(value = {RDF_XML, TURTLE, X_TURTLE, N3, N_TRIPLE, OWL_XML,
FUNCTIONAL_OWL, MANCHESTER_OWL,
- RDF_JSON})
- public Response storeOntology(InputStream content, @Context HttpHeaders
headers) {
- long before = System.currentTimeMillis();
- ResponseBuilder rb;
-
- MediaType mt = headers.getMediaType();
- if (RDF_XML_TYPE.equals(mt) || TURTLE_TYPE.equals(mt) ||
X_TURTLE_TYPE.equals(mt)
- || N3_TYPE.equals(mt) || N_TRIPLE_TYPE.equals(mt) ||
RDF_JSON_TYPE.equals(mt)) {
- OWLOntologyID key = null;
- try {
- key = ontologyProvider.loadInStore(content,
headers.getMediaType().toString(), true);
- rb = Response.ok();
- } catch (UnsupportedFormatException e) {
- log.warn(
- "POST method failed for media type {}. This should not
happen (should fail earlier)",
- headers.getMediaType());
- rb = Response.status(UNSUPPORTED_MEDIA_TYPE);
- } catch (IOException e) {
- throw new WebApplicationException(e, BAD_REQUEST);
- }
- // An exception should have been thrown earlier, but just in case.
- if (key == null || key.isAnonymous()) {
- rb = Response.status(Status.INTERNAL_SERVER_ERROR);
- }
- } else if (OWL_XML_TYPE.equals(mt) || FUNCTIONAL_OWL_TYPE.equals(mt)
- || MANCHESTER_OWL_TYPE.equals(mt)) {
- try {
- OntologyInputSource<OWLOntology> src = new
OntologyContentInputSource(content);
- ontologyProvider.loadInStore(src.getRootOntology(), true);
- rb = Response.ok();
- } catch (OWLOntologyCreationException e) {
- throw new WebApplicationException(e, INTERNAL_SERVER_ERROR);
- }
- } else {
- rb = Response.status(UNSUPPORTED_MEDIA_TYPE);
- }
-
- // addCORSOrigin(servletContext, rb, headers);
- Response r = rb.build();
- log.debug("POST request for ontology addition completed in {} ms with
status {}.",
- (System.currentTimeMillis() - before), r.getStatus());
- return r;
- }
-
- public class OntologyStatsResource extends ResultData {
-
- private Set<OntologyCollector> handles;
-
- private Set<OWLOntologyID> identifiers;
-
- private OWLOntology o;
-
- private UriInfo uriInfo;
-
- private OWLOntologyID submitted;
-
- public OntologyStatsResource(UriInfo uriInfo,
- OWLOntologyID key,
- OWLOntology o,
- Set<OWLOntologyID> identifiers,
- Set<OntologyCollector> handles) {
- // this.servletContext = context;
- this.uriInfo = uriInfo;
- this.submitted = key;
- this.o = o;
- this.identifiers = identifiers;
- this.handles = handles;
- }
-
- public Set<String> getAliases() {
- Set<String> aliases = new HashSet<String>();
- for (OWLOntologyID alias : identifiers)
- // if (!o.getOntologyID().equals(alias))
- aliases.add(OntologyUtils.encode(alias));
- return Collections.unmodifiableSet(aliases);
- }
-
- public Set<String> getScopeHandles() {
- Set<String> handles = new HashSet<String>();
- for (OntologyCollector handle : this.handles)
- if (handle instanceof OntologySpace)
handles.add(handle.getID());
- return handles;
- }
-
- public Set<String> getSessionHandles() {
- Set<String> handles = new HashSet<String>();
- for (OntologyCollector handle : this.handles)
- if (handle instanceof Session) handles.add(handle.getID());
- return handles;
- }
-
- public int getTotalAxioms() {
- return o.getAxiomCount();
- }
-
- public OWLOntologyID getRepresentedOntologyKey() {
- return submitted;
- }
-
- public String stringForm(OWLOntologyID ontologyID) {
- return OntologyUtils.encode(ontologyID);
- }
- }
}