Merge branch 'master' of ssh://git.eclipse.org/gitroot/eclipselink/examples
diff --git a/jpa/employee/employee.dynamic/.classpath b/jpa/employee.dynamic/.classpath
similarity index 100%
rename from jpa/employee/employee.dynamic/.classpath
rename to jpa/employee.dynamic/.classpath
diff --git a/jpa/employee/employee.dynamic/.project b/jpa/employee.dynamic/.project
similarity index 100%
rename from jpa/employee/employee.dynamic/.project
rename to jpa/employee.dynamic/.project
diff --git a/jpa/employee/employee.dynamic/.settings/org.eclipse.core.resources.prefs b/jpa/employee.dynamic/.settings/org.eclipse.core.resources.prefs
similarity index 100%
rename from jpa/employee/employee.dynamic/.settings/org.eclipse.core.resources.prefs
rename to jpa/employee.dynamic/.settings/org.eclipse.core.resources.prefs
diff --git a/jpa/employee/employee.dynamic/.settings/org.eclipse.jdt.core.prefs b/jpa/employee.dynamic/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from jpa/employee/employee.dynamic/.settings/org.eclipse.jdt.core.prefs
rename to jpa/employee.dynamic/.settings/org.eclipse.jdt.core.prefs
diff --git a/jpa/employee/employee.dynamic/.settings/org.eclipse.jpt.core.prefs b/jpa/employee.dynamic/.settings/org.eclipse.jpt.core.prefs
similarity index 100%
rename from jpa/employee/employee.dynamic/.settings/org.eclipse.jpt.core.prefs
rename to jpa/employee.dynamic/.settings/org.eclipse.jpt.core.prefs
diff --git a/jpa/employee/employee.dynamic/.settings/org.eclipse.m2e.core.prefs b/jpa/employee.dynamic/.settings/org.eclipse.m2e.core.prefs
similarity index 100%
rename from jpa/employee/employee.dynamic/.settings/org.eclipse.m2e.core.prefs
rename to jpa/employee.dynamic/.settings/org.eclipse.m2e.core.prefs
diff --git a/jpa/employee/employee.dynamic/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/jpa/employee.dynamic/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
similarity index 100%
rename from jpa/employee/employee.dynamic/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
rename to jpa/employee.dynamic/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
diff --git a/jpa/employee/employee.dynamic/.settings/org.eclipse.wst.common.project.facet.core.xml b/jpa/employee.dynamic/.settings/org.eclipse.wst.common.project.facet.core.xml
similarity index 100%
rename from jpa/employee/employee.dynamic/.settings/org.eclipse.wst.common.project.facet.core.xml
rename to jpa/employee.dynamic/.settings/org.eclipse.wst.common.project.facet.core.xml
diff --git a/jpa/employee/employee.dynamic/pom.xml b/jpa/employee.dynamic/pom.xml
similarity index 100%
rename from jpa/employee/employee.dynamic/pom.xml
rename to jpa/employee.dynamic/pom.xml
diff --git a/jpa/employee/employee.dynamic/src/main/java/org/eclipse/persistence/dynamic/ReflectiveDynamicClassLoader.java b/jpa/employee.dynamic/src/main/java/org/eclipse/persistence/dynamic/ReflectiveDynamicClassLoader.java
similarity index 100%
rename from jpa/employee/employee.dynamic/src/main/java/org/eclipse/persistence/dynamic/ReflectiveDynamicClassLoader.java
rename to jpa/employee.dynamic/src/main/java/org/eclipse/persistence/dynamic/ReflectiveDynamicClassLoader.java
diff --git a/jpa/employee/employee.dynamic/src/main/resources/META-INF/employee-constraints.xml b/jpa/employee.dynamic/src/main/resources/META-INF/employee-constraints.xml
similarity index 100%
rename from jpa/employee/employee.dynamic/src/main/resources/META-INF/employee-constraints.xml
rename to jpa/employee.dynamic/src/main/resources/META-INF/employee-constraints.xml
diff --git a/jpa/employee/employee.dynamic/src/main/resources/META-INF/employee-orm.xml b/jpa/employee.dynamic/src/main/resources/META-INF/employee-orm.xml
similarity index 100%
rename from jpa/employee/employee.dynamic/src/main/resources/META-INF/employee-orm.xml
rename to jpa/employee.dynamic/src/main/resources/META-INF/employee-orm.xml
diff --git a/jpa/employee/employee.dynamic/src/main/resources/META-INF/persistence.xml b/jpa/employee.dynamic/src/main/resources/META-INF/persistence.xml
similarity index 100%
rename from jpa/employee/employee.dynamic/src/main/resources/META-INF/persistence.xml
rename to jpa/employee.dynamic/src/main/resources/META-INF/persistence.xml
diff --git a/jpa/employee/employee.dynamic/src/main/resources/META-INF/validation.xml b/jpa/employee.dynamic/src/main/resources/META-INF/validation.xml
similarity index 100%
rename from jpa/employee/employee.dynamic/src/main/resources/META-INF/validation.xml
rename to jpa/employee.dynamic/src/main/resources/META-INF/validation.xml
diff --git a/jpa/employee/employee.dynamic/src/test/java/example/EmployeeDynamicMappings.java b/jpa/employee.dynamic/src/test/java/example/EmployeeDynamicMappings.java
similarity index 100%
rename from jpa/employee/employee.dynamic/src/test/java/example/EmployeeDynamicMappings.java
rename to jpa/employee.dynamic/src/test/java/example/EmployeeDynamicMappings.java
diff --git a/jpa/employee/employee.dynamic/src/test/java/example/PersistenceHelper.java b/jpa/employee.dynamic/src/test/java/example/PersistenceHelper.java
similarity index 100%
rename from jpa/employee/employee.dynamic/src/test/java/example/PersistenceHelper.java
rename to jpa/employee.dynamic/src/test/java/example/PersistenceHelper.java
diff --git a/jpa/employee/employee.dynamic/src/test/java/example/Queries.java b/jpa/employee.dynamic/src/test/java/example/Queries.java
similarity index 100%
rename from jpa/employee/employee.dynamic/src/test/java/example/Queries.java
rename to jpa/employee.dynamic/src/test/java/example/Queries.java
diff --git a/jpa/employee/employee.dynamic/src/test/java/example/Samples.java b/jpa/employee.dynamic/src/test/java/example/Samples.java
similarity index 100%
rename from jpa/employee/employee.dynamic/src/test/java/example/Samples.java
rename to jpa/employee.dynamic/src/test/java/example/Samples.java
diff --git a/jpa/employee/employee.dynamic/src/test/java/example/Transactions.java b/jpa/employee.dynamic/src/test/java/example/Transactions.java
similarity index 100%
rename from jpa/employee/employee.dynamic/src/test/java/example/Transactions.java
rename to jpa/employee.dynamic/src/test/java/example/Transactions.java
diff --git a/jpa/employee/employee.dynamic/src/test/java/tests/TestDynamicUsingAPI.java b/jpa/employee.dynamic/src/test/java/tests/TestDynamicUsingAPI.java
similarity index 100%
rename from jpa/employee/employee.dynamic/src/test/java/tests/TestDynamicUsingAPI.java
rename to jpa/employee.dynamic/src/test/java/tests/TestDynamicUsingAPI.java
diff --git a/jpa/employee/employee.dynamic/src/test/java/tests/TestDynamicUsingXML.java b/jpa/employee.dynamic/src/test/java/tests/TestDynamicUsingXML.java
similarity index 100%
rename from jpa/employee/employee.dynamic/src/test/java/tests/TestDynamicUsingXML.java
rename to jpa/employee.dynamic/src/test/java/tests/TestDynamicUsingXML.java
diff --git a/jpa/employee/employee.model-nosql/.gitignore b/jpa/employee/employee.model-nosql/.gitignore
deleted file mode 100644
index 5e56e04..0000000
--- a/jpa/employee/employee.model-nosql/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin
diff --git a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/model/Address.java b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/model/Address.java
index 91daa13..c88c514 100644
--- a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/model/Address.java
+++ b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/model/Address.java
@@ -13,12 +13,20 @@
  ******************************************************************************/
 package eclipselink.example.jpa.employee.model;
 
