Author: djencks Date: Mon Nov 1 12:55:35 2004 New Revision: 56280 Modified: geronimo/trunk/modules/assembly/src/plan/j2ee-deployer-plan.xml geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java geronimo/trunk/modules/connector/src/schema/geronimo-connector_1_5.xsd geronimo/trunk/modules/connector/src/test-data/connector_1_0/ra.xml geronimo/trunk/modules/connector/src/test-data/connector_1_5/ra.xml geronimo/trunk/modules/connector/src/test-data/data/external-application-plan.xml geronimo/trunk/modules/connector/src/test/org/apache/geronimo/connector/deployment/RAR_1_0ConfigBuilderTest.java geronimo/trunk/modules/connector/src/test/org/apache/geronimo/connector/deployment/RAR_1_5ConfigBuilderTest.java Log: GERONIMO-413. Transaction support is now defaulted from ra.xml if not in plan. XA default config set in ConnectorModuleBuilder gbean attributes
Modified: geronimo/trunk/modules/assembly/src/plan/j2ee-deployer-plan.xml ============================================================================== --- geronimo/trunk/modules/assembly/src/plan/j2ee-deployer-plan.xml (original) +++ geronimo/trunk/modules/assembly/src/plan/j2ee-deployer-plan.xml Mon Nov 1 12:55:35 2004 @@ -114,6 +114,8 @@ <attribute name="defaultMinSize" type="int">0</attribute> <attribute name="defaultBlockingTimeoutMilliseconds" type="int">5000</attribute> <attribute name="defaultIdleTimeoutMinutes" type="int">15</attribute> + <attribute name="defaultXATransactionCaching" type="boolean">true</attribute> + <attribute name="defaultXAThreadCaching" type="boolean">false</attribute> </gbean> <gbean name="geronimo.deployer:role=ModuleBuilder,type=AppClient,config=org/apache/geronimo/J2EEDeployer" class="org.apache.geronimo.client.builder.AppClientModuleBuilder"> Modified: geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml ============================================================================== --- geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml (original) +++ geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml Mon Nov 1 12:55:35 2004 @@ -273,6 +273,8 @@ <attribute name="defaultMinSize" type="int">0</attribute> <attribute name="defaultBlockingTimeoutMilliseconds" type="int">5000</attribute> <attribute name="defaultIdleTimeoutMinutes" type="int">15</attribute> + <attribute name="defaultXATransactionCaching" type="boolean">true</attribute> + <attribute name="defaultXAThreadCaching" type="boolean">false</attribute> </gbean> <gbean name="geronimo.deployer:role=ModuleBuilder,type=AppClient,config=org/apache/geronimo/Server" class="org.apache.geronimo.client.builder.AppClientModuleBuilder"> Modified: geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java ============================================================================== --- geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java (original) +++ geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java Mon Nov 1 12:55:35 2004 @@ -112,13 +112,17 @@ private final int defaultMinSize; private final int defaultBlockingTimeoutMilliseconds; private final int defaultIdleTimeoutMinutes; + private final boolean defaultXATransactionCaching; + private final boolean defaultXAThreadCaching; private final Kernel kernel; - public ConnectorModuleBuilder(int defaultMaxSize, int defaultMinSize, int defaultBlockingTimeoutMilliseconds, int defaultIdleTimeoutMinutes, Kernel kernel) { + public ConnectorModuleBuilder(int defaultMaxSize, int defaultMinSize, int defaultBlockingTimeoutMilliseconds, int defaultIdleTimeoutMinutes, boolean defaultXATransactionCaching, boolean defaultXAThreadCaching, Kernel kernel) { this.defaultMaxSize = defaultMaxSize; this.defaultMinSize = defaultMinSize; this.defaultBlockingTimeoutMilliseconds = defaultBlockingTimeoutMilliseconds; this.defaultIdleTimeoutMinutes = defaultIdleTimeoutMinutes; + this.defaultXATransactionCaching = defaultXATransactionCaching; + this.defaultXAThreadCaching = defaultXAThreadCaching; this.kernel = kernel; } @@ -347,6 +351,12 @@ private void addConnectorGBeans(EARContext earContext, J2eeContext j2eeContext, ConnectorType10 connector, GerConnectorType geronimoConnector, ClassLoader cl) throws DeploymentException { ResourceadapterType10 resourceAdapter = connector.getResourceadapter(); + String managedConnectionFactoryClass = resourceAdapter.getManagedconnectionfactoryClass().getStringValue().trim(); + String connectionFactoryInterface = resourceAdapter.getConnectionfactoryInterface().getStringValue().trim(); + String connectionFactoryImplClass = resourceAdapter.getConnectionfactoryImplClass().getStringValue().trim(); + String connectionInterface = resourceAdapter.getConnectionInterface().getStringValue().trim(); + String connectionImplClass = resourceAdapter.getConnectionImplClass().getStringValue().trim(); + String transactionSupport = resourceAdapter.getTransactionSupport().getStringValue().trim(); GerResourceadapterType[] geronimoResourceAdapters = geronimoConnector.getResourceadapterArray(); for (int k = 0; k < geronimoResourceAdapters.length; k++) { GerResourceadapterType geronimoResourceAdapter = geronimoResourceAdapters[k]; @@ -357,14 +367,9 @@ for (int j = 0; j < geronimoConnectionDefinition.getConnectiondefinitionInstanceArray().length; j++) { GerConnectiondefinitionInstanceType connectionfactoryInstance = geronimoConnectionDefinition.getConnectiondefinitionInstanceArray()[j]; - String managedConnectionFactoryClass = resourceAdapter.getManagedconnectionfactoryClass().getStringValue(); - String connectionFactoryInterface = resourceAdapter.getConnectionfactoryInterface().getStringValue(); - String connectionFactoryImplClass = resourceAdapter.getConnectionfactoryImplClass().getStringValue(); - String connectionInterface = resourceAdapter.getConnectionInterface().getStringValue(); - String connectionImplClass = resourceAdapter.getConnectionImplClass().getStringValue(); ConfigProperty[] configProperties = getConfigProperties(resourceAdapter.getConfigPropertyArray(), connectionfactoryInstance.getConfigPropertySettingArray()); - addOutboundGBeans(earContext, j2eeContext, null, connectionfactoryInstance, configProperties, managedConnectionFactoryClass, connectionFactoryInterface, connectionFactoryImplClass, connectionInterface, connectionImplClass, cl); + addOutboundGBeans(earContext, j2eeContext, null, connectionfactoryInstance, configProperties, managedConnectionFactoryClass, connectionFactoryInterface, connectionFactoryImplClass, connectionInterface, connectionImplClass, transactionSupport, cl); } } } @@ -372,6 +377,7 @@ private void addConnectorGBeans(EARContext earContext, J2eeContext moduleJ2eeContext, ConnectorType connector, GerConnectorType geronimoConnector, ClassLoader cl) throws DeploymentException { ResourceadapterType resourceadapter = connector.getResourceadapter(); + String transactionSupport = resourceadapter.getOutboundResourceadapter().getTransactionSupport().getStringValue().trim(); GerResourceadapterType[] geronimoResourceAdapters = geronimoConnector.getResourceadapterArray(); for (int k = 0; k < geronimoResourceAdapters.length; k++) { GerResourceadapterType geronimoResourceAdapter = geronimoResourceAdapters[k]; @@ -433,17 +439,17 @@ if (connectionDefinition == null) { throw new DeploymentException("No connection definition for ConnectionFactory class: " + connectionFactoryInterfaceName); } + String managedConnectionFactoryClass = connectionDefinition.getManagedconnectionfactoryClass().getStringValue().trim(); + String connectionFactoryInterface = connectionDefinition.getConnectionfactoryInterface().getStringValue().trim(); + String connectionFactoryImplClass = connectionDefinition.getConnectionfactoryImplClass().getStringValue().trim(); + String connectionInterface = connectionDefinition.getConnectionInterface().getStringValue().trim(); + String connectionImplClass = connectionDefinition.getConnectionImplClass().getStringValue().trim(); for (int j = 0; j < geronimoConnectionDefinition.getConnectiondefinitionInstanceArray().length; j++) { GerConnectiondefinitionInstanceType connectionfactoryInstance = geronimoConnectionDefinition.getConnectiondefinitionInstanceArray()[j]; - String managedConnectionFactoryClass = connectionDefinition.getManagedconnectionfactoryClass().getStringValue(); - String connectionFactoryInterface = connectionDefinition.getConnectionfactoryInterface().getStringValue(); - String connectionFactoryImplClass = connectionDefinition.getConnectionfactoryImplClass().getStringValue(); - String connectionInterface = connectionDefinition.getConnectionInterface().getStringValue(); - String connectionImplClass = connectionDefinition.getConnectionImplClass().getStringValue(); ConfigProperty[] configProperties = getConfigProperties(connectionDefinition.getConfigPropertyArray(), connectionfactoryInstance.getConfigPropertySettingArray()); - addOutboundGBeans(earContext, moduleJ2eeContext, resourceAdapterObjectName, connectionfactoryInstance, configProperties, managedConnectionFactoryClass, connectionFactoryInterface, connectionFactoryImplClass, connectionInterface, connectionImplClass, cl); + addOutboundGBeans(earContext, moduleJ2eeContext, resourceAdapterObjectName, connectionfactoryInstance, configProperties, managedConnectionFactoryClass, connectionFactoryInterface, connectionFactoryImplClass, connectionInterface, connectionImplClass, transactionSupport, cl); } } } @@ -639,7 +645,7 @@ gbean.setAttribute(name, value); } - private ObjectName configureConnectionManager(EARContext earContext, J2eeContext j2eeContext, GerConnectiondefinitionInstanceType connectionfactoryInstance, ClassLoader cl) throws DeploymentException { + private ObjectName configureConnectionManager(EARContext earContext, J2eeContext j2eeContext, String ddTransactionSupport, GerConnectiondefinitionInstanceType connectionfactoryInstance, ClassLoader cl) throws DeploymentException { if (connectionfactoryInstance.getConnectionmanagerRef() != null) { //we don't configure anything, just use the supplied gbean try { @@ -667,15 +673,21 @@ } else if (connectionManager.isSetXaTransaction()) { transactionSupport = new XATransactions(connectionManager.getXaTransaction().isSetTransactionCaching(), connectionManager.getXaTransaction().isSetThreadCaching()); + } else if ("NoTransaction".equals(ddTransactionSupport)) { + transactionSupport = NoTransactions.INSTANCE; + } else if ("LocalTransaction".equals(ddTransactionSupport)) { + transactionSupport = LocalTransactions.INSTANCE; + } else if ("XATransaction".equals(ddTransactionSupport)) { + transactionSupport = new XATransactions(defaultXATransactionCaching, defaultXAThreadCaching); } else { + //this should not happen throw new DeploymentException("Unexpected transaction support element"); } PoolingSupport pooling = null; if (connectionManager.getSinglePool() != null) { GerSinglepoolType pool = connectionManager.getSinglePool(); - pooling = new SinglePool( - pool.isSetMaxSize() ? pool.getMaxSize() : defaultMaxSize, + pooling = new SinglePool(pool.isSetMaxSize() ? pool.getMaxSize() : defaultMaxSize, pool.isSetMinSize() ? pool.getMinSize() : defaultMinSize, pool.isSetBlockingTimeoutMilliseconds() ? pool.getBlockingTimeoutMilliseconds() : defaultBlockingTimeoutMilliseconds, pool.isSetIdleTimeoutMinutes() ? pool.getIdleTimeoutMinutes() : defaultIdleTimeoutMinutes, @@ -684,8 +696,7 @@ pool.getSelectOneAssumeMatch() != null); } else if (connectionManager.getPartitionedPool() != null) { GerPartitionedpoolType pool = connectionManager.getPartitionedPool(); - pooling = new PartitionedPool( - pool.isSetMaxSize() ? pool.getMaxSize() : defaultMaxSize, + pooling = new PartitionedPool(pool.isSetMaxSize() ? pool.getMaxSize() : defaultMaxSize, pool.isSetMinSize() ? pool.getMinSize() : defaultMinSize, pool.isSetBlockingTimeoutMilliseconds() ? pool.getBlockingTimeoutMilliseconds() : defaultBlockingTimeoutMilliseconds, pool.isSetIdleTimeoutMinutes() ? pool.getIdleTimeoutMinutes() : defaultIdleTimeoutMinutes, @@ -718,9 +729,9 @@ return connectionManagerObjectName; } - private void addOutboundGBeans(EARContext earContext, J2eeContext j2eeContext, ObjectName resourceAdapterObjectName, GerConnectiondefinitionInstanceType connectiondefinitionInstance, ConfigProperty[] configProperties, String managedConnectionFactoryClass, String connectionFactoryInterface, String connectionFactoryImplClass, String connectionInterface, String connectionImplClass, ClassLoader cl) throws DeploymentException { + private void addOutboundGBeans(EARContext earContext, J2eeContext j2eeContext, ObjectName resourceAdapterObjectName, GerConnectiondefinitionInstanceType connectiondefinitionInstance, ConfigProperty[] configProperties, String managedConnectionFactoryClass, String connectionFactoryInterface, String connectionFactoryImplClass, String connectionInterface, String connectionImplClass, String transactionSupport, ClassLoader cl) throws DeploymentException { // ConnectionManager - ObjectName connectionManagerObjectName = configureConnectionManager(earContext, j2eeContext, connectiondefinitionInstance, cl); + ObjectName connectionManagerObjectName = configureConnectionManager(earContext, j2eeContext, transactionSupport, connectiondefinitionInstance, cl); // ManagedConnectionFactory GBeanInfoBuilder managedConnectionFactoryInfoFactory = new GBeanInfoBuilder("org.apache.geronimo.connector.outbound.ManagedConnectionFactoryWrapper", cl); @@ -858,13 +869,15 @@ infoBuilder.addAttribute("defaultMinSize", int.class, true); infoBuilder.addAttribute("defaultBlockingTimeoutMilliseconds", int.class, true); infoBuilder.addAttribute("defaultIdleTimeoutMinutes", int.class, true); + infoBuilder.addAttribute("defaultXATransactionCaching", boolean.class, true); + infoBuilder.addAttribute("defaultXAThreadCaching", boolean.class, true); infoBuilder.addAttribute("kernel", Kernel.class, false); infoBuilder.addInterface(ModuleBuilder.class); infoBuilder.addInterface(ResourceReferenceBuilder.class); - infoBuilder.setConstructor(new String[]{"defaultMaxSize", "defaultMinSize", "defaultBlockingTimeoutMilliseconds", "defaultIdleTimeoutMinutes", "kernel"}); + infoBuilder.setConstructor(new String[]{"defaultMaxSize", "defaultMinSize", "defaultBlockingTimeoutMilliseconds", "defaultIdleTimeoutMinutes", "defaultXATransactionCaching", "defaultXAThreadCaching", "kernel"}); GBEAN_INFO = infoBuilder.getBeanInfo(); } Modified: geronimo/trunk/modules/connector/src/schema/geronimo-connector_1_5.xsd ============================================================================== --- geronimo/trunk/modules/connector/src/schema/geronimo-connector_1_5.xsd (original) +++ geronimo/trunk/modules/connector/src/schema/geronimo-connector_1_5.xsd Mon Nov 1 12:55:35 2004 @@ -264,7 +264,7 @@ <xsd:element name="realm-bridge" type="xsd:string" minOccurs="0"/> - <xsd:choice> + <xsd:choice minOccurs="0"> <xsd:element name="no-transaction"/> <xsd:element name="local-transaction"/> <xsd:element name="xa-transaction" type="ger:xatransaction-Type"/> Modified: geronimo/trunk/modules/connector/src/test-data/connector_1_0/ra.xml ============================================================================== --- geronimo/trunk/modules/connector/src/test-data/connector_1_0/ra.xml (original) +++ geronimo/trunk/modules/connector/src/test-data/connector_1_0/ra.xml Mon Nov 1 12:55:35 2004 @@ -33,7 +33,7 @@ <connectionfactory-impl-class>org.apache.geronimo.connector.mock.MockConnectionFactory</connectionfactory-impl-class> <connection-interface>javax.resource.cci.Connection</connection-interface> <connection-impl-class>org.apache.geronimo.connector.mock.MockConnection</connection-impl-class> - <transaction-support></transaction-support> + <transaction-support>XATransaction</transaction-support> <config-property> <config-property-name>OutboundStringProperty1</config-property-name> <config-property-type>java.lang.String</config-property-type> Modified: geronimo/trunk/modules/connector/src/test-data/connector_1_5/ra.xml ============================================================================== --- geronimo/trunk/modules/connector/src/test-data/connector_1_5/ra.xml (original) +++ geronimo/trunk/modules/connector/src/test-data/connector_1_5/ra.xml Mon Nov 1 12:55:35 2004 @@ -75,7 +75,7 @@ <connection-impl-class>org.apache.geronimo.connector.mock.MockConnection</connection-impl-class> </connection-definition> - <transaction-support>LocalTransaction</transaction-support> + <transaction-support>XATransaction</transaction-support> <authentication-mechanism> <description>description</description> <authentication-mechanism-type>BasicPassword</authentication-mechanism-type> Modified: geronimo/trunk/modules/connector/src/test-data/data/external-application-plan.xml ============================================================================== --- geronimo/trunk/modules/connector/src/test-data/data/external-application-plan.xml (original) +++ geronimo/trunk/modules/connector/src/test-data/data/external-application-plan.xml Mon Nov 1 12:55:35 2004 @@ -65,17 +65,13 @@ </single-pool> </connectionmanager> </connectiondefinition-instance> + <!--test defaults for pool and tx--> <connectiondefinition-instance> <name>ThirdTestOutboundConnectionFactory</name> <config-property-setting name="OutboundStringProperty">StringValue3</config-property-setting> <connectionmanager> <realm-bridge>TargetRealm</realm-bridge> - <xa-transaction> - <transaction-caching/> - </xa-transaction> <partitioned-pool> - <max-size>10</max-size> - <blocking-timeout-milliseconds>5000</blocking-timeout-milliseconds> <match-one/> <partition-by-subject/> </partitioned-pool> @@ -139,6 +135,7 @@ </connectionmanager> </connectiondefinition-instance> </connection-definition> + <!--test defaults for pool and tx--> <connection-definition> <connectionfactory-interface>org.apache.geronimo.connector.mock.ConnectionFactoryExtension</connectionfactory-interface> <connectiondefinition-instance> @@ -146,12 +143,7 @@ <config-property-setting name="OutboundStringProperty1">StringValue3</config-property-setting> <connectionmanager> <realm-bridge>TargetRealm</realm-bridge> - <xa-transaction> - <transaction-caching/> - </xa-transaction> <partitioned-pool> - <max-size>10</max-size> - <blocking-timeout-milliseconds>5000</blocking-timeout-milliseconds> <match-one/> <partition-by-subject/> </partitioned-pool> @@ -162,18 +154,18 @@ </resourceadapter> <adminobject> - <adminobject-interface>org.apache.geronimo.connector.mock.MockAdminObject</adminobject-interface> - <adminobject-class>org.apache.geronimo.connector.mock.MockAdminObjectImpl</adminobject-class> - <adminobject-instance> - <message-destination-name>tweedledee</message-destination-name> - <config-property-setting name="Tweedle">Dee-value</config-property-setting> - </adminobject-instance> - <adminobject-instance> - <message-destination-name>tweedledum</message-destination-name> - <config-property-setting name="Tweedle">Dum-value</config-property-setting> - </adminobject-instance> - </adminobject> - + <adminobject-interface>org.apache.geronimo.connector.mock.MockAdminObject</adminobject-interface> + <adminobject-class>org.apache.geronimo.connector.mock.MockAdminObjectImpl</adminobject-class> + <adminobject-instance> + <message-destination-name>tweedledee</message-destination-name> + <config-property-setting name="Tweedle">Dee-value</config-property-setting> + </adminobject-instance> + <adminobject-instance> + <message-destination-name>tweedledum</message-destination-name> + <config-property-setting name="Tweedle">Dum-value</config-property-setting> + </adminobject-instance> + </adminobject> + </connector> </module> Modified: geronimo/trunk/modules/connector/src/test/org/apache/geronimo/connector/deployment/RAR_1_0ConfigBuilderTest.java ============================================================================== --- geronimo/trunk/modules/connector/src/test/org/apache/geronimo/connector/deployment/RAR_1_0ConfigBuilderTest.java (original) +++ geronimo/trunk/modules/connector/src/test/org/apache/geronimo/connector/deployment/RAR_1_0ConfigBuilderTest.java Mon Nov 1 12:55:35 2004 @@ -67,6 +67,12 @@ private URL geronimoDD; XmlOptions xmlOptions; private List errors; + private boolean defaultXATransactionCaching = true; + private boolean defaultXAThreadCaching = false; + private int defaultMaxSize = 10; + private int defaultMinSize = 0; + private int defaultBlockingTimeoutMilliseconds = 5000; + private int defaultidleTimeoutMinutes = 15; public void testLoadJ2eeDeploymentDescriptor() throws Exception { @@ -176,7 +182,7 @@ ObjectName connectionTrackerName = new ObjectName("geronimo.connector:service=ConnectionTracker"); Kernel kernel = new Kernel("testServer"); - ConnectorModuleBuilder moduleBuilder = new ConnectorModuleBuilder(10, 0, 5000, 15, kernel); + ConnectorModuleBuilder moduleBuilder = new ConnectorModuleBuilder(defaultMaxSize, defaultMinSize, defaultBlockingTimeoutMilliseconds, defaultidleTimeoutMinutes, defaultXATransactionCaching, defaultXAThreadCaching, kernel); File rarFile = action.getRARFile(); ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); @@ -230,7 +236,7 @@ JarFile rarFile = null; try { rarFile = DeploymentUtil.createJarFile(new File(basedir, "target/test-ear-noger.ear")); - EARConfigBuilder configBuilder = new EARConfigBuilder(j2eeServer, null, connectionTrackerName, null, null, null, null, null, null, new ConnectorModuleBuilder(10, 0, 5000, 15, kernel), null, null, kernel); + EARConfigBuilder configBuilder = new EARConfigBuilder(j2eeServer, null, connectionTrackerName, null, null, null, null, null, null, new ConnectorModuleBuilder(defaultMaxSize, defaultMinSize, defaultBlockingTimeoutMilliseconds, defaultidleTimeoutMinutes, defaultXATransactionCaching, defaultXAThreadCaching, kernel), null, null, kernel); File tempDir = null; try { tempDir = DeploymentUtil.createTempDir(); Modified: geronimo/trunk/modules/connector/src/test/org/apache/geronimo/connector/deployment/RAR_1_5ConfigBuilderTest.java ============================================================================== --- geronimo/trunk/modules/connector/src/test/org/apache/geronimo/connector/deployment/RAR_1_5ConfigBuilderTest.java (original) +++ geronimo/trunk/modules/connector/src/test/org/apache/geronimo/connector/deployment/RAR_1_5ConfigBuilderTest.java Mon Nov 1 12:55:35 2004 @@ -65,6 +65,12 @@ private URL geronimoDD; private XmlOptions xmlOptions; private List errors; + private boolean defaultXATransactionCaching = true; + private boolean defaultXAThreadCaching = false; + private int defaultMaxSize = 10; + private int defaultMinSize = 0; + private int defaultBlockingTimeoutMilliseconds = 5000; + private int defaultidleTimeoutMinutes = 15; public void testLoadJ2eeDeploymentDescriptor() throws Exception { InputStream j2eeInputStream = j2eeDD.openStream(); @@ -121,7 +127,7 @@ ObjectName connectionTrackerName = new ObjectName("geronimo.connector:service=ConnectionTracker"); Kernel kernel = new Kernel("testServer"); - ConnectorModuleBuilder moduleBuilder = new ConnectorModuleBuilder(10, 0, 5000, 15, kernel); + ConnectorModuleBuilder moduleBuilder = new ConnectorModuleBuilder(defaultMaxSize, defaultMinSize, defaultBlockingTimeoutMilliseconds, defaultidleTimeoutMinutes, defaultXATransactionCaching, defaultXAThreadCaching, kernel); File rarFile = action.getRARFile(); ClassLoader oldCl = Thread.currentThread().getContextClassLoader();