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/07/02 18:23:14 UTC

svn commit: r1356320 [1/2] - in /incubator/stanbol/trunk/ontologymanager: ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/io/ ontonet/src/main/java/org/apache/st...

Author: alexdma
Date: Mon Jul  2 16:23:12 2012
New Revision: 1356320

URL: http://svn.apache.org/viewvc?rev=1356320&view=rev
Log:
* First implementation of STANBOL-571 : scopes and session information (which were registered, what ontologies were managed) is now stored in a meta graph and restored upon OntoNet bootstrap. Works for most base scenarios and should be refined from now on. 
* Note that sessions are restored in an INACTIVE state, as an initial policy for STANBOL-247 .
* More headers added for accepted methods in OPTIONS preflight requests for Ontology Manager Web (STANBOL-105)

Added:
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/OntologyNetworkConfiguration.java
Modified:
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/Vocabulary.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/io/GraphSource.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProvider.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/OntologyScope.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/OntologySpace.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/ScopeEventListener.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/session/Session.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ONManagerImpl.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ontology/ScopeRegistryImpl.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/owlapi/OWLAPIOntologyProvider.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/renderers/ScopeSetRenderer.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionManagerImpl.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/TimestampedSessionIDGenerator.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/TestOntologyNetworkPersistence.java
    incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/session/TestSessions.java
    incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java
    incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionResource.java

Added: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/OntologyNetworkConfiguration.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/OntologyNetworkConfiguration.java?rev=1356320&view=auto
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/OntologyNetworkConfiguration.java (added)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/OntologyNetworkConfiguration.java Mon Jul  2 16:23:12 2012
@@ -0,0 +1,61 @@
+/*
+ * 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.ontonet.api;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * Contains ownership and collector information on all ontology networks currently configured.
+ * 
+ * @author alexdma
+ * 
+ */
+public class OntologyNetworkConfiguration {
+
+    private Map<String,Collection<String>> coreOntologiesForScopes, customOntologiesForScopes,
+            ontologiesForSessions;
+
+    public OntologyNetworkConfiguration(Map<String,Collection<String>> coreOntologiesForScopes,
+                                        Map<String,Collection<String>> customOntologiesForScopes,
+                                        Map<String,Collection<String>> ontologiesForSessions) {
+        this.coreOntologiesForScopes = coreOntologiesForScopes;
+        this.customOntologiesForScopes = customOntologiesForScopes;
+        this.ontologiesForSessions = ontologiesForSessions;
+    }
+
+    public Collection<String> getCoreOntologyKeysForScope(String scopeId) {
+        return coreOntologiesForScopes.get(scopeId);
+    }
+
+    public Collection<String> getCustomOntologyKeysForScope(String scopeId) {
+        return customOntologiesForScopes.get(scopeId);
+    }
+
+    public Collection<String> getOntologyKeysForSession(String sessionId) {
+        return ontologiesForSessions.get(sessionId);
+    }
+
+    public Collection<String> getScopeIDs() {
+        return coreOntologiesForScopes.keySet();
+    }
+
+    public Collection<String> getSessionIDs() {
+        return ontologiesForSessions.keySet();
+    }
+
+}

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/Vocabulary.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/Vocabulary.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/Vocabulary.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/Vocabulary.java Mon Jul  2 16:23:12 2012
@@ -16,32 +16,56 @@
  */
 package org.apache.stanbol.ontologymanager.ontonet.api;
 
+import org.apache.clerezza.rdf.core.UriRef;
+
 public class Vocabulary {
 
+    /**
+     * The default namespace for the Stanbol OntoNet metadata vocabulary
+     */
     public static final String _NS_ONTONET = "http://stanbol.apache.org/ontology/meta/ontonet#";
 
-    public static final String IS_MANAGED_BY = _NS_ONTONET + "isManagedBy";
-    
-    public static final String IS_MANAGED_BY_CORE = _NS_ONTONET + "isManagedByCore";
-
-    public static final String IS_MANAGED_BY_CUSTOM = _NS_ONTONET + "isManagedByCustom";
-    
-    public static final String MANAGES = _NS_ONTONET + "manages";
-    
-    public static final String MANAGES_IN_CORE = _NS_ONTONET + "managesInCore";
-    
-    public static final String MANAGES_IN_CUSTOM = _NS_ONTONET + "managesInCustom";
-    
-    public static final String HAS_STATUS = _NS_ONTONET + "hasStatus";
-    
-    public static final String STATUS = _NS_ONTONET + "Status";
-    
-    public static final String STATUS_ACTIVE = _NS_ONTONET + "Status.ACTIVE";
-
-    public static final String STATUS_INACTIVE = _NS_ONTONET + "Status.INACTIVE";
-    
-    public static final String SCOPE = _NS_ONTONET + "Scope";
+    /**
+     * This namespace is used for representing Stanbol resources internally. It should applied to all portable
+     * resources that might be moved from one host to another, e.g. scopes and sessions.<br/>
+     * <br>
+     * This namespace MUST NOT be used for identifying resources in the outside world, e.g. RESTful services:
+     * it MUST be converted to the public namespace before exporting.
+     */
+    public static final String _NS_STANBOL_INTERNAL = "http://stanbol.apache.org/ontology/.internal/";
+
+    public static final UriRef HAS_SPACE_CORE = new UriRef(_NS_ONTONET + "hasCoreSpace");
+
+    public static final UriRef HAS_SPACE_CUSTOM = new UriRef(_NS_ONTONET + "hasCustomSpace");
+
+    public static final UriRef HAS_STATUS = new UriRef(_NS_ONTONET + "hasStatus");
+
+    public static final UriRef IS_MANAGED_BY = new UriRef(_NS_ONTONET + "isManagedBy");
+
+    public static final UriRef IS_MANAGED_BY_CORE = new UriRef(_NS_ONTONET + "isManagedByCore");
+
+    public static final UriRef IS_MANAGED_BY_CUSTOM = new UriRef(_NS_ONTONET + "isManagedByCustom");
+
+    public static final UriRef IS_SPACE_CORE_OF = new UriRef(_NS_ONTONET + "isCoreSpaceOf");
+
+    public static final UriRef IS_SPACE_CUSTOM_OF = new UriRef(_NS_ONTONET + "isCustomSpaceOf");
+
+    public static final UriRef MANAGES = new UriRef(_NS_ONTONET + "manages");
+
+    public static final UriRef MANAGES_IN_CORE = new UriRef(_NS_ONTONET + "managesInCore");
+
+    public static final UriRef MANAGES_IN_CUSTOM = new UriRef(_NS_ONTONET + "managesInCustom");
+
+    public static final UriRef SCOPE = new UriRef(_NS_ONTONET + "Scope");
+
+    public static final UriRef SESSION = new UriRef(_NS_ONTONET + "Session");
+
+    public static final UriRef SPACE = new UriRef(_NS_ONTONET + "Space");
+
+    public static final UriRef STATUS = new UriRef(_NS_ONTONET + "Status");
+
+    public static final UriRef STATUS_ACTIVE = new UriRef(_NS_ONTONET + "Status.ACTIVE");
 
-    public static final String SESSION = _NS_ONTONET + "Session";
+    public static final UriRef STATUS_INACTIVE = new UriRef(_NS_ONTONET + "Status.INACTIVE");
 
 }

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/io/GraphSource.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/io/GraphSource.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/io/GraphSource.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/io/GraphSource.java Mon Jul  2 16:23:12 2012
@@ -23,8 +23,8 @@ import org.apache.clerezza.rdf.core.UriR
 import org.apache.clerezza.rdf.core.access.TcManager;
 
 /**
- * An {@link OntologyInputSource} that gets ontologies from either a Clerezza {@link Graph} (or {@link MGraph}
- * ), or its identifier and an optionally supplied triple collection manager.
+ * An {@link OntologyInputSource} that gets ontologies from either a stored Clerezza {@link Graph} (or
+ * {@link MGraph} ), or its identifier and an optionally supplied triple collection manager.
  * 
  * @author alexdma
  * 
@@ -39,6 +39,10 @@ public class GraphSource extends Abstrac
         bindPhysicalIri(null);
     }
 
+    public GraphSource(String graphId) {
+        this(new UriRef(graphId));
+    }
+
     public GraphSource(UriRef graphId) {
         this(graphId, TcManager.getInstance());
     }

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProvider.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProvider.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProvider.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProvider.java Mon Jul  2 16:23:12 2012
@@ -25,6 +25,7 @@ import org.apache.clerezza.rdf.core.MGra
 import org.apache.clerezza.rdf.core.TripleCollection;
 import org.apache.clerezza.rdf.core.access.TcProvider;
 import org.apache.clerezza.rdf.core.serializedform.UnsupportedFormatException;
+import org.apache.stanbol.ontologymanager.ontonet.api.OntologyNetworkConfiguration;
 import org.apache.stanbol.ontologymanager.ontonet.api.collector.ImportManagementPolicy;
 import org.semanticweb.owlapi.model.IRI;
 import org.semanticweb.owlapi.model.OWLOntologyID;
@@ -108,6 +109,8 @@ public interface OntologyProvider<S> {
      */
     <O extends TripleCollection> O getMetaGraph(Class<O> returnType);
 
