You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by Kevin Sutter <kw...@gmail.com> on 2006/10/27 17:05:47 UTC
Re: svn commit: r468064 - in /incubator/openjpa/trunk/openjpa-kernel: ./ src/main/java/org/apache/openjpa/ee/ src/main/java/org/apache/openjpa/util/ src/main/resources/org/apache/openjpa/ee/ src/test/ src/test/java/ src/test/java/org/ src/test/java/o
In case you hadn't noticed, I screwed up and put the wrong JIRA report
reference in the SVN commit message. It should have been OPENJPA-61 (not
OPENJPA-63). Two questions...
o Is there any way to udpate this SVN commit message? I've looking around,
but haven't found a means of updating it.
o I looked in the JIRA report for OPENJPA-63 and I don't see any of the
change history associated with this change. I was going to delete the
changes, if I could. Maybe somebody else already noticed this and cleaned
it up? Not sure. Any ideas?
Thanks,
Kevin
On 10/26/06, kwsutter@apache.org <kw...@apache.org> wrote:
>
> Author: kwsutter
> Date: Thu Oct 26 10:08:05 2006
> New Revision: 468064
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=468064
> Log:
> First step in resolving OPENJPA-63. This change removes the usage of
> internal WebSphere transaction-related APIs and replaces it with the public
> ExtendedJTATransaction interface usage.
>
> Added:
>
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/WASManagedRuntime.java
>
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WASTransformer.java
> incubator/openjpa/trunk/openjpa-kernel/src/test/
> incubator/openjpa/trunk/openjpa-kernel/src/test/java/
> incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/
> incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/
>
> incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/
>
> incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/util/
>
> incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/util/TestWASTransformer.java
> Modified:
> incubator/openjpa/trunk/openjpa-kernel/pom.xml
>
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/AutomaticManagedRuntime.java
>
> incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/ee/localizer.properties
>
> Modified: incubator/openjpa/trunk/openjpa-kernel/pom.xml
> URL:
> http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/pom.xml?view=diff&rev=468064&r1=468063&r2=468064
>
> ==============================================================================
> --- incubator/openjpa/trunk/openjpa-kernel/pom.xml (original)
> +++ incubator/openjpa/trunk/openjpa-kernel/pom.xml Thu Oct 26 10:08:05
> 2006
> @@ -1,110 +1,123 @@
> -<project xmlns="http://maven.apache.org/POM/4.0.0"
> - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> http://maven.apache.org/maven-v4_0_0.xsd">
> - <modelVersion>4.0.0</modelVersion>
> - <groupId>org.apache.openjpa</groupId>
> - <artifactId>openjpa-kernel</artifactId>
> - <packaging>jar</packaging>
> - <name>OpenJPA Kernel</name>
> - <description>OpenJPA Kernel</description>
> - <url>http://incubator.apache.org/projects/openjpa</url>
> - <parent>
> - <groupId>org.apache.openjpa</groupId>
> - <artifactId>openjpa</artifactId>
> - <version>0.9.6-incubating-SNAPSHOT</version>
> - </parent>
> - <dependencies>
> - <dependency>
> - <groupId>org.apache.openjpa</groupId>
> - <artifactId>openjpa-lib</artifactId>
> - <version>${pom.version}</version>
> - <scope>compile</scope>
> - </dependency>
> - <dependency>
> - <groupId>org.apache.geronimo.specs</groupId>
> - <artifactId>geronimo-jms_1.1_spec</artifactId>
> - <version>1.0.1</version>
> - <scope>compile</scope>
> - </dependency>
> - <dependency>
> - <groupId>org.apache.geronimo.specs</groupId>
> - <artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
> - <version>1.0.1</version>
> - <scope>compile</scope>
> - </dependency>
> - <dependency>
> - <groupId>org.apache.geronimo.specs</groupId>
> - <artifactId>geronimo-jta_1.0.1B_spec</artifactId>
> - <version>1.0.1</version>
> - <scope>compile</scope>
> - </dependency>
> - <dependency>
> - <groupId>commons-pool</groupId>
> - <artifactId>commons-pool</artifactId>
> - <version>1.3</version>
> - <scope>compile</scope>
> - </dependency>
> - </dependencies>
> - <build>
> - <plugins>
> - <plugin>
> - <groupId>org.apache.maven.plugins</groupId>
> - <artifactId>maven-compiler-plugin</artifactId>
> - <configuration>
> - <source>1.3</source>
> - <target>1.3</target>
> - </configuration>
> - </plugin>
> - <plugin>
> - <groupId>org.codehaus.mojo</groupId>
> - <artifactId>javacc-maven-plugin</artifactId>
> - <executions>
> - <execution>
> - <id>jjtree-jpql</id>
> - <phase>generate-sources</phase>
> - <configuration>
> - <sourceDirectory>
>
> - ${basedir}/src/main/jjtree/org/apache/openjpa/kernel/jpql</sourceDirectory>
> - <outputDirectory>
> - ${project.build.directory
> }/generated-sources/jjtree/org/apache/openjpa/kernel/jpql</outputDirectory>
> - <buildNodeFiles>false</buildNodeFiles>
> - </configuration>
> - <goals>
> - <goal>jjtree</goal>
> - </goals>
> - </execution>
> - <execution>
> - <id>javacc-jpql</id>
> - <phase>generate-sources</phase>
> - <configuration>
> - <sourceDirectory>
> - ${project.build.directory
> }/generated-sources/jjtree/org/apache/openjpa/kernel/jpql</sourceDirectory>
> - <outputDirectory>
> - ${project.build.directory
> }/generated-sources/javacc/org/apache/openjpa/kernel/jpql</outputDirectory>
> - </configuration>
> - <goals>
> - <goal>javacc</goal>
> - </goals>
> - </execution>
> - </executions>
> - </plugin>
> - <plugin>
> - <artifactId>maven-antrun-plugin</artifactId>
> - <executions>
> - <execution>
> - <phase>process-sources</phase>
> - <configuration>
> - <tasks>
> - <delete
> - file="${project.build.directory
> }/generated-sources/javacc/org/apache/openjpa/kernel/jpql/ParseException.java"/>
> - </tasks>
> - </configuration>
> - <goals>
> - <goal>run</goal>
> - </goals>
> - </execution>
> - </executions>
> - </plugin>
> - </plugins>
> - </build>
> -</project>
> +<project xmlns="http://maven.apache.org/POM/4.0.0"
> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> http://maven.apache.org/maven-v4_0_0.xsd">
> + <modelVersion>4.0.0</modelVersion>
> + <groupId>org.apache.openjpa</groupId>
> + <artifactId>openjpa-kernel</artifactId>
> + <packaging>jar</packaging>
> + <name>OpenJPA Kernel</name>
> + <description>OpenJPA Kernel</description>
> + <url>http://incubator.apache.org/projects/openjpa</url>
> + <parent>
> + <groupId>org.apache.openjpa</groupId>
> + <artifactId>openjpa</artifactId>
> + <version>0.9.6-incubating-SNAPSHOT</version>
> + </parent>
> + <dependencies>
> + <dependency>
> + <groupId>org.apache.openjpa</groupId>
> + <artifactId>openjpa-lib</artifactId>
> + <version>${pom.version}</version>
> + <scope>compile</scope>
> + </dependency>
> + <dependency>
> + <groupId>org.apache.geronimo.specs</groupId>
> + <artifactId>geronimo-jms_1.1_spec</artifactId>
> + <version>1.0.1</version>
> + <scope>compile</scope>
> + </dependency>
> + <dependency>
> + <groupId>org.apache.geronimo.specs</groupId>
> + <artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
> + <version>1.0.1</version>
> + <scope>compile</scope>
> + </dependency>
> + <dependency>
> + <groupId>org.apache.geronimo.specs</groupId>
> + <artifactId>geronimo-jta_1.0.1B_spec</artifactId>
> + <version>1.0.1</version>
> + <scope>compile</scope>
> + </dependency>
> + <dependency>
> + <groupId>commons-pool</groupId>
> + <artifactId>commons-pool</artifactId>
> + <version>1.3</version>
> + <scope>compile</scope>
> + </dependency>
> + </dependencies>
> + <build>
> + <plugins>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-compiler-plugin</artifactId>
> + <configuration>
> + <source>1.3</source>
> + <target>1.3</target>
> + </configuration>
> + </plugin>
> + <plugin>
> + <groupId>org.codehaus.mojo</groupId>
> + <artifactId>javacc-maven-plugin</artifactId>
> + <executions>
> + <execution>
> + <id>jjtree-jpql</id>
> + <phase>generate-sources</phase>
> + <configuration>
> + <sourceDirectory>
>
> + ${basedir}/src/main/jjtree/org/apache/openjpa/kernel/jpql</sourceDirectory>
> + <outputDirectory>
> + ${project.build.directory
> }/generated-sources/jjtree/org/apache/openjpa/kernel/jpql</outputDirectory>
> + <buildNodeFiles>false</buildNodeFiles>
> + </configuration>
> + <goals>
> + <goal>jjtree</goal>
> + </goals>
> + </execution>
> + <execution>
> + <id>javacc-jpql</id>
> + <phase>generate-sources</phase>
> + <configuration>
> + <sourceDirectory>
> + ${project.build.directory
> }/generated-sources/jjtree/org/apache/openjpa/kernel/jpql</sourceDirectory>
> + <outputDirectory>
> + ${project.build.directory
> }/generated-sources/javacc/org/apache/openjpa/kernel/jpql</outputDirectory>
> + </configuration>
> + <goals>
> + <goal>javacc</goal>
> + </goals>
> + </execution>
> + </executions>
> + </plugin>
> + <plugin>
> + <artifactId>maven-antrun-plugin</artifactId>
> + <executions>
> + <execution>
> + <phase>process-sources</phase>
> + <configuration>
> + <tasks>
> + <delete
> + file="${project.build.directory
> }/generated-sources/javacc/org/apache/openjpa/kernel/jpql/ParseException.java"/>
> + </tasks>
> + </configuration>
> + <goals>
> + <goal>run</goal>
> + </goals>
> + </execution>
> + <execution>
> +
> <id>add-was-interfaces</id>
> +
> <phase>process-classes</phase>
> + <configuration>
> + <tasks>
> + <java
> +
> classname="org.apache.openjpa.util.WASTransformer" classpathref="
> maven.runtime.classpath" />
> + </tasks>
> + </configuration>
> + <goals>
> + <goal>run</goal>
> + </goals>
> + </execution>
> + </executions>
> + </plugin>
> + </plugins>
> + </build>
> +</project>
>
> Modified:
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/AutomaticManagedRuntime.java
> URL:
> http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/AutomaticManagedRuntime.java?view=diff&rev=468064&r1=468063&r2=468064
>
> ==============================================================================
> ---
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/AutomaticManagedRuntime.java
> (original)
> +++
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/AutomaticManagedRuntime.java
> Thu Oct 26 10:08:05 2006
> @@ -1,173 +1,193 @@
> -/*
> - * Copyright 2006 The Apache Software Foundation.
> - *
> - * Licensed under the Apache License, Version 2.0 (the "License");
> - * you may not use this file except in compliance with the License.
> - * You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -package org.apache.openjpa.ee;
> -
> -import java.util.LinkedList;
> -import java.util.List;
> -import javax.transaction.TransactionManager;
> -
> -import org.apache.openjpa.lib.conf.Configurable;
> -import org.apache.openjpa.lib.conf.Configuration;
> -import org.apache.openjpa.lib.util.Localizer;
> -import org.apache.openjpa.util.InvalidStateException;
> -
> -/**
> - * Implementation of the {@link ManagedRuntime} interface that searches
> - * through a set of known JNDI locations and method invocations to locate
> the
> - * appropriate mechanism for obtaining a TransactionManager.
> - * Built in support is provided for the following Application Servers:
> - * <ul>
> - * <li>Bluestone</li>
> - * <li>HP Application Server</li>
> - * <li>JBoss</li>
> - * <li>JRun</li>
> - * <li>OpenEJB</li>
> - * <li>Oracle Application Server</li>
> - * <li>Orion</li>
> - * <li>SunONE</li>
> - * <li>Weblogic</li>
> - * <li>Websphere</li>
> - * </ul>
> - *
> - * @author Marc Prud'hommeaux
> - */
> -public class AutomaticManagedRuntime
> - implements ManagedRuntime, Configurable {
> -
> - private static final String [] JNDI_LOCS = new String []{
> - "javax.transaction.TransactionManager", // weblogic
> - "java:/TransactionManager", // jboss & jrun
> - "java:/DefaultDomain/TransactionManager", // jrun too
> - "java:comp/pm/TransactionManager", // orion & oracle
> - "java:comp/TransactionManager", // generic
> - "java:pm/TransactionManager", // borland
> - };
> - private static final String [] METHODS = new String[]{
> - "com.arjuna.jta.JTA_TransactionManager.transactionManager", // hp
> - "
> com.bluestone.jta.SaTransactionManagerFactory.SaGetTransactionManager",
> - "com.ibm.ejs.jts.jta.JTSXA.getTransactionManager",
> - "
> com.ibm.ejs.jts.jta.TransactionManagerFactory.getTransactionManager",
> - "com.ibm.ws.Transaction.TransactionManagerFactory."
> - + "getTransactionManager", // WS 5.1
> - "org.openejb.OpenEJB.getTransactionManager",
> - "com.sun.jts.jta.TransactionManagerImpl.getTransactionManagerImpl
> ",
> - "com.inprise.visitransact.jta.TransactionManagerImpl."
> - + "getTransactionManagerImpl", // borland
> - };
> - private static final ManagedRuntime WLS;
> - private static final ManagedRuntime SUNONE;
> -
> - private static Localizer _loc = Localizer.forPackage
> - (AutomaticManagedRuntime.class);
> -
> - static {
> - ManagedRuntime mr = null;
> - try {
> - mr = new WLSManagedRuntime();
> - } catch (Throwable t) {
> - }
> - WLS = mr;
> -
> - mr = null;
> - try {
> - mr = new SunOneManagedRuntime();
> - } catch (Throwable t) {
> - }
> - SUNONE = mr;
> - }
> -
> - private Configuration _conf = null;
> - private ManagedRuntime _runtime = null;
> -
> - public TransactionManager getTransactionManager()
> - throws Exception {
> - if (_runtime != null)
> - return _runtime.getTransactionManager();
> -
> - List errors = new LinkedList();
> - TransactionManager tm = null;
> -
> - if (WLS != null) {
> - try {
> - tm = WLS.getTransactionManager();
> - } catch (Throwable t) {
> - errors.add(t);
> - }
> - if (tm != null) {
> - _runtime = WLS;
> - return tm;
> - }
> - }
> -
> - // try to find a jndi runtime
> - JNDIManagedRuntime jmr = new JNDIManagedRuntime();
> - for (int i = 0; i < JNDI_LOCS.length; i++) {
> - jmr.setTransactionManagerName(JNDI_LOCS[i]);
> - try {
> - tm = jmr.getTransactionManager();
> - } catch (Throwable t) {
> - errors.add(t);
> - }
> - if (tm != null) {
> - _runtime = jmr;
> - return tm;
> - }
> - }
> -
> - // look for a method runtime
> - InvocationManagedRuntime imr = new InvocationManagedRuntime();
> - for (int i = 0; i < METHODS.length; i++) {
> - imr.setConfiguration(_conf);
> - imr.setTransactionManagerMethod(METHODS[i]);
> - try {
> - tm = imr.getTransactionManager();
> - } catch (Throwable t) {
> - errors.add(t);
> - }
> - if (tm != null) {
> - _runtime = imr;
> - return tm;
> - }
> - }
> -
> - if (SUNONE != null) {
> - try {
> - tm = SUNONE.getTransactionManager();
> - } catch (Throwable t) {
> - errors.add(t);
> - }
> - if (tm != null) {
> - _runtime = SUNONE;
> - return tm;
> - }
> - }
> -
> - Throwable[] t = (Throwable []) errors.toArray(
> - new Throwable [errors.size()]);
> - throw new InvalidStateException(_loc.get("tm-not-found")).
> - setFatal(true).setNestedThrowables(t);
> - }
> -
> - public void setConfiguration(Configuration conf) {
> - _conf = conf;
> - }
> -
> - public void startConfiguration() {
> - }
> -
> - public void endConfiguration() {
> - }
> -}
> +/*
> + * Copyright 2006 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.openjpa.ee;
> +
> +import java.util.LinkedList;
> +import java.util.List;
> +import javax.transaction.TransactionManager;
> +
> +import org.apache.openjpa.lib.conf.Configurable;
> +import org.apache.openjpa.lib.conf.Configuration;
> +import org.apache.openjpa.lib.util.Localizer;
> +import org.apache.openjpa.util.InvalidStateException;
> +
> +/**
> + * Implementation of the {@link ManagedRuntime} interface that searches
> + * through a set of known JNDI locations and method invocations to locate
> the
> + * appropriate mechanism for obtaining a TransactionManager.
> + * Built in support is provided for the following Application Servers:
> + * <ul>
> + * <li>Bluestone</li>
> + * <li>HP Application Server</li>
> + * <li>JBoss</li>
> + * <li>JRun</li>
> + * <li>OpenEJB</li>
> + * <li>Oracle Application Server</li>
> + * <li>Orion</li>
> + * <li>SunONE</li>
> + * <li>Weblogic</li>
> + * <li>Websphere</li>
> + * </ul>
> + *
> + * @author Marc Prud'hommeaux
> + */
> +public class AutomaticManagedRuntime
> + implements ManagedRuntime, Configurable {
> +
> + private static final String [] JNDI_LOCS = new String []{
> + "javax.transaction.TransactionManager", // weblogic
> + "java:/TransactionManager", // jboss & jrun
> + "java:/DefaultDomain/TransactionManager", // jrun too
> + "java:comp/pm/TransactionManager", // orion & oracle
> + "java:comp/TransactionManager", // generic
> + "java:pm/TransactionManager", // borland
> + };
> + private static final String [] METHODS = new String[]{
> + "com.arjuna.jta.JTA_TransactionManager.transactionManager", // hp
> + "
> com.bluestone.jta.SaTransactionManagerFactory.SaGetTransactionManager",
> + "org.openejb.OpenEJB.getTransactionManager",
> + "com.sun.jts.jta.TransactionManagerImpl.getTransactionManagerImpl
> ",
> + "com.inprise.visitransact.jta.TransactionManagerImpl."
> + + "getTransactionManagerImpl", // borland
> + };
> + private static final ManagedRuntime WLS;
> + private static final ManagedRuntime SUNONE;
> + private static final ManagedRuntime WAS;
> +
> + private static Localizer _loc = Localizer.forPackage
> + (AutomaticManagedRuntime.class);
> +
> + static {
> + ManagedRuntime mr = null;
> + try {
> + mr = new WLSManagedRuntime();
> + } catch (Throwable t) {
> + }
> + WLS = mr;
> +
> + mr = null;
> + try {
> + mr = new SunOneManagedRuntime();
> + } catch (Throwable t) {
> + }
> + SUNONE = mr;
> +
> + mr = null;
> + try {
> + mr = new WASManagedRuntime();
> + }
> + catch(Throwable t) {
> +
> + }
> + WAS= mr;
> +
> + }
> +
> + private Configuration _conf = null;
> + private ManagedRuntime _runtime = null;
> +
> + public TransactionManager getTransactionManager()
> + throws Exception {
> + if (_runtime != null)
> + return _runtime.getTransactionManager();
> +
> + List errors = new LinkedList();
> + TransactionManager tm = null;
> +
> + if (WLS != null) {
> + try {
> + tm = WLS.getTransactionManager();
> + } catch (Throwable t) {
> + errors.add(t);
> + }
> + if (tm != null) {
> + _runtime = WLS;
> + return tm;
> + }
> + }
> +
> + if (WAS != null) {
> + try {
> + ((Configurable)WAS).setConfiguration(_conf);
> + tm = WAS.getTransactionManager();
> + } catch (Throwable t) {
> + errors.add(t);
> + }
> + if (tm != null) {
> + _runtime = WAS;
> + return tm;
> + }
> + }
> +
> + // try to find a jndi runtime
> + JNDIManagedRuntime jmr = new JNDIManagedRuntime();
> + for (int i = 0; i < JNDI_LOCS.length; i++) {
> + jmr.setTransactionManagerName(JNDI_LOCS[i]);
> + try {
> + tm = jmr.getTransactionManager();
> + } catch (Throwable t) {
> + errors.add(t);
> + }
> + if (tm != null) {
> + _runtime = jmr;
> + return tm;
> + }
> + }
> +
> + // look for a method runtime
> + InvocationManagedRuntime imr = new InvocationManagedRuntime();
> + for (int i = 0; i < METHODS.length; i++) {
> + imr.setConfiguration(_conf);
> + imr.setTransactionManagerMethod(METHODS[i]);
> + try {
> + tm = imr.getTransactionManager();
> + } catch (Throwable t) {
> + errors.add(t);
> + }
> + if (tm != null) {
> + _runtime = imr;
> + return tm;
> + }
> + }
> +
> + if (SUNONE != null) {
> + try {
> + tm = SUNONE.getTransactionManager();
> + } catch (Throwable t) {
> + errors.add(t);
> + }
> + if (tm != null) {
> + _runtime = SUNONE;
> + return tm;
> + }
> + }
> +
> + Throwable[] t = (Throwable []) errors.toArray(
> + new Throwable [errors.size()]);
> + throw new InvalidStateException(_loc.get("tm-not-found")).
> + setFatal(true).setNestedThrowables(t);
> + }
> +
> + public void setConfiguration(Configuration conf) {
> + _conf = conf;
> + }
> +
> + public void startConfiguration() {
> + }
> +
> + public void endConfiguration() {
> + }
> +}
>
> Added:
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/WASManagedRuntime.java
> URL:
> http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/WASManagedRuntime.java?view=auto&rev=468064
>
> ==============================================================================
> ---
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/WASManagedRuntime.java
> (added)
> +++
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/WASManagedRuntime.java
> Thu Oct 26 10:08:05 2006
> @@ -0,0 +1,458 @@
> +/*
> + * Copyright 2006 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.openjpa.ee;
> +
> +import java.lang.reflect.Method;
> +
> +import javax.naming.Context;
> +import javax.naming.InitialContext;
> +import javax.naming.NamingException;
> +import javax.transaction.HeuristicMixedException;
> +import javax.transaction.HeuristicRollbackException;
> +import javax.transaction.InvalidTransactionException;
> +import javax.transaction.NotSupportedException;
> +import javax.transaction.RollbackException;
> +import javax.transaction.Status;
> +import javax.transaction.Synchronization;
> +import javax.transaction.SystemException;
> +import javax.transaction.Transaction;
> +import javax.transaction.xa.XAResource;
> +
> +import org.apache.openjpa.conf.OpenJPAConfiguration;
> +import org.apache.openjpa.lib.conf.Configurable;
> +import org.apache.openjpa.lib.conf.Configuration;
> +import org.apache.openjpa.lib.log.Log;
> +import org.apache.openjpa.lib.util.Localizer;
> +import org.apache.openjpa.util.InvalidStateException;
> +import org.apache.openjpa.util.NoTransactionException;
> +
> +/**
> + * {@link ManagedRuntime} implementation that allows synchronization with
> a
> + * WebSphere managed transaction.
> + *
> + * <P>
> + * WebSphere Application Server does not expose the TransactionManager to
> an
> + * application. Instead it provides a proprietary interface to register
> for
> + * synchronization and obtain transaction ids.
> + *
> + * <P>
> + * WASManagedRuntime provides the wrapper classes needed to interact with
> the
> + * WAS proprietary interface and the OpenJPA kernel.
> + *
> + * @author Michael Dick, Kevin Sutter
> + */
> +public class WASManagedRuntime implements ManagedRuntime, Configurable {
> +
> + private static Localizer _loc =
> + Localizer.forPackage(WASManagedRuntime.class);
> +
> + protected Object _extendedTransaction = null;
> +
> + protected Method _getGlobalId = null;
> +
> + protected Method _getLocalId = null;
> +
> + protected Method _registerSync = null;
> +
> + OpenJPAConfiguration _conf = null;
> +
> + Log _log = null;
> +
> + /**
> + * Lookup the extendedTransaction object from JNDI.
> + *
> + * @throws NamingException
> + */
> + private void getExtendedTransaction() throws NamingException {
> +
> + if (_extendedTransaction == null) {
> + Context ctx = new InitialContext();
> + try {
> + _extendedTransaction =
> + ctx.lookup
> ("java:comp/websphere/ExtendedJTATransaction");
> +
> + } finally {
> + ctx.close();
> + }
> + }
> + }
> +
> + /**
> + * Caches the WebSphere proprietary methods for
> ExtendedJTATransaction.
> + */
> + private void getWebSphereMethods() throws Exception {
> + ClassLoader loader =
> + _conf.getClassResolverInstance().getClassLoader(getClass(),
> null);
> +
> + Class extendedJTATransaction =
> + Class.forName(
> + "com.ibm.websphere.jtaextensions.ExtendedJTATransaction",
> true,
> + loader);
> +
> + _registerSync =
> + extendedJTATransaction.getMethod(
> + "registerSynchronizationCallbackForCurrentTran",
> + new Class[] { Class.forName(
> + "
> com.ibm.websphere.jtaextensions.SynchronizationCallback",
> + true, loader) });
> +
> + _getGlobalId = extendedJTATransaction.getMethod("getGlobalId",
> null);
> +
> + _getLocalId = extendedJTATransaction.getMethod("getLocalId",
> null);
> + }
> +
> + /**
> + * Gets an extendedJTATransaction from JNDI and creates a transaction
> + * wrapper
> + */
> + public javax.transaction.TransactionManager getTransactionManager()
> + throws Exception {
> + getExtendedTransaction();
> + return new WASTransaction();
> + }
> +
> + /**
> + * Transaction wrapper for WebSphere. WebSphere exposes a subset of
> the
> + * Transaction and TransactionManager interfaces to the customer. Any
> + * methods which are not exposed by WebSphere will throw an
> + * IllegalStateException to the caller.
> + *
> + * <P>
> + * Methods supporded by WAS are
> + * <UL>
> + * <LI>RegisterSynchronization </LI>
> + * <LI>GetStatus</LI>
> + * </UL>
> + */
> + class WASTransaction implements javax.transaction.TransactionManager,
> + javax.transaction.Transaction {
> +
> + public int getStatus() throws SystemException {
> + int rval = Status.STATUS_UNKNOWN;
> +
> + try {
> + if (getId() != null) {
> + rval = Status.STATUS_ACTIVE;
> + } else {
> +
> + if (_log != null && _log.isErrorEnabled()) {
> + _log.error(_loc.get("was-no-transaction"));
> + }
> +
> + throw new NoTransactionException(_loc
> + .get("was-no-transaction"));
> + }
> + } catch (Exception e) {
> +
> + if (_log != null && _log.isErrorEnabled()) {
> + _log.error(_loc.get("was-no-transaction"), e);
> + }
> + throw new
> NoTransactionException(_loc.get("was-no-transaction"))
> + .setCause(e);
> + }
> + return rval;
> + }
> +
> + /**
> + * Provides a Transaction wrapper. The transaction wrapper mayb
> only be
> + * used to determine the status of the current transaction.
> WebSphere
> + * does not allow direct control of container transactions.
> + *
> + * @return A WebSphere transaction wrapper.
> + */
> + public Transaction getTransaction() throws SystemException {
> + return this;
> + }
> +
> + /**
> + * Register for synchronization with a WebSphere managed
> transaction via
> + * the extendedJTATransaction interface.
> + */
> + public void registerSynchronization(Synchronization arg0)
> + throws IllegalStateException, RollbackException,
> SystemException {
> +
> + if (_extendedTransaction != null) {
> + try {
> + if (_registerSync == null) {
> + getWebSphereMethods();
> + }
> + _registerSync.invoke(_extendedTransaction,
> + new Object[] { new WASSynchronization(arg0) });
> + } catch (Exception e) {
> + if (_log != null && _log.isErrorEnabled()) {
> + _log.error(_loc.get("was-reflection-exception"),
> e);
> + }
> +
> + throw new InvalidStateException(_loc
> + .get("was-reflection-exception")).setCause(e);
> + }
> + } else {
> + if (_log != null && _log.isErrorEnabled()) {
> + _log.error(_loc.get("was-lookup-error"));
> + }
> +
> + throw new
> InvalidStateException(_loc.get("was-lookup-error"));
> + }
> + }
> +
> + /**
> + * Determines the ID of the current WebSphere managed transaction
> using
> + * the extendedJTATransaction interface
> + *
> + * @return If a GlobalTransaction is active a byte[] ID will be
> + * returned. If a LocalTransaction is active an int ID
> will be
> + * returned.
> + *
> + * @throws Exception
> + */
> + private Object getId() throws Exception {
> + Object rval;
> +
> + rval = getGlobalId();
> +
> + if (rval == null) {
> + rval = getLocalId();
> + }
> +
> + if (rval instanceof Integer && ((Integer) rval).intValue() ==
> 0) {
> + /*
> + * If there's no globalId or localId we're running
> outside of a
> + * transaction and need to throw an error.
> + */
> + if (_log != null && _log.isErrorEnabled()) {
> + _log.error(_loc.get("was-no-transaction"));
> + }
> + throw new
> NoTransactionException(_loc.get("was-no-transaction"));
> + }
> + return rval;
> + }
> +
> + /**
> + * Gets the GlobalTransaction ID of the WebSphere managed
> transaction.
> + * If no Global Transaction is active null will be returned.
> + *
> + * @return Null if a global transaction is not active or if an
> error
> + * occurs. byte[] id if a global transaction is active.
> + */
> + private byte[] getGlobalId() {
> +
> + byte[] rval = null;
> +
> + try {
> + if(_getGlobalId == null) {
> + getWebSphereMethods();
> + }
> + rval = (byte[]) _getGlobalId.invoke(_extendedTransaction,
> null);
> + } catch (Exception e) {
> + if (_log != null && _log.isErrorEnabled()) {
> + _log.error(_loc.get("was-reflection-exception"), e);
> + }
> +
> + throw new InvalidStateException(_loc
> + .get("was-reflection-exception")).setCause(e);
> + }
> +
> + return rval;
> + }
> +
> + /**
> + * Gets the LocalTransaction ID of the WebSphere managed
> transaction. If
> + * a LocalTransaction is not active 0 will be returned.
> + *
> + * @return LocalTransaction ID. 0 if a LocalTransaction is not
> active or
> + * if an error occurs.
> + */
> + private Integer getLocalId() {
> + Integer rval;
> +
> + try {
> + if(_getLocalId == null) {
> + getWebSphereMethods();
> + }
> + rval = (Integer) _getLocalId.invoke(_extendedTransaction,
> null);
> + } catch (Exception e) {
> + if (_log != null && _log.isErrorEnabled()) {
> + _log.error(_loc.get("was-reflection-exception"), e);
> + }
> + throw new InvalidStateException(_loc
> + .get("was-reflection-exception")).setCause(e);
> + }
> + return rval;
> + }
> +
> + /**
> + * Unimplemented, WAS does not provide this level of control.
> Throws an
> + * IllegalStateException
> + */
> + public void begin() throws NotSupportedException, SystemException
> {
> + throw new
> InvalidStateException(_loc.get("was-unsupported-op",
> + "begin"));
> + }
> +
> + /**
> + * Unimplemented, WAS does not provide this level of control.
> Throws an
> + * IllegalStateException
> + */
> + public void commit() throws HeuristicMixedException,
> + HeuristicRollbackException, IllegalStateException,
> + RollbackException, SecurityException, SystemException {
> + throw new
> InvalidStateException(_loc.get("was-unsupported-op",
> + "commit"));
> + }
> +
> + /**
> + * Unimplemented, WAS does not provide this level of control.
> Throws an
> + * IllegalStateException
> + */
> + public void resume(Transaction arg0) throws
> IllegalStateException,
> + InvalidTransactionException, SystemException {
> + throw new
> InvalidStateException(_loc.get("was-unsupported-op",
> + "resume"));
> + }
> +
> + /**
> + * Unimplemented, WAS does not provide this level of control.
> Throws an
> + * IllegalStateException
> + */
> + public void rollback() throws IllegalStateException,
> SecurityException,
> + SystemException {
> + throw new
> InvalidStateException(_loc.get("was-unsupported-op",
> + "rollback"));
> + }
> +
> + /**
> + * Unimplemented, WAS does not provide this level of control.
> Throws an
> + * IllegalStateException
> + */
> + public void setRollbackOnly() throws IllegalStateException,
> + SystemException {
> + throw new
> InvalidStateException(_loc.get("was-unsupported-op",
> + "setRollbackOnly"));
> + }
> +
> + /**
> + * Unimplemented, WAS does not provide this level of control.
> Throws an
> + * IllegalStateException
> + */
> + public void setTransactionTimeout(int arg0) throws
> SystemException {
> + throw new
> InvalidStateException(_loc.get("was-unsupported-op",
> + "setTransactionTimeout"));
> + }
> +
> + /**
> + * Unimplemented, WAS does not provide this level of control.
> Throws an
> + * IllegalStateException
> + */
> + public Transaction suspend() throws SystemException {
> + throw new
> InvalidStateException(_loc.get("was-unsupported-op",
> + "suspend"));
> + }
> +
> + /**
> + * Unimplemented, WAS does not provide this level of control.
> Throws an
> + * IllegalStateException
> + */
> + public boolean delistResource(XAResource arg0, int arg1)
> + throws IllegalStateException, SystemException {
> + throw new
> InvalidStateException(_loc.get("was-unsupported-op",
> + "delistResource"));
> + }
> +
> + /**
> + * Unimplemented, WAS does not provide this level of control.
> Throws an
> + * IllegalStateException
> + */
> + public boolean enlistResource(XAResource arg0)
> + throws IllegalStateException, RollbackException,
> SystemException {
> + throw new
> InvalidStateException(_loc.get("was-unsupported-op",
> + "enlistResource"));
> + }
> + }
> +
> + /**
> + * WASSynchronization wrapper. This class translates the WAS
> proprietary
> + * synchronization callback methods to
> javax.transaction.Synchronization
> + * methods.
> + *
> + * <P>
> + * This class implements the
> + * com.ibm.websphere.jtaextensions.SynchronizationCallback interface.
> Since
> + * SynchronizationCallback is not available at compile time we use
> Serp to
> + * add the interface to the class after all classes have been
> compiled.
> + *
> + * <P>
> + * SynchronizationCallback is expected to be available whenever this
> class
> + * is instantiated, therefore this class should only be used when
> running in
> + * WebSphere.
> + *
> + * @see org.apache.openjpa.util.WASTransformer
> + */
> + static class WASSynchronization {
> + Synchronization _sync = null;
> +
> + WASSynchronization(Synchronization sync) {
> + _sync = sync;
> + }
> +
> + /**
> + * AfterCompletion wrapper. Translates the WAS proprietary call
> to a
> + * javax.transaction.Synchronization call.
> + */
> + public void afterCompletion(int localTransactionId,
> + byte[] globalTransactionId, boolean committed) {
> + if (_sync != null) {
> + if (committed) {
> + _sync.afterCompletion(Status.STATUS_COMMITTED);
> + } else {
> + _sync.afterCompletion(Status.STATUS_UNKNOWN);
> + }
> + }
> + }
> +
> + /**
> + * BeforeCompletion wrapper. Translates WAS proprietary call to a
> + * javax.transaction.Synchronization call.
> + */
> + public void beforeCompletion(int arg0, byte[] arg1) {
> + if (_sync != null) {
> + _sync.beforeCompletion();
> + }
> + }
> + }
> +
> + /**
> + * Caches a copy of the configuration. The configuration is used to
> obtain
> + * the logger and classloader.
> + */
> + public void setConfiguration(Configuration conf) {
> + _conf = (OpenJPAConfiguration) conf;
> + _log = _conf.getLog(OpenJPAConfiguration.LOG_RUNTIME);
> + }
> +
> + /**
> + * EndConfiguration stub.
> + */
> + public void endConfiguration() {
> + // Nothing to do
> + }
> +
> + /**
> + * StartConfiguration stub.
> + */
> + public void startConfiguration() {
> + // Nothing to do
> + }
> +}
>
> Added:
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WASTransformer.java
> URL:
> http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WASTransformer.java?view=auto&rev=468064
>
> ==============================================================================
> ---
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WASTransformer.java
> (added)
> +++
> incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WASTransformer.java
> Thu Oct 26 10:08:05 2006
> @@ -0,0 +1,57 @@
> +/*
> + * Copyright 2006 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.openjpa.util;
> +
> +import serp.bytecode.BCClass;
> +import serp.bytecode.Project;
> +
> +/**
> + * WASTransformer uses Serp to add WebSphere proprietary interface to
> + * WASManagedRuntime$WASSynchronization. The interface is added at build
> time.
> + * The WebSphere extensions classes must be found on the classpath
> whenever an
> + * instance of WASManagedRuntime$WASSynchronization is instantiated.
> + *
> + * @author Michael Dick
> + *
> + */
> +public class WASTransformer {
> +
> + /**
> + * Class that will be modified
> + */
> + public static final String _class =
> + "org.apache.openjpa.ee.WASManagedRuntime$WASSynchronization";
> +
> + /**
> + * Interface which will be added
> + */
> + public static final String _interface =
> + "com.ibm.websphere.jtaextensions.SynchronizationCallback";
> +
> + public static void main(String[] args) {
> +
> + Project project = new Project();
> +
> + BCClass bcClass = project.loadClass(_class);
> +
> + bcClass.declareInterface(_interface);
> + try {
> + bcClass.write();
> + } catch (Exception e) {
> + System.err.println(e);
> + }
> + }
> +}
>
> Modified:
> incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/ee/localizer.properties
> URL:
> http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/ee/localizer.properties?view=diff&rev=468064&r1=468063&r2=468064
>
> ==============================================================================
> ---
> incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/ee/localizer.properties
> (original)
> +++
> incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/ee/localizer.properties
> Thu Oct 26 10:08:05 2006
> @@ -1,8 +1,31 @@
> -tm-not-found: Could not perform automatic lookup of EJB container''s \
> - javax.transaction.TransactionManager implementation. Please ensure
> that \
> - you are running the application from within an EJB 1.1 compliant
> EJB \
> - container, and then set the org.apache.openjpa.ManagedRuntimeproperty to the \
> - appropriate value to obtain the TransactionManager.
> -expected-reference: Expected object to be of type Reference, but instead
> was \
> - "{0}".
> -not-supported: This operation is not supported.
> +tm-not-found: Could not perform automatic lookup of EJB container''s \
> + javax.transaction.TransactionManager implementation. Please ensure
> that \
> + you are running the application from within an EJB 1.1 compliant
> EJB \
> + container, and then set the org.apache.openjpa.ManagedRuntimeproperty to the \
> + appropriate value to obtain the TransactionManager.
> +expected-reference: Expected object to be of type Reference, but instead
> was \
> + "{0}".
> +not-supported: This operation is not supported.
> +was-unsupported-op: Unable to execute {0} on a WebSphere managed
> transaction. \
> + WebSphere does not support direct manipulation of managed
> transactions.
> +was-no-transaction: Unable to detect a WebSphere transaction context. \
> Please ensure \
> + that you are running the application from within WebSphere
> Application Server \
> + (version 5.0.2 or newer) and the application has not spun a
> thread. \
> + If the application does manage its own threads the behavior is
> undefined.
> +was-reflection-exception: An error occured reflecting WebSphere
> proprietary \
> + interfaces. Please ensure that you are running the application
> from within \
> + WebSphere Application Server (version 5.0.2 or newer).
> +was-lookup-error: An error occurred looking up the WebSphere extended JTA
> \
> + service. Please ensure that you are running the application from
> within WebSphere \
> + Application Server (version 5.0.2 or newer).was-unsupported-op:
> Unable to execute {0} on a WebSphere managed transaction. \
> + WebSphere does not support direct manipulation of managed
> transactions.
> +was-no-transaction: Unable to detect a WebSphere transaction context. \
> Please ensure \
> + that you are running the application from within WebSphere
> Application Server \
> + (version 5.0.2 or newer) and the application has not spun a
> thread. \
> + If the application does manage its own threads the behavior is
> undefined.
> +was-reflection-exception: An error occured reflecting WebSphere
> proprietary \
> + interfaces. Please ensure that you are running the application
> from within \
> + WebSphere Application Server (version 5.0.2 or newer).
> +was-lookup-error: An error occurred looking up the WebSphere extended JTA
> \
> + service. Please ensure that you are running the application from
> within WebSphere \
> + Application Server (version 5.0.2 or newer).
> \ No newline at end of file
>
> Added:
> incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/util/TestWASTransformer.java
> URL:
> http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/util/TestWASTransformer.java?view=auto&rev=468064
>
> ==============================================================================
> ---
> incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/util/TestWASTransformer.java
> (added)
> +++
> incubator/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/util/TestWASTransformer.java
> Thu Oct 26 10:08:05 2006
> @@ -0,0 +1,54 @@
> +/*
> + * Copyright 2006 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.openjpa.util;
> +
> +import junit.framework.TestCase;
> +
> +import org.apache.openjpa.util.WASTransformer;
> +
> +/**
> + * Test class for WASTransformer.
> + *
> + */
> +public class TestWASTransformer extends TestCase {
> +
> + /**
> + * This test will verify that the
> WASManagedRuntime$WASSynchronization
> + * class was properly modified by the maven build process (reference
> + * the top level pom.xml). This testcase will not execute properly
> + * within Eclipse since the Eclipse target directory (probably)
> hasn't
> + * been modified via the maven build.
> + *
> + * @throws ClassNotFoundException
> + * @author Michael Dick
> + */
> + public void testInterfaceAdded()throws ClassNotFoundException {
> +
> + boolean caughtExpectedException = false;
> +
> + Class syncClass = null;
> +
> + try {
> + syncClass = Class.forName(WASTransformer._class);
> + } catch (NoClassDefFoundError e) {
> + if (e.getMessage().contains(WASTransformer._interface)) {
> + caughtExpectedException = true;
> + }
> + }
> + assertNull(syncClass);
> + assertTrue(caughtExpectedException);
> + }
> +}
>
>
>