Author: mir
Date: Tue Apr 27 15:38:20 2010
New Revision: 938526

URL: http://svn.apache.org/viewvc?rev=938526&view=rev
Log:
CLEREZZA-196: added static helper methods to the RdfList

Modified:
    
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/main/java/org/apache/clerezza/rdf/utils/RdfList.java
    
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/test/java/org/apache/clerezza/rdf/utils/RdfListTest.java

Modified: 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/main/java/org/apache/clerezza/rdf/utils/RdfList.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/main/java/org/apache/clerezza/rdf/utils/RdfList.java?rev=938526&r1=938525&r2=938526&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/main/java/org/apache/clerezza/rdf/utils/RdfList.java
 (original)
+++ 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/main/java/org/apache/clerezza/rdf/utils/RdfList.java
 Tue Apr 27 15:38:20 2010
@@ -20,7 +20,10 @@ package org.apache.clerezza.rdf.utils;
 
 import java.util.AbstractList;
 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;
@@ -42,7 +45,7 @@ import org.apache.clerezza.rdf.ontologie
  * for read operations (such as for immutable <code>TripleCollection</code>s) 
is
  * not problematic.
  *
- * @author rbn
+ * @author rbn, mir
  */
 public class RdfList extends AbstractList<Resource> {
 
@@ -79,6 +82,20 @@ public class RdfList extends AbstractLis
 
        }
 
