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

com.sun.ejb.containers.SingletonContextImpl Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2022 Contributors to the Eclipse Foundation
 * Copyright (c) 1997, 2020 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 v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.ejb.containers;

import jakarta.ejb.TimerService;
import jakarta.transaction.Status;
import jakarta.transaction.TransactionManager;

import java.util.logging.Level;

import javax.naming.InitialContext;

import static org.glassfish.api.naming.SimpleJndiName.JNDI_CTX_JAVA;
import static org.glassfish.api.naming.SimpleJndiName.JNDI_CTX_JAVA_COMPONENT_ENV;

/**
 * Implementation of EJBContext for Singleton SessionBeans
 *
 * @author Mahesh Kannan
 */
public final class SingletonContextImpl extends AbstractSessionContextImpl {

    SingletonContextImpl(Object ejb, BaseContainer container) {
        super(ejb, container);
        try {
            initialContext = new InitialContext();
        } catch (Exception ex) {
            _logger.log(Level.FINE, "Exception in creating InitialContext", ex);
        }

    }


    @Override
    public TimerService getTimerService() throws IllegalStateException {

        // Instance key is first set after dependency injection but
        // before ejbCreate
        if ( instanceKey == null ) {
            throw new IllegalStateException("Operation not allowed");
        }

        EJBTimerService timerService = EJBTimerService.getValidEJBTimerService();
        return new EJBTimerServiceWrapper(timerService, this);

    }


    @Override
    public void setRollbackOnly() throws IllegalStateException {
        if (instanceKey == null) {
            throw new IllegalStateException("Singleton setRollbackOnly not allowed");
        }

        if (container.isBeanManagedTran) {
            throw new IllegalStateException("Illegal operation for bean-managed transactions");
        }

        doGetSetRollbackTxAttrCheck();

        TransactionManager tm = EjbContainerUtilImpl.getInstance().getTransactionManager();

        try {
            if (tm.getStatus() == Status.STATUS_NO_TRANSACTION) {
                // EJB might be in a non-business method (for SessionBeans)
                // or afterCompletion.
                // OR this was a NotSupported/Never/Supports
                // EJB which was invoked without a global transaction.
                // In that case the JDBC connection would have autoCommit=true
                // so the container doesnt have to do anything.
                throw new IllegalStateException("No transaction context.");
            }

            tm.setRollbackOnly();

        } catch (Exception ex) {
            IllegalStateException illEx = new IllegalStateException(ex.toString());
            illEx.initCause(ex);
            throw illEx;
        }
    }


    @Override
    public boolean getRollbackOnly() throws IllegalStateException {
        if (instanceKey == null) {
            throw new IllegalStateException("Singleton getRollbackOnly not allowed");
        }

        if (container.isBeanManagedTran) {
            throw new IllegalStateException("Illegal operation for bean-managed transactions");
        }

        doGetSetRollbackTxAttrCheck();

        TransactionManager tm = EjbContainerUtilImpl.getInstance().getTransactionManager();

        try {
            int status = tm.getStatus();
            if (status == Status.STATUS_NO_TRANSACTION) {
                // EJB which was invoked without a global transaction.
                throw new IllegalStateException("No transaction context.");
            }

            return status == Status.STATUS_MARKED_ROLLBACK || status == Status.STATUS_ROLLEDBACK
                || status == Status.STATUS_ROLLING_BACK;

        } catch (Exception ex) {
            IllegalStateException illEx = new IllegalStateException(ex.toString());
            illEx.initCause(ex);
            throw illEx;
        }
    }


    @Override
    public void checkTimerServiceMethodAccess() throws IllegalStateException {
        if (instanceKey == null) {
            throw new IllegalStateException("EJB Timer method calls cannot be called in this context");
        }
    }


    @Override
    public synchronized Object lookup(String name) {
        if (name == null) {
            throw new IllegalArgumentException("Argument is null");
        }
        if (initialContext == null) {
            throw new IllegalArgumentException("InitialContext is null");
        }
        try {
            // if name starts with java: use it as is. Otherwise, treat it
            // as relative to the private component namespace.
            String lookupString = name.startsWith(JNDI_CTX_JAVA) ? name : JNDI_CTX_JAVA_COMPONENT_ENV + name;

            return initialContext.lookup(lookupString);
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy