View | Details | Raw Unified | Return to bug 344757
Collapse All | Expand All

(-)jpa/eclipselink.jpa.test/build.xml (+15 lines)
Lines 2453-2458 Link Here
2453
            <param name="eclipselink.jpa.test.dir" value="."/>
2453
            <param name="eclipselink.jpa.test.dir" value="."/>
2454
        </antcall>
2454
        </antcall>
2455
    </target>
2455
    </target>
2456
2457
    <target name="server-test-advanced-multitenant">
2458
        <antcall target="server-run-all" inheritRefs="true">
2459
            <param name="PERSISTENCE_UNIT_NAME" value="default"/>
2460
            <param name="USE_MULTIPLE_PERSISTENCE_UNITS" value="true"/>
2461
            <param name="MODEL_DIR" value="org/eclipse/persistence/testing/models/jpa/advanced"/>
2462
            <param name="MODEL_NAME" value="eclipselink-advanced-multitenant-model"/>
2463
            <param name="TEST_DIR" value="org/eclipse/persistence/testing/tests/jpa/advanced"/>
2464
            <param name="TEST_NAME" value="eclipselink-advanced-multitenant-model"/>
2465
            <param name="EAR_NAME" value="eclipselink-advanced-multitenant-model"/>
2466
            <param name="TEST_SUITE" value="org.eclipse.persistence.testing.tests.jpa.advanced.multitenant.AdvancedMultiTenantServerTestSuite"/>
2467
            <param name="eclipselink.jpa.test.dir" value="."/>
2468
        </antcall>
2469
    </target>
2470
2456
    <!--this model is only used for testing that setting eclipselink as default provider on weblogic domain-->
2471
    <!--this model is only used for testing that setting eclipselink as default provider on weblogic domain-->
2457
	<target name="weblogic-domain-test" depends="clean-test">
2472
	<target name="weblogic-domain-test" depends="clean-test">
2458
	    <ant antfile="${eclipselink.jpa.test}/weblogic.xml" target="weblogic-domain-setup" inheritRefs="true"/>
2473
	    <ant antfile="${eclipselink.jpa.test}/weblogic.xml" target="weblogic-domain-setup" inheritRefs="true"/>
(-)jpa/eclipselink.jpa.test/resource/eclipselink-advanced-multitenant-model/server/persistence.xml (+74 lines)
Line 0 Link Here
1
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd" version="1.0">
2
    <persistence-unit name="%%default%%" transaction-type="%%transaction-type%%">
3
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
4
        <%%datasource-type%%>%%data-source-name%%</%%datasource-type%%>
5
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
6
        <properties>
7
            <property name="eclipselink.target-server" value="%%server-platform%%"/>
8
            <property name="eclipselink.target-database" value="%%database-platform%%"/>
9
            <property name="eclipselink.weaving" value="%%server-weaving%%"/>
10
            <property name="eclipselink.validate-existence" value="true"/>
11
            <property name="eclipselink.logging.level" value="INFO"/>
12
        </properties>
13
    </persistence-unit>
14
    <!--multi-tenant-shared-emf PU-->
15
    <persistence-unit name="MulitPU-1" transaction-type="%%transaction-type%%">
16
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
17
        <%%datasource-type%%>%%data-source-name%%</%%datasource-type%%>
18
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Boss</class>
19
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Capo</class>
20
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Contract</class>
21
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.MafiaFamily</class>
22
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Mafioso</class>
23
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Soldier</class>
24
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Underboss</class>
25
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
26
        <properties>
27
            <property name="eclipselink.target-server" value="%%server-platform%%"/>
28
            <property name="eclipselink.target-database" value="%%database-platform%%"/>
29
            <property name="eclipselink.weaving" value="%%server-weaving%%"/>
30
            <property name="eclipselink.validate-existence" value="true"/>
31
            <property name="eclipselink.logging.level" value="INFO"/>
32
            <property name="eclipselink.multitenant.tenants-share-cache" value="true"/>
33
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
34
            <property name="eclipselink.create-ddl-jdbc-file-name" value="createMafia_ddlGeneration.jdbc"/>
35
            <property name="eclipselink.drop-ddl-jdbc-file-name" value="dropMafia_ddlGeneration.jdbc"/>
36
            <property name="eclipselink.ddl-generation.output-mode" value="sql-script"/>
37
        </properties>
38
    </persistence-unit>
39
    <!--multi-tenant-123 PU-->
40
    <persistence-unit name="MulitPU-2" transaction-type="%%transaction-type%%">
41
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
42
        <%%datasource-type%%>%%data-source-name%%</%%datasource-type%%>
43
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Boss</class>
44
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Capo</class>
45
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Contract</class>
46
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.MafiaFamily</class>
47
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Mafioso</class>
48
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Soldier</class>
49
        <class>org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Underboss</class>
