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

org.hibersap.ejb.interceptor.HibersapSessionInterceptor Maven / Gradle / Ivy

/*
 * Copyright (c) 2008-2014 akquinet tech@spree GmbH
 *
 * This file is part of Hibersap.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this software 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.hibersap.ejb.interceptor;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibersap.HibersapException;
import org.hibersap.session.Session;
import org.hibersap.session.SessionManager;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import static java.lang.String.format;
import static org.hibersap.ejb.util.ReflectionUtil.getHibersapSessionFields;
import static org.hibersap.ejb.util.ReflectionUtil.getSessionManagerJndiName;
import static org.hibersap.ejb.util.ReflectionUtil.injectSessionIntoTarget;

public class HibersapSessionInterceptor {

    private static final String HIBERSAP_SESSION_PREFIX = "hibersap.session.";

    private static final Log LOGGER = LogFactory.getLog( HibersapSessionInterceptor.class );

    @AroundInvoke
    public Object injectSessionsIntoEjb( final InvocationContext ctx ) throws Exception {
        Set sessionFields = getHibersapSessionFields( ctx.getTarget() );

        Map sessionsCreated = new HashMap();
        try {
            for ( Field sessionField : sessionFields ) {
                String jndiName = getSessionManagerJndiName( sessionField );
                String key = HIBERSAP_SESSION_PREFIX + jndiName;
                Session session = (Session) ctx.getContextData().get( key );

                if ( session == null ) {
                    LOGGER.debug( "Erzeuge Hibersap-Session f�r SessionManager " + jndiName );
                    session = openSession( jndiName );
                    sessionsCreated.put( session, jndiName );
                    ctx.getContextData().put( key, session );
                }

                injectSessionIntoTarget( ctx.getTarget(), sessionField, session );
            }

            return ctx.proceed();
        } finally {
            closeSessions( sessionsCreated, ctx.getContextData() );
        }
    }

    private void closeSessions( final Map sessions, final Map contextData ) {
        Set sessionManagerNamesWithError = new HashSet();
        for ( Session session : sessions.keySet() ) {
            String jndiName = sessions.get( session );
            try {
                contextData.remove( HIBERSAP_SESSION_PREFIX + jndiName );

                if ( session != null && !session.isClosed() ) {
                    LOGGER.debug( "Schlie�e Hibersap-Session f�r SessionManager " + jndiName );
                    session.close();
                }
            } catch ( RuntimeException e ) {
                LOGGER.error( "Error closing Hibersap Session for SessionManager with JNDI name " + jndiName, e );
                sessionManagerNamesWithError.add( jndiName );
            }
        }
        if ( !sessionManagerNamesWithError.isEmpty() ) {
            throw new HibersapException( format(
                    "Error closing Session(s) for the SessionManager(s): %s. "
                            +
                            "The corresponding SAP connection may not be released! For individual reasons see error logs.",
                    sessionManagerNamesWithError
            ) );
        }
    }

    private Session openSession( final String sessionManagerJndiName ) {
        SessionManager sessionManager = lookupSessionManager( sessionManagerJndiName );
        return sessionManager.openSession();
    }

    private SessionManager lookupSessionManager( final String jndiName ) {
        InitialContext context = null;
        try {
            context = new InitialContext();
            Object object = context.lookup( jndiName );

            if ( object == null ) {
                throw new HibersapException(
                        format( "Lookup for JNDI name '%s' returned null. Expected to find an instance of %s",
                                jndiName, SessionManager.class.getName() )
                );
            }
            if ( !SessionManager.class.isAssignableFrom( object.getClass() ) ) {
                throw new HibersapException(
                        format( "Object bound under JNDI name '%s' is not a %s but an instance of %s",
                                jndiName, SessionManager.class.getName(), object.getClass().getName() )
                );
            }
            return (SessionManager) object;
        } catch ( NamingException e ) {
            throw new HibersapException( "Error creating InitialContext", e );
        } finally {
            if ( context != null ) {
                try {
                    context.close();
                } catch ( NamingException e ) {
                    LOGGER.warn( "Error closing InitialContext", e );
                }
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy