Author: rmannibucau Date: Tue Apr 30 06:42:04 2013 New Revision: 1477484 URL: http://svn.apache.org/r1477484 Log: TOMEE-263 datasources are particular resource type we need to create from tomee side even when defined in tomcat
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java tomee/tomee/trunk/tck/cdi-tomee/src/test/resources/webapps-failing.xml tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatResourceFactory.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/TomEEDataSourceRealm.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1477484&r1=1477483&r2=1477484&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Tue Apr 30 06:42:04 2013 @@ -1960,15 +1960,21 @@ public class AutoConfig implements Dynam return idd; } - private String findResourceId(String resourceId, final String type, final Properties required, final AppResources appResources) { + private String findResourceId(final String resourceId, final String type, final Properties required, final AppResources appResources) { if (resourceId == null) { return null; } + return findResourceId(getResourceIds(appResources, type, required), resourceId); + } - resourceId = normalizeResourceId(resourceId); + public static String findResourceId(final Collection<String> resourceIds, final String inId) { + if (inId == null) { + return null; + } + + final String resourceId = normalizeResourceId(inId); // check for existing resource with specified resourceId - final List<String> resourceIds = getResourceIds(appResources, type, required); for (final String id : resourceIds) { if (id.equalsIgnoreCase(resourceId)) { return id; @@ -2000,12 +2006,12 @@ public class AutoConfig implements Dynam return resourceIds; } - private String toShortName(final String resourceId) { + private static String toShortName(final String resourceId) { // check for an existing resource using the short name (everything ever the final '/') return resourceId.replaceFirst(".*/", ""); } - private String normalizeResourceId(String resourceId) { + private static String normalizeResourceId(String resourceId) { if (resourceId == null) { return null; } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1477484&r1=1477483&r2=1477484&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java Tue Apr 30 06:42:04 2013 @@ -1347,7 +1347,7 @@ public class ConfigurationFactory implem return getResourceIds(type, null); } - protected List<String> getResourceIds(final String type, Properties required) { + public List<String> getResourceIds(final String type, Properties required) { final List<String> resourceIds = new ArrayList<String>(); if (required == null) Modified: tomee/tomee/trunk/tck/cdi-tomee/src/test/resources/webapps-failing.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tck/cdi-tomee/src/test/resources/webapps-failing.xml?rev=1477484&r1=1477483&r2=1477484&view=diff ============================================================================== --- tomee/tomee/trunk/tck/cdi-tomee/src/test/resources/webapps-failing.xml (original) +++ tomee/tomee/trunk/tck/cdi-tomee/src/test/resources/webapps-failing.xml Tue Apr 30 06:42:04 2013 @@ -24,67 +24,19 @@ <!--<package name="org.jboss.jsr299.tck.interceptors.tests.*"/>--> <!--</packages>--> <classes> - <class name="org.jboss.jsr299.tck.tests.context.application.ejb.ApplicationContextSharedTest"/> - <class name="org.jboss.jsr299.tck.tests.context.dependent.ejb.DependentContextEjbTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.PassivatingContextTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.enterpriseBeanWithNonPassivatingBeanConstructorParameterInInterceptor.EnterpriseBeanWithNonPassivatingBeanConstructorParameterInInterceptorTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.enterpriseBeanWithNonPassivatingConstructorFieldInDecorator.EnterpriseBeanWithNonPassivatingFieldInDecoratorTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.enterpriseBeanWithNonPassivatingInitializerInDecorator.EnterpriseBeanWithNonPassivatingInitializerInDecoratorTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.enterpriseBeanWithNonPassivatingInitializerParameterInInterceptor.EnterpriseBeanWithNonPassivatingInitializerParameterInInterceptorTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.enterpriseBeanWithNonPassivatingInjectedFieldInDecorator.EnterpriseBeanWithNonPassivatingInjectedFieldInDecoratorTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.enterpriseBeanWithNonPassivatingInjectedFieldInInterceptor.EnterpriseBeanWithNonPassivatingInjectedFieldInInterceptorTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.enterpriseBeanWithNonSerializableIntializerMethod.EnterpriseBeanWithNonSerializableIntializerMethodTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.finalProducerFieldNotPassivationCapable.NonPassivationCapableProducerFieldTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.managedBeanWithNonPassivatingDecorator.ManagedBeanWithNonPassivatingDecoratorTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.nonPassivationCapableProducerField.NonPassivationCapableProducerFieldTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.nonPassivationCapableProducerMethod.NonPassivationCapableProducerMethodTest"/> - <class name="org.jboss.jsr299.tck.tests.context.passivating.broken.unserializableSimpleInjectedIntoPassivatingEnterpriseBean.UnserializableSimpleInjectedIntoPassivatingEnterpriseBeanTest"/> - <class name="org.jboss.jsr299.tck.tests.context.request.ejb.EJBRequestContextTest"/> - <class name="org.jboss.jsr299.tck.tests.context.session.SessionContextTest"/> - <class name="org.jboss.jsr299.tck.tests.decorators.invocation.EJBDecoratorInvocationTest"/> - <class name="org.jboss.jsr299.tck.tests.definition.qualifier.enterprise.EnterpriseQualifierDefinitionTest"/> - <class name="org.jboss.jsr299.tck.tests.definition.scope.enterprise.EnterpriseScopeDefinitionTest"/> - <class name="org.jboss.jsr299.tck.tests.definition.stereotype.enterprise.EnterpriseStereotypeDefinitionTest"/> - <class name="org.jboss.jsr299.tck.tests.deployment.lifecycle.broken.failsDuringBeanDiscovery.DeploymentFailureTest"/> - <class name="org.jboss.jsr299.tck.tests.deployment.packaging.bundledLibrary.LibraryInEarTest"/> - <class name="org.jboss.jsr299.tck.tests.event.broken.observer.notBusinessMethod.EJBObserverMethodNotBusinessMethodTest"/> - <class name="org.jboss.jsr299.tck.tests.event.observer.enterprise.EnterpriseEventInheritenceTest"/> - <class name="org.jboss.jsr299.tck.tests.extensions.container.event.ContainerEventTest"/> - <class name="org.jboss.jsr299.tck.tests.extensions.processBean.ProcessSessionBeanTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.builtin.BuiltInBeansTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.disposal.method.definition.broken.methodOnSessionBean.DisposalMethodOnSessionBean"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.broken.singletonWithConversationScope.SingletonWithConversationScopeTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.broken.singletonWithRequestScope.SingletonWithRequestScopeTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.broken.singletonWithSessionScope.SingletonWithSessionScopeTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.broken.statelessWithApplicationScope.StatelessWithApplicationScopeTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.broken.statelessWithConversationScope.StatelessWithConversationScopeTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.broken.statelessWithRequestScope.StatelessWithRequestScopeTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.broken.statelessWithSessionScope.StatelessWithSessionScopeTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.definition.EnterpriseBeanDefinitionTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.definition.EnterpriseBeanViaXmlTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.lifecycle.EnterpriseBeanLifecycleTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.newBean.NewEnterpriseBeanICTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.newBean.NewEnterpriseBeanTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.remove.EnterpriseBeanRemoveMethodTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.initializer.EjbInitializerMethodTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.initializer.InitializerMethodTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.producer.field.definition.enterprise.EnterpriseProducerFieldDefinitionTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.producer.method.broken.enterprise.nonbusiness.ProducerMethodNotBusinessMethodTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.producer.method.definition.enterprise.EnterpriseProducerMethodDefinitionTest"/> - <class name="org.jboss.jsr299.tck.tests.implementation.simple.resource.ejb.EjbInjectionTest"/> - <class name="org.jboss.jsr299.tck.tests.inheritance.specialization.enterprise.EnterpriseBeanSpecializationIntegrationTest"/> - <class name="org.jboss.jsr299.tck.tests.inheritance.specialization.enterprise.EnterpriseBeanSpecializationTest"/> - <class name="org.jboss.jsr299.tck.tests.inheritance.specialization.enterprise.broken.directlyExtendsNothing.DirectlyExtendsNothingTest"/> - <class name="org.jboss.jsr299.tck.tests.inheritance.specialization.enterprise.broken.directlyExtendsSimpleBean.DirectlyExtendsSimpleBeanTest"/> - <class name="org.jboss.jsr299.tck.tests.inheritance.specialization.enterprise.broken.implementInterfaceAndExtendsNothing.ImplementsInterfaceAndExtendsNothingTest"/> - <class name="org.jboss.jsr299.tck.tests.inheritance.specialization.enterprise.broken.sameName.SameNameTest"/> - <class name="org.jboss.jsr299.tck.tests.inheritance.specialization.simple.broken.extendejb.SpecializingBeanExtendsEnterpriseBeanTest"/> - <class name="org.jboss.jsr299.tck.tests.interceptors.definition.enterprise.interceptorOrder.SessionBeanInterceptorOrderTest"/> - <class name="org.jboss.jsr299.tck.tests.interceptors.definition.enterprise.nonContextualReference.SessionBeanInterceptorOnNonContextualEjbReferenceTest"/> - <class name="org.jboss.jsr299.tck.tests.interceptors.definition.enterprise.simpleInterception.SessionBeanInterceptorDefinitionTest"/> - <class name="org.jboss.jsr299.tck.tests.lookup.injection.enterprise.SessionBeanInjectionOrderingTest"/> - <class name="org.jboss.jsr299.tck.tests.lookup.injection.enterprise.SessionBeanInjectionTest"/> - <class name="org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.EnterpriseResolutionByTypeTest"/> + <!-- + NewEnterpriseBeanTest>AbstractTest.run:244->testNewBeanHasNoObservers:95 null + EnvInjectionTest>AbstractTest.run:244->testProduceEnvProxy:69 » NullPointer + +--> + <class name="org.jboss.jsr299.tck.tests.implementation.simple.resource.env.EnvInjectionTest"/> + <!-- + <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.newBean.NewEnterpriseBeanTest"> + <methods> + <include name="testNewBeanHasNoObservers"/> + </methods> + </class> + --> </classes> </test> </suite> Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java?rev=1477484&r1=1477483&r2=1477484&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java Tue Apr 30 06:42:04 2013 @@ -215,7 +215,7 @@ public class OpenEJBContextConfig extend final ContextResource[] foundResources = resources.findResources(); String[] ids = null; if (foundResources != null) { - for (ContextResource resource : foundResources) { + for (final ContextResource resource : foundResources) { if ("javax.sql.DataSource".equals(resource.getType())) { String jndiName = (String) resource.getProperty("mappedName"); if (jndiName == null) { Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatResourceFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatResourceFactory.java?rev=1477484&r1=1477483&r2=1477484&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatResourceFactory.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatResourceFactory.java Tue Apr 30 06:42:04 2013 @@ -25,6 +25,7 @@ import javax.naming.CompositeName; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.spi.ObjectFactory; +import javax.sql.DataSource; public class TomcatResourceFactory { private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB, TomcatResourceFactory.class); @@ -72,6 +73,8 @@ public class TomcatResourceFactory { // context is null since it can't be used at this moment (see TomcatWebAppBuilder lifecycle) return ((ObjectFactory) instance).getObjectInstance(reference, new CompositeName(jndiName), null, null); } + } else if (reference != null && DataSource.class.equals(reference.getClassName())) { + } } catch (Exception e) { LOGGER.error("Can't create resource " + jndiName, e); Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1477484&r1=1477483&r2=1477484&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java Tue Apr 30 06:42:04 2013 @@ -133,6 +133,7 @@ import javax.servlet.ServletContext; import javax.servlet.SessionTrackingMode; import javax.servlet.jsp.JspApplicationContext; import javax.servlet.jsp.JspFactory; +import javax.sql.DataSource; import javax.transaction.TransactionManager; import javax.transaction.TransactionSynchronizationRegistry; import java.io.File; @@ -150,6 +151,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.Set; import java.util.TreeMap; import java.util.jar.JarEntry; @@ -1028,15 +1030,50 @@ public class TomcatWebAppBuilder impleme } if (!found) { - final Resource newResource = new Resource(name, resource.getType(), "org.apache.tomee:ProvidedByTomcat"); - newResource.getProperties().setProperty("jndiName", newResource.getId()); - newResource.getProperties().setProperty("appName", getId(standardContext)); - newResource.getProperties().setProperty("factory", (String) resource.getProperty("factory")); - - final Reference reference = createReference(resource); - if (reference != null) { - newResource.getProperties().put("reference", reference); + final Resource newResource; + + if (DataSource.class.getName().equals(resource.getType())) { // we forward it to TomEE datasources + newResource = new Resource(name, resource.getType()); + + boolean jta = false; + + final Properties properties = newResource.getProperties(); + final Iterator<String> params = resource.listProperties(); + while (params.hasNext()) { + final String paramName = params.next(); + final String paramValue = (String) resource.getProperty(paramName); + + // handling some param name conversion to OpenEJB style + if ("driverClassName".equals(paramName)) { + properties.setProperty("JdbcDriver", paramValue); + } else if ("url".equals(paramName)) { + properties.setProperty("JdbcUrl", paramValue); + } else { + properties.setProperty(paramName, paramValue); + } + + if ("JtaManaged".equalsIgnoreCase(paramName)) { + jta = Boolean.parseBoolean(paramValue); + } + } + + if (!jta) { + properties.setProperty("JtaManaged", "false"); + } + } else { // custom type, let it be created + newResource = new Resource(name, resource.getType(), "org.apache.tomee:ProvidedByTomcat"); + + final Properties properties = newResource.getProperties(); + properties.setProperty("jndiName", newResource.getId()); + properties.setProperty("appName", getId(standardContext)); + properties.setProperty("factory", (String) resource.getProperty("factory")); + + final Reference reference = createReference(resource); + if (reference != null) { + properties.put("reference", reference); + } } + appModule.getResources().add(newResource); } } Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/TomEEDataSourceRealm.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/TomEEDataSourceRealm.java?rev=1477484&r1=1477483&r2=1477484&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/TomEEDataSourceRealm.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/TomEEDataSourceRealm.java Tue Apr 30 06:42:04 2013 @@ -18,19 +18,28 @@ package org.apache.tomee.catalina.realm; import org.apache.catalina.realm.DataSourceRealm; import org.apache.naming.ContextBindings; +import org.apache.openejb.config.AutoConfig; +import org.apache.openejb.config.ConfigurationFactory; +import org.apache.openejb.loader.SystemInstance; import javax.naming.Context; import javax.naming.NamingException; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; +import java.util.Collection; +import java.util.Properties; public class TomEEDataSourceRealm extends DataSourceRealm { + private String fullName = null; + @Override protected Connection open() { try { // parent behavior final Context context; - if (localDataSource) { + if (fullName != null) { + context = ContextBindings.getClassLoader(); + } else if (localDataSource) { context = Context.class.cast(ContextBindings.getClassLoader().lookup("comp/env")); } else { context = getServer().getGlobalNamingContext(); @@ -43,20 +52,31 @@ public class TomEEDataSourceRealm extend try { // try globally but with custom subspace return getConnection("java:openejb/Resource/" + dataSourceName); } catch (final Exception e3) { - containerLog.error(sm.getString("dataSourceRealm.exception"), e); + final Collection<String> ids = SystemInstance.get().getComponent(ConfigurationFactory.class).getResourceIds(DataSource.class.getName(), new Properties()); + final String id = AutoConfig.findResourceId(ids, dataSourceName); + + if (id != null) { + try { // try globally but with custom subspace + return getConnection("java:openejb/Resource/" + id); + } catch (final Exception e4) { + containerLog.error(sm.getString("dataSourceRealm.exception"), e); + } + } else { + containerLog.error(sm.getString("dataSourceRealm.exception"), e); + } } } catch (final Exception e2) { - // Log the problem for posterity containerLog.error(sm.getString("dataSourceRealm.exception"), e); } } catch (final Exception e) { - // Log the problem for posterity containerLog.error(sm.getString("dataSourceRealm.exception"), e); } return null; } - private static Connection getConnection(final String name) throws SQLException, NamingException { - return DataSource.class.cast(Context.class.cast(ContextBindings.getClassLoader()).lookup(name)).getConnection(); + private Connection getConnection(final String name) throws SQLException, NamingException { + final Connection c = DataSource.class.cast(Context.class.cast(ContextBindings.getClassLoader()).lookup(name)).getConnection(); + fullName = name; // if here, the default name needed to be changed to match requested resource so update it for next calls + return c; } }