50
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
51
        <properties>
52
            <property name="eclipselink.target-server" value="%%server-platform%%"/>
53
            <property name="eclipselink.target-database" value="%%database-platform%%"/>
54
            <property name="eclipselink.weaving" value="%%server-weaving%%"/>
55
            <property name="eclipselink.validate-existence" value="true"/>
56
            <property name="eclipselink.logging.level" value="INFO"/>
57
            <property name="tenant.id" value="123"/>
58
            <property name="eclipselink.tenant-id" value="123"/>
59
            <property name="eclipselink.session-name" value="multi-tenant-123"/>
60
        </properties>
61
    </persistence-unit>
62
    <persistence-unit name="MulitPU-3" transaction-type="%%transaction-type%%">
63
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
64
        <%%datasource-type%%>%%data-source-name%%</%%datasource-type%%>
65
    </persistence-unit>
66
    <persistence-unit name="MulitPU-4" transaction-type="%%transaction-type%%">
67
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
68
        <%%datasource-type%%>%%data-source-name%%</%%datasource-type%%>
69
    </persistence-unit>
70
    <persistence-unit name="MulitPU-5" transaction-type="%%transaction-type%%">
71
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
72
        <%%datasource-type%%>%%data-source-name%%</%%datasource-type%%>
73
    </persistence-unit>
74
</persistence>
(-)jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/advanced/multitenant/AdvancedMultiTenant123JunitTest.java (+182 lines)
Line 0 Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2011 Oracle. All rights reserved.
3
 * This program and the accompanying materials are made available under the 
4
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
5
 * which accompanies this distribution. 
6
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
7
 * and the Eclipse Distribution License is available at 
8
 * http://www.eclipse.org/org/documents/edl-v10.php.
9
 *
10
 * Contributors:
11
 *     03/23/2011-2.3 Guy Pelletier 
12
 *       - 337323: Multi-tenant with shared schema support (part 1)
13
 *     04/01/2011-2.3 Guy Pelletier 
14
 *       - 337323: Multi-tenant with shared schema support (part 2)
15
 *     04/21/2011-2.3 Guy Pelletier 
16
 *       - 337323: Multi-tenant with shared schema support (part 5)
17
 ******************************************************************************/  
