blob: 71fe480a64b2a1cf8e7f9899c6b96b1f38065a2f [file] [log] [blame]
/*
* Copyright (c) 1998, 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,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
// 06/30/2010-2.1.1 Michael O'Brien
// - 316513: Enable JMX MBean functionality for JBoss, Glassfish and WebSphere in addition to WebLogic
// Move JMX MBean generic registration code up from specific platforms
// see <link>http://wiki.eclipse.org/EclipseLink/DesignDocs/316513</link>
// 04/01/2015 Will Dazey
// - 463726: Added DatabaseSession null check
package org.eclipse.persistence.platform.server.jboss;
import jakarta.persistence.spi.PersistenceUnitInfo;
import org.eclipse.persistence.internal.helper.JPAClassLoaderHolder;
import org.eclipse.persistence.logging.AbstractSessionLog;
import org.eclipse.persistence.platform.server.JMXEnabledPlatform;
import org.eclipse.persistence.platform.server.JMXServerPlatformBase;
import org.eclipse.persistence.services.jboss.MBeanJBossRuntimeServices;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.transaction.jboss.JBossTransactionController;
import org.eclipse.persistence.transaction.jboss.JBossTransactionController11;
/**
* PUBLIC:
*
* This is the concrete subclass responsible for representing JBoss-specific server behavior.
*
* This platform overrides:
*
* getExternalTransactionControllerClass(): to use an JBoss-specific controller class
*
*/
public class JBossPlatform extends JMXServerPlatformBase implements JMXEnabledPlatform {
/**
* The following constants and attributes are used to determine the module and application name
* to satisfy the requirements for 248746 where we provide an identifier pair for JMX sessions.
* Each application can have several modules.
* 1) Application name - the persistence unit associated with the session (a 1-1 relationship)
* 2) Module name - the ejb or war jar name (there is a 1-many relationship for module:session(s))
*/
static {
/** Override by subclass: Search String in application server ClassLoader for the application:persistence_unit name */
APP_SERVER_CLASSLOADER_APPLICATION_PU_SEARCH_STRING_PREFIX = "/deploy/";
/** Override by subclass: Search String in application server session for ejb modules */
APP_SERVER_CLASSLOADER_MODULE_EJB_SEARCH_STRING_PREFIX = ".jar/";
/** Override by subclass: Search String in application server session for war modules */
APP_SERVER_CLASSLOADER_MODULE_WAR_SEARCH_STRING_PREFIX = ".war/";
APP_SERVER_CLASSLOADER_APPLICATION_PU_SEARCH_STRING_POSTFIX = "/}";
APP_SERVER_CLASSLOADER_MODULE_EJB_WAR_SEARCH_STRING_POSTFIX = "postfix,match~not;required^";
}
/**
* INTERNAL:
* Default Constructor: All behavior for the default constructor is inherited
*/
public JBossPlatform(DatabaseSession newDatabaseSession) {
super(newDatabaseSession);
this.enableRuntimeServices();
// Create the JMX MBean specific to this platform for later registration
this.prepareServerSpecificServicesMBean();
}
@Override
public boolean isRuntimeServicesEnabledDefault() {
return true;
}
/**
* INTERNAL: getExternalTransactionControllerClass(): Answer the class of external transaction controller to use
* for JBoss. This is read-only.
*
* @return Class externalTransactionControllerClass
*
* @see org.eclipse.persistence.transaction.JTATransactionController
* @see org.eclipse.persistence.platform.server.ServerPlatformBase#isJTAEnabled()
* @see org.eclipse.persistence.platform.server.ServerPlatformBase#disableJTA()
* @see org.eclipse.persistence.platform.server.ServerPlatformBase#initializeExternalTransactionController()
*/
@Override
public Class getExternalTransactionControllerClass() {
if (externalTransactionControllerClass == null){
externalTransactionControllerClass = isJTA11()
? JBossTransactionController11.class : JBossTransactionController.class;
}
return externalTransactionControllerClass;
}
/**
* INTERNAL:
* JIRA EJBTHREE-572 requires that we use the real classLoader in place of the getNewTempClassLoader().
* The override code should stay in place until the UCL3 loader does not throw a NPE on loadClass()
*
* @param puInfo - the persistence unit info
* @return ClassLoaderHolder - a composite object containing the classLoader and the flag
* that is true if the classLoader returned is temporary
*
* @see org.eclipse.persistence.internal.helper.JPAClassLoaderHolder
*/
@Override
public JPAClassLoaderHolder getNewTempClassLoader(PersistenceUnitInfo puInfo) {
// Bug 6460732: Use real classLoader instead of getNewTempClassLoader for now to avoid a JBoss NPE on loadClass()
ClassLoader realClassLoader = puInfo.getClassLoader();
AbstractSessionLog.getLog().log(AbstractSessionLog.WARNING, "persistence_unit_processor_jboss_temp_classloader_bypassed",//
puInfo.getPersistenceUnitName(), realClassLoader);
return new JPAClassLoaderHolder(realClassLoader, false);
}
/**
* INTERNAL:
* prepareServerSpecificServicesMBean(): Server specific implementation of the
* creation and deployment of the JMX MBean to provide runtime services for the
* databaseSession.
*
* Default is to do nothing.
* Implementing platform classes must override this function and supply
* the server specific MBean instance for later registration by calling it in the constructor.
*
* @see #isRuntimeServicesEnabled()
* @see #disableRuntimeServices()
* @see #registerMBean()
*/
@Override
public void prepareServerSpecificServicesMBean() {
// No check for an existing cached MBean - we will replace it if it exists
if(getDatabaseSession() != null && shouldRegisterRuntimeBean) {
this.setRuntimeServicesMBean(new MBeanJBossRuntimeServices(getDatabaseSession()));
}
}
/**
* INTERNAL:
* serverSpecificRegisterMBean(): Server specific implementation of the
* creation and deployment of the JMX MBean to provide runtime services for my
* databaseSession.
*
* @see #isRuntimeServicesEnabled()
* @see #disableRuntimeServices()
* @see #registerMBean()
*/
@Override
public void serverSpecificRegisterMBean() {
super.serverSpecificRegisterMBean();
// get and cache module and application name during registration
initializeApplicationNameAndModuleName();
}
}