package sk.nociar.jpacloner;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Id;
import javax.persistence.Transient;
import javax.persistence.Version;
import sk.nociar.jpacloner.entities.Bar;
import sk.nociar.jpacloner.entities.BaseEntity;
import sk.nociar.jpacloner.entities.Baz;
import sk.nociar.jpacloner.entities.Edge;
import sk.nociar.jpacloner.entities.Foo;
import sk.nociar.jpacloner.entities.Node;
import sk.nociar.jpacloner.entities.Point;
public abstract class JpaClonerTestSupport {
private Node n1;
private final String allProperties = "*+";
private final String descendants = "(children.value.(bar$|child))+";
private void addChildren(Bar bar, Node parent, Node... children) {
for (int i = 0; i < children.length; i++) {
Node child = children[i];
Edge edge = createEdge();
edge.setParent(parent);
edge.setChild(child);
edge.setPosition(i + 1);
edge.setBar(bar);
// add to nodes
parent.getChildren().put(edge.getPosition(), edge);
child.getParents().add(edge);
}
}
public void initialize() {
// initialize foo, baz, bar
Foo foo1 = createFoo();
Foo foo2 = createFoo();
Baz baz1 = createBaz();
Baz baz2 = createBaz();
Bar bar1 = createBar();
Bar bar2 = createBar();
foo1.setBar(bar1);
foo2.setBar(bar1);
baz1.setBar(bar1);
baz2.setBar(bar1);
// initialize nodes & edges
n1 = createNode("1", 1, 2);
Node n1_1 = createNode("1.1", 3, 4);
Node n1_1_1 = createNode("1.1.1", 5, 6);
Node n1_1_2 = createNode("1.1.2", 7, 8);
Node n1_1_3 = createNode("1.1.3", 9, 10);
Node n1_2 = createNode("1.2", 11, 12);
Node n1_2_1 = createNode("1.2.1", 13, 14);
Node n1_2_2 = createNode("1.2.2", 15, 16);
Node n1_2_3 = createNode("1.2.3", 17, 18);
n1.setFoo(foo1);
n1.setBaz(baz1);
n1_1.setBaz(baz1);
n1_1_1.setBaz(baz2);
n1_1_2.setBaz(baz1);
n1_1_3.setBaz(baz2);
n1_2.setBaz(baz1);
n1_2_1.setBaz(baz2);
n1_2_2.setBaz(baz1);
n1_2_3.setBaz(baz2);
n1_1.setFoo(foo1);
n1_1_1.setFoo(foo2);
n1_1_2.setFoo(foo1);
n1_1_3.setFoo(foo2);
n1_2.setFoo(foo1);
n1_2_1.setFoo(foo2);
n1_2_2.setFoo(foo1);
n1_2_3.setFoo(foo2);
// setup parent-child relationship
addChildren(bar2, n1, n1_1, n1_2);
addChildren(bar2, n1_1, n1_1_1, n1_1_2, n1_1_3);
addChildren(bar2, n1_2, n1_2_1, n1_2_2, n1_2_3);
// add cycles
addChildren(bar2, n1_1_1, n1);
addChildren(bar2, n1_2_3, n1);
}
/**
* Helper method for assertions.
*/
public static void assertCloned(JpaExplorer jpaExplorer, Class<?> clazz, int expected) {
int count = jpaExplorer.getEntities(clazz).size();
assertEquals(expected, count);
}
private void assertNode(Node original, Node clone) {
assertEquals(original, clone);
assertEquals(original.getName(), clone.getName());
assertEquals(original.getBaz(), clone.getBaz());
assertEquals(original.getFoo(), clone.getFoo());
assertNotSame(original, clone);
if (original.getBaz() != null) {
assertNotSame(original.getBaz(), clone.getBaz());
assertEquals(original.getBaz().getBar(), clone.getBaz().getBar());
if (original.getBaz().getBar() != null) {
assertNotSame(original.getBaz().getBar(), clone.getBaz().getBar());
}
}
if (original.getFoo() != null) {
assertNotSame(original.getFoo(), clone.getFoo());
assertEquals(original.getFoo().getBar(), clone.getFoo().getBar());
if (original.getFoo().getBar() != null) {
assertNotSame(original.getFoo().getBar(), clone.getFoo().getBar());
}
}
// point
assertNotSame(original.getPoint(), clone.getPoint());
assertEquals(original.getPoint().getX(), clone.getPoint().getX());
assertEquals(original.getPoint().getY(), clone.getPoint().getY());
// child edges
for (Integer position : original.getChildren().keySet()) {
Edge originalEdge = original.getChildren().get(position);
Edge clonedEdge = clone.getChildren().get(position);
assertEquals(originalEdge, clonedEdge);
assertNotSame(originalEdge, clonedEdge);
assertSame(clone, clonedEdge.getParent());
}
}
public void testClone1() {
Node o1 = getOriginal();
Node o1_1 = o1.getChildren().get(1).getChild();
Node o1_1_1 = o1_1.getChildren().get(1).getChild();
Node o1_1_2 = o1_1.getChildren().get(2).getChild();
Node o1_1_3 = o1_1.getChildren().get(3).getChild();
Node o1_2 = o1.getChildren().get(2).getChild();
Node o1_2_1 = o1_2.getChildren().get(1).getChild();
Node o1_2_2 = o1_2.getChildren().get(2).getChild();
Node o1_2_3 = o1_2.getChildren().get(3).getChild();
String base = "(point|(foo|baz).bar.dummy_property)";
Node c1 = JpaCloner.clone(o1, base, descendants + "." + base);
JpaExplorer jpaExplorer = JpaExplorer.doExplore(c1, allProperties);
// asserts counts
assertCloned(jpaExplorer, Node.class, 9);
assertCloned(jpaExplorer, Edge.class, 10);
assertCloned(jpaExplorer, Point.class, 9);
assertCloned(jpaExplorer, Foo.class, 2);
assertCloned(jpaExplorer, Baz.class, 2);
assertCloned(jpaExplorer, Bar.class, 2);
// assert object clones
Node c1_1 = c1.getChildren().get(1).getChild();
Node c1_1_1 = c1_1.getChildren().get(1).getChild();
Node c1_1_1_1 = c1_1_1.getChildren().get(1).getChild();
Node c1_1_2 = c1_1.getChildren().get(2).getChild();
Node c1_1_3 = c1_1.getChildren().get(3).getChild();
Node c1_2 = c1.getChildren().get(2).getChild();
Node c1_2_1 = c1_2.getChildren().get(1).getChild();
Node c1_2_2 = c1_2.getChildren().get(2).getChild();
Node c1_2_3 = c1_2.getChildren().get(3).getChild();
Node c1_2_3_1 = c1_2_3.getChildren().get(1).getChild();
assertNode(o1, c1);
assertNode(o1_1, c1_1);
assertNode(o1_1_1, c1_1_1);
assertNode(o1_1_2, c1_1_2);
assertNode(o1_1_3, c1_1_3);
assertNode(o1_2, c1_2);
assertNode(o1_2_1, c1_2_1);
assertNode(o1_2_2, c1_2_2);
assertNode(o1_2_3, c1_2_3);
assertSame(c1, c1_1_1_1);
assertSame(c1, c1_2_3_1);
assertSame(c1_1.getBaz(), c1_2.getBaz());
assertSame(c1_1_1.getBaz(), c1_2_1.getBaz());
assertSame(c1_1_2.getBaz(), c1_2_2.getBaz());
assertSame(c1_1_3.getBaz(), c1_2_3.getBaz());
assertSame(c1_1_1.getBaz(), c1_1_3.getBaz());
}
public void testClone2() {
String base = "(fo?|b*z)";
Node clone = JpaCloner.clone(getOriginal(), base, descendants + "." + base);
JpaExplorer jpaExplorer = JpaExplorer.doExplore(clone, allProperties);
// do some asserts
assertCloned(jpaExplorer, Node.class, 9);
assertCloned(jpaExplorer, Edge.class, 10);
assertCloned(jpaExplorer, Point.class, 0);
assertCloned(jpaExplorer, Foo.class, 2);
assertCloned(jpaExplorer, Baz.class, 2);
assertCloned(jpaExplorer, Bar.class, 1);
}
public void testClone3() {
String base = "(foo.bar|baz.bar)";
Node clone = JpaCloner.clone(getOriginal(), base, descendants + "." + base);
JpaExplorer jpaExplorer = JpaExplorer.doExplore(clone, allProperties);
// do some asserts
assertCloned(jpaExplorer, Node.class, 9);
assertCloned(jpaExplorer, Edge.class, 10);
assertCloned(jpaExplorer, Point.class, 0);
assertCloned(jpaExplorer, Foo.class, 2);
assertCloned(jpaExplorer, Baz.class, 2);
assertCloned(jpaExplorer, Bar.class, 2);
}
public void testClone4() {
String base = "(baz$.bar)";
Node clone = JpaCloner.clone(getOriginal(), base, "(parents.parent)+" + "." + base, descendants + "." + base);
JpaExplorer jpaExplorer = JpaExplorer.doExplore(clone, allProperties);
// do some asserts
assertCloned(jpaExplorer, Node.class, 9);
assertCloned(jpaExplorer, Edge.class, 10);
assertCloned(jpaExplorer, Point.class, 0);
assertCloned(jpaExplorer, Foo.class, 0);
assertCloned(jpaExplorer, Baz.class, 2);
assertCloned(jpaExplorer, Bar.class, 1);
assertParents(clone, new HashSet<Edge>());
}
public void testClone5() {
PropertyFilter filter = PropertyFilters.getAnnotationFilter(Id.class, Version.class, Transient.class);
String base = "((foo|baz).bar)";
Node clone = JpaCloner.clone(getOriginal(), filter, base, descendants + "." + base);
JpaExplorer jpaExplorer = JpaExplorer.doExplore(clone, allProperties);
// do some asserts
assertCloned(jpaExplorer, Node.class, 9);
assertCloned(jpaExplorer, Edge.class, 10);
assertCloned(jpaExplorer, Point.class, 0);
assertCloned(jpaExplorer, Foo.class, 2);
assertCloned(jpaExplorer, Baz.class, 2);
assertCloned(jpaExplorer, Bar.class, 2);
// assert that each cloned object has null id
for (BaseEntity entity : jpaExplorer.getEntities(BaseEntity.class)) {
assertNull(entity.getId());
}
}
public void testExplore() {
JpaExplorer jpaExplorer = JpaExplorer.doExplore(getOriginal(), allProperties);
// do some asserts
assertCloned(jpaExplorer, Node.class, 9);
assertCloned(jpaExplorer, Edge.class, 10);
assertCloned(jpaExplorer, Point.class, 9);
assertCloned(jpaExplorer, Foo.class, 2);
assertCloned(jpaExplorer, Baz.class, 2);
assertCloned(jpaExplorer, Bar.class, 2);
jpaExplorer = JpaExplorer.doExplore(getOriginal(), new PropertyFilter() {
@Override
public boolean test(Object entity, String property) {
return !"point".equals(property) && !"bar".equals(property);
}
}, allProperties);
// do some asserts
assertCloned(jpaExplorer, Node.class, 9);
assertCloned(jpaExplorer, Edge.class, 10);
assertCloned(jpaExplorer, Point.class, 0);
assertCloned(jpaExplorer, Foo.class, 2);
assertCloned(jpaExplorer, Baz.class, 2);
assertCloned(jpaExplorer, Bar.class, 0);
String base = "(foo|baz)";
jpaExplorer = JpaExplorer.doExplore(getOriginal(), base, descendants + "." + base);
// do some asserts
assertCloned(jpaExplorer, Node.class, 9);
assertCloned(jpaExplorer, Edge.class, 10);
assertCloned(jpaExplorer, Point.class, 0);
assertCloned(jpaExplorer, Foo.class, 2);
assertCloned(jpaExplorer, Baz.class, 2);
assertCloned(jpaExplorer, Bar.class, 1);
jpaExplorer = JpaExplorer.doExplore(getOriginal());
// do some asserts
assertCloned(jpaExplorer, Node.class, 1);
assertCloned(jpaExplorer, Edge.class, 0);
assertCloned(jpaExplorer, Point.class, 0);
assertCloned(jpaExplorer, Foo.class, 0);
assertCloned(jpaExplorer, Baz.class, 0);
assertCloned(jpaExplorer, Bar.class, 0);
}
private void assertParents(Node node, Set<Edge> asserted) {
for (Edge edge : node.getParents()) {
if (!asserted.contains(edge)) {
asserted.add(edge);
assertSame(node, edge.getChild());
assertParents(edge.getParent(), asserted);
}
}
}
private Node createNode(String name, int x, int y) {
Node node = createNode();
node.setName(name);
node.setPoint(new Point(x, y));
return node;
}
protected Node getOriginal() {
return n1;
}
protected abstract Node createNode();
protected abstract Edge createEdge();
protected abstract Point createPoint();
protected abstract Foo createFoo();
protected abstract Bar createBar();
protected abstract Baz createBaz();
}