package org.openrdf.repository.object;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import junit.framework.Test;
import org.openrdf.annotations.Iri;
import org.openrdf.annotations.Sparql;
import org.openrdf.repository.object.base.ObjectRepositoryTestCase;
public class CollectionTest extends ObjectRepositoryTestCase {
public static final String NS = "urn:test:";
public static final String PREFIX = "PREFIX ex:<" + NS + ">\n";
public static Test suite() throws Exception {
return ObjectRepositoryTestCase.suite(CollectionTest.class);
}
@Iri(NS + "Node")
public interface Node {
@Iri(NS + "child")
Set<Node> getChildren();
@Iri(NS + "child")
void setChildren(Set<Node> children);
@Iri(NS + "position")
Integer getPosition();
@Iri(NS + "position")
void setPosition(Integer position);
@Sparql(PREFIX
+ "SELECT ?child { $this ex:child ?child . ?child ex:position ?position }\n"
+ "ORDER BY ?position")
List<Node> getOrderedChildren();
List<Node> getSortedChildren();
}
public static abstract class NodeSupport implements Node {
public List<Node> getSortedChildren() {
Set<Node> live = getChildren();
List<Node> memory = new ArrayList<Node>(live);
Collections.sort(memory, new Comparator<Node>() {
public int compare(Node o1, Node o2) {
Integer p1 = o1.getPosition();
Integer p2 = o2.getPosition();
if (p1 == p2)
return 0;
if (p1 == null)
return -1;
if (p2 == null)
return 1;
return p1.compareTo(p2);
}
});
return memory;
}
}
@Override
public void setUp() throws Exception {
config.addConcept(Node.class);
config.addBehaviour(NodeSupport.class);
super.setUp();
}
public void testUnorderedCollection() throws Exception {
Node n0 = con.addDesignation(con.getObject("urn:test:n0"), Node.class);
Node n1 = con.addDesignation(con.getObject("urn:test:n1"), Node.class);
Node n2 = con.addDesignation(con.getObject("urn:test:n2"), Node.class);
Node n3 = con.addDesignation(con.getObject("urn:test:n3"), Node.class);
Node n4 = con.addDesignation(con.getObject("urn:test:n4"), Node.class);
Node n5 = con.addDesignation(con.getObject("urn:test:n5"), Node.class);
Node n6 = con.addDesignation(con.getObject("urn:test:n6"), Node.class);
Node n7 = con.addDesignation(con.getObject("urn:test:n7"), Node.class);
Node n8 = con.addDesignation(con.getObject("urn:test:n8"), Node.class);
Node n9 = con.addDesignation(con.getObject("urn:test:n9"), Node.class);
Node n10 = con
.addDesignation(con.getObject("urn:test:n10"), Node.class);
n1.setPosition(1);
n2.setPosition(2);
n3.setPosition(3);
n4.setPosition(4);
n5.setPosition(5);
n6.setPosition(6);
n7.setPosition(7);
n8.setPosition(8);
n9.setPosition(9);
n10.setPosition(10);
n0.getChildren().add(n10);
n0.getChildren().add(n9);
n0.getChildren().add(n8);
n0.getChildren().add(n7);
n0.getChildren().add(n6);
n0.getChildren().add(n5);
n0.getChildren().add(n4);
n0.getChildren().add(n3);
n0.getChildren().add(n2);
n0.getChildren().add(n1);
assertEquals(Arrays.asList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10),
n0.getSortedChildren());
assertEquals(Arrays.asList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10),
n0.getOrderedChildren());
}
}