+    public OntologyNetworkConfiguration getOntologyNetworkConfiguration();
+
     /**
      * Will return the keys of all the ontologies whose ontologyIRI is the one provided. These include any
      * ontologies with that ontologyIRI and a versionIRI, and one ontology with no version IRI (if it exists,

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/OntologyScope.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/OntologyScope.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/OntologyScope.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/OntologyScope.java Mon Jul  2 16:23:12 2012
@@ -41,6 +41,8 @@ import org.apache.stanbol.ontologymanage
  */
 public interface OntologyScope extends NamedResource, Lockable, OntologyCollectorListenable, OWLExportable {
 
+    static final String shortName = "scope";
+    
     /**
      * Returns the core ontology space for this ontology scope. The core space should never be null for any
      * scope.

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/OntologySpace.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/OntologySpace.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/OntologySpace.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/OntologySpace.java Mon Jul  2 16:23:12 2012
@@ -29,6 +29,8 @@ import org.apache.stanbol.ontologymanage
  */
 public interface OntologySpace extends OntologyCollector, OWLExportable, Lockable {
 
+    static final String shortName = "space";
+
     /**
      * The possible types of ontology spaces managed by OntoNet.
      */

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/ScopeEventListener.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/ScopeEventListener.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/ScopeEventListener.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/scope/ScopeEventListener.java Mon Jul  2 16:23:12 2012
@@ -58,7 +58,7 @@ public interface ScopeEventListener {
 	 * @param scope
 	 *            the deregistered ontology scope
 	 */
-    void scopeDeregistered(OntologyScope scope);
+    void scopeUnregistered(OntologyScope scope);
 
 	/**
 	 * Called <i>after</i> an ontology scope is added to the scope registry.

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/session/Session.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/session/Session.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/session/Session.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/session/Session.java Mon Jul  2 16:23:12 2012
@@ -31,6 +31,8 @@ import org.apache.stanbol.ontologymanage
  */
 public interface Session extends OntologyCollector, OWLExportable, Lockable, SessionListenable {
 
+    static final String shortName = "session";
+
     /**
      * The states a session can be in: ACTIVE (for running sessions), HALTED (for inactive sessions that may
      * later be activated, e.g. when a user logs in), ZOMBIE (inactive and bound for destruction, no longer

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ONManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ONManagerImpl.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ONManagerImpl.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ONManagerImpl.java Mon Jul  2 16:23:12 2012
@@ -23,15 +23,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Dictionary;
 import java.util.Hashtable;
-import java.util.Iterator;
 import java.util.List;
 
-import org.apache.clerezza.rdf.core.NonLiteral;
-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.access.TcProvider;
-import org.apache.clerezza.rdf.ontologies.RDF;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -45,10 +39,11 @@ import org.apache.stanbol.commons.owl.OW
 import org.apache.stanbol.commons.stanboltools.offline.OfflineMode;
 import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
 import org.apache.stanbol.ontologymanager.ontonet.api.OfflineConfiguration;
-import org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary;
+import org.apache.stanbol.ontologymanager.ontonet.api.OntologyNetworkConfiguration;
 import org.apache.stanbol.ontologymanager.ontonet.api.collector.DuplicateIDException;
 import org.apache.stanbol.ontologymanager.ontonet.api.collector.UnmodifiableOntologyCollectorException;
 import org.apache.stanbol.ontologymanager.ontonet.api.io.BlankOntologySource;
+import org.apache.stanbol.ontologymanager.ontonet.api.io.GraphSource;
 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.ontology.OntologyProvider;
@@ -311,7 +306,7 @@ public class ONManagerImpl extends Scope
             // Create and populate the scopes from the config ontology.
             bootstrapOntologyNetwork(oConf);
 
-        } else {
+        } else { // No ontology supplied. Access the local graph
             rebuildScopes();
         }
 
@@ -424,6 +419,7 @@ public class ONManagerImpl extends Scope
     public OntologyScope createOntologyScope(String scopeID, OntologyInputSource<?,?>... coreSources) throws DuplicateIDException {
         if (this.containsScope(scopeID)) throw new DuplicateIDException(scopeID,
                 "Scope registry already contains ontology scope with ID " + scopeID);
+        // Scope constructor also creates core and custom spaces
         OntologyScope scope = new OntologyScopeImpl(scopeID, IRI.create(getOntologyNetworkNamespace()
                                                                         + scopeRegistryId + "/"),
                 getOntologySpaceFactory(), coreSources);
@@ -438,18 +434,6 @@ public class ONManagerImpl extends Scope
         return scope;
     }
 
-    @Override
-    public synchronized void registerScope(OntologyScope scope) {
-        if (scope == null) throw new IllegalArgumentException("scope cannot be null.");
-        String id = scope.getID();
-        if (this.containsScope(id)) {
-            if (scope != getScope(id)) {
-                log.warn("Overriding different scope with same ID {}", id);
-                super.registerScope(scope);
-            } else log.warn("Ignoring unnecessary call to already registered scope {}", id);
-        } else super.registerScope(scope);
-    }
-
     /**
      * Deactivation of the ONManagerImpl resets all its resources.
      */
@@ -545,6 +529,36 @@ public class ONManagerImpl extends Scope
         return offlineMode != null;
     }
 
+    private void rebuildScopes() {
+        OntologyNetworkConfiguration struct = ontologyProvider.getOntologyNetworkConfiguration();
+        for (String scopeId : struct.getScopeIDs()) {
+            Collection<String> coreOnts = struct.getCoreOntologyKeysForScope(scopeId);
+            OntologyInputSource<?,?>[] srcs = new OntologyInputSource<?,?>[coreOnts.size()];
+            int i = 0;
+            for (String coreOnt : coreOnts)
+                srcs[i++] = new GraphSource(coreOnt);
+            OntologyScope scope = new OntologyScopeImpl(scopeId, IRI.create(this
+                    .getOntologyNetworkNamespace()), this.getOntologySpaceFactory(), srcs);
+            OntologySpace custom = scope.getCustomSpace();
+            // Register even if some ontologies were to fail to be restored afterwards.
+            scopeMap.put(scopeId, scope);
+            for (String key : struct.getCustomOntologyKeysForScope(scopeId))
+                custom.addOntology(new GraphSource(key));
+        }
+    }
+
+    @Override
+    public synchronized void registerScope(OntologyScope scope) {
+        if (scope == null) throw new IllegalArgumentException("scope cannot be null.");
+        String id = scope.getID();
+        if (this.containsScope(id)) {
+            if (scope != getScope(id)) {
+                log.warn("Overriding different scope with same ID {}", id);
+                super.registerScope(scope);
+            } else log.warn("Ignoring unnecessary call to already registered scope {}", id);
+        } else super.registerScope(scope);
+    }
+
     @Override
     public void removeScopeEventListener(ScopeEventListener listener) {
         listeners.remove(listener);
@@ -561,30 +575,4 @@ public class ONManagerImpl extends Scope
         this.ontonetNS = namespace;
     }
 
-    private void rebuildScopes() {
-        TripleCollection meta = ontologyProvider.getMetaGraph(TripleCollection.class);
-        for (Iterator<Triple> it = meta.filter(null, RDF.type, new UriRef(Vocabulary.SCOPE)); it.hasNext();) {
-            NonLiteral sub = it.next().getSubject();
-            if (sub instanceof UriRef) {
-                String s = ((UriRef) sub).getUnicodeString(), prefix = getOntologyNetworkNamespace()
-                                                                       + scopeRegistryId + "/";
-                if (s.startsWith(prefix)) {
-                    String scopeId = s.substring(prefix.length());
-                    OntologyScope scope = new OntologyScopeImpl(scopeId, IRI.create(prefix),
-                            getOntologySpaceFactory());
-
-                    // retrieve the ontologies
-                    for (Iterator<Triple> it2 = meta.filter(sub, null, null); it2.hasNext();) {
-                        Triple t = it2.next();
-                        UriRef predicate = t.getPredicate();
-                        if (predicate.equals(new UriRef(Vocabulary.MANAGES_IN_CUSTOM))) {
-                            System.out.println(t.getObject());
-                        }
-                    }
-
-                    scopeMap.put(scopeId, scope);
-                }
-            }
-        }
-    }
 }

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java Mon Jul  2 16:23:12 2012
@@ -16,12 +16,17 @@
  */
 package org.apache.stanbol.ontologymanager.ontonet.impl.clerezza;
 
-import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.IS_MANAGED_BY_CORE;
-import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.IS_MANAGED_BY_CUSTOM;
-import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.MANAGES_IN_CORE;
-import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.MANAGES_IN_CUSTOM;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.HAS_SPACE_CORE;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.HAS_SPACE_CUSTOM;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.IS_MANAGED_BY;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.IS_SPACE_CORE_OF;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.IS_SPACE_CUSTOM_OF;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.MANAGES;
 import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.SCOPE;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.SESSION;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.SPACE;
 import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary._NS_ONTONET;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary._NS_STANBOL_INTERNAL;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -30,10 +35,13 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Dictionary;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.Stack;
 
@@ -71,15 +79,18 @@ import org.apache.stanbol.commons.owl.ut
 import org.apache.stanbol.commons.owl.util.URIUtils;
 import org.apache.stanbol.commons.stanboltools.offline.OfflineMode;
 import org.apache.stanbol.ontologymanager.ontonet.api.OfflineConfiguration;
+import org.apache.stanbol.ontologymanager.ontonet.api.OntologyNetworkConfiguration;
 import org.apache.stanbol.ontologymanager.ontonet.api.collector.ImportManagementPolicy;
 import org.apache.stanbol.ontologymanager.ontonet.api.collector.OntologyCollector;
 import org.apache.stanbol.ontologymanager.ontonet.api.collector.OntologyCollectorListener;
 import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyProvider;
-import org.apache.stanbol.ontologymanager.ontonet.api.scope.CoreOntologySpace;
-import org.apache.stanbol.ontologymanager.ontonet.api.scope.CustomOntologySpace;
 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.ScopeEventListener;
 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.util.OntologyUtils;
 import org.osgi.service.component.ComponentContext;
 import org.semanticweb.owlapi.apibinding.OWLManager;
@@ -105,7 +116,7 @@ import org.slf4j.LoggerFactory;
 @Component(immediate = true, metatype = true)
 @Service(OntologyProvider.class)
 public class ClerezzaOntologyProvider implements OntologyProvider<TcProvider>, ScopeEventListener,
-        OntologyCollectorListener {
+        SessionListener, OntologyCollectorListener {
 
     private class InvalidMetaGraphStateException extends RuntimeException {
 
@@ -514,6 +525,21 @@ public class ClerezzaOntologyProvider im
         }
     }
 
+    private UriRef getIRIforScope(OntologyScope scope) {
+        // Use the Stanbol-internal namespace, so that the whole configuration can be ported.
+        return new UriRef(_NS_STANBOL_INTERNAL + OntologyScope.shortName + "/" + scope.getID());
+    }
+
+    private UriRef getIRIforSession(Session session) {
+        // Use the Stanbol-internal namespace, so that the whole configuration can be ported.
+        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 String getKey(IRI ontologyIri) {
         ontologyIri = URIUtils.sanitizeID(ontologyIri);
@@ -540,10 +566,134 @@ public class ClerezzaOntologyProvider im
         return (O) store.getTriples(new UriRef(metaGraphId));
     }
 
+    public OntologyNetworkConfiguration getOntologyNetworkConfiguration() {
+        Map<String,Collection<String>> coreOntologies = new HashMap<String,Collection<String>>(), customOntologies = new HashMap<String,Collection<String>>();
+        final TripleCollection meta = store.getTriples(new UriRef(metaGraphId));
+
+        // Scopes first
+        for (Iterator<Triple> it = meta.filter(null, RDF.type, SCOPE); it.hasNext();) { // for each scope
+            Triple ta = it.next();
+            NonLiteral sub = ta.getSubject();
+            if (sub instanceof UriRef) {
+                String s = ((UriRef) sub).getUnicodeString(), prefix = _NS_STANBOL_INTERNAL
+                                                                       + OntologyScope.shortName + "/";
+                if (s.startsWith(prefix)) {
+                    String scopeId = s.substring(prefix.length());
+                    log.info("Rebuilding scope \"{}\".", scopeId);
+                    coreOntologies.put(scopeId, new LinkedList<String>());
+                    customOntologies.put(scopeId, new LinkedList<String>());
+                    UriRef core_ur = null, custom_ur = null;
+                    Resource r;
+                    // Check core space
+                    Iterator<Triple> it2 = meta.filter(sub, HAS_SPACE_CORE, null);
+                    if (it2.hasNext()) {
+                        r = it2.next().getObject();
+                        if (r instanceof UriRef) core_ur = (UriRef) r;
+                    } else {
+                        it2 = meta.filter(null, IS_SPACE_CORE_OF, sub);
+                        if (it2.hasNext()) {
+                            r = it2.next().getSubject();
+                            if (r instanceof UriRef) core_ur = (UriRef) r;
+                        }
+                    }
+
+                    // Check custom space
+                    it2 = meta.filter(sub, HAS_SPACE_CUSTOM, null);
+                    if (it2.hasNext()) {
+                        r = it2.next().getObject();
+                        if (r instanceof UriRef) custom_ur = (UriRef) r;
+                    } else {
+                        it2 = meta.filter(null, IS_SPACE_CUSTOM_OF, sub);
+                        if (it2.hasNext()) {
+                            r = it2.next().getSubject();
+                            if (r instanceof UriRef) custom_ur = (UriRef) r;
+                        }
+                    }
+
+                    // retrieve the ontologies
+                    if (core_ur != null) {
+                        for (it2 = meta.filter(core_ur, null, null); it2.hasNext();) {
+                            Triple t = it2.next();
+                            UriRef predicate = t.getPredicate();
+                            if (predicate.equals(MANAGES)) {
+                                if (t.getObject() instanceof UriRef) coreOntologies.get(scopeId).add(
+                                  ((UriRef) t.getObject()).getUnicodeString());
+                            }
+                        }
+                        for (it2 = meta.filter(null, null, core_ur); it2.hasNext();) {
+                            Triple t = it2.next();
+                            UriRef predicate = t.getPredicate();
+                            if (predicate.equals(IS_MANAGED_BY)) {
+                                if (t.getSubject() instanceof UriRef) coreOntologies.get(scopeId).add(
+                                    ((UriRef) t.getSubject()).getUnicodeString());
+                            }
+                        }
+                    }
+                    if (custom_ur != null) {
+                        for (it2 = meta.filter(custom_ur, null, null); it2.hasNext();) {
+                            Triple t = it2.next();
+                            UriRef predicate = t.getPredicate();
+                            if (predicate.equals(MANAGES)) {
+                                if (t.getObject() instanceof UriRef) customOntologies.get(scopeId).add(
+                                  ((UriRef) t.getObject()).getUnicodeString());
+                            }
+                        }
+                        for (it2 = meta.filter(null, null, custom_ur); it2.hasNext();) {
+                            Triple t = it2.next();
+                            UriRef predicate = t.getPredicate();
+                            if (predicate.equals(IS_MANAGED_BY)) {
+                                if (t.getSubject() instanceof UriRef) customOntologies.get(scopeId).add(
+                                  ((UriRef) t.getSubject()).getUnicodeString());
+                            }
+                        }
+                    }
+
+                }
+            }
+        }
+
+        // Sessions next
+        Map<String,Collection<String>> sessionOntologies = new HashMap<String,Collection<String>>();
+        for (Iterator<Triple> it = meta.filter(null, RDF.type, SESSION); it.hasNext();) { // for each scope
+            Triple ta = it.next();
+            NonLiteral sub = ta.getSubject();
+            if (sub instanceof UriRef) {
+                UriRef ses_ur = (UriRef) sub;
+                String s = ((UriRef) sub).getUnicodeString();
+                String prefix = _NS_STANBOL_INTERNAL + Session.shortName + "/";
+                if (s.startsWith(prefix)) {
+                    String sessionId = s.substring(prefix.length());
+                    log.info("Rebuilding session \"{}\".", sessionId);
+                    sessionOntologies.put(sessionId, new HashSet<String>());
+                    // retrieve the ontologies
+                    if (ses_ur != null) {
+                        for (Iterator<Triple> it2 = meta.filter(ses_ur, null, null); it2.hasNext();) {
+                            Triple t = it2.next();
+                            UriRef predicate = t.getPredicate();
+                            if (predicate.equals(MANAGES)) {
+                                if (t.getObject() instanceof UriRef) sessionOntologies.get(sessionId).add(
+                                    ((UriRef) t.getObject()).getUnicodeString());
+                            }
+                        }
+                        for (Iterator<Triple> it2 = meta.filter(null, null, ses_ur); it2.hasNext();) {
+                            Triple t = it2.next();
+                            UriRef predicate = t.getPredicate();
+                            if (predicate.equals(IS_MANAGED_BY)) {
+                                if (t.getSubject() instanceof UriRef) sessionOntologies.get(sessionId).add(
+                                   ((UriRef) t.getSubject()).getUnicodeString());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return new OntologyNetworkConfiguration(coreOntologies, customOntologies, sessionOntologies);
+    }
+
     @Override
     public Set<String> getOntologyVersionKeys(IRI ontologyIRI) {
-        // TODO Auto-generated method stub
-        return null;
+        throw new UnsupportedOperationException("Method not implemented yet.");
     }
 
     @Override
@@ -859,64 +1009,133 @@ public class ClerezzaOntologyProvider im
     }
 
     @Override
-    public void scopeActivated(OntologyScope scope) {}
+    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
+        // into the metadata graph.
 
-    @Override
-    public void scopeCreated(OntologyScope scope) {}
+        // log.info("Heard addition of ontology {} to collector {}", addedOntology, collector.getID());
+        // log.info("This ontology is stored as {}", getKey(addedOntology));
 
-    @Override
-    public void scopeDeactivated(OntologyScope scope) {}
+        String colltype = "";
+        if (collector instanceof OntologyScope) colltype = OntologyScope.shortName + "/"; // Cannot be
+        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(addedOntology).getUnicodeString());
+
+        // TODO OntologyProvider should not be aware of scopes, spaces or sessions. Move elsewhere.
+        MGraph meta = getMetaGraph(MGraph.class);
+        boolean hasValues = false;
+        log.debug("Ontology {}", addedOntology);
+        log.debug("-- is already managed by the following collectors :");
+        for (Iterator<Triple> it = meta.filter(u, IS_MANAGED_BY, null); it.hasNext();) {
+            hasValues = true;
+            log.debug("-- {}", it.next().getObject());
+        }
+        for (Iterator<Triple> it = meta.filter(null, MANAGES, u); it.hasNext();) {
+            hasValues = true;
+            log.debug("-- {} (inverse)", it.next().getSubject());
+        }
+        if (!hasValues) log.debug("-- <none>");
+
+        // Add both inverse triples. This graph has to be traversed efficiently, no need for reasoners.
+        UriRef predicate1 = null, predicate2 = null;
+        if (collector instanceof OntologySpace) {
+            predicate1 = MANAGES;
+            predicate2 = IS_MANAGED_BY;
+        } else if (collector instanceof Session) {
+            // TODO implement model for sessions.
+            predicate1 = MANAGES;
+            predicate2 = IS_MANAGED_BY;
+        } else {
+            log.error("Unrecognized ontology collector type {} for \"{}\". Aborting.", collector.getClass(),
+                collector.getID());
+            return;
+        }
+        synchronized (meta) {
+            Triple t;
+            if (predicate1 != null) {
+                t = new TripleImpl(c, predicate1, u);
+                boolean b = meta.add(t);
+                log.debug((b ? "Successful" : "Redundant") + " addition of meta triple");
+                log.debug("-- {} ", t);
+            }
+            if (predicate2 != null) {
+                t = new TripleImpl(u, predicate2, c);
+                boolean b = meta.add(t);
+                log.debug((b ? "Successful" : "Redundant") + " addition of meta triple");
+                log.debug("-- {} ", t);
+            }
+        }
+    }
 
     @Override
-    public void scopeDeregistered(OntologyScope scope) {
-        UriRef graphId = new UriRef(metaGraphId);
-        MGraph graph = store.getMGraph(graphId);
-        if (graph == null) try {
-            graph = store.createMGraph(graphId);
-        } catch (EntityAlreadyExistsException e) {
-            log.error("Could not get meta graph {} for writing scope registration. ", graphId);
+    public void onOntologyRemoved(OntologyCollector collector, OWLOntologyID removedOntology) {
+        log.info("Heard removal of ontology {} from collector {}", removedOntology, collector.getID());
+
+        String colltype = "";
+        if (collector instanceof OntologyScope) colltype = OntologyScope.shortName + "/"; // Cannot be
+        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());
+
+        // XXX condense the following code
+        MGraph meta = getMetaGraph(MGraph.class);
+        boolean badState = true;
+
+        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)) badState = false;
+            }
         }
-        boolean removable = false, conflict = false;
-        UriRef sid = new UriRef(scope.getNamespace() + scope.getID());
-        Set<Triple> removeUs = new HashSet<Triple>();
-        for (Iterator<Triple> it = graph.filter(sid, null, null); it.hasNext();) {
-            Triple t = it.next();
-            if (RDF.type.equals(t.getPredicate())) {
-                if (new UriRef(SCOPE).equals(t.getObject())) removable = true;
-                else conflict = true;
+
+        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)) badState = false;
             }
-            removeUs.add(t);
         }
-        for (Iterator<Triple> it = graph.filter(null, null, sid); it.hasNext();)
-            removeUs.add(it.next());
-        if (!removable) log
-                .error(
-                    "Cannot write scope deregistration to persistence: resource {} is not typed as a {} in the meta-graph.",
-                    sid, SCOPE);
-        else if (conflict) log.error(
-            "Conflict upon scope deregistration: resource {} has incompatible types in the meta-graph.", sid,
-            SCOPE);
-        else {
-            log.info("Removing all triples for {}", sid);
-            graph.removeAll(removeUs);
+
+        if (badState) throw new InvalidMetaGraphStateException(
+                "No relationship found for ontology-collector pair {" + u + " , " + c + "}");
+
+        synchronized (meta) {
+            if (collector instanceof OntologySpace) {
+                meta.remove(new TripleImpl(c, MANAGES, u));
+                meta.remove(new TripleImpl(u, IS_MANAGED_BY, c));
+            }
         }
     }
 
     @Override
+    public void scopeActivated(OntologyScope scope) {}
+
+    @Override
+    public void scopeCreated(OntologyScope scope) {}
+
+    @Override
+    public void scopeDeactivated(OntologyScope scope) {}
+
+    @Override
     public void scopeRegistered(OntologyScope scope) {
-        UriRef graphId = new UriRef(metaGraphId);
-        MGraph graph = store.getMGraph(graphId);
-        if (graph == null) try {
-            graph = store.createMGraph(graphId);
-        } catch (EntityAlreadyExistsException e) {
-            log.error("Could not get meta graph {} for writing scope registration. ", graphId);
-        }
-        Triple t = new TripleImpl(new UriRef(scope.getNamespace() + scope.getID()), RDF.type, new UriRef(
-                SCOPE));
-        if (graph.contains(t)) log.info("Not adding triple {}", t);
-        else {
-            log.info("Adding triple {}", t);
-            graph.add(t);
+        updateScopeRegistration(scope);
+    }
+
+    @Override
+    public void scopeUnregistered(OntologyScope scope) {
+        updateScopeUnregistration(scope);
+    }
+
+    @Override
+    public void sessionChanged(SessionEvent event) {
+        if (event.getOperationType() == OperationType.CREATE) {
+            updateSessionRegistration(event.getSession());
+        } else if (event.getOperationType() == OperationType.KILL) {
+            updateSessionUnregistration(event.getSession());
         }
     }
 
@@ -1048,119 +1267,124 @@ public class ClerezzaOntologyProvider im
         }
     }
 
-    @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
-        // into the metadata graph.
-
-        // log.info("Heard addition of ontology {} to collector {}", addedOntology, collector.getID());
-        // log.info("This ontology is stored as {}", getKey(addedOntology));
-        UriRef c = new UriRef(collector.getNamespace() + collector.getID());
-        UriRef u = keymap.buildResource(addedOntology);
-
-        // TODO OntologyProvider should not be aware of scopes, spaces or sessions. Move elsewhere.
-        MGraph meta = getMetaGraph(MGraph.class);
-        String sMan = "";
-        for (Iterator<Triple> it = meta.filter(u, new UriRef(IS_MANAGED_BY_CUSTOM), null); it.hasNext();)
-            sMan += it.next() + ", ";
-        for (Iterator<Triple> it = meta.filter(u, new UriRef(IS_MANAGED_BY_CORE), null); it.hasNext();)
-            sMan += it.next() + ", ";
-        for (Iterator<Triple> it = meta.filter(null, new UriRef(MANAGES_IN_CUSTOM), u); it.hasNext();)
-            sMan += it.next() + "(inverse), ";
-        for (Iterator<Triple> it = meta.filter(null, new UriRef(MANAGES_IN_CORE), u); it.hasNext();)
-            sMan += it.next() + "(inverse), ";
-        if (!sMan.isEmpty()) log.warn("Ontology {} is already managed by the following collectors : " + sMan,
-            addedOntology);
-
-        // Add both inverse triples. This graph has to be traversed efficiently, no need for reasoners.
-        UriRef predicate1 = null, predicate2 = null;
-        if (collector instanceof CoreOntologySpace) {
-            predicate1 = new UriRef(MANAGES_IN_CORE);
-            predicate2 = new UriRef(IS_MANAGED_BY_CORE);
-        } else if (collector instanceof CustomOntologySpace) {
-            predicate1 = new UriRef(MANAGES_IN_CUSTOM);
-            predicate2 = new UriRef(IS_MANAGED_BY_CUSTOM);
-        } else if (collector instanceof Session) {
-            // TODO implement model for sessions.
-        }
+    /**
+     * 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 TripleCollection meta = store.getTriples(new UriRef(metaGraphId));
+        final UriRef scopeur = getIRIforScope(scope);
+        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) {
-            Triple t;
-            if (predicate1 != null) {
-                t = new TripleImpl(c, predicate1, u);
-                boolean b = meta.add(t);
-                log.debug((b ? "Successful" : "Redundant") + " addition of meta triple {} ", t);
-            }
-            if (predicate2 != null) {
-                t = new TripleImpl(u, predicate2, c);
-                boolean b = meta.add(t);
-                log.debug((b ? "Successful" : "Redundant") + " addition of meta triple {} ", t);
-            }
+            // Spaces are created along with the scope, so it is safe to add their triples.
+            meta.add(new TripleImpl(scopeur, RDF.type, SCOPE));
+            meta.add(new TripleImpl(coreur, RDF.type, SPACE));
+            meta.add(new TripleImpl(custur, RDF.type, SPACE));
+            meta.add(new TripleImpl(scopeur, HAS_SPACE_CORE, coreur));
+            meta.add(new TripleImpl(scopeur, HAS_SPACE_CUSTOM, custur));
+            // Add inverse predicates so we can traverse the graph in both directions.
+            meta.add(new TripleImpl(coreur, IS_SPACE_CORE_OF, scopeur));
+            meta.add(new TripleImpl(custur, IS_SPACE_CUSTOM_OF, scopeur));
         }
+        log.debug("Ontology collector information triples added for scope \"{}\".", scope);
     }
 
-    @Override
-    public void onOntologyRemoved(OntologyCollector collector, OWLOntologyID removedOntology) {
-        log.info("Heard removal of ontology {} from collector {}", removedOntology, collector.getID());
-
-        UriRef c = new UriRef(collector.getNamespace() + collector.getID());
-        UriRef u = keymap.buildResource(removedOntology);
-
-        // XXX condense the following code
-        MGraph meta = getMetaGraph(MGraph.class);
-        boolean badState = true;
-
-        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 CoreOntologySpace) {
-                if (property.equals(new UriRef(MANAGES_IN_CORE))) badState = false;
-                if (property.equals(new UriRef(MANAGES_IN_CUSTOM))) log
-                        .warn("Ontology {} is still managed by custom space {}. "
-                              + "Removal from core space might alter axiom interpretation within the scope.");
-            }
-
-            if (collector instanceof CustomOntologySpace) {
-                if (property.equals(new UriRef(MANAGES_IN_CORE))) log
-                        .warn("Ontology {} is still managed by core space {}. "
-                              + "Removal from the custom space will most likely have no effect on the scope.");
-                if (property.equals(new UriRef(MANAGES_IN_CUSTOM))) badState = false;
+    /**
+     * 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();
+        final TripleCollection meta = store.getTriples(new UriRef(metaGraphId));
+        boolean removable = false, conflict = false;
+        final UriRef scopeur = getIRIforScope(scope);
+        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.equals(t.getObject())) removable = true;
+                else conflict = true;
             }
+            removeUs.add(t);
         }
-
-        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 CoreOntologySpace) {
-                if (property.equals(new UriRef(IS_MANAGED_BY_CORE))) badState = false;
-                if (property.equals(new UriRef(IS_MANAGED_BY_CUSTOM))) log
-                        .warn("Ontology {} is still managed by custom space {}. "
-                              + "Removal from core space might alter axiom interpretation within the scope.");
-            }
-
-            if (collector instanceof CustomOntologySpace) {
-                if (property.equals(new UriRef(IS_MANAGED_BY_CORE))) log
-                        .warn("Ontology {} is still managed by core space {}. "
-                              + "Removal from the custom space will most likely have no effect on the scope.");
-                if (property.equals(new UriRef(IS_MANAGED_BY_CUSTOM))) badState = false;
-            }
+        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);
+        } 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);
         }
+    }
 
-        if (badState) throw new InvalidMetaGraphStateException(
-                "No relationship found for ontology-collector pair {" + u + " , " + c + "}");
-
+    private void updateSessionRegistration(Session session) {
+        final TripleCollection meta = store.getTriples(new UriRef(metaGraphId));
+        final UriRef sesur = getIRIforSession(session);
+        // If this method was called after a session rebuild, the following will have little to no effect.
         synchronized (meta) {
-            if (collector instanceof CoreOntologySpace) {
-                meta.remove(new TripleImpl(c, new UriRef(MANAGES_IN_CORE), u));
-                meta.remove(new TripleImpl(u, new UriRef(IS_MANAGED_BY_CORE), c));
-            } else if (collector instanceof CustomOntologySpace) {
-                meta.remove(new TripleImpl(c, new UriRef(MANAGES_IN_CUSTOM), u));
-                meta.remove(new TripleImpl(u, new UriRef(IS_MANAGED_BY_CUSTOM), c));
+            // The only essential triple to add is typing
+            meta.add(new TripleImpl(sesur, RDF.type, SESSION));
+        }
+        log.debug("Ontology collector information triples added for session \"{}\".", sesur);
+    }
+
+    private void updateSessionUnregistration(Session session) {
+        long before = System.currentTimeMillis();
+        boolean removable = false, conflict = false;
+        final TripleCollection meta = store.getTriples(new UriRef(metaGraphId));
+        final UriRef sessionur = getIRIforSession(session);
+        Set<Triple> removeUs = new HashSet<Triple>();
+        for (Iterator<Triple> it = meta.filter(sessionur, null, null); it.hasNext();) {
+            Triple t = it.next();
+            if (RDF.type.equals(t.getPredicate())) {
+                if (SESSION.equals(t.getObject())) removable = true;
+                else conflict = true;
             }
+            removeUs.add(t);
+        }
+        if (!removable) {
+            log.error("Cannot write session deregistration to persistence:");
+            log.error("-- resource {}", sessionur);
+            log.error("-- is not typed as a {} in the meta-graph.", SESSION);
+        } else if (conflict) {
+            log.error("Conflict upon session deregistration:");
+            log.error("-- resource {}", sessionur);
+            log.error("-- has incompatible types in the meta-graph.");
+        } else {
+            log.debug("Removing all triples for session \"{}\".", session.getID());
+            Iterator<Triple> it;
+            for (it = meta.filter(null, null, sessionur); it.hasNext();)
+                removeUs.add(it.next());
+            for (it = meta.filter(sessionur, null, null); it.hasNext();)
+                removeUs.add(it.next());
+            meta.removeAll(removeUs);
+            log.debug("Done; removed {} triples in {} ms.", removeUs.size(), System.currentTimeMillis()
+                                                                             - before);
         }
     }
 

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ontology/ScopeRegistryImpl.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ontology/ScopeRegistryImpl.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ontology/ScopeRegistryImpl.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/ontology/ScopeRegistryImpl.java Mon Jul  2 16:23:12 2012
@@ -89,7 +89,7 @@ public class ScopeRegistryImpl implement
      */
     protected void fireScopeDeregistered(OntologyScope scope) {
         for (ScopeEventListener l : listeners)
-            l.scopeDeregistered(scope);
+            l.scopeUnregistered(scope);
     }
 
     /**

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/owlapi/OWLAPIOntologyProvider.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/owlapi/OWLAPIOntologyProvider.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/owlapi/OWLAPIOntologyProvider.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/owlapi/OWLAPIOntologyProvider.java Mon Jul  2 16:23:12 2012
@@ -22,6 +22,7 @@ import java.util.Set;
 
 import org.apache.clerezza.rdf.core.TripleCollection;
 import org.apache.stanbol.commons.owl.util.OWLUtils;
+import org.apache.stanbol.ontologymanager.ontonet.api.OntologyNetworkConfiguration;
 import org.apache.stanbol.ontologymanager.ontonet.api.collector.ImportManagementPolicy;
 import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyProvider;
 import org.semanticweb.owlapi.apibinding.OWLManager;
@@ -74,6 +75,11 @@ public class OWLAPIOntologyProvider impl
     }
 
     @Override
+    public String getKey(OWLOntologyID ontologyId) {
+        return ontologyId.getDefaultDocumentIRI().toString();
+    }
+
+    @Override
     public Set<String> getKeys() {
         Set<String> result = new HashSet<String>();
         for (OWLOntology o : store.getOntologies())
@@ -82,6 +88,24 @@ public class OWLAPIOntologyProvider impl
     }
 
     @Override
+    public <O extends TripleCollection> O getMetaGraph(Class<O> returnType) {
+        throw new UnsupportedOperationException(
+                "The OWL API implementation does not use a graph for storing correspondencies");
+    }
+
+    @Override
+    public OntologyNetworkConfiguration getOntologyNetworkConfiguration() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Set<String> getOntologyVersionKeys(IRI ontologyIRI) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
     public OWLOntologyManager getStore() {
         return store;
     }
@@ -129,6 +153,11 @@ public class OWLAPIOntologyProvider impl
     }
 
     @Override
+    public boolean hasOntology(IRI ontologyIri) {
+        return hasOntology(new OWLOntologyID(ontologyIri));
+    }
+
+    @Override
     public boolean hasOntology(OWLOntologyID id) {
         return store.contains(id);
     }
@@ -175,31 +204,9 @@ public class OWLAPIOntologyProvider impl
     }
 
     @Override
-    public boolean hasOntology(IRI ontologyIri) {
-        return hasOntology(new OWLOntologyID(ontologyIri));
-    }
-
-    @Override
-    public <O extends TripleCollection> O getMetaGraph(Class<O> returnType) {
-        throw new UnsupportedOperationException(
-                "The OWL API implementation does not use a graph for storing correspondencies");
-    }
-
-    @Override
-    public String getKey(OWLOntologyID ontologyId) {
-        return ontologyId.getDefaultDocumentIRI().toString();
-    }
-
-    @Override
-    public Set<String> getOntologyVersionKeys(IRI ontologyIRI) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
     public void setLocatorMapping(IRI locator, String key) {
         // TODO Auto-generated method stub
-        
+
     }
 
 }

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/renderers/ScopeSetRenderer.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/renderers/ScopeSetRenderer.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/renderers/ScopeSetRenderer.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/renderers/ScopeSetRenderer.java Mon Jul  2 16:23:12 2012
@@ -48,7 +48,7 @@ public class ScopeSetRenderer {
 
     private static OWLDataFactory __factory = OWLManager.getOWLDataFactory();
 
-    private static IRI _scopeIri = IRI.create(Vocabulary.SCOPE);
+    private static IRI _scopeIri = IRI.create(Vocabulary.SCOPE.getUnicodeString());
 
     private static OWLClass cScope = __factory.getOWLClass(_scopeIri);
 

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionManagerImpl.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionManagerImpl.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/SessionManagerImpl.java Mon Jul  2 16:23:12 2012
@@ -31,6 +31,9 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.Service;
+import org.apache.stanbol.ontologymanager.ontonet.api.OntologyNetworkConfiguration;
+import org.apache.stanbol.ontologymanager.ontonet.api.collector.OntologyCollectorListener;
+import org.apache.stanbol.ontologymanager.ontonet.api.io.GraphSource;
 import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyProvider;
 import org.apache.stanbol.ontologymanager.ontonet.api.session.DuplicateSessionIDException;
 import org.apache.stanbol.ontologymanager.ontonet.api.session.NonReferenceableSessionException;
@@ -166,7 +169,16 @@ public class SessionManagerImpl implemen
             log.warn("The Ontology Network Manager configuration does not define a ID for the Ontology Network Manager");
         }
 
-        idgen = new TimestampedSessionIDGenerator(IRI.create(getNamespace() + getID() + "/"));
+        idgen = new TimestampedSessionIDGenerator();
+
+        // Add listeners
+        if (ontologyProvider instanceof SessionListener) this
+                .addSessionListener((SessionListener) ontologyProvider);
+
+        // Rebuild sessions
+        rebuildSessions();
+
+        log.debug(SessionManager.class + " activated.");
     }
 
     protected synchronized void addSession(Session session) {
@@ -214,6 +226,11 @@ public class SessionManagerImpl implemen
         checkSessionLimit();
         IRI ns = IRI.create(getNamespace() + getID() + "/");
         Session session = new SessionImpl(sessionID, ns, ontologyProvider);
+
+        // Have the ontology provider listen to ontology events
+        if (ontologyProvider instanceof OntologyCollectorListener) session
+                .addOntologyCollectorListener((OntologyCollectorListener) ontologyProvider);
+
         addSession(session);
         fireSessionCreated(session);
         return session;
@@ -306,6 +323,31 @@ public class SessionManagerImpl implemen
         return listeners;
     }
 
+    private void rebuildSessions() {
+        if (ontologyProvider == null) {
+            log.warn("No ontology provider supplied. Cannot rebuild sessions");
+            return;
+        }
+        OntologyNetworkConfiguration struct = ontologyProvider.getOntologyNetworkConfiguration();
+        for (String sessionId : struct.getSessionIDs()) {
+            Session session;
+            try {
+                session = createSession(sessionId);
+                // Register even if some ontologies were to fail to be restored afterwards.
+                sessionsByID.put(sessionId, session);
+                session.setActive(false); // Restored sessions are inactive at first.
+                for (String key : struct.getOntologyKeysForSession(sessionId))
+                    session.addOntology(new GraphSource(key));
+            } catch (DuplicateSessionIDException e) {
+                log.warn("Session \"{}\" already exists and will be reused.", sessionId);
+                session = getSession(sessionId);
+            } catch (SessionLimitException e) {
+                log.error("Cannot create session {}. Session limit of {} reached.", sessionId,
+                    getActiveSessionLimit());
+            }
+        }
+    }
+
     protected synchronized void removeSession(Session session) {
         String id = session.getID();
         Session s2 = sessionsByID.get(id);

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/TimestampedSessionIDGenerator.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/TimestampedSessionIDGenerator.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/TimestampedSessionIDGenerator.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/session/TimestampedSessionIDGenerator.java Mon Jul  2 16:23:12 2012
@@ -33,13 +33,19 @@ public class TimestampedSessionIDGenerat
 
     private IRI baseIRI;
 
+    public TimestampedSessionIDGenerator() {
+        this.baseIRI = null;
+    }
+
     public TimestampedSessionIDGenerator(IRI baseIRI) {
         this.baseIRI = baseIRI;
     }
 
     @Override
     public String createSessionID() {
-        return StringUtils.stripIRITerminator(baseIRI) + "/session/" + new Date().getTime();
+        String id = "";
+        if (baseIRI != null) id += StringUtils.stripIRITerminator(baseIRI) + "/session/";
+        return id + new Date().getTime();
     }
 
     @Override

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/TestOntologyNetworkPersistence.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/TestOntologyNetworkPersistence.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/TestOntologyNetworkPersistence.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/TestOntologyNetworkPersistence.java Mon Jul  2 16:23:12 2012
@@ -20,9 +20,13 @@ import static org.apache.stanbol.ontolog
 import static org.apache.stanbol.ontologymanager.ontonet.MockOsgiContext.parser;
 import static org.apache.stanbol.ontologymanager.ontonet.MockOsgiContext.resetManagers;
 import static org.apache.stanbol.ontologymanager.ontonet.MockOsgiContext.sessionManager;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.IS_MANAGED_BY;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary.MANAGES;
+import static org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary._NS_STANBOL_INTERNAL;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.InputStream;
@@ -36,10 +40,10 @@ import org.apache.clerezza.rdf.core.impl
 import org.apache.clerezza.rdf.core.serializedform.SupportedFormat;
 import org.apache.clerezza.rdf.simple.storage.SimpleTcProvider;
 import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
-import org.apache.stanbol.ontologymanager.ontonet.api.Vocabulary;
 import org.apache.stanbol.ontologymanager.ontonet.api.io.GraphContentInputSource;
 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;
 import org.apache.stanbol.ontologymanager.ontonet.api.session.Session;
 import org.apache.stanbol.ontologymanager.ontonet.impl.ONManagerImpl;
 import org.apache.stanbol.ontologymanager.ontonet.impl.OfflineConfigurationImpl;
@@ -55,6 +59,8 @@ import org.slf4j.LoggerFactory;
  * This suite is for testing that all the meta-level information stored by OntoNet can be retrieved and
  * rebuilt if OntoNet or Stanbol goes down but the Clerezza store is not cleared.
  * 
+ * TODO add tests for preserving added ontologies
+ * 
  * @author alexdma
  * 
  */
@@ -77,25 +83,27 @@ public class TestOntologyNetworkPersiste
         OntologyScope scope = onm.createOntologyScope(scopeId, new GraphContentInputSource(getClass()
                 .getResourceAsStream("/ontologies/test1.owl")));
 
-        UriRef collector = new UriRef(scope.getNamespace() + scope.getCoreSpace().getID());
-        UriRef test1id = new UriRef("http://stanbol.apache.org/ontologies/test1.owl"); // Has no versionIRI
-
+        UriRef collector = new UriRef(_NS_STANBOL_INTERNAL + OntologySpace.shortName + "/"
+                                      + scope.getCoreSpace().getID());
+        UriRef test1id = new UriRef(ontologyProvider.getKey(IRI
+                .create("http://stanbol.apache.org/ontologies/test1.owl"))); // Has no versionIRI
         // Be strict: the whole property pair must be there.
-        UriRef predicate = new UriRef(Vocabulary.MANAGES_IN_CORE);
+        UriRef predicate = MANAGES;
         assertTrue(meta.contains(new TripleImpl(collector, predicate, test1id)));
-        predicate = new UriRef(Vocabulary.IS_MANAGED_BY_CORE);
+        predicate = IS_MANAGED_BY;
         assertTrue(meta.contains(new TripleImpl(test1id, predicate, collector)));
 
         scope.tearDown(); // To modify the core space.
 
         scope.getCoreSpace().addOntology(
             new GraphContentInputSource(getClass().getResourceAsStream("/ontologies/minorcharacters.owl")));
-        UriRef minorId = new UriRef("http://stanbol.apache.org/ontologies/pcomics/minorcharacters.owl"); // Has no versionIRI
-        predicate = new UriRef(Vocabulary.MANAGES_IN_CORE);
+        UriRef minorId = new UriRef(ontologyProvider.getKey(IRI
+                .create("http://stanbol.apache.org/ontologies/pcomics/minorcharacters.owl")));
+        predicate = MANAGES;
         assertTrue(meta.contains(new TripleImpl(collector, predicate, minorId)));
-        predicate = new UriRef(Vocabulary.IS_MANAGED_BY_CORE);
+        predicate = IS_MANAGED_BY;
         assertTrue(meta.contains(new TripleImpl(minorId, predicate, collector)));
-        
+
         scope.getCustomSpace().addOntology(
             new GraphContentInputSource(getClass().getResourceAsStream("/ontologies/test1.owl")));
 
@@ -103,7 +111,7 @@ public class TestOntologyNetworkPersiste
             new GraphContentInputSource(getClass().getResourceAsStream("/ontologies/minorcharacters.owl")));
     }
 
-    // @Test
+    @Test
     public void preservesManagedOntologies() throws Exception {
         String id = "preserve";
         OntologyScope scope = onManager.createOntologyScope(id, new GraphContentInputSource(getClass()
@@ -113,44 +121,52 @@ public class TestOntologyNetworkPersiste
                 "/ontologies/nonexistentcharacters.owl")));
 
         // Simulate Stanbol going down.
+        log.info("Stanbol going down...");
         resetOntologyProvider(); // but keep the TcProvider
         resetManagers();
 
         OntologyScope sc = onManager.getScope(id);
         assertNotNull(sc);
         // assertEquals(scope, sc); XXX should scopes be equal on ID + content?
-
-        // for (IRI iri : sc.getCustomSpace().listManagedOntologies())
-        // System.out.println(iri);
     }
 
     @Test
     public void scopesAndSessionsOutliveOntoNet() throws Exception {
-        String id1 = "scope1", id2 = "scope2";
+        /*
+         * Both scopes will be created, but scope1 will be unregistered and we expect not to be able to
+         * rebuild it.
+         */
+        String id1 = "scope1", id2 = "scope2", sid2 = "auto-" + System.currentTimeMillis();
 
         // Setup a network
-
         OntologyScope scope1 = onManager.createOntologyScope(id1);
         assertNotNull(scope1);
-        // OntologyScope scope2 = onManager.createOntologyScope(id2);
-        // assertNotNull(scope2);
-
-        // onManager.deregisterScope(scope1);
+        OntologyScope scope2 = onManager.createOntologyScope(id2);
+        assertNotNull(scope2);
+        onManager.deregisterScope(scope1);
 
+        // A session with a system ID
         Session ses1 = sessionManager.createSession();
+        String sid1 = ses1.getID();
         assertNotNull(ses1);
-        assertNotNull(ses1.getID());
-        assertFalse(ses1.getID().isEmpty());
-        Session ses2 = sessionManager.createSession();
+        assertNotNull(sid1);
+        assertFalse(sid1.isEmpty());
+        // A session with an ID chosen manually
+        Session ses2 = sessionManager.createSession(sid2);
         assertNotNull(ses2);
         assertNotNull(ses2.getID());
-        assertFalse(ses2.getID().isEmpty());
+        assertEquals(sid2, ses2.getID());
 
+        log.info("Stanbol going down...");
         resetOntologyProvider(); // but keep the TcProvider
         resetManagers();
 
-        assertNotNull(onManager.getScope(id1));
-        // assertNotNull(onManager.getScope(id2));
+        // The unregistered scope should be missing.
+        assertNull(onManager.getScope(id1));
+        // The other collectors should have been rebuilt.
+        assertNotNull(onManager.getScope(id2));
+        assertNotNull(sessionManager.getSession(sid1));
+        assertNotNull(sessionManager.getSession(sid2));
     }
 
     /*
@@ -198,6 +214,7 @@ public class TestOntologyNetworkPersiste
         assertNotNull(id);
         assertEquals(foaf, id);
 
+        log.info("Stanbol going down...");
         resetOntologyProvider(); // but keep the TcProvider
         assertEquals(total, ontologyProvider.getKeys().size());
 
@@ -212,34 +229,36 @@ public class TestOntologyNetworkPersiste
             ontologyProvider.getStoredOntology(ontologyProvider.getKey(foaf), OWLOntology.class, false));
     }
 
-   @Test
+    @Test
     public void canRetrieveOntologySingleton() throws Exception {
 
         OWLOntologyID foaf = new OWLOntologyID(IRI.create("http://xmlns.com/foaf/0.1/"));
         OWLOntology o1;
 
-        // Get the fake FOAF
+        // Get the fake FOAF and load it into the ontology provider
         InputStream data = getClass().getResourceAsStream("/ontologies/mockfoaf.rdf");
+        // Keep track of its storage key
         String key = ontologyProvider.loadInStore(data, SupportedFormat.RDF_XML, false);
         assertNotNull(key);
         assertFalse(key.isEmpty());
 
-        // Retrieve the stored ontology
+        // Retrieve the stored fake FOAF
         assertEquals(1, ontologyProvider.getKeys().size());
         o1 = ontologyProvider.getStoredOntology(key, OWLOntology.class, false);
         OWLOntologyID id = o1.getOntologyID();
         assertNotNull(id);
         assertEquals(foaf, id);
 
-        // Check there is a storage key for the FOAF ID
+        // Check there is a storage key for the (real) ID of the FOAF ontology
         key = ontologyProvider.getKey(foaf);
         assertNotNull(key);
         assertFalse(key.isEmpty());
 
+        log.info("Stanbol going down...");
         resetOntologyProvider(); // but keep the TcProvider
         assertEquals(1, ontologyProvider.getKeys().size());
 
-        // Check again
+        // Check again for the FOAF key
         key = ontologyProvider.getKey(foaf);
         assertNotNull(key);
         assertFalse(key.isEmpty());
@@ -248,6 +267,9 @@ public class TestOntologyNetworkPersiste
         assertEquals(o1, ontologyProvider.getStoredOntology(key, OWLOntology.class, false));
     }
 
+    /*
+     * Before each test, everything is cleaned up, including the TcProvider.
+     */
     @Before
     public void cleanup() throws Exception {
         tcp = new SimpleTcProvider();
@@ -257,6 +279,10 @@ public class TestOntologyNetworkPersiste
                 new OntologySpaceFactoryImpl(ontologyProvider, empty), empty);
     }
 
