/**
* This file is part of the JCROM project.
* Copyright (C) 2008-2014 - All rights reserved.
* Authors: Olafur Gauti Gudmundsson, Nicolas Dos Santos
*
* Licensed 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.jcrom.jackrabbit;
import static org.junit.Assert.assertEquals;
import javax.jcr.PropertyType;
import javax.jcr.ReferentialIntegrityException;
import javax.jcr.RepositoryException;
import org.jcrom.JcrMappingException;
import org.jcrom.Jcrom;
import org.jcrom.annotations.JcrIdentifier;
import org.jcrom.annotations.JcrName;
import org.jcrom.annotations.JcrPath;
import org.jcrom.annotations.JcrReference;
import org.junit.Test;
/**
* Thanks to Ben Fortuna for providing this test case.
*
* @author Nicolas Dos Santos
*/
public class TestJcrReference extends TestAbstract {
@Test
public void testCreateWeakReference() throws JcrMappingException, RepositoryException {
System.out.println("assert creation of weak reference");
// initialise jcrom
Jcrom jcrom = new Jcrom();
jcrom.map(A1.class);
jcrom.map(A2.class);
jcrom.map(A3.class);
jcrom.map(B.class);
// initialise mappable objects
B instanceB = new B();
instanceB.setId("12345");
instanceB.setName("instanceB");
A1 instanceA1 = new A1();
instanceA1.setName("instanceA1");
instanceA1.setbRef(instanceB);
A2 instanceA2 = new A2();
instanceA2.setName("instanceA2");
instanceA2.setbRef(instanceB);
A3 instanceA3 = new A3();
instanceA3.setName("instanceA3");
instanceA3.setbRef(instanceB);
jcrom.addNode(session.getRootNode(), instanceB, new String[] { "mix:referenceable" });
jcrom.addNode(session.getRootNode(), instanceA1);
jcrom.addNode(session.getRootNode(), instanceA2);
jcrom.addNode(session.getRootNode(), instanceA3);
String instanceBID = session.getRootNode().getNode("instanceB").getIdentifier();
session.getRootNode().getNode("instanceB").remove();
// A1 holds a weak reference
System.out.println(session.getRootNode().getNode("instanceA1").getProperty("bRef").getString());
assertEquals(session.getRootNode().getNode("instanceA1").getProperty("bRef").getType(), PropertyType.WEAKREFERENCE);
assertEquals(session.getRootNode().getNode("instanceA1").getProperty("bRef").getString(), instanceBID);
// A2 holds a reference
System.out.println(session.getRootNode().getNode("instanceA2").getProperty("bRef").getString());
assertEquals(session.getRootNode().getNode("instanceA2").getProperty("bRef").getType(), PropertyType.REFERENCE);
assertEquals(session.getRootNode().getNode("instanceA2").getProperty("bRef").getString(), instanceBID);
// A3 holds a reference
System.out.println(session.getRootNode().getNode("instanceA3").getProperty("bRef").getString());
assertEquals(session.getRootNode().getNode("instanceA3").getProperty("bRef").getType(), PropertyType.REFERENCE);
assertEquals(session.getRootNode().getNode("instanceA3").getProperty("bRef").getString(), instanceBID);
}
@Test
public void testReferentialIntegrity() throws JcrMappingException, RepositoryException {
System.out.println("assert referential integrity using weak reference");
// initialise jcrom
Jcrom jcrom = new Jcrom();
jcrom.map(A1.class);
jcrom.map(B.class);
// initialise mappable objects
B instanceB = new B();
instanceB.setId("12345");
instanceB.setName("instanceB");
A1 instanceA1 = new A1();
instanceA1.setName("instanceA1");
instanceA1.setbRef(instanceB);
jcrom.addNode(session.getRootNode(), instanceB, new String[] { "mix:referenceable" });
String instanceBID = session.getRootNode().getNode("instanceB").getIdentifier();
jcrom.addNode(session.getRootNode(), instanceA1);
session.getRootNode().getNode("instanceB").remove();
session.save();
assertEquals(session.getRootNode().getNode("instanceA1").getProperty("bRef").getType(), PropertyType.WEAKREFERENCE);
assertEquals(session.getRootNode().getNode("instanceA1").getProperty("bRef").getString(), instanceBID);
}
@Test(expected = ReferentialIntegrityException.class)
public void testNoReferentialIntegrity() throws JcrMappingException, RepositoryException {
System.out.println("no referential integrity using default reference");
// initialise jcrom
Jcrom jcrom = new Jcrom();
jcrom.map(A3.class);
jcrom.map(B.class);
// initialise mappable objects
B instanceB = new B();
instanceB.setId("12345");
instanceB.setName("instanceB");
A3 instanceA3 = new A3();
instanceA3.setName("instanceA3");
instanceA3.setbRef(instanceB);
jcrom.addNode(session.getRootNode(), instanceB, new String[] { "mix:referenceable" });
jcrom.addNode(session.getRootNode(), instanceA3);
session.getRootNode().getNode("instanceB").remove();
session.save();
}
private class A1 {
@JcrName
private String name;
@JcrPath
private String path;
@JcrReference(weak = true)
private B bRef;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public B getbRef() {
return bRef;
}
public void setbRef(B bRef) {
this.bRef = bRef;
}
}
private class A2 {
@JcrName
private String name;
@JcrPath
private String path;
@JcrReference(weak = false)
B bRef;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public B getbRef() {
return bRef;
}
public void setbRef(B bRef) {
this.bRef = bRef;
}
}
private class A3 {
@JcrName
private String name;
@JcrPath
private String path;
@JcrReference
private B bRef;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public B getbRef() {
return bRef;
}
public void setbRef(B bRef) {
this.bRef = bRef;
}
}
private class B {
@JcrIdentifier
String id;
@JcrName
String name;
@JcrPath
String path;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
}