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/02/17 17:41:54 UTC
svn commit: r1245648 - in /incubator/stanbol/trunk/ontologymanager: ontonet/
ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/
ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/
ontonet/src/main...
Author: alexdma
Date: Fri Feb 17 16:41:53 2012
New Revision: 1245648
URL: http://svn.apache.org/viewvc?rev=1245648&view=rev
Log:
* First implementation of a "touch library" policy from STANBOL-497; namely, policy 1 (REST-side) with selection of the library with fewest ontologies, whatever the size.
* Some freemarker stuff to allow operations on OntoNet via the HTML interface.
Added:
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProviderListener.java
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/static/scripts/
- copied from r1243475, incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/static/actions/
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/static/scripts/jquery-1.6.1
- copied unchanged from r1243475, incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/static/jquery/jquery-1.6.1
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/static/style/
- copied from r1243475, incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/static/css/
Removed:
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/static/actions/
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/static/css/
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/static/jquery/
Modified:
incubator/stanbol/trunk/ontologymanager/ontonet/pom.xml
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyCollector.java
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/AbstractOntologyCollectorImpl.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/AbstractOntologySpaceImpl.java
incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/io/TestClerezzaInputSources.java
incubator/stanbol/trunk/ontologymanager/registry/src/main/java/org/apache/stanbol/ontologymanager/registry/impl/RegistryManagerImpl.java
incubator/stanbol/trunk/ontologymanager/registry/src/main/java/org/apache/stanbol/ontologymanager/registry/impl/model/LibraryImpl.java
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/OntonetFragment.java
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntologyNetworkResource.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/StoredOntologyResource.java
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntologyNetworkResource/index.ftl
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/RegistryManagerResource/index.ftl
Modified: incubator/stanbol/trunk/ontologymanager/ontonet/pom.xml
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/pom.xml?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/pom.xml (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/pom.xml Fri Feb 17 16:41:53 2012
@@ -130,6 +130,11 @@
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-simple</artifactId>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.apache.clerezza</groupId>
<artifactId>rdf.jena.parser</artifactId>
Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyCollector.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyCollector.java?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyCollector.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyCollector.java Fri Feb 17 16:41:53 2012
@@ -137,6 +137,8 @@ public interface OntologyCollector exten
* @return
*/
int getOntologyCount(boolean withClosure);
+
+ int getOntologyCount();
/**
* Determines if the ontology identified by the supplied <i>logical</i> IRI has been loaded in this space.<br>
Added: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProviderListener.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProviderListener.java?rev=1245648&view=auto
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProviderListener.java (added)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/ontology/OntologyProviderListener.java Fri Feb 17 16:41:53 2012
@@ -0,0 +1,51 @@
+/*
+ * 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.ontology;
+
+public interface OntologyProviderListener {
+
+ /**
+ * A utility implementation of {@link OntologyProviderListener} that does nothing.
+ *
+ * @author alessandro
+ *
+ */
+ public class Stub implements OntologyProviderListener {
+
+ @Override
+ public void beforeOntologyRequested(OntologyProvider<?> provider, String key) {}
+
+ @Override
+ public void beforeOntologyStored(OntologyProvider<?> provider, Object ontology) {}
+
+ @Override
+ public void onOntologyRequested(OntologyProvider<?> provider, String key) {}
+
+ @Override
+ public void onOntologyStored(OntologyProvider<?> provider, Object ontology) {}
+
+ }
+
+ void beforeOntologyRequested(OntologyProvider<?> provider, String key);
+
+ void beforeOntologyStored(OntologyProvider<?> provider, Object ontology);
+
+ void onOntologyRequested(OntologyProvider<?> provider, String key);
+
+ void onOntologyStored(OntologyProvider<?> provider, Object ontology);
+
+}
Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/AbstractOntologyCollectorImpl.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/AbstractOntologyCollectorImpl.java?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/AbstractOntologyCollectorImpl.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/AbstractOntologyCollectorImpl.java Fri Feb 17 16:41:53 2012
@@ -573,6 +573,11 @@ public abstract class AbstractOntologyCo
"Closure support not implemented efficiently yet. Please call getOntologyCount(false).");
return managedOntologies.size();
}
+
+ @Override
+ public int getOntologyCount() {
+ return getOntologyCount(false);
+ }
@Override
public Set<Class<?>> getSupportedOntologyTypes() {
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=1245648&r1=1245647&r2=1245648&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 Fri Feb 17 16:41:53 2012
@@ -318,12 +318,16 @@ public class ClerezzaOntologyProvider im
@Override
public <O> O getStoredOntology(IRI reference, Class<O> returnType) {
- return getStoredOntology(getKey(reference), returnType);
+ return getStoredOntology(reference, returnType, false);
}
@Override
public <O> O getStoredOntology(IRI reference, Class<O> returnType, boolean forceMerge) {
- return getStoredOntology(getKey(reference), returnType, forceMerge);
+ String key = getKey(reference);
+ if (key == null || key.isEmpty()) {
+ log.warn("No key found for IRI {}", reference);
+ return null;
+ } else return getStoredOntology(key, returnType, forceMerge);
}
@Override
@@ -337,11 +341,12 @@ public class ClerezzaOntologyProvider im
@SuppressWarnings("unchecked")
@Override
public <O> O getStoredOntology(String identifier, Class<O> returnType, boolean forceMerge) {
- if (identifier == null) throw new IllegalArgumentException("Identifier cannot be null");
+ if (identifier == null || identifier.isEmpty()) throw new IllegalArgumentException(
+ "Identifier cannot be null or empty.");
if (returnType == null) {
// Defaults to OWLOntology
returnType = (Class<O>) OWLOntology.class;
- log.warn("No return type given for ontologies. Will return a {}", returnType);
+ log.warn("No return type given for the ontology. Will return a {}", returnType.getCanonicalName());
}
boolean canDo = false;
for (Class<?> clazz : getSupportedReturnTypes())
@@ -350,11 +355,12 @@ public class ClerezzaOntologyProvider im
break;
}
if (!canDo) throw new UnsupportedOperationException(
- "Return type " + returnType
+ "Return type " + returnType.getCanonicalName()
+ " is not allowed in this implementation. Only allowed return types are "
+ supported);
TripleCollection tc = store.getTriples(new UriRef(identifier));
+ if (tc == null) return null;
if (MGraph.class.isAssignableFrom(returnType)) {
return returnType.cast(tc);
@@ -362,7 +368,9 @@ public class ClerezzaOntologyProvider im
try {
return (O) toOWLOntology(new UriRef(identifier), forceMerge);
} catch (OWLOntologyCreationException e) {
- log.error("Failed to return stored ontology " + identifier + " as type " + returnType, e);
+ log.error(
+ "Failed to return stored ontology " + identifier + " as type "
+ + returnType.getCanonicalName(), e);
}
}
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=1245648&r1=1245647&r2=1245648&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 Fri Feb 17 16:41:53 2012
@@ -130,11 +130,6 @@ public class ScopeRegistryImpl implement
l.scopeRegistered(scope);
}
- /*
- * (non-Javadoc)
- *
- * @see eu.iksproject.kres.api.manager.ontology.ScopeRegistry#getActiveScopes()
- */
@Override
public Set<OntologyScope> getActiveScopes() {
Set<OntologyScope> scopes = new HashSet<OntologyScope>();
@@ -143,67 +138,32 @@ public class ScopeRegistryImpl implement
return scopes;
}
- /*
- * (non-Javadoc)
- *
- * @see eu.iksproject.kres.api.manager.ontology.ScopeRegistry#getRegisteredScopes()
- */
@Override
public synchronized Set<OntologyScope> getRegisteredScopes() {
return new HashSet<OntologyScope>(scopeMap.values());
}
- /*
- * (non-Javadoc)
- *
- * @see eu.iksproject.kres.api.manager.ontology.ScopeRegistry#getScope(org.semanticweb.owlapi.model.IRI)
- */
@Override
public OntologyScope getScope(String scopeID) {
return scopeMap.get(scopeID);
}
- /*
- * (non-Javadoc)
- *
- * @see eu.iksproject.kres.api.manager.ontology.ScopeRegistry#getScopeRegistrationListeners()
- */
@Override
public Set<ScopeEventListener> getScopeRegistrationListeners() {
return scopeListeners;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.iksproject.kres.api.manager.ontology.ScopeRegistry#isScopeActive(org.semanticweb.owlapi.model.IRI)
- */
@Override
public boolean isScopeActive(String scopeID) {
if (!containsScope(scopeID)) throw new NoSuchScopeException(scopeID);
return activeScopeIRIs.contains(scopeID);
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.iksproject.kres.api.manager.ontology.ScopeRegistry#registerScope(eu.iksproject.kres.api.manager.
- * ontology.OntologyScope)
- */
@Override
public synchronized void registerScope(OntologyScope scope) {
registerScope(scope, false);
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.iksproject.kres.api.manager.ontology.ScopeRegistry#registerScope(eu.iksproject.kres.api.manager.
- * ontology.OntologyScope, boolean)
- */
@Override
public synchronized void registerScope(OntologyScope scope, boolean activate) {
scopeMap.put(scope.getID(), scope);
@@ -211,25 +171,11 @@ public class ScopeRegistryImpl implement
fireScopeRegistered(scope);
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.iksproject.kres.api.manager.ontology.ScopeRegistry#removeScopeRegistrationListener(eu.iksproject
- * .kres.api.manager.ontology.ScopeEventListener)
- */
@Override
public void removeScopeRegistrationListener(ScopeEventListener listener) {
scopeListeners.remove(listener);
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.iksproject.kres.api.manager.ontology.ScopeRegistry#setScopeActive(org.semanticweb.owlapi.model.IRI,
- * boolean)
- */
@Override
public void setScopeActive(String scopeID, boolean active) {
if (!containsScope(scopeID)) throw new NoSuchScopeException(scopeID);
Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/owlapi/AbstractOntologySpaceImpl.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/owlapi/AbstractOntologySpaceImpl.java?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/owlapi/AbstractOntologySpaceImpl.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/owlapi/AbstractOntologySpaceImpl.java Fri Feb 17 16:41:53 2012
@@ -315,6 +315,11 @@ public abstract class AbstractOntologySp
return set.size();
}
}
+
+ @Override
+ public int getOntologyCount() {
+ return getOntologyCount(true);
+ }
@Override
public Set<Class<?>> getSupportedOntologyTypes() {
Modified: incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/io/TestClerezzaInputSources.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/io/TestClerezzaInputSources.java?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/io/TestClerezzaInputSources.java (original)
+++ incubator/stanbol/trunk/ontologymanager/ontonet/src/test/java/org/apache/stanbol/ontologymanager/ontonet/io/TestClerezzaInputSources.java Fri Feb 17 16:41:53 2012
@@ -23,34 +23,38 @@ import static org.junit.Assert.assertEqu
import static org.junit.Assert.assertNotNull;
import java.io.InputStream;
+import java.util.Hashtable;
import java.util.Set;
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.core.serializedform.SupportedFormat;
+import org.apache.clerezza.rdf.simple.storage.SimpleTcProvider;
import org.apache.stanbol.ontologymanager.ontonet.Locations;
+import org.apache.stanbol.ontologymanager.ontonet.api.io.GraphContentInputSource;
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.ontology.OntologyProvider;
+import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologySpace;
+import org.apache.stanbol.ontologymanager.ontonet.impl.OfflineConfigurationImpl;
+import org.apache.stanbol.ontologymanager.ontonet.impl.clerezza.ClerezzaOntologyProvider;
+import org.apache.stanbol.ontologymanager.ontonet.impl.clerezza.CoreOntologySpaceImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.semanticweb.owlapi.model.IRI;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class TestClerezzaInputSources {
+ private Logger log = LoggerFactory.getLogger(getClass());
+
@BeforeClass
public static void loadGraphs() throws Exception {
reset();
- UriRef uri = new UriRef(Locations.CHAR_ACTIVE.toString());
- InputStream inputStream = TestClerezzaInputSources.class
- .getResourceAsStream("/ontologies/characters_all.owl");
- parser.parse(tcManager.createMGraph(uri), inputStream, "application/rdf+xml", uri);
- uri = new UriRef(Locations.CHAR_MAIN.toString());
- inputStream = TestClerezzaInputSources.class.getResourceAsStream("/ontologies/maincharacters.owl");
- parser.parse(tcManager.createMGraph(uri), inputStream, "application/rdf+xml", uri);
- uri = new UriRef(Locations.CHAR_MINOR.toString());
- inputStream = TestClerezzaInputSources.class.getResourceAsStream("/ontologies/minorcharacters.owl");
- parser.parse(tcManager.createMGraph(uri), inputStream, "application/rdf+xml", uri);
-
}
private OntologyInputSource<TripleCollection,?> gis;
@@ -66,7 +70,48 @@ public class TestClerezzaInputSources {
}
@Test
+ public void testGraphContentSource() throws Exception {
+ // Make sure the tc manager has been reset
+ assertEquals(0, tcManager.listTripleCollections().size());
+
+ OntologyProvider<TcProvider> provider = new ClerezzaOntologyProvider(tcManager,
+ new OfflineConfigurationImpl(new Hashtable<String,Object>()), parser);
+
+ InputStream content = TestClerezzaInputSources.class
+ .getResourceAsStream("/ontologies/droppedcharacters.owl");
+ OntologyInputSource<?,TcProvider> src = new GraphContentInputSource(content, SupportedFormat.RDF_XML,
+ new SimpleTcProvider(), parser);
+
+ log.info("After input source creation, TcManager has {} graphs. ", tcManager.listTripleCollections()
+ .size());
+ for (UriRef name : tcManager.listTripleCollections())
+ log.info("-- {} (a {})", name, tcManager.getTriples(name).getClass().getSimpleName());
+ assertEquals(0, tcManager.listTripleCollections().size());
+ OntologySpace spc = new CoreOntologySpaceImpl(TestClerezzaInputSources.class.getSimpleName(),
+ IRI.create("http://stanbol.apache.org/ontologies/"), provider);
+ spc.addOntology(src);
+ log.info("After addition to space, TcManager has {} graphs. ", tcManager.listTripleCollections()
+ .size());
+
+ for (UriRef name : tcManager.listTripleCollections())
+ log.info("-- {} (a {})", name, tcManager.getTriples(name).getClass().getSimpleName());
+ assertEquals(1, tcManager.listTripleCollections().size());
+
+ }
+
+ @Test
public void testGraphSource() throws Exception {
+ UriRef uri = new UriRef(Locations.CHAR_ACTIVE.toString());
+ InputStream inputStream = TestClerezzaInputSources.class
+ .getResourceAsStream("/ontologies/characters_all.owl");
+ parser.parse(tcManager.createMGraph(uri), inputStream, SupportedFormat.RDF_XML, uri);
+ uri = new UriRef(Locations.CHAR_MAIN.toString());
+ inputStream = TestClerezzaInputSources.class.getResourceAsStream("/ontologies/maincharacters.owl");
+ parser.parse(tcManager.createMGraph(uri), inputStream, SupportedFormat.RDF_XML, uri);
+ uri = new UriRef(Locations.CHAR_MINOR.toString());
+ inputStream = TestClerezzaInputSources.class.getResourceAsStream("/ontologies/minorcharacters.owl");
+ parser.parse(tcManager.createMGraph(uri), inputStream, SupportedFormat.RDF_XML, uri);
+
gis = new GraphSource(new UriRef(Locations.CHAR_ACTIVE.toString()));
assertNotNull(gis);
assertNotNull(gis.getRootOntology());
Modified: incubator/stanbol/trunk/ontologymanager/registry/src/main/java/org/apache/stanbol/ontologymanager/registry/impl/RegistryManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/registry/src/main/java/org/apache/stanbol/ontologymanager/registry/impl/RegistryManagerImpl.java?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/registry/src/main/java/org/apache/stanbol/ontologymanager/registry/impl/RegistryManagerImpl.java (original)
+++ incubator/stanbol/trunk/ontologymanager/registry/src/main/java/org/apache/stanbol/ontologymanager/registry/impl/RegistryManagerImpl.java Fri Feb 17 16:41:53 2012
@@ -126,7 +126,10 @@ public class RegistryManagerImpl impleme
@Reference
private OfflineConfiguration offline;
- /* Maps libraries to ontologies */
+ /*
+ * Maps libraries (values) to ontologies (keys). This does not keep track of the loading status of each
+ * library, as it is handled by the library itelf.
+ */
private Map<IRI,Set<IRI>> ontologyIndex = new HashMap<IRI,Set<IRI>>();
private Map<IRI,RegistryItem> population = new TreeMap<IRI,RegistryItem>();
@@ -536,13 +539,13 @@ public class RegistryManagerImpl impleme
}
protected Library populateLibrary(OWLNamedIndividual ind, Set<OWLOntology> registries) throws RegistryContentException {
- IRI id = ind.getIRI();
+ IRI libId = ind.getIRI();
RegistryItem lib = null;
- if (population.containsKey(id)) {
+ if (population.containsKey(libId)) {
// We are not allowing multityping either.
- lib = population.get(id);
+ lib = population.get(libId);
if (!(lib instanceof Library)) throw new RegistryContentException(
- "Inconsistent multityping: for item " + id + " : {" + Library.class + ", "
+ "Inconsistent multityping: for item " + libId + " : {" + Library.class + ", "
+ lib.getClass() + "}");
} else {
lib = riFactory.createLibrary(ind.asOWLNamedIndividual());
@@ -560,22 +563,25 @@ public class RegistryManagerImpl impleme
for (OWLIndividual iront : ironts)
if (iront.isNamed()) {
IRI childId = iront.asOWLNamedIndividual().getIRI();
+ // If some populate*() method has created it, it will be there.
RegistryItem ront = population.get(childId);
- if (ront != null) lib.addChild(ront);
- else if (lib.getChild(childId) == null) lib.addChild(populateOntology(
- iront.asOWLNamedIndividual(), registries));
+ // Otherwise populating it will also put it in population.
+ if (ront == null) ront = populateOntology(iront.asOWLNamedIndividual(), registries);
+ lib.addChild(ront);
+ if (ontologyIndex.get(childId) == null) ontologyIndex.put(childId, new HashSet<IRI>());
+ ontologyIndex.get(childId).add(libId);
}
return (Library) lib;
}
protected RegistryOntology populateOntology(OWLNamedIndividual ind, Set<OWLOntology> registries) throws RegistryContentException {
- IRI id = ind.getIRI();
+ IRI ontId = ind.getIRI();
RegistryItem ront = null;
- if (population.containsKey(id)) {
+ if (population.containsKey(ontId)) {
// We are not allowing multityping either.
- ront = population.get(id);
+ ront = population.get(ontId);
if (!(ront instanceof RegistryOntology)) throw new RegistryContentException(
- "Inconsistent multityping: for item " + id + " : {" + RegistryOntology.class + ", "
+ "Inconsistent multityping: for item " + ontId + " : {" + RegistryOntology.class + ", "
+ ront.getClass() + "}");
} else {
ront = riFactory.createRegistryOntology(ind);
@@ -593,10 +599,13 @@ public class RegistryManagerImpl impleme
for (OWLIndividual ilib : libs)
if (ilib.isNamed()) {
IRI parentId = ilib.asOWLNamedIndividual().getIRI();
+ // If some populate*() method has created it, it will be there.
RegistryItem rlib = population.get(parentId);
- if (rlib != null) ront.addParent(rlib);
- else if (ront.getParent(parentId) == null) ront.addParent(populateLibrary(
- ilib.asOWLNamedIndividual(), registries));
+ // Otherwise populating it will also put it in population.
+ if (rlib == null) rlib = populateLibrary(ilib.asOWLNamedIndividual(), registries);
+ ront.addParent(rlib);
+ if (ontologyIndex.get(ontId) == null) ontologyIndex.put(ontId, new HashSet<IRI>());
+ ontologyIndex.get(ontId).add(parentId);
}
return (RegistryOntology) ront;
}
Modified: incubator/stanbol/trunk/ontologymanager/registry/src/main/java/org/apache/stanbol/ontologymanager/registry/impl/model/LibraryImpl.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/registry/src/main/java/org/apache/stanbol/ontologymanager/registry/impl/model/LibraryImpl.java?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/registry/src/main/java/org/apache/stanbol/ontologymanager/registry/impl/model/LibraryImpl.java (original)
+++ incubator/stanbol/trunk/ontologymanager/registry/src/main/java/org/apache/stanbol/ontologymanager/registry/impl/model/LibraryImpl.java Fri Feb 17 16:41:53 2012
@@ -20,13 +20,9 @@ import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
-import org.apache.clerezza.rdf.core.TripleCollection;
-import org.apache.clerezza.rdf.core.UriRef;
import org.apache.clerezza.rdf.core.access.TcManager;
import org.apache.clerezza.rdf.core.access.TcProvider;
-import org.apache.clerezza.rdf.core.access.WeightedTcProvider;
import org.apache.clerezza.rdf.core.serializedform.Parser;
-import org.apache.stanbol.commons.owl.transformation.OWLAPIToClerezzaConverter;
import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyProvider;
import org.apache.stanbol.ontologymanager.ontonet.impl.clerezza.ClerezzaOntologyProvider;
import org.apache.stanbol.ontologymanager.registry.api.IllegalRegistryCycleException;
@@ -131,16 +127,24 @@ public class LibraryImpl extends Abstrac
@Override
public OWLOntology getOntology(IRI id) throws RegistryContentException {
- Object store = cache.getStore();
- if (store instanceof WeightedTcProvider) {
- WeightedTcProvider wtcp = (WeightedTcProvider) store;
- TripleCollection tc = wtcp.getTriples(new UriRef(id.toString()));
- return OWLAPIToClerezzaConverter.clerezzaGraphToOWLOntology(tc);
- } else if (store instanceof OWLOntologyManager) {
- OWLOntologyManager omgr = (OWLOntologyManager) store;
- return omgr.getOntology(id);
- } else throw new IllegalStateException(
- "Library implementation was assigned an unsupported cache type.");
+ /*
+ * Note that this implementation is not synchronized. Listeners may indefinitely be notified before or
+ * after the rest of this method is executed. If listeners call loadOntologies(), they could still get
+ * a RegistryContentException, which however they can catch by calling loadOntologies() and
+ * getOntologies() in sequence.
+ */
+ fireContentRequested(this);
+ // If no listener has saved the day by loading the ontologies by now, an exception will be thrown.
+ if (!loaded) throw new LibraryContentNotLoadedException(this);
+
+ OWLOntology ontology = null;
+
+ RegistryItem child = getChild(id);
+ if (child instanceof RegistryOntology) {
+ ontology = (OWLOntology) getCache().getStoredOntology(((RegistryOntology) child).getIRI(),
+ OWLOntology.class);
+ }
+ return ontology;
}
@Override
Modified: incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/OntonetFragment.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/OntonetFragment.java?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/OntonetFragment.java (original)
+++ incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/OntonetFragment.java Fri Feb 17 16:41:53 2012
@@ -124,7 +124,7 @@ public class OntonetFragment implements
@Override
public List<LinkResource> getLinkResources() {
List<LinkResource> resources = new ArrayList<LinkResource>();
- resources.add(new LinkResource("stylesheet", "css/ontonet.css", this, 10));
+ resources.add(new LinkResource("stylesheet", "style/ontonet.css", this, 10));
return resources;
}
@@ -143,7 +143,7 @@ public class OntonetFragment implements
@Override
public List<ScriptResource> getScriptResources() {
List<ScriptResource> resources = new ArrayList<ScriptResource>();
- resources.add(new ScriptResource("text/javascript", "actions/actions.js", this, 10));
+ resources.add(new ScriptResource("text/javascript", "scripts/actions.js", this, 10));
return resources;
}
Modified: incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntologyNetworkResource.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntologyNetworkResource.java?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntologyNetworkResource.java (original)
+++ incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/OntologyNetworkResource.java Fri Feb 17 16:41:53 2012
@@ -104,9 +104,9 @@ public class OntologyNetworkResource ext
@GET
@Produces(value = {KRFormat.RDF_XML, KRFormat.OWL_XML, KRFormat.TURTLE, KRFormat.FUNCTIONAL_OWL,
KRFormat.MANCHESTER_OWL, KRFormat.RDF_JSON})
- public Response getScopes(@DefaultValue("false") @QueryParam("with-inactive") boolean inactive,
- @Context HttpHeaders headers,
- @Context ServletContext servletContext) {
+ public Response getScopeModel(@DefaultValue("false") @QueryParam("with-inactive") boolean inactive,
+ @Context HttpHeaders headers,
+ @Context ServletContext servletContext) {
ScopeRegistry reg = onm.getScopeRegistry();
@@ -117,6 +117,14 @@ public class OntologyNetworkResource ext
return Response.ok(ontology).build();
}
+ public Set<OntologyScope> getScopes() {
+ return onm.getScopeRegistry().getRegisteredScopes();
+ }
+
+ public Set<OntologyScope> getActiveScopes() {
+ return onm.getScopeRegistry().getActiveScopes();
+ }
+
@GET
@Produces(TEXT_HTML)
public Response getView() {
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=1245648&r1=1245647&r2=1245648&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 Fri Feb 17 16:41:53 2012
@@ -234,7 +234,7 @@ public class ScopeResource extends BaseS
@QueryParam("coreont") String coreOntology,
@QueryParam("customreg") String customRegistry,
@QueryParam("customont") String customOntology,
- @DefaultValue("false") @QueryParam("activate") String activate,
+ @DefaultValue("false") @QueryParam("activate") boolean activate,
@Context UriInfo uriInfo,
@Context HttpHeaders headers,
@Context ServletContext servletContext) {
@@ -303,11 +303,7 @@ public class ScopeResource extends BaseS
// still be open for modification.
scope.setUp();
reg.registerScope(scope);
- boolean activateBool = true;
- if (activate != null && !activate.equals("")) {
- activateBool = Boolean.valueOf(activate);
- }
- reg.setScopeActive(scopeid, activateBool);
+ reg.setScopeActive(scopeid, activate);
} catch (DuplicateIDException e) {
throw new WebApplicationException(e, CONFLICT);
} catch (Exception ex) {
Modified: incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/StoredOntologyResource.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/StoredOntologyResource.java?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/StoredOntologyResource.java (original)
+++ incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/StoredOntologyResource.java Fri Feb 17 16:41:53 2012
@@ -39,6 +39,9 @@ import org.apache.stanbol.commons.web.ba
import org.apache.stanbol.commons.web.base.format.KRFormat;
import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyProvider;
+import org.apache.stanbol.ontologymanager.registry.api.RegistryContentException;
+import org.apache.stanbol.ontologymanager.registry.api.RegistryManager;
+import org.apache.stanbol.ontologymanager.registry.api.model.Library;
import org.semanticweb.owlapi.model.AddImport;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLDataFactory;
@@ -60,11 +63,18 @@ public class StoredOntologyResource exte
*/
protected OntologyProvider<?> ontologyProvider;
+ /*
+ * Placeholder for the OntologyProvider to be fetched from the servlet context.
+ */
+ protected RegistryManager registryManager;
+
public StoredOntologyResource(@PathParam(value = "ontologyId") String ontologyId,
@Context ServletContext servletContext) {
this.servletContext = servletContext;
this.ontologyProvider = (OntologyProvider<?>) ContextHelper.getServiceFromContext(
OntologyProvider.class, servletContext);
+ this.registryManager = (RegistryManager) ContextHelper.getServiceFromContext(RegistryManager.class,
+ servletContext);
}
/**
@@ -87,35 +97,61 @@ public class StoredOntologyResource exte
@Context UriInfo uriInfo,
@Context HttpHeaders headers) {
if (ontologyId == null) return Response.status(Status.BAD_REQUEST).build();
+ IRI iri = IRI.create(ontologyId);
+ log.debug("Will try to retrieve ontology {} from provider.", iri);
+ // TODO replace OWLOntology with Graph.
+ OWLOntology o = null;
try {
- IRI iri = IRI.create(ontologyId);
- OWLOntology o = (OWLOntology) ontologyProvider.getStoredOntology(iri, OWLOntology.class, merged);
- if (o == null) return Response.status(NOT_FOUND).build();
-
- // Rewrite imports
- String uri = uriInfo.getRequestUri().toString();
- URI base = URI.create(uri.substring(0, uri.lastIndexOf(ontologyId) - 1));
-
- // Rewrite import statements
- List<OWLOntologyChange> changes = new ArrayList<OWLOntologyChange>();
- OWLDataFactory df = o.getOWLOntologyManager().getOWLDataFactory();
- /*
- * TODO manage import rewrites better once the container ID is fully configurable (i.e. instead of
- * going upOne() add "session" or "ontology" if needed).
- */
- for (OWLImportsDeclaration oldImp : o.getImportsDeclarations()) {
- changes.add(new RemoveImport(o, oldImp));
- String s = oldImp.getIRI().toString();
- s = s.substring(s.indexOf("::") + 2, s.length());
- IRI target = IRI.create(base + "/" + s);
- changes.add(new AddImport(o, df.getOWLImportsDeclaration(target)));
+ o = (OWLOntology) ontologyProvider.getStoredOntology(iri, OWLOntology.class, merged);
+ } catch (Exception ex) {
+ log.warn("Retrieval of ontology with ID " + iri + " failed.", ex);
+ }
+
+ if (o == null) {
+ log.debug("Ontology {} missing from provider. Trying libraries...", iri);
+ // See if we can touch a library. TODO: replace with event model on the ontology provider.
+ int minSize = -1;
+ IRI smallest = null;
+ for (Library lib : registryManager.getLibraries(iri)) {
+ int size = lib.getChildren().length;
+ if (minSize < 1 || size < minSize) {
+ smallest = lib.getIRI();
+ minSize = size;
+ }
+ }
+ log.debug("Selected library for ontology {} is {} .", iri, smallest);
+ try {
+ o = registryManager.getLibrary(smallest).getOntology(iri);
+ } catch (RegistryContentException e) {
+ log.warn("The content of library " + smallest + " could not be accessed.", e);
}
- o.getOWLOntologyManager().applyChanges(changes);
+ }
+ log.debug("Ontology {} not found in any ontology provider or library.", iri);
+ if (o == null) return Response.status(NOT_FOUND).build();
- return Response.ok(o).build();
- } catch (Exception ex) {
- return Response.status(Status.BAD_REQUEST).build();
+ log.debug("Retrieved ontology {} .", iri);
+
+ // Rewrite imports
+ String uri = uriInfo.getRequestUri().toString();
+ URI base = URI.create(uri.substring(0, uri.lastIndexOf(ontologyId) - 1));
+
+ // Rewrite import statements
+ List<OWLOntologyChange> changes = new ArrayList<OWLOntologyChange>();
+ OWLDataFactory df = o.getOWLOntologyManager().getOWLDataFactory();
+ /*
+ * TODO manage import rewrites better once the container ID is fully configurable (i.e. instead of
+ * going upOne() add "session" or "ontology" if needed).
+ */
+ for (OWLImportsDeclaration oldImp : o.getImportsDeclarations()) {
+ changes.add(new RemoveImport(o, oldImp));
+ String s = oldImp.getIRI().toString();
+ s = s.substring(s.indexOf("::") + 2, s.length());
+ IRI target = IRI.create(base + "/" + s);
+ changes.add(new AddImport(o, df.getOWLImportsDeclaration(target)));
}
+ o.getOWLOntologyManager().applyChanges(changes);
+
+ return Response.ok(o).build();
}
Modified: incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntologyNetworkResource/index.ftl
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntologyNetworkResource/index.ftl?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntologyNetworkResource/index.ftl (original)
+++ incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/OntologyNetworkResource/index.ftl Fri Feb 17 16:41:53 2012
@@ -18,15 +18,62 @@
<#import "/imports/ontonetDescription.ftl" as ontonetDescription>
<#escape x as x?html>
- <@common.page title="Apache Stanbol OntoNet scope manager" hasrestapi=false>
+ <@common.page title="Apache Stanbol OntoNet scope manager" hasrestapi=true>
<div class="panel" id="webview">
+ <#assign scopes = it.scopes>
<p>This is the start page of the ontology scope manager.</p>
- </div>
+
+ <div class="storeContents">
+ <table id="allScopes">
+ <div>
+ <tr>
+ <th></th>
+ <th>Name</th>
+ <th>Status</th>
+ <th>Comment <#--TODO: fix image path <img src="${it.staticRootUrl}/contenthub/images/rdf.png" alt="Format: RDF"/> --></th>
+ <th>#Ontologies</th>
+ </tr>
+ <#list it.scopes as scope>
+ <tr>
+ <td>
+ <img src="${it.staticRootUrl}/contenthub/images/edit_icon_16.png" title="Edit this item" />
+ <img src="${it.staticRootUrl}/contenthub/images/delete_icon_16.png" title="Delete this item" />
+ </td>
+ <td><a href="${scope.ID}" title="${scope.ID}">${scope.ID}</a></td>
+ <td>${scope.locked?string("locked", "modifiable")}</td>
+ <td></td>
+ <td>${scope.coreSpace.ontologyCount + scope.customSpace.ontologyCount}</td>
+ </tr>
+ </#list>
+ </div>
+ </table> <!-- allScopes -->
+ </div>
+
+ <!-- Collapsible version -->
+ <div class="enginelisting">
+ <p class="collapseheader">Ontology Scopes:
+ </p>
+ <div class="collapsable">
+ <ul>
+ <#list it.scopes as scope>
+ <li>
+ <b>${scope.ID}</b>
+ </li>
+ </#list>
+ </ul>
+ </div> <!-- collapsible-->
+ </div> <!-- scope listing -->
+ </div> <!-- web view -->
- <hr>
+ <div class="panel" id="restapi" style="display: none;">
+
+ <h3>Service Endpoints</h3>
<#include "/imports/inc_scopemgr.ftl">
<#include "/imports/inc_scope.ftl">
+ </div>
+
+
</...@common.page>
</#escape>
\ No newline at end of file
Modified: incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/RegistryManagerResource/index.ftl
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/RegistryManagerResource/index.ftl?rev=1245648&r1=1245647&r2=1245648&view=diff
==============================================================================
--- incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/RegistryManagerResource/index.ftl (original)
+++ incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/RegistryManagerResource/index.ftl Fri Feb 17 16:41:53 2012
@@ -39,7 +39,7 @@
</#list>
</ul>
- <p class="note">Administrators can enable, disable and deploy reasoning services using the <a href="/system/console/components" target="_blank">OSGi console</a>.</p>
+ <p class="note">Administrators can add, remove and load ontology registries using the <a href="/system/console/components" target="_blank">OSGi console</a>.</p>
</div>
</div>