Merge branch 'master' of ssh://git.eclipse.org/gitroot/eclipselink/examples
diff --git a/jpa/employee/employee.model/.project b/jpa/employee/employee.model/.project
index aa0e7e6..5a922d3 100644
--- a/jpa/employee/employee.model/.project
+++ b/jpa/employee/employee.model/.project
@@ -6,6 +6,11 @@
</projects>
<buildSpec>
<buildCommand>
+ <name>org.python.pydev.PyDevBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
@@ -32,5 +37,6 @@
<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>
+ <nature>org.python.pydev.pythonNature</nature>
</natures>
</projectDescription>
diff --git a/jpa/employee/employee.model/.pydevproject b/jpa/employee/employee.model/.pydevproject
new file mode 100644
index 0000000..40e9f40
--- /dev/null
+++ b/jpa/employee/employee.model/.pydevproject
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?eclipse-pydev version="1.0"?><pydev_project>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
+</pydev_project>
diff --git a/jpa/employee/employee.model/.settings/org.eclipse.core.resources.prefs b/jpa/employee/employee.model/.settings/org.eclipse.core.resources.prefs
index c015bf3..5de7f02 100644
--- a/jpa/employee/employee.model/.settings/org.eclipse.core.resources.prefs
+++ b/jpa/employee/employee.model/.settings/org.eclipse.core.resources.prefs
@@ -1,6 +1,6 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
-encoding//src/main/java/eclipselink/example/jpa/employee/services/EditEmployee.java=UTF-8
+encoding//src/main/java/eclipselink/example/jpa/employee/services/AdminBean.java=UTF-8
encoding//src/main/java/eclipselink/example/jpa/employee/services/EditEmployeeBean.java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/test/java=UTF-8
diff --git a/jpa/employee/employee.model/.settings/org.eclipse.wst.validation.prefs b/jpa/employee/employee.model/.settings/org.eclipse.wst.validation.prefs
new file mode 100644
index 0000000..f6a7fbd
--- /dev/null
+++ b/jpa/employee/employee.model/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,8 @@
+DELEGATES_PREFERENCE=delegateValidatorList
+USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
+USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
+USER_PREFERENCE=overrideGlobalPreferencesfalse
+eclipse.preferences.version=1
+override=false
+suspend=false
+vf.version=3
diff --git a/jpa/employee/employee.model/.settings/org.eclipse.wst.xml.core.prefs b/jpa/employee/employee.model/.settings/org.eclipse.wst.xml.core.prefs
new file mode 100644
index 0000000..b663641
--- /dev/null
+++ b/jpa/employee/employee.model/.settings/org.eclipse.wst.xml.core.prefs
@@ -0,0 +1,18 @@
+attributeHasNoValue=2
+eclipse.preferences.version=1
+endTagWithAttributes=2
+honourAllSchemaLocations=false
+indicateNoGrammar=-1
+indiciateNoDocumentElement=-1
+markupValidation=false
+missingClosingBracket=2
+missingClosingQuote=2
+missingEndTag=2
+missingQuotes=2
+missingStartTag=2
+missingTagName=2
+namespaceInPITarget=2
+use-project-settings=true
+whitespaceAtStart=2
+whitespaceBeforeTagName=2
+xinclude=false
diff --git a/jpa/employee/employee.model/.settings/org.eclipse.wst.xsl.core.prefs b/jpa/employee/employee.model/.settings/org.eclipse.wst.xsl.core.prefs
new file mode 100644
index 0000000..e28962c
--- /dev/null
+++ b/jpa/employee/employee.model/.settings/org.eclipse.wst.xsl.core.prefs
@@ -0,0 +1,11 @@
+CHECK_CALL_TEMPLATES=2
+CHECK_XPATHS=2
+CIRCULAR_REF=2
+DUPLICATE_PARAMETER=2
+EMPTY_PARAM=1
+MISSING_INCLUDE=2
+MISSING_PARAM=1
+NAME_ATTRIBUTE_EMPTY=2
+NAME_ATTRIBUTE_MISSING=2
+TEMPLATE_CONFLICT=2
+eclipse.preferences.version=1
diff --git a/jpa/employee/employee.model/README.md b/jpa/employee/employee.model/README.md
index 3b165aa..2a1ffd3 100644
--- a/jpa/employee/employee.model/README.md
+++ b/jpa/employee/employee.model/README.md
@@ -3,4 +3,7 @@
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
+[EclipseLink Wiki: Employee JPA Example][1]
+
+
+[1]: http://wiki.eclipse.org/EclipseLink/Examples/JPA/Employee
\ No newline at end of file
diff --git a/jpa/employee/employee.model/src/PessimisticLockTest.launch b/jpa/employee/employee.model/src/PessimisticLockTest.launch
index 4231fbb..ea1494d 100644
--- a/jpa/employee/employee.model/src/PessimisticLockTest.launch
+++ b/jpa/employee/employee.model/src/PessimisticLockTest.launch
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/employee.model/src/test/java/test/PessimisticLockTest.java"/>
+<listEntry value="/employee.model"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
+<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
diff --git a/jpa/employee/employee.model/src/eclipse/AdminBeanTest.launch b/jpa/employee/employee.model/src/eclipse/AdminBeanTest.launch
new file mode 100644
index 0000000..d1ba8ed
--- /dev/null
+++ b/jpa/employee/employee.model/src/eclipse/AdminBeanTest.launch
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/AdminBeanTest.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="eclipselink.example.jpa.employee.test.services.AdminBeanTest"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="employee.model"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-javaagent:${system_property:user.home}/.m2/repository/org/eclipse/persistence/eclipselink/2.4.2-SNAPSHOT/eclipselink-2.4.2-SNAPSHOT.jar"/>
+</launchConfiguration>
diff --git a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/AdminBean.java b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/AdminBean.java
new file mode 100644
index 0000000..f7d35c7
--- /dev/null
+++ b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/AdminBean.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * 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 - EclipseLink 2.3 - MySports Demo Bug 344608
+ ******************************************************************************/
+package eclipselink.example.jpa.employee.services;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.LocalBean;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceUnit;
+import javax.persistence.metamodel.EntityType;
+
+import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.internal.sessions.IdentityMapAccessor;
+import org.eclipse.persistence.sessions.server.Server;
+import org.eclipse.persistence.tools.schemaframework.SchemaManager;
+
+import eclipselink.example.jpa.employee.model.Employee;
+import eclipselink.example.jpa.employee.model.SamplePopulation;
+
+/**
+ * Edit service for an {@link Employee} instance.
+ *
+ * @author dclarke
+ * @since EclipseLink 2.4.2
+ */
+@Stateless
+@LocalBean
+public class AdminBean {
+
+ private EntityManagerFactory emf;
+
+ public EntityManagerFactory getEmf() {
+ return emf;
+ }
+
+ @PersistenceUnit(unitName = "employee")
+ public void setEmf(EntityManagerFactory emf) {
+ this.emf = emf;
+ }
+
+ public String resetDatabase() {
+ EntityManager em = getEmf().createEntityManager();
+
+ try {
+ SchemaManager sm = new SchemaManager(em.unwrap(Server.class));
+ sm.replaceDefaultTables();
+ sm.replaceSequences();
+
+ em.unwrap(Server.class).getIdentityMapAccessor().initializeAllIdentityMaps();
+ } finally {
+ em.close();
+ }
+ return null;
+ }
+
+ public String populateDatabase(int quantity) {
+ EntityManager em = getEmf().createEntityManager();
+
+ try {
+ new SamplePopulation().createNewEmployees(em, quantity);
+ } finally {
+ em.close();
+ }
+ return null;
+ }
+
+ public int getCacheSize(String typeName) {
+ EntityManager em = getEmf().createEntityManager();
+ Server session = em.unwrap(Server.class);
+ ClassDescriptor descriptor = session.getDescriptorForAlias(typeName);
+ if (descriptor != null) {
+ return ((IdentityMapAccessor) session.getIdentityMapAccessor()).getIdentityMap(descriptor.getJavaClass()).getSize();
+ } else {
+ return -1;
+ }
+ }
+
+ public int getDatabaseCount(String type) {
+ EntityManager em = getEmf().createEntityManager();
+
+ try {
+ return em.createQuery("SELECT COUNT(o) FROM " + type + " o", Number.class).getSingleResult().intValue();
+ } finally {
+ em.close();
+ }
+ }
+
+ /**
+ * Construct a list of valid type names based on the JAP metamodel. Only
+ * include types that are inheritance roots (no super type).
+ */
+ public List<String> getTypes() {
+ List<String> typeNames = new ArrayList<String>();
+ for (EntityType<?> type : getEmf().getMetamodel().getEntities()) {
+ if (type.getSupertype() == null) {
+ typeNames.add(type.getName());
+ }
+ }
+ return typeNames;
+ }
+
+}
diff --git a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/Diagnostics.java b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/Diagnostics.java
index 3652b3b..96b3dba 100644
--- a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/Diagnostics.java
+++ b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/Diagnostics.java
@@ -27,7 +27,9 @@
import org.eclipse.persistence.sessions.server.Server;
/**
- * TODO
+ * SessionLog proxy {@link InvocationHandler} used to intercept SQL logging
+ * messages so this sample application can display the SQL executed by the most
+ * recent operations.
*
* @author dclarke
* @since EclipseLink 2.4.2
@@ -46,10 +48,8 @@
private SessionLog log;
/**
- * TODO
- *
- * @param emf
- * @return
+ * Lookup the Diagnostics instance and registered as the SessionLog (proxy).
+ * If one does not exist then create one.
*/
public static Diagnostics getInstance(EntityManagerFactory emf) {
EntityManager em = emf.createEntityManager();
diff --git a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployee.java b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployee.java
deleted file mode 100644
index ccac3c8..0000000
--- a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployee.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package eclipselink.example.jpa.employee.services;
-
-import javax.ejb.Local;
-
-import eclipselink.example.jpa.employee.model.Employee;
-import eclipselink.example.jpa.employee.model.PhoneNumber;
-
-/**
- *
- * @author dclarke
- * @since EclipseLink 2.4.2
- */
-@Local
-public interface EditEmployee {
-
- public abstract Employee getEmployee();
-
- public abstract void setEmployee(Employee employee);
-
- public abstract boolean isNew();
-
- /**
- *
- * @return
- */
- public abstract void save();
-
- public abstract void delete();
-
- public abstract void refresh();
-
- /**
- * Force the optimistic version field to be updated so that the save
- * operations will fail.
- */
- public abstract int updateVersion();
-
- public abstract String removeAddress();
-
- public abstract String addAddress();
-
- public abstract PhoneNumber addPhone(String type);
-
- public abstract void remove(PhoneNumber phone);
-
- public abstract void close();
-
-}
\ No newline at end of file
diff --git a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployeeBean.java b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployeeBean.java
index 4b7399d..f630189 100644
--- a/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployeeBean.java
+++ b/jpa/employee/employee.model/src/main/java/eclipselink/example/jpa/employee/services/EditEmployeeBean.java
@@ -12,11 +12,12 @@
******************************************************************************/
package eclipselink.example.jpa.employee.services;
-import javax.ejb.Local;
+import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.LockModeType;
+import javax.persistence.PersistenceUnit;
import eclipselink.example.jpa.employee.model.Address;
import eclipselink.example.jpa.employee.model.Employee;
@@ -29,47 +30,37 @@
* @since EclipseLink 2.4.2
*/
@Stateless
-@Local(EditEmployee.class)
-public class EditEmployeeBean implements EditEmployee {
+@LocalBean
+public class EditEmployeeBean {
- private EntityManager entityManager;
+ private EntityManagerFactory emf;
private Employee employee;
+ private Diagnostics diagnostics;
+
public EditEmployeeBean() {
super();
}
- public EditEmployeeBean(EntityManagerFactory emf, Integer id) {
- this.entityManager = emf.createEntityManager();
- if (id != null) {
- setEmployee(getEntityManager().find(Employee.class, id));
- } else {
- this.employee = new Employee();
- }
+ public EntityManagerFactory getEmf() {
+ return emf;
}
- protected EntityManager getEntityManager() {
- return this.entityManager;
+ @PersistenceUnit(unitName = "employee")
+ public void setEmf(EntityManagerFactory emf) {
+ this.emf = emf;
+ this.diagnostics = Diagnostics.getInstance(emf);
}
- /*
- * (non-Javadoc)
- *
- * @see eclipselink.example.jpa.employee.services.EditEmployee#getEmployee()
- */
- @Override
+ public Diagnostics getDiagnostics() {
+ return diagnostics;
+ }
+
public Employee getEmployee() {
return employee;
}
- /*
- * (non-Javadoc)
- *
- * @see eclipselink.example.jpa.employee.services.EditEmployee#setEmployee(
- * eclipselink.example.jpa.employee.model.Employee)
- */
- @Override
public void setEmployee(Employee employee) {
this.employee = employee;
if (employee != null) {
@@ -78,108 +69,89 @@
}
}
- /*
- * (non-Javadoc)
- *
- * @see eclipselink.example.jpa.employee.services.EditEmployee#isNew()
- */
- @Override
+ public Employee setEmployee(int id) {
+ EntityManager em = getEmf().createEntityManager();
+
+ try {
+ this.employee = em.find(Employee.class, id);
+ return this.employee;
+ } finally {
+ em.close();
+ }
+ }
+
public boolean isNew() {
return getEmployee().getId() <= 0;
}
- /*
- * (non-Javadoc)
- *
- * @see eclipselink.example.jpa.employee.services.EditEmployee#save()
- */
- @Override
public void save() {
- getEntityManager().getTransaction().begin();
+ EntityManager em = getEmf().createEntityManager();
- // Ensure the Employee's lock value is incremented
- getEntityManager().lock(getEmployee(), LockModeType.OPTIMISTIC_FORCE_INCREMENT);
+ try {
+ this.employee = em.merge(getEmployee());
+ em.getTransaction().begin();
- getEntityManager().getTransaction().commit();
+ // Ensure the Employee's lock value is incremented
+ em.lock(getEmployee(), LockModeType.OPTIMISTIC_FORCE_INCREMENT);
+
+ em.getTransaction().commit();
+ } finally {
+ em.close();
+ }
}
- /*
- * (non-Javadoc)
- *
- * @see eclipselink.example.jpa.employee.services.EditEmployee#delete()
- */
- @Override
public void delete() {
+ EntityManager em = getEmf().createEntityManager();
+
try {
- getEntityManager().getTransaction().begin();
- getEntityManager().remove(getEmployee());
- getEntityManager().getTransaction().commit();
+ this.employee = em.merge(getEmployee());
+ em.getTransaction().begin();
+ em.remove(getEmployee());
+ em.getTransaction().commit();
} finally {
setEmployee(null);
}
}
- /*
- * (non-Javadoc)
- *
- * @see eclipselink.example.jpa.employee.services.EditEmployee#refresh()
- */
- @Override
public void refresh() {
- if (!getEntityManager().contains(getEmployee())) {
- setEmployee(getEntityManager().merge(getEmployee()));
+ EntityManager em = getEmf().createEntityManager();
+
+ try {
+ if (!em.contains(getEmployee())) {
+ setEmployee(em.merge(getEmployee()));
+ }
+ em.refresh(getEmployee());
+ } finally {
+ em.close();
}
- getEntityManager().refresh(getEmployee());
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eclipselink.example.jpa.employee.services.EditEmployee#updateVersion()
- */
- @Override
public int updateVersion() {
- getEntityManager().detach(getEmployee());
- getEntityManager().getTransaction().begin();
- getEntityManager().createNativeQuery("UPDATE EMPLOYEE SET VERSION = VERSION + 1 WHERE EMP_ID = " + getEmployee().getId()).executeUpdate();
- getEntityManager().getTransaction().commit();
- setEmployee(getEntityManager().merge(getEmployee()));
- Number result = (Number) getEntityManager().createNativeQuery("SELECT VERSION FROM EMPLOYEE WHERE EMP_ID = " + getEmployee().getId()).getSingleResult();
- return result.intValue();
+ EntityManager em = getEmf().createEntityManager();
+
+ try {
+ this.employee = em.merge(getEmployee());
+ em.getTransaction().begin();
+ em.createNativeQuery("UPDATE EMPLOYEE SET VERSION = VERSION + 1 WHERE EMP_ID = " + getEmployee().getId()).executeUpdate();
+ em.getTransaction().commit();
+ setEmployee(em.merge(getEmployee()));
+ Number result = (Number) em.createNativeQuery("SELECT VERSION FROM EMPLOYEE WHERE EMP_ID = " + getEmployee().getId()).getSingleResult();
+ return result.intValue();
+ } finally {
+ em.close();
+ }
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eclipselink.example.jpa.employee.services.EditEmployee#removeAddress()
- */
- @Override
public String removeAddress() {
getEmployee().setAddress(null);
return null;
}
- /*
- * (non-Javadoc)
- *
- * @see eclipselink.example.jpa.employee.services.EditEmployee#addAddress()
- */
- @Override
public String addAddress() {
getEmployee().setAddress(new Address());
return null;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eclipselink.example.jpa.employee.services.EditEmployee#addPhone(java.
- * lang.String)
- */
- @Override
public PhoneNumber addPhone(String type) {
if (type != null && !type.isEmpty()) {
return getEmployee().addPhoneNumber(type, "", "");
@@ -187,26 +159,8 @@
return null;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eclipselink.example.jpa.employee.services.EditEmployee#remove(eclipselink
- * .example.jpa.employee.model.PhoneNumber)
- */
- @Override
public void remove(PhoneNumber phone) {
getEmployee().removePhoneNumber(phone);
}
- /*
- * (non-Javadoc)
- *
- * @see eclipselink.example.jpa.employee.services.EditEmployee#close()
- */
- @Override
- public void close() {
- getEntityManager().close();
- }
-
}
diff --git a/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/AdminBeanTest.java b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/AdminBeanTest.java
new file mode 100644
index 0000000..a0f69fe
--- /dev/null
+++ b/jpa/employee/employee.model/src/test/java/eclipselink/example/jpa/employee/test/services/AdminBeanTest.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * 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 - initial
+ ******************************************************************************/
+package eclipselink.example.jpa.employee.test.services;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+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.SamplePopulation;
+import eclipselink.example.jpa.employee.services.Diagnostics;
+import eclipselink.example.jpa.employee.services.AdminBean;
+import eclipselink.example.jpa.employee.test.PersistenceTesting;
+
+public class AdminBeanTest {
+
+ private AdminBean admin;
+
+ public AdminBean getAdmin() {
+ return admin;
+ }
+
+ @Test
+ public void verifyReset() {
+ for (String type : getAdmin().getTypes()) {
+ Assert.assertEquals(0, admin.getCacheSize(type));
+ Assert.assertEquals(0, admin.getDatabaseCount(type));
+ }
+ }
+
+ @Test
+ public void popuate() {
+ verifyReset();
+
+ getAdmin().populateDatabase(20);
+
+ Assert.assertEquals(20, admin.getCacheSize("Employee"));
+ Assert.assertEquals(20, admin.getDatabaseCount("Employee"));
+
+ Assert.assertEquals(20, admin.getCacheSize("Address"));
+ Assert.assertEquals(20, admin.getDatabaseCount("Address"));
+
+ Assert.assertEquals(40, admin.getCacheSize("PhoneNumber"));
+ Assert.assertEquals(40, admin.getDatabaseCount("PhoneNumber"));
+
+ Assert.assertEquals(0, admin.getCacheSize("Project"));
+ Assert.assertEquals(0, admin.getDatabaseCount("Project"));
+ }
+
+ @Test
+ public void verifyTypeNames() {
+ List<String> types = getAdmin().getTypes();
+
+ Assert.assertNotNull(types);
+ Assert.assertEquals(4, types.size());
+
+ Assert.assertTrue(types.contains("Employee"));
+ Assert.assertTrue(types.contains("Address"));
+ Assert.assertTrue(types.contains("PhoneNumber"));
+ Assert.assertTrue(types.contains("Project"));
+ }
+
+ private static EntityManagerFactory emf;
+
+ public static EntityManagerFactory getEmf() {
+ return emf;
+ }
+
+ @Before
+ public void resetDatabase() {
+ this.admin = new AdminBean();
+ this.admin.setEmf(getEmf());
+ this.admin.resetDatabase();
+ }
+
+ @BeforeClass
+ public static void createEMF() {
+ emf = PersistenceTesting.createEMF(true);
+
+ EntityManager em = emf.createEntityManager();
+ new SamplePopulation().createNewEmployees(em, 25);
+ em.close();
+
+ Diagnostics.getInstance(emf);
+ 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/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 22f9265..a9284f4 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
@@ -23,8 +23,8 @@
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.EditEmployee;
import eclipselink.example.jpa.employee.services.EditEmployeeBean;
import eclipselink.example.jpa.employee.test.PersistenceTesting;
@@ -36,33 +36,35 @@
*/
public class EditEmployeeTest {
+ private EditEmployeeBean edit = new EditEmployeeBean();
+
+ @Before
+ public void setup() {
+ this.edit = new EditEmployeeBean();
+ this.edit.setEmf(getEmf());
+ }
+
@Test
public void saveWithoutChanges() {
- EditEmployee edit = new EditEmployeeBean(getEmf(), sampleId);
+ Employee emp = this.edit.setEmployee(sampleId);
+
+ Assert.assertNotNull(emp);
- try {
- edit.save();
- } finally {
- edit.close();
- }
+ edit.save();
}
@Test
public void incrementSalary() {
- EditEmployee edit = new EditEmployeeBean(getEmf(), sampleId);
+ edit.setEmployee(sampleId);
- try {
- edit.getEmployee().setSalary(edit.getEmployee().getSalary() + 1);
- edit.save();
- } finally {
- edit.close();
- }
+ edit.getEmployee().setSalary(edit.getEmployee().getSalary() + 1);
+ edit.save();
}
@Test
public void optimisticLockFailure() {
- EditEmployee edit = new EditEmployeeBean(getEmf(), sampleId);
-
+ edit.setEmployee(sampleId);
+
try {
edit.updateVersion();
edit.getEmployee().setSalary(edit.getEmployee().getSalary() + 1);
@@ -72,8 +74,6 @@
return;
}
throw e;
- } finally {
- edit.close();
}
Assert.fail("OptimisticLockException not thrown");
@@ -81,15 +81,11 @@
@Test
public void refreshUpdateAddress() {
- EditEmployee edit = new EditEmployeeBean(getEmf(), sampleId);
+ edit.setEmployee(sampleId);
- try {
- edit.refresh();
- edit.getEmployee().getAddress().setCity("Ottawa");
- edit.save();
- } finally {
- edit.close();
- }
+ edit.refresh();
+ edit.getEmployee().getAddress().setCity("Ottawa");
+ edit.save();
}
diff --git a/jpa/employee/employee.web/README.md b/jpa/employee/employee.web/README.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jpa/employee/employee.web/README.md
diff --git a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Admin.java b/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Admin.java
index 413d449..6267a30 100644
--- a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Admin.java
+++ b/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Admin.java
@@ -12,16 +12,13 @@
******************************************************************************/
package eclipselink.example.jpa.employee.web;
+import java.util.List;
+
+import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.PersistenceUnit;
-import org.eclipse.persistence.sessions.server.Server;
-import org.eclipse.persistence.tools.schemaframework.SchemaManager;
-
-import eclipselink.example.jpa.employee.model.SamplePopulation;
+import eclipselink.example.jpa.employee.services.AdminBean;
/**
* TODO
@@ -33,41 +30,58 @@
@RequestScoped
public class Admin {
- private EntityManagerFactory emf;
+ private AdminBean adminBean;
- public EntityManagerFactory getEmf() {
- return emf;
+ private List<String> typeNames;
+
+ private boolean displaySql = false;
+
+ public AdminBean getAdminBean() {
+ return adminBean;
}
- @PersistenceUnit(unitName = "employee")
- public void setEmf(EntityManagerFactory emf) {
- this.emf = emf;
+ @EJB
+ public void setAdminBean(AdminBean adminBean) {
+ this.adminBean = adminBean;
}
public String resetDatabase() {
- EntityManager em = getEmf().createEntityManager();
-
- try {
- SchemaManager sm = new SchemaManager(em.unwrap(Server.class));
- sm.replaceDefaultTables();
- sm.replaceSequences();
-
- em.unwrap(Server.class).getIdentityMapAccessor().initializeAllIdentityMaps();
- } finally {
- em.close();
- }
- return null;
+ return getAdminBean().resetDatabase();
}
public String populateDatabase() {
- EntityManager em = getEmf().createEntityManager();
+ return getAdminBean().populateDatabase(25);
+ }
- try {
- new SamplePopulation().createNewEmployees(em, 25);
- } finally {
- em.close();
+ public List<String> getTypeNames() {
+ if (this.typeNames == null) {
+ this.typeNames = getAdminBean().getTypes();
}
- return null;
+ return typeNames;
+ }
+
+ public boolean isDisplaySql() {
+ return displaySql;
+ }
+
+ public void setDisplaySql(boolean displaySql) {
+ this.displaySql = displaySql;
+ }
+
+ public void toggleSqlDisplay() {
+ this.displaySql = !this.displaySql;
+ }
+
+ public String getToggleSqlDisplayButton() {
+ return isDisplaySql() ? "Disable SQL Display" : "Enable SQL Display";
+ }
+
+ public String getCacheSize(String typeName) {
+ int size = getAdminBean().getCacheSize(typeName);
+ if (size < 0) {
+ return "Error";
+ }
+ return Integer.toString(size);
}
}
diff --git a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Config.java b/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Config.java
deleted file mode 100644
index b5b230a..0000000
--- a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/Config.java
+++ /dev/null
@@ -1,93 +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 - initial
- ******************************************************************************/
-package eclipselink.example.jpa.employee.web;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.faces.bean.ManagedBean;
-import javax.faces.bean.SessionScoped;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.PersistenceUnit;
-
-import org.eclipse.persistence.descriptors.ClassDescriptor;
-import org.eclipse.persistence.internal.sessions.IdentityMapAccessor;
-import org.eclipse.persistence.sessions.server.Server;
-
-/**
- * TODO
- *
- * @author dclarke
- * @since EclipseLink 2.4.2
- */
-@ManagedBean
-@SessionScoped
-public class Config {
-
- private List<String> typeNames;
-
- private boolean displaySql = false;
-
- public Config() {
- this.typeNames = new ArrayList<String>();
- this.typeNames.add("Employee");
- this.typeNames.add("Address");
- this.typeNames.add("PhoneNumber");
- this.typeNames.add("Project");
- }
-
- private EntityManagerFactory emf;
-
- public EntityManagerFactory getEmf() {
- return emf;
- }
-
- @PersistenceUnit(unitName = "employee")
- public void setEmf(EntityManagerFactory emf) {
- this.emf = emf;
- }
-
- public List<String> getTypeNames() {
- return typeNames;
- }
-
- public boolean isDisplaySql() {
- return displaySql;
- }
-
- public void setDisplaySql(boolean displaySql) {
- this.displaySql = displaySql;
- }
-
- public void toggleSqlDisplay() {
- this.displaySql = !this.displaySql;
- }
-
- public String getToggleSqlDisplayButton() {
- return isDisplaySql() ? "Disable SQL Display" : "Enable SQL Display";
- }
-
- public String getCacheSize(String typeName) {
- System.out.println("Config.getCacheSize('" + typeName + "')");
- EntityManager em = getEmf().createEntityManager();
- Server session = em.unwrap(Server.class);
- ClassDescriptor descriptor = session.getDescriptorForAlias(typeName);
- if (descriptor != null) {
- int size = ((IdentityMapAccessor) session.getIdentityMapAccessor()).getIdentityMap(descriptor.getJavaClass()).getSize();
- return Integer.toString(size);
- } else {
- return "N/A";
- }
- }
-}
diff --git a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/EditEmployeeView.java b/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/EditEmployeeView.java
index a41e814..e13deaf 100644
--- a/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/EditEmployeeView.java
+++ b/jpa/employee/employee.web/src/main/java/eclipselink/example/jpa/employee/web/EditEmployeeView.java
@@ -13,15 +13,13 @@
package eclipselink.example.jpa.employee.web;
import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
+import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
-import javax.persistence.EntityManagerFactory;
import javax.persistence.OptimisticLockException;
-import javax.persistence.PersistenceUnit;
import javax.persistence.RollbackException;
import org.eclipse.persistence.logging.SessionLogEntry;
@@ -31,7 +29,6 @@
import eclipselink.example.jpa.employee.model.PhoneNumber;
import eclipselink.example.jpa.employee.services.Diagnostics;
import eclipselink.example.jpa.employee.services.Diagnostics.SQLTrace;
-import eclipselink.example.jpa.employee.services.EditEmployee;
import eclipselink.example.jpa.employee.services.EditEmployeeBean;
/**
@@ -44,17 +41,13 @@
@ViewScoped
public class EditEmployeeView {
- private EditEmployee edit;
+ private EditEmployeeBean edit;
/**
* Value used to create new unique {@link PhoneNumber}
*/
private String type;
- private EntityManagerFactory emf;
-
- private Diagnostics diagnostics;
-
protected static final String PAGE = "/employee/edit";
protected static final String PAGE_REDIRECT = "/employee/edit?faces-redirect=true";
@@ -65,17 +58,22 @@
setEmployee(id);
}
- public EditEmployee getEdit() {
+ public EditEmployeeBean getEdit() {
return edit;
}
+ @EJB
+ public void setEdit(EditEmployeeBean edit) {
+ this.edit = edit;
+ }
+
public Employee getEmployee() {
return getEdit().getEmployee();
}
public void setEmployee(int id) {
getDiagnostics().start();
- this.edit = new EditEmployeeBean(getEmf(), id);
+ this.edit.setEmployee(id);
addMessages(getDiagnostics().stop());
}
@@ -98,18 +96,8 @@
return getEdit().isNew();
}
- @PersistenceUnit(unitName = "employee")
- public void setEmf(EntityManagerFactory emf) {
- this.emf = emf;
- this.diagnostics = Diagnostics.getInstance(emf);
- }
-
- public EntityManagerFactory getEmf() {
- return emf;
- }
-
public Diagnostics getDiagnostics() {
- return diagnostics;
+ return getEdit().getDiagnostics();
}
/**
@@ -189,11 +177,6 @@
return null;
}
- @PreDestroy
- public void destroy() {
- getEdit().close();
- }
-
/**
* Add each SQL string to the messages TODO: Allow this to be
* enabled/disabled
diff --git a/jpa/employee/employee.web/src/main/webapp/admin.xhtml b/jpa/employee/employee.web/src/main/webapp/admin.xhtml
index aff04c9..d4b226a 100644
--- a/jpa/employee/employee.web/src/main/webapp/admin.xhtml
+++ b/jpa/employee/employee.web/src/main/webapp/admin.xhtml
@@ -21,15 +21,15 @@
action="#{admin.populateDatabase}" class="menu-button"
style="width: 400" />
<p />
- <h:commandButton value="#{config.toggleSqlDisplayButton}"
- action="#{config.toggleSqlDisplay}" class="menu-button"
+ <h:commandButton value="#{admin.toggleSqlDisplayButton}"
+ action="#{admin.toggleSqlDisplay}" class="menu-button"
style="width: 400" />
<p />
</div>
</h:form>
<h2>Entity Status</h2>
<h:form>
- <h:dataTable var="type" value="#{config.typeNames}"
+ <h:dataTable var="type" value="#{admin.typeNames}"
class="table-design" width="500">
<h:column>
<f:facet name="header">Type</f:facet>
@@ -40,7 +40,7 @@
<div align="center">Cache Size</div>
</f:facet>
<div align="center">
- <h:outputLabel value="#{config.getCacheSize(type)}" />
+ <h:outputLabel value="#{admin.getCacheSize(type)}" />
</div>
</h:column>
</h:dataTable>
diff --git a/jpa/employee/pom.xml b/jpa/employee/pom.xml
index 1580b6d..557f286 100644
--- a/jpa/employee/pom.xml
+++ b/jpa/employee/pom.xml
@@ -49,15 +49,11 @@
</properties>
<repositories>
- <repository>
- <id>Java.Net</id>
- <url>http://download.java.net/maven/2/</url>
- </repository>
- <repository>
- <id>EclipseLink</id>
- <url>http://download.eclipse.org/rt/eclipselink/maven.repo</url>
- </repository>
- </repositories>
+ <repository>
+ <id>oss.sonatype.org</id>
+ <name>OSS Sonatype Staging</name>
+ <url>https://oss.sonatype.org/content/groups/staging</url>
+ </repository> </repositories>
<modules>
<module>employee.model</module>