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>


Reply via email to