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