You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by al...@apache.org on 2012/09/25 17:03:27 UTC
svn commit: r1389901 [2/2] - in /stanbol/trunk:
commons/owl/src/main/java/org/apache/stanbol/commons/owl/
commons/owl/src/main/java/org/apache/stanbol/commons/owl/util/
contrib/reengineer/web/
ontologymanager/ontonet/src/main/java/org/apache/stanbol/on...
Modified: stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/MGraphNetworkMultiplexer.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/MGraphNetworkMultiplexer.java?rev=1389901&r1=1389900&r2=1389901&view=diff
==============================================================================
--- stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/MGraphNetworkMultiplexer.java (original)
+++ stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/MGraphNetworkMultiplexer.java Tue Sep 25 15:03:26 2012
@@ -17,14 +17,22 @@
package org.apache.stanbol.ontologymanager.ontonet.impl.clerezza;
import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.APPENDED_TO_URIREF;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.DEPENDS_ON_URIREF;
import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.ENTRY_URIREF;
import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.HAS_APPENDED_URIREF;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.HAS_DEPENDENT_URIREF;
import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.HAS_ONTOLOGY_IRI_URIREF;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.HAS_SPACE_CORE_URIREF;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.HAS_SPACE_CUSTOM_URIREF;
import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.HAS_VERSION_IRI_URIREF;
import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.IS_MANAGED_BY_URIREF;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.IS_SPACE_CORE_OF_URIREF;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.IS_SPACE_CUSTOM_OF_URIREF;
import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.MANAGES_URIREF;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.SCOPE_URIREF;
import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.SESSION_URIREF;
import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.SIZE_IN_TRIPLES_URIREF;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.SPACE_URIREF;
import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary._NS_STANBOL_INTERNAL;
import java.util.HashSet;
@@ -34,18 +42,25 @@ import java.util.Set;
import org.apache.clerezza.rdf.core.Literal;
import org.apache.clerezza.rdf.core.LiteralFactory;
import org.apache.clerezza.rdf.core.MGraph;
+import org.apache.clerezza.rdf.core.NonLiteral;
import org.apache.clerezza.rdf.core.Resource;
import org.apache.clerezza.rdf.core.Triple;
import org.apache.clerezza.rdf.core.TypedLiteral;
import org.apache.clerezza.rdf.core.UriRef;
import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.rdf.ontologies.OWL;
import org.apache.clerezza.rdf.ontologies.RDF;
+import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
import org.apache.stanbol.ontologymanager.ontonet.api.collector.OntologyCollector;
import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyNetworkMultiplexer;
import org.apache.stanbol.ontologymanager.ontonet.api.scope.OntologyScope;
import org.apache.stanbol.ontologymanager.ontonet.api.scope.OntologySpace;
+import org.apache.stanbol.ontologymanager.ontonet.api.scope.OntologySpace.SpaceType;
import org.apache.stanbol.ontologymanager.ontonet.api.session.Session;
import org.apache.stanbol.ontologymanager.ontonet.api.session.SessionEvent;
+import org.apache.stanbol.ontologymanager.ontonet.api.session.SessionManager;
+import org.apache.stanbol.ontologymanager.ontonet.impl.ONManagerImpl;
+import org.apache.stanbol.ontologymanager.ontonet.impl.session.SessionManagerImpl;
import org.apache.stanbol.ontologymanager.ontonet.impl.util.OntologyUtils;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLOntologyID;
@@ -178,6 +193,171 @@ public class MGraphNetworkMultiplexer im
}
+ private void checkHandle(UriRef candidate, Set<OntologyCollector> handles) {
+
+ /*
+ * We have to do it like this because we cannot make this class a Component and reference ONManager
+ * and SessionManager, otherwise an activation cycle will occur.
+ */
+ ONManager scopeManager = ONManagerImpl.get();
+ SessionManager sessionManager = SessionManagerImpl.get();
+ String prefix_scope = _NS_STANBOL_INTERNAL + OntologyScope.shortName + "/", prefix_session = _NS_STANBOL_INTERNAL
+ + Session.shortName
+ + "/";
+
+ // TODO check when not explicitly typed.
+ SpaceType spaceType;
+ if (meta.contains(new TripleImpl(candidate, RDF.type, SPACE_URIREF))) {
+ Resource rScope;
+ Iterator<Triple> parentSeeker = meta.filter(candidate, IS_SPACE_CORE_OF_URIREF, null);
+ if (parentSeeker.hasNext()) {
+ rScope = parentSeeker.next().getObject();
+ spaceType = SpaceType.CORE;
+ } else {
+ parentSeeker = meta.filter(candidate, IS_SPACE_CUSTOM_OF_URIREF, null);
+ if (parentSeeker.hasNext()) {
+ rScope = parentSeeker.next().getObject();
+ spaceType = SpaceType.CUSTOM;
+ } else {
+ parentSeeker = meta.filter(null, HAS_SPACE_CORE_URIREF, candidate);
+ if (parentSeeker.hasNext()) {
+ rScope = parentSeeker.next().getSubject();
+ spaceType = SpaceType.CORE;
+ } else {
+ parentSeeker = meta.filter(null, HAS_SPACE_CUSTOM_URIREF, candidate);
+ if (parentSeeker.hasNext()) {
+ rScope = parentSeeker.next().getSubject();
+ spaceType = SpaceType.CUSTOM;
+ } else throw new InvalidMetaGraphStateException("Ontology space " + candidate
+ + " does not declare a parent scope.");
+ }
+ }
+ }
+ if (!(rScope instanceof UriRef)) throw new InvalidMetaGraphStateException(
+ rScope + " is not a legal scope identifier.");
+ String scopeId = ((UriRef) rScope).getUnicodeString().substring(prefix_scope.length());
+ OntologyScope scope = scopeManager.getScope(scopeId);
+ switch (spaceType) {
+ case CORE:
+ handles.add(scope.getCoreSpace());
+ break;
+ case CUSTOM:
+ handles.add(scope.getCustomSpace());
+ break;
+ }
+ } else if (meta.contains(new TripleImpl(candidate, RDF.type, SESSION_URIREF))) {
+ String sessionId = ((UriRef) candidate).getUnicodeString().substring(prefix_session.length());
+ handles.add(sessionManager.getSession(sessionId));
+ }
+ }
+
+ @Override
+ public void clearDependencies(OWLOntologyID dependent) {
+ if (dependent == null) throw new IllegalArgumentException("dependent cannot be null");
+ log.debug("Clearing dependencies for {}", dependent);
+
+ Set<Triple> dependencies = new HashSet<Triple>();
+ synchronized (meta) {
+ Set<OWLOntologyID> aliases = listAliases(dependent);
+ aliases.add(dependent);
+ for (OWLOntologyID depalias : aliases) {
+ UriRef dep = buildResource(depalias);
+ Iterator<Triple> it = meta.filter(dep, DEPENDS_ON_URIREF, null);
+ while (it.hasNext()) {
+ Triple t = it.next();
+ dependencies.add(t);
+ log.debug(" ... Set {} as a dependency to remove.", t.getObject());
+ }
+ it = meta.filter(null, HAS_DEPENDENT_URIREF, dep);
+ while (it.hasNext()) {
+ Triple t = it.next();
+ dependencies.add(t);
+ log.debug(" ... Set {} as a dependency to remove.", t.getSubject());
+ }
+ }
+ meta.removeAll(dependencies);
+ }
+ log.debug(" ... DONE clearing dependencies.");
+ }
+
+ @Override
+ public Set<OWLOntologyID> getDependencies(OWLOntologyID dependent) {
+ Set<OWLOntologyID> dependencies = new HashSet<OWLOntologyID>();
+ log.debug("Getting dependencies for {}", dependent);
+ synchronized (meta) {
+ Set<OWLOntologyID> aliases = listAliases(dependent);
+ aliases.add(dependent);
+ for (OWLOntologyID depalias : aliases) {
+ UriRef dep = buildResource(depalias);
+ Iterator<Triple> it = meta.filter(dep, DEPENDS_ON_URIREF, null);
+ while (it.hasNext()) {
+ Resource obj = it.next().getObject();
+ log.debug(" ... found {} (inverse).", obj);
+ if (obj instanceof UriRef) dependencies.add(buildPublicKey((UriRef) obj));
+ else log.warn(" ... Unexpected literal value!");
+ }
+ it = meta.filter(null, HAS_DEPENDENT_URIREF, dep);
+ while (it.hasNext()) {
+ Resource sub = it.next().getSubject();
+ log.debug(" ... found {} (inverse).", sub);
+ if (sub instanceof UriRef) dependencies.add(buildPublicKey((UriRef) sub));
+ else log.warn(" ... Unexpected literal value!");
+ }
+ }
+ }
+ return dependencies;
+ }
+
+ @Override
+ public Set<OWLOntologyID> getDependents(OWLOntologyID dependency) {
+ Set<OWLOntologyID> dependents = new HashSet<OWLOntologyID>();
+ UriRef dep = buildResource(dependency);
+ log.debug("Getting depents for {}", dependency);
+ synchronized (meta) {
+ Iterator<Triple> it = meta.filter(null, DEPENDS_ON_URIREF, dep);
+ while (it.hasNext()) {
+ Resource sub = it.next().getSubject();
+ log.debug(" ... found {} (inverse).", sub);
+ if (sub instanceof UriRef) dependents.add(buildPublicKey((UriRef) sub));
+ else log.warn(" ... Unexpected literal value!");
+ }
+ it = meta.filter(dep, HAS_DEPENDENT_URIREF, null);
+ while (it.hasNext()) {
+ Resource obj = it.next().getObject();
+ log.debug(" ... found {} (inverse).", obj);
+ if (obj instanceof UriRef) dependents.add(buildPublicKey((UriRef) obj));
+ else log.warn(" ... Unexpected literal value!");
+ }
+ }
+ return dependents;
+ }
+
+ @Override
+ public Set<OntologyCollector> getHandles(OWLOntologyID publicKey) {
+ Set<OntologyCollector> handles = new HashSet<OntologyCollector>();
+ Set<OWLOntologyID> aliases = listAliases(publicKey);
+ aliases.add(publicKey);
+ for (OWLOntologyID alias : aliases) {
+ UriRef ontologyId = buildResource(alias);
+
+ for (Iterator<Triple> it = meta.filter(null, MANAGES_URIREF, ontologyId); it.hasNext();) {
+ NonLiteral sub = it.next().getSubject();
+ if (sub instanceof UriRef) checkHandle((UriRef) sub, handles);
+ else throw new InvalidMetaGraphStateException(
+ sub + " is not a valid ontology collector identifer.");
+ }
+
+ for (Iterator<Triple> it = meta.filter(ontologyId, IS_MANAGED_BY_URIREF, null); it.hasNext();) {
+ Resource obj = it.next().getObject();
+ if (obj instanceof UriRef) checkHandle((UriRef) obj, handles);
+ else throw new InvalidMetaGraphStateException(
+ obj + " is not a valid ontology collector identifer.");
+ }
+ }
+ return handles;
+ // throw new UnsupportedOperationException("Not implemented yet.");
+ }
+
private UriRef getIRIforScope(String scopeId) {
// Use the Stanbol-internal namespace, so that the whole configuration can be ported.
return new UriRef(_NS_STANBOL_INTERNAL + OntologyScope.shortName + "/" + scopeId);
@@ -188,6 +368,11 @@ public class MGraphNetworkMultiplexer im
return new UriRef(_NS_STANBOL_INTERNAL + Session.shortName + "/" + session.getID());
}
+ private UriRef getIRIforSpace(OntologySpace space) {
+ // Use the Stanbol-internal namespace, so that the whole configuration can be ported.
+ return new UriRef(_NS_STANBOL_INTERNAL + OntologySpace.shortName + "/" + space.getID());
+ }
+
@Override
public OWLOntologyID getPublicKey(String stringForm) {
if (stringForm == null || stringForm.trim().isEmpty()) throw new IllegalArgumentException(
@@ -225,6 +410,27 @@ public class MGraphNetworkMultiplexer im
return 0;
}
+ /*
+ * XXX see if we can use reasoners, either live or by caching materialisations.
+ */
+ protected Set<OWLOntologyID> listAliases(OWLOntologyID publicKey) {
+ if (publicKey == null || publicKey.isAnonymous()) throw new IllegalArgumentException(
+ "Cannot locate aliases for null or anonymous public keys.");
+ Set<OWLOntologyID> aliases = new HashSet<OWLOntologyID>();
+ UriRef ont = buildResource(publicKey);
+ // Forwards
+ for (Iterator<Triple> it = meta.filter(ont, OWL.sameAs, null); it.hasNext();) {
+ Resource r = it.next().getObject();
+ if (r instanceof UriRef) aliases.add(buildPublicKey((UriRef) r));
+ }
+ // Backwards
+ for (Iterator<Triple> it = meta.filter(null, OWL.sameAs, ont); it.hasNext();) {
+ Resource r = it.next().getSubject();
+ if (r instanceof UriRef) aliases.add(buildPublicKey((UriRef) r));
+ }
+ return aliases;
+ }
+
@Override
public void onOntologyAdded(OntologyCollector collector, OWLOntologyID addedOntology) {
// When the ontology provider hears an ontology has been added to a collector, it has to register this
@@ -290,6 +496,7 @@ public class MGraphNetworkMultiplexer im
@Override
public void onOntologyRemoved(OntologyCollector collector, OWLOntologyID removedOntology) {
+
log.info("Heard removal of ontology {} from collector {}", removedOntology, collector.getID());
String colltype = "";
@@ -297,41 +504,76 @@ public class MGraphNetworkMultiplexer im
else if (collector instanceof OntologySpace) colltype = OntologySpace.shortName + "/";
else if (collector instanceof Session) colltype = Session.shortName + "/";
UriRef c = new UriRef(_NS_STANBOL_INTERNAL + colltype + collector.getID());
- UriRef u =
- // new UriRef(prefix + "::" + keymap.buildResource(removedOntology).getUnicodeString());
- // keymap.getMapping(removedOntology);
- buildResource(removedOntology);
- // XXX condense the following code
+ Set<OWLOntologyID> aliases = listAliases(removedOntology);
+ aliases.add(removedOntology);
boolean badState = true;
+ for (OWLOntologyID alias : aliases) {
+ UriRef u = buildResource(alias);
+ // XXX condense the following code
+
+ log.debug("Checking ({},{}) pattern", c, u);
+ for (Iterator<Triple> it = meta.filter(c, null, u); it.hasNext();) {
+ UriRef property = it.next().getPredicate();
+ if (collector instanceof OntologySpace || collector instanceof Session) {
+ if (property.equals(MANAGES_URIREF)) badState = false;
+ }
+ }
- log.debug("Checking ({},{}) pattern", c, u);
- for (Iterator<Triple> it = meta.filter(c, null, u); it.hasNext();) {
- UriRef property = it.next().getPredicate();
- if (collector instanceof OntologySpace || collector instanceof Session) {
- if (property.equals(MANAGES_URIREF)) badState = false;
+ log.debug("Checking ({},{}) pattern", u, c);
+ for (Iterator<Triple> it = meta.filter(u, null, c); it.hasNext();) {
+ UriRef property = it.next().getPredicate();
+ if (collector instanceof OntologySpace || collector instanceof Session) {
+ if (property.equals(IS_MANAGED_BY_URIREF)) badState = false;
+ }
}
- }
- log.debug("Checking ({},{}) pattern", u, c);
- for (Iterator<Triple> it = meta.filter(u, null, c); it.hasNext();) {
- UriRef property = it.next().getPredicate();
- if (collector instanceof OntologySpace || collector instanceof Session) {
- if (property.equals(IS_MANAGED_BY_URIREF)) badState = false;
+ synchronized (meta) {
+ if (collector instanceof OntologySpace || collector instanceof Session) {
+ meta.remove(new TripleImpl(c, MANAGES_URIREF, u));
+ meta.remove(new TripleImpl(u, IS_MANAGED_BY_URIREF, c));
+ }
}
}
-
if (badState) throw new InvalidMetaGraphStateException(
- "No relationship found for ontology-collector pair {" + u + " , " + c + "}");
+ "No relationship found between ontology collector " + c + " and stored ontology "
+ + removedOntology + " (or its aliases).");
+
+ }
+ @Override
+ public void removeDependency(OWLOntologyID dependent, OWLOntologyID dependency) {
+ if (dependent == null) throw new IllegalArgumentException("dependent cannot be null");
+ if (dependency == null) throw new IllegalArgumentException("dependency cannot be null");
+ log.debug("Removing dependency.");
+ log.debug(" ... dependent : {}", dependent);
+ log.debug(" ... dependency : {}", dependency);
+ UriRef depy = buildResource(dependency);
synchronized (meta) {
- if (collector instanceof OntologySpace) {
- meta.remove(new TripleImpl(c, MANAGES_URIREF, u));
- meta.remove(new TripleImpl(u, IS_MANAGED_BY_URIREF, c));
+ Set<OWLOntologyID> aliases = listAliases(dependent);
+ aliases.add(dependent);
+ for (OWLOntologyID depalias : aliases) {
+ UriRef dep = buildResource(depalias);
+ Triple t = new TripleImpl(dep, DEPENDS_ON_URIREF, depy);
+ boolean found = false;
+ if (meta.contains(t)) {
+ found = true;
+ meta.remove(t);
+ }
+ t = new TripleImpl(depy, HAS_DEPENDENT_URIREF, dep);
+ if (meta.contains(t)) {
+ found = true;
+ meta.remove(t);
+ }
+ if (!found) log.warn("No such dependency found.");
+ else log.debug("DONE removing dependency.");
}
}
}
@Override
+ public void scopeActivated(OntologyScope scope) {}
+
+ @Override
public void scopeAppended(Session session, String scopeId) {
final UriRef sessionur = getIRIforSession(session), scopeur = getIRIforScope(scopeId);
if (sessionur == null || scopeur == null) throw new IllegalArgumentException(
@@ -343,6 +585,12 @@ public class MGraphNetworkMultiplexer im
}
@Override
+ public void scopeCreated(OntologyScope scope) {}
+
+ @Override
+ public void scopeDeactivated(OntologyScope scope) {}
+
+ @Override
public void scopeDetached(Session session, String scopeId) {
final UriRef sessionur = getIRIforSession(session), scopeur = getIRIforScope(scopeId);
if (sessionur == null || scopeur == null) throw new IllegalArgumentException(
@@ -355,6 +603,16 @@ public class MGraphNetworkMultiplexer im
}
@Override
+ public void scopeRegistered(OntologyScope scope) {
+ updateScopeRegistration(scope);
+ }
+
+ @Override
+ public void scopeUnregistered(OntologyScope scope) {
+ updateScopeUnregistration(scope);
+ }
+
+ @Override
public void sessionChanged(SessionEvent event) {
switch (event.getOperationType()) {
case CREATE:
@@ -368,6 +626,94 @@ public class MGraphNetworkMultiplexer im
}
}
+ @Override
+ public void setDependency(OWLOntologyID dependent, OWLOntologyID dependency) {
+ if (dependent == null) throw new IllegalArgumentException("dependent cannot be null");
+ if (dependency == null) throw new IllegalArgumentException("dependency cannot be null");
+ log.debug("Setting dependency.");
+ log.debug(" ... dependent : {}", dependent);
+ log.debug(" ... dependency : {}", dependency);
+ UriRef dep = buildResource(dependent), depy = buildResource(dependency);
+ // TODO check for the actual resource!
+ synchronized (meta) {
+ meta.add(new TripleImpl(dep, DEPENDS_ON_URIREF, depy));
+ }
+ log.debug("DONE setting dependency.");
+ }
+
+ /**
+ * Write registration info for a new ontology scope and its spaces.
+ *
+ * @param scope
+ * the scope whose information needs to be updated.
+ */
+ private void updateScopeRegistration(OntologyScope scope) {
+ final UriRef scopeur = getIRIforScope(scope.getID());
+ final UriRef coreur = getIRIforSpace(scope.getCoreSpace());
+ final UriRef custur = getIRIforSpace(scope.getCustomSpace());
+ // If this method was called after a scope rebuild, the following will have little to no effect.
+ synchronized (meta) {
+ // Spaces are created along with the scope, so it is safe to add their triples.
+ meta.add(new TripleImpl(scopeur, RDF.type, SCOPE_URIREF));
+ meta.add(new TripleImpl(coreur, RDF.type, SPACE_URIREF));
+ meta.add(new TripleImpl(custur, RDF.type, SPACE_URIREF));
+ meta.add(new TripleImpl(scopeur, HAS_SPACE_CORE_URIREF, coreur));
+ meta.add(new TripleImpl(scopeur, HAS_SPACE_CUSTOM_URIREF, custur));
+ // Add inverse predicates so we can traverse the graph in both directions.
+ meta.add(new TripleImpl(coreur, IS_SPACE_CORE_OF_URIREF, scopeur));
+ meta.add(new TripleImpl(custur, IS_SPACE_CUSTOM_OF_URIREF, scopeur));
+ }
+ log.debug("Ontology collector information triples added for scope \"{}\".", scope);
+ }
+
+ /**
+ * Remove all information on a deregistered ontology scope and its spaces.
+ *
+ * @param scope
+ * the scope whose information needs to be updated.
+ */
+ private void updateScopeUnregistration(OntologyScope scope) {
+ long before = System.currentTimeMillis();
+ boolean removable = false, conflict = false;
+ final UriRef scopeur = getIRIforScope(scope.getID());
+ final UriRef coreur = getIRIforSpace(scope.getCoreSpace());
+ final UriRef custur = getIRIforSpace(scope.getCustomSpace());
+ Set<Triple> removeUs = new HashSet<Triple>();
+ for (Iterator<Triple> it = meta.filter(scopeur, null, null); it.hasNext();) {
+ Triple t = it.next();
+ if (RDF.type.equals(t.getPredicate())) {
+ if (SCOPE_URIREF.equals(t.getObject())) removable = true;
+ else conflict = true;
+ }
+ removeUs.add(t);
+ }
+ if (!removable) {
+ log.error("Cannot write scope deregistration to persistence:");
+ log.error("-- resource {}", scopeur);
+ log.error("-- is not typed as a {} in the meta-graph.", SCOPE_URIREF);
+ } else if (conflict) {
+ log.error("Conflict upon scope deregistration:");
+ log.error("-- resource {}", scopeur);
+ log.error("-- has incompatible types in the meta-graph.");
+ } else {
+ log.debug("Removing all triples for scope \"{}\".", scope.getID());
+ Iterator<Triple> it;
+ for (it = meta.filter(null, null, scopeur); it.hasNext();)
+ removeUs.add(it.next());
+ for (it = meta.filter(null, null, coreur); it.hasNext();)
+ removeUs.add(it.next());
+ for (it = meta.filter(coreur, null, null); it.hasNext();)
+ removeUs.add(it.next());
+ for (it = meta.filter(null, null, custur); it.hasNext();)
+ removeUs.add(it.next());
+ for (it = meta.filter(custur, null, null); it.hasNext();)
+ removeUs.add(it.next());
+ meta.removeAll(removeUs);
+ log.debug("Done; removed {} triples in {} ms.", removeUs.size(), System.currentTimeMillis()
+ - before);
+ }
+ }
+
private void updateSessionRegistration(Session session) {
final UriRef sesur = getIRIforSession(session);
// If this method was called after a session rebuild, the following will have little to no effect.
@@ -412,9 +758,4 @@ public class MGraphNetworkMultiplexer im
}
}
- @Override
- public Set<OntologyCollector> getHandles(OWLOntologyID publicKey) {
- throw new UnsupportedOperationException("Not implemented yet.");
- }
-
}
Modified: stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ontology/OntologyScopeImpl.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ontology/OntologyScopeImpl.java?rev=1389901&r1=1389900&r2=1389901&view=diff
==============================================================================
--- stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ontology/OntologyScopeImpl.java (original)
+++ stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ontology/OntologyScopeImpl.java Tue Sep 25 15:03:26 2012
@@ -64,7 +64,8 @@ import org.slf4j.LoggerFactory;
* @author alexdma
*
*/
-public class OntologyScopeImpl implements OntologyScope, OntologyCollectorListener {
+public class OntologyScopeImpl /* TODO extends AbstractOntologyCollectorImpl */implements OntologyScope,
+ OntologyCollectorListener {
/**
* The core ontology space for this scope, always set as default.
Modified: stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionImpl.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionImpl.java?rev=1389901&r1=1389900&r2=1389901&view=diff
==============================================================================
--- stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionImpl.java (original)
+++ stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionImpl.java Tue Sep 25 15:03:26 2012
@@ -27,20 +27,27 @@ import org.apache.clerezza.rdf.core.Trip
import org.apache.clerezza.rdf.core.UriRef;
import org.apache.clerezza.rdf.core.impl.TripleImpl;
import org.apache.clerezza.rdf.ontologies.OWL;
+import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyProvider;
+import org.apache.stanbol.ontologymanager.ontonet.api.scope.OntologyScope;
import org.apache.stanbol.ontologymanager.ontonet.api.session.NonReferenceableSessionException;
import org.apache.stanbol.ontologymanager.ontonet.api.session.Session;
import org.apache.stanbol.ontologymanager.ontonet.api.session.SessionEvent;
import org.apache.stanbol.ontologymanager.ontonet.api.session.SessionEvent.OperationType;
import org.apache.stanbol.ontologymanager.ontonet.api.session.SessionListener;
+import org.apache.stanbol.ontologymanager.ontonet.impl.ONManagerImpl;
import org.apache.stanbol.ontologymanager.ontonet.impl.clerezza.AbstractOntologyCollectorImpl;
+import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.AddImport;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLDataFactory;
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.OWLOntologyManager;
+import org.semanticweb.owlapi.model.OWLOntologySetProvider;
+import org.semanticweb.owlapi.util.OWLOntologyMerger;
import org.slf4j.LoggerFactory;
/**
@@ -167,6 +174,43 @@ public class SessionImpl extends Abstrac
@Override
protected OWLOntology exportToOWLOntology(boolean merge, IRI universalPrefix) {
OWLOntology o = super.exportToOWLOntology(merge, universalPrefix);
+
+ IRI iri = o.getOntologyID().getOntologyIRI();
+
+ if (merge) { // Re-merge
+ ONManager onm = ONManagerImpl.get(); // FIXME try to avoid this.
+ final Set<OWLOntology> set = new HashSet<OWLOntology>();
+ set.add(o);
+ for (String scopeID : attachedScopes) {
+ log.debug(" ... Merging with attached scope {}.", scopeID);
+
+ OntologyScope sc = onm.getScope(scopeID);
+ if (sc != null)
+
+ set.add(sc.export(OWLOntology.class, merge));
+
+ for (OWLOntologyID ontologyId : managedOntologies) {
+ set.add(getOntology(ontologyId, OWLOntology.class, true));
+ }
+
+ OWLOntologySetProvider provider = new OWLOntologySetProvider() {
+ @Override
+ public Set<OWLOntology> getOntologies() {
+ return set;
+ }
+ };
+ OWLOntologyMerger merger = new OWLOntologyMerger(provider);
+ try {
+ o = merger.createMergedOntology(OWLManager.createOWLOntologyManager(), iri);
+ } catch (OWLOntologyCreationException e) {
+ log.error("Failed to merge imports for ontology " + iri, e);
+ o = null;
+ }
+
+ }
+
+ } else
+
attachScopeImportsOwlApi(o, universalPrefix);
return o;
}
Modified: stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionManagerImpl.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionManagerImpl.java?rev=1389901&r1=1389900&r2=1389901&view=diff
==============================================================================
--- stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionManagerImpl.java (original)
+++ stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionManagerImpl.java Tue Sep 25 15:03:26 2012
@@ -73,20 +73,23 @@ import org.slf4j.LoggerFactory;
@Service(SessionManager.class)
public class SessionManagerImpl implements SessionManager, ScopeEventListener {
+ public static final String _CONNECTIVITY_POLICY_DEFAULT = "TIGHT";
public static final String _ID_DEFAULT = "session";
public static final int _MAX_ACTIVE_SESSIONS_DEFAULT = -1;
- public static final String _CONNECTIVITY_POLICY_DEFAULT = "TIGHT";
public static final String _ONTOLOGY_NETWORK_NS_DEFAULT = "http://localhost:8080/ontonet/";
+ private static SessionManagerImpl me = null;
+
+ public static SessionManagerImpl get() {
+ return me;
+ }
+
/**
* Concatenated with the sessionManager ID, it identifies the Web endpoint and default base URI for all
* sessions.
*/
private IRI baseNS;
- @Property(name = SessionManager.ID, value = _ID_DEFAULT)
- protected String id;
-
@Property(name = SessionManager.CONNECTIVITY_POLICY, options = {
@PropertyOption(value = '%'
+ SessionManager.CONNECTIVITY_POLICY
@@ -96,6 +99,9 @@ public class SessionManagerImpl implemen
+ ".option.loose", name = "LOOSE")}, value = _CONNECTIVITY_POLICY_DEFAULT)
private String connectivityPolicyString;
+ @Property(name = SessionManager.ID, value = _ID_DEFAULT)
+ protected String id;
+
protected SessionIDGenerator idgen;
protected Set<SessionListener> listeners;
@@ -106,10 +112,10 @@ public class SessionManagerImpl implemen
private int maxSessions;
@Reference
- private ONManager onManager;
+ private OfflineConfiguration offline;
@Reference
- private OfflineConfiguration offline;
+ private ONManager onManager;
@Reference
private OntologyProvider<?> ontologyProvider;
@@ -189,7 +195,7 @@ public class SessionManagerImpl implemen
protected void activate(Dictionary<String,Object> configuration) throws IOException {
long before = System.currentTimeMillis();
-
+ me = this;
// Parse configuration
id = (String) configuration.get(SessionManager.ID);
if (id == null) id = _ID_DEFAULT;
@@ -448,6 +454,27 @@ public class SessionManagerImpl implemen
}
@Override
+ public void scopeActivated(OntologyScope scope) {}
+
+ @Override
+ public void scopeCreated(OntologyScope scope) {}
+
+ @Override
+ public void scopeDeactivated(OntologyScope scope) {
+ for (String sid : getRegisteredSessionIDs())
+ getSession(sid).detachScope(scope.getID());
+ }
+
+ @Override
+ public void scopeRegistered(OntologyScope scope) {}
+
+ @Override
+ public void scopeUnregistered(OntologyScope scope) {
+ for (String sid : getRegisteredSessionIDs())
+ getSession(sid).detachScope(scope.getID());
+ }
+
+ @Override
public void setActiveSessionLimit(int limit) {
this.maxSessions = limit;
}
@@ -482,25 +509,4 @@ public class SessionManagerImpl implemen
"Not necessary. Session content is always stored by default in the current implementation.");
}
- @Override
- public void scopeActivated(OntologyScope scope) {}
-
- @Override
- public void scopeCreated(OntologyScope scope) {}
-
- @Override
- public void scopeDeactivated(OntologyScope scope) {
- for (String sid : getRegisteredSessionIDs())
- getSession(sid).detachScope(scope.getID());
- }
-
- @Override
- public void scopeUnregistered(OntologyScope scope) {
- for (String sid : getRegisteredSessionIDs())
- getSession(sid).detachScope(scope.getID());
- }
-
- @Override
- public void scopeRegistered(OntologyScope scope) {}
-
}
Added: stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/AbstractOntologyAccessResource.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/AbstractOntologyAccessResource.java?rev=1389901&view=auto
==============================================================================
--- stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/AbstractOntologyAccessResource.java (added)
+++ stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/AbstractOntologyAccessResource.java Tue Sep 25 15:03:26 2012
@@ -0,0 +1,58 @@
+/*
+ * 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.resources;
+
+import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
+import org.apache.stanbol.ontologymanager.ontonet.impl.util.OntologyUtils;
+import org.semanticweb.owlapi.model.OWLOntologyID;
+
+/**
+ * RESTful resources intended for performing CRUD operations on ontologies with respect to their storage
+ * facilities (i.e. operations that manipulate the content of one ontology at a time) should specialize this
+ * class.
+ *
+ * @author alexdma
+ *
+ */
+public abstract class AbstractOntologyAccessResource extends BaseStanbolResource {
+
+ /**
+ * The ontology this resource was created after, and represents.
+ */
+ protected OWLOntologyID submitted;
+
+ /**
+ * Returns a public key of the ontology this resource was created after.
+ *
+ * @return the key of the ontology represented by this resource.
+ */
+ public OWLOntologyID getRepresentedOntologyKey() {
+ return submitted;
+ }
+
+ /**
+ * Returns a canonicalized string form of a public key.
+ *
+ * @param ontologyID
+ * the public key
+ * @return the canonical form of the submitted public key.
+ */
+ public String stringForm(OWLOntologyID ontologyID) {
+ return OntologyUtils.encode(ontologyID);
+ }
+
+}
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=1389901&r1=1389900&r2=1389901&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 Tue Sep 25 15:03:26 2012
@@ -21,6 +21,7 @@ import static javax.ws.rs.core.MediaType
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.UNSUPPORTED_MEDIA_TYPE;
@@ -61,6 +62,7 @@ import java.util.TreeSet;
import javax.servlet.ServletContext;
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;
@@ -82,20 +84,23 @@ import org.apache.clerezza.rdf.core.MGra
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.stanbol.commons.indexedgraph.IndexedMGraph;
+import org.apache.stanbol.commons.owl.util.OWLUtils;
import org.apache.stanbol.commons.owl.util.URIUtils;
import org.apache.stanbol.commons.web.base.ContextHelper;
-import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
-import org.apache.stanbol.ontologymanager.ontonet.api.OntologyLoadingException;
import org.apache.stanbol.ontologymanager.ontonet.api.collector.OntologyCollector;
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.OntologyHandleException;
+import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyLoadingException;
import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyNetworkMultiplexer;
import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyProvider;
+import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OrphanOntologyKeyException;
import org.apache.stanbol.ontologymanager.ontonet.api.scope.OntologyScope;
import org.apache.stanbol.ontologymanager.ontonet.api.session.SessionManager;
import org.apache.stanbol.ontologymanager.ontonet.impl.clerezza.MGraphNetworkMultiplexer;
@@ -113,6 +118,7 @@ import org.semanticweb.owlapi.model.OWLO
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;
@@ -132,7 +138,7 @@ import com.sun.jersey.multipart.FormData
@Path("/ontonet")
@ImplicitProduces(MediaType.TEXT_HTML + ";qs=2")
-public class OntoNetRootResource extends BaseStanbolResource {
+public class OntoNetRootResource extends AbstractOntologyAccessResource {
private Logger log = LoggerFactory.getLogger(getClass());
@@ -173,21 +179,41 @@ public class OntoNetRootResource extends
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();
+ @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.getOrphanPublicKey());
+ rb = Response.status(NOT_FOUND);
+ }
addCORSOrigin(servletContext, rb, headers);
return rb.build();
}
- private MGraph getGraph(String ontologyId, boolean merged) {
+ public Set<String> getAliases(OWLOntologyID ontologyId) {
+ 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();
- IRI iri = URIUtils.sanitize(IRI.create(ontologyId));
- log.debug("Will try to retrieve ontology {} from provider.", iri);
+
+ 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.
@@ -198,13 +224,15 @@ public class OntoNetRootResource extends
*/
MGraph o = null, oTemp = null;
try {
- oTemp = ontologyProvider.getStoredOntology(new OWLOntologyID(iri), MGraph.class, merged);
+ oTemp = ontologyProvider.getStoredOntology(key, MGraph.class, merged);
} catch (Exception ex) {
- log.warn("Retrieval of ontology with ID " + iri + " failed.", ex);
+ log.warn("Retrieval of ontology with ID " + key + " failed.", ex);
}
if (oTemp == null) {
- log.debug("Ontology {} missing from provider. Trying libraries...", iri);
+ 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;
@@ -225,14 +253,16 @@ public class OntoNetRootResource extends
}
}
- if (oTemp != null) o = new IndexedMGraph(oTemp);
+ // 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.", iri);
+ log.debug("Ontology {} not found in any ontology provider or library.", ontologyId);
return null;
}
- log.debug("Retrieved ontology {} .", iri);
+ log.debug("Retrieved ontology {} .", ontologyId);
// Rewrite imports
String uri = uriInfo.getRequestUri().toString();
@@ -271,13 +301,6 @@ public class OntoNetRootResource extends
return handles;
}
- public Set<String> getAliases(OWLOntologyID ontologyId) {
- Set<String> aliases = new HashSet<String>();
- for (OWLOntologyID alias : ontologyProvider.listAliases(ontologyId))
- aliases.add(OntologyUtils.encode(alias));
- return aliases;
- }
-
@GET
@Produces(TEXT_HTML)
public Response getHtmlInfo(@Context HttpHeaders headers) {
@@ -297,7 +320,7 @@ public class OntoNetRootResource extends
ResponseBuilder rb;
if (ontologyId == null || ontologyId.isEmpty()) rb = Response.status(BAD_REQUEST);
else {
- TripleCollection o = getGraph(ontologyId, merged);
+ TripleCollection o = getGraph(ontologyId, merged, uriInfo.getRequestUri());
rb = o == null ? Response.status(NOT_FOUND) : Response.ok(o);
}
addCORSOrigin(servletContext, rb, headers);
@@ -326,7 +349,7 @@ public class OntoNetRootResource extends
ResponseBuilder rb;
if (ontologyId == null || ontologyId.isEmpty()) rb = Response.status(BAD_REQUEST);
else {
- OWLOntology o = getOntology(ontologyId, merged);
+ OWLOntology o = getOWLOntology(ontologyId, merged, uriInfo.getRequestUri());
rb = o == null ? Response.status(NOT_FOUND) : Response.ok(o);
}
addCORSOrigin(servletContext, rb, headers);
@@ -343,12 +366,17 @@ public class OntoNetRootResource extends
public SortedSet<OWLOntologyID> getOntologies() {
SortedSet<OWLOntologyID> filtered = new TreeSet<OWLOntologyID>();
+ Set<OWLOntologyID> orphans = ontologyProvider.listOrphans();
for (OWLOntologyID id : ontologyProvider.getPublicKeys())
- if (id != null) filtered.add(id);
+ if (id != null && !orphans.contains(id)) filtered.add(id);
return filtered;
}
+
+ public Set<OWLOntologyID> getOrphans() {
+ return ontologyProvider.listOrphans();
+ }
- private OWLOntology getOntology(String ontologyId, boolean merge) {
+ 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);
@@ -403,6 +431,15 @@ public class OntoNetRootResource extends
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);
@@ -464,7 +501,19 @@ public class OntoNetRootResource extends
// Re-instantiate the stream on every attempt
InputStream content = new FileInputStream(file);
// ClerezzaOWLUtils.guessOntologyID(new FileInputStream(file), Parser.getInstance(), f);
- key = ontologyProvider.loadInStore(content, f, true);
+ OWLOntologyID guessed = OWLUtils.guessOntologyID(content, Parser.getInstance(), f);
+ if (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", this));
+ rb.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML + "; charset=utf-8");
+ }
+ break;
+ } else {
+ content = new FileInputStream(file);
+ key = ontologyProvider.loadInStore(content, f, true);
+ }
} catch (UnsupportedFormatException e) {
log.warn(
"POST method failed for media type {}. This should not happen (should fail earlier)",
@@ -479,7 +528,7 @@ public class OntoNetRootResource extends
failed++;
}
} while ((key == null || key.isAnonymous()) && itf.hasNext());
- if (key == null || key.isAnonymous()) {
+ 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);
}
@@ -497,18 +546,17 @@ public class OntoNetRootResource extends
}
if (key != null && !key.isAnonymous()) {
- // FIXME ugly but will have to do for the time being
- String uri
- // = key.split("::")[1];
- = OntologyUtils.encode(key);
- // uri
- // = uri.substring((ontologyProvider.getGraphPrefix() + "::").length());
- if (uri != null && !uri.isEmpty()) rb = Response.seeOther(URI.create("/ontonet/" + uri));
- else rb = Response.ok();
- } else rb = Response.status(Status.INTERNAL_SERVER_ERROR);
+ String uri = OntologyUtils.encode(key);
+ if (uri != null && !uri.isEmpty()) {
+ rb = Response.created(URI.create("/" + uri));
+ 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);
// 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();
}
@@ -516,12 +564,14 @@ public class OntoNetRootResource extends
@GET
@Path("/{ontologyId:.+}")
@Produces(TEXT_HTML)
- public Response showOntology(@PathParam("ontologyId") String ontologyId, @Context HttpHeaders headers) {
+ public Response showOntology(@PathParam("ontologyId") String ontologyId,
+ @Context HttpHeaders headers,
+ @Context UriInfo uriInfo) {
ResponseBuilder rb;
if (ontologyId == null || ontologyId.isEmpty()) rb = Response.status(BAD_REQUEST);
else {
OWLOntologyID id = OntologyUtils.decode(ontologyId);
- OWLOntology o = getOntology(ontologyId, false);
+ OWLOntology o = getOWLOntology(ontologyId, false, uriInfo.getRequestUri());
if (o == null) rb = Response.status(NOT_FOUND);
else
// try
@@ -599,7 +649,4 @@ public class OntoNetRootResource extends
return r;
}
- public String stringForm(OWLOntologyID ontologyID) {
- return OntologyUtils.encode(ontologyID);
- }
}
Modified: stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java?rev=1389901&r1=1389900&r2=1389901&view=diff
==============================================================================
--- stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java (original)
+++ stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java Tue Sep 25 15:03:26 2012
@@ -82,11 +82,11 @@ import javax.ws.rs.core.UriInfo;
import org.apache.clerezza.rdf.core.Graph;
import org.apache.clerezza.rdf.core.TripleCollection;
import org.apache.clerezza.rdf.core.access.TcProvider;
+import org.apache.clerezza.rdf.core.serializedform.Parser;
+import org.apache.stanbol.commons.owl.util.OWLUtils;
import org.apache.stanbol.commons.owl.util.URIUtils;
import org.apache.stanbol.commons.web.base.ContextHelper;
-import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
-import org.apache.stanbol.ontologymanager.ontonet.api.OntologyLoadingException;
import org.apache.stanbol.ontologymanager.ontonet.api.collector.DuplicateIDException;
import org.apache.stanbol.ontologymanager.ontonet.api.collector.IrremovableOntologyException;
import org.apache.stanbol.ontologymanager.ontonet.api.collector.OntologyCollectorModificationException;
@@ -98,6 +98,7 @@ import org.apache.stanbol.ontologymanage
import org.apache.stanbol.ontologymanager.ontonet.api.io.RootOntologySource;
import org.apache.stanbol.ontologymanager.ontonet.api.io.SetInputSource;
import org.apache.stanbol.ontologymanager.ontonet.api.io.StoredOntologySource;
+import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyLoadingException;
import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyProvider;
import org.apache.stanbol.ontologymanager.ontonet.api.scope.OntologyScope;
import org.apache.stanbol.ontologymanager.ontonet.api.scope.OntologySpace;
@@ -127,7 +128,7 @@ import com.sun.jersey.multipart.FormData
*
*/
@Path("/ontonet/ontology/{scopeid}")
-public class ScopeResource extends BaseStanbolResource {
+public class ScopeResource extends AbstractOntologyAccessResource {
private Logger log = LoggerFactory.getLogger(getClass());
@@ -460,6 +461,8 @@ public class ScopeResource extends BaseS
ResponseBuilder rb;
if (scope == null) rb = Response.status(NOT_FOUND);
else if (ontologyId == null || ontologyId.isEmpty()) rb = Response.status(BAD_REQUEST);
+ else if (!ontologyProvider.hasOntology(OntologyUtils.decode(ontologyId))) rb = Response
+ .status(NOT_FOUND);
else {
IRI prefix = IRI.create(getPublicBaseUri() + "ontonet/ontology/");
OWLOntology o = scope.getCustomSpace().getOntology(OntologyUtils.decode(ontologyId),
@@ -662,8 +665,20 @@ public class ScopeResource extends BaseS
try {
// Use a buffered stream that can be reset for multiple attempts.
InputStream content = new BufferedInputStream(new FileInputStream(file));
- src = new GraphContentInputSource(content, format, ontologyProvider.getStore());
- break;
+ OWLOntologyID guessed = OWLUtils.guessOntologyID(content, Parser.getInstance(), f);
+ if (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", this));
+ rb.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML + "; charset=utf-8");
+ }
+ break;
+ } else {
+ content = new BufferedInputStream(new FileInputStream(file));
+ src = new GraphContentInputSource(content, format, ontologyProvider.getStore());
+ break;
+ }
} catch (OntologyLoadingException e) {
// throw new WebApplicationException(e, BAD_REQUEST);
continue;
@@ -705,7 +720,7 @@ public class ScopeResource extends BaseS
* uri)
*/);
} else rb = Response.ok();
- } else rb = Response.status(INTERNAL_SERVER_ERROR);
+ } else if (rb == null) rb = Response.status(INTERNAL_SERVER_ERROR);
}
if (!keys.isEmpty()) {
for (String key : keys)
Modified: stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionResource.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionResource.java?rev=1389901&r1=1389900&r2=1389901&view=diff
==============================================================================
--- stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionResource.java (original)
+++ stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionResource.java Tue Sep 25 15:03:26 2012
@@ -80,10 +80,10 @@ import javax.ws.rs.core.UriInfo;
import org.apache.clerezza.rdf.core.Graph;
import org.apache.clerezza.rdf.core.access.TcProvider;
+import org.apache.clerezza.rdf.core.serializedform.Parser;
+import org.apache.stanbol.commons.owl.util.OWLUtils;
import org.apache.stanbol.commons.web.base.ContextHelper;
-import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
-import org.apache.stanbol.ontologymanager.ontonet.api.OntologyLoadingException;
import org.apache.stanbol.ontologymanager.ontonet.api.collector.IrremovableOntologyException;
import org.apache.stanbol.ontologymanager.ontonet.api.collector.OntologyCollectorModificationException;
import org.apache.stanbol.ontologymanager.ontonet.api.collector.UnmodifiableOntologyCollectorException;
@@ -92,6 +92,7 @@ import org.apache.stanbol.ontologymanage
import org.apache.stanbol.ontologymanager.ontonet.api.io.OntologyInputSource;
import org.apache.stanbol.ontologymanager.ontonet.api.io.RootOntologyIRISource;
import org.apache.stanbol.ontologymanager.ontonet.api.io.StoredOntologySource;
+import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyLoadingException;
import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyProvider;
import org.apache.stanbol.ontologymanager.ontonet.api.scope.OntologyScope;
import org.apache.stanbol.ontologymanager.ontonet.api.session.DuplicateSessionIDException;
@@ -123,7 +124,7 @@ import com.sun.jersey.multipart.FormData
*
*/
@Path("/ontonet/session/{id}")
-public class SessionResource extends BaseStanbolResource {
+public class SessionResource extends AbstractOntologyAccessResource {
private Logger log = LoggerFactory.getLogger(getClass());
@@ -132,14 +133,14 @@ public class SessionResource extends Bas
protected OntologyProvider<TcProvider> ontologyProvider;
/*
- * Placeholder for the session manager to be fetched from the servlet context.
+ * Placeholder for the RegistryManager to be fetched from the servlet context.
*/
- protected SessionManager sesMgr;
+ protected RegistryManager regMgr;
/*
- * Placeholder for the RegistryManager to be fetched from the servlet context.
+ * Placeholder for the session manager to be fetched from the servlet context.
*/
- protected RegistryManager regMgr;
+ protected SessionManager sesMgr;
protected Session session;
@@ -442,6 +443,8 @@ public class SessionResource extends Bas
ResponseBuilder rb;
if (session == null) rb = Response.status(NOT_FOUND);
else if (ontologyId == null || ontologyId.isEmpty()) rb = Response.status(BAD_REQUEST);
+ else if (!ontologyProvider.hasOntology(OntologyUtils.decode(ontologyId))) rb = Response
+ .status(NOT_FOUND);
else {
IRI prefix = IRI.create(getPublicBaseUri() + "ontonet/session/");
OWLOntology o = session.getOntology(OntologyUtils.decode(ontologyId), OWLOntology.class, false,
@@ -662,7 +665,18 @@ public class SessionResource extends Bas
log.debug("Streams created in {} ms", System.currentTimeMillis() - b4buf);
log.debug("Creating ontology input source...");
b4buf = System.currentTimeMillis();
- src = new GraphContentInputSource(content, f, ontologyProvider.getStore());
+ OWLOntologyID guessed = OWLUtils.guessOntologyID(content, Parser.getInstance(), f);
+ if (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", this));
+ rb.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML + "; charset=utf-8");
+ }
+ } else {
+ content = new BufferedInputStream(new FileInputStream(file));
+ src = new GraphContentInputSource(content, format, ontologyProvider.getStore());
+ }
log.debug("Done in {} ms", System.currentTimeMillis() - b4buf);
log.info("SUCCESS parse with format {}.", f);
break;
@@ -712,7 +726,7 @@ public class SessionResource extends Bas
+ session.getID() + "/"
+ uri));
else rb = Response.seeOther(URI.create("/ontonet/session/" + session.getID()));
- } else rb = Response.status(INTERNAL_SERVER_ERROR);
+ } else if (rb == null) rb = Response.status(INTERNAL_SERVER_ERROR);
}
if (!keys.isEmpty()) {
for (String key : keys)
Added: stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/imports/409.ftl
URL: http://svn.apache.org/viewvc/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/imports/409.ftl?rev=1389901&view=auto
==============================================================================
--- stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/imports/409.ftl (added)
+++ stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/imports/409.ftl Tue Sep 25 15:03:26 2012
@@ -0,0 +1,40 @@
+<#--
+ 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 : conflict detected" hasrestapi=false>
+
+ <div class="panel">
+ <#assign ontology = it.representedOntologyKey>
+ An ontology with ID
+ <ul><li>
+ <a href="${it.publicBaseUri}ontonet/${it.stringForm(ontology)}">${ontology}</a>
+ </li></ul>
+ is already stored in Stanbol.
+
+ <p>
+ <u>Note</u>: the ID of the submitted ontology was guessed over a
+ limited number of triples. If you know this is not the full
+ ontology ID, or wish to overwrite the stored ontology anyhow,
+ please try again by setting POST parameter <tt>force=true</tt>.
+ </p>
+ <p><i>HTTP Status : 409 Conflict</i></p>
+
+ </div>
+
+ </...@common.page>
+</#escape>
\ No newline at end of file
Modified: 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/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/webview.ftl?rev=1389901&r1=1389900&r2=1389901&view=diff
==============================================================================
--- stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/webview.ftl (original)
+++ stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntoNetRootResource/webview.ftl Tue Sep 25 15:03:26 2012
@@ -87,7 +87,28 @@
</tr>
</#list>
</div>
- </table> <!-- allScopes -->
+ </table> <!-- allOntologies -->
+ </div>
+
+ <h3>Orphan ontologies</h3>
+ <#assign orphans = it.orphans>
+ <div class="storeContents">
+ <table id="orphans">
+ <div>
+ <tr>
+ <th width="90%">ID</th>
+ <th width="5%">Aliases</th>
+ <th width="5%">Direct handles</th>
+ </tr>
+ <#list orphans as orphan>
+ <tr>
+ <td><strike>${it.stringForm(orphan)}</strike></td>
+ <td>${it.getAliases(orphan)?size}</td>
+ <td>${it.getHandles(orphan)?size}</td>
+ </tr>
+ </#list>
+ </div>
+ </table> <!-- orphans -->
</div>
<hr>
Modified: stanbol/trunk/rules/adapters/abstract/src/main/java/org/apache/stanbol/rules/adapters/impl/RuleAdaptersFactoryImpl.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/rules/adapters/abstract/src/main/java/org/apache/stanbol/rules/adapters/impl/RuleAdaptersFactoryImpl.java?rev=1389901&r1=1389900&r2=1389901&view=diff
==============================================================================
--- stanbol/trunk/rules/adapters/abstract/src/main/java/org/apache/stanbol/rules/adapters/impl/RuleAdaptersFactoryImpl.java (original)
+++ stanbol/trunk/rules/adapters/abstract/src/main/java/org/apache/stanbol/rules/adapters/impl/RuleAdaptersFactoryImpl.java Tue Sep 25 15:03:26 2012
@@ -21,6 +21,7 @@ import java.io.IOException;
import java.util.Collections;
import java.util.Dictionary;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -145,7 +146,9 @@ public class RuleAdaptersFactoryImpl imp
@Override
public List<RuleAdapter> listRuleAdapters() {
- List<RuleAdapter> ruleAdapters = Collections.emptyList();
+ List<RuleAdapter> ruleAdapters =
+ new LinkedList<RuleAdapter>();
+ //Collections.emptyList();
ruleAdapters.addAll(this.ruleAdapters.values());
return ruleAdapters;
Modified: stanbol/trunk/rules/adapters/jena/src/main/java/org/apache/stanbol/rules/adapters/impl/RuleAdaptersFactoryImpl.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/rules/adapters/jena/src/main/java/org/apache/stanbol/rules/adapters/impl/RuleAdaptersFactoryImpl.java?rev=1389901&r1=1389900&r2=1389901&view=diff
==============================================================================
--- stanbol/trunk/rules/adapters/jena/src/main/java/org/apache/stanbol/rules/adapters/impl/RuleAdaptersFactoryImpl.java (original)
+++ stanbol/trunk/rules/adapters/jena/src/main/java/org/apache/stanbol/rules/adapters/impl/RuleAdaptersFactoryImpl.java Tue Sep 25 15:03:26 2012
@@ -18,9 +18,9 @@
package org.apache.stanbol.rules.adapters.impl;
import java.io.IOException;
-import java.util.Collections;
import java.util.Dictionary;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -144,11 +144,10 @@ public class RuleAdaptersFactoryImpl imp
@Override
public List<RuleAdapter> listRuleAdapters() {
-
- List<RuleAdapter> ruleAdapters = Collections.emptyList();
+ List<RuleAdapter> ruleAdapters = new LinkedList<RuleAdapter>();
+ // Collections.emptyList();
ruleAdapters.addAll(this.ruleAdapters.values());
return ruleAdapters;
-
}
@Override