Author: alexdma
Date: Tue Mar 27 09:34:13 2012
New Revision: 1305791
URL: http://svn.apache.org/viewvc?rev=1305791&view=rev
Log:
* HTML forms on /ontonet endpoint now fetch ontologies from URLs. Added table
of loaded ontologies (STANBOL-534)
* Added table of registered sessions in the /ontonet/session endpoint
Added:
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/util/
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/util/OntologyPrettyPrintResource.java
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/ontology.ftl
Removed:
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/StoredOntologyResource.java
Modified:
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProvider.java
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/util/OntologyUtils.java
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/OntologyManagerWebFragment.java
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource.java
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionManagerResource.java
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/index.ftl
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/webview.ftl
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/SessionManagerResource/index.ftl
Modified:
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProvider.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProvider.java?rev=1305791&r1=1305790&r2=1305791&view=diff
==============================================================================
---
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProvider.java
(original)
+++
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProvider.java
Tue Mar 27 09:34:13 2012
@@ -257,8 +257,7 @@ public interface OntologyProvider<S> {
* @throws UnsupportedFormatException
* if no parsers are able to parse the supplied format (or the
actual file format).
*/
- String loadInStore(IRI location, String formatIdentifier, String
preferredKey, boolean force) throws IOException,
-
UnsupportedFormatException;
+ String loadInStore(IRI location, String formatIdentifier, String
preferredKey, boolean force) throws IOException;
/**
* Stores an ontology that has already been loaded into an object. If the
object is of a non-native yet
Modified:
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java?rev=1305791&r1=1305790&r2=1305791&view=diff
==============================================================================
---
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java
(original)
+++
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java
Tue Mar 27 09:34:13 2012
@@ -92,9 +92,10 @@ public class ClerezzaOntologyProvider im
/**
* Internally, the Clerezza ontology provider uses a reserved graph to
store the associations between
- * ontology IDs/physical IRIs and graph names.
+ * ontology IDs/physical IRIs and graph names. This graph is wrapped into
an {@link OntologyToTcMapper}
+ * object.
*
- * @author alessandro
+ * @author alexdma
*
*/
private class OntologyToTcMapper {
@@ -151,7 +152,15 @@ public class ClerezzaOntologyProvider im
graph.add(tHasOiri);
}
+ /**
+ * Creates an {@link UriRef} out of an {@link OWLOntologyID}, so it
can be used as a storage key for
+ * the graph.
+ *
+ * @param ontologyReference
+ * @return
+ */
private UriRef buildResource(OWLOntologyID ontologyReference) {
+ // The UriRef is of the form ontologyIRI[/versionIRI] (TODO use
something less conventional?)
IRI ontologyIRI = ontologyReference.getOntologyIRI(), versionIri =
ontologyReference
.getVersionIRI();
UriRef entry = new UriRef(ontologyIRI.toString()
@@ -159,13 +168,21 @@ public class ClerezzaOntologyProvider im
return entry;
}
+ /**
+ * Creates an {@link OWLOntologyID} object by combining the
ontologyIRI and the versionIRI, where
+ * applicable, of the stored graph.
+ *
+ * @param resource
+ * the ontology
+ * @return
+ */
private OWLOntologyID buildOntologyId(UriRef resource) {
IRI oiri = null, viri = null;
Iterator<Triple> it = graph.filter(resource, new
UriRef(Vocabulary.HAS_ONTOLOGY_IRI), null);
if (it.hasNext()) {
Resource obj = it.next().getObject();
if (obj instanceof UriRef) oiri = IRI.create(((UriRef)
obj).getUnicodeString());
- }
+ } else return null; // Anonymous but versioned ontologies are not
acceptable.
it = graph.filter(resource, new
UriRef(Vocabulary.HAS_VERSION_IRI), null);
if (it.hasNext()) {
Resource obj = it.next().getObject();
@@ -573,7 +590,7 @@ public class ClerezzaOntologyProvider im
public String loadInStore(final IRI ontologyIri,
String formatIdentifier,
String preferredKey,
- boolean force) throws IOException,
UnsupportedFormatException {
+ boolean force) throws IOException {
log.debug("Loading {}", ontologyIri);
if (ontologyIri == null) throw new IllegalArgumentException("Ontology
IRI cannot be null.");
Modified:
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/util/OntologyUtils.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/util/OntologyUtils.java?rev=1305791&r1=1305790&r2=1305791&view=diff
==============================================================================
---
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/util/OntologyUtils.java
(original)
+++
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/util/OntologyUtils.java
Tue Mar 27 09:34:13 2012
@@ -16,6 +16,16 @@
*/
package org.apache.stanbol.ontologymanager.ontonet.impl.util;
+import static
org.apache.stanbol.commons.web.base.format.KRFormat.FUNCTIONAL_OWL;
+import static
org.apache.stanbol.commons.web.base.format.KRFormat.MANCHESTER_OWL;
+import static org.apache.stanbol.commons.web.base.format.KRFormat.N3;
+import static org.apache.stanbol.commons.web.base.format.KRFormat.N_TRIPLE;
+import static org.apache.stanbol.commons.web.base.format.KRFormat.OWL_XML;
+import static org.apache.stanbol.commons.web.base.format.KRFormat.RDF_JSON;
+import static org.apache.stanbol.commons.web.base.format.KRFormat.RDF_XML;
+import static org.apache.stanbol.commons.web.base.format.KRFormat.TURTLE;
+import static org.apache.stanbol.commons.web.base.format.KRFormat.X_TURTLE;
+
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
@@ -225,8 +235,9 @@ public class OntologyUtils {
*/
importIri = o.getOntologyID().getDefaultDocumentIRI();
} catch (Exception ex) {
- logger.error("KReS :: Exception caught during tree building.
Skipping import of ontology "
- + o.getOntologyID(), ex);
+ logger.error(
+ "Exception caught during tree building. Skipping import of
ontology " + o.getOntologyID(),
+ ex);
} finally {
/*
* It is still possible that an imported ontology is anonymous
but has no physical document
@@ -235,7 +246,7 @@ public class OntologyUtils {
* parent ontology, or else it is lost.
*/
if (o.isAnonymous() && importIri == null) {
- logger.warn("KReS :: [NONFATAL] Anonymous import target "
+ logger.warn("Anonymous import target "
+ o.getOntologyID()
+ " not mapped to physical IRI. Will add
extracted axioms to parent ontology.");
for (OWLImportsDeclaration im : o.getImportsDeclarations())
@@ -290,9 +301,8 @@ public class OntologyUtils {
}
- private static String[] preferredFormats = {"application/rdf+xml",
"application/rdf+json", "text/turtle",
- "text/rdf+n3", "text/rdf+nt",
"text/owl-manchester",
- "application/owl+xml"};
+ private static String[] preferredFormats = {RDF_XML, TURTLE, X_TURTLE,
RDF_JSON, N3, N_TRIPLE,
+ MANCHESTER_OWL,
FUNCTIONAL_OWL, OWL_XML};
public static List<String> getPreferredSupportedFormats(Collection<String>
supported) {
List<String> result = new ArrayList<String>();
Modified:
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/OntologyManagerWebFragment.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/OntologyManagerWebFragment.java?rev=1305791&r1=1305790&r2=1305791&view=diff
==============================================================================
---
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/OntologyManagerWebFragment.java
(original)
+++
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/OntologyManagerWebFragment.java
Tue Mar 27 09:34:13 2012
@@ -41,9 +41,8 @@ import org.apache.stanbol.ontologymanage
import
org.apache.stanbol.ontologymanager.web.resources.RegistryManagerResource;
import org.apache.stanbol.ontologymanager.web.resources.ScopeOntologyResource;
import org.apache.stanbol.ontologymanager.web.resources.ScopeResource;
-import org.apache.stanbol.ontologymanager.web.resources.SessionResource;
import org.apache.stanbol.ontologymanager.web.resources.SessionManagerResource;
-import org.apache.stanbol.ontologymanager.web.resources.StoredOntologyResource;
+import org.apache.stanbol.ontologymanager.web.resources.SessionResource;
import org.osgi.framework.BundleContext;
import org.osgi.service.component.ComponentContext;
@@ -51,7 +50,7 @@ import freemarker.cache.ClassTemplateLoa
import freemarker.cache.TemplateLoader;
/**
- * Implementation of WebFragment for the Stanbol Ontonet end-point.
+ * Implementation of WebFragment for the Stanbol Ontology Manager endpoint.
*
* @author alberto musetti
*
@@ -95,22 +94,22 @@ public class OntologyManagerWebFragment
@Override
public Set<Class<?>> getJaxrsResourceClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
- // Temporary resources
+
+ // Core resources
classes.add(OntoNetRootResource.class);
- // classes.add(RESTfulResource.class);
- // classes.add(StoredGraphsResource.class);
+ // Registry resources
+ classes.add(RegistryManagerResource.class);
+ // Scope resources
classes.add(OntologyNetworkResource.class);
classes.add(ScopeResource.class);
classes.add(ScopeOntologyResource.class);
- classes.add(StoredOntologyResource.class);
+ // Session resources
classes.add(SessionManagerResource.class);
classes.add(SessionResource.class);
- classes.add(RegistryManagerResource.class);
-
return classes;
}
Modified:
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource.java?rev=1305791&r1=1305790&r2=1305791&view=diff
==============================================================================
---
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource.java
(original)
+++
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource.java
Tue Mar 27 09:34:13 2012
@@ -16,10 +16,13 @@
*/
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.INTERNAL_SERVER_ERROR;
+import static javax.ws.rs.core.Response.Status.NOT_FOUND;
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;
@@ -41,17 +44,27 @@ import static org.apache.stanbol.commons
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.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
import javax.servlet.ServletContext;
import javax.ws.rs.Consumes;
+import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
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;
@@ -59,16 +72,36 @@ 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.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.TripleImpl;
import org.apache.clerezza.rdf.core.serializedform.UnsupportedFormatException;
+import org.apache.clerezza.rdf.ontologies.OWL;
+import org.apache.stanbol.commons.indexedgraph.IndexedMGraph;
import org.apache.stanbol.commons.web.base.ContextHelper;
import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
import
org.apache.stanbol.ontologymanager.ontonet.api.io.OntologyContentInputSource;
import org.apache.stanbol.ontologymanager.ontonet.api.io.OntologyInputSource;
import
org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyProvider;
+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.web.util.OntologyPrettyPrintResource;
+import org.coode.owlapi.turtle.TurtleOntologyFormat;
+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.OWLOntologyManager;
+import org.semanticweb.owlapi.model.OWLOntologyStorageException;
+import org.semanticweb.owlapi.model.RemoveImport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -79,6 +112,8 @@ import com.sun.jersey.multipart.FormData
import com.sun.jersey.multipart.FormDataMultiPart;
/**
+ * Provides the basic HTTP methods for storing and managing ontologies
regardless of them belonging to a
+ * specific network, scope or session.
*
* @author anuzzolese, alexdma
*
@@ -95,12 +130,116 @@ public class OntoNetRootResource extends
*/
protected OntologyProvider<?> ontologyProvider;
+ /*
+ * Placeholder for the OntologyProvider to be fetched from the servlet
context.
+ */
+ protected RegistryManager registryManager;
+
public OntoNetRootResource(@Context ServletContext servletContext) {
super();
- ontologyProvider = (OntologyProvider<?>)
ContextHelper.getServiceFromContext(OntologyProvider.class,
+ this.servletContext = servletContext;
+ this.ontologyProvider = (OntologyProvider<?>)
ContextHelper.getServiceFromContext(
+ OntologyProvider.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();
+ }
+
+ /*
+ * TODO before implementing removal, we need OWL dependency checks.
+ */
+ // @DELETE
+ // @Path("/{ontologyId:.+}")
+ public Response deleteOntology(@PathParam("ontologyId") String ontologyid,
@Context HttpHeaders headers) {
+ ResponseBuilder rb = Response.ok();
+ addCORSOrigin(servletContext, rb, headers);
+ return rb.build();
+ }
+
+ private MGraph getGraph(String ontologyId, boolean merged) {
+ IRI iri = IRI.create(ontologyId);
+ log.debug("Will try to retrieve ontology {} from provider.", iri);
+ /*
+ * 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(iri, MGraph.class,
merged);
+ } catch (Exception ex) {
+ log.warn("Retrieval of ontology with ID " + iri + " failed.", ex);
+ }
+
+ if (oTemp == 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 {
+ oTemp =
registryManager.getLibrary(smallest).getOntology(iri, MGraph.class);
+ } catch (RegistryContentException e) {
+ log.warn("The content of library " + smallest + " could
not be accessed.", e);
+ }
+ }
+ }
+
+ if (oTemp != null) o = new IndexedMGraph(oTemp);
+
+ if (o == null) {
+ log.debug("Ontology {} not found in any ontology provider or
library.", iri);
+ return null;
+ }
+
+ log.debug("Retrieved ontology {} .", iri);
+
+ // 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);
+ }
+ return o;
+ }
+
@GET
@Produces(TEXT_HTML)
public Response getHtmlInfo(@Context HttpHeaders headers) {
@@ -110,23 +249,147 @@ public class OntoNetRootResource extends
return rb.build();
}
+ @GET
+ @Path("/{ontologyId:.+}")
+ @Produces(value = {APPLICATION_JSON, N3, N_TRIPLE, RDF_JSON})
+ public Response getManagedGraph(@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);
+ else {
+ TripleCollection o = getGraph(ontologyId, merged);
+ 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 getManagedOntology(@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);
+ else {
+ OWLOntology o = getOntology(ontologyId, merged);
+ rb = o == null ? Response.status(NOT_FOUND) : Response.ok(o);
+ }
+ addCORSOrigin(servletContext, rb, headers);
+ return rb.build();
+ }
+
+ public Set<String> getOntologies() {
+ Set<String> filtered = new HashSet<String>();
+ for (String s : ontologyProvider.getKeys()) {
+ String s1 = s.split("::")[1];
+ if (s1 != null && !s1.isEmpty()) filtered.add(s1);
+ }
+ return filtered;
+ }
+
+ private OWLOntology getOntology(String ontologyId, boolean merge) {
+ IRI iri = 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 {
+ o = (OWLOntology) ontologyProvider.getStoredOntology(iri,
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 imports
+ String uri = uriInfo.getRequestUri().toString();
+ URI base = URI.create(uri.substring(0, uri.lastIndexOf(ontologyId) -
1));
+
+ // Rewrite import statements
+ List<OWLOntologyChange> changes = new ArrayList<OWLOntologyChange>();
+ OWLDataFactory df = o.getOWLOntologyManager().getOWLDataFactory();
+ /*
+ * TODO manage import rewrites better once the container ID is fully
configurable (i.e. instead of
+ * going upOne() add "session" or "ontology" if needed).
+ */
+ 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)));
+ }
+ o.getOWLOntologyManager().applyChanges(changes);
+ return o;
+ }
+
@POST
@Consumes({MULTIPART_FORM_DATA})
@Produces({TEXT_HTML, TEXT_PLAIN, RDF_XML, TURTLE, X_TURTLE, N3})
- public Response post(FormDataMultiPart data, @Context HttpHeaders headers)
{
-
+ public Response postOntology(FormDataMultiPart data, @Context HttpHeaders
headers) {
log.debug(" post(FormDataMultiPart data)");
ResponseBuilder rb;
- // In this case we setup the parameter from a multipart request
- File file = null;
+ IRI location = null;
+ File file = null; // If found, it takes precedence over location.
String format = null;
for (BodyPart bpart : data.getBodyParts()) {
log.debug("is a {}", bpart.getClass());
if (bpart instanceof FormDataBodyPart) {
FormDataBodyPart dbp = (FormDataBodyPart) bpart;
- if (dbp.getName().equals("file")) file =
bpart.getEntityAs(File.class);
- else if (dbp.getName().equals("format")) format =
dbp.getValue();
+ String name = dbp.getName();
+ if (name.equals("file")) file = bpart.getEntityAs(File.class);
+ else if (name.equals("format") &&
!dbp.getValue().equals("auto")) format = dbp.getValue();
+ else if (name.equals("url")) try {
+ URI.create(dbp.getValue()); // To throw 400 if malformed.
+ location = IRI.create(dbp.getValue());
+ } catch (Exception ex) {
+ log.error("Malformed IRI for " + dbp.getValue(), ex);
+ throw new WebApplicationException(ex, BAD_REQUEST);
+ }
}
}
// Then add the file
@@ -135,7 +398,6 @@ public class OntoNetRootResource extends
try {
InputStream content = new FileInputStream(file);
key = ontologyProvider.loadInStore(content, format, null,
true);
- rb = Response.ok();
} catch (UnsupportedFormatException e) {
log.warn(
"POST method failed for media type {}. This should not
happen (should fail earlier)",
@@ -144,14 +406,51 @@ public class OntoNetRootResource extends
} catch (IOException e) {
throw new WebApplicationException(e, INTERNAL_SERVER_ERROR);
}
+ } else if (location != null) {
+ try {
+ key = ontologyProvider.loadInStore(location, null, null, true);
+ } catch (Exception e) {
+ log.error("Failed to load ontology from " + location, e);
+ throw new WebApplicationException(e, BAD_REQUEST);
+ }
} else {
log.error("Bad request");
log.error(" file is: {}", file);
- throw new WebApplicationException(Response.Status.BAD_REQUEST);
+ throw new WebApplicationException(BAD_REQUEST);
}
- // An exception should have been thrown earlier, but just in case.
- if (key == null || key.isEmpty()) rb =
Response.status(Status.INTERNAL_SERVER_ERROR);
+
+ if (key != null && !key.isEmpty()) {
+ // FIXME ugly but will have to do for the time being
+ String uri = key.split("::")[1];
+ if (uri != null && !uri.isEmpty()) rb =
Response.seeOther(URI.create("/ontonet/" + uri));
+ else rb = Response.ok();
+ } else rb = Response.status(Status.INTERNAL_SERVER_ERROR);
+
// rb.header(HttpHeaders.CONTENT_TYPE, TEXT_HTML + "; charset=utf-8");
+ // FIXME return an appropriate response e.g. 303
+ addCORSOrigin(servletContext, rb, headers);
+ return rb.build();
+ }
+
+ @GET
+ @Path("/{ontologyId:.+}")
+ @Produces(TEXT_HTML)
+ public Response showOntology(@PathParam("ontologyId") String ontologyId,
@Context HttpHeaders headers) {
+ ResponseBuilder rb;
+ if (ontologyId == null || ontologyId.isEmpty()) rb =
Response.status(BAD_REQUEST);
+ else {
+ OWLOntology o = getOntology(ontologyId, false);
+ if (o == null) rb = Response.status(NOT_FOUND);
+ else try {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ o.getOWLOntologyManager().saveOntology(o, new
TurtleOntologyFormat(), out);
+ rb = Response.ok(new Viewable("ontology", new
OntologyPrettyPrintResource(servletContext,
+ uriInfo, out)));
+ } catch (OWLOntologyStorageException e) {
+ throw new WebApplicationException(e, INTERNAL_SERVER_ERROR);
+ }
+ }
+ rb.header(HttpHeaders.CONTENT_TYPE, TEXT_HTML + "; charset=utf-8");
addCORSOrigin(servletContext, rb, headers);
return rb.build();
}
@@ -166,7 +465,7 @@ public class OntoNetRootResource extends
@POST
@Consumes(value = {RDF_XML, TURTLE, X_TURTLE, N3, N_TRIPLE, OWL_XML,
FUNCTIONAL_OWL, MANCHESTER_OWL,
RDF_JSON})
- public Response storeGraph(InputStream content, @Context HttpHeaders
headers) {
+ public Response storeOntology(InputStream content, @Context HttpHeaders
headers) {
long before = System.currentTimeMillis();
ResponseBuilder rb;
@@ -205,15 +504,4 @@ public class OntoNetRootResource extends
(System.currentTimeMillis() - before), r.getStatus());
return r;
}
-
- /*
- * 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 remove(@Context HttpHeaders headers) {
- ResponseBuilder rb = Response.ok();
- addCORSOrigin(servletContext, rb, headers);
- return rb.build();
- }
}
Modified:
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionManagerResource.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionManagerResource.java?rev=1305791&r1=1305790&r2=1305791&view=diff
==============================================================================
---
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionManagerResource.java
(original)
+++
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionManagerResource.java
Tue Mar 27 09:34:13 2012
@@ -31,7 +31,9 @@ import static org.apache.stanbol.commons
import static org.apache.stanbol.commons.web.base.format.KRFormat.X_TURTLE;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import javax.servlet.ServletContext;
import javax.ws.rs.GET;
@@ -48,6 +50,7 @@ import javax.ws.rs.core.UriInfo;
import org.apache.stanbol.commons.web.base.ContextHelper;
import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
import org.apache.stanbol.commons.web.base.utils.MediaTypeUtil;
+import org.apache.stanbol.ontologymanager.ontonet.api.session.Session;
import org.apache.stanbol.ontologymanager.ontonet.api.session.SessionManager;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.AddAxiom;
@@ -85,6 +88,13 @@ public class SessionManagerResource exte
return rb.build();
}
+ public Set<Session> getSessions() {
+ Set<Session> result = new HashSet<Session>();
+ for (String id : sessionManager.getRegisteredSessionIDs())
+ result.add(sessionManager.getSession(id));
+ return result;
+ }
+
@GET
@Produces(value = {RDF_XML, OWL_XML, TURTLE, X_TURTLE, FUNCTIONAL_OWL,
MANCHESTER_OWL, RDF_JSON, N3,
N_TRIPLE, TEXT_PLAIN})
Added:
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/util/OntologyPrettyPrintResource.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/util/OntologyPrettyPrintResource.java?rev=1305791&view=auto
==============================================================================
---
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/util/OntologyPrettyPrintResource.java
(added)
+++
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/util/OntologyPrettyPrintResource.java
Tue Mar 27 09:34:13 2012
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.stanbol.ontologymanager.web.util;
+
+import javax.servlet.ServletContext;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
+
+/**
+ * This is a dummy resource to be used for human-readable HTML output.
+ *
+ * @author alexdma
+ *
+ */
+public class OntologyPrettyPrintResource extends BaseStanbolResource {
+
+ private Object result;
+
+ public OntologyPrettyPrintResource(ServletContext context, UriInfo
uriInfo, Object result) {
+ this.result = result;
+ this.servletContext = context;
+ this.uriInfo = uriInfo;
+ }
+
+ public Object getResult() {
+ return this.result;
+ }
+
+}
Modified:
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/index.ftl
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/index.ftl?rev=1305791&r1=1305790&r2=1305791&view=diff
==============================================================================
---
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/index.ftl
(original)
+++
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/index.ftl
Tue Mar 27 09:34:13 2012
@@ -19,6 +19,11 @@
<#escape x as x?html>
<@common.page title="Apache Stanbol OntoNet" hasrestapi=true>
+
+ <p>
+ Stanbol OntoNet implements the API section for managing OWL/OWL2 ontologies,
in order to prepare them for consumption by reasoning services, refactorers,
rule engines and the like. Once loaded internally from their remote or local
resources, ontologies live and are known within the realm they were loaded in.
This allows loose-coupling and (de-)activation of ontologies in order to scale
the data sets for reasoners to process and optimize them for efficiency.
+ </p>
+
<span style="font-style:italic">From here you can reach the following
sub-endpoints:</span>
<ul>
<li><a href="${it.publicBaseUri}ontonet/ontology" title="Apache
Stanbol OntoNet Scope Manager">Scope Manager</a></li>
Added:
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/ontology.ftl
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/ontology.ftl?rev=1305791&view=auto
==============================================================================
---
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/ontology.ftl
(added)
+++
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/ontology.ftl
Tue Mar 27 09:34:13 2012
@@ -0,0 +1,26 @@
+<#--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<#import "/imports/common.ftl" as common>
+<#escape x as x?html>
+<@common.page title="Ontology Manager : Ontology Detail" hasrestapi=false>
+ <div class="panel">
+<pre>
+${it.result}
+</pre>
+ </div>
+ </@common.page>
+</#escape>
\ No newline at end of file
Modified:
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/webview.ftl
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/webview.ftl?rev=1305791&r1=1305790&r2=1305791&view=diff
==============================================================================
---
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/webview.ftl
(original)
+++
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/webview.ftl
Tue Mar 27 09:34:13 2012
@@ -14,16 +14,15 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<p>
- Stanbol OntoNet implements the API section for managing OWL and OWL2
ontologies, in order to prepare them for consumption by reasoning services,
refactorers, rule engines and the like. Ontology management in ONM is sparse
and not connected: once loaded internally from their remote locations,
ontologies live and are known within the realm they were loaded in. This allows
loose-coupling and (de-)activation of ontologies in order to scale the data
sets for reasoners to process and optimize them for efficiency.
-
- <h3>Submit a new ontology</h3>
+
+ <h3>Load an ontology</h3>
<form method="POST" enctype="multipart/form-data" accept-charset="utf-8">
<fieldset>
- <legend>Submit an ontology from a local file</legend>
+ <legend>From a local file</legend>
<p><b>File:</b> <input type="file" name="file"/>
Input format:
<select name="format">
+ <option value="auto">Auto</option>
<option value="application/rdf+xml">RDF/XML</option>
<option value="application/rdf+json">RDF/JSON</option>
<option value="text/turtle">Turtle</option>
@@ -40,8 +39,39 @@
</fieldset>
</form>
+ <form method="POST" enctype="multipart/form-data" accept-charset="utf-8">
+ <fieldset>
+ <legend>From a URL</legend>
+ <p>
+ <b>URL:</b> <input type="text" name="url" size="80" value="http://"/>
+ <input type="submit" value="Fetch"/>
+ </p>
+ </fieldset>
+ </form>
+
+ Note: OWL import targets will be included. Ontology loading is set to fail
on missing imports.
+
+ <h3>Stored ontologies</h3>
+ <#assign ontologies = it.ontologies>
+ <div class="storeContents">
+ <table id="allOntologies">
+ <div>
+ <tr>
+ <th>Name</th>
+ </tr>
+ <#list it.ontologies as ontology>
+ <tr>
+ <td><a
href="${it.publicBaseUri}ontonet/${ontology}">${ontology}</a></td>
+ </tr>
+ </#list>
+ </div>
+ </table> <!-- allScopes -->
+ </div>
+
+ <hr>
- The following concepts have been introduced with the ONM:
+ <p>
+ The following concepts have been introduced along with the Ontology Network
Manager:
<ul>
<li>
<u><em>Scope</em></u>: a "logical realm" for all the ontologies that
encompass a certain CMS-related set of concepts (such as "User", "ACL",
"Event", "Content", "Domain", "Reengineering", "Community", "Travelling" etc.).
Scopes never inherit from each other, though they can load the same ontologies
if need be.
@@ -53,4 +83,4 @@
<em><u>Session</u></em>: a collector of volatile semantic data, not
intended for persistent storage. Sessions can be used for stateful management
of ontology networks. It is not equivalent to an HTTP session (since it can
live persistently across multiple HTTP sessions), although its behaviour can
reflect the one of the HTTP session that created it, if required by the
implementation.
</li>
</ul>
-</p>
+ </p>
Modified:
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/SessionManagerResource/index.ftl
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/SessionManagerResource/index.ftl?rev=1305791&r1=1305790&r2=1305791&view=diff
==============================================================================
---
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/SessionManagerResource/index.ftl
(original)
+++
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/SessionManagerResource/index.ftl
Tue Mar 27 09:34:13 2012
@@ -21,8 +21,35 @@
<@common.page title="Apache Stanbol OntoNet session manager"
hasrestapi=false>
<div class="panel" id="webview">
- <p>This is the start page of the ontology session manager.</p>
- </div>
+ <#assign sessions = it.sessions>
+ <p>This is the start page of the Session Manager.</p>
+
+ <div class="storeContents">
+ <table id="allSessions">
+ <div>
+ <tr>
+ <th></th>
+ <th>Name</th>
+ <th>Status</th>
+ <th>Comment <#--TODO: fix image path <img
src="${it.staticRootUrl}/contenthub/images/rdf.png" alt="Format: RDF"/> --></th>
+ <th>#Ontologies</th>
+ </tr>
+ <#list sessions as session>
+ <tr>
+ <td>
+ <img
src="${it.staticRootUrl}/contenthub/images/edit_icon_16.png" title="(not
available yet) Edit this item" />
+ <img
src="${it.staticRootUrl}/contenthub/images/delete_icon_16.png" title="(not
available yet) Delete this item" />
+ </td>
+ <td><a href="${session.namespace}${session.ID}"
title="${session.ID}">${session.ID}</a></td>
+ <td>${session.locked?string("locked", "modifiable")}</td>
+ <td></td>
+ <td>${session.ontologyCount}</td>
+ </tr>
+ </#list>
+ </div>
+ </table> <!-- allSessions -->
+ </div>
+ </div> <!-- web view -->
<hr>
<#include "/imports/inc_sessionmgr.ftl">