blob: 0c3fbf18c443128dd590eef649ed75733b9dbd8e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 javax.transaction.NotSupportedException;
import javax.transaction.SystemException;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.util.GeneralException;
/*
* AbstractManagedRuntime.java
*
* Created on August 2, 2007, 2:38 PM
*
*/
public abstract class AbstractManagedRuntime implements ManagedRuntime {
private static Localizer _loc =
Localizer.forPackage(AbstractManagedRuntime.class);
/**
* Returns a transaction key that can be used to associate transactions
* and Brokers.
* The default implementation returns the Transaction associated
* with the current thread's transaction.
* @return the transaction key
*/
@Override
public Object getTransactionKey() throws Exception, SystemException {
return getTransactionManager().getTransaction();
}
/**
* <P>
* Do a unit of work which will execute outside of the current managed
* transaction. The default implementation suspends the transaction prior to
* execution, and resumes the transaction afterwards.
* </P>
*
* @param runnable
* The runnable wrapper for the work that will be done. The
* runnable object should be fully initialized with any state
* needed to execute.
*
* @throws NotSupportedException
* if the current transaction can not be obtained, or an error
* occurs when suspending or resuming the transaction.
*/
@Override
public void doNonTransactionalWork(Runnable runnable) throws
NotSupportedException {
TransactionManager tm = null;
Transaction transaction = null;
try {
tm = getTransactionManager();
}
catch(Exception e) {
NotSupportedException nse =
new NotSupportedException(e.getMessage());
nse.initCause(e);
throw nse;
}
try {
transaction = tm.suspend();
} catch (Exception e) {
NotSupportedException nse = new NotSupportedException(
_loc.get("exc-suspend-tran", e.getClass()).getMessage());
nse.initCause(e);
throw nse;
}
runnable.run();
try {
tm.resume(transaction);
} catch (Exception e) {
try {
transaction.setRollbackOnly();
}
catch(SystemException se2) {
throw new GeneralException(se2);
}
NotSupportedException nse =
new NotSupportedException(
_loc.get("exc-resume-tran", e.getClass()).getMessage());
nse.initCause(e);
throw nse;
}
}
}