-import javax.persistence.*;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Version;
 
-import org.eclipse.persistence.annotations.FetchGroup;
+import org.eclipse.persistence.annotations.Cache;
 
-@FetchGroup(name="1", attributes={})
 @Entity
+@Cache(refreshOnlyIfNewer=true)
 public class Address {
     @Id
     @Column(name = "ADDRESS_ID")
@@ -42,6 +50,9 @@
     
     @Basic
     private String street;
+    
+    @Version
+    private long version;
 
     public Address() {
     }
@@ -102,4 +113,12 @@
     public void setStreet(String street) {
         this.street = street;
     }
+
+    public long getVersion() {
+        return version;
+    }
+
+    public void setVersion(long version) {
+        this.version = version;
+    }
 }
diff --git a/jpa/employee/employee.model/src/main/java/resources/application.properties b/jpa/employee/employee.model/src/main/java/resources/application.properties
deleted file mode 100644
index 66eed33..0000000
--- a/jpa/employee/employee.model/src/main/java/resources/application.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-# -- welcome --
-welcomeTitle=JSF Blank Application
-
-welcomeHeading=Welcome!
-
-welcomeMessage=This is a JSF blank application. \
-	You can find the application.properties file with this message in the src/resources folder.
diff --git a/jpa/employee/employee.model/src/test/java/test/PessimisticLockTest.java b/jpa/employee/employee.model/src/test/java/test/PessimisticLockTest.java
index 7bbeeb2..1762946 100644
--- a/jpa/employee/employee.model/src/test/java/test/PessimisticLockTest.java
+++ b/jpa/employee/employee.model/src/test/java/test/PessimisticLockTest.java
@@ -16,8 +16,16 @@
 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;
 
@@ -47,13 +55,13 @@
         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());
 
@@ -62,6 +70,157 @@
         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;
@@ -98,4 +257,8 @@
         emf = null;
     }
 
+    @Before
+    public void clearCache() {
+        JpaHelper.getServerSession(getEmf()).getIdentityMapAccessor().initializeAllIdentityMaps();
+    }
 }
diff --git a/jpa/employee/wls-example.war b/jpa/employee/wls-example.war
deleted file mode 100644
index c5d2ee5..0000000
--- a/jpa/employee/wls-example.war
+++ /dev/null
Binary files differ