/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.cmp2.fkmapping.test; import javax.ejb.EJBException; import javax.ejb.EJBLocalObject; import javax.ejb.RemoveException; import javax.ejb.NoSuchObjectLocalException; import javax.naming.NamingException; import javax.naming.InitialContext; import javax.transaction.UserTransaction; import junit.framework.Test; import org.jboss.test.JBossTestCase; import org.jboss.test.util.ejb.EJBTestCase; import org.jboss.test.cmp2.fkmapping.ejb.DepartmentLocal; import org.jboss.test.cmp2.fkmapping.ejb.DepartmentLocalHome; import org.jboss.test.cmp2.fkmapping.ejb.DepartmentUtil; import org.jboss.test.cmp2.fkmapping.ejb.ExamenationLocal; import org.jboss.test.cmp2.fkmapping.ejb.ExamenationLocalHome; import org.jboss.test.cmp2.fkmapping.ejb.ExamenationUtil; import org.jboss.test.cmp2.fkmapping.ejb.GroupLocal; import org.jboss.test.cmp2.fkmapping.ejb.GroupLocalHome; import org.jboss.test.cmp2.fkmapping.ejb.GroupUtil; import org.jboss.test.cmp2.fkmapping.ejb.InstituteLocal; import org.jboss.test.cmp2.fkmapping.ejb.InstituteLocalHome; import org.jboss.test.cmp2.fkmapping.ejb.InstituteUtil; import org.jboss.test.cmp2.fkmapping.ejb.StudentLocal; import org.jboss.test.cmp2.fkmapping.ejb.StudentLocalHome; import org.jboss.test.cmp2.fkmapping.ejb.StudentUtil; import org.jboss.test.cmp2.fkmapping.ejb.ManagerUtil; import org.jboss.test.cmp2.fkmapping.ejb.Manager; import org.jboss.test.cmp2.fkmapping.ejb.ChildUPKUtil; /** * * @author <a href="mailto:alex@jboss.org">Alex Loubyansky</a> */ public class FKMappingUnitTestCase extends EJBTestCase { private InstituteLocalHome instituteHome; private DepartmentLocalHome departmentHome; private GroupLocalHome groupHome; private StudentLocalHome studentHome; private ExamenationLocalHome examHome; // Suite --------------------------------------------------- public static Test suite() throws Exception { return JBossTestCase.getDeploySetup(FKMappingUnitTestCase.class, "cmp2-fkmapping.jar"); } // Constructor --------------------------------------------- public FKMappingUnitTestCase(String name) { super(name); } // Tests --------------------------------------------------- public void testStandaloneFKMapping() throws Exception { InstituteLocal institute = null; DepartmentLocal department = null; try { institute = getInstituteHome().create("NTUUKPI", "Natinal Technical University Of The Ukraine KPI"); department = getDepartmentHome().create("KV", "Specialized Computer Systems"); institute.getDepartments().add(department); assertTrue("department.getInstitute().isIdentical(institute)", department.getInstitute().isIdentical(institute)); department.setInstitute(null); assertTrue("institute.getDepartments().isEmpty()", institute.getDepartments().isEmpty()); } finally { removeEntity(institute); removeEntity(department); } } public void testJoing() throws Exception { DepartmentLocal department = null; GroupLocal kv62Group = null; GroupLocal kv63Group = null; try { System.out.println("testJoin()"); department = getDepartmentHome().create("KV", "Specialized Computer Systems"); kv62Group = getGroupHome().create("KV", 62, "KV-62"); kv63Group = getGroupHome().create("KV", 63, "KV-63"); commit(); System.out.println("testJoin() 2"); getGroupHome().findAll(); kv62Group.getDepartment(); System.out.println("testJoin() 3"); } finally { removeEntity(kv63Group); removeEntity(kv62Group); removeEntity(department); } } public void testCompleteFKToPKMapping() throws Exception { DepartmentLocal department = null; GroupLocal kv62Group = null; try { // one-side instance created before many-side instance department = getDepartmentHome().create("KV", "Specialized Computer Systems"); assertTrue("department.getGroups().isEmpty()", department.getGroups().isEmpty()); kv62Group = getGroupHome().create("KV", 62, "KV-62"); assertTrue("department.getGroups().contains(kv62Group)", department.getGroups().contains(kv62Group)); assertTrue("kv62Group.getDepartment().isIdentical(department)", kv62Group.getDepartment().isIdentical(department)); kv62Group.remove(); assertTrue("department.getGroups().isEmpty()", department.getGroups().isEmpty()); // many-side instance created before one-side instance department.remove(); kv62Group = getGroupHome().create("KV", 62, "KV-62"); assertTrue("kv62Group.getDepartment() == null", kv62Group.getDepartment() == null); department = getDepartmentHome().create("KV", "Specialized Computer Systems"); assertTrue("kv62Group.getDepartment().isIdentical(department)", kv62Group.getDepartment().isIdentical(department)); assertTrue("department.getGroups().contains(kv62Group)", department.getGroups().contains(kv62Group)); department.remove(); department = null; assertTrue("kv62Group.getDepartment() == null", kv62Group.getDepartment() == null); } finally { removeEntity(department); removeEntity(kv62Group); } } public void testPartialFKToPKMapping() throws Exception { StudentLocal petrovStudent = null; StudentLocal sidorovStudent = null; GroupLocal group = null; try { petrovStudent = getStudentHome().create("KV", "Petrov", "Petrov works on KV department."); group = getGroupHome().create("KV", 62, "KV-62"); assertTrue("petrovStudent.getGroup() == null", petrovStudent.getGroup() == null); petrovStudent.setGroup(group); assertTrue("group.isIdentical(petrovStudent.getGroup())", group.isIdentical(petrovStudent.getGroup())); assertTrue("group.getStudents().contains(petrovStudent)", group.getStudents().contains(petrovStudent)); sidorovStudent = getStudentHome().create("KV", "Sidorov", "Sidorov works on KV department."); group.getStudents().add(sidorovStudent); assertTrue("sidorovStudent.getGroup().isIdentical(group)", sidorovStudent.getGroup().isIdentical(group)); assertTrue("group.getStudents().contains(petrovStudent)", group.getStudents().contains(petrovStudent)); assertTrue("group.getStudents().contains(sidorovStudent)", group.getStudents().contains(sidorovStudent)); group.remove(); group = null; assertTrue("petrovStudent.getGroup() == null", petrovStudent.getGroup() == null); assertTrue("sidorovStudent.getGroup() == null", sidorovStudent.getGroup() == null); /* group = getGroupHome().create("KV", 62, "KV-62"); assertTrue("group.getStudents().contains(petrovStudent)", group.getStudents().contains(petrovStudent)); assertTrue("group.isIdentical(petrovStudent.getGroup())", group.isIdentical(petrovStudent.getGroup())); */ } finally { removeEntity(petrovStudent); removeEntity(sidorovStudent); removeEntity(group); } } public void testFKToCMPMapping() throws Exception { GroupLocal kv61Group = null; GroupLocal kv62Group = null; ExamenationLocal exam = null; try { kv62Group = getGroupHome().create("KV", 62, "KV-62"); exam = getExamHome().create("kv61-1", "Math", "KV", 62); assertTrue("kv62Group.isIdentical(exam.getGroup())", kv62Group.isIdentical(exam.getGroup())); assertTrue("kv62Group.getExamenations().contains(exam)", kv62Group.getExamenations().contains(exam)); kv61Group = getGroupHome().create("KV", 61, "KV-61"); exam.setGroup(kv61Group); assertTrue("expected: exam.getGroupNumber() == 61;" + " got: exam.getGroupNumber() == " + exam.getGroupNumber(), exam.getGroupNumber() == 61); exam.setGroupNumber(62); assertTrue("kv62Group.isIdentical(exam.getGroup())", kv62Group.isIdentical(exam.getGroup())); assertTrue("kv62Group.getExamenations().contains(exam);", kv62Group.getExamenations().contains(exam)); assertTrue("kv61Group.getExamenations().isEmpty();", kv61Group.getExamenations().isEmpty()); exam.setDepartmentCode("KM"); exam.setDepartmentCode2("XKM"); assertTrue("exam.getGroup() == null", exam.getGroup() == null); assertTrue("kv62Group.getExamenations().isEmpty();", kv62Group.getExamenations().isEmpty()); exam.setDepartmentCode("KV"); exam.setDepartmentCode2("XKV"); assertTrue("kv62Group.isIdentical(exam.getGroup())", kv62Group.isIdentical(exam.getGroup())); assertTrue("kv62Group.getExamenations().contains(exam);", kv62Group.getExamenations().contains(exam)); } finally { removeEntity(exam); removeEntity(kv61Group); removeEntity(kv62Group); } } public void testInsertAfterEjbPostCreate() throws Exception { Long long1 = new Long(1); String avoka = "Avoka"; String irene = "Irene"; Manager manager = ManagerUtil.getHome().create(); manager.createParent(long1, irene); try { manager.createChild(long1, avoka); fail("Should have filed as the foreign key field can't be null."); } catch(Exception expected){} manager.createChild(long1, avoka, long1, irene); manager.createChild(new Long(2), "Ataka", long1, irene); manager.assertChildHasMother(long1, long1, irene); manager.assertChildHasMother(new Long(2), long1, irene); } public void testGeneratedPKWithInsertAfterPostCreate() throws Exception { // this will fail unless pk value is generated and set in ejbCreate ChildUPKUtil.getLocalHome().create(null); } /** * Tests complete foreign key load. * The bug was that, when null value was loaded for a foreign key field, * consequent reading of foreign key fields for current CMR was stopped and incorrect * result index was returned. Further loaded fields contained messed up values. * NOTE: to reproduce the bug, foreign key must be a composite key. When loading, foreign key * must be null and after loading results for foreign key there should be results for other fields * loaded from the same SQL SELECT. */ public void testCompleteFKReadOnLoad() throws Exception { Manager manager = ManagerUtil.getHome().create(); // one of the following will fail (with NPE) if there is the bug Object childPK = manager.createChildUPKWithMother(); manager.loadChildUPKWithMother(childPK); childPK = manager.createChildUPKWithFather(); manager.loadChildUPKWithFather(childPK); } // Private private StudentLocalHome getStudentHome() throws NamingException { if (studentHome == null) studentHome = StudentUtil.getLocalHome(); return studentHome; } private ExamenationLocalHome getExamHome() throws NamingException { if (examHome == null) examHome = ExamenationUtil.getLocalHome(); return examHome; } private InstituteLocalHome getInstituteHome() throws NamingException { if (instituteHome == null) instituteHome = InstituteUtil.getLocalHome(); return instituteHome; } private DepartmentLocalHome getDepartmentHome() throws NamingException { if (departmentHome == null) departmentHome = DepartmentUtil.getLocalHome(); return departmentHome; } private GroupLocalHome getGroupHome() throws NamingException { if (groupHome == null) groupHome = GroupUtil.getLocalHome(); return groupHome; } private void removeEntity(EJBLocalObject localEntity) { if (localEntity != null) { try { localEntity.remove(); } catch (RemoveException re) { throw new EJBException("Couldn't remove local entity " + localEntity.getPrimaryKey()); } catch(NoSuchObjectLocalException e) { // ok } } } private void commit() throws Exception { UserTransaction tx = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction"); tx.commit(); tx.begin(); } }