18
package org.eclipse.persistence.testing.tests.jpa.advanced.multitenant;
19
20
import java.util.ArrayList;
21
import java.util.List;
22
23
import javax.persistence.EntityManager;
24
25
import junit.framework.*;
26
27
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
28
29
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Boss;
30
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Capo;
31
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Contract;
32
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.MafiaFamily;
33
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Mafioso;
34
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Soldier;
35
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Underboss;
36
37
public class AdvancedMultiTenant123JunitTest extends JUnitTestCase { 
38
    public static final String MULTI_TENANT_PU_123 = "MulitPU-2";
39
40
    public static int family123;
41
    public static List<Integer> family123Mafiosos = new ArrayList<Integer>();
42
    public static List<Integer> family123Contracts = new ArrayList<Integer>();
43
 
44
    public AdvancedMultiTenant123JunitTest() {
45
        super();
46
    }
47
    
48
    public AdvancedMultiTenant123JunitTest(String name) {
49
        super(name);
50
        setPuName(MULTI_TENANT_PU_123);
51
    }
52
    
53
    public void setUp() {}
54
    
55
    public static Test suite() {
56
        TestSuite suite = new TestSuite();
57
        suite.setName("AdvancedMultiTenant123JunitTest");
58
        if (! JUnitTestCase.isJPA10()) {
59
            suite.addTest(new AdvancedMultiTenant123JunitTest("testCreateMafiaFamily123"));
60
            suite.addTest(new AdvancedMultiTenant123JunitTest("testValidateMafiaFamily123"));
61
        }
62
        return suite;
63
    }
64
    
65
    public void testCreateMafiaFamily123() {
66
        EntityManager em = createEntityManager(MULTI_TENANT_PU_123);
67
        try {
68
            beginTransaction(em);
69
            
70
            MafiaFamily family = new MafiaFamily();
71
            family.setName("Galore");
72
            family.setRevenue(4321.03);
73
            family.addTag("newtag1");
74
            
75
            Boss boss = new Boss();
76
            boss.setFirstName("Kitty");
77
            boss.setLastName("Galore");
78
            boss.setGender(Mafioso.Gender.Female);
79
            
80
            Underboss underboss = new Underboss();
81
            underboss.setFirstName("Number2");
82
            underboss.setLastName("Galore");
83
            underboss.setGender(Mafioso.Gender.Male);
84
            
85
            Capo capo1 = new Capo();
86
            capo1.setFirstName("Capo");
87
            capo1.setLastName("Galore");
88
            capo1.setGender(Mafioso.Gender.Male);
89
            
90
            Soldier soldier1 = new Soldier();
91
            soldier1.setFirstName("Grunt");
92
            soldier1.setLastName("Galore");
93
            soldier1.setGender(Mafioso.Gender.Male);
94
            
95
            Contract contract1 = new Contract();
96
            contract1.setDescription("Whack all other family boss");
97
            
98
            Contract contract2 = new Contract();
99
            contract2.setDescription("Pillage, pillage, pillage!");
100
            
101
            // Populate the relationships.
102
            contract1.addSoldier(soldier1);
103
            
104
            contract2.addSoldier(soldier1);
105
            
106
            boss.setUnderboss(underboss);
107
            
108
            capo1.setUnderboss(underboss);
109
            
110
            capo1.addSoldier(soldier1);
111
            
112
            underboss.addCapo(capo1);
113
            
114
            family.addMafioso(boss);
115
            family.addMafioso(underboss);
116
            
117
            family.addMafioso(capo1);
118
119
            family.addMafioso(soldier1);
120
            
121
            // Will cascade through the whole family.
122
            em.persist(family);
123
            family123 = family.getId();
124
            family123Mafiosos.add(boss.getId());
125
            family123Mafiosos.add(underboss.getId());
126
            family123Mafiosos.add(capo1.getId());
127
            family123Mafiosos.add(soldier1.getId());
128
            family123Contracts.add(contract1.getId());
129
            family123Contracts.add(contract2.getId());
130
            commitTransaction(em);
131
        } catch (RuntimeException e) {
132
            if (isTransactionActive(em)){
133
                rollbackTransaction(em);
134
            }
135
            throw e;
136
        } finally {
137
            closeEntityManager(em);
138
        }
139
    }
140
        
141
    public void testValidateMafiaFamily123() {
142
        EntityManager em = createEntityManager(MULTI_TENANT_PU_123);
143
        try {
144
            clearCache(MULTI_TENANT_PU_123);
145
            em.clear();
146
147
            MafiaFamily family =  em.find(MafiaFamily.class, family123);
148
            assertNotNull("The Mafia Family with id: " + family123 + ", was not found", family);
149
            assertTrue("The Mafia Family had an incorrect number of tags [" + family.getTags().size() + "], expected [1]", family.getTags().size() == 1);
150
            assertNull("The Mafia Family with id: " + AdvancedMultiTenantSharedEMFJunitTest.family707 + ", was found (when it should not have been)", em.find(MafiaFamily.class, AdvancedMultiTenantSharedEMFJunitTest.family707));
151
            assertNull("The Mafia Family with id: " + AdvancedMultiTenantSharedEMFJunitTest.family007 + ", was found (when it should not have been)", em.find(MafiaFamily.class, AdvancedMultiTenantSharedEMFJunitTest.family007));
152
            assertFalse("No mafiosos part of 123 family", family.getMafiosos().isEmpty());
153
154
            // See if we can find any members of the other family.
155
            for (Integer id : AdvancedMultiTenantSharedEMFJunitTest.family707Mafiosos) {
156
                assertNull("Found family 707 mafioso.", em.find(Mafioso.class, id));
157
            }
158
            
159
            // Query directly for the boss from the other family.
160
            Boss otherBoss = em.find(Boss.class, AdvancedMultiTenantSharedEMFJunitTest.family707Mafiosos.get(0));
161
            assertNull("Found family 707 boss.", otherBoss);
162
            
163
            // See if we can find any contracts of the other family.
164
            for (Integer id : AdvancedMultiTenantSharedEMFJunitTest.family707Contracts) {
165
                assertNull("Found family 707 contract. ", em.find(Contract.class, id));
166
            }
167
            
168
            // Try a select named query
169
            List families = em.createNamedQuery("findJPQLMafiaFamilies").getResultList();
170
            assertTrue("Incorrect number of families were returned [" + families.size() + "], expected [1]",  families.size() == 1);
171
        } catch (RuntimeException e) {
172
            if (isTransactionActive(em)){
173
                rollbackTransaction(em);
174
            }
175
            
176
            throw e;
177
        } finally {
178
            closeEntityManager(em);
179
        }
180
    }
181
        
182
}
(-)jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/advanced/multitenant/AdvancedMultiTenantServerTestSuite.java (+35 lines)
Line 0 Link Here
1
/*******************************************************************************
2
 * Copyright (c) 1998, 2011 Oracle. All rights reserved.
3
 * This program and the accompanying materials are made available under the 
4
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
5
 * which accompanies this distribution. 
6
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
7
 * and the Eclipse Distribution License is available at 
8
 * http://www.eclipse.org/org/documents/edl-v10.php.
9
 *
10
 * Contributors:
11
 *     Oracle - initial API and implementation from Oracle TopLink
12
 ******************************************************************************/  
