/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.openejb.assembler.classic; import org.apache.geronimo.transaction.manager.GeronimoTransactionManager; import org.apache.openejb.config.AppModule; import org.apache.openejb.config.EjbModule; import org.apache.openejb.jee.EjbJar; import org.apache.openejb.junit.ApplicationComposer; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.spi.ContainerSystem; import org.apache.openejb.testing.Configuration; import org.apache.openejb.testing.Module; import org.apache.openejb.testng.PropertiesBuilder; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import javax.naming.NamingException; import java.util.Properties; /** * This test ensures that additional properties are not leaked into the properties map when creating a resource * using class-name, without a provider or type. When using "SkipImpliedAttributes" only the properties the * user specified in their configuration should be available in the map. * * With "SkipImpliedAttributes" set to false (the default), ServiceId (the id of the resource itself) and transactionManager * (the Geronimo Transaction Manager) are the only additional properties that should be available for resources to consume. */ @RunWith(ApplicationComposer.class) public class ResourcePropertyLeakTest { @Test public void testResourceProperties() throws NamingException { final MyResource r1 = (MyResource) SystemInstance.get() .getComponent(ContainerSystem.class).getJNDIContext().lookup("openejb/Resource/r1"); Assert.assertEquals(4, r1.properties.size()); Assert.assertTrue(r1.properties.containsKey("prop1")); Assert.assertTrue(r1.properties.containsKey("prop2")); Assert.assertTrue(r1.properties.containsKey("ServiceId")); Assert.assertTrue(r1.properties.containsKey("transactionManager")); Assert.assertEquals("value1", r1.properties.get("prop1")); Assert.assertEquals("value2", r1.properties.get("prop2")); Assert.assertEquals("r1", r1.properties.get("ServiceId")); Assert.assertTrue(GeronimoTransactionManager.class.isInstance(r1.properties.get("transactionManager"))); // Resource 2 should not contain implied attributes final MyResource r2 = (MyResource) SystemInstance.get() .getComponent(ContainerSystem.class).getJNDIContext().lookup("openejb/Resource/r2"); Assert.assertEquals(2, r2.properties.size()); Assert.assertTrue(r2.properties.containsKey("prop1")); Assert.assertTrue(r2.properties.containsKey("prop2")); Assert.assertEquals("value1", r1.properties.get("prop1")); Assert.assertEquals("value2", r1.properties.get("prop2")); } @Module public AppModule application() { final EjbModule ejbModule = new EjbModule(new EjbJar()); final AppModule appModule = new AppModule(Thread.currentThread().getContextClassLoader(), null); appModule.getEjbModules().add(ejbModule); return appModule; } @Configuration public Properties config() { return new PropertiesBuilder() .p("r1", "new://Resource?class-name=org.apache.openejb.assembler.classic.ResourcePropertyLeakTest$MyResource") .p("r1.prop1", "value1") .p("r1.prop2", "value2") .p("r2", "new://Resource?class-name=org.apache.openejb.assembler.classic.ResourcePropertyLeakTest$MyResource") .p("r2.SkipImplicitAttributes", "true") .p("r2.prop1", "value1") .p("r2.prop2", "value2") .build(); } public static class MyResource { private Properties properties; public Properties getProperties() { return properties; } public void setProperties(final Properties properties) { this.properties = properties; } } }