+    /*
+     * With this method, the ontology provider and all its internal indices are cleared. However, the Clerezza
+     * persistence objects are not cleared, so we can check if we can still retrieve metadata from them.
+     */
     private void resetOntologyProvider() {
         ontologyProvider = new ClerezzaOntologyProvider(tcp, new OfflineConfigurationImpl(
                 new Hashtable<String,Object>()), parser);

Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/session/TestSessions.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/session/TestSessions.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/session/TestSessions.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/session/TestSessions.java Mon Jul  2 16:23:12 2012
@@ -15,7 +15,8 @@
  * limitations under the License.
  */
 package org.apache.stanbol.ontologymanager.ontonet.session;
-import static org.apache.stanbol.ontologymanager.ontonet.MockOsgiContext.*;
+
+import static org.apache.stanbol.ontologymanager.ontonet.MockOsgiContext.ontologyProvider;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -27,7 +28,6 @@ import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Set;
 
-import org.apache.clerezza.rdf.simple.storage.SimpleTcProvider;
 import org.apache.stanbol.commons.owl.OWLOntologyManagerFactory;
 import org.apache.stanbol.ontologymanager.ontonet.Constants;
 import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
@@ -72,8 +72,9 @@ public class TestSessions {
     public static void setup() {
         Dictionary<String,Object> onmconf = new Hashtable<String,Object>();
         // An ONManagerImpl with no store and default settings
-        ONManager onm = new ONManagerImpl(ontologyProvider, new OfflineConfigurationImpl(onmconf), spaceFactory, onmconf);
-        sesmgr = new SessionManagerImpl(null, onmconf);
+        ONManager onm = new ONManagerImpl(ontologyProvider, new OfflineConfigurationImpl(onmconf),
+                spaceFactory, onmconf);
+        sesmgr = new SessionManagerImpl(ontologyProvider, onmconf);
         scopeFactory = onm;
         spaceFactory = onm.getOntologySpaceFactory();
         scopeRegistry = onm;
@@ -108,7 +109,7 @@ public class TestSessions {
         }
         Session ses = sesmgr.createSession();
         String sesid = ses.getID();
-        // FIXME replace with proper tests
+        // TODO replace with proper tests
         // assertFalse(scope1.getSessionSpaces().isEmpty());
         // assertNotNull(scope1.getSessionSpace(sesid));
         // assertFalse(scope3.getSessionSpaces().isEmpty());

Modified: incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java?rev=1356320&r1=1356319&r2=1356320&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java (original)
+++ incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java Mon Jul  2 16:23:12 2012
@@ -16,6 +16,11 @@
  */
 package org.apache.stanbol.ontologymanager.web.resources;
 
+import static javax.ws.rs.HttpMethod.DELETE;
+import static javax.ws.rs.HttpMethod.GET;
+import static javax.ws.rs.HttpMethod.OPTIONS;
+import static javax.ws.rs.HttpMethod.POST;
+import static javax.ws.rs.HttpMethod.PUT;
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 import static javax.ws.rs.core.MediaType.MULTIPART_FORM_DATA;
 import static javax.ws.rs.core.MediaType.TEXT_HTML;
@@ -224,6 +229,10 @@ public class ScopeResource extends BaseS
         return rb.build();
     }
 
+    public Set<Library> getLibraries() {
+        return regMgr.getLibraries();
+    }
+
     /*
      * Needed for freemarker
      */
@@ -231,14 +240,18 @@ public class ScopeResource extends BaseS
         return scope;
     }
 
-    public Set<Library> getLibraries() {
-        return regMgr.getLibraries();
+    @OPTIONS
+    public Response handleCorsPreflight(@Context HttpHeaders headers) {
+        ResponseBuilder rb = Response.ok();
+        enableCORS(servletContext, rb, headers, GET, POST, PUT, DELETE, OPTIONS);
+        return rb.build();
     }
 
     @OPTIONS
-    public Response handleCorsPreflight(@Context HttpHeaders headers) {
+    @Path("/{ontologyId:.+}")
+    public Response handleCorsPreflightOntology(@Context HttpHeaders headers) {
         ResponseBuilder rb = Response.ok();
-        enableCORS(servletContext, rb, headers);
+        enableCORS(servletContext, rb, headers, GET, DELETE, OPTIONS);
         return rb.build();
     }
 
@@ -686,7 +699,7 @@ public class ScopeResource extends BaseS
             throw new WebApplicationException(ex, INTERNAL_SERVER_ERROR);
         }
 
-        ResponseBuilder rb = Response.ok();
+        ResponseBuilder rb = Response.created(uriInfo.getAbsolutePath());
         addCORSOrigin(servletContext, rb, headers);
         return rb.build();
     }