Author: reto
Date: Sat Mar 12 19:53:34 2011
New Revision: 1080991
URL: http://svn.apache.org/viewvc?rev=1080991&view=rev
Log:
CLEREZZA-461: Typepriority service that orders RDF types, added and using in
TypeHandlerSpace
Added:
incubator/clerezza/trunk/parent/platform.typepriority/
- copied from r1080060,
incubator/clerezza/trunk/parent/platform.typehandlerspace/
incubator/clerezza/trunk/parent/platform.typepriority/src/main/java/org/apache/clerezza/platform/typepriority/
incubator/clerezza/trunk/parent/platform.typepriority/src/main/java/org/apache/clerezza/platform/typepriority/TypePrioritizer.java
- copied, changed from r1080060,
incubator/clerezza/trunk/parent/platform.typehandlerspace/src/main/java/org/apache/clerezza/platform/typehandlerspace/TypeHandlerDiscoveryImpl.java
incubator/clerezza/trunk/parent/platform.typepriority/src/test/java/org/apache/clerezza/platform/typepriority/
incubator/clerezza/trunk/parent/platform.typepriority/src/test/java/org/apache/clerezza/platform/typepriority/TypePrioritizerTest.java
Removed:
incubator/clerezza/trunk/parent/platform.typepriority/src/main/java/org/apache/clerezza/platform/typehandlerspace/
incubator/clerezza/trunk/parent/platform.typepriority/src/test/java/org/apache/clerezza/platform/typehandlerspace/
Modified:
incubator/clerezza/trunk/parent/platform.launcher.storageless.parent/pom.xml
incubator/clerezza/trunk/parent/platform.typepriority/pom.xml
incubator/clerezza/trunk/parent/pom.xml
Modified:
incubator/clerezza/trunk/parent/platform.launcher.storageless.parent/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.launcher.storageless.parent/pom.xml?rev=1080991&r1=1080990&r2=1080991&view=diff
==============================================================================
---
incubator/clerezza/trunk/parent/platform.launcher.storageless.parent/pom.xml
(original)
+++
incubator/clerezza/trunk/parent/platform.launcher.storageless.parent/pom.xml
Sat Mar 12 19:53:34 2011
@@ -389,6 +389,11 @@
</dependency>
<dependency>
<groupId>org.apache.clerezza</groupId>
+ <artifactId>platform.typepriority</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.clerezza</groupId>
<artifactId>platform.mail</artifactId>
<scope>runtime</scope>
</dependency>
Modified: incubator/clerezza/trunk/parent/platform.typepriority/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typepriority/pom.xml?rev=1080991&r1=1080060&r2=1080991&view=diff
==============================================================================
--- incubator/clerezza/trunk/parent/platform.typepriority/pom.xml (original)
+++ incubator/clerezza/trunk/parent/platform.typepriority/pom.xml Sat Mar 12
19:53:34 2011
@@ -6,16 +6,12 @@
<version>0.2-incubating-SNAPSHOT</version>
</parent>
<groupId>org.apache.clerezza</groupId>
- <artifactId>platform.typehandlerspace</artifactId>
- <version>0.8-incubating-SNAPSHOT</version>
+ <artifactId>platform.typepriority</artifactId>
+ <version>0.1-incubating-SNAPSHOT</version>
<packaging>bundle</packaging>
- <name>Clerezza - Platform Type Handler Space</name>
+ <name>Clerezza - Platform Type Priority Service</name>
<dependencies>
<dependency>
- <groupId>javax.ws.rs</groupId>
- <artifactId>jsr311-api</artifactId>
- </dependency>
- <dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
</dependency>
@@ -36,10 +32,6 @@
<artifactId>rdf.ontologies</artifactId>
</dependency>
<dependency>
- <groupId>org.apache.clerezza</groupId>
- <artifactId>jaxrs.extensions</artifactId>
- </dependency>
- <dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr.annotations</artifactId>
</dependency>
Copied:
incubator/clerezza/trunk/parent/platform.typepriority/src/main/java/org/apache/clerezza/platform/typepriority/TypePrioritizer.java
(from r1080060,
incubator/clerezza/trunk/parent/platform.typehandlerspace/src/main/java/org/apache/clerezza/platform/typehandlerspace/TypeHandlerDiscoveryImpl.java)
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typepriority/src/main/java/org/apache/clerezza/platform/typepriority/TypePrioritizer.java?p2=incubator/clerezza/trunk/parent/platform.typepriority/src/main/java/org/apache/clerezza/platform/typepriority/TypePrioritizer.java&p1=incubator/clerezza/trunk/parent/platform.typehandlerspace/src/main/java/org/apache/clerezza/platform/typehandlerspace/TypeHandlerDiscoveryImpl.java&r1=1080060&r2=1080991&rev=1080991&view=diff
==============================================================================
---
incubator/clerezza/trunk/parent/platform.typehandlerspace/src/main/java/org/apache/clerezza/platform/typehandlerspace/TypeHandlerDiscoveryImpl.java
(original)
+++
incubator/clerezza/trunk/parent/platform.typepriority/src/main/java/org/apache/clerezza/platform/typepriority/TypePrioritizer.java
Sat Mar 12 19:53:34 2011
@@ -16,16 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.clerezza.platform.typehandlerspace;
+package org.apache.clerezza.platform.typepriority;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.Collections;
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
+import java.util.NoSuchElementException;
import java.util.Set;
import java.util.concurrent.locks.Lock;
@@ -42,135 +40,108 @@ import org.apache.clerezza.rdf.core.UriR
import org.apache.clerezza.rdf.core.access.LockableMGraph;
import org.apache.clerezza.rdf.ontologies.RDFS;
import org.apache.clerezza.rdf.utils.RdfList;
-import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* @author rbn
*/
@Component
-@Service(value=TypeHandlerDiscovery.class)
+@Service(value=TypePrioritizer.class)
@References({
- @Reference(name="typeHandler",
- cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE,
- referenceInterface=Object.class,
- target="(org.apache.clerezza.platform.typehandler=true)",
- policy=ReferencePolicy.DYNAMIC),
@Reference(name="systemGraph",
cardinality=ReferenceCardinality.MANDATORY_UNARY,
- referenceInterface=MGraph.class,
+ referenceInterface=LockableMGraph.class,
target=SystemConfig.SYSTEM_GRAPH_FILTER)})
-public class TypeHandlerDiscoveryImpl implements TypeHandlerDiscovery {
+public class TypePrioritizer {
+ public static final UriRef typePriorityListUri = new
UriRef("http://tpf.localhost/typePriorityList");
- /**
- * type-handlers that are bound while the this component was not
activated
- * yet. Stored for later registration.
- */
- private Set<Object> typeHandlerStore = new HashSet<Object>();
-
- private List<Resource> typePriorityList;
- private final Map<UriRef, Object> typeHandlerMap =
Collections.synchronizedMap(
- new HashMap<UriRef, Object>());
+ private List<UriRef> typePriorityList;
+ private static final Logger log =
LoggerFactory.getLogger(TypePrioritizer.class);
LockableMGraph systemGraph;
- protected void bindTypeHandler(Object typeHandler) {
- if (typePriorityList != null) {
- registerTypeHandler(typeHandler);
- } else {
- typeHandlerStore.add(typeHandler);
- }
- }
-
- protected void unbindTypeHandler(Object typeHandler) {
- if(!typeHandlerStore.remove(typeHandler)) {
- unregisterTypeHandler(typeHandler);
+ protected void bindSystemGraph(LockableMGraph systemGraph) {
+ Lock l = systemGraph.getLock().readLock();
+ l.lock();
+ try {
+ List<Resource> rdfTypePriorityList = new RdfList(
+ typePriorityListUri, systemGraph);
+ typePriorityList = new
ArrayList<UriRef>(rdfTypePriorityList.size());
+ for (Resource resource : rdfTypePriorityList) {
+ if (resource instanceof UriRef) {
+ typePriorityList.add((UriRef) resource);
+ } else {
+ log.warn("Type priority list contains a
resource "
+ + "that is not a uri,
skipping.");
+ }
+ }
+ } finally {
+ l.unlock();
}
- }
-
- protected void bindSystemGraph(MGraph systemGraph) {
- typePriorityList = new RdfList(
- new
UriRef("http://tpf.localhost/typePriorityList"), systemGraph);
this.systemGraph = (LockableMGraph) systemGraph;
}
- protected void unbindSystemGraph(MGraph systemGraph) {
+ protected void unbindSystemGraph(LockableMGraph systemGraph) {
typePriorityList = null;
this.systemGraph = null;
}
- protected void activate(ComponentContext context) throws Exception {
- Iterator<Object> handers = typeHandlerStore.iterator();
- while (handers.hasNext()) {
- Object object = handers.next();
- registerTypeHandler(object);
- }
- typeHandlerStore.clear();
- }
-
- @Override
- public Object getTypeHandler(final Set<UriRef> types) {
- return AccessController.doPrivileged(new
PrivilegedAction<Object>() {
-
- @Override
- public Object run() {
- Lock readLock =
systemGraph.getLock().readLock();
- readLock.lock();
- try {
- for (Resource type : typePriorityList) {
- if (types.contains(type)) {
- Object result =
typeHandlerMap.get(type);
- if (result != null) {
- return result;
- }
- }
+ /**
+ *
+ * @param rdfTypes the rdf types to be sorted
+ * @return a sorted iterator of the types
+ */
+ public Iterator<UriRef> iterate(final Collection<UriRef> rdfTypes) {
+ return new Iterator<UriRef>() {
+ final Set<UriRef> remaining = new
HashSet<UriRef>(rdfTypes);
+ boolean rdfsResourceRemovedAndNotYetReturned =
remaining.remove(RDFS.Resource);
+ final Iterator<UriRef> typePriorityIter =
typePriorityList.iterator();
+ Iterator<UriRef> remainingIter = null;
+ UriRef next = prepareNext();
+
+ private UriRef prepareNext() {
+ while (typePriorityIter.hasNext()) {
+ UriRef nextPriority =
typePriorityIter.next();
+ if (remaining.contains(nextPriority)) {
+ remaining.remove(nextPriority);
+ return nextPriority;
}
- } finally {
- readLock.unlock();
}
- return typeHandlerMap.get(RDFS.Resource);
- }
- });
- }
-
- private void registerTypeHandler(Object component) {
- SupportedTypes supportedTypes = component.getClass()
- .getAnnotation(SupportedTypes.class);
- if (supportedTypes == null) {
- return;
- }
- for (String typeUriString : supportedTypes.types()) {
- UriRef typeUri = new UriRef(typeUriString);
- Lock writeLock = systemGraph.getLock().writeLock();
- writeLock.lock();
- try {
- if (!typePriorityList.contains(typeUri)) {
- if (supportedTypes.prioritize()) {
- typePriorityList.add(0,
typeUri);
+ if (remainingIter == null) {
+ remainingIter = remaining.iterator();
+ }
+ if (remainingIter.hasNext()) {
+ return remainingIter.next();
+ } else {
+ if
(rdfsResourceRemovedAndNotYetReturned) {
+
rdfsResourceRemovedAndNotYetReturned = false;
+ return RDFS.Resource;
} else {
- typePriorityList.add(typeUri);
+ return null;
}
}
- } finally {
- writeLock.unlock();
}
- typeHandlerMap.put(typeUri, component);
- }
- }
- private void unregisterTypeHandler(Object component) {
- Iterator<UriRef> keys = typeHandlerMap.keySet().iterator();
- Set<UriRef> toRemove = new
HashSet<UriRef>(typeHandlerMap.size());
- synchronized(typeHandlerMap) {
- while (keys.hasNext()) {
- UriRef uriRef = keys.next();
- if(typeHandlerMap.get(uriRef)==component) {
- toRemove.add(uriRef);
+ @Override
+ public boolean hasNext() {
+ return next != null;
+ }
+
+ @Override
+ public UriRef next() {
+ if (next == null) {
+ throw new NoSuchElementException();
}
+ UriRef current = next;
+ next = prepareNext();
+ return current;
}
- }
- keys = toRemove.iterator();
- while (keys.hasNext()) {
- typeHandlerMap.remove(keys.next());
- }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException("Not
supported yet.");
+ }
+ };
}
}
Added:
incubator/clerezza/trunk/parent/platform.typepriority/src/test/java/org/apache/clerezza/platform/typepriority/TypePrioritizerTest.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typepriority/src/test/java/org/apache/clerezza/platform/typepriority/TypePrioritizerTest.java?rev=1080991&view=auto
==============================================================================
---
incubator/clerezza/trunk/parent/platform.typepriority/src/test/java/org/apache/clerezza/platform/typepriority/TypePrioritizerTest.java
(added)
+++
incubator/clerezza/trunk/parent/platform.typepriority/src/test/java/org/apache/clerezza/platform/typepriority/TypePrioritizerTest.java
Sat Mar 12 19:53:34 2011
@@ -0,0 +1,83 @@
+/*
+ * 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.clerezza.platform.typepriority;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.locks.Lock;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.References;
+import org.apache.felix.scr.annotations.Service;
+import org.osgi.service.component.ComponentContext;
+import org.apache.clerezza.platform.config.SystemConfig;
+import org.apache.clerezza.rdf.core.MGraph;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.LockableMGraph;
+import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
+import org.apache.clerezza.rdf.core.test.LockableMGraphWrapperForTesting;
+import org.apache.clerezza.rdf.ontologies.FOAF;
+import org.apache.clerezza.rdf.ontologies.RDF;
+import org.apache.clerezza.rdf.utils.RdfList;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author rbn
+ */
+public class TypePrioritizerTest {
+
+ TypePrioritizer typePrioritizer;
+
+ @Before
+ public void before() {
+ typePrioritizer = new TypePrioritizer();
+ MGraph mGraph = new SimpleMGraph();
+ RdfList rdfList = new
RdfList(TypePrioritizer.typePriorityListUri, mGraph);
+ rdfList.add(FOAF.Person);
+ rdfList.add(FOAF.Group);
+ rdfList.add(FOAF.Agent);
+ final LockableMGraph systemGraph = new
LockableMGraphWrapperForTesting(mGraph);
+ typePrioritizer.bindSystemGraph(systemGraph);
+ }
+
+ @Test
+ public void oderList() {
+ List<UriRef> l = new ArrayList<UriRef>();
+ l.add(FOAF.Agent);
+ l.add(RDF.Bag);
+ l.add(FOAF.Person);
+ Iterator<UriRef> iter = typePrioritizer.iterate(l);
+ Assert.assertEquals(FOAF.Person, iter.next());
+ Assert.assertEquals(FOAF.Agent, iter.next());
+ Assert.assertEquals(RDF.Bag, iter.next());
+ Assert.assertFalse(iter.hasNext());
+ }
+
+}
Modified: incubator/clerezza/trunk/parent/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/pom.xml?rev=1080991&r1=1080990&r2=1080991&view=diff
==============================================================================
--- incubator/clerezza/trunk/parent/pom.xml (original)
+++ incubator/clerezza/trunk/parent/pom.xml Sat Mar 12 19:53:34 2011
@@ -77,6 +77,7 @@
<module>platform.typerendering.scala</module>
<module>platform.typerendering.scalaserverpages</module>
<module>platform.typerendering.seedsnipe</module>
+ <module>platform.typepriority</module>
<module>platform.usermanager</module>
<module>platform.usermanager.webinterface</module>
<module>platform.users</module>
@@ -598,6 +599,11 @@
</dependency>
<dependency>
<groupId>org.apache.clerezza</groupId>
+ <artifactId>platform.typepriority</artifactId>
+ <version>0.1-incubating-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.clerezza</groupId>
<artifactId>rdf.utils</artifactId>
<version>0.13-incubating-SNAPSHOT</version>
</dependency>