13
package org.eclipse.persistence.testing.tests.jpa.advanced.multitenant;
14
15
import org.eclipse.persistence.testing.tests.jpa.advanced.multitenant.AdvancedMultiTenantSharedEMFJunitTest;
16
import org.eclipse.persistence.testing.tests.jpa.advanced.multitenant.AdvancedMultiTenant123JunitTest;
17
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
18
19
import junit.framework.TestSuite;
20
import junit.framework.Test;
21
22
/**
23
 * <p><b>Purpose</b>: To collect the tests that will run against Application Server only.
24
 */
25
public class AdvancedMultiTenantServerTestSuite extends TestSuite {
26
27
    public static Test suite() {
28
        JUnitTestCase.initializePlatform();
29
        TestSuite suite = new TestSuite();
30
        suite.setName("Advanced Multitenant ServerTestSuite");
31
        suite.addTest(AdvancedMultiTenantSharedEMFJunitTest.suite());
32
        suite.addTest(AdvancedMultiTenant123JunitTest.suite());
33
        return suite;
34
    }
35
}
(-)jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/advanced/multitenant/AdvancedMultiTenantSharedEMFJunitTest.java (+531 lines)
Line 0 Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2011 Oracle. All rights reserved.
3
 * This program and the accompanying materials are made available under the 
4
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
5
 * which accompanies this distribution. 
6
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
7
 * and the Eclipse Distribution License is available at 
8
 * http://www.eclipse.org/org/documents/edl-v10.php.
9
 *
10
 * Contributors:
11
 *     03/23/2011-2.3 Guy Pelletier 
12
 *       - 337323: Multi-tenant with shared schema support (part 1)
13
 *     04/01/2011-2.3 Guy Pelletier 
14
 *       - 337323: Multi-tenant with shared schema support (part 2)
15
 *     04/21/2011-2.3 Guy Pelletier 
16
 *       - 337323: Multi-tenant with shared schema support (part 5)
17
 ******************************************************************************/  
18
package org.eclipse.persistence.testing.tests.jpa.advanced.multitenant;
19
20
import java.util.ArrayList;
21
//import java.util.HashMap;
22
import java.util.List;
23
//import java.util.Map;
24
25
import javax.persistence.EntityManager;
26
//import javax.persistence.EntityManagerFactory;
27
//import javax.persistence.NamedQuery;
28
//import javax.persistence.Persistence;
29
import javax.persistence.Query;
30
31
import junit.framework.*;
32
33
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
34
35
import org.eclipse.persistence.config.EntityManagerProperties;
36
//import org.eclipse.persistence.config.PersistenceUnitProperties;
37
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.AdvancedMultiTenantTableCreator;
38
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Boss;
39
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Capo;
40
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Contract;
41
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.MafiaFamily;
42
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Mafioso;
43
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Soldier;
44
import org.eclipse.persistence.testing.models.jpa.advanced.multitenant.Underboss;
45
46
public class AdvancedMultiTenantSharedEMFJunitTest extends JUnitTestCase { 
47
    public static final String MULTI_TENANT_PU = "MulitPU-1";
48
    
49
    public static int family707;
50
    public static int family007;
51
    public static List<Integer> family707Mafiosos = new ArrayList<Integer>();
52
    public static List<Integer> family707Contracts = new ArrayList<Integer>();
53
    public static List<Integer> family007Mafiosos = new ArrayList<Integer>();
54
    public static List<Integer> family007Contracts = new ArrayList<Integer>();
55
    
56
    public AdvancedMultiTenantSharedEMFJunitTest() {
57
        super();
58
    }
59
    
60
    public AdvancedMultiTenantSharedEMFJunitTest(String name) {
61
        super(name);
62
        setPuName(MULTI_TENANT_PU);
63
    }
64
    
65
    public void setUp() {}
66
    
67
    public static Test suite() {
68
        TestSuite suite = new TestSuite();
69
        suite.setName("AdvancedMultiTenantSharedEMFJunitTest");
70
        if (! JUnitTestCase.isJPA10()) {
71
            suite.addTest(new AdvancedMultiTenantSharedEMFJunitTest("testSetup"));
72
            
73
            suite.addTest(new AdvancedMultiTenantSharedEMFJunitTest("testCreateMafiaFamily707"));
74
            suite.addTest(new AdvancedMultiTenantSharedEMFJunitTest("testCreateMafiaFamily007"));
75
            suite.addTest(new AdvancedMultiTenantSharedEMFJunitTest("testValidateMafiaFamily707"));
76
            suite.addTest(new AdvancedMultiTenantSharedEMFJunitTest("testValidateMafiaFamily007"));
77
            suite.addTest(new AdvancedMultiTenantSharedEMFJunitTest("testValidateMafiaFamily707and007WithSameEM"));
78
        }
79
        return suite;
80
    }
81
    
82
    /**
83
     * The setup is done as a test, both to record its failure, and to allow execution in the server.
84
     */
85
    public void testSetup() {
86
        new AdvancedMultiTenantTableCreator().replaceTables(JUnitTestCase.getServerSession(MULTI_TENANT_PU));
87
    }
88
    
89
    public void testCreateMafiaFamily707() {
90
        EntityManager em = createEntityManager(MULTI_TENANT_PU);
91
        try {
92
            beginTransaction(em);
93
            //on server side, you have to set the em properties after transaction begins
94
            em.setProperty("tenant.id", "707");
95
            em.setProperty(EntityManagerProperties.MULTITENANT_PROPERTY_DEFAULT, "707");
96
97
            MafiaFamily family = new MafiaFamily();
98
            family.setName("Gonzo");
99
            family.setRevenue(10000000.00);
100
            family.addTag("firstTag");
101
            family.addTag("secondTag");
102
            family.addTag("thirdTag");
103
            
104
            Boss boss = new Boss();
105
            boss.setFirstName("707");
106
            boss.setLastName("Boss");
107
            boss.setGender(Mafioso.Gender.Male);
108
            
109
            Underboss underboss = new Underboss();
110
            underboss.setFirstName("Under");
111
            underboss.setLastName("Boss");
112
            underboss.setGender(Mafioso.Gender.Male);
113
            
114
            Capo capo1 = new Capo();
115
            capo1.setFirstName("Capo");
116
            capo1.setLastName("Giggaloo");
117
            capo1.setGender(Mafioso.Gender.Female);
118
            
119
            Capo capo2 = new Capo();
120
            capo2.setFirstName("Capo");
121
            capo2.setLastName("CrazyGlue");
122
            capo2.setGender(Mafioso.Gender.Male);
123
            
124
            Soldier soldier1 = new Soldier();
125
            soldier1.setFirstName("Soldier");
126
            soldier1.setLastName("One");
127
            soldier1.setGender(Mafioso.Gender.Female);
128
                                    
129
            Soldier soldier2 = new Soldier();
130
            soldier2.setFirstName("Soldier");
131
            soldier2.setLastName("Two");
132
            soldier2.setGender(Mafioso.Gender.Male);
133
            
134
            Soldier soldier3 = new Soldier();
135
            soldier3.setFirstName("Soldier");
136
            soldier3.setLastName("Three");
137
            soldier3.setGender(Mafioso.Gender.Male);
138
            
139
            Soldier soldier4 = new Soldier();
140
            soldier4.setFirstName("Soldier");
141
            soldier4.setLastName("Four");
142
            soldier4.setGender(Mafioso.Gender.Male);
143
144
            Soldier soldier5 = new Soldier();
145
            soldier5.setFirstName("Soldier");
146
            soldier5.setLastName("Four");
147
            soldier5.setGender(Mafioso.Gender.Female);
148
            
149
            Contract contract1 = new Contract();
150
            contract1.setDescription("Whack 007 family boss");
151
            
152
            Contract contract2 = new Contract();
153
            contract2.setDescription("Acquire fully-automatic guns");
154
            
155
            Contract contract3 = new Contract();
156
            contract3.setDescription("Steal some money");
157
            
158
            // Populate the relationships.
159
            contract1.addSoldier(soldier1);
160
            contract1.addSoldier(soldier5);
161
            
162
            contract2.addSoldier(soldier1);
163
            contract2.addSoldier(soldier3);
164
            contract2.addSoldier(soldier5);
165
            
166
            contract3.addSoldier(soldier2);
167
            contract3.addSoldier(soldier3);
168
            contract3.addSoldier(soldier4);
169
            contract3.addSoldier(soldier5);
170
            
171
            boss.setUnderboss(underboss);
172
            
173
            capo1.setUnderboss(underboss);
174
            capo2.setUnderboss(underboss);
175
            
176
            capo1.addSoldier(soldier1);
177
            capo1.addSoldier(soldier2);
178
            
179
            capo2.addSoldier(soldier3);
180
            capo2.addSoldier(soldier4);
181
            capo2.addSoldier(soldier5);
182
            
183
            underboss.addCapo(capo1);
184
            underboss.addCapo(capo2);
185
            
186
            family.addMafioso(boss);
187
            family.addMafioso(underboss);
188
            
189
            family.addMafioso(capo1);
190
            family.addMafioso(capo2);
191
192
            family.addMafioso(soldier1);
193
            family.addMafioso(soldier2);
194
            family.addMafioso(soldier3);
195
            family.addMafioso(soldier4);
196
            family.addMafioso(soldier5);
197
198
            // Will cascade through the whole family.
199
            em.persist(family);
200
            // Store the ids to verify
201
            family707 = family.getId();
202
            family707Mafiosos.add(boss.getId());
203
            family707Mafiosos.add(underboss.getId());
204
            family707Mafiosos.add(capo1.getId());
205
            family707Mafiosos.add(capo2.getId());
206
            family707Mafiosos.add(soldier1.getId());
207
            family707Mafiosos.add(soldier2.getId());
208
            family707Mafiosos.add(soldier3.getId());
209
            family707Mafiosos.add(soldier4.getId());
210
            family707Mafiosos.add(soldier5.getId());
211
            family707Contracts.add(contract1.getId());
212
            family707Contracts.add(contract2.getId());
213
            family707Contracts.add(contract3.getId());
214
            commitTransaction(em);
215
        } catch (RuntimeException e) {
216
            if (isTransactionActive(em)){
217
                rollbackTransaction(em);
218
            }
219
            throw e;
220
        } finally {
221
            closeEntityManager(em);
222
        }
223
    }
224
    
225
    public void testCreateMafiaFamily007() {
226
        EntityManager em = createEntityManager(MULTI_TENANT_PU);
227
        try {
228
            beginTransaction(em);
229
            //on server side, you have to set the em properties after transaction begins
230
            em.setProperty("tenant.id", "007");
231
            em.setProperty(EntityManagerProperties.MULTITENANT_PROPERTY_DEFAULT, "007");
232
            
233
            MafiaFamily family = new MafiaFamily();
234
            family.setName("Bond");
235
            family.setRevenue(987654321.03);
236
            family.addTag("tag1");
237
            family.addTag("tag2");
238
            family.addTag("tag3");
239
            family.addTag("tag4");
240
            family.addTag("tag5");
241
            
242
            Boss boss = new Boss();
243
            boss.setFirstName("007");
244
            boss.setLastName("Boss");
245
            boss.setGender(Mafioso.Gender.Female);
246
            
247
            Underboss underboss = new Underboss();
248
            underboss.setFirstName("Second");
249
            underboss.setLastName("InCommand");
250
            underboss.setGender(Mafioso.Gender.Female);
251
            
252
            Capo capo1 = new Capo();
253
            capo1.setFirstName("Capo");
254
            capo1.setLastName("Lubey");
255
            capo1.setGender(Mafioso.Gender.Male);
256
            
257
            Capo capo2 = new Capo();
258
            capo2.setFirstName("Capo");
259
            capo2.setLastName("Greasy");
260
            capo2.setGender(Mafioso.Gender.Female);
261
            
262
            Soldier soldier1 = new Soldier();
263
            soldier1.setFirstName("First");
264
            soldier1.setLastName("Grunt");
265
            soldier1.setGender(Mafioso.Gender.Male);
266
                                    
267
            Soldier soldier2 = new Soldier();
268
            soldier2.setFirstName("Second");
269
            soldier2.setLastName("Grunt");
270
            soldier2.setGender(Mafioso.Gender.Female);
271
            
272
            Soldier soldier3 = new Soldier();
273
            soldier3.setFirstName("Third");
274
            soldier3.setLastName("Grunt");
275
            soldier3.setGender(Mafioso.Gender.Female);
276
            
277
            Soldier soldier4 = new Soldier();
278
            soldier4.setFirstName("Fourth");
279
            soldier4.setLastName("Grunt");
280
            soldier4.setGender(Mafioso.Gender.Female);
281
282
            Soldier soldier5 = new Soldier();
283
            soldier5.setFirstName("Fifth");
284
            soldier5.setLastName("Grunt");
285
            soldier5.setGender(Mafioso.Gender.Male);
286
            
287
            Soldier soldier6 = new Soldier();
288
            soldier6.setFirstName("Sixth");
289
            soldier6.setLastName("Grunt");
290
            soldier6.setGender(Mafioso.Gender.Male);
291
            
292
            Soldier soldier7 = new Soldier();
293
            soldier7.setFirstName("Seventh");
294
            soldier7.setLastName("Grunt");
295
            soldier7.setGender(Mafioso.Gender.Male);
296
            
297
            Contract contract1 = new Contract();
298
            contract1.setDescription("Whack 707 family boss");
299
            
300
            Contract contract2 = new Contract();
301
            contract2.setDescription("Acquire semi-automatic guns");
302
            
303
            Contract contract3 = new Contract();
304
            contract3.setDescription("Set up new financing deals");
305
            
306
            // Populate the relationships.
307
            contract1.addSoldier(soldier1);
308
            contract1.addSoldier(soldier5);
309
            
310
            contract2.addSoldier(soldier1);
311
            contract2.addSoldier(soldier3);
312
            contract2.addSoldier(soldier7);
313
            
314
            contract3.addSoldier(soldier2);
315
            contract3.addSoldier(soldier3);
316
            contract3.addSoldier(soldier4);
317
            contract3.addSoldier(soldier5);
318
            
319
            boss.setUnderboss(underboss);
320
            
321
            capo1.setUnderboss(underboss);
322
            capo2.setUnderboss(underboss);
323
            
324
            capo1.addSoldier(soldier1);
325
            capo1.addSoldier(soldier2);
326
            
327
            capo2.addSoldier(soldier3);
328
            capo2.addSoldier(soldier4);
329
            capo2.addSoldier(soldier5);
330
            capo2.addSoldier(soldier6);
331
            capo2.addSoldier(soldier7);
332
            
333
            underboss.addCapo(capo1);
334
            underboss.addCapo(capo2);
335
            
336
            family.addMafioso(boss);
337
            family.addMafioso(underboss);
338
            
339
            family.addMafioso(capo1);
340
            family.addMafioso(capo2);
341
342
            family.addMafioso(soldier1);
343
            family.addMafioso(soldier2);
344
            family.addMafioso(soldier3);
345
            family.addMafioso(soldier4);
346
            family.addMafioso(soldier5);
347
            family.addMafioso(soldier6);
348
            family.addMafioso(soldier7);
349
            
350
            // Will cascade through the whole family.
351
            em.persist(family);
352
            family007 = family.getId();
353
            family007Mafiosos.add(boss.getId());
354
            family007Mafiosos.add(underboss.getId());
355
            family007Mafiosos.add(capo1.getId());
356
            family007Mafiosos.add(capo2.getId());
357
            family007Mafiosos.add(soldier1.getId());
358
            family007Mafiosos.add(soldier2.getId());
359
            family007Mafiosos.add(soldier3.getId());
360
            family007Mafiosos.add(soldier4.getId());
361
            family007Mafiosos.add(soldier5.getId());
362
            family007Mafiosos.add(soldier6.getId());
363
            family007Mafiosos.add(soldier7.getId());
364
            family007Contracts.add(contract1.getId());
365
            family007Contracts.add(contract2.getId());
366
            family007Contracts.add(contract3.getId());
367
            commitTransaction(em);
368
        } catch (RuntimeException e) {
369
            if (isTransactionActive(em)){
370
                rollbackTransaction(em);
371
            }
372
            throw e;
373
        } finally {
374
            closeEntityManager(em);
375
        }
376
    }
377
    
378
    public void testValidateMafiaFamily707() {
379
        EntityManager em = createEntityManager(MULTI_TENANT_PU);
380
        try {
381
            validateMafiaFamily707(em);
382
        } catch (RuntimeException e) {
383
            if (isTransactionActive(em)){
384
                rollbackTransaction(em);
385
            }
386
            throw e;
387
        } finally {
388
            closeEntityManager(em);
389
        }
390
    }
391
    
392
    public void testValidateMafiaFamily007() {
393
        EntityManager em = createEntityManager(MULTI_TENANT_PU);
394
        try {
395
            validateMafiaFamily007(em);
396
        } catch (RuntimeException e) {
397
            if (isTransactionActive(em)){
398
                rollbackTransaction(em);
399
            }
400
            throw e;
401
        } finally {
402
            closeEntityManager(em);
403
        }
404
    }
405
    
406
    public void testValidateMafiaFamily707and007WithSameEM() {
407
        EntityManager em = createEntityManager(MULTI_TENANT_PU);
408
        try {
409
            validateMafiaFamily707(em);
410
            validateMafiaFamily007(em);
411
        } catch (RuntimeException e) {
412
            if (isTransactionActive(em)){
413
                rollbackTransaction(em);
414
            }
415
            throw e;
416
        } finally {
417
            closeEntityManager(em);
418
        }
419
    }
420
    
421
    protected void validateMafiaFamily007(EntityManager em) {
422
        clearCache(MULTI_TENANT_PU);
423
        em.clear();
424
425
        beginTransaction(em);
426
427
        em.setProperty("tenant.id", "007");
428
        em.setProperty(EntityManagerProperties.MULTITENANT_PROPERTY_DEFAULT, "007");
429
        
430
        MafiaFamily family =  em.find(MafiaFamily.class, family007);
431
        assertNotNull("The Mafia Family with id: " + family007 + ", was not found", family);
432
        assertTrue("The Mafia Family had an incorrect number of tags [" + family.getTags().size() + "], expected [5]", family.getTags().size() == 5);
433
        assertNull("The Mafia Family with id: " + family707 + ", was found (when it should not have been)", em.find(MafiaFamily.class, family707));
434
        //for multipersistence units tests, we have seperate the test suite based on persistence unit, validateMafiaFamily007 is running ahead of testCreateMafiaFamily123
435
        //so family123 won't have value at this moment
436
        //assertNull("The Mafia Family with id: " + family123 + ", was found (when it should not have been)", em.find(MafiaFamily.class, family123));
437
438
        // following line will fail, Guy is investigating
439
        assertFalse("No mafiosos part of 007 family", family.getMafiosos().isEmpty());
440
        
441
        // See if we can find any members of the other family.
442
        for (Integer id : family707Mafiosos) {
443
            assertNull("Found family 707 mafioso.", em.find(Mafioso.class, id));
444
        }
445
        
446
        // Query directly for the boss from the other family.
447
        Boss otherBoss = em.find(Boss.class, family707Mafiosos.get(0));
448
        assertNull("Found family 707 boss.", otherBoss);
449
        
450
        // See if we can find any contracts of the other family.
451
        for (Integer id : family707Contracts) {
452
            assertNull("Found family 707 contract.", em.find(Contract.class, id));
453
        }
454
        
455
        // Read and validate our contracts
456
        List<Contract> contracts = em.createNamedQuery("FindAllContracts").getResultList();
457
        assertTrue("Incorrect number of contracts were returned [" + contracts.size() + "], expected[3]", contracts.size() == 3);
458
        
459
        for (Contract contract : contracts) {
460
            assertFalse("Contract description was voided.", contract.getDescription().equals("voided"));
461
        }
462
        
463
        // Try a select named query
464
        List families = em.createNamedQuery("findJPQLMafiaFamilies").getResultList();
465
        assertTrue("Incorrect number of families were returned [" + families.size() + "], expected [1]",  families.size() == 1);
466
        // Find our boss and make sure his name has not been compromised from the 707 family.
467
        Boss boss = em.find(Boss.class, family007Mafiosos.get(0));
468
        assertFalse("The Boss name has been compromised", boss.getFirstName().equals("Compromised"));
469
470
        commitTransaction(em);
471
    }
472
    
473
    protected void validateMafiaFamily707(EntityManager em) {
474
        clearCache(MULTI_TENANT_PU);
475
        em.clear();
476
477
        beginTransaction(em);
478
479
        em.setProperty("tenant.id", "707");
480
        em.setProperty(EntityManagerProperties.MULTITENANT_PROPERTY_DEFAULT, "707");
481
482
        MafiaFamily family = em.find(MafiaFamily.class, family707);
483
        assertNotNull("The Mafia Family with id: " + family707 + ", was not found", family);
484
        assertTrue("The Mafia Family had an incorrect number of tags [" + family.getTags().size() + "], expected [3]", family.getTags().size() == 3);
485
        assertNull("The Mafia Family with id: " + family007 + ", was found (when it should not have been)", em.find(MafiaFamily.class, family007));
486
        //for multipersistence units tests, we have seperate the test suite based on persistence unit, validateMafiaFamily007 is running ahead of testCreateMafiaFamily123
487
        //so family123 won't have value at this moment
488
        //assertNull("The Mafia Family with id: " + family123 + ", was found (when it should not have been)", em.find(MafiaFamily.class, family123));
489
        assertFalse("No mafiosos part of 707 family", family.getMafiosos().isEmpty());
490
        
491
        // See if we can find any members of the other family.
492
        for (Integer id : family007Mafiosos) {
493
            assertNull("Found family 007 mafioso.", em.find(Mafioso.class, id));
494
        }
495
496
        // Query directly for the boss from the other family.
497
        Boss otherBoss = em.find(Boss.class, family007Mafiosos.get(0));
498
        assertNull("Found family 007 boss.", otherBoss);
499
        // See if we can find any contracts of the other family.
500
        for (Integer id : family007Contracts) {
501
            assertNull("Found family 007 contract.", em.find(Contract.class, id));
502
        }
503
504
        // Update all our contract descriptions to be 'voided'
505
        getServerSession(MULTI_TENANT_PU).setLogLevel(0);
506
        em.createNamedQuery("UpdateAllContractDescriptions").executeUpdate();
507
        
508
        // Read and validate the contracts
509
        List<Contract> contracts = em.createNamedQuery("FindAllContracts").getResultList();
510
        
511
        assertTrue("Incorrect number of contracts were returned [" + contracts.size() + "], expected[3]", contracts.size() == 3);
512
513
        for (Contract contract : contracts) {
514
            assertTrue("Contract description was not voided.", contract.getDescription().equals("voided"));
515
        }
516
517
        // See how many soldiers are returned from a jpql query
518
        List soldiers = em.createQuery("SELECT s from Soldier s").getResultList();
519
520
        assertTrue("Incorrect number of soldiers were returned [" + soldiers.size() + "], expected [5]",  soldiers.size() == 5);
521
522
        // We know what the boss's id is for the 007 family to try to update him from the 707 pu.
523
        // The 007 family is validated after this test.
524
        Query query = em.createNamedQuery("UpdateBossName");
525
        query.setParameter("name", "Compromised");
526
        query.setParameter("id", family007Mafiosos.get(0));
527
        query.executeUpdate();
528
529
        commitTransaction(em);
530
    }
531
}

Return to bug 344757