diff --git a/jpa/employee.dynamic/README.md b/jpa/employee.dynamic/README.md
new file mode 100644
index 0000000..c039e28
--- /dev/null
+++ b/jpa/employee.dynamic/README.md
@@ -0,0 +1,4 @@
+EclipseLink Dynamic Example
+===========================
+
+This example illustrates the use of EclipseLink's dynamic JPA support with the Employee example model. This approach uses 
\ No newline at end of file
diff --git a/jpa/employee/README.md b/jpa/employee/README.md
index 69108e8..c25bf66 100644
--- a/jpa/employee/README.md
+++ b/jpa/employee/README.md
@@ -8,6 +8,8 @@
 employee.model
 --------------
 
+The employee model mapped using JPA annotations.
+
 employee.web
 ------------
 
@@ -16,9 +18,5 @@
 employee.web-js
 ---------------
 
-TODO
+This is a Thin Server Architecture version of the Employee web application leveraging EclipseLink JPA-RS on the server and a HTML5/JavaScript based client.
 
-employee.model-nosql
---------------------
-
-TODO
\ No newline at end of file
diff --git a/jpa/employee/employee.model-nosql/.project b/jpa/employee/employee.model-nosql/.project
deleted file mode 100644
index a66e384..0000000
--- a/jpa/employee/employee.model-nosql/.project
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>Employee Example - model NoSQL</name>
-	<comment>NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.wst.common.project.facet.core.builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.wst.validation.validationbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
-		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
-	</natures>
-</projectDescription>
diff --git a/jpa/employee/employee.model/README.md b/jpa/employee/employee.model/README.md
index 1fff78e..3b165aa 100644
--- a/jpa/employee/employee.model/README.md
+++ b/jpa/employee/employee.model/README.md
@@ -1,4 +1,6 @@
 EclipseLink Example
 ===================
 
