Bug #464790 - Update former org.eclipse.persistence.example.jpa.server.cachecoordination example with JGroups and add to examples
Signed-off-by: Petros Splinakis <petros.splinakis@oracle.com>
Reviewed-by: Martin Grebac <martin.grebac@oracle.com>
diff --git a/jpa/cachecoordination/.classpath b/jpa/cachecoordination/.classpath
new file mode 100755
index 0000000..907a117
--- /dev/null
+++ b/jpa/cachecoordination/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/EclipseLink 1.2"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Oracle JDBC"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/EJB"/>
+ <classpathentry kind="output" path="classes"/>
+</classpath>
diff --git a/jpa/cachecoordination/.project b/jpa/cachecoordination/.project
new file mode 100755
index 0000000..77fbdde
--- /dev/null
+++ b/jpa/cachecoordination/.project
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.persistence.example.jpa.server.cachecoordination</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.validation.validationbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+ <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+ </natures>
+</projectDescription>
diff --git a/jpa/cachecoordination/.settings/com.bea.workshop.common.upgrade.log.xml b/jpa/cachecoordination/.settings/com.bea.workshop.common.upgrade.log.xml
new file mode 100755
index 0000000..36b9b74
--- /dev/null
+++ b/jpa/cachecoordination/.settings/com.bea.workshop.common.upgrade.log.xml
@@ -0,0 +1,8 @@
+<upgrade-log>
+ <entry time="2008-12-01 17:06:43 UTC">
+ <upgrade-participant pluginId="com.bea.workshop.common.wtp.core" pluginVersion="2.1.0.20080808135653" class="com.bea.workshop.common.wtp.core.upgrade.internal.WtpComponentFileUpgradeParticipant"/>
+ </entry>
+ <entry time="2009-02-12 07:58:46 UTC">
+ <upgrade-participant pluginId="com.bea.workshop.common.wtp.core" pluginVersion="2.1.0.20080808135653" class="com.bea.workshop.common.wtp.core.upgrade.internal.WtpComponentFileUpgradeParticipant"/>
+ </entry>
+</upgrade-log>
diff --git a/jpa/cachecoordination/.settings/org.eclipse.jdt.core.prefs b/jpa/cachecoordination/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..598ee66
--- /dev/null
+++ b/jpa/cachecoordination/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,65 @@
+#Mon Dec 01 11:47:05 EST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jpa/cachecoordination/.settings/org.eclipse.jpt.core.prefs b/jpa/cachecoordination/.settings/org.eclipse.jpt.core.prefs
new file mode 100755
index 0000000..7a9ecac
--- /dev/null
+++ b/jpa/cachecoordination/.settings/org.eclipse.jpt.core.prefs
@@ -0,0 +1,4 @@
+#Thu Nov 26 14:30:03 EST 2009
+eclipse.preferences.version=1
+org.eclipse.jpt.core.discoverAnnotatedClasses=false
+org.eclipse.jpt.core.platform=eclipselink1_1
diff --git a/jpa/cachecoordination/.settings/org.eclipse.wst.common.component b/jpa/cachecoordination/.settings/org.eclipse.wst.common.component
new file mode 100755
index 0000000..0ef2f97
--- /dev/null
+++ b/jpa/cachecoordination/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-modules id="moduleCoreId" project-version="1.5.0">
+ <wb-module deploy-name="org.eclipse.persistence.example.jpa.20.employee.annotations">
+ <wb-resource deploy-path="/" source-path="/src"/>
+ </wb-module>
+</project-modules>
diff --git a/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
new file mode 100755
index 0000000..62ac925
--- /dev/null
+++ b/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
@@ -0,0 +1,7 @@
+<root>
+ <facet id="jpt.jpa">
+ <node name="libprov">
+ <attribute name="provider-id" value="jpa-eclipselink1_1-user-library-provider"/>
+ </node>
+ </facet>
+</root>
diff --git a/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.xml b/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100755
index 0000000..e4cea7d
--- /dev/null
+++ b/jpa/cachecoordination/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <fixed facet="jpt.jpa"/>
+ <fixed facet="jst.java"/>
+ <fixed facet="jst.utility"/>
+ <installed facet="jst.java" version="5.0"/>
+ <installed facet="jst.utility" version="1.0"/>
+ <installed facet="jpt.jpa" version="1.0"/>
+</faceted-project>
diff --git a/jpa/cachecoordination/build-wls-cluster.xml b/jpa/cachecoordination/build-wls-cluster.xml
new file mode 100755
index 0000000..9109639
--- /dev/null
+++ b/jpa/cachecoordination/build-wls-cluster.xml
@@ -0,0 +1,370 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This build file configures and runs the example on a WebLogic Cluster. -->
+<project basedir="." default="build" name="org.eclipse.persistence.example.jpa.server.cachecoordination">
+ <property environment="env"/>
+ <property name="JEE_HOME" value="/scratch/wls/12.1.3"/>
+ <property name="WEBLOGIC_HOME" value="${JEE_HOME}/wlserver"/>
+ <property name="JEE_SERVER" value="${WEBLOGIC_HOME}/server"/>
+ <!-- localhost may not work, machine name/ip my be required. -->
+ <property name="JEE_HOST" value="localhost"/>
+ <!-- These ports are also in the Transaction.java and persistence.xml files. -->
+ <property name="JEE_PORT1" value="7021"/>
+ <property name="JEE_PORT2" value="7031"/>
+ <property name="JEE_PORT3" value="7041"/>
+ <property name="JEE_DOMAIN" value="./domain"/>
+ <!-- These also need to be defined in the jndi.properties file. -->
+ <property name="JEE_USER" value="weblogic"/>
+ <property name="JEE_PASSWORD" value="welcome1"/>
+ <!-- These need to be updated with your database settings. -->
+ <property name="DB_DRIVER" value="oracle.jdbc.OracleDriver"/>
+ <property name="DB_URL" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
+ <property name="DB_USER" value="scott"/>
+ <property name="DB_PASSWORD" value="tiger"/>
+ <!-- These will differ depending on the version of WebLogic. -->
+ <property name="JPA_LIB" value="${JEE_HOME}/oracle_common/modules/javax.persistence_2.2.0.0_1-0-2.jar"/>
+ <property name="EJB_LIB" value="${JEE_HOME}/oracle_common/modules/javax.ejb_3.3.0.jar"/>
+ <property name="ECLIPSELINK_LIB" value="${JEE_HOME}/oracle_common/modules/oracle.toplink_12.1.3/eclipselink.jar"/>
+ <property name="debuglevel" value="source,lines,vars"/>
+ <path id="example.classpath">
+ <pathelement location="classes"/>
+ <pathelement location="${JPA_LIB}"/>
+ <pathelement location="${EJB_LIB}"/>
+ <pathelement location="${ECLIPSELINK_LIB}"/>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </path>
+ <target name="init" depends="clean">
+ <mkdir dir="classes"/>
+ </target>
+ <target name="clean">
+ <delete dir="classes"/>
+ </target>
+
+ <target depends="init" name="build">
+ <echo message="${ant.project.name}: ${ant.file}"/>
+ <javac debug="true" debuglevel="${debuglevel}" destdir="classes">
+ <src path="src"/>
+ <exclude name="**/.svn/**"/>
+ <classpath refid="example.classpath"/>
+ </javac>
+ <copy todir="classes/META-INF">
+ <fileset dir="src/META-INF" includes="*"/>
+ </copy>
+ <copy todir="classes/">
+ <fileset dir="./" includes="jndi.properties"/>
+ </copy>
+ <jar jarfile="employee.jar">
+ <fileset dir="classes" includes="**"/>
+ </jar>
+ <ear destfile="employee.ear" appxml="src/META-INF/application.xml">
+ <fileset dir="." includes ="employee.jar"/>
+ </ear>
+ </target>
+
+ <!-- WebLogic ant tasks -->
+ <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+ <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+ <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+
+ <!-- This creates the server domain. -->
+ <target name="create-cluster">
+ <delete dir="${JEE_DOMAIN}"/>
+ <mkdir dir="${JEE_DOMAIN}"/>
+ <wlserver fork="true" spawn="true" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" servername="admin" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ </wlserver>
+ <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+ <create type="Cluster" name="employee-cluster"/>
+ <query domain="mydomain" type="Cluster" name="employee-cluster" property="cluster"/>
+ <create type="Server" name="server1">
+ <set attribute="ListenPort" value="${JEE_PORT1}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ <create type="Server" name="server2">
+ <set attribute="ListenPort" value="${JEE_PORT2}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ <create type="Server" name="server3">
+ <set attribute="ListenPort" value="${JEE_PORT3}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ </wlconfig>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ </target>
+
+ <!--
+ This target is to create connection pool and managed datasource required for running this JPA example.
+ Note: WLS server must be running.
+ -->
+ <target name="setup-cluster">
+ <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+ <query domain="mydomain" type="JDBCConnectionPool" name="employeePool">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JDBCTxDataSource" name="EmployeeDS">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JDBCDataSource" name="EmployeeLocalDS">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSTopic" name="EmployeeTopic">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="Cluster" name="*" property="cluster"/>
+ <query domain="mydomain" type="Server" name="server1" property="server1"/>
+ <create type="JDBCConnectionPool" name="employeePool">
+ <set attribute="CapacityIncrement" value="2"/>
+ <set attribute="DriverName" value="${DB_DRIVER}"/>
+ <set attribute="InitialCapacity" value="1"/>
+ <set attribute="MaxCapacity" value="50"/>
+ <set attribute="Password" value="${DB_PASSWORD}"/>
+ <set attribute="Properties" value="user=${DB_USER}"/>
+ <set attribute="URL" value="${DB_URL}"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JDBCTxDataSource" name="EmployeeDS">
+ <set attribute="JNDIName" value="jdbc/EmployeeDS"/>
+ <set attribute="PoolName" value="employeePool"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JDBCDataSource" name="EmployeeLocalDS">
+ <set attribute="JNDIName" value="jdbc/EmployeeLocalDS"/>
+ <set attribute="PoolName" value="employeePool"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+
+ <create type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+ <set attribute="JNDIName" value="jms/EmployeeTopicConnectionFactory"/>
+ <set attribute="XAServerEnabled" value="false"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JMSServer" name="EmployeeJMSServer">
+ <set attribute="Targets" value="${server1}"/>
+ <create type="JMSTopic" name="EmployeeTopic">
+ <set attribute="JNDIName" value="jms/EmployeeTopic"/>
+ </create>
+ </create>
+
+ </wlconfig>
+ </target>
+
+ <!-- This start the servers. -->
+ <target name="start-cluster">
+ <!--wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver>
+ <sleep seconds="30"/>
+ <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver>
+ <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver-->
+ <!-- There is probably a more eligent way to start the cluster, but for now this works -->
+ <!-- Where as using wlserver above did not seem to -->
+ <delete>
+ <fileset dir="./" includes="server*.log,server*.err"/>
+ </delete>
+ <parallel>
+ <echo message="*** starting WebLogic admin server"/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="admin"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="admin.log"/>
+ <sysproperty key="weblogic.Stderr" value="admin.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <sequential>
+ <waitfor>
+ <socket server="${JEE_HOST}" port="7001"/>
+ </waitfor>
+ <parallel>
+ <echo message="*** starting managed server: server1 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server1"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server1.log"/>
+ <sysproperty key="weblogic.Stderr" value="server1.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <echo message="*** starting managed server: server2 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server2"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server2.log"/>
+ <sysproperty key="weblogic.Stderr" value="server2.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <echo message="*** starting managed server: server3 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server3"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server3.log"/>
+ <sysproperty key="weblogic.Stderr" value="server3.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <sequential>
+ <waitfor>
+ <and>
+ <socket server="${JEE_HOST}" port="${JEE_PORT1}"/>
+ <socket server="${JEE_HOST}" port="${JEE_PORT2}"/>
+ <socket server="${JEE_HOST}" port="${JEE_PORT3}"/>
+ </and>
+ </waitfor>
+ <sleep seconds="30"/>
+ <echo message="*** done, do not close/break prompt "/>
+ </sequential>
+ </parallel>
+ </sequential>
+ </parallel>
+ </target>
+
+ <!-- Stop the servers. -->
+ <target name="stop-cluster">
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ </target>
+
+ <!--
+ Deploy the application ear to the servers.
+ Note: WLS server must be running.
+ -->
+ <target name="deploy">
+ <wldeploy action="deploy"
+ name="employee" source="employee.ear"
+ user="${JEE_USER}" password="${JEE_PASSWORD}"
+ adminurl="t3://${JEE_HOST}:7001"
+ failonerror="false" targets="employee-cluster">
+ </wldeploy>
+ </target>
+
+ <target name="example">
+ <java classname="example.Transactions" fork="true">
+ <!--jvmarg value="${AGENT}"/-->
+ <classpath refid="example.classpath"/>
+ </java>
+ </target>
+</project>
+
diff --git a/jpa/cachecoordination/build-wls-jgroups-cluster.xml b/jpa/cachecoordination/build-wls-jgroups-cluster.xml
new file mode 100755
index 0000000..3b2f2d9
--- /dev/null
+++ b/jpa/cachecoordination/build-wls-jgroups-cluster.xml
@@ -0,0 +1,376 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This build file configures and runs the example on a WebLogic Cluster using JGroups for cache coordination. -->
+<project basedir="." default="build" name="org.eclipse.persistence.example.jpa.server.cachecoordination">
+ <property environment="env"/>
+ <property name="JEE_HOME" value="/path/to/wls/12.1.3"/>
+ <property name="WEBLOGIC_HOME" value="${JEE_HOME}/wlserver"/>
+ <property name="JEE_SERVER" value="${WEBLOGIC_HOME}/server"/>
+ <!-- localhost may not work, machine name/ip my be required. -->
+ <property name="JEE_HOST" value="localhost"/>
+ <!-- These ports are also in the Transaction.java and persistence.xml files. -->
+ <property name="JEE_PORT1" value="7021"/>
+ <property name="JEE_PORT2" value="7031"/>
+ <property name="JEE_PORT3" value="7041"/>
+ <property name="JEE_DOMAIN" value="./domain"/>
+ <!-- These also need to be defined in the jndi.properties file. -->
+ <property name="JEE_USER" value="weblogic"/>
+ <property name="JEE_PASSWORD" value="welcome1"/>
+ <!-- These need to be updated with your database settings. -->
+ <property name="DB_DRIVER" value="oracle.jdbc.OracleDriver"/>
+ <property name="DB_URL" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
+ <property name="DB_USER" value="scott"/>
+ <property name="DB_PASSWORD" value="tiger"/>
+ <!-- These will differ depending on the version of WebLogic. -->
+ <property name="JPA_LIB" value="${JEE_HOME}/oracle_common/modules/javax.persistence_2.2.0.0_1-0-2.jar"/>
+ <property name="EJB_LIB" value="${JEE_HOME}/oracle_common/modules/javax.ejb_3.3.0.jar"/>
+ <property name="ECLIPSELINK_LIB" value="${JEE_HOME}/oracle_common/modules/oracle.toplink_12.1.3/eclipselink.jar"/>
+ <property name="ECLIPSELINK_EXTENSION_LIB" value="/path/to/org.eclipse.persistence.extension_2.7.0.qualifier.jar"/>
+ <property name="JGROUPS_LIB" value="/path/to/jgroups.jar"/>
+ <property name="debuglevel" value="source,lines,vars"/>
+ <path id="example.classpath">
+ <pathelement location="classes"/>
+ <pathelement location="${JPA_LIB}"/>
+ <pathelement location="${EJB_LIB}"/>
+ <pathelement location="${JGROUPS_LIB}"/>
+ <pathelement location="${ECLIPSELINK_LIB}"/>
+ <pathelement location="${ECLIPSELINK_EXTENSION_LIB}"/>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </path>
+ <target name="init" depends="clean">
+ <mkdir dir="classes"/>
+ </target>
+ <target name="clean">
+ <delete dir="classes"/>
+ </target>
+
+ <target depends="init" name="build">
+ <echo message="${ant.project.name}: ${ant.file}"/>
+ <javac debug="true" debuglevel="${debuglevel}" destdir="classes">
+ <src path="src"/>
+ <exclude name="**/.svn/**"/>
+ <classpath refid="example.classpath"/>
+ </javac>
+ <copy todir="classes/META-INF">
+ <fileset dir="src/META-INF" includes="*"/>
+ </copy>
+ <copy todir="classes/">
+ <fileset dir="./" includes="jndi.properties"/>
+ </copy>
+ <jar jarfile="employee.jar">
+ <fileset dir="classes" includes="**"/>
+ </jar>
+ <ear destfile="employee.ear" appxml="src/META-INF/application.xml">
+ <fileset dir="." includes ="employee.jar"/>
+ </ear>
+ </target>
+
+ <!-- WebLogic ant tasks -->
+ <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+ <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+ <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+
+ <!-- This creates the server domain. -->
+ <target name="create-cluster">
+ <delete dir="${JEE_DOMAIN}"/>
+ <mkdir dir="${JEE_DOMAIN}"/>
+ <wlserver fork="true" spawn="true" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" servername="admin" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ </wlserver>
+ <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+ <create type="Cluster" name="employee-cluster"/>
+ <query domain="mydomain" type="Cluster" name="employee-cluster" property="cluster"/>
+ <create type="Server" name="server1">
+ <set attribute="ListenPort" value="${JEE_PORT1}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ <create type="Server" name="server2">
+ <set attribute="ListenPort" value="${JEE_PORT2}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ <create type="Server" name="server3">
+ <set attribute="ListenPort" value="${JEE_PORT3}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ </wlconfig>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <copy todir="${JEE_DOMAIN}/lib/" file="${JGROUPS_LIB}"/>
+ <copy todir="${JEE_DOMAIN}/lib/" file="${ECLIPSELINK_EXTENSION_LIB}"/>
+ </target>
+
+ <!--
+ This target is to create connection pool and managed datasource required for running this JPA example.
+ Note: WLS server must be running.
+ -->
+ <target name="setup-cluster">
+ <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+ <query domain="mydomain" type="JDBCConnectionPool" name="employeePool">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JDBCTxDataSource" name="EmployeeDS">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JDBCDataSource" name="EmployeeLocalDS">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSTopic" name="EmployeeTopic">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="Cluster" name="*" property="cluster"/>
+ <query domain="mydomain" type="Server" name="server1" property="server1"/>
+ <create type="JDBCConnectionPool" name="employeePool">
+ <set attribute="CapacityIncrement" value="2"/>
+ <set attribute="DriverName" value="${DB_DRIVER}"/>
+ <set attribute="InitialCapacity" value="1"/>
+ <set attribute="MaxCapacity" value="50"/>
+ <set attribute="Password" value="${DB_PASSWORD}"/>
+ <set attribute="Properties" value="user=${DB_USER}"/>
+ <set attribute="URL" value="${DB_URL}"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JDBCTxDataSource" name="EmployeeDS">
+ <set attribute="JNDIName" value="jdbc/EmployeeDS"/>
+ <set attribute="PoolName" value="employeePool"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JDBCDataSource" name="EmployeeLocalDS">
+ <set attribute="JNDIName" value="jdbc/EmployeeLocalDS"/>
+ <set attribute="PoolName" value="employeePool"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+
+ <create type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+ <set attribute="JNDIName" value="jms/EmployeeTopicConnectionFactory"/>
+ <set attribute="XAServerEnabled" value="false"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JMSServer" name="EmployeeJMSServer">
+ <set attribute="Targets" value="${server1}"/>
+ <create type="JMSTopic" name="EmployeeTopic">
+ <set attribute="JNDIName" value="jms/EmployeeTopic"/>
+ </create>
+ </create>
+
+ </wlconfig>
+ </target>
+
+ <!-- This start the servers. -->
+ <target name="start-cluster">
+ <!--wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver>
+ <sleep seconds="30"/>
+ <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver>
+ <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver-->
+ <!-- There is probably a more eligent way to start the cluster, but for now this works -->
+ <!-- Where as using wlserver above did not seem to -->
+ <delete>
+ <fileset dir="./" includes="server*.log,server*.err"/>
+ </delete>
+ <parallel>
+ <echo message="*** starting WebLogic admin server"/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="admin"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="admin.log"/>
+ <sysproperty key="weblogic.Stderr" value="admin.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <sequential>
+ <waitfor>
+ <socket server="${JEE_HOST}" port="7001"/>
+ </waitfor>
+ <parallel>
+ <echo message="*** starting managed server: server1 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server1"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server1.log"/>
+ <sysproperty key="weblogic.Stderr" value="server1.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <echo message="*** starting managed server: server2 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server2"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server2.log"/>
+ <sysproperty key="weblogic.Stderr" value="server2.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <echo message="*** starting managed server: server3 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server3"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server3.log"/>
+ <sysproperty key="weblogic.Stderr" value="server3.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <sequential>
+ <waitfor>
+ <and>
+ <socket server="${JEE_HOST}" port="${JEE_PORT1}"/>
+ <socket server="${JEE_HOST}" port="${JEE_PORT2}"/>
+ <socket server="${JEE_HOST}" port="${JEE_PORT3}"/>
+ </and>
+ </waitfor>
+ <sleep seconds="30"/>
+ <echo message="*** done, do not close/break prompt "/>
+ </sequential>
+ </parallel>
+ </sequential>
+ </parallel>
+ </target>
+
+ <!-- Stop the servers. -->
+ <target name="stop-cluster">
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ </target>
+
+ <!--
+ Deploy the application ear to the servers.
+ Note: WLS server must be running.
+ -->
+ <target name="deploy">
+ <wldeploy action="deploy"
+ name="employee" source="employee.ear"
+ user="${JEE_USER}" password="${JEE_PASSWORD}"
+ adminurl="t3://${JEE_HOST}:7001"
+ failonerror="false" targets="employee-cluster">
+ </wldeploy>
+ </target>
+
+ <target name="example">
+ <java classname="example.Transactions" fork="true">
+ <!--jvmarg value="${AGENT}"/-->
+ <classpath refid="example.classpath"/>
+ </java>
+ </target>
+</project>
+
diff --git a/jpa/cachecoordination/build-wls-jms-cluster.xml b/jpa/cachecoordination/build-wls-jms-cluster.xml
new file mode 100755
index 0000000..b53c82c
--- /dev/null
+++ b/jpa/cachecoordination/build-wls-jms-cluster.xml
@@ -0,0 +1,387 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This build file configures and runs the example on a WebLogic Cluster using a clustered JMS topic. -->
+<project basedir="." default="build" name="org.eclipse.persistence.example.jpa.server.cachecoordination">
+ <property environment="env"/>
+ <property name="JEE_HOME" value="/scratch/wls/12.1.3"/>
+ <property name="WEBLOGIC_HOME" value="${JEE_HOME}/wlserver"/>
+ <property name="JEE_SERVER" value="${WEBLOGIC_HOME}/server"/>
+ <!-- localhost may not work, machine name/ip my be required. -->
+ <property name="JEE_HOST" value="localhost"/>
+ <!-- These ports are also in the Transaction.java and persistence.xml files. -->
+ <property name="JEE_PORT1" value="7021"/>
+ <property name="JEE_PORT2" value="7031"/>
+ <property name="JEE_PORT3" value="7041"/>
+ <property name="JEE_DOMAIN" value="./domain"/>
+ <!-- These also need to be defined in the jndi.properties file. -->
+ <property name="JEE_USER" value="weblogic"/>
+ <property name="JEE_PASSWORD" value="welcome1"/>
+ <!-- These need to be updated with your database settings. -->
+ <property name="DB_DRIVER" value="oracle.jdbc.OracleDriver"/>
+ <property name="DB_URL" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
+ <property name="DB_USER" value="scott"/>
+ <property name="DB_PASSWORD" value="tiger"/>
+ <!-- These will differ depending on the version of WebLogic. -->
+ <property name="JPA_LIB" value="${JEE_HOME}/oracle_common/modules/javax.persistence_2.2.0.0_1-0-2.jar"/>
+ <property name="EJB_LIB" value="${JEE_HOME}/oracle_common/modules/javax.ejb_3.3.0.jar"/>
+ <property name="ECLIPSELINK_LIB" value="${JEE_HOME}/oracle_common/modules/oracle.toplink_12.1.3/eclipselink.jar"/>
+ <property name="debuglevel" value="source,lines,vars"/>
+ <path id="example.classpath">
+ <pathelement location="classes"/>
+ <pathelement location="${JPA_LIB}"/>
+ <pathelement location="${EJB_LIB}"/>
+ <pathelement location="${ECLIPSELINK_LIB}"/>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </path>
+ <target name="init" depends="clean">
+ <mkdir dir="classes"/>
+ </target>
+ <target name="clean">
+ <delete dir="classes"/>
+ </target>
+
+ <target depends="init" name="build">
+ <echo message="${ant.project.name}: ${ant.file}"/>
+ <javac debug="true" debuglevel="${debuglevel}" destdir="classes">
+ <src path="src"/>
+ <exclude name="**/.svn/**"/>
+ <classpath refid="example.classpath"/>
+ </javac>
+ <copy todir="classes/META-INF">
+ <fileset dir="src/META-INF" includes="*"/>
+ </copy>
+ <copy todir="classes/">
+ <fileset dir="./" includes="jndi.properties"/>
+ </copy>
+ <jar jarfile="employee.jar">
+ <fileset dir="classes" includes="**"/>
+ </jar>
+ <ear destfile="employee.ear" appxml="src/META-INF/application.xml">
+ <fileset dir="." includes ="employee.jar"/>
+ </ear>
+ </target>
+
+ <!-- WebLogic ant tasks -->
+ <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+ <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+ <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+
+ <!-- This creates the server domain. -->
+ <target name="create-cluster">
+ <delete dir="${JEE_DOMAIN}"/>
+ <mkdir dir="${JEE_DOMAIN}"/>
+ <wlserver fork="true" spawn="true" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" servername="admin" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ </wlserver>
+ <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+ <create type="Cluster" name="employee-cluster"/>
+ <query domain="mydomain" type="Cluster" name="employee-cluster" property="cluster"/>
+ <create type="Server" name="server1">
+ <set attribute="ListenPort" value="${JEE_PORT1}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ <create type="Server" name="server2">
+ <set attribute="ListenPort" value="${JEE_PORT2}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ <create type="Server" name="server3">
+ <set attribute="ListenPort" value="${JEE_PORT3}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ </wlconfig>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ </target>
+
+ <!--
+ This target is to create connection pool and managed datasource required for running this JPA example.
+ Note: WLS server must be running.
+ -->
+ <target name="setup-cluster">
+ <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+ <query domain="mydomain" type="JDBCConnectionPool" name="employeePool">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JDBCTxDataSource" name="EmployeeDS">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JDBCDataSource" name="EmployeeLocalDS">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSDistributedTopic" name="EmployeeTopic">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer1">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer2">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer3">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="Cluster" name="*" property="cluster"/>
+ <query domain="mydomain" type="Server" name="server1" property="server1"/>
+ <query domain="mydomain" type="Server" name="server2" property="server2"/>
+ <query domain="mydomain" type="Server" name="server3" property="server3"/>
+
+ <create type="JDBCConnectionPool" name="employeePool">
+ <set attribute="CapacityIncrement" value="2"/>
+ <set attribute="DriverName" value="${DB_DRIVER}"/>
+ <set attribute="InitialCapacity" value="1"/>
+ <set attribute="MaxCapacity" value="50"/>
+ <set attribute="Password" value="${DB_PASSWORD}"/>
+ <set attribute="Properties" value="user=${DB_USER}"/>
+ <set attribute="URL" value="${DB_URL}"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JDBCTxDataSource" name="EmployeeDS">
+ <set attribute="JNDIName" value="jdbc/EmployeeDS"/>
+ <set attribute="PoolName" value="employeePool"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JDBCDataSource" name="EmployeeLocalDS">
+ <set attribute="JNDIName" value="jdbc/EmployeeLocalDS"/>
+ <set attribute="PoolName" value="employeePool"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+
+ <create type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+ <set attribute="JNDIName" value="jms/EmployeeTopicConnectionFactory"/>
+ <set attribute="XAServerEnabled" value="false"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JMSServer" name="EmployeeJMSServer1">
+ <set attribute="Targets" value="${server1}"/>
+ </create>
+ <create type="JMSServer" name="EmployeeJMSServer2">
+ <set attribute="Targets" value="${server2}"/>
+ </create>
+ <create type="JMSServer" name="EmployeeJMSServer3">
+ <set attribute="Targets" value="${server3}"/>
+ </create>
+ <create type="JMSDistributedTopic" name="EmployeeTopic">
+ <set attribute="JNDIName" value="jms/EmployeeTopic"/>
+ <set attribute="LoadBalancingPolicy" value="Random"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+
+ </wlconfig>
+ </target>
+
+ <!-- This start the servers. -->
+ <target name="start-cluster">
+ <!--wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver>
+ <sleep seconds="30"/>
+ <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver>
+ <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver-->
+ <!-- There is probably a more eligent way to start the cluster, but for now this works -->
+ <!-- Where as using wlserver above did not seem to -->
+ <delete>
+ <fileset dir="./" includes="server*.log,server*.err"/>
+ </delete>
+ <parallel>
+ <echo message="*** starting WebLogic admin server"/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="admin"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="admin.log"/>
+ <sysproperty key="weblogic.Stderr" value="admin.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <sequential>
+ <waitfor>
+ <socket server="${JEE_HOST}" port="7001"/>
+ </waitfor>
+ <parallel>
+ <echo message="*** starting managed server: server1 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server1"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server1.log"/>
+ <sysproperty key="weblogic.Stderr" value="server1.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <echo message="*** starting managed server: server2 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server2"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server2.log"/>
+ <sysproperty key="weblogic.Stderr" value="server2.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <echo message="*** starting managed server: server3 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server3"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server3.log"/>
+ <sysproperty key="weblogic.Stderr" value="server3.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <sequential>
+ <waitfor>
+ <and>
+ <socket server="${JEE_HOST}" port="${JEE_PORT1}"/>
+ <socket server="${JEE_HOST}" port="${JEE_PORT2}"/>
+ <socket server="${JEE_HOST}" port="${JEE_PORT3}"/>
+ </and>
+ </waitfor>
+ <sleep seconds="30"/>
+ <echo message="*** done, do not close/break prompt "/>
+ </sequential>
+ </parallel>
+ </sequential>
+ </parallel>
+ </target>
+
+ <!-- Stop the servers. -->
+ <target name="stop-cluster">
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ </target>
+
+ <!--
+ Deploy the application ear to the servers.
+ Note: WLS server must be running.
+ -->
+ <target name="deploy">
+ <wldeploy action="deploy"
+ name="employee" source="employee.ear"
+ user="${JEE_USER}" password="${JEE_PASSWORD}"
+ adminurl="t3://${JEE_HOST}:7001"
+ failonerror="false" targets="employee-cluster">
+ </wldeploy>
+ </target>
+
+ <target name="example">
+ <java classname="example.Transactions" fork="true">
+ <!--jvmarg value="${AGENT}"/-->
+ <classpath refid="example.classpath"/>
+ </java>
+ </target>
+</project>
+
diff --git a/jpa/cachecoordination/build-wls-servers.xml b/jpa/cachecoordination/build-wls-servers.xml
new file mode 100755
index 0000000..af0c1ce
--- /dev/null
+++ b/jpa/cachecoordination/build-wls-servers.xml
@@ -0,0 +1,374 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This build file configures and runs the example on a WebLogic domain with independent servers (no clustering). -->
+<project basedir="." default="build" name="org.eclipse.persistence.example.jpa.server.cachecoordination">
+ <property environment="env"/>
+ <property name="JEE_HOME" value="/scratch/wls/12.1.3"/>
+ <property name="WEBLOGIC_HOME" value="${JEE_HOME}/wlserver"/>
+ <property name="JEE_SERVER" value="${WEBLOGIC_HOME}/server"/>
+ <!-- localhost may not work, machine name/ip my be required. -->
+ <property name="JEE_HOST" value="localhost"/>
+ <!-- These ports are also in the Transaction.java and persistence.xml files. -->
+ <property name="JEE_PORT1" value="7021"/>
+ <property name="JEE_PORT2" value="7031"/>
+ <property name="JEE_PORT3" value="7041"/>
+ <property name="JEE_DOMAIN" value="./domain"/>
+ <!-- These also need to be defined in the jndi.properties file. -->
+ <property name="JEE_USER" value="weblogic"/>
+ <property name="JEE_PASSWORD" value="welcome1"/>
+ <!-- These need to be updated with your database settings. -->
+ <property name="DB_DRIVER" value="oracle.jdbc.OracleDriver"/>
+ <property name="DB_URL" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
+ <property name="DB_USER" value="scott"/>
+ <property name="DB_PASSWORD" value="tiger"/>
+ <!-- These will differ depending on the version of WebLogic. -->
+ <property name="JPA_LIB" value="${JEE_HOME}/oracle_common/modules/javax.persistence_2.2.0.0_1-0-2.jar"/>
+ <property name="EJB_LIB" value="${JEE_HOME}/oracle_common/modules/javax.ejb_3.3.0.jar"/>
+ <property name="ECLIPSELINK_LIB" value="${JEE_HOME}/oracle_common/modules/oracle.toplink_12.1.3/eclipselink.jar"/>
+ <property name="debuglevel" value="source,lines,vars"/>
+ <path id="example.classpath">
+ <pathelement location="classes"/>
+ <pathelement location="${JPA_LIB}"/>
+ <pathelement location="${EJB_LIB}"/>
+ <pathelement location="${ECLIPSELINK_LIB}"/>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </path>
+ <target name="init" depends="clean">
+ <mkdir dir="classes"/>
+ </target>
+ <target name="clean">
+ <delete dir="classes"/>
+ </target>
+
+ <target depends="init" name="build">
+ <echo message="${ant.project.name}: ${ant.file}"/>
+ <javac debug="true" debuglevel="${debuglevel}" destdir="classes">
+ <src path="src"/>
+ <exclude name="**/.svn/**"/>
+ <classpath refid="example.classpath"/>
+ </javac>
+ <copy todir="classes/META-INF">
+ <fileset dir="src/META-INF" includes="*"/>
+ </copy>
+ <copy todir="classes/">
+ <fileset dir="./" includes="jndi.properties"/>
+ </copy>
+ <jar jarfile="employee.jar">
+ <fileset dir="classes" includes="**"/>
+ </jar>
+ <ear destfile="employee.ear" appxml="src/META-INF/application.xml">
+ <fileset dir="." includes ="employee.jar"/>
+ </ear>
+ </target>
+
+ <!-- WebLogic ant tasks -->
+ <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+ <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+ <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+
+ <!-- This creates the server domain. -->
+ <target name="create-cluster">
+ <delete dir="${JEE_DOMAIN}"/>
+ <mkdir dir="${JEE_DOMAIN}"/>
+ <wlserver fork="true" spawn="true" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" servername="admin" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ </wlserver>
+ <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+ <create type="Server" name="server1">
+ <set attribute="ListenPort" value="${JEE_PORT1}"/>
+ </create>
+ <create type="Server" name="server2">
+ <set attribute="ListenPort" value="${JEE_PORT2}"/>
+ </create>
+ <create type="Server" name="server3">
+ <set attribute="ListenPort" value="${JEE_PORT3}"/>
+ </create>
+ </wlconfig>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ </target>
+
+ <!--
+ This target is to create connection pool and managed datasource required for running this JPA example.
+ Note: WLS server must be running.
+ -->
+ <target name="setup-cluster">
+ <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+ <query domain="mydomain" type="JDBCConnectionPool" name="employeePool">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JDBCTxDataSource" name="EmployeeDS">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JDBCDataSource" name="EmployeeLocalDS">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSTopic" name="EmployeeTopic">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="Server" name="*" property="cluster"/>
+ <query domain="mydomain" type="Server" name="server1" property="server1"/>
+ <create type="JDBCConnectionPool" name="employeePool">
+ <set attribute="CapacityIncrement" value="2"/>
+ <set attribute="DriverName" value="${DB_DRIVER}"/>
+ <set attribute="InitialCapacity" value="1"/>
+ <set attribute="MaxCapacity" value="50"/>
+ <set attribute="Password" value="${DB_PASSWORD}"/>
+ <set attribute="Properties" value="user=${DB_USER}"/>
+ <set attribute="URL" value="${DB_URL}"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JDBCTxDataSource" name="EmployeeDS">
+ <set attribute="JNDIName" value="jdbc/EmployeeDS"/>
+ <set attribute="PoolName" value="employeePool"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JDBCDataSource" name="EmployeeLocalDS">
+ <set attribute="JNDIName" value="jdbc/EmployeeLocalDS"/>
+ <set attribute="PoolName" value="employeePool"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+
+ <create type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+ <set attribute="JNDIName" value="jms/EmployeeTopicConnectionFactory"/>
+ <set attribute="XAServerEnabled" value="false"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JMSServer" name="EmployeeJMSServer">
+ <set attribute="Targets" value="${server1}"/>
+ <create type="JMSTopic" name="EmployeeTopic">
+ <set attribute="JNDIName" value="jms/EmployeeTopic"/>
+ </create>
+ </create>
+
+ </wlconfig>
+ </target>
+
+ <!-- This start the servers. -->
+ <target name="start-cluster">
+ <!--wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver>
+ <sleep seconds="30"/>
+ <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver>
+ <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver-->
+ <!-- There is probably a more eligent way to start the cluster, but for now this works -->
+ <!-- Where as using wlserver above did not seem to -->
+ <delete>
+ <fileset dir="./" includes="server*.log,server*.err"/>
+ </delete>
+ <parallel>
+ <echo message="*** starting WebLogic admin server"/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="admin"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="admin.log"/>
+ <sysproperty key="weblogic.Stderr" value="admin.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <sequential>
+ <waitfor>
+ <socket server="${JEE_HOST}" port="7001"/>
+ </waitfor>
+ <parallel>
+ <echo message="*** starting managed server: server1 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server1"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server1.log"/>
+ <sysproperty key="weblogic.Stderr" value="server1.err"/>
+ <!-- When using RMI outside of a cluster, the host URL must be defined, either as a system property, -->
+ <!-- in the persistence.xml or in code in a SessionCustomizer -->
+ <sysproperty key="eclipselink.cache.coordination.rmi.url" value="t3://${JEE_HOST}:${JEE_PORT1}/" />
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <echo message="*** starting managed server: server2 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server2"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server2.log"/>
+ <sysproperty key="weblogic.Stderr" value="server2.err"/>
+ <!-- When using RMI outside of a cluster, the host URL must be defined, either as a system property, -->
+ <!-- in the persistence.xml or in code in a SessionCustomizer -->
+ <sysproperty key="eclipselink.cache.coordination.rmi.url" value="t3://${JEE_HOST}:${JEE_PORT2}/" />
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <echo message="*** starting managed server: server3 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server3"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server3.log"/>
+ <sysproperty key="weblogic.Stderr" value="server3.err"/>
+ <!-- When using RMI outside of a cluster, the host URL must be defined, either as a system property, -->
+ <!-- in the persistence.xml or in code in a SessionCustomizer -->
+ <sysproperty key="eclipselink.cache.coordination.rmi.url" value="t3://${JEE_HOST}:${JEE_PORT3}/" />
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <sequential>
+ <waitfor>
+ <and>
+ <socket server="${JEE_HOST}" port="${JEE_PORT1}"/>
+ <socket server="${JEE_HOST}" port="${JEE_PORT2}"/>
+ <socket server="${JEE_HOST}" port="${JEE_PORT3}"/>
+ </and>
+ </waitfor>
+ <sleep seconds="30"/>
+ <echo message="*** done, do not close/break prompt "/>
+ </sequential>
+ </parallel>
+ </sequential>
+ </parallel>
+ </target>
+
+ <!-- Stop the servers. -->
+ <target name="stop-cluster">
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ </target>
+
+ <!--
+ Deploy the application ear to the servers.
+ Note: WLS server must be running.
+ -->
+ <target name="deploy">
+ <wldeploy action="deploy"
+ name="employee" source="employee.ear"
+ user="${JEE_USER}" password="${JEE_PASSWORD}"
+ adminurl="t3://${JEE_HOST}:7001"
+ failonerror="false" targets="server1,server2,server3">
+ </wldeploy>
+ </target>
+
+ <target name="example">
+ <java classname="example.Transactions" fork="true">
+ <!--jvmarg value="${AGENT}"/-->
+ <classpath refid="example.classpath"/>
+ </java>
+ </target>
+</project>
+
diff --git a/jpa/cachecoordination/build.xml b/jpa/cachecoordination/build.xml
new file mode 100755
index 0000000..7d28972
--- /dev/null
+++ b/jpa/cachecoordination/build.xml
@@ -0,0 +1,370 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This build file configures and runs the example on a WebLogic Cluster. -->
+<project basedir="." default="build" name="org.eclipse.persistence.example.jpa.server.cachecoordination">
+ <property environment="env"/>
+ <property name="JEE_HOME" value="/scratch/wls/12.1.3"/>
+ <property name="WEBLOGIC_HOME" value="${JEE_HOME}/wlserver"/>
+ <property name="JEE_SERVER" value="${WEBLOGIC_HOME}/server"/>
+ <!-- localhost may not work, machine name/ip my be required. -->
+ <property name="JEE_HOST" value="localhost"/>
+ <!-- These ports are also in the Transaction.java and persistence.xml files. -->
+ <property name="JEE_PORT1" value="7021"/>
+ <property name="JEE_PORT2" value="7031"/>
+ <property name="JEE_PORT3" value="7041"/>
+ <property name="JEE_DOMAIN" value="./domain"/>
+ <!-- These also need to be defined in the jndi.properties file. -->
+ <property name="JEE_USER" value="weblogic"/>
+ <property name="JEE_PASSWORD" value="welcome1"/>
+ <!-- These need to be updated with your database settings. -->
+ <property name="DB_DRIVER" value="oracle.jdbc.OracleDriver"/>
+ <property name="DB_URL" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
+ <property name="DB_USER" value="scott"/>
+ <property name="DB_PASSWORD" value="tiger"/>
+ <!-- These will differ depending on the version of WebLogic. -->
+ <property name="JPA_LIB" value="${JEE_HOME}/oracle_common/modules/javax.persistence_2.2.0.0_1-0-2.jar"/>
+ <property name="EJB_LIB" value="${JEE_HOME}/oracle_common/modules/javax.ejb_3.3.0.jar"/>
+ <property name="ECLIPSELINK_LIB" value="${JEE_HOME}/oracle_common/modules/oracle.toplink_12.1.3/eclipselink.jar"/>
+ <property name="debuglevel" value="source,lines,vars"/>
+ <path id="example.classpath">
+ <pathelement location="classes"/>
+ <pathelement location="${JPA_LIB}"/>
+ <pathelement location="${EJB_LIB}"/>
+ <pathelement location="${ECLIPSELINK_LIB}"/>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </path>
+ <target name="init" depends="clean">
+ <mkdir dir="classes"/>
+ </target>
+ <target name="clean">
+ <delete dir="classes"/>
+ </target>
+
+ <target depends="init" name="build">
+ <echo message="${ant.project.name}: ${ant.file}"/>
+ <javac debug="true" debuglevel="${debuglevel}" destdir="classes">
+ <src path="src"/>
+ <exclude name="**/.svn/**"/>
+ <classpath refid="example.classpath"/>
+ </javac>
+ <copy todir="classes/META-INF">
+ <fileset dir="src/META-INF" includes="*"/>
+ </copy>
+ <copy todir="classes/">
+ <fileset dir="./" includes="jndi.properties"/>
+ </copy>
+ <jar jarfile="employee.jar">
+ <fileset dir="classes" includes="**"/>
+ </jar>
+ <ear destfile="employee.ear" appxml="src/META-INF/application.xml">
+ <fileset dir="." includes ="employee.jar"/>
+ </ear>
+ </target>
+
+ <!-- WebLogic ant tasks -->
+ <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+ <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+ <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
+ <classpath>
+ <pathelement location="${JEE_SERVER}/lib/weblogic.jar"/>
+ </classpath>
+ </taskdef>
+
+ <!-- This creates the server domain. -->
+ <target name="create-cluster">
+ <delete dir="${JEE_DOMAIN}"/>
+ <mkdir dir="${JEE_DOMAIN}"/>
+ <wlserver fork="true" spawn="true" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" servername="admin" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ </wlserver>
+ <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+ <create type="Cluster" name="employee-cluster"/>
+ <query domain="mydomain" type="Cluster" name="employee-cluster" property="cluster"/>
+ <create type="Server" name="server1">
+ <set attribute="ListenPort" value="${JEE_PORT1}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ <create type="Server" name="server2">
+ <set attribute="ListenPort" value="${JEE_PORT2}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ <create type="Server" name="server3">
+ <set attribute="ListenPort" value="${JEE_PORT3}"/>
+ <set attribute="Cluster" value="${cluster}"/>
+ </create>
+ </wlconfig>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ </target>
+
+ <!--
+ This target is to create connection pool and managed datasource required for running this JPA example.
+ Note: WLS server must be running.
+ -->
+ <target name="setup-cluster">
+ <wlconfig url="t3://${JEE_HOST}:7001" username="${JEE_USER}" password="${JEE_PASSWORD}">
+ <query domain="mydomain" type="JDBCConnectionPool" name="employeePool">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JDBCTxDataSource" name="EmployeeDS">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JDBCDataSource" name="EmployeeLocalDS">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSTopic" name="EmployeeTopic">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="JMSServer" name="EmployeeJMSServer">
+ <delete/>
+ </query>
+ <query domain="mydomain" type="Cluster" name="*" property="cluster"/>
+ <query domain="mydomain" type="Server" name="server1" property="server1"/>
+ <create type="JDBCConnectionPool" name="employeePool">
+ <set attribute="CapacityIncrement" value="2"/>
+ <set attribute="DriverName" value="${DB_DRIVER}"/>
+ <set attribute="InitialCapacity" value="1"/>
+ <set attribute="MaxCapacity" value="50"/>
+ <set attribute="Password" value="${DB_PASSWORD}"/>
+ <set attribute="Properties" value="user=${DB_USER}"/>
+ <set attribute="URL" value="${DB_URL}"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JDBCTxDataSource" name="EmployeeDS">
+ <set attribute="JNDIName" value="jdbc/EmployeeDS"/>
+ <set attribute="PoolName" value="employeePool"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JDBCDataSource" name="EmployeeLocalDS">
+ <set attribute="JNDIName" value="jdbc/EmployeeLocalDS"/>
+ <set attribute="PoolName" value="employeePool"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+
+ <create type="JMSConnectionFactory" name="EmployeeTopicConnectionFactory">
+ <set attribute="JNDIName" value="jms/EmployeeTopicConnectionFactory"/>
+ <set attribute="XAServerEnabled" value="false"/>
+ <set attribute="Targets" value="${cluster}"/>
+ </create>
+ <create type="JMSServer" name="EmployeeJMSServer">
+ <set attribute="Targets" value="${server1}"/>
+ <create type="JMSTopic" name="EmployeeTopic">
+ <set attribute="JNDIName" value="jms/EmployeeTopic"/>
+ </create>
+ </create>
+
+ </wlconfig>
+ </target>
+
+ <!-- This start the servers. -->
+ <target name="start-cluster">
+ <!--wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver>
+ <sleep seconds="30"/>
+ <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver>
+ <wlserver fork="true" spawn="true" weblogichome="${JEE_SERVER}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3" generateConfig="true" verbose="true"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="start">
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx960m"/>
+ </wlserver-->
+ <!-- There is probably a more eligent way to start the cluster, but for now this works -->
+ <!-- Where as using wlserver above did not seem to -->
+ <delete>
+ <fileset dir="./" includes="server*.log,server*.err"/>
+ </delete>
+ <parallel>
+ <echo message="*** starting WebLogic admin server"/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="admin"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="admin.log"/>
+ <sysproperty key="weblogic.Stderr" value="admin.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <sequential>
+ <waitfor>
+ <socket server="${JEE_HOST}" port="7001"/>
+ </waitfor>
+ <parallel>
+ <echo message="*** starting managed server: server1 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server1"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server1.log"/>
+ <sysproperty key="weblogic.Stderr" value="server1.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <echo message="*** starting managed server: server2 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server2"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server2.log"/>
+ <sysproperty key="weblogic.Stderr" value="server2.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <echo message="*** starting managed server: server3 "/>
+ <java classname="weblogic.Server"
+ fork="true"
+ failonerror="true">
+ <jvmarg value="-server"/>
+ <jvmarg value="-Xms512m"/>
+ <jvmarg value="-Xmx1024m"/>
+ <jvmarg value="-XX:MaxPermSize=128m"/>
+ <env key="PATH" value="${env.JAVA_HOME}/bin:${env.PATH}"/>
+ <sysproperty key="weblogic.Name" value="server3"/>
+ <sysproperty key="bea.home" value="${JEE_HOME}"/>
+ <sysproperty key="weblogic.management.server" value="${JEE_HOST}:7001"/>
+ <sysproperty key="weblogic.management.username" value="${JEE_USER}"/>
+ <sysproperty key="weblogic.management.password" value="${JEE_PASSWORD}"/>
+ <sysproperty key="java.security.police" value='"${JEE_SERVER}/lib/weblogic.policy"'/>
+ <sysproperty key="weblogic.RootDirectory" value="${JEE_DOMAIN}"/>
+ <sysproperty key="weblogic.Stdout" value="server3.log"/>
+ <sysproperty key="weblogic.Stderr" value="server3.err"/>
+ <classpath>
+ <fileset dir="${JEE_SERVER}/lib" includes="weblogic.jar,weblogic_sp.jar"/>
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </classpath>
+ </java>
+ <sequential>
+ <waitfor>
+ <and>
+ <socket server="${JEE_HOST}" port="${JEE_PORT1}"/>
+ <socket server="${JEE_HOST}" port="${JEE_PORT2}"/>
+ <socket server="${JEE_HOST}" port="${JEE_PORT3}"/>
+ </and>
+ </waitfor>
+ <sleep seconds="30"/>
+ <echo message="*** done, do not close/break prompt "/>
+ </sequential>
+ </parallel>
+ </sequential>
+ </parallel>
+ </target>
+
+ <!-- Stop the servers. -->
+ <target name="stop-cluster">
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="7001" servername="admin"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT1}" servername="server1"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT2}" servername="server2"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ <wlserver fork="true" failonerror="false" weblogichome="${WEBLOGIC_HOME}"
+ dir="${JEE_DOMAIN}" host="${JEE_HOST}" port="${JEE_PORT3}" servername="server3"
+ username="${JEE_USER}" password="${JEE_PASSWORD}" action="shutdown">
+ </wlserver>
+ </target>
+
+ <!--
+ Deploy the application ear to the servers.
+ Note: WLS server must be running.
+ -->
+ <target name="deploy">
+ <wldeploy action="deploy"
+ name="employee" source="employee.ear"
+ user="${JEE_USER}" password="${JEE_PASSWORD}"
+ adminurl="t3://${JEE_HOST}:7001"
+ failonerror="false" targets="employee-cluster">
+ </wldeploy>
+ </target>
+
+ <target name="example">
+ <java classname="example.Transactions" fork="true">
+ <!--jvmarg value="${AGENT}"/-->
+ <classpath refid="example.classpath"/>
+ </java>
+ </target>
+</project>
+
diff --git a/jpa/cachecoordination/jndi.properties b/jpa/cachecoordination/jndi.properties
new file mode 100755
index 0000000..a182a38
--- /dev/null
+++ b/jpa/cachecoordination/jndi.properties
@@ -0,0 +1,7 @@
+java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
+java.naming.security.principal=weblogic
+java.naming.security.credentials=welcome1
+java.naming.security.authentication=none
+
+
+
diff --git a/jpa/cachecoordination/src/META-INF/application.xml b/jpa/cachecoordination/src/META-INF/application.xml
new file mode 100755
index 0000000..31e27b1
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/application.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+ http://java.sun.com/xml/ns/javaee/application_5.xsd"
+ version="5">
+ <description>employee</description>
+ <display-name>employee</display-name>
+ <module>
+ <ejb>employee.jar</ejb>
+ </module>
+</application>
diff --git a/jpa/cachecoordination/src/META-INF/jgroups-udp-config.xml b/jpa/cachecoordination/src/META-INF/jgroups-udp-config.xml
new file mode 100755
index 0000000..b15be2f
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/jgroups-udp-config.xml
@@ -0,0 +1,78 @@
+
+<!--
+ Default stack using IP multicasting. It is similar to the "udp"
+ stack in stacks.xml, but doesn't use streaming state transfer and flushing
+ author: Bela Ban
+-->
+
+<config xmlns="urn:org:jgroups"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/jgroups.xsd">
+ <UDP
+ mcast_port="${jgroups.udp.mcast_port:45588}"
+ ip_ttl="0"
+ tos="8"
+ ucast_recv_buf_size="5M"
+ ucast_send_buf_size="5M"
+ mcast_recv_buf_size="5M"
+ mcast_send_buf_size="5M"
+ max_bundle_size="64K"
+ max_bundle_timeout="30"
+ enable_diagnostics="true"
+ thread_naming_pattern="cl"
+
+ timer_type="new3"
+ timer.min_threads="2"
+ timer.max_threads="4"
+ timer.keep_alive_time="3000"
+ timer.queue_max_size="500"
+
+ thread_pool.enabled="true"
+ thread_pool.min_threads="2"
+ thread_pool.max_threads="8"
+ thread_pool.keep_alive_time="5000"
+ thread_pool.queue_enabled="true"
+ thread_pool.queue_max_size="10000"
+ thread_pool.rejection_policy="discard"
+
+ oob_thread_pool.enabled="true"
+ oob_thread_pool.min_threads="1"
+ oob_thread_pool.max_threads="8"
+ oob_thread_pool.keep_alive_time="5000"
+ oob_thread_pool.queue_enabled="false"
+ oob_thread_pool.queue_max_size="100"
+ oob_thread_pool.rejection_policy="discard"/>
+
+ <PING />
+ <MERGE3 max_interval="30000"
+ min_interval="10000"/>
+ <FD_SOCK/>
+ <FD_ALL/>
+ <VERIFY_SUSPECT timeout="1500" />
+ <BARRIER />
+ <pbcast.NAKACK2 xmit_interval="500"
+ xmit_table_num_rows="100"
+ xmit_table_msgs_per_row="2000"
+ xmit_table_max_compaction_time="30000"
+ max_msg_batch_size="500"
+ use_mcast_xmit="false"
+ discard_delivered_msgs="true"/>
+ <UNICAST3 xmit_interval="500"
+ xmit_table_num_rows="100"
+ xmit_table_msgs_per_row="2000"
+ xmit_table_max_compaction_time="60000"
+ conn_expiry_timeout="0"
+ max_msg_batch_size="500"/>
+ <pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000"
+ max_bytes="4M"/>
+ <pbcast.GMS print_local_addr="true" join_timeout="2000"
+ view_bundling="true"/>
+ <UFC max_credits="2M"
+ min_threshold="0.4"/>
+ <MFC max_credits="2M"
+ min_threshold="0.4"/>
+ <FRAG2 frag_size="60K" />
+ <RSVP resend_interval="2000" timeout="10000"/>
+ <pbcast.STATE_TRANSFER />
+ <!-- pbcast.FLUSH /-->
+</config>
diff --git a/jpa/cachecoordination/src/META-INF/orm.xml b/jpa/cachecoordination/src/META-INF/orm.xml
new file mode 100755
index 0000000..71d5f0f
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/orm.xml
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings version="1.0" xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd">
+ <description>Employee model</description>
+ <entity name="Employee" class="model.Employee" access="FIELD">
+ <table name="P_EMPLOYEE"/>
+ <sequence-generator name="EMP_SEQ" sequence-name="EMP_SEQ" allocation-size="48"/>
+ <attributes>
+ <id name="id">
+ <column name="EMP_ID"/>
+ <generated-value strategy="SEQUENCE" generator="EMP_SEQ"/>
+ </id>
+ <basic name="firstName">
+ <column name="F_NAME"/>
+ </basic>
+ <basic name="lastName">
+ <column name="L_NAME"/>
+ </basic>
+ <basic name="gender">
+ <column name="GENDER"/>
+ </basic>
+ <basic name="salary">
+ <column name="SALARY"/>
+ </basic>
+ <version name="version">
+ <column name="VERSION"/>
+ </version>
+ <many-to-one name="manager" target-entity="model.Employee" fetch="LAZY">
+ <join-column name="MANAGER_ID" referenced-column-name="EMP_ID"/>
+ <cascade>
+ <cascade-persist/>
+ </cascade>
+ </many-to-one>
+ <one-to-many name="phoneNumbers" target-entity="model.PhoneNumber" mapped-by="owner">
+ <cascade>
+ <cascade-all/>
+ </cascade>
+ </one-to-many>
+ <one-to-many name="managedEmployees" target-entity="model.Employee" mapped-by="manager">
+ <cascade>
+ <cascade-persist/>
+ </cascade>
+ </one-to-many>
+ <one-to-one name="address" target-entity="model.Address" fetch="LAZY">
+ <join-column name="ADDR_ID"/>
+ <cascade>
+ <cascade-all/>
+ </cascade>
+ </one-to-one>
+ <many-to-many name="projects" target-entity="model.Project">
+ <join-table name="P_PROJ_EMP">
+ <join-column name="EMP_ID" referenced-column-name="EMP_ID"/>
+ <inverse-join-column name="PROJ_ID" referenced-column-name="PROJ_ID"/>
+ </join-table>
+ <cascade>
+ <cascade-persist/>
+ </cascade>
+ </many-to-many>
+ <embedded name="period"/>
+ </attributes>
+ </entity>
+ <entity name="Address" class="model.Address" access="FIELD">
+ <table name="P_ADDRESS"/>
+ <sequence-generator name="ADDRESS_SEQ" sequence-name="ADDRESS_SEQ" allocation-size="48"/>
+ <named-query name="findAddressByCity">
+ <query>Select a from Address a where a.city = :city</query>
+ </named-query>
+ <named-query name="findAddressByStreet">
+ <query>Select a from Address a where a.street = :street</query>
+ </named-query>
+ <attributes>
+ <id name="id">
+ <column name="ADDRESS_ID"/>
+ <generated-value strategy="SEQUENCE" generator="ADDRESS_SEQ"/>
+ </id>
+ <basic name="postalCode">
+ <column name="P_CODE"/>
+ </basic>
+ <basic name="street">
+ <column name="STREET"/>
+ </basic>
+ <basic name="city">
+ <column name="CITY"/>
+ </basic>
+ <basic name="province">
+ <column name="PROVINCE"/>
+ </basic>
+ <basic name="country">
+ <column name="COUNTRY"/>
+ </basic>
+ </attributes>
+ </entity>
+ <entity name="PhoneNumber" class="model.PhoneNumber" access="FIELD">
+ <table name="P_PHONE"/>
+ <sequence-generator name="PHONE_SEQ" sequence-name="PHONE_SEQ" allocation-size="48"/>
+ <attributes>
+ <id name="id">
+ <column name="PHONE_ID"/>
+ <generated-value strategy="SEQUENCE" generator="PHONE_SEQ"/>
+ </id>
+ <basic name="type">
+ <column name="TYPE"/>
+ </basic>
+ <basic name="number">
+ <column name="P_NUMBER"/>
+ </basic>
+ <basic name="areaCode">
+ <column name="AREA_CODE"/>
+ </basic>
+ <many-to-one name="owner" target-entity="model.Employee" fetch="LAZY">
+ <join-column name="EMP_ID" referenced-column-name="EMP_ID"/>
+ </many-to-one>
+ </attributes>
+ </entity>
+ <entity name="LargeProject" class="model.LargeProject" access="FIELD">
+ <table name="P_LPROJECT"/>
+ <discriminator-value>L</discriminator-value>
+ <attributes>
+ <basic name="budget">
+ <column name="BUDGET"/>
+ </basic>
+ <basic name="milestoneVersion">
+ <column name="MILESTONE"/>
+ </basic>
+ </attributes>
+ </entity>
+ <entity name="SmallProject" class="model.SmallProject" access="FIELD">
+ <table name="P_SPROJECT"/>
+ <discriminator-value>S</discriminator-value>
+ </entity>
+ <entity name="Project" class="model.Project" access="FIELD">
+ <table name="P_PROJECT"/>
+ <inheritance strategy="JOINED"/>
+ <discriminator-value>P</discriminator-value>
+ <discriminator-column name="PROJ_TYPE"/>
+ <sequence-generator name="PROJ_SEQ" sequence-name="PROJ_SEQ" allocation-size="48"/>
+ <attributes>
+ <id name="id">
+ <column name="PROJ_ID"/>
+ <generated-value strategy="SEQUENCE" generator="PROJ_SEQ"/>
+ </id>
+ <basic name="name">
+ <column name="PROJ_NAME"/>
+ </basic>
+ <basic name="description">
+ <column name="DESCRIP"/>
+ </basic>
+ <version name="version">
+ <column name="VERSION"/>
+ </version>
+ <many-to-one name="teamLeader" target-entity="model.Employee" fetch="LAZY">
+ <join-column name="LEADER_ID"/>
+ </many-to-one>
+ </attributes>
+ </entity>
+ <embeddable class="model.EmploymentPeriod" access="FIELD">
+ <attributes>
+ <basic name="startDate">
+ <column name="START_DATE"/>
+ </basic>
+ <basic name="endDate">
+ <column name="END_DATE"/>
+ </basic>
+ </attributes>
+ </embeddable>
+</entity-mappings>
diff --git a/jpa/cachecoordination/src/META-INF/persistence-wls-jgroups.xml b/jpa/cachecoordination/src/META-INF/persistence-wls-jgroups.xml
new file mode 100755
index 0000000..fe8cbf9
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/persistence-wls-jgroups.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+ version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+ <persistence-unit name="employee" transaction-type="JTA">
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+ <jta-data-source>jdbc/EmployeeDS</jta-data-source>
+ <properties>
+ <!-- Configure the JEE server platform. -->
+ <property name="eclipselink.target-server" value="weblogic" />
+
+ <!-- The database platform is auto-detected by default,
+ if you want to set a specific platform this can be set. -->
+ <!-- property name=""eclipselink.target-database" value="Oracle" / -->
+
+ <!-- Configure cache size. -->
+ <!--
+ Full is used for this example to ensure nothing garbage collects,
+ but is not a good practice in general Soft, SoftCache or HardCache are best
+ -->
+ <property name="eclipselink.cache.type.default" value="Full" />
+ <property name="eclipselink.cache.size.default" value="1000" />
+
+ <property name="eclipselink.cache.coordination.protocol" value="jgroups" />
+
+ <!-- additional JGroups configuration may be passed if needed -->
+ <property name="eclipselink.cache.coordination.jgroups.config" value="META-INF/jgroups-udp-config.xml" />
+
+ <!-- Configure database to be created on startup if not already existing. -->
+ <property name="eclipselink.ddl-generation" value="create-tables" />
+
+ <!-- Configure logging for demonstration. -->
+ <property name="eclipselink.logging.logger" value="DefaultLogger" />
+ <property name="eclipselink.logging.level" value="FINEST" />
+ </properties>
+ </persistence-unit>
+</persistence>
diff --git a/jpa/cachecoordination/src/META-INF/persistence-wls-jms-cluster.xml b/jpa/cachecoordination/src/META-INF/persistence-wls-jms-cluster.xml
new file mode 100755
index 0000000..488adde
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/persistence-wls-jms-cluster.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+ version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+ <persistence-unit name="employee" transaction-type="JTA">
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+ <jta-data-source>jdbc/EmployeeDS</jta-data-source>
+ <properties>
+ <!-- Configure the JEE server platform. -->
+ <property name="eclipselink.target-server" value="weblogic" />
+
+ <!-- The database platform is auto-detected by default,
+ if you want to set a specific platform this can be set. -->
+ <!-- property name=""eclipselink.target-database" value="Oracle" / -->
+
+ <!-- Configure cache size. -->
+ <!--
+ Full is used for this example to ensure nothing garbage collects,
+ but is not a good practice in general Soft, SoftCache or HardCache are best
+ -->
+ <property name="eclipselink.cache.type.default" value="Full" />
+ <property name="eclipselink.cache.size.default" value="1000" />
+
+ <property name="eclipselink.cache.coordination.protocol" value="jms" />
+ <property name="eclipselink.cache.coordination.jms.topic" value="jms/EmployeeTopic" />
+ <property name="eclipselink.cache.coordination.jms.factory" value="jms/EmployeeTopicConnectionFactory" />
+ <!-- As of EclipseLink 2.2 the url is not required for a cluster with a distrubted topic. -->
+ <!-- Outside of a cluster, or previous to EclipseLink 2.2, a url must be given.
+ localhost may not work, machine name/ip may be required.
+ -->
+ <!--property name="eclipselink.cache.coordination.jms.host" value="t3://localhost:7021/" /-->
+ <!-- user/password should not be required -->
+ <!--property name="eclipselink.cache.coordination.jndi.user" value="weblogic" />
+ <property name="eclipselink.cache.coordination.jndi.password" value="welcome1" /-->
+
+ <!-- Configure database to be created on startup if not already existing. -->
+ <property name="eclipselink.ddl-generation" value="create-tables" />
+
+ <!-- Configure logging for demonstration. -->
+ <property name="eclipselink.logging.logger" value="DefaultLogger" />
+ <property name="eclipselink.logging.level" value="FINEST" />
+ </properties>
+ </persistence-unit>
+</persistence>
diff --git a/jpa/cachecoordination/src/META-INF/persistence-wls-jms.xml b/jpa/cachecoordination/src/META-INF/persistence-wls-jms.xml
new file mode 100755
index 0000000..5ee40c5
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/persistence-wls-jms.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+ version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+ <persistence-unit name="employee" transaction-type="JTA">
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+ <jta-data-source>jdbc/EmployeeDS</jta-data-source>
+ <properties>
+ <!-- Configure the JEE server platform. -->
+ <property name="eclipselink.target-server" value="weblogic" />
+
+ <!-- The database platform is auto-detected by default,
+ if you want to set a specific platform this can be set. -->
+ <!-- property name=""eclipselink.target-database" value="Oracle" / -->
+
+ <!-- Configure cache size. -->
+ <!--
+ Full is used for this example to ensure nothing garbage collects,
+ but is not a good practice in general Soft, SoftCache or HardCache are best
+ -->
+ <property name="eclipselink.cache.type.default" value="Full" />
+ <property name="eclipselink.cache.size.default" value="1000" />
+
+ <property name="eclipselink.cache.coordination.protocol" value="jms" />
+ <property name="eclipselink.cache.coordination.jms.topic" value="jms/EmployeeTopic" />
+ <property name="eclipselink.cache.coordination.jms.factory" value="jms/EmployeeTopicConnectionFactory" />
+ <!-- localhost may not work, full machine name or ip my be required, as is required if running on multiple machines -->
+ <property name="eclipselink.cache.coordination.jms.host" value="t3://localhost:7021/" />
+ <!-- user/password should not be required -->
+ <!--property name="eclipselink.cache.coordination.jndi.user" value="weblogic" />
+ <property name="eclipselink.cache.coordination.jndi.password" value="welcome1" /-->
+
+ <!-- Configure database to be created on startup if not already existing. -->
+ <property name="eclipselink.ddl-generation" value="create-tables" />
+
+ <!-- Configure logging for demonstration. -->
+ <property name="eclipselink.logging.logger" value="DefaultLogger" />
+ <property name="eclipselink.logging.level" value="FINEST" />
+ </properties>
+ </persistence-unit>
+</persistence>
diff --git a/jpa/cachecoordination/src/META-INF/persistence-wls-rmi.xml b/jpa/cachecoordination/src/META-INF/persistence-wls-rmi.xml
new file mode 100755
index 0000000..20c70d9
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/persistence-wls-rmi.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+ version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+ <persistence-unit name="employee" transaction-type="JTA">
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+ <jta-data-source>jdbc/EmployeeDS</jta-data-source>
+ <properties>
+ <!-- Configure the JEE server platform. -->
+ <property name="eclipselink.target-server" value="weblogic" />
+
+ <!--
+ The database platform is auto-detected by default,
+ if you want to set a specific platform this can be set.
+ -->
+ <!-- property name=""eclipselink.target-database" value="Oracle" / -->
+
+ <!-- Configure cache size. -->
+ <!--
+ Full is used for this example to ensure nothing garbage collects,
+ but is not a good practice in general Soft, SoftCache or HardCache are best
+ -->
+ <property name="eclipselink.cache.type.default" value="Full" />
+ <property name="eclipselink.cache.size.default" value="1000" />
+
+ <property name="eclipselink.cache.coordination.protocol" value="rmi" />
+ <!-- As of EclipseLink 2.2 the url is not required for a cluster, as JNDI is replicated in a WLS cluster, so the local JNDI is sufficient -->
+ <!-- Outside of a cluster, or previous to EclipseLink 2.2, a url must be given,
+ this should be the local server's url, but in a cluster could be any server's url, or use localhost (because JNDI is replicated).
+ This can also be set as a System property, or using a SessionCustomizer, which avoids having a persistence.xml per server.
+ localhost may not work, machine name/ip may be required.
+ -->
+ <!--property name="eclipselink.cache.coordination.rmi.url" value="t3://localhost:7021/" /-->
+
+ <!-- user/password should not be required -->
+ <!--property name="eclipselink.cache.coordination.jndi.user" value="weblogic" />
+ <property name="eclipselink.cache.coordination.jndi.password" value="welcome1" /-->
+
+ <!-- The following properties are not required, these are the defaults, but they could be configured if required. -->
+ <!--property name="eclipselink.cache.coordination.rmi.announcement-delay" value="1000" />
+ <property name="eclipselink.cache.coordination.rmi.multicast-group" value="239.192.0.0" />
+ <property name="eclipselink.cache.coordination.rmi.multicast-group.port" value="3121" />
+ <property name="eclipselink.cache.coordination.packet-time-to-live" value="2" /-->
+
+ <!-- Configure database to be created on startup if not already existing. -->
+ <property name="eclipselink.ddl-generation" value="create-tables" />
+
+ <!-- Configure logging for demonstration. -->
+ <property name="eclipselink.logging.logger" value="DefaultLogger" />
+ <property name="eclipselink.logging.level" value="FINEST" />
+ </properties>
+ </persistence-unit>
+</persistence>
diff --git a/jpa/cachecoordination/src/META-INF/persistence.xml b/jpa/cachecoordination/src/META-INF/persistence.xml
new file mode 100755
index 0000000..0362949
--- /dev/null
+++ b/jpa/cachecoordination/src/META-INF/persistence.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+ version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+ <persistence-unit name="employee" transaction-type="JTA">
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+ <jta-data-source>jdbc/EmployeeDS</jta-data-source>
+ <properties>
+ <!-- Configure the JEE server platform. -->
+ <property name="eclipselink.target-server" value="weblogic" />
+
+ <!-- The database platform is auto-detected by default,
+ if you want to set a specific platform this can be set. -->
+ <!-- property name=""eclipselink.target-database" value="Oracle" / -->
+
+ <!-- Configure cache size. -->
+ <!--
+ Full is used for this example to ensure nothing garbage collects,
+ but is not a good practice in general Soft, SoftCache or HardCache are best
+ -->
+ <property name="eclipselink.cache.type.default" value="Full" />
+ <property name="eclipselink.cache.size.default" value="1000" />
+
+ <property name="eclipselink.cache.coordination.protocol" value="jms" />
+ <property name="eclipselink.cache.coordination.jms.topic" value="jms/EmployeeTopic" />
+ <property name="eclipselink.cache.coordination.jms.factory" value="jms/EmployeeTopicConnectionFactory" />
+ <!-- localhost may not work, full machine name or ip my be required, as is required if running on multiple machines -->
+ <property name="eclipselink.cache.coordination.jms.host" value="t3://localhost:7021/" />
+ <!-- user/password should not be required -->
+ <!--property name="eclipselink.cache.coordination.jndi.user" value="weblogic" />
+ <property name="eclipselink.cache.coordination.jndi.password" value="welcome1" /-->
+
+ <!-- Configure database to be created on startup if not already existing. -->
+ <property name="eclipselink.ddl-generation" value="create-tables" />
+
+ <!-- Configure logging for demonstration. -->
+ <property name="eclipselink.logging.logger" value="DefaultLogger" />
+ <property name="eclipselink.logging.level" value="FINEST" />
+ </properties>
+ </persistence-unit>
+</persistence>
diff --git a/jpa/cachecoordination/src/example/Transactions.java b/jpa/cachecoordination/src/example/Transactions.java
new file mode 100755
index 0000000..5d37963
--- /dev/null
+++ b/jpa/cachecoordination/src/example/Transactions.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. 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:
+ * James Sutherland - initial impl
+ ******************************************************************************/
+ package example;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.rmi.PortableRemoteObject;
+
+import model.*;
+
+/**
+ * This example processes updates to the same employee on different nodes in the cluster.
+ */
+public class Transactions {
+ private List<String> serverURLs;
+ private int server = 0;
+
+ public static void main(String[] args) throws Exception {
+ Transactions transactions = new Transactions();
+ transactions.updateEmployee();
+ }
+
+ public Transactions() {
+ this.serverURLs = new ArrayList<String>();
+ // localhost may not work, machine name/ip may be required.
+ this.serverURLs.add("t3://localhost:7021/");
+ this.serverURLs.add("t3://localhost:7031/");
+ this.serverURLs.add("t3://localhost:7041/");
+ }
+
+ /**
+ * Return the next server index to use.
+ * This cycles through the servers.
+ */
+ public int nextServer() {
+ this.server++;
+ if (this.server >= this.serverURLs.size()) {
+ this.server = 0;
+ }
+ return this.server;
+ }
+
+ public EmployeeService nextEmployeeService() {
+ EmployeeService service = null;
+ int server = nextServer();
+ Properties properties = new Properties();
+ String url = this.serverURLs.get(server);
+ properties.put("java.naming.provider.url", url);
+ System.out.println("Connecting to server:" + url);
+ try {
+ Context context = new InitialContext(properties);
+ service = (EmployeeService)PortableRemoteObject.narrow(context.lookup("EmployeeService#model.EmployeeService"), EmployeeService.class);
+ } catch (Exception notFoundException) {
+ throw new Error("Lookup failed, verify lookup string is correct for your JEE server, and that deploy was successful.", notFoundException);
+ }
+ return service;
+ }
+
+ /**
+ * Update the same employee on each server.
+ */
+ public void updateEmployee() throws Exception {
+ try {
+ Employee employee = null;
+ System.out.println("Populating database.");
+ EmployeeService service = nextEmployeeService();
+ service.setup();
+ System.out.println("Preloading cache on all servers.");
+ for (int index = 0; index < 3; index++) {
+ System.out.println("Looking up next EmployeeServer.");
+ service = nextEmployeeService();
+ System.out.println("Loading all Employees into cache.");
+ employee = service.findAll().get(0);
+ }
+ System.out.println("Preloading done.");
+ Thread.sleep(5000);
+ System.out.println("Updating employee on each server.");
+ for (int index = 0; index < 10; index++) {
+ System.out.println("Looking up next EmployeeServer.");
+ service = nextEmployeeService();
+ int random = (int)(Math.random() * 1000000);
+ System.out.println("Finding employee: " + employee.getId());
+ employee = service.findById(employee.getId());
+ System.out.println("Employee name was: " + employee.getFirstName() + " " + employee.getLastName());
+ employee.setFirstName(String.valueOf(random));
+ employee.setLastName(String.valueOf(random));
+ employee.setSalary(random);
+ try {
+ System.out.println("Updating employee: " + employee.getId());
+ service.update(employee);
+ System.out.println("Employee name updated to: " + employee.getFirstName() + " " + employee.getLastName());
+ Thread.sleep(500);
+ } catch (Exception exception) {
+ System.out.println("Updating failed (cache coordination has not yet occurred, increase sleep time).");
+ System.out.println(exception.toString());
+ }
+ }
+ } catch (Exception error) {
+ error.printStackTrace();
+ throw error;
+ }
+ }
+}
diff --git a/jpa/cachecoordination/src/model/Address.java b/jpa/cachecoordination/src/model/Address.java
new file mode 100755
index 0000000..27799cf
--- /dev/null
+++ b/jpa/cachecoordination/src/model/Address.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. 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:
+ * Oracle - initial API and implementation
+ ******************************************************************************/
+package model;
+
+import java.io.*;
+
+/**
+ * <p><b>Purpose</b>: Represents the mailing address on an Employee
+ * <p><b>Description</b>: Held in a private 1:1 relationship from Employee
+ * @see Employee
+ */
+public class Address implements Serializable {
+ protected long id;
+ protected String street;
+ protected String city;
+ protected String province;
+ protected String postalCode;
+ protected String country;
+
+ public Address() {
+ this.city = "";
+ this.province = "";
+ this.postalCode = "";
+ this.street = "";
+ this.country = "";
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ /**
+ * Return the persistent identifier of the receiver.
+ */
+ public long getId() {
+ return id;
+ }
+
+ public String getPostalCode() {
+ return postalCode;
+ }
+
+ public String getProvince() {
+ return province;
+ }
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ /**
+ * Set the persistent identifier of the receiver.
+ */
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public void setPostalCode(String postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ public void setProvince(String province) {
+ this.province = province;
+ }
+
+ public void internalSetStreet(String street) {
+ this.street = street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ /**
+ * Print the address city and province.
+ */
+ public String toString() {
+ StringWriter writer = new StringWriter();
+
+ writer.write("Address: ");
+ writer.write(getStreet());
+ writer.write(", ");
+ writer.write(getCity());
+ writer.write(", ");
+ writer.write(getProvince());
+ writer.write(", ");
+ writer.write(getCountry());
+ return writer.toString();
+ }
+}
diff --git a/jpa/cachecoordination/src/model/Employee.java b/jpa/cachecoordination/src/model/Employee.java
new file mode 100755
index 0000000..8b0da14
--- /dev/null
+++ b/jpa/cachecoordination/src/model/Employee.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. 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:
+ * Oracle - initial API and implementation
+ ******************************************************************************/
+package model;
+
+import java.util.*;
+import java.io.*;
+
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.QueryHint;
+
+import org.eclipse.persistence.config.QueryHints;
+
+/**
+ * <p><b>Purpose</b>: Represent a employee of an organization.
+ * <p><b>Description</b>: An Employee is a root object in the Employee Demo.
+ * It maintains relationships to all of the other objects in the system.
+ */
+public class Employee implements Serializable {
+
+ protected long id;
+ protected long version;
+ protected String firstName;
+ protected String lastName;
+ protected String gender;
+ protected EmploymentPeriod period;
+ protected Address address;
+ protected Employee manager;
+ protected Collection managedEmployees;
+ protected Collection phoneNumbers;
+ protected Collection projects;
+ protected int salary;
+
+ public Employee() {
+ this.firstName = "";
+ this.lastName = "";
+ this.managedEmployees = new HashSet();
+ this.projects = new HashSet();
+ this.phoneNumbers = new HashSet();
+ }
+
+ /**
+ * For bi-directional relationships, it is important to maintain both sides of the relationship when changing it.
+ */
+ public void addManagedEmployee(Employee employee) {
+ getManagedEmployees().add(employee);
+ employee.setManager(this);
+ }
+
+ /**
+ * For bi-directional relationships, it is important to maintain both sides of the relationship when changing it.
+ */
+ public void addPhoneNumber(PhoneNumber phoneNumber) {
+ getPhoneNumbers().add(phoneNumber);
+ phoneNumber.setOwner(this);
+ }
+
+ public void addProject(Project project) {
+ getProjects().add(project);
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public String getGender() {
+ return gender;
+ }
+
+ /**
+ * Return the persistent identifier of the receiver.
+ */
+ public long getId() {
+ return id;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public Collection getManagedEmployees() {
+ return managedEmployees;
+ }
+
+ public Employee getManager() {
+ return manager;
+ }
+
+ public EmploymentPeriod getPeriod() {
+ return period;
+ }
+
+ public Collection getPhoneNumbers() {
+ return phoneNumbers;
+ }
+
+ public Collection getProjects() {
+ return projects;
+ }
+
+ public int getSalary() {
+ return salary;
+ }
+
+ public long getVersion() {
+ return version;
+ }
+
+ public void removeManagedEmployee(Employee employee) {
+ getManagedEmployees().remove(employee);
+ employee.setManager(null);
+ }
+
+ /**
+ * Remove the phone number.
+ * The phone number's owner must not be set to null as it is part of it primary key,
+ * and you can never change the primary key of an existing object.
+ * Only in independent relationships should you null out the back reference.
+ */
+ public void removePhoneNumber(PhoneNumber phoneNumber) {
+ getPhoneNumbers().remove(phoneNumber);
+ }
+
+ public void removeProject(Project project) {
+ getProjects().remove(project);
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+ public void setFemale() {
+ setGender("Female");
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public void setGender(String gender) {
+ this.gender = gender;
+ }
+
+ /**
+ * Set the persistent identifier of the receiver.
+ * Note this should never be changed.
+ * Consider making the primary key set methods protected or not having them.
+ * In this demo the setId is required for testing purposes.
+ */
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public void setMale() {
+ setGender("Male");
+ }
+
+ public void setManagedEmployees(Collection managedEmployees) {
+ this.managedEmployees = managedEmployees;
+ }
+
+ public void setManager(Employee manager) {
+ this.manager = manager;
+ }
+
+ public void setPeriod(EmploymentPeriod period) {
+ this.period = period;
+ }
+
+ public void setPhoneNumbers(Collection phoneNumbers) {
+ this.phoneNumbers = phoneNumbers;
+ }
+
+ public void setProjects(Collection projects) {
+ this.projects = projects;
+ }
+
+ public void setSalary(int salary) {
+ this.salary = salary;
+ }
+
+ public void setVersion(long version) {
+ this.version = version;
+ }
+
+ /**
+ * Print the first & last name
+ */
+ public String toString() {
+ StringWriter writer = new StringWriter();
+
+ writer.write("Employee: ");
+ writer.write(getFirstName());
+ writer.write(" ");
+ writer.write(getLastName());
+ return writer.toString();
+ }
+}
diff --git a/jpa/cachecoordination/src/model/EmployeeService.java b/jpa/cachecoordination/src/model/EmployeeService.java
new file mode 100755
index 0000000..1670f87
--- /dev/null
+++ b/jpa/cachecoordination/src/model/EmployeeService.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. 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:
+ * James Sutherland - initial impl
+ ******************************************************************************/
+ package model;
+
+import java.util.List;
+
+/**
+ * EmployeeService session bean interface.
+ */
+public interface EmployeeService {
+ List<Employee> findAll();
+
+ Employee findById(long id);
+
+ Employee fetchById(long id);
+
+ void update(Employee employee);
+
+ long insert(Employee employee);
+
+ void setup();
+}
diff --git a/jpa/cachecoordination/src/model/EmployeeServiceBean.java b/jpa/cachecoordination/src/model/EmployeeServiceBean.java
new file mode 100755
index 0000000..a3dab63
--- /dev/null
+++ b/jpa/cachecoordination/src/model/EmployeeServiceBean.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. 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:
+ * James Sutherland - initial impl
+ ******************************************************************************/
+ package model;
+
+import java.util.List;
+
+import javax.ejb.Remote;
+import javax.ejb.Stateless;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+/**
+ * EmployeeService session bean.
+ */
+@Stateless(mappedName="EmployeeService")
+@Remote(EmployeeService.class)
+public class EmployeeServiceBean implements EmployeeService {
+ @PersistenceContext(name="employee")
+ protected EntityManager entityManager;
+
+ public List<Employee> findAll() {
+ Query query = this.entityManager.createQuery("Select e from Employee e");
+ return query.getResultList();
+ }
+
+ public Employee findById(long id) {
+ Employee employee = this.entityManager.find(Employee.class, id);
+ employee.getAddress();
+ return employee;
+ }
+
+ public Employee fetchById(long id) {
+ Employee employee = this.entityManager.find(Employee.class, id);
+ employee.getAddress();
+ employee.getManager();
+ return employee;
+ }
+
+ public void update(Employee employee) {
+ this.entityManager.merge(employee);
+ }
+
+ public long insert(Employee employee) {
+ this.entityManager.persist(employee);
+ this.entityManager.flush();
+ return employee.getId();
+ }
+
+ public void setup() {
+ // Populate database.
+ // First delete all old records.
+ this.entityManager.createQuery("Delete from PhoneNumber p").executeUpdate();
+ this.entityManager.createQuery("Delete from Employee e").executeUpdate();
+ this.entityManager.createQuery("Delete from Address a").executeUpdate();
+ for (int j = 0; j < 100; j++) {
+ Employee empInsert = new Employee();
+ empInsert.setFirstName("Brendan");
+ empInsert.setMale();
+ empInsert.setLastName("" + j + "");
+ empInsert.setSalary(100000);
+ EmploymentPeriod employmentPeriod = new EmploymentPeriod();
+ java.sql.Date startDate = new java.sql.Date(new java.util.Date().getTime());
+ employmentPeriod.setStartDate(startDate);
+ empInsert.setPeriod(employmentPeriod);
+ empInsert.setAddress(new Address());
+ empInsert.getAddress().setCity("Nepean");
+ empInsert.getAddress().setPostalCode("N5J2N5");
+ empInsert.getAddress().setProvince("ON");
+ empInsert.getAddress().setStreet("1111 Mountain Blvd. Floor 13, suite " + j);
+ empInsert.getAddress().setCountry("Canada");
+ empInsert.addPhoneNumber(new PhoneNumber("Work Fax", "613", "2255943"));
+ empInsert.addPhoneNumber(new PhoneNumber("Home", "613", "2224599"));
+ this.entityManager.persist(empInsert);
+ }
+
+ for (int j = 0; j < 50; j++) {
+ Project project = new SmallProject();
+ project.setName("Tracker");
+ this.entityManager.persist(project);
+ project = new LargeProject();
+ project.setName("Tracker");
+ this.entityManager.persist(project);
+ }
+ }
+}
diff --git a/jpa/cachecoordination/src/model/EmploymentPeriod.java b/jpa/cachecoordination/src/model/EmploymentPeriod.java
new file mode 100755
index 0000000..cc09146
--- /dev/null
+++ b/jpa/cachecoordination/src/model/EmploymentPeriod.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. 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:
+ * Oracle - initial API and implementation
+ ******************************************************************************/
+package model;
+
+import java.sql.Date;
+import java.io.*;
+
+/**
+ * <p><b>Purpose</b>: Defines the period an Employee worked for the organization
+ * <p><b>Description</b>: The period holds the start date and optionally the end date if the employee has left (null otherwise).
+ * Maintained in an aggregate relationship of Employee
+ * @see Employee
+ */
+public class EmploymentPeriod implements Serializable {
+ protected Date startDate;
+ protected Date endDate;
+
+ public EmploymentPeriod() {
+ }
+
+ /**
+ * Return a new employment period instance.
+ * The constructor's purpose is to allow only valid instances of a class to be created.
+ * Valid means that the get/set and clone/toString methods should work on the instance.
+ * Arguments to constructors should be avoided unless those arguments are required to put
+ * the instance into a valid state, or represent the entire instance definition.
+ */
+ public EmploymentPeriod(Date startDate, Date endDate) {
+ this.startDate = startDate;
+ this.endDate = endDate;
+
+ }
+
+ public Date getEndDate() {
+ return endDate;
+ }
+
+ public Date getStartDate() {
+ return startDate;
+ }
+
+ public void setEndDate(Date endDate) {
+ this.endDate = endDate;
+ }
+
+ public void setStartDate(Date startDate) {
+ this.startDate = startDate;
+ }
+
+ /**
+ * Print the start & end date
+ */
+ public String toString() {
+ StringWriter writer = new StringWriter();
+
+ writer.write("EmploymentPeriod: ");
+ if (getStartDate() != null) {
+ writer.write(getStartDate().toString());
+ }
+ writer.write("-");
+ if (getEndDate() != null) {
+ writer.write(getEndDate().toString());
+ }
+ return writer.toString();
+ }
+}
diff --git a/jpa/cachecoordination/src/model/LargeProject.java b/jpa/cachecoordination/src/model/LargeProject.java
new file mode 100755
index 0000000..d17ff25
--- /dev/null
+++ b/jpa/cachecoordination/src/model/LargeProject.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. 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:
+ * Oracle - initial API and implementation
+ ******************************************************************************/
+package model;
+
+import java.io.*;
+import java.sql.Timestamp;
+
+/**
+ * <b>Purpose</b>: Larger scale projects within the Employee Demo
+ * <p><b>Description</b>: LargeProject is a concrete subclass of Project. It is instantiated for Projects with type = 'L'. The additional
+ * information (budget, & milestoneVersion) are mapped from the LPROJECT table.
+ * @see Project
+ */
+public class LargeProject extends Project {
+ protected double budget;
+ protected Timestamp milestoneVersion;
+
+ public LargeProject() {
+ this.budget = 0.0;
+ }
+
+ public double getBudget() {
+ return budget;
+ }
+
+ public Timestamp getMilestoneVersion() {
+ return milestoneVersion;
+ }
+
+ public void setBudget(double budget) {
+ this.budget = budget;
+ }
+
+ public void setMilestoneVersion(Timestamp milestoneVersion) {
+ this.milestoneVersion = milestoneVersion;
+ }
+
+ /**
+ * Print the project's data.
+ */
+ public String toString() {
+ StringWriter writer = new StringWriter();
+
+ writer.write("Large Project: ");
+ writer.write(getName());
+ writer.write(" ");
+ writer.write(getDescription());
+ writer.write(" " + getBudget());
+ writer.write(" ");
+ writer.write(String.valueOf(getMilestoneVersion()));
+ return writer.toString();
+ }
+}
diff --git a/jpa/cachecoordination/src/model/PhoneNumber.java b/jpa/cachecoordination/src/model/PhoneNumber.java
new file mode 100755
index 0000000..cfcad61
--- /dev/null
+++ b/jpa/cachecoordination/src/model/PhoneNumber.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. 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:
+ * Oracle - initial API and implementation
+ ******************************************************************************/
+package model;
+
+import java.io.*;
+
+/**
+ * <p><b>Purpose</b>: Describes an Employee's phone number.
+ * <p><b>Description</b>: Used in a 1:M relationship from an employee. Since many people have various numbers
+ * they can be contacted at the type describes where the phone number could reach the Employee.
+ */
+public class PhoneNumber implements Serializable {
+
+ /** Sequence id, added for Hibernate as it has issues with composite ids and caching. */
+ protected long id;
+
+ /** Holds values such as Home, Work, Cellular, Pager, Fax, etc. Since the combination of the Employee's ID and
+ the type field are what makes the entry in the database unique the type fields must be unique within an
+ Employee's Vector of PhoneNumbers.*/
+ protected String type;
+ protected String areaCode;
+
+ /** 7 digit number with no hyphen, this is added during toString() only*/
+ protected String number;
+
+ /** Owner maintains the 1:1 mapping to an Employee (required for 1:M relationship in Employee) */
+ protected Employee owner;
+
+ public PhoneNumber() {
+ this("home", "###", "#######");
+ }
+
+ public PhoneNumber(String type, String theAreaCode, String theNumber) {
+ this.type = type;
+ this.areaCode = theAreaCode;
+ this.number = theNumber;
+ }
+
+ public String getAreaCode() {
+ return areaCode;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public Employee getOwner() {
+ return owner;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setAreaCode(String areaCode) {
+ this.areaCode = areaCode;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+
+ public void setOwner(Employee owner) {
+ this.owner = owner;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ /**
+ * Required for Hibernate cache to work.
+ */
+ public int hashCode() {
+ return getType().hashCode();
+ }
+
+ /**
+ * Required for Hibernate cache to work.
+ */
+ public boolean equals(Object object) {
+ if (object instanceof PhoneNumber) {
+ PhoneNumber phone = (PhoneNumber)object;
+ if (! getType().equals(phone.getType())) {
+ return false;
+ }
+ if ((getOwner() == null) || (phone.getOwner() == null) || (getOwner().getId() != phone.getOwner().getId())) {
+ return false;
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Print the phone.
+ * Example: Phone[Work]: (613) 225-8812
+ */
+ public String toString() {
+ StringWriter writer = new StringWriter();
+
+ writer.write("PhoneNumber [");
+ writer.write(getType());
+ writer.write("]: (");
+ writer.write(this.getAreaCode());
+ writer.write(")");
+ writer.write(this.getNumber().substring(0, 3));
+ writer.write("-");
+ writer.write(this.getNumber().substring(3, 7));
+ return writer.toString();
+ }
+}
diff --git a/jpa/cachecoordination/src/model/Project.java b/jpa/cachecoordination/src/model/Project.java
new file mode 100755
index 0000000..e435010
--- /dev/null
+++ b/jpa/cachecoordination/src/model/Project.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. 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:
+ * Oracle - initial API and implementation
+ ******************************************************************************/
+package model;
+
+import java.io.*;
+
+/**
+ * <b>Purpose</b>: Abstract superclass for Large & Small projects in Employee Demo
+ * <p><b>Description</b>: Project is an example of an abstract superclass. It demonstrates how class inheritance can be mapped to database tables.
+ * It's subclasses are concrete and may or may not add columns through additional tables. The PROJ_TYPE field in the
+ * database table indicates which subclass to instantiate. Projects are involved in a M:M relationship with employees.
+ * The Employee classs maintains the definition of the relation table.
+ * @see LargeProject
+ * @see SmallProject
+ */
+public abstract class Project implements Serializable {
+ protected long id;
+ protected long version;
+ protected String name;
+ protected String description;
+ protected Employee teamLeader;
+
+ public Project() {
+ this.name = "";
+ this.description = "";
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * Return the persistent identifier of the receiver.
+ */
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Employee getTeamLeader() {
+ return teamLeader;
+ }
+
+ public long getVersion() {
+ return version;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * Set the persistent identifier of the receiver.
+ */
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setTeamLeader(Employee teamLeader) {
+ this.teamLeader = teamLeader;
+ }
+
+ public void setVersion(long version) {
+ this.version = version;
+ }
+}
diff --git a/jpa/cachecoordination/src/model/SmallProject.java b/jpa/cachecoordination/src/model/SmallProject.java
new file mode 100755
index 0000000..f80a837
--- /dev/null
+++ b/jpa/cachecoordination/src/model/SmallProject.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 1998, 2012 Oracle and/or its affiliates. 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:
+ * Oracle - initial API and implementation
+ ******************************************************************************/
+package model;
+
+/**
+ * <p><b>Purpose</b>: SmallProject is a concrete subclass of Project which adds no additional attributes.
+ * <p><b>Description</b>: When the PROJ_TYPE is set to 'S' in the PROJECT table a SmallProject is instantiated.
+ * No table definition is required and the descriptor is very simple.
+ */
+public class SmallProject extends Project {
+
+ /**
+ * Print the SmallProject's information.
+ */
+ public String toString() {
+ java.io.StringWriter writer = new java.io.StringWriter();
+
+ writer.write("Small Project: ");
+ writer.write(getName());
+ writer.write(" ");
+ writer.write(getDescription());
+ writer.write("");
+ return writer.toString();
+ }
+}