+       /**
+        * Get a list for the specified resource node. If the resource node 
does not
+        * have rdf:first and rdf:rest properties an empty list is created by
+        * specifying that the resource is owl:sameAs rdf:nil.
+        *
+        * If the list is modified using the created instance
+        * <code>listResource</code> will always be the first list.
+        *
+        * @param listNode
+        */
+       public RdfList(GraphNode listNode) {
+               this((NonLiteral)listNode.getNode(), listNode.getGraph());
+       }
+
        private void expandTill(int pos) {
                if (totallyExpanded) {
                        return;
@@ -204,4 +221,95 @@ public class RdfList extends AbstractLis
        private Resource getFirstEntry(NonLiteral listResource) {
                return tc.filter(listResource, RDF.first, 
null).next().getObject();
        }
+
+       public NonLiteral getListResource() {
+               return firstList;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (obj == null) {
+                       return false;
+               }
+               if (getClass() != obj.getClass()) {
+                       return false;
+               }
+               final RdfList other = (RdfList) obj;
+
+               if (!other.firstList.equals(this.firstList)) {
+                       return false;
+               }
+
+               if (!other.tc.equals(this.tc)) {
+                       return false;
+               }
+
+               return true;
+       }
+
+       @Override
+       public int hashCode() {
+               return 17 * this.firstList.hashCode() + this.tc.hashCode();
+       }
+
+       /**
+        * Returns the rdf lists of which the specified <code>GraphNode</code> 
is
+        * an element of. Sublists of other lists are not returned.
+        *
+        * @param element
+        * @return
+        */
+       public static Set<RdfList> findContainingLists(GraphNode element) {
+               Set<GraphNode> listNodes = findContainingListNodes(element);
+               if (listNodes.isEmpty()) {
+                       return null;
+               }
+
+               Set<RdfList> rdfLists = new HashSet<RdfList>();
+               for (Iterator<GraphNode> it = listNodes.iterator(); 
it.hasNext();) {
+                       GraphNode listNode = it.next();
+                       rdfLists.add(new RdfList(listNode));
+               }
+               return rdfLists;
+       }
+
+       /**
+        * Returns a set of <code>GraphNode</code>S which are the first list 
nodes (meaning
+        * they are not the beginning of a sublist) of the list containing the 
specified
+        * <code>GraphNode</code> as an element.
+        *
+        * @param element
+        * @return
+        */
+       public static Set<GraphNode> findContainingListNodes(GraphNode element) 
{
+               Iterator<GraphNode> partOfaListNodesIter = 
element.getSubjectNodes(RDF.first);
+               if (!partOfaListNodesIter.hasNext()) {
+                       return null;
+               }
+               Set<GraphNode> listNodes = new HashSet<GraphNode>();
+
+               while (partOfaListNodesIter.hasNext()) {
+                       
listNodes.addAll(findAllListNodes(partOfaListNodesIter.next()));
+               }
+               return listNodes;
+       }
+       
+       private static Set<GraphNode> findAllListNodes(GraphNode listPart) {
+               Iterator<GraphNode> invRestNodesIter;
+               Set<GraphNode> listNodes = new HashSet<GraphNode>();
+               do {
+                       invRestNodesIter = listPart.getSubjectNodes(RDF.rest);
+                       if (invRestNodesIter.hasNext()) {
+                               listPart = invRestNodesIter.next();
+                               while (invRestNodesIter.hasNext()) {
+                                       GraphNode graphNode = 
invRestNodesIter.next();
+                                       
listNodes.addAll(findAllListNodes(graphNode));
+                               }
+                       } else {
+                               listNodes.add(listPart);
+                               break;
+                       }
+               } while (true);
+               return listNodes;
+       }
 }

Modified: 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/test/java/org/apache/clerezza/rdf/utils/RdfListTest.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/test/java/org/apache/clerezza/rdf/utils/RdfListTest.java?rev=938526&r1=938525&r2=938526&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/test/java/org/apache/clerezza/rdf/utils/RdfListTest.java
 (original)
+++ 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/test/java/org/apache/clerezza/rdf/utils/RdfListTest.java
 Tue Apr 27 15:38:20 2010
@@ -19,6 +19,7 @@
 package org.apache.clerezza.rdf.utils;
 
 import java.util.List;
+import java.util.Set;
 
 import junit.framework.Assert;
 
@@ -134,4 +135,49 @@ public class RdfListTest {
                Assert.assertEquals(2, tc.size());
 
        }
+
+       @Test
+       public void findContainingListNodesAndfindContainingListsTest() {
+               TripleCollection tc = new SimpleMGraph();
+               GraphNode listA = new GraphNode(new UriRef("http:///listA";), 
tc);
+               GraphNode listB = new GraphNode(new UriRef("http:///listB";), 
tc);
+               BNode element1 = new BNode();
+               BNode element2 = new BNode();
+               BNode element3 = new BNode();
+               BNode element4 = new BNode();
+               BNode element5 = new BNode();
+
+               RdfList rdfListA = new RdfList(listA);
+               rdfListA.add(element1);
+               rdfListA.add(element2);
+               rdfListA.add(element3);
+               rdfListA.add(element4);
+
+               RdfList rdfListB = new RdfList(listB);
+               rdfListB.add(element2);
+               rdfListB.add(element4);
+               rdfListB.add(element5);
+
+               Set<GraphNode> containingListNodes = 
RdfList.findContainingListNodes(
+                               new GraphNode(element3, tc));
+               Assert.assertEquals(1, containingListNodes.size());
+               Assert.assertTrue(containingListNodes.contains(listA));
+
+               Set<RdfList> containingLists = RdfList.findContainingLists(
+                               new GraphNode(element3, tc));
+               Assert.assertEquals(1, containingLists.size());
+               Assert.assertTrue(containingLists.contains(rdfListA));
+
+               containingListNodes = RdfList.findContainingListNodes(
+                               new GraphNode(element4, tc));
+               Assert.assertEquals(2, containingListNodes.size());
+               Assert.assertTrue(containingListNodes.contains(listA));
+               Assert.assertTrue(containingListNodes.contains(listB));
+
+               containingLists = RdfList.findContainingLists(
+                               new GraphNode(element4, tc));
+               Assert.assertEquals(2, containingLists.size());
+               Assert.assertTrue(containingLists.contains(rdfListA));
+               Assert.assertTrue(containingLists.contains(rdfListB));
+       }
 }
\ No newline at end of file


Reply via email to