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

com.validation.manager.server.JPAEclipseLinkSessionCustomizer Maven / Gradle / Ivy

The newest version!
package com.validation.manager.server;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import org.eclipse.persistence.config.SessionCustomizer;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.JNDIConnector;
import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.sessions.server.ServerSession;

/**
 * See http://wiki.eclipse.org/Customizing_the_EclipseLink_Application_(ELUG)
 * Use for clients that would like to use a JTA SE pu instead of a
 * RESOURCE_LOCAL SE pu.
 */
public class JPAEclipseLinkSessionCustomizer implements SessionCustomizer {

    public static final String JNDI_DATASOURCE_NAME = "java:comp/env/jdbc/VMDB";
    private static final Logger logger =
            Logger.getLogger(JPAEclipseLinkSessionCustomizer.class.getSimpleName());

    /**
     * Get a dataSource connection and set it on the session with
     * lookupType=STRING_LOOKUP
     */
    @Override
    public void customize(Session session) throws Exception {
        JNDIConnector connector = null;
        // Initialize session customizer
        DataSource dataSource = null;
        try {
            Context context = new InitialContext();
            if (null == context) {
                throw new Exception("Context is null");
            }
            connector = (JNDIConnector) session.getLogin().getConnector(); // possible CCE
            // Lookup this new dataSource
            dataSource = (DataSource) context.lookup(JNDI_DATASOURCE_NAME);
        } catch (Exception e) {
            logger.log(Level.SEVERE, JNDI_DATASOURCE_NAME, e);
        }
        connector.setDataSource(dataSource);
        // Change from COMPOSITE_NAME_LOOKUP to STRING_LOOKUP
        // Note: if both jta and non-jta elements exist this will only change the first one - and may still result in the COMPOSITE_NAME_LOOKUP being set
        // Make sure only jta-data-source is in persistence.xml with no non-jta-data-source property set
        connector.setLookupType(JNDIConnector.STRING_LOOKUP);

        // if you are specifying both JTA and non-JTA in your persistence.xml then set both connectors to be safe
        JNDIConnector writeConnector = (JNDIConnector) session.getLogin().getConnector();
        writeConnector.setLookupType(JNDIConnector.STRING_LOOKUP);
        JNDIConnector readConnector = (JNDIConnector) ((DatabaseLogin) ((ServerSession) session).getReadConnectionPool().getLogin()).getConnector();
        readConnector.setLookupType(JNDIConnector.STRING_LOOKUP);

        // Set the new connection on the session
        session.getLogin().setConnector(connector);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy