All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sun.enterprise.transaction.TransactionSynchronizationRegistryImpl Maven / Gradle / Ivy

There is a newer version: 7.2024.1.Alpha1
Show newest version
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 1997-2012 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */

package com.sun.enterprise.transaction;

import jakarta.transaction.Synchronization;
import jakarta.transaction.Status;
import jakarta.transaction.SystemException;
import jakarta.transaction.RollbackException;
import jakarta.transaction.TransactionManager;
import jakarta.transaction.TransactionSynchronizationRegistry;

import com.sun.enterprise.util.i18n.StringManager;

import jakarta.inject.Inject;
import org.jvnet.hk2.annotations.Service;
import org.jvnet.hk2.annotations.ContractsProvided;

@Service
@ContractsProvided({TransactionSynchronizationRegistryImpl.class,
                    TransactionSynchronizationRegistry.class}) // Needed because we can't change spec provided class
public class TransactionSynchronizationRegistryImpl 
             implements TransactionSynchronizationRegistry {

    @Inject
    private transient TransactionManager transactionManager;

    private static StringManager sm = 
                   StringManager.getManager(TransactionSynchronizationRegistryImpl.class);

    public TransactionSynchronizationRegistryImpl() {
    }

    public TransactionSynchronizationRegistryImpl(TransactionManager t) {
        transactionManager = t;
    }

    /**
     * Return an opaque object to represent the transaction bound to the
     * current thread at the time this method is called. The returned object
     * overrides hashCode and equals methods to allow
     * its use as the key in a java.util.HashMap for use by the
     * caller. If there is no transaction currently active, null is returned.
     *
     * 

The returned object will return the same hashCode and * compare equal to all other objects returned by calling this method * from any component executing in the same transaction context in the * same application server. * *

The toString method returns a String * that might be usable by a human reader to usefully understand the * transaction context. The result of the toString method * is otherwise not defined. Specifically, there is no forward or backward * compatibility guarantee for the result returned by the * toString method. * *

The object is not necessarily serializable, and is not useful * outside the virtual machine from which it was obtained. * * @return An object representing the current transaction, * or null if no transaction is active. */ public Object getTransactionKey() { try { return transactionManager.getTransaction(); } catch (SystemException ex) { return null; } } /** * Add an object to the map of resources being managed for * the current transaction. The supplied key must be of a caller- * defined class so as not to conflict with other users. The class * of the key must guarantee that the hashCode and * equals methods are suitable for keys in a map. * The key and value are not examined or used by the implementation. * * @param key The key for looking up the associated value object. * * @param value The value object to keep track of. * * @exception IllegalStateException Thrown if the current thread * is not associated with a transaction. */ public void putResource(Object key, Object value) { try { JavaEETransactionImpl tran = (JavaEETransactionImpl)transactionManager.getTransaction(); if (tran == null) throw new IllegalStateException( sm.getString("enterprise_distributedtx.no_transaction")); tran.putUserResource(key, value); } catch (SystemException ex) { throw new IllegalStateException( sm.getString("enterprise_distributedtx.no_transaction")); } } /** * Get an object from the map of resources being managed for * the current transaction. The key must have been supplied earlier * by a call to putResouce in the same transaction. If the key * cannot be found in the current resource map, null is returned. * * @param key The key for looking up the associated value object. * * @return The value object, or null if not found. * * @exception IllegalStateException Thrown if the current thread * is not associated with a transaction. */ public Object getResource(Object key){ try { JavaEETransactionImpl tran = (JavaEETransactionImpl)transactionManager.getTransaction(); if (tran == null) throw new IllegalStateException( sm.getString("enterprise_distributedtx.no_transaction")); return tran.getUserResource(key); } catch (SystemException ex) { throw new IllegalStateException( sm.getString("enterprise_distributedtx.no_transaction")); } } /** * Register a Synchronization instance with special ordering * semantics. The beforeCompletion method on the registered * Synchronization will be called after all user and * system component beforeCompletion callbacks, but before * the 2-phase commit process starts. This allows user and system components to * flush state changes to the caching manager, during their * SessionSynchronization callbacks, and allows managers * to flush state changes to Connectors, during the callbacks * registered with this method. Similarly, the afterCompletion * callback will be called after 2-phase commit completes but before * any user and system afterCompletion callbacks. * *

The beforeCompletion callback will be invoked in the * transaction context of the current transaction bound to the thread * of the caller of this method, which is the same transaction context * active at the time this method is called. Allowable methods include * access to resources, for example, Connectors. No access is allowed to * user components, for example, timer services or bean methods, * as these might change the state of POJOs, or plain old Java objects, * being managed by the caching manager. * *

The afterCompletion callback will be invoked in an * undefined transaction context. No access is permitted to resources or * user components as defined above. Resources can be closed, but * no transactional work can be performed with them. * *

Other than the transaction context, no component J2EE context is * active during either of the callbacks. * * @param sync The synchronization callback object. * * @exception IllegalStateException Thrown if the current thread * is not associated with a transaction. */ public void registerInterposedSynchronization(Synchronization sync) { try { JavaEETransactionImpl tran = (JavaEETransactionImpl)transactionManager.getTransaction(); if (tran == null) throw new IllegalStateException( sm.getString("enterprise_distributedtx.no_transaction")); tran.registerInterposedSynchronization(sync); } catch (SystemException ex) { throw new IllegalStateException( sm.getString("enterprise_distributedtx.no_transaction")); } catch (RollbackException ex) { throw new IllegalStateException( sm.getString("enterprise_distributedtx.mark_rollback")); } } /** * Returns the status of the transaction bound to the current thread. * This is the result of executing getStatus method on the * TransactionManager, in the current transaction context. * * @return The status of the current transaction. */ public int getTransactionStatus() { try { return transactionManager.getStatus(); } catch (SystemException ex) { return Status.STATUS_NO_TRANSACTION; } } /** * Set the rollbackOnly status of the transaction bound to the * current thread. * * @exception IllegalStateException Thrown if the current thread * is not associated with a transaction. */ public void setRollbackOnly() { try { transactionManager.setRollbackOnly(); } catch (SystemException ex) { throw new IllegalStateException( sm.getString("enterprise_distributedtx.no_transaction")); } } /** * Get the rollbackOnly status of the transaction bound to the * current thread. * * @return true, if the current transaction is marked for rollback only. * * @exception IllegalStateException Thrown if the current thread * is not associated with a transaction. */ public boolean getRollbackOnly() { { int status = getTransactionStatus(); if ( status == Status.STATUS_NO_TRANSACTION ) { throw new IllegalStateException( sm.getString("enterprise_distributedtx.no_transaction")); } if ( status == Status.STATUS_MARKED_ROLLBACK || status == Status.STATUS_ROLLING_BACK ) return true; else return false; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy