Author: reto
Date: Thu May 27 08:48:05 2010
New Revision: 948734

URL: http://svn.apache.org/viewvc?rev=948734&view=rev
Log:
CLEREZZA-218: initial drafts

Added:
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/
   (with props)
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/pom.xml
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/Enricher.java
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/OrConnector.java
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/ResourceMatcher.java
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/CityWeatherEnricher.java
    
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/SiblingEnricher.java

Propchange: 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Thu May 27 08:48:05 2010
@@ -0,0 +1 @@
+target

Added: 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/pom.xml?rev=948734&view=auto
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/pom.xml
 (added)
+++ 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/pom.xml
 Thu May 27 08:48:05 2010
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><project 
xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.apache.clerezza</groupId>
+               <artifactId>org.apache.clerezza.rdf.web</artifactId>
+               <version>0.8-incubating-SNAPSHOT</version>
+       </parent>
+       <groupId>org.apache.clerezza</groupId>
+       <artifactId>org.apache.clerezza.rdf.enrichment.core</artifactId>
+       <packaging>bundle</packaging>
+       <version>0.1-incubating-SNAPSHOT</version>
+       <name>Clerezza - SCB Enrichment Core</name>
+       <description>The core part of SCB Enrichment</description>
+       <dependencies>
+               <dependency>
+                       <groupId>junit</groupId>
+                       <artifactId>junit</artifactId>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.clerezza</groupId>
+                       <artifactId>org.apache.clerezza.rdf.core</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.clerezza</groupId>
+                       <artifactId>org.apache.clerezza.utils</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.clerezza</groupId>
+                       
<artifactId>org.apache.clerezza.rdf.jena.serializer</artifactId>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.clerezza</groupId>
+                       
<artifactId>org.apache.clerezza.rdf.jena.parser</artifactId>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.clerezza</groupId>
+                       
<artifactId>org.apache.clerezza.rdf.ontologies</artifactId>
+               </dependency>
+       </dependencies>
+</project>
+

Added: 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/Enricher.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/Enricher.java?rev=948734&view=auto
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/Enricher.java
 (added)
+++ 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/Enricher.java
 Thu May 27 08:48:05 2010
@@ -0,0 +1,196 @@
+/*
+ * 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.rdf.enrichment;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import org.apache.clerezza.rdf.core.BNode;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.UriRef;
+
+/**
+ * use cases:
+ * - resources with a common eg:parent should be eg:sibling
+ * - for every foaf:Person there shall be a foaf:PersonalProfileDocument
+ * - every non literal resource shall be subject of rdf:type rdfs:Resource 
statemet
+ * - every eg:City shall have a eg:currentWeather property pointing to a bnode 
with temperature and humidity
+ *
+ * features:
+ * - pre-filter (filter filter): only filter matching resource-matcher are 
forwarded
+ * - on invocation with matching resource the Enricher knows which criteria 
matched
+ *
+ * @author reto
+ */
+/*
+ * scala would allow to make reasonable use of generich, here having
+ * ResourceFilter<T extends Resource> makes implementation harder as e.g. a
+ * ResourceFilter<NonLiteral> could not be returned by getObjectFilter
+ *
+ * locks: There's currently no recommeended mechanism to prevent Enricher
+ * to make the enrichted graph appear stable while in a lock
+ */
+public abstract class Enricher {
+
+
+       public static abstract class ResourceFilter {
+
+               public abstract boolean accept(Resource resource);
+
+               public Set<Resource> getAcceptable(TripleCollection tc) {
+                       Set<Resource> result = new HashSet<Resource>();
+                       for (Triple triple : tc) {
+                               {
+                                       NonLiteral subject = 
triple.getSubject();
+                                       if (accept(subject)) {
+                                               result.add(subject);
+                                       }
+                               }
+                               {
+                                       Resource object = triple.getObject();
+                                       if (accept(object)) {
+                                               result.add(object);
+                                       }
+                               }
+                       }
+                       return result;
+               }
+       }
+
+
+       public ResourceFilter acceptAll = new ResourceFilter() {
+
+               @Override
+               public boolean accept(Resource resource) {
+                       return true;
+               }
+       };
+
+       /**
+        * returns the additionl triples to a specified base graph. This method 
is
+        * only invoked with resources matching the respective Filter.
+        *
+        * @param subject
+        * @param predicate
+        * @param object
+        * @param base
+        * @return
+        */
+       public abstract Iterator<Triple> filter(NonLiteral subject, UriRef 
predicate,
+                       Resource object, TripleCollection base);
+
+
+       //IDEA add way for impl to specify fields that must not be null in 
filter
+       //queries (in which case null is replaced with all matching resources)
+       //and a way to specify that the impl ignores a specfied value in which 
case
+       //a filter is applied manually on that value.
+       //ISSUE: the query <tt>null, null, "13,4"</tt> might cause computation 
of a huge lots
+       //of values
+       public ResourceFilter getSubjectFilter() {
+               return acceptAll;
+       }
+
+       public ResourceFilter getPropertyFilter() {
+               return acceptAll;
+       }
+
+       public ResourceFilter getObjectFilter() {
+               return acceptAll;
+       }
+
+       //utility methods for implementations
+       private class LocalBNode extends BNode {
+
+               boolean isFrom(Enricher enricher) {
+                       return (enricher == Enricher.this);
+               }
+       }
+
+       protected BNode createLocalBNode() {
+               return new LocalBNode();
+       }
+       private ResourceFilter localBNodeFilter = new ResourceFilter() {
+
+               @Override
+               public boolean accept(Resource resource) {
+                       return (resource instanceof LocalBNode)
+                                       && ((LocalBNode) 
resource).isFrom(Enricher.this);
+               }
+       };
+
+       protected ResourceFilter getLocalBNodeFilter() {
+               return localBNodeFilter;
+       }
+       protected static ResourceFilter getFilterForSubjectsWith(UriRef 
predicate,
+                       Resource object) {
+               return null;
+       }
+
+       protected static ResourceFilter getFilterForSubjectsWithProperty(UriRef 
predicate) {
+               return null;
+       }
+
+       /** creates a resource filters that matches only the specified resource
+        *
+        * @param resources
+        * @return
+        */
+       protected static ResourceFilter getExtensionalFilter(Resource... 
resources) {
+               return null;
+       }
+
+       protected static ResourceFilter getDataTypeFilter(UriRef dataType) {
+               return null;
+       }
+
+       /** utility method to filter an iterator
+        *
+        */
+       protected Iterator<Triple> filter(NonLiteral subject, UriRef predicate,
+                       Resource object, final Iterator<Triple> baseIter) {
+               //TODO filter on the fly without list
+               final List<Triple> tripleList = new ArrayList<Triple>();
+               while (baseIter.hasNext()) {
+                       Triple triple = baseIter.next();
+                       if ((subject != null) &&
+                               (!triple.getSubject().equals(subject))) {
+                                       continue;
+                               }
+                               if ((predicate != null) &&
+                                               
(!triple.getPredicate().equals(predicate))) {
+                                       continue;
+                               }
+                               if ((object != null) &&
+                                               
(!triple.getObject().equals(object))) {
+                                       continue;
+                               }
+                       tripleList.add(triple);
+               }
+
+               final Iterator<Triple> listIter = tripleList.iterator();
+               return listIter;
+
+       }
+
+}

Added: 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/OrConnector.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/OrConnector.java?rev=948734&view=auto
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/OrConnector.java
 (added)
+++ 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/OrConnector.java
 Thu May 27 08:48:05 2010
