blob: 68ffb186a9d334332462c98c9a062d8598df4f65 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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
// cdelahun - Bug 214534: changes for JMSPublishingTransportManager configuration via session.xml
package org.eclipse.persistence.internal.sessions.factories;
import java.lang.reflect.Constructor;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.persistence.config.SessionCustomizer;
import org.eclipse.persistence.eis.EISConnectionSpec;
import org.eclipse.persistence.eis.EISLogin;
import org.eclipse.persistence.exceptions.ExceptionHandler;
import org.eclipse.persistence.exceptions.SessionLoaderException;
import org.eclipse.persistence.exceptions.ValidationException;
import org.eclipse.persistence.internal.databaseaccess.DatabasePlatform;
import org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform;
import org.eclipse.persistence.internal.databaseaccess.Platform;
import org.eclipse.persistence.internal.helper.ConversionManager;
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
import org.eclipse.persistence.internal.security.PrivilegedGetConstructorFor;
import org.eclipse.persistence.internal.security.PrivilegedInvokeConstructor;
import org.eclipse.persistence.internal.security.PrivilegedNewInstanceFromClass;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl;
import org.eclipse.persistence.internal.sessions.factories.model.SessionConfigs;
import org.eclipse.persistence.internal.sessions.factories.model.event.SessionEventManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.log.DefaultSessionLogConfig;
import org.eclipse.persistence.internal.sessions.factories.model.log.JavaLogConfig;
import org.eclipse.persistence.internal.sessions.factories.model.log.LogConfig;
import org.eclipse.persistence.internal.sessions.factories.model.log.ServerLogConfig;
import org.eclipse.persistence.internal.sessions.factories.model.login.DatabaseLoginConfig;
import org.eclipse.persistence.internal.sessions.factories.model.login.EISLoginConfig;
import org.eclipse.persistence.internal.sessions.factories.model.login.LoginConfig;
import org.eclipse.persistence.internal.sessions.factories.model.login.StructConverterConfig;
import org.eclipse.persistence.internal.sessions.factories.model.login.XMLLoginConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.CustomServerPlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.ServerPlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.pool.ConnectionPolicyConfig;
import org.eclipse.persistence.internal.sessions.factories.model.pool.ConnectionPoolConfig;
import org.eclipse.persistence.internal.sessions.factories.model.pool.PoolsConfig;
import org.eclipse.persistence.internal.sessions.factories.model.pool.ReadConnectionPoolConfig;
import org.eclipse.persistence.internal.sessions.factories.model.project.ProjectConfig;
import org.eclipse.persistence.internal.sessions.factories.model.property.PropertyConfig;
import org.eclipse.persistence.internal.sessions.factories.model.rcm.RemoteCommandManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.rcm.command.CommandsConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.DefaultSequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.NativeSequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.SequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.TableSequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.UnaryTableSequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.XMLFileSequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.session.DatabaseSessionConfig;
import org.eclipse.persistence.internal.sessions.factories.model.session.ServerSessionConfig;
import org.eclipse.persistence.internal.sessions.factories.model.session.SessionBrokerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.session.SessionConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.JMSPublishingTransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.JMSTopicTransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.Oc4jJGroupsTransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.RMIIIOPTransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.RMITransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.SunCORBATransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.TransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.UserDefinedTransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.discovery.DiscoveryConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.naming.JNDINamingServiceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.naming.RMIRegistryNamingServiceConfig;
import org.eclipse.persistence.logging.DefaultSessionLog;
import org.eclipse.persistence.logging.SessionLog;
import org.eclipse.persistence.oxm.XMLLogin;
import org.eclipse.persistence.platform.database.converters.StructConverter;
import org.eclipse.persistence.platform.server.NoServerPlatform;
import org.eclipse.persistence.platform.server.ServerPlatform;
import org.eclipse.persistence.platform.server.ServerPlatformUtils;
import org.eclipse.persistence.sequencing.DefaultSequence;
import org.eclipse.persistence.sequencing.NativeSequence;
import org.eclipse.persistence.sequencing.Sequence;
import org.eclipse.persistence.sequencing.TableSequence;
import org.eclipse.persistence.sequencing.UnaryTableSequence;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.DatasourceLogin;
import org.eclipse.persistence.sessions.ExternalTransactionController;
import org.eclipse.persistence.sessions.JNDIConnector;
import org.eclipse.persistence.sessions.Login;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.sessions.SessionEventListener;
import org.eclipse.persistence.sessions.broker.SessionBroker;
import org.eclipse.persistence.sessions.coordination.DiscoveryManager;
import org.eclipse.persistence.sessions.coordination.RemoteCommandManager;
import org.eclipse.persistence.sessions.coordination.TransportManager;
import org.eclipse.persistence.sessions.coordination.jms.JMSPublishingTransportManager;
import org.eclipse.persistence.sessions.coordination.jms.JMSTopicTransportManager;
import org.eclipse.persistence.sessions.coordination.rmi.RMITransportManager;
import org.eclipse.persistence.sessions.factories.XMLProjectReader;
import org.eclipse.persistence.sessions.factories.XMLSessionConfigLoader;
import org.eclipse.persistence.sessions.server.ConnectionPolicy;
import org.eclipse.persistence.sessions.server.ConnectionPool;
import org.eclipse.persistence.sessions.server.ReadConnectionPool;
import org.eclipse.persistence.sessions.server.ServerSession;
import org.eclipse.persistence.tools.profiler.PerformanceProfiler;
/**
* INTERNAL:
* Builds EclipseLink Sessions from the XML Session Config model.
* Model classes that are not built, are processed only.
*
* @author Guy Pelletier
* @version 1.0
*/
public class SessionsFactory {
protected Map<String, Session> m_sessions;
protected Map<String, Integer> m_logLevels;
protected ClassLoader m_classLoader;
/**
* INTERNAL:
*/
public SessionsFactory() {
m_logLevels = new HashMap<>();
m_logLevels.put("off", SessionLog.OFF);
m_logLevels.put("severe", SessionLog.SEVERE);
m_logLevels.put("warning", SessionLog.WARNING);
m_logLevels.put("info", SessionLog.INFO);
m_logLevels.put("config", SessionLog.CONFIG);
m_logLevels.put("fine", SessionLog.FINE);
m_logLevels.put("finer", SessionLog.FINER);
m_logLevels.put("finest", SessionLog.FINEST);
m_logLevels.put("all", SessionLog.ALL);
}
/**
* INTERNAL:
* To build EclipseLink sessions, users must call this method with a
* SessionConfigs object returned from an OX read in the
* {@link XMLSessionConfigLoader}.
*
* @param eclipseLinkSessions object returned from an OX read in the XMLSessionConfigLoader
* @param classLoader class loader used in the XMLSessionConfigLoader
* @return EclipseLink sessions
*/
public Map<String, Session> buildSessionConfigs(SessionConfigs eclipseLinkSessions, ClassLoader classLoader) {
m_sessions = new HashMap<>();
m_classLoader = classLoader;
List<SessionBrokerConfig> sessionBrokerConfigs = new ArrayList<>();
Enumeration<SessionConfig> e = eclipseLinkSessions.getSessionConfigs().elements();
while (e.hasMoreElements()) {
SessionConfig sessionConfig = e.nextElement();
if (sessionConfig instanceof SessionBrokerConfig) {
// Hold all the session brokers till all the sessions have been built
sessionBrokerConfigs.add((SessionBrokerConfig) sessionConfig);
} else {
AbstractSession session = buildSession(sessionConfig);
session.getDatasourcePlatform().getConversionManager().setLoader(classLoader);
processSessionCustomizer(sessionConfig, session);
m_sessions.put(session.getName(), session);
}
}
// All the sessions have been built now so we can process the Session Brokers
for (SessionBrokerConfig sessionBrokerConfig : sessionBrokerConfigs) {
SessionBroker sessionBroker = buildSessionBrokerConfig(sessionBrokerConfig);
sessionBroker.getDatasourcePlatform().getConversionManager().setLoader(classLoader);
processSessionCustomizer(sessionBrokerConfig, sessionBroker);
m_sessions.put(sessionBroker.getName(), sessionBroker);
}
return m_sessions;
}
/**
* INTERNAL:
* Process the user inputed session customizer class. Will be run at the
* end of the session build process
*/
protected void processSessionCustomizer(SessionConfig sessionConfig, AbstractSession session) {
// Session customizer - MUST BE THE LAST THING TO PROCESS
String sessionCustomizerClassName = sessionConfig.getSessionCustomizerClass();
if (sessionCustomizerClassName != null) {
try {
@SuppressWarnings({"unchecked"})
Class<SessionCustomizer> sessionCustomizerClass = (Class<SessionCustomizer>) m_classLoader.loadClass(sessionCustomizerClassName);
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(sessionCustomizerClass)).customize(session);
}else{
PrivilegedAccessHelper.newInstanceFromClass(sessionCustomizerClass).customize(session);
}
} catch (Exception exception) {
throw SessionLoaderException.failedToLoadTag("session-customizer-class", sessionCustomizerClassName, exception);
}
}
}
/**
* INTERNAL:
* Build the correct session based on the session config type
*/
protected AbstractSession buildSession(SessionConfig sessionConfig) {
if (sessionConfig instanceof ServerSessionConfig) {
return buildServerSessionConfig((ServerSessionConfig)sessionConfig);
} else {// if (sessionConfig instanceof DatabaseSessionConfig) {
return buildDatabaseSessionConfig((DatabaseSessionConfig)sessionConfig);
}
}
/**
* INTERNAL:
* Wrapped by the getSession() call, therefore, config can't be null at this
* point.
*/
protected AbstractSession buildDatabaseSessionConfig(DatabaseSessionConfig databaseSessionConfig) {
// Create a new database session (null means use login from deployment xml if there is one)
DatabaseSessionImpl databaseSession = createSession(databaseSessionConfig, null);
// Login - may overwrite the previous login (expected behavior)
Login login = buildLogin(databaseSessionConfig.getLoginConfig());
if (login != null) {
databaseSession.setLogin(login);
}
// Common processing since ServerSessions inherit from DatabaseSession
processDatabaseSessionConfig(databaseSessionConfig, databaseSession);
// Process the common elements in SessionConfig
processSessionConfig(databaseSessionConfig, databaseSession);
return databaseSession;
}
/**
* INTERNAL
* Process a DatabaseSessionConfig object.
*/
protected void processDatabaseSessionConfig(DatabaseSessionConfig sessionConfig, AbstractSession session) {
}
/**
* INTERNAL:
* Builds a server server from the given ServerSessionConfig.
*/
protected AbstractSession buildServerSessionConfig(ServerSessionConfig serverSessionConfig) {
// For server sessions we should build the login first, that way we can
// initialize the server session with the login (if there is one)
Login login = buildLogin(serverSessionConfig.getLoginConfig());
// Create a new server session
ServerSession serverSession = (ServerSession)createSession(serverSessionConfig, login);
// Common processing since ServerSessions inherit from DatabaseSession
processDatabaseSessionConfig(serverSessionConfig, serverSession);
// Process pools config
processPoolsConfig(serverSessionConfig.getPoolsConfig(), serverSession);
// Process connection policy config
processConnectionPolicyConfig(serverSessionConfig.getConnectionPolicyConfig(), serverSession);
// Process the common elements in SessionConfig
processSessionConfig(serverSessionConfig, serverSession);
return serverSession;
}
/**
* INTERNAL:
* Return a DatabaseSession object from it's config object using either
* the project classes or project XML files.
*/
protected DatabaseSessionImpl createSession(DatabaseSessionConfig sessionConfig, Login login) {
Project primaryProject;
if (sessionConfig.getPrimaryProject() != null) {
primaryProject = loadProjectConfig(sessionConfig.getPrimaryProject());
} else {
primaryProject = new Project();// Build a session from an empty project
}
prepareProjectLogin(primaryProject, login);
DatabaseSessionImpl sessionToReturn = getSession(sessionConfig, primaryProject);
// Append descriptors from all subsequent project.xml and project classes
// to the mainProject
if (sessionConfig.getAdditionalProjects() != null) {
Enumeration<ProjectConfig> additionalProjects = sessionConfig.getAdditionalProjects().elements();
while (additionalProjects.hasMoreElements()) {
Project subProject = loadProjectConfig(additionalProjects.nextElement());
primaryProject.addDescriptors(subProject, sessionToReturn);
}
}
return sessionToReturn;
}
/**
* INTERNAL:
* Return the correct session type from the sessionConfig
*/
protected void prepareProjectLogin(Project project, Login login) {
if (login != null) {
project.setLogin(login);
} else if (project.getDatasourceLogin() == null) {
// dummy login that needs to be set, otherwise session creation will fail
project.setLogin(new DatabaseLogin());
} else {
// we read a login from the deployment xml of java, don't overwrite
}
}
/**
* INTERNAL:
* Return the correct session type from the sessionConfig
*/
protected DatabaseSessionImpl getSession(SessionConfig sessionConfig, Project project) {
if (sessionConfig instanceof ServerSessionConfig) {
return (ServerSession)project.createServerSession();
} else {
return (DatabaseSessionImpl)project.createDatabaseSession();
}
}
/**
* INTERNAL:
* Load a projectConfig from the session.xml file. This method will determine
* the proper loading scheme, that is, for a class or xml project.
*/
@SuppressWarnings({"unchecked"})
protected Project loadProjectConfig(ProjectConfig projectConfig) {
Project project = null;
String projectString = projectConfig.getProjectString().trim();
if (projectConfig.isProjectClassConfig()) {
try {
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
project = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>((Class<Project>) m_classLoader.loadClass(projectString)));
}else{
project = PrivilegedAccessHelper.newInstanceFromClass((Class<Project>)m_classLoader.loadClass(projectString));
}
} catch (Exception exception) {
throw SessionLoaderException.failedToLoadProjectClass(projectString, exception);
}
} else {
try {
project = XMLProjectReader.read(projectString, m_classLoader);
} catch (ValidationException validationException) {
if (validationException.getErrorCode() == ValidationException.PROJECT_XML_NOT_FOUND) {
try {
project = XMLProjectReader.read(projectString);
} catch (Exception e) {
throw SessionLoaderException.failedToLoadProjectXml(projectString, validationException);
}
} else {
throw SessionLoaderException.failedToLoadProjectXml(projectString, validationException);
}
}
}
return project;
}
/**
* INTERNAL:
* Build the correct login based on the login config type
*/
protected Login buildLogin(LoginConfig loginConfig) {
if (loginConfig instanceof EISLoginConfig) {
return buildEISLoginConfig((EISLoginConfig)loginConfig);
} else if (loginConfig instanceof XMLLoginConfig) {
return buildXMLLoginConfig((XMLLoginConfig)loginConfig);
} else if (loginConfig instanceof DatabaseLoginConfig) {
return buildDatabaseLoginConfig((DatabaseLoginConfig)loginConfig);
} else {
return null;
}
}
/**
* INTERNAL:
* Wrapped by the getLogin() call, therefore, config can't be null at this
* point.
*/
protected Login buildEISLoginConfig(EISLoginConfig eisLoginConfig) {
EISLogin eisLogin = new EISLogin();
// Connection Spec
String specClassName = eisLoginConfig.getConnectionSpecClass();
if (specClassName != null) {
try {
@SuppressWarnings({"unchecked"})
Class<EISConnectionSpec> specClass = (Class<EISConnectionSpec>) m_classLoader.loadClass(specClassName);
EISConnectionSpec spec = null;
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
spec = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(specClass));
}else{
spec = PrivilegedAccessHelper.newInstanceFromClass(specClass);
}
eisLogin.setConnectionSpec(spec);
} catch (Exception exception) {
throw SessionLoaderException.failedToLoadTag("connection-spec-class", specClassName, exception);
}
}
// Connection Factory URL, setConnectionFactoryURL checks for null
eisLogin.setConnectionFactoryURL(eisLoginConfig.getConnectionFactoryURL());
// Process the common elements in LoginConfig
processLoginConfig(eisLoginConfig, eisLogin);
// Finally, return the newly created EISLogin
return eisLogin;
}
/**
* INTERNAL:
* Wrapped by the getLogin() call, therefore, config can't be null at this
* point.
*/
protected Login buildXMLLoginConfig(XMLLoginConfig xmlLoginConfig) {
XMLLogin xmlLogin = new XMLLogin();
// Process the common elements in LoginConfig
processLoginConfig(xmlLoginConfig, xmlLogin);
// Finally, return the newly created XMLLogin
return xmlLogin;
}
/**
* INTERNAL:
* Build a DatabaseLogin for the given Session
* Wrapped by the getLogin() call, therefore, config can't be null at this
* point.
*/
protected Login buildDatabaseLoginConfig(DatabaseLoginConfig databaseLoginConfig) {
DatabaseLogin databaseLogin = new DatabaseLogin();
// Driver class
String driverClassName = databaseLoginConfig.getDriverClass();
if (driverClassName != null) {
try {
Class<?> driverClass = m_classLoader.loadClass(driverClassName);
databaseLogin.setDriverClass(driverClass);
} catch (Exception exception) {
throw SessionLoaderException.failedToLoadTag("driver-class", driverClassName, exception);
}
}
// Connection URL
String connectionString = databaseLoginConfig.getConnectionURL();
if (connectionString != null) {
databaseLogin.setConnectionString(connectionString);
}
// Datasource
String datasourceName = databaseLoginConfig.getDatasource();
if (datasourceName != null) {
try {
JNDIConnector jndiConnector = new JNDIConnector(new javax.naming.InitialContext(), datasourceName);
jndiConnector.setLookupType(databaseLoginConfig.getLookupType());
databaseLogin.setConnector(jndiConnector);
} catch (Exception exception) {
throw SessionLoaderException.failedToLoadTag("datasource", datasourceName, exception);
}
}
// Bind all parameters - XML Schema default is false
databaseLogin.setShouldBindAllParameters(databaseLoginConfig.getBindAllParameters());
// Cache all statements - XML Schema default is false
databaseLogin.setShouldCacheAllStatements(databaseLoginConfig.getCacheAllStatements());
// Byte array binding - XML Schema default is true
databaseLogin.setUsesByteArrayBinding(databaseLoginConfig.getByteArrayBinding());
// String binding - XML Schema default is false
databaseLogin.setUsesStringBinding(databaseLoginConfig.getStringBinding());
// Stream binding - XML Schema default is false
databaseLogin.setUsesStreamsForBinding(databaseLoginConfig.getStreamsForBinding());
// Force field to uppper case - XML Schema default is false
databaseLogin.setShouldForceFieldNamesToUpperCase(databaseLoginConfig.getForceFieldNamesToUppercase());
// Optimize data conversion - XML Schema default is true
databaseLogin.setShouldOptimizeDataConversion(databaseLoginConfig.getOptimizeDataConversion());
// Trim strings - XML Schema default is true
databaseLogin.setShouldTrimStrings(databaseLoginConfig.getTrimStrings());
// Batch writing - XML Schema default is false
databaseLogin.setUsesBatchWriting(databaseLoginConfig.getBatchWriting());
// JDBC 2.0 batch writing - XML Schema default is true
databaseLogin.setUsesJDBCBatchWriting(databaseLoginConfig.getJdbcBatchWriting());
// Max batch writing size - XML Schema default is 32000
Integer maxBatchWritingSize = databaseLoginConfig.getMaxBatchWritingSize();
if (maxBatchWritingSize != null) {
databaseLogin.setMaxBatchWritingSize(maxBatchWritingSize);
}
// Native SQL - XML Schema default is false
databaseLogin.setUsesNativeSQL(databaseLoginConfig.getNativeSQL());
// Process the common elements in LoginConfig
processLoginConfig(databaseLoginConfig, databaseLogin);
processStructConverterConfig(databaseLoginConfig.getStructConverterConfig(), databaseLogin);
if (databaseLoginConfig.isConnectionHealthValidatedOnError() != null){
databaseLogin.setConnectionHealthValidatedOnError(databaseLoginConfig.isConnectionHealthValidatedOnError());
}
if (databaseLoginConfig.getQueryRetryAttemptCount() != null){
databaseLogin.setQueryRetryAttemptCount(databaseLoginConfig.getQueryRetryAttemptCount());
}
if (databaseLoginConfig.getDelayBetweenConnectionAttempts() != null){
databaseLogin.setDelayBetweenConnectionAttempts(databaseLoginConfig.getDelayBetweenConnectionAttempts());
}
if (databaseLoginConfig.getPingSQL() != null){
databaseLogin.setPingSQL(databaseLoginConfig.getPingSQL());
}
// Finally, return the newly created DatabaseLogin
return databaseLogin;
}
/**
* INTERNAL:
*/
@SuppressWarnings({"unchecked"})
protected void processStructConverterConfig(StructConverterConfig converterClassConfig, DatabaseLogin login) {
if (converterClassConfig != null) {
Platform platform = login.getDatasourcePlatform();
if (platform instanceof DatabasePlatform){
Iterator<String> i = converterClassConfig.getStructConverterClasses().iterator();
while (i.hasNext()) {
String converterClassName = i.next();
try {
Class<StructConverter> converterClass = (Class<StructConverter>) m_classLoader.loadClass(converterClassName);
StructConverter converter = null;
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
try{
converter = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(converterClass));
}catch (PrivilegedActionException ex){
throw (Exception)ex.getCause();
}
}else{
converter = PrivilegedAccessHelper.newInstanceFromClass(converterClass);
}
((DatabasePlatform)platform).addStructConverter(converter);
} catch (Exception exception) {
throw SessionLoaderException.failedToLoadTag("struct-converter", converterClassName, exception);
}
}
}
}
}
/**
* INTERNAL:
* Process the common elements of a Login.
*/
protected void processLoginConfig(LoginConfig loginConfig, DatasourceLogin login) {
// Platform class
String platformClassName = loginConfig.getPlatformClass();
if (platformClassName != null) {
try {
@SuppressWarnings({"unchecked"})
Class<DatasourcePlatform> platformClass = (Class<DatasourcePlatform>) m_classLoader.loadClass(platformClassName);
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
login.usePlatform(AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(platformClass)));
}else{
login.usePlatform(PrivilegedAccessHelper.newInstanceFromClass(platformClass));
}
} catch (Exception exception) {
throw SessionLoaderException.failedToLoadTag("platform-class", platformClassName, exception);
}
}
// Table qualifier
String tableQualifier = loginConfig.getTableQualifier();
if (tableQualifier != null) {
login.setTableQualifier(tableQualifier);
}
// Username - setUserName checks for null
login.setUserName(loginConfig.getUsername());
// Encryption class (must be set before the password)
// XML Schema default is org.eclipse.persistence.internal.security.JCEEncryptor
login.setEncryptionClassName(loginConfig.getEncryptionClass());
// Password is encrypted on the model - setEncryptedPassword checks for null
login.setEncryptedPassword(loginConfig.getEncryptedPassword());
// External connection pool - XML Schema default is false
login.setUsesExternalConnectionPooling(loginConfig.getExternalConnectionPooling());
// External transaction controller - XML Schema default is false
login.setUsesExternalTransactionController(loginConfig.getExternalTransactionController());
// Sequencing - XML Schema default is null
if (loginConfig.getSequencingConfig() != null) {
if (loginConfig.getSequencingConfig().getDefaultSequenceConfig() != null) {
Sequence sequence = buildSequence(loginConfig.getSequencingConfig().getDefaultSequenceConfig());
login.setDefaultSequence(sequence);
}
if ((loginConfig.getSequencingConfig().getSequenceConfigs() != null) && !loginConfig.getSequencingConfig().getSequenceConfigs().isEmpty()) {
Enumeration<SequenceConfig> eSequenceConfigs = loginConfig.getSequencingConfig().getSequenceConfigs().elements();
while (eSequenceConfigs.hasMoreElements()) {
Sequence sequence = buildSequence(eSequenceConfigs.nextElement());
login.addSequence(sequence);
}
}
}
// Properties (assumes they are all valid)
if (loginConfig.getPropertyConfigs() != null) {
Enumeration<PropertyConfig> e = loginConfig.getPropertyConfigs().elements();
while (e.hasMoreElements()) {
PropertyConfig propertyConfig = e.nextElement();
login.getProperties().put(propertyConfig.getName(), propertyConfig.getValue());
}
}
}
/**
* INTERNAL:
* Process the PoolsConfig object.
*/
protected void processPoolsConfig(PoolsConfig poolsConfig, ServerSession serverSession) {
if (poolsConfig != null) {
// Read connection pool
ReadConnectionPoolConfig readConnectionPoolConfig = poolsConfig.getReadConnectionPoolConfig();
if (readConnectionPoolConfig != null) {
serverSession.setReadConnectionPool(buildReadConnectionPoolConfig(readConnectionPoolConfig, serverSession));
}
// Write connection pool
ConnectionPoolConfig writeConnectionPoolConfig = poolsConfig.getWriteConnectionPoolConfig();
if (writeConnectionPoolConfig != null) {
serverSession.addConnectionPool(buildConnectionPoolConfig(writeConnectionPoolConfig, serverSession));
}
// Sequence connection pool
ConnectionPoolConfig sequenceConnectionPoolConfig = poolsConfig.getSequenceConnectionPoolConfig();
if (sequenceConnectionPoolConfig != null) {
processSequenceConnectionPoolConfig(sequenceConnectionPoolConfig, serverSession);
}
// Connection pools
Enumeration<ConnectionPoolConfig> e = poolsConfig.getConnectionPoolConfigs().elements();
while (e.hasMoreElements()) {
ConnectionPoolConfig connectionPoolConfig = e.nextElement();
serverSession.addConnectionPool(buildConnectionPoolConfig(connectionPoolConfig, serverSession));
}
}
}
/**
* INTERNAL:
* Process a SequenceConnectionPoolConfig object.
*/
protected void processSequenceConnectionPoolConfig(ConnectionPoolConfig poolConfig, ServerSession serverSession) {
// Set the Sequence connection pool flag to true
serverSession.getSequencingControl().setShouldUseSeparateConnection(true);
// Max connections
Integer maxConnections = poolConfig.getMaxConnections();
if (maxConnections != null) {
serverSession.getSequencingControl().setMaxPoolSize(maxConnections);
}
// Min connections
Integer minConnections = poolConfig.getMinConnections();
if (minConnections != null) {
serverSession.getSequencingControl().setMinPoolSize(minConnections);
}
// Name - no need to process
}
/**
* INTERNAL:
* Process a ServerPlatformConfig object.
*/
protected void processServerPlatformConfig(ServerPlatformConfig platformConfig, ServerPlatform platform) {
// Enable runtime services - XML schema default is true
if (!platformConfig.getEnableRuntimeServices()) {
platform.disableRuntimeServices();
}
// Enable JTA - XML schema default is true
if (!platformConfig.getEnableJTA()) {
platform.disableJTA();
}
}
/**
* INTERNAL:
* Build a connection pool from the config to store on the server session.
*/
protected ConnectionPool buildConnectionPoolConfig(ConnectionPoolConfig poolConfig, ServerSession serverSession) {
ConnectionPool connectionPool = new ConnectionPool();
// Process the common elements in ConnectionPool
processConnectionPoolConfig(poolConfig, connectionPool, serverSession);
return connectionPool;
}
/**
* INTERNAL:
*/
@SuppressWarnings({"unchecked", "rawtypes"})
protected ServerPlatform buildCustomServerPlatformConfig(CustomServerPlatformConfig platformConfig, DatabaseSessionImpl session) {
ServerPlatform platform;
// Server class - XML schema default is org.eclipse.persistence.platform.server.CustomServerPlatform
String serverClassName = platformConfig.getServerClassName();
try {
Class<ServerPlatform> serverClass = (Class<ServerPlatform>) m_classLoader.loadClass(serverClassName);
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
Constructor<ServerPlatform> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(serverClass, new Class[] { org.eclipse.persistence.sessions.DatabaseSession.class }, false));
platform = AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(constructor, new Object[] { session }));
}else{
Constructor<ServerPlatform> constructor = PrivilegedAccessHelper.getConstructorFor(serverClass, new Class[] { org.eclipse.persistence.sessions.DatabaseSession.class }, false);
platform = PrivilegedAccessHelper.invokeConstructor(constructor, new Object[] { session });
}
} catch (Exception e) {
throw SessionLoaderException.failedToLoadTag("server-class", serverClassName, e);
}
// External transaction controller class
String externalTransactionControllerClass = platformConfig.getExternalTransactionControllerClass();
if (externalTransactionControllerClass != null) {
try {
platform.setExternalTransactionControllerClass((Class<ExternalTransactionController>) m_classLoader.loadClass(externalTransactionControllerClass));
} catch (Exception exception) {
throw SessionLoaderException.failedToLoadTag("external-transaction-controller-class", externalTransactionControllerClass, exception);
}
}
return platform;
}
/**
* INTERNAL:
* Build a read connection pool from the config to store on the server session.
*/
protected ConnectionPool buildReadConnectionPoolConfig(ReadConnectionPoolConfig poolConfig, ServerSession serverSession) {
// Exclusive tag - XML Schema default is false
ConnectionPool connectionPool = (poolConfig.getExclusive()) ? new ConnectionPool() : new ReadConnectionPool();
// Process the common elements in ConnectionPool
processConnectionPoolConfig(poolConfig, connectionPool, serverSession);
return connectionPool;
}
/**
* INTERNAL:
* Process the common elements from a ConnectionPoolConfig
*/
protected void processConnectionPolicyConfig(ConnectionPolicyConfig connectionPolicyConfig, ServerSession serverSession) {
if (connectionPolicyConfig != null) {
ConnectionPolicy connectionPolicy = serverSession.getDefaultConnectionPolicy();
if(connectionPolicyConfig.getUseExclusiveConnection()) {
connectionPolicy.setExclusiveMode(ConnectionPolicy.ExclusiveMode.Isolated);
} else {
connectionPolicy.setExclusiveMode(ConnectionPolicy.ExclusiveMode.Transactional);
}
connectionPolicy.setIsLazy(connectionPolicyConfig.getLazy());
}
}
/**
* INTERNAL:
* Process the common elements from a ConnectionPoolConfig
*/
protected void processConnectionPoolConfig(ConnectionPoolConfig poolConfig, ConnectionPool connectionPool, AbstractSession session) {
// Login - if null, set it to the same as the session login
Login login = buildLogin(poolConfig.getLoginConfig());
if (login != null) {
connectionPool.setLogin(login);
} else {
connectionPool.setLogin(session.getDatasourceLogin());
}
// Name
connectionPool.setName(poolConfig.getName());
// Max connections
Integer maxConnections = poolConfig.getMaxConnections();
if (maxConnections != null) {
connectionPool.setMaxNumberOfConnections(maxConnections);
}
// Min connections
Integer minConnections = poolConfig.getMinConnections();
if (minConnections != null) {
connectionPool.setMinNumberOfConnections(minConnections);
}
}
/**
* INTERNAL:
* Process the common elements from a SessionConfig.
*/
protected void processSessionConfig(SessionConfig sessionConfig, AbstractSession session) {
// Name
session.setName(sessionConfig.getName().trim());
// Session Event Manager
processSessionEventManagerConfig(sessionConfig.getSessionEventManagerConfig(), session);
//server platform
((DatabaseSessionImpl)session).setServerPlatform(buildServerPlatformConfig(sessionConfig.getServerPlatformConfig(), (DatabaseSessionImpl)session));
// Session Log - BUG# 3442865, don't set the log if it is null
SessionLog log = buildSessionLog(sessionConfig.getLogConfig(), session);
if (log != null) {
session.setSessionLog(log);
}
// Remote command manager
buildRemoteCommandManagerConfig(sessionConfig.getRemoteCommandManagerConfig(), session);
// Profiler - XML Schema default is null
if (sessionConfig.getProfiler() != null) {
if (sessionConfig.getProfiler().equals("eclipselink")) {
session.setProfiler(new PerformanceProfiler());
}
}
// Exception handler
String exceptionHandlerClassName = sessionConfig.getExceptionHandlerClass();
if (exceptionHandlerClassName != null) {
try {
@SuppressWarnings({"unchecked"})
Class<ExceptionHandler> exceptionHandlerClass = (Class<ExceptionHandler>) m_classLoader.loadClass(exceptionHandlerClassName);
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
session.setExceptionHandler(AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(exceptionHandlerClass)));
}else{
session.setExceptionHandler(PrivilegedAccessHelper.newInstanceFromClass(exceptionHandlerClass));
}
} catch (Exception e) {
throw SessionLoaderException.failedToLoadTag("exception-handler-class", exceptionHandlerClassName, e);
}
}
// Session customizer will be processed in the buildSessions method.
// Ensures it is run last.
}
/**
* INTERNAL: Build the appropriate server platform
*/
protected ServerPlatform buildServerPlatformConfig(ServerPlatformConfig platformConfig, DatabaseSessionImpl session) {
if (platformConfig == null) {
return new NoServerPlatform(session);
}
// Build the server platform, the config model knows which to build.
ServerPlatform platform;
if (platformConfig instanceof CustomServerPlatformConfig) {
platform = buildCustomServerPlatformConfig((CustomServerPlatformConfig)platformConfig, session);
} else {
// A supported platform so instantiate an object of its type.
String serverClassName = platformConfig.getServerClassName();
if (platformConfig.isSupported()) {
platform = ServerPlatformUtils.createServerPlatform(session, serverClassName, m_classLoader);
} else {
throw SessionLoaderException.serverPlatformNoLongerSupported(serverClassName);
}
}
// Process the common elements in ServerPlatformConfig
processServerPlatformConfig(platformConfig, platform);
return platform;
}
/**
* INTERNAL:
*/
protected void buildRemoteCommandManagerConfig(RemoteCommandManagerConfig rcmConfig, AbstractSession session) {
if (rcmConfig != null) {
RemoteCommandManager rcm = new RemoteCommandManager(session);
// Commands
processCommandsConfig(rcmConfig.getCommandsConfig(), rcm);
// Transport Manager - will set the built TransportManager on the given
// Remote command manager that is passed in
buildTransportManager(rcmConfig.getTransportManagerConfig(), rcm);
// Channel - XML Schema default is TopLinkCommandChannel
rcm.setChannel(rcmConfig.getChannel());
}
}
/**
* INTERNAL:
*/
protected void buildTransportManager(TransportManagerConfig tmConfig, RemoteCommandManager rcm) {
if (tmConfig instanceof RMIIIOPTransportManagerConfig) {
buildRMIIIOPTransportManagerConfig((RMIIIOPTransportManagerConfig)tmConfig, rcm);
} else if (tmConfig instanceof RMITransportManagerConfig) {
buildRMITransportManagerConfig((RMITransportManagerConfig)tmConfig, rcm);
} else if (tmConfig instanceof JMSTopicTransportManagerConfig) {
buildJMSTopicTransportManagerConfig((JMSTopicTransportManagerConfig)tmConfig, rcm);
} else if (tmConfig instanceof JMSPublishingTransportManagerConfig) {
buildJMSPublishingTransportManagerConfig((JMSPublishingTransportManagerConfig)tmConfig, rcm);
} else if (tmConfig instanceof Oc4jJGroupsTransportManagerConfig) {
buildOc4jJGroupsTransportManagerConfig((Oc4jJGroupsTransportManagerConfig)tmConfig, rcm);
} else if (tmConfig instanceof SunCORBATransportManagerConfig) {
buildSunCORBATransportManagerConfig((SunCORBATransportManagerConfig)tmConfig, rcm);
} else if (tmConfig instanceof UserDefinedTransportManagerConfig) {
buildUserDefinedTransportManagerConfig((UserDefinedTransportManagerConfig)tmConfig, rcm);
}
}
/**
* INTERNAL:
*/
protected void buildRMITransportManagerConfig(RMITransportManagerConfig tmConfig, RemoteCommandManager rcm) {
RMITransportManager tm = new RMITransportManager(rcm);
// Set the transport manager. This will initialize the DiscoveryManager
// This needs to be done before we process the DiscoveryConfig.
rcm.setTransportManager(tm);
// Discovery
DiscoveryConfig discoveryConfig = tmConfig.getDiscoveryConfig();
if (discoveryConfig != null) {
processDiscoveryConfig(discoveryConfig, rcm.getDiscoveryManager());
}
if (tmConfig.getJNDINamingServiceConfig() != null) {
// JNDI naming service
tm.setNamingServiceType(TransportManager.JNDI_NAMING_SERVICE);
processJNDINamingServiceConfig(tmConfig.getJNDINamingServiceConfig(), tm);
} else if (tmConfig.getRMIRegistryNamingServiceConfig() != null) {
// RMI registry naming service
tm.setNamingServiceType(TransportManager.REGISTRY_NAMING_SERVICE);
processRMIRegistryNamingServiceConfig(tmConfig.getRMIRegistryNamingServiceConfig(), tm);
}
tm.setIsRMIOverIIOP(tmConfig instanceof RMIIIOPTransportManagerConfig);
// Send mode - Can only be Asynchronous (true) or Synchronous (false), validated by the schema
// XML Schema default is Asynchronous
rcm.setShouldPropagateAsynchronously(tmConfig.getSendMode().equals("Asynchronous"));
// Process the common elements in TransportManagerConfig
processTransportManagerConfig(tmConfig, tm);
}
/**
* INTERNAL:
* Builds a Sequence from the given SequenceConfig.
*/
protected Sequence buildSequence(SequenceConfig sequenceConfig) {
if (sequenceConfig == null) {
return null;
}
String name = sequenceConfig.getName();
int size = sequenceConfig.getPreallocationSize();
if (sequenceConfig instanceof DefaultSequenceConfig) {
return new DefaultSequence(name, size);
} else if (sequenceConfig instanceof NativeSequenceConfig) {
return new NativeSequence(name, size);
} else if (sequenceConfig instanceof TableSequenceConfig) {
TableSequenceConfig tsc = (TableSequenceConfig)sequenceConfig;
return new TableSequence(name, size, tsc.getTable(), tsc.getNameField(), tsc.getCounterField());
} else if (sequenceConfig instanceof UnaryTableSequenceConfig) {
UnaryTableSequenceConfig utsc = (UnaryTableSequenceConfig)sequenceConfig;
return new UnaryTableSequence(name, size, utsc.getCounterField());
} else if (sequenceConfig instanceof XMLFileSequenceConfig) {
try {
// Can no longer reference class directly as in a different project.
@SuppressWarnings({"unchecked"})
Class<Sequence> xmlClass = (Class<Sequence>) Class.forName("org.eclipse.persistence.eis.adapters.xmlfile.XMLFileSequence");
Sequence sequence = xmlClass.getConstructor().newInstance();
sequence.setName(name);
sequence.setInitialValue(size);
return sequence;
} catch (Exception missing) {
return null;
}
} else {
// Unknown SequenceConfig subclass - should never happen
return null;
}
}
/**
* INTERNAL:
* Left this in for now since in the future we may add more IIOP specific
* configurations?
*/
protected void buildRMIIIOPTransportManagerConfig(RMIIIOPTransportManagerConfig tmConfig, RemoteCommandManager rcm) {
buildRMITransportManagerConfig(tmConfig, rcm);
}
/**
* INTERNAL:
*/
protected void buildJMSTopicTransportManagerConfig(JMSTopicTransportManagerConfig tmConfig, RemoteCommandManager rcm) {
JMSTopicTransportManager tm = new JMSTopicTransportManager(rcm);
// Set the transport manager. This will initialize the DiscoveryManager
rcm.setTransportManager(tm);
processJMSTransportManagerConfig(tmConfig, tm);
}
/**
* INTERNAL:
*/
protected void buildJMSPublishingTransportManagerConfig(JMSPublishingTransportManagerConfig tmConfig, RemoteCommandManager rcm) {
JMSPublishingTransportManager tm = new JMSPublishingTransportManager(rcm);
// Set the transport manager. This will initialize the DiscoveryManager
rcm.setTransportManager(tm);
processJMSTransportManagerConfig(tmConfig, tm);
}
/**
* INTERNAL:
* Common JMS configuration
*/
protected void processJMSTransportManagerConfig(JMSPublishingTransportManagerConfig tmConfig, JMSPublishingTransportManager tm ){
// JNDI naming service
if (tmConfig.getJNDINamingServiceConfig() != null) {
tm.setNamingServiceType(TransportManager.JNDI_NAMING_SERVICE);
processJNDINamingServiceConfig(tmConfig.getJNDINamingServiceConfig(), tm);
}
// Topic host URL
String topicHostURL = tmConfig.getTopicHostURL();
if (topicHostURL != null) {
tm.setTopicHostUrl(topicHostURL);
}
// Topic connection factory name - XML Schema default is jms/TopLinkTopicConnectionFactory
tm.setTopicConnectionFactoryName(tmConfig.getTopicConnectionFactoryName());
// Topic name - XML Schema default is jms/TopLinkTopic
tm.setTopicName(tmConfig.getTopicName());
// Process the common elements in TransportManagerConfig
processTransportManagerConfig(tmConfig, tm);
}
/**
* INTERNAL:
*/
@SuppressWarnings({"unchecked", "rawtypes"})
protected void buildOc4jJGroupsTransportManagerConfig(Oc4jJGroupsTransportManagerConfig tmConfig, RemoteCommandManager rcm) {
TransportManager tm = null;
try {
Class<TransportManager> tmClass = (Class<TransportManager>) m_classLoader.loadClass(tmConfig.getTransportManagerClassName());
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
Constructor<TransportManager> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(tmClass, new Class[] { RemoteCommandManager.class, boolean.class, String.class }, false));
tm = AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(constructor, new Object[] { rcm, tmConfig.useSingleThreadedNotification(), tmConfig.getTopicName() }));
}else{
Constructor<TransportManager> constructor = PrivilegedAccessHelper.getConstructorFor(tmClass, new Class[] { RemoteCommandManager.class, boolean.class, String.class }, false);
tm = PrivilegedAccessHelper.invokeConstructor(constructor, new Object[] { rcm, tmConfig.useSingleThreadedNotification(), tmConfig.getTopicName() });
}
} catch (Exception e) {
throw SessionLoaderException.failedToParseXML("Oc4jJGroupsTransportManager class is invalid: " + tmConfig.getTransportManagerClassName(), e);
}
// Set the transport manager. This will initialize the DiscoveryManager
rcm.setTransportManager(tm);
// Process the common elements in TransportManagerConfig
processTransportManagerConfig(tmConfig, tm);
}
/**
* INTERNAL:
*/
protected void buildUserDefinedTransportManagerConfig(UserDefinedTransportManagerConfig tmConfig, RemoteCommandManager rcm) {
TransportManager tm = null;
// Transport class
String transportManagerClassName = tmConfig.getTransportClass();
if (transportManagerClassName != null) {
try {
@SuppressWarnings({"unchecked"})
Class<TransportManager> transportManagerClass = (Class<TransportManager>) m_classLoader.loadClass(transportManagerClassName);
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
tm = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(transportManagerClass));
}else{
tm = PrivilegedAccessHelper.newInstanceFromClass(transportManagerClass);
}
} catch (Exception exception) {
throw SessionLoaderException.failedToLoadTag("transport-class", transportManagerClassName, exception);
}
// Set the transport manager. This will initialize the DiscoveryManager
rcm.setTransportManager(tm);
// Process the common elements in TransportManagerConfig
processTransportManagerConfig(tmConfig, tm);
}
}
/**
* INTERNAL:
*/
protected void processJNDINamingServiceConfig(JNDINamingServiceConfig namingConfig, TransportManager tm) {
// URL
String url = namingConfig.getURL();
if (url != null) {
tm.getRemoteCommandManager().setUrl(url);
}
// Username - XML Schema default is admin
tm.setUserName(namingConfig.getUsername());
// Encryption class - XML Schema default is org.eclipse.persistence.internal.security.JCEEncryptor
tm.setEncryptionClassName(namingConfig.getEncryptionClass());
// Password - XML Schema default is password
tm.setEncryptedPassword(namingConfig.getEncryptedPassword());
// Initial context factory name - XML Schema is weblogic.jndi.WLInitialContextFactory
tm.setInitialContextFactoryName(namingConfig.getInitialContextFactoryName());
// Properties (assumes they are all valid)
Enumeration<PropertyConfig> e = namingConfig.getPropertyConfigs().elements();
while (e.hasMoreElements()) {
PropertyConfig propertyConfig = e.nextElement();
tm.getRemoteContextProperties().put(propertyConfig.getName(), propertyConfig.getValue());
}
}
/**
* INTERNAL:
*/
protected void processRMIRegistryNamingServiceConfig(RMIRegistryNamingServiceConfig namingConfig, TransportManager tm) {
// URL
tm.getRemoteCommandManager().setUrl(namingConfig.getURL());
}
/**
* INTERNAL:
*/
protected void processDiscoveryConfig(DiscoveryConfig discoveryConfig, DiscoveryManager discoveryManager) {
// Multicast group address - XML Schema default is 226.10.12.64
discoveryManager.setMulticastGroupAddress(discoveryConfig.getMulticastGroupAddress());
// Mutlicast port - XML Schema default is 3121
discoveryManager.setMulticastPort(discoveryConfig.getMulticastPort());
// Announcement delay - XML Schema default is 1000
discoveryManager.setAnnouncementDelay(discoveryConfig.getAnnouncementDelay());
//Packet time-to-live - XML Schema default is 2
discoveryManager.setPacketTimeToLive(discoveryConfig.getPacketTimeToLive());
}
/**
* INTERNAL:
*/
protected void processTransportManagerConfig(TransportManagerConfig tmConfig, TransportManager tm) {
// On connection error - Can only be DiscardConnection (true) or
// KeepConnection (false), validated by the schema
// XML Schema default is DiscardConnection
tm.setShouldRemoveConnectionOnError(tmConfig.getOnConnectionError().equals("DiscardConnection"));
}
/**
* INTERNAL:
*/
protected void processSessionEventManagerConfig(SessionEventManagerConfig sessionEventManagerConfig, AbstractSession session) {
if (sessionEventManagerConfig != null) {
Enumeration<String> e = sessionEventManagerConfig.getSessionEventListeners().elements();
while (e.hasMoreElements()) {
String listenerClassName = e.nextElement();
try {
@SuppressWarnings({"unchecked"})
Class<SessionEventListener> listenerClass = (Class<SessionEventListener>) m_classLoader.loadClass(listenerClassName);
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
session.getEventManager().addListener(AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(listenerClass)));
}else{
}
session.getEventManager().addListener(PrivilegedAccessHelper.newInstanceFromClass(listenerClass));
} catch (Exception exception) {
throw SessionLoaderException.failedToLoadTag("event-listener-class", listenerClassName, exception);
}
}
}
}
/**
* INTERNAL:
*/
protected SessionLog buildSessionLog(LogConfig logConfig, AbstractSession session) {
if (logConfig instanceof JavaLogConfig) {
return buildJavaLogConfig((JavaLogConfig)logConfig, session);
} else if (logConfig instanceof DefaultSessionLogConfig) {
return buildDefaultSessionLogConfig((DefaultSessionLogConfig)logConfig);
} else if (logConfig instanceof ServerLogConfig) {
return buildServerLogConfig((ServerLogConfig)logConfig, session);
} else {
return null;
}
}
/**
* INTERNAL:
*/
@SuppressWarnings({"unchecked"})
protected SessionLog buildJavaLogConfig(JavaLogConfig javaLogConfig, AbstractSession session) {
SessionLog javaLog = null;
try {
// use ConversionManager to avoid loading the JDK 1.4 class unless it is needed.
ConversionManager conversionManager = new ConversionManager();
conversionManager.setLoader(getClass().getClassLoader());
javaLog = ((Class<SessionLog>)conversionManager.convertObject("org.eclipse.persistence.logging.JavaLog", Class.class)).getConstructor().newInstance();
javaLog.setSession(session);
} catch (Exception exception) {
throw ValidationException.unableToLoadClass("org.eclipse.persistence.logging.JavaLog", exception);
}
// Process the common elements from LogConfig
processLogConfig(javaLogConfig, javaLog);
return javaLog;
}
/**
* INTERNAL:
* Wrapped by the getSessionLog() call, therefore, config can't be null at
* this point.
*/
protected SessionLog buildDefaultSessionLogConfig(DefaultSessionLogConfig defaultSessionLogConfig) {
DefaultSessionLog defaultSessionLog = new DefaultSessionLog();
// Log level - XML Schema default is info
defaultSessionLog.setLevel(m_logLevels.get(defaultSessionLogConfig.getLogLevel()));
// Filename - setWriter will handle nulls
defaultSessionLog.setWriter(defaultSessionLogConfig.getFilename());
// Process the common elements from LogConfig
processLogConfig(defaultSessionLogConfig, defaultSessionLog);
return defaultSessionLog;
}
/**
* INTERNAL:
*/
protected SessionLog buildServerLogConfig(ServerLogConfig serverLogConfig, AbstractSession session) {
SessionLog serverLog = session.getServerPlatform().getServerLog();
return serverLog;
}
/**
* INTERNAL:
*/
protected void processLogConfig(LogConfig logConfig, SessionLog log) {
if (logConfig.getLoggingOptions() != null) {
if (logConfig.getLoggingOptions().getShouldLogExceptionStackTrace() != null) {
log.setShouldLogExceptionStackTrace(logConfig.getLoggingOptions().getShouldLogExceptionStackTrace());
}
if (logConfig.getLoggingOptions().getShouldPrintConnection() != null) {
log.setShouldPrintConnection(logConfig.getLoggingOptions().getShouldPrintConnection());
}
if (logConfig.getLoggingOptions().getShouldPrintDate() != null) {
log.setShouldPrintDate(logConfig.getLoggingOptions().getShouldPrintDate());
}
if (logConfig.getLoggingOptions().getShouldPrintSession() != null) {
log.setShouldPrintSession(logConfig.getLoggingOptions().getShouldPrintSession());
}
if (logConfig.getLoggingOptions().getShouldPrintThread() != null) {
log.setShouldPrintThread(logConfig.getLoggingOptions().getShouldPrintThread());
}
}
}
/**
* INTERNAL:
* Builds a Sun CORBA transport manager with the given remote command manager
*/
protected void buildSunCORBATransportManagerConfig(SunCORBATransportManagerConfig tmConfig, RemoteCommandManager rcm) {
TransportManager tm = TransportManager.newSunCORBATransportManager(rcm);
// Set the transport manager. This will initialize the DiscoveryManager
rcm.setTransportManager(tm);
// Process the common elements in TransportManagerConfig
processTransportManagerConfig(tmConfig, tm);
}
/**
* INTERNAL:
*/
protected void processCommandsConfig(CommandsConfig commandsConfig, RemoteCommandManager rcm) {
if (commandsConfig != null) {
// cache-sync - XML Schema default is false
((AbstractSession)rcm.getCommandProcessor()).setShouldPropagateChanges(commandsConfig.getCacheSync());
}
}
/**
* INTERNAL:
* Builds a session broker from the given SessionBrokerConfig.
*/
protected SessionBroker buildSessionBrokerConfig(SessionBrokerConfig sessionBrokerConfig) {
SessionBroker sessionBroker = new SessionBroker();
// Session names
Enumeration<String> sessionNames = sessionBrokerConfig.getSessionNames().elements();
while (sessionNames.hasMoreElements()) {
// Register the sessions
String sessionName = sessionNames.nextElement();
sessionBroker.registerSession(sessionName, (AbstractSession)m_sessions.get(sessionName));
}
// Process the common elements in SessionConfig
processSessionConfig(sessionBrokerConfig, sessionBroker);
return sessionBroker;
}
}