-http://wiki.eclipse.org/EclipseLink/Examples
\ No newline at end of file
+Employee example model project illustrating an annotation mapped model. This project is leveraged by the employee.web and employee.web-js projects.
+
+http://wiki.eclipse.org/EclipseLink/Examples/JPA/Employee
\ No newline at end of file
diff --git a/jpa/employee/employee.model/src/config/weblogic/config.properties b/jpa/employee/employee.model/src/config/weblogic/config.properties
new file mode 100644
index 0000000..b90e907
--- /dev/null
+++ b/jpa/employee/employee.model/src/config/weblogic/config.properties
@@ -0,0 +1,17 @@
+# WebLogic 12.1.2
+domain.name=7001_Domain
+admin.url=t3://localhost:7001
+admin.userName=weblogic
+admin.password=Password1
+
+# Data source to be used by example
+datasource.name=EmployeeDS
+datasource.jndiname=java:global/employeeDS
+datasource.database.name=employee
+datasource.target=AdminServer
+datasource.driver.class=com.mysql.jdbc.Driver
+datasource.url=jdbc:mysql://localhost:3306/employee
+datasource.username=root
+datasource.password=password
+datasource.test.query=SQL SELECT * FROM DUAL
+
diff --git a/jpa/employee/employee.model/src/config/weblogic/createDataSource.py b/jpa/employee/employee.model/src/config/weblogic/createDataSource.py
new file mode 100644
index 0000000..70cec07
--- /dev/null
+++ b/jpa/employee/employee.model/src/config/weblogic/createDataSource.py
@@ -0,0 +1,71 @@
+from java.io import FileInputStream
+
+propInputStream = FileInputStream("config.properties")
+configProps = Properties()
+configProps.load(propInputStream)
+
+domainName=configProps.get("domain.name")
+adminURL=configProps.get("admin.url")
+adminUserName=configProps.get("admin.userName")
+adminPassword=configProps.get("admin.password")
+
+dsName=configProps.get("datasource.name")
+dsDatabaseName=configProps.get("datasource.database.name")
+datasourceTarget=configProps.get("datasource.target")
+dsJNDIName=configProps.get("datasource.jndiname")
+dsDriverName=configProps.get("datasource.driver.class")
+dsURL=configProps.get("datasource.url")
+dsUserName=configProps.get("datasource.username")
+dsPassword=configProps.get("datasource.password")
+dsTestQuery=configProps.get("datasource.test.query")
+
+connect(adminUserName, adminPassword, adminURL)
+edit()
+startEdit()
+cd('/')
+
+### Checking for the server
+try: 
+    cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName)
+    print '===> /JDBCSystemResources/' +dsName+'/JDBCResource/ already exists'
+    print '===> No action was performed'
+    cancelEdit('y')
+    exit()
+except:
+    pass
+
+cd('/')
+cmo.createJDBCSystemResource(dsName)
+cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName)
+cmo.setName(dsName)
+
+cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDataSourceParams/' + dsName )
+set('JNDINames',jarray.array([String( dsJNDIName )], String))
+
+cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDriverParams/' + dsName )
+cmo.setUrl(dsURL)
+cmo.setDriverName( dsDriverName )
+cmo.setPassword(dsPassword)
+
+cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCConnectionPoolParams/' + dsName )
+cmo.setTestTableName(dsTestQuery)
+cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDriverParams/' + dsName + '/Properties/' + dsName )
+cmo.createProperty('user')
+
+cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDriverParams/' + dsName + '/Properties/' + dsName + '/Properties/user')
+cmo.setValue(dsUserName)
+
+cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDriverParams/' + dsName + '/Properties/' + dsName )
+cmo.createProperty('databaseName')
+
+cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDriverParams/' + dsName + '/Properties/' + dsName + '/Properties/databaseName')
+cmo.setValue(dsDatabaseName)
+
+cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDataSourceParams/' + dsName )
+cmo.setGlobalTransactionsProtocol('OnePhaseCommit')
+
+cd('/SystemResources/' + dsName )
+set('Targets',jarray.array([ObjectName('com.bea:Name=' + datasourceTarget + ',Type=Server')], ObjectName))
+
+save()
+activate()
\ No newline at end of file
diff --git a/jpa/employee/employee.model/src/config/weblogic/createDataSource.sh b/jpa/employee/employee.model/src/config/weblogic/createDataSource.sh
new file mode 100755
index 0000000..4650f31
--- /dev/null
+++ b/jpa/employee/employee.model/src/config/weblogic/createDataSource.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+if [ $# -eq 0 ] 
+	then
+    echo "No arguments supplied: Must provide directory where WLS 12.1.2 is installed"
+    echo " USAGE: ./createDataSource.sh ~/java/wls_1212"
+    exit
+fi
+
+pushd $1/wlserver/server/bin
+
+. ./setWLSEnv.sh
+
+popd
+
+java weblogic.WLST createDataSource.py
diff --git a/jpa/employee/employee.model/src/CascadeMergeTest.launch b/jpa/employee/employee.model/src/eclipse/CascadeMergeTest.launch
similarity index 100%
rename from jpa/employee/employee.model/src/CascadeMergeTest.launch
rename to jpa/employee/employee.model/src/eclipse/CascadeMergeTest.launch
diff --git a/jpa/employee/employee.model/src/ConfigTest.launch b/jpa/employee/employee.model/src/eclipse/ConfigTest.launch
similarity index 100%
rename from jpa/employee/employee.model/src/ConfigTest.launch
rename to jpa/employee/employee.model/src/eclipse/ConfigTest.launch
diff --git a/jpa/employee/employee.model/src/DiagnosticsTest.launch b/jpa/employee/employee.model/src/eclipse/DiagnosticsTest.launch
similarity index 100%
rename from jpa/employee/employee.model/src/DiagnosticsTest.launch
rename to jpa/employee/employee.model/src/eclipse/DiagnosticsTest.launch
diff --git a/jpa/employee/employee.model/src/EditEmployeeTest.launch b/jpa/employee/employee.model/src/eclipse/EditEmployeeTest.launch
similarity index 100%
rename from jpa/employee/employee.model/src/EditEmployeeTest.launch
rename to jpa/employee/employee.model/src/eclipse/EditEmployeeTest.launch
diff --git a/jpa/employee/employee.model/src/JavaSEExample.launch b/jpa/employee/employee.model/src/eclipse/JavaSEExample.launch
similarity index 100%
rename from jpa/employee/employee.model/src/JavaSEExample.launch
rename to jpa/employee/employee.model/src/eclipse/JavaSEExample.launch
diff --git a/jpa/employee/employee.model/src/JavaSEExampleTest.launch b/jpa/employee/employee.model/src/eclipse/JavaSEExampleTest.launch
similarity index 100%
rename from jpa/employee/employee.model/src/JavaSEExampleTest.launch
rename to jpa/employee/employee.model/src/eclipse/JavaSEExampleTest.launch
diff --git a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/model/SamplePopulation.java b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/model/SamplePopulation.java
index 9749ea6..66a982f 100644
--- a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/model/SamplePopulation.java
+++ b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/model/SamplePopulation.java
@@ -20,7 +20,7 @@
  * Examples illustrating the use of JPA with the employee domain
  * eclipselink.example.jpa.employee.model.
  * 
- * @see test.JavaSEExampleTest
+ * @see eclipselink.example.jpa.employee.test.model.JavaSEExampleTest
  * 
  * @author dclarke
  * @since EclipseLink 2.4
diff --git a/jpa/employee/employee.model/src/test/java/example/PersistenceTesting.java b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/PersistenceTesting.java
similarity index 97%
rename from jpa/employee/employee.model/src/test/java/example/PersistenceTesting.java
rename to jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/PersistenceTesting.java
index e2185fe..303eded 100644
--- a/jpa/employee/employee.model/src/test/java/example/PersistenceTesting.java
+++ b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/PersistenceTesting.java
@@ -10,7 +10,7 @@
  * Contributors:
  *  dclarke - Employee Demo 2.4.2
  ******************************************************************************/
-package example;
+package eclipselink.example.jpa.employee.test;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/jpa/employee/employee.model/src/test/java/test/ConfigTest.java b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/model/ConfigTest.java
similarity index 91%
rename from jpa/employee/employee.model/src/test/java/test/ConfigTest.java
rename to jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/model/ConfigTest.java
index b6de111..19412d2 100644
--- a/jpa/employee/employee.model/src/test/java/test/ConfigTest.java
+++ b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/model/ConfigTest.java
@@ -10,7 +10,7 @@
  * Contributors:
  *  dclarke - Employee Demo 2.4
  ******************************************************************************/
-package test;
+package eclipselink.example.jpa.employee.test.model;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
@@ -19,7 +19,7 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import example.PersistenceTesting;
+import eclipselink.example.jpa.employee.test.PersistenceTesting;
 
 public class ConfigTest {
 
diff --git a/jpa/employee/employee.model/src/test/java/test/JavaSEExampleTest.java b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/model/JavaSEExampleTest.java
similarity index 93%
rename from jpa/employee/employee.model/src/test/java/test/JavaSEExampleTest.java
rename to jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/model/JavaSEExampleTest.java
index 6a2f003..e355ef1 100644
--- a/jpa/employee/employee.model/src/test/java/test/JavaSEExampleTest.java
+++ b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/model/JavaSEExampleTest.java
@@ -10,7 +10,7 @@
  * Contributors:
  *  dclarke - Employee Demo 2.4
  ******************************************************************************/
-package test;
+package eclipselink.example.jpa.employee.test.model;
 
 import org.junit.Test;
 
diff --git a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/DiagnosticsTest.java b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/DiagnosticsTest.java
index 04487b4..1e01073 100644
--- a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/DiagnosticsTest.java
+++ b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/DiagnosticsTest.java
@@ -28,7 +28,7 @@
 import eclipselink.example.jpa.employee.model.SamplePopulation;
 import eclipselink.example.jpa.employee.services.Diagnostics;
 import eclipselink.example.jpa.employee.services.Diagnostics.SQLTrace;
-import example.PersistenceTesting;
+import eclipselink.example.jpa.employee.test.PersistenceTesting;
 
 public class DiagnosticsTest {
 
diff --git a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/EditEmployeeTest.java b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/EditEmployeeTest.java
index 2b60e5e..22f9265 100644
--- a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/EditEmployeeTest.java
+++ b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/EditEmployeeTest.java
@@ -26,7 +26,7 @@
 import eclipselink.example.jpa.employee.model.SamplePopulation;
 import eclipselink.example.jpa.employee.services.EditEmployee;
 import eclipselink.example.jpa.employee.services.EditEmployeeBean;
-import example.PersistenceTesting;
+import eclipselink.example.jpa.employee.test.PersistenceTesting;
 
 /**
  * TODO
diff --git a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/PageEmployeesTest.java b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/PageEmployeesTest.java
index 05a40e2..d308860 100644
--- a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/PageEmployeesTest.java
+++ b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/PageEmployeesTest.java
@@ -28,7 +28,7 @@
 import eclipselink.example.jpa.employee.services.Diagnostics.SQLTrace;
 import eclipselink.example.jpa.employee.services.EmployeeCriteria;
 import eclipselink.example.jpa.employee.services.EntityPaging;
-import example.PersistenceTesting;
+import eclipselink.example.jpa.employee.test.PersistenceTesting;
 
 /**
  * TODO
diff --git a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/PageIdsInEmployeesTest.java b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/PageIdsInEmployeesTest.java
index 955b398..5f7a6a5 100644
--- a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/PageIdsInEmployeesTest.java
+++ b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/PageIdsInEmployeesTest.java
@@ -28,7 +28,7 @@
 import eclipselink.example.jpa.employee.services.Diagnostics.SQLTrace;
 import eclipselink.example.jpa.employee.services.EmployeeCriteria;
 import eclipselink.example.jpa.employee.services.EntityPaging;
-import example.PersistenceTesting;
+import eclipselink.example.jpa.employee.test.PersistenceTesting;
 
 /**
  * TODO
diff --git a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/StreamEmployeesTest.java b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/StreamEmployeesTest.java
index 20bbeff..51ad195 100644
--- a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/StreamEmployeesTest.java
+++ b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/StreamEmployeesTest.java
@@ -29,7 +29,7 @@
 import eclipselink.example.jpa.employee.services.Diagnostics.SQLTrace;
 import eclipselink.example.jpa.employee.services.EmployeeCriteria;
 import eclipselink.example.jpa.employee.services.EntityPaging;
-import example.PersistenceTesting;
+import eclipselink.example.jpa.employee.test.PersistenceTesting;
 
 /**
  * TODO
diff --git a/jpa/employee/employee.model/src/test/java/example/JavaSEExample.java b/jpa/employee/employee.model/src/test/java/example/JavaSEExample.java
index 6491076..b715358 100644
--- a/jpa/employee/employee.model/src/test/java/example/JavaSEExample.java
+++ b/jpa/employee/employee.model/src/test/java/example/JavaSEExample.java
@@ -22,12 +22,13 @@
 import eclipselink.example.jpa.employee.model.SamplePopulation;
 import eclipselink.example.jpa.employee.services.EmployeeCriteria;
 import eclipselink.example.jpa.employee.services.EntityPaging;
+import eclipselink.example.jpa.employee.test.PersistenceTesting;
 
 /**
  * Examples illustrating the use of JPA with the employee domain
  * eclipselink.example.jpa.employee.model.
  * 
- * @see test.JavaSEExampleTest
+ * @see eclipselink.example.jpa.employee.test.model.JavaSEExampleTest
  * 
  * @author dclarke
  * @since EclipseLink 2.4
diff --git a/jpa/employee/employee.model/src/test/java/test/CascadeMergeTest.java b/jpa/employee/employee.model/src/test/java/test/CascadeMergeTest.java
deleted file mode 100644
index a0ee9f1..0000000
--- a/jpa/employee/employee.model/src/test/java/test/CascadeMergeTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010-2013 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the 
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
- * which accompanies this distribution. 
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at 
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *  dclarke - Employee Demo 2.4
- ******************************************************************************/
-package test;
-
-import java.util.List;
-
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.TypedQuery;
-
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import eclipselink.example.jpa.employee.model.Employee;
-import eclipselink.example.jpa.employee.model.SamplePopulation;
-import eclipselink.example.jpa.employee.services.Diagnostics;
-import eclipselink.example.jpa.employee.services.Diagnostics.SQLTrace;
-import example.PersistenceTesting;
-
-public class CascadeMergeTest {
-
-    @Test
-    public void test() {
-        EntityManager em = getEmf().createEntityManager();
-
-        TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e WHERE e.address IS NOT NULL", Employee.class);
-
-        List<Employee> emps = query.getResultList();
-
-        Employee emp = emps.get(0);
-
-        Assert.assertNotNull(emp);
-        Assert.assertNotNull(emp.getAddress());
-
-        em.detach(emp);
-        
-        em.close();
-
-        em = getEmf().createEntityManager();
-        emp.getAddress().setCity(emp.getAddress().getCity() + "+");
-
-        em.getTransaction().begin();
-        em.merge(emp);
-        
-        getDiagnostics().start();
-        em.flush();
-        SQLTrace trace = getDiagnostics().stop();
-        
-        Assert.assertEquals(1, trace.getEntries().size());
-        Assert.assertTrue(trace.getEntries().get(0).getMessage().startsWith("UPDATE ADDRESS"));
-        
-        em.getTransaction().rollback();
-        em.close();
-    }
-
-    private static EntityManagerFactory emf;
-
-    private static Diagnostics diagnostics;
-    
-    public static EntityManagerFactory getEmf() {
-        return emf;
-    }
-
-    public static Diagnostics getDiagnostics() {
-        return diagnostics;
-    }
-
-    @BeforeClass
-    public static void createEMF() {
-        emf = PersistenceTesting.createEMF(true);
-        diagnostics = Diagnostics.getInstance(emf);
-        
-        EntityManager em = emf.createEntityManager();
-        new SamplePopulation().createNewEmployees(em, 1);
-
-        Number count = em.createNamedQuery("Employee.count", Number.class).getSingleResult();
-        Assert.assertEquals(1, count.intValue());
-
-        em.close();
-
-        emf.getCache().evictAll();
-    }
-
-    @AfterClass
-    public static void closeEMF() {
-        if (emf != null && emf.isOpen()) {
-            emf.close();
-        }
-        emf = null;
-    }
-
-}
diff --git a/jpa/employee/employee.model/src/test/java/test/PessimisticLockTest.java b/jpa/employee/employee.model/src/test/java/test/PessimisticLockTest.java
deleted file mode 100644
index 1762946..0000000
--- a/jpa/employee/employee.model/src/test/java/test/PessimisticLockTest.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010-2013 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the 
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
- * which accompanies this distribution. 
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at 
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *  dclarke - Employee Demo 2.4
- ******************************************************************************/
-package test;
-
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.LockModeType;
-
-import org.eclipse.persistence.descriptors.ClassDescriptor;
-import org.eclipse.persistence.jpa.JpaHelper;
-import org.eclipse.persistence.queries.ReadObjectQuery;
-import org.eclipse.persistence.queries.ReportQuery;
-import org.eclipse.persistence.sessions.UnitOfWork;
-import org.eclipse.persistence.sessions.server.ClientSession;
-import org.eclipse.persistence.sessions.server.Server;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import eclipselink.example.jpa.employee.model.Address;
-import eclipselink.example.jpa.employee.model.SamplePopulation;
-import eclipselink.example.jpa.employee.services.Diagnostics;
-import example.PersistenceTesting;
-
-/**
- * Simple test case illustrating pessimistic lock usage.
- * 
- * @author dclarke
- * @since EclispeLink 2.4.2
- */
-public class PessimisticLockTest {
-
-    @Test
-    public void test() {
-        EntityManager em = getEmf().createEntityManager();
-
-        int id = em.createQuery("SELECT a.id FROM Address a", Number.class).getSingleResult().intValue();
-
-        em.getTransaction().begin();
-
-        Address addr = em.find(Address.class, id, LockModeType.PESSIMISTIC_WRITE);
-
-        Assert.assertNotNull(addr);
-        Assert.assertNull(addr.getCity());
-        Assert.assertEquals(em.getLockMode(addr), LockModeType.PESSIMISTIC_WRITE);
-
-        addr.setCity("Ottawa");
-
-        Assert.assertNotNull(addr.getCity());
-
-        em.lock(addr, LockModeType.PESSIMISTIC_WRITE);
-
-        Assert.assertEquals(em.getLockMode(addr), LockModeType.PESSIMISTIC_WRITE);
-        Assert.assertNotNull(addr.getCity());
-
-        em.getTransaction().rollback();
-
-        em.close();
-    }
-
-    @Test
-    public void testRefreshIfNewerTXN() {
-        EntityManager em = getEmf().createEntityManager();
-
-        int id = em.createQuery("SELECT a.id FROM Address a", Number.class).getSingleResult().intValue();
-
-        em.getTransaction().begin();
-
-        Address addr = em.find(Address.class, id);
-
-        Assert.assertNotNull(addr);
-        Assert.assertNull(addr.getCity());
-
-        addr.setCity("Ottawa");
-
-        Assert.assertNotNull(addr.getCity());
-
-        em.refresh(addr);
-
-        Assert.assertNotNull(addr.getCity());
-
-        em.getTransaction().rollback();
-
-        em.close();
-    }
-
-    @Test
-    public void testRefreshIfNewer() {
-        EntityManager em = getEmf().createEntityManager();
-
-        int id = em.createQuery("SELECT a.id FROM Address a", Number.class).getSingleResult().intValue();
-
-        Address addr = em.find(Address.class, id);
-
-        Assert.assertNotNull(addr);
-        Assert.assertNull(addr.getCity());
-
-        addr.setCity("Ottawa");
-
-        Assert.assertNotNull(addr.getCity());
-
-        em.refresh(addr);
-
-        Assert.assertNotNull(addr.getCity());
-
-        em.close();
-    }
-
-    @Test
-    public void testRefreshIfNewerNativeServer() {
-        Server session = JpaHelper.getServerSession(getEmf());
-
-        ReportQuery idQuery = new ReportQuery();
-        idQuery.setReferenceClass(Address.class);
-        idQuery.addAttribute("id");
-        idQuery.setShouldReturnSingleAttribute(true);
-        idQuery.setShouldReturnSingleValue(true);
-
-        int id = ((Number) session.executeQuery(idQuery)).intValue();
-
-        ReadObjectQuery addrQuery = new ReadObjectQuery();
-        addrQuery.setReferenceClass(Address.class);
-        addrQuery.setSelectionCriteria(addrQuery.getExpressionBuilder().get("id").equal(id));
-
-        Address addr = (Address) session.executeQuery(addrQuery);
-
-        Assert.assertNotNull(addr);
-        Assert.assertNull(addr.getCity());
-
-        addr.setCity("Ottawa");
-
-        Assert.assertNotNull(addr.getCity());
-
-        session.refreshObject(addr);
-
-        Assert.assertNotNull(addr.getCity());
-
-    }
-
-    @Test
-    public void testRefreshIfNewerNativeClientSession() {
-        Server session = JpaHelper.getServerSession(getEmf());
-        ClientSession cs = session.acquireClientSession();
-
-        ReportQuery idQuery = new ReportQuery();
-        idQuery.setReferenceClass(Address.class);
-        idQuery.addAttribute("id");
-        idQuery.setShouldReturnSingleAttribute(true);
-        idQuery.setShouldReturnSingleValue(true);
-
-        int id = ((Number) cs.executeQuery(idQuery)).intValue();
-
-        ReadObjectQuery addrQuery = new ReadObjectQuery();
-        addrQuery.setReferenceClass(Address.class);
-        addrQuery.setSelectionCriteria(addrQuery.getExpressionBuilder().get("id").equal(id));
-
-        Address addr = (Address) cs.executeQuery(addrQuery);
-
-        Assert.assertNotNull(addr);
-        Assert.assertNull(addr.getCity());
-
-        addr.setCity("Ottawa");
-
-        Assert.assertNotNull(addr.getCity());
-
-        cs.refreshObject(addr);
-
-        Assert.assertNotNull(addr.getCity());
-
-    }
-
-    @Test
-    public void testRefreshIfNewerNativeUOW() {
-        Server session = JpaHelper.getServerSession(getEmf());
-        UnitOfWork uow = session.acquireUnitOfWork();
-
-        ReportQuery idQuery = new ReportQuery();
-        idQuery.setReferenceClass(Address.class);
-        idQuery.addAttribute("id");
-        idQuery.setShouldReturnSingleAttribute(true);
-        idQuery.setShouldReturnSingleValue(true);
-
-        int id = ((Number) uow.executeQuery(idQuery)).intValue();
-
-        ReadObjectQuery addrQuery = new ReadObjectQuery();
-        addrQuery.setReferenceClass(Address.class);
-        addrQuery.setSelectionCriteria(addrQuery.getExpressionBuilder().get("id").equal(id));
-
-        Address addr = (Address) uow.executeQuery(addrQuery);
-
-        Assert.assertNotNull(addr);
-        Assert.assertNull(addr.getCity());
-
-        addr.setCity("Ottawa");
-
-        Assert.assertNotNull(addr.getCity());
-
-        uow.refreshObject(addr);
-
-        Assert.assertNotNull(addr.getCity());
-
-    }
-
-    @Test
-    public void verifyConfig() {
-        ClassDescriptor desc = JpaHelper.getServerSession(getEmf()).getClassDescriptorForAlias("Address");
-        Assert.assertNotNull(desc);
-
-        Assert.assertTrue(desc.getCachePolicy().shouldOnlyRefreshCacheIfNewerVersion());
-    }
-
-    private static EntityManagerFactory emf;
-
-    private static Diagnostics diagnostics;
-
-    public static EntityManagerFactory getEmf() {
-        return emf;
-    }
-
-    public static Diagnostics getDiagnostics() {
-        return diagnostics;
-    }
-
-    @BeforeClass
-    public static void createEMF() {
-        emf = PersistenceTesting.createEMF(true);
-        diagnostics = Diagnostics.getInstance(emf);
-
-        EntityManager em = emf.createEntityManager();
-        new SamplePopulation().createNewEmployees(em, 1);
-
-        Number count = em.createNamedQuery("Employee.count", Number.class).getSingleResult();
-        Assert.assertEquals(1, count.intValue());
-
-        em.close();
-
-        emf.getCache().evictAll();
-    }
-
-    @AfterClass
-    public static void closeEMF() {
-        if (emf != null && emf.isOpen()) {
-            emf.close();
-        }
-        emf = null;
-    }
-
-    @Before
-    public void clearCache() {
-        JpaHelper.getServerSession(getEmf()).getIdentityMapAccessor().initializeAllIdentityMaps();
-    }
-}