@@ -0,0 +1,49 @@
+/*
+ * 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.rdf.enrichment;
+
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.enrichment.Enricher.ResourceFilter;
+
+/**
+ * A filter that accepts a Resource iff any of its underlying base filters 
+ * accepts it
+ *
+ * @author reto
+ */
+public class OrConnector extends ResourceFilter {
+
+       private ResourceFilter[] baseFilters;
+
+       public OrConnector(ResourceFilter... baseFilters) {
+               this.baseFilters = baseFilters;
+       }
+
+       @Override
+       public boolean accept(Resource resource) {
+               for (ResourceFilter resourceFilter : baseFilters) {
+                       if (resourceFilter.accept(resource)) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+}

Added: 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/ResourceMatcher.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/ResourceMatcher.java?rev=948734&view=auto
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/ResourceMatcher.java
 (added)
+++ 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/ResourceMatcher.java
 Thu May 27 08:48:05 2010
@@ -0,0 +1,28 @@
+/*
+ * 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.rdf.enrichment;
+
+/**
+ *
+ * @author reto
+ */
+class ResourceMatcher {
+
+}

Added: 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/CityWeatherEnricher.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/CityWeatherEnricher.java?rev=948734&view=auto
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/CityWeatherEnricher.java
 (added)
+++ 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/CityWeatherEnricher.java
 Thu May 27 08:48:05 2010
@@ -0,0 +1,156 @@
+/*
+ * 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.rdf.enrichment;
+
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import org.apache.clerezza.rdf.core.BNode;
+import org.apache.clerezza.rdf.core.LiteralFactory;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.rdf.ontologies.RDF;
+import org.apache.clerezza.utils.IteratorMerger;
+
+/**
+ * add a a weather property pointing to the weather expressed a a bnode with
+ * current temperature and humidity (fake values based on time and city name)
+ *
+ * @author reto
+ */
+public class CityWeatherEnricher extends Enricher {
+
+       //ontology part
+       UriRef classCity = new UriRef("http://example.org/ontology#City";);
+       UriRef weatherProperty = new 
UriRef("http://example.org/ontology#weather";);
+       UriRef temperatureProperty = new 
UriRef("http://example.org/ontology#temperature";);
+       UriRef humidityProperty = new 
UriRef("http://example.org/ontology#humidity";);
+       final private static UriRef xsdDouble =
+                       new UriRef("http://www.w3.org/2001/XMLSchema#double";);
+       private final ResourceFilter classCityFilter = 
getFilterForSubjectsWith(RDF.type, classCity);
+       private final Map<NonLiteral, WeakReference<BNode>> cityWeatherMap = 
new HashMap<NonLiteral, WeakReference<BNode>>();
+
+       /*
+        * we might be able to tell more about things that are a City and about
+        * the Waether-Bnode we created
+        */
+       @Override
+       public ResourceFilter getSubjectFilter() {
+               return new OrConnector(
+                               classCityFilter, getLocalBNodeFilter());
+       }
+
+       @Override
+       public ResourceFilter getPropertyFilter() {
+               return getExtensionalFilter(weatherProperty, 
temperatureProperty, humidityProperty);
+       }
+
+       @Override
+       public ResourceFilter getObjectFilter() {
+               return new OrConnector(getLocalBNodeFilter(), 
getDataTypeFilter(xsdDouble));
+       }
+
+       @Override
+       public Iterator<Triple> filter(final NonLiteral subject,
+                       final UriRef predicate, final Resource object,
+                       final TripleCollection base) {
+               if (subject == null) {
+
+                       Iterator<Triple> iteratorCitySubjects =  new 
IteratorMerger(
+                                       new Iterator<Iterator<Triple>>() {
+
+                                               Iterator<Resource> 
subjectIterator =
+                                                               
classCityFilter.getAcceptable(base).iterator();
+
+                                               @Override
+                                               public boolean hasNext() {
+                                                       return 
subjectIterator.hasNext();
+                                               }
+
+                                               @Override
+                                               public void remove() {
+                                                       throw new 
UnsupportedOperationException("Not supported.");
+                                               }
+
+                                               @Override
+                                               public Iterator<Triple> next() {
+                                                       return 
CityWeatherEnricher.this.filterSubjectNonNull(
+                                                                       
(NonLiteral)subjectIterator.next(),
+                                                                       
predicate, object, base);
+                                               }
+                                       });
+                       //TODO add with bnode subjects
+                       return iteratorCitySubjects;
+               } else {
+                       return filterSubjectNonNull(subject, predicate, object, 
base);
+               }
+               
+       }
+
+       private Iterator<Triple> filterSubjectNonNull(final NonLiteral subject,
+                       final UriRef predicate, final Resource object,
+                       final TripleCollection base) {
+               Set<Triple> resultSet = new HashSet<Triple>();
+               if (classCityFilter.accept(subject)) {
+                       if (predicate.equals(weatherProperty)) {
+                               BNode weatherNode = getWeatherNode(subject);
+                               resultSet.add(new TripleImpl(subject, 
predicate, weatherNode));
+                       }
+               } else {
+                       //TODO get the real wather of that city
+                       if (predicate.equals(temperatureProperty) || (predicate 
== null)) {
+                               resultSet.add(new TripleImpl(subject,
+                                               temperatureProperty, 
LiteralFactory.getInstance().createTypedLiteral(21.4)));
+                       }
+                       if (predicate.equals(humidityProperty) || (predicate == 
null)) {
+                               resultSet.add(new TripleImpl(subject,
+                                               humidityProperty, 
LiteralFactory.getInstance().createTypedLiteral(0.51)));
+                       }
+               }
+               return resultSet.iterator();
+       }
+
+       /**
+        * for every city the is one weather node
+        * 
+        * @param subject
+        * @return
+        */
+       private synchronized BNode getWeatherNode(NonLiteral city) {
+               WeakReference<BNode> nodeRef =  cityWeatherMap.get(city);
+               if (nodeRef != null) {
+                       BNode node = nodeRef.get();
+                       if (node != null) {
+                               return node;
+                       }
+               }
+               BNode newNode =  createLocalBNode();
+               cityWeatherMap.put(city, new WeakReference<BNode>(newNode));
+               return newNode;
+       }
+}
+
+

Added: 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/SiblingEnricher.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/SiblingEnricher.java?rev=948734&view=auto
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/SiblingEnricher.java
 (added)
+++ 
incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/SiblingEnricher.java
 Thu May 27 08:48:05 2010
@@ -0,0 +1,160 @@
+/*
+ * 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.rdf.enrichment;
+
+import java.util.AbstractSet;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+
+/**
+ * add a siblingProperty to things with a common parent. every resource with a
+ * parent is a sibling of itself.
+ *
+ * @author reto
+ */
+public class SiblingEnricher extends Enricher {
+
+       //ontology part
+       /**
+        * points to the parent of the subject
+        */
+       UriRef parentProperty = new 
UriRef("http://example.org/ontology#parent";);
+       UriRef siblingProperty = new 
UriRef("http://example.org/ontology#sibling";);
+
+       /*
+        * we might be able to tell more about things tht have a parent
+        */
+       @Override
+       public ResourceFilter getSubjectFilter() {
+               return getFilterForSubjectsWithProperty(parentProperty);
+       }
+
+       /*
+        * the only thing we can say is if two things are siblings
+        */
+       @Override
+       public ResourceFilter getPropertyFilter() {
+               return getExtensionalFilter(siblingProperty);
+       }
+       /*
+        * the object has a parent too
+        */
+
+       @Override
+       public ResourceFilter getObjectFilter() {
+               return getFilterForSubjectsWithProperty(parentProperty);
+       }
+
+       /*
+        * the predicate is null or siblingProperty
+        */
+       @Override
+       public Iterator<Triple> filter(final NonLiteral subject,
+                       final UriRef predicate, final Resource object,
+                       final TripleCollection base) {
+               if ((subject != null) && (object != null)) {
+                       if (areSiblings(subject, object, base)) {
+                               return Collections.singleton(
+                                               (Triple) new 
TripleImpl(subject, siblingProperty, object)).iterator();
+                       } else {
+                               List<Triple> emptyList = 
Collections.emptyList();
+                               return emptyList.iterator();
+                       }
+               } else {
+                       if (subject != null) {
+                               final Iterator<NonLiteral> siblings = 
+                                               getSiblings(subject, 
base).iterator();
+                               return new Iterator<Triple>() {
+
+                                       @Override
+                                       public boolean hasNext() {
+                                               return siblings.hasNext();
+                                       }
+
+                                       @Override
+                                       public Triple next() {
+                                               return new TripleImpl(subject, 
siblingProperty, siblings.next());
+                                       }
+
+                                       @Override
+                                       public void remove() {
+                                               throw new 
UnsupportedOperationException(
+                                                               "cannot delete 
infered triple");
+                                       }
+                               };
+                       }
+                       if (object != null) {
+                               final Iterator<NonLiteral> siblings = 
+                                               getSiblings((NonLiteral) 
object,base).iterator();
+                               return new Iterator<Triple>() {
+
+                                       @Override
+                                       public boolean hasNext() {
+                                               return siblings.hasNext();
+                                       }
+
+                                       @Override
+                                       public Triple next() {
+                                               return new 
TripleImpl(siblings.next(), siblingProperty, object);
+                                       }
+
+                                       @Override
+                                       public void remove() {
+                                               throw new 
UnsupportedOperationException(
+                                                               "cannot delete 
infered triple");
+                                       }
+                               };
+                       }
+                       //both subjecta nd object are null
+                       //TODO
+                       throw new UnsupportedOperationException("not yet 
pmpliemented");
+               }
+       }
+
+       private boolean areSiblings(NonLiteral subject, Resource object, 
TripleCollection base) {
+               return getSiblings(subject, base).contains(object);
+       }
+
+       private Set<NonLiteral> getSiblings(NonLiteral resource, 
TripleCollection base) {
+               Set<Resource> parents = new HashSet<Resource>();
+               {
+                       Iterator<Triple> parentTriples = base.filter(resource, 
parentProperty, null);
+                       while (parentTriples.hasNext()) {
+                               parents.add(parentTriples.next().getObject());
+                       }
+               }
+               Set<NonLiteral> resultSet = new HashSet<NonLiteral>();
+               for (Resource parent : parents) {
+                       Iterator<Triple> childTriples = base.filter(null, 
parentProperty, parent);
+                       while (childTriples.hasNext()) {
+                               resultSet.add(childTriples.next().getSubject());
+                       }
+               }
+               return resultSet;
+       }
+}


Reply via email to