package org.castor.jdo.jpa.processors.fieldprocessors;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Collection;
import java.util.Arrays;
import javax.persistence.*;
import org.castor.jdo.jpa.info.ClassInfo;
import org.castor.jdo.jpa.info.ClassInfoBuilder;
import org.castor.jdo.jpa.info.FieldInfo;
import org.castor.jdo.jpa.natures.JPAFieldNature;
import org.exolab.castor.mapping.MappingException;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class TestJPAManyToMany {
@Before
public void setUp() {
}
@Test
public void testUnidirectional() {
try {
ClassInfoBuilder.buildClassInfo(Unidir1.class);
fail();
} catch (Exception e) {
}
}
@Test
public void testBidirectional1() throws MappingException {
/* build class */
ClassInfo classInfo = ClassInfoBuilder.buildClassInfo(Bidir1a.class);
assertEquals(1, classInfo.getFieldCount());
assertEquals(1, classInfo.getKeyFieldCount());
FieldInfo fieldInfo = classInfo.getFieldInfos().iterator().next();
JPAFieldNature fieldNature = new JPAFieldNature(fieldInfo);
assertTrue(fieldNature.isManyToMany());
assertFalse(fieldNature.isManyToManyInverseCopy());
assertTrue(fieldNature.isRelationLazyFetch());
assertFalse(fieldNature.isRelationOptional());
assertEquals(Collection.class, fieldNature.getRelationCollectionType());
assertNull(fieldNature.getRelationMappedBy());
assertEquals(Bidir1b.class, fieldNature.getRelationTargetEntity());
classInfo = ClassInfoBuilder.buildClassInfo(Bidir1b.class);
assertEquals(1, classInfo.getFieldCount());
assertEquals(1, classInfo.getKeyFieldCount());
fieldInfo = classInfo.getFieldInfos().iterator().next();
fieldNature = new JPAFieldNature(fieldInfo);
assertTrue(fieldNature.isManyToMany());
assertTrue(fieldNature.isManyToManyInverseCopy());
assertTrue(fieldNature.isRelationLazyFetch());
assertFalse(fieldNature.isRelationOptional());
assertEquals(Collection.class, fieldNature.getRelationCollectionType());
assertNotNull(fieldNature.getRelationMappedBy());
assertEquals("dependents", fieldNature.getRelationMappedBy());
assertEquals(Bidir1a.class, fieldNature.getRelationTargetEntity());
assertNotNull(fieldNature.getCascadeTypes());
assertEquals(2, fieldNature.getCascadeTypes().length);
assertTrue(Arrays.asList(fieldNature.getCascadeTypes())
.contains(CascadeType.PERSIST));
assertTrue(Arrays.asList(fieldNature.getCascadeTypes())
.contains(CascadeType.REMOVE));
}
@Test
public void testBidirectional2WrongMappedBy() {
try {
ClassInfoBuilder.buildClassInfo(Bidir2WrongMappedByA.class);
fail();
} catch (Exception e) {
}
try {
ClassInfoBuilder.buildClassInfo(Bidir2WrongMappedByB.class);
fail();
} catch (Exception e) {
}
try {
ClassInfoBuilder.buildClassInfo(Bidir2WrongMappedByC.class);
fail();
} catch (Exception e) {
}
try {
ClassInfoBuilder.buildClassInfo(Bidir2WrongMappedByD.class);
fail();
} catch (Exception e) {
}
try {
ClassInfoBuilder.buildClassInfo(Bidir2WrongMappedByE.class);
fail();
} catch (Exception e) {
}
}
@Test
public void testSelfrelated() throws MappingException {
/* build class */
ClassInfo classInfo = ClassInfoBuilder
.buildClassInfo(SelfRelated.class);
assertEquals(1, classInfo.getFieldCount());
assertEquals(1, classInfo.getKeyFieldCount());
FieldInfo fieldInfo = classInfo.getFieldInfos().iterator().next();
JPAFieldNature fieldNature = new JPAFieldNature(fieldInfo);
assertTrue(fieldNature.isManyToMany());
assertFalse(fieldNature.isManyToManyInverseCopy());
assertTrue(fieldNature.isRelationLazyFetch());
assertFalse(fieldNature.isRelationOptional());
assertEquals(Collection.class, fieldNature.getRelationCollectionType());
assertNull(fieldNature.getRelationMappedBy());
assertEquals(SelfRelated.class, fieldNature.getRelationTargetEntity());
}
@Entity
@Ignore
public class SelfRelated {
private int _id;
private Collection<SelfRelated> _friends;
@Id
public int getId() {
return _id;
}
public void setId(final int id) {
_id = id;
}
@ManyToMany
@JoinTable()
public Collection<SelfRelated> getFriends() {
return _friends;
}
public void setFriends(final Collection<SelfRelated> others) {
_friends = others;
}
}
@Entity
@Ignore
public class Unidir1 {
private int _id;
private Collection<Unidir2> _dependents;
@Id
public int getId() {
return _id;
}
public void setId(final int id) {
_id = id;
}
@ManyToMany
public Collection<Unidir2> getDependents() {
return _dependents;
}
public void setDependents(final Collection<Unidir2> dependents) {
_dependents = dependents;
}
}
@Entity
@Ignore
public class Unidir2 {
private int _id;
@Id
public int getId() {
return _id;
}
public void setId(final int id) {
_id = id;
}
}
@Entity
@Ignore
public class Bidir1a {
private int _id;
private Collection<Bidir1b> _dependents;
@Id
public int getId() {
return _id;
}
public void setId(final int id) {
_id = id;
}
@ManyToMany
@JoinTable()
public Collection<Bidir1b> getDependents() {
return _dependents;
}
public void setDependents(final Collection<Bidir1b> dependents) {
_dependents = dependents;
}
}
@Entity
@Ignore
public class Bidir1b {
private int _id;
private Collection<Bidir1a> _owner;
@Id
public int getId() {
return _id;
}
public void setId(final int id) {
_id = id;
}
@ManyToMany(
mappedBy = "dependents",
cascade = {CascadeType.PERSIST, CascadeType.REMOVE}
)
public Collection<Bidir1a> getOwner() {
return _owner;
}
public void setOwner(final Collection<Bidir1a> owner) {
_owner = owner;
}
}
@Entity
@Ignore
public class Bidir2WrongMappedByA {
private int _id;
private Collection<Bidir2WrongMappedByB> _dependents;
@Id
public int getId() {
return _id;
}
public void setId(final int id) {
_id = id;
}
@ManyToMany
public Collection<Bidir2WrongMappedByB> getDependents() {
return _dependents;
}
public void setDependents(
final Collection<Bidir2WrongMappedByB> dependents) {
_dependents = dependents;
}
}
@Entity
@Ignore
public class Bidir2WrongMappedByB {
private int _id;
private Collection<Bidir2WrongMappedByA> _owner;
@Id
public int getId() {
return _id;
}
public void setId(final int id) {
_id = id;
}
@ManyToMany(mappedBy = "non existant")
public Collection<Bidir2WrongMappedByA> getOwner() {
return _owner;
}
public void setOwner(final Collection<Bidir2WrongMappedByA> owner) {
_owner = owner;
}
}
@Entity
@Ignore
public class Bidir2WrongMappedByC {
private int _id;
private Collection<Bidir2WrongMappedByA> _owner;
@Id
public int getId() {
return _id;
}
public void setId(final int id) {
_id = id;
}
@ManyToMany(mappedBy = "dependents")
public Collection<Bidir2WrongMappedByA> getOwner() {
return _owner;
}
public void setOwner(final Collection<Bidir2WrongMappedByA> owner) {
_owner = owner;
}
}
@Entity
@Ignore
public class Bidir2WrongMappedByD {
private int _id;
private Collection<Bidir2WrongMappedByE> _dependents;
@Id
public int getId() {
return _id;
}
public void setId(final int id) {
_id = id;
}
@ManyToMany(mappedBy = "others")
public Collection<Bidir2WrongMappedByE> getDependents() {
return _dependents;
}
public void setDependents(
final Collection<Bidir2WrongMappedByE> dependents) {
_dependents = dependents;
}
}
@Entity
@Ignore
public class Bidir2WrongMappedByE {
private int _id;
private Collection<Bidir2WrongMappedByD> _others;
@Id
public int getId() {
return _id;
}
public void setId(final int id) {
_id = id;
}
@ManyToMany(mappedBy = "dependents")
public Collection<Bidir2WrongMappedByD> getOthers() {
return _others;
}
public void setOthers(final Collection<Bidir2WrongMappedByD> others) {
_others = others;
}
}
}