Author: rmannibucau Date: Sun Sep 14 17:36:39 2014 New Revision: 1624880 URL: http://svn.apache.org/r1624880 Log: TOMEE-1347 resource properties provider feature - backport + global config
Added: tomee/tomee/branches/tomee-1.7.x/container/openejb-api/src/main/java/org/apache/openejb/api/resource/ tomee/tomee/branches/tomee-1.7.x/container/openejb-api/src/main/java/org/apache/openejb/api/resource/PropertiesResourceProvider.java tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/test/java/org/apache/openejb/resource/DefaultPropertiesProviderTest.java tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/test/java/org/apache/openejb/resource/PropertiesProviderTest.java Modified: tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/sys/StackHandler.java Added: tomee/tomee/branches/tomee-1.7.x/container/openejb-api/src/main/java/org/apache/openejb/api/resource/PropertiesResourceProvider.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/container/openejb-api/src/main/java/org/apache/openejb/api/resource/PropertiesResourceProvider.java?rev=1624880&view=auto ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/container/openejb-api/src/main/java/org/apache/openejb/api/resource/PropertiesResourceProvider.java (added) +++ tomee/tomee/branches/tomee-1.7.x/container/openejb-api/src/main/java/org/apache/openejb/api/resource/PropertiesResourceProvider.java Sun Sep 14 17:36:39 2014 @@ -0,0 +1,8 @@ +package org.apache.openejb.api.resource; + +import java.util.Properties; + +// see properties-provider for resources/services +public interface PropertiesResourceProvider { + Properties provides(); +} Modified: tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1624880&r1=1624879&r2=1624880&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original) +++ tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Sun Sep 14 17:36:39 2014 @@ -2661,6 +2661,7 @@ public class Assembler extends Assembler final ObjectRecipe serviceRecipe = new ObjectRecipe(info.className, info.factoryMethod, constructorArgs, null); serviceRecipe.allow(Option.CASE_INSENSITIVE_PROPERTIES); serviceRecipe.allow(Option.IGNORE_MISSING_PROPERTIES); + serviceRecipe.allow(Option.PRIVATE_PROPERTIES); return serviceRecipe; } Modified: tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1624880&r1=1624879&r2=1624880&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java (original) +++ tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java Sun Sep 14 17:36:39 2014 @@ -95,6 +95,8 @@ import org.apache.openejb.util.classload import org.apache.openejb.util.proxy.QueryProxy; import org.apache.xbean.finder.MetaAnnotatedClass; import org.apache.xbean.finder.ResourceFinder; +import org.apache.xbean.recipe.ObjectRecipe; +import org.apache.xbean.recipe.Option; import javax.ejb.embeddable.EJBContainer; import java.io.File; @@ -749,6 +751,7 @@ public class ConfigurationFactory implem service.setClassName(map.remove("class-name")); service.setConstructor(map.remove("constructor")); service.setFactoryName(map.remove("factory-name")); + service.setPropertiesProvider(map.remove("properties-provider")); final String cp = map.remove("classpath"); if (null != cp) { @@ -1140,6 +1143,28 @@ public class ConfigurationFactory implem props.putAll(serviceProperties); props.putAll(overrides); + // force user properties last + String propertiesProvider = service.getPropertiesProvider(); + if (propertiesProvider == null) { + propertiesProvider = SystemInstance.get().getProperty("org.apache.openejb.api.resource.PropertiesResourceProvider"); + } + if (propertiesProvider != null) { + // don't trim them, user wants to handle it himself, let him do it + final ObjectRecipe recipe = new ObjectRecipe(propertiesProvider); + recipe.allow(Option.CASE_INSENSITIVE_PROPERTIES); + recipe.allow(Option.PRIVATE_PROPERTIES); + recipe.allow(Option.FIELD_INJECTION); + recipe.allow(Option.NAMED_PARAMETERS); + recipe.allow(Option.IGNORE_MISSING_PROPERTIES); + recipe.setFactoryMethod("provides"); + recipe.setProperty("serviceId", service.getId()); + recipe.setProperties(props); + recipe.setProperty("properties", props); // let user get all config + final Properties p = Properties.class.cast(recipe.create()); + + props.putAll(p); + } + props.remove(IGNORE_DEFAULT_VALUES_PROP); if (providerType != null && !provider.getService().equals(providerType)) { Modified: tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java?rev=1624880&r1=1624879&r2=1624880&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java (original) +++ tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java Sun Sep 14 17:36:39 2014 @@ -66,4 +66,5 @@ public interface Service { String getClasspath(); + String getPropertiesProvider(); } \ No newline at end of file Modified: tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java?rev=1624880&r1=1624879&r2=1624880&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java (original) +++ tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java Sun Sep 14 17:36:39 2014 @@ -61,6 +61,8 @@ public abstract class AbstractService im protected String type; @XmlAttribute protected String classpath; + @XmlAttribute(name = "properties-provider") + private String propertiesProvider; /** * Mutually exclusive with 'provider' @@ -263,4 +265,13 @@ public abstract class AbstractService im result = 31 * result + (type != null ? type.hashCode() : 0); return result; } + + public void setPropertiesProvider(final String propertiesProvider) { + this.propertiesProvider = propertiesProvider; + } + + @Override + public String getPropertiesProvider() { + return propertiesProvider; + } } Modified: tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/sys/StackHandler.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/sys/StackHandler.java?rev=1624880&r1=1624879&r2=1624880&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/sys/StackHandler.java (original) +++ tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/sys/StackHandler.java Sun Sep 14 17:36:39 2014 @@ -193,6 +193,7 @@ public class StackHandler extends Defaul public void startElement(final String uri, final String localName, final String qName, final Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); service.setJndi(attributes.getValue("jndi")); + service.setPropertiesProvider(attributes.getValue("property-provider")); final String aliases = attributes.getValue("aliases"); if (aliases != null) { @@ -211,6 +212,7 @@ public class StackHandler extends Defaul final List<String> attributes = super.getAttributes(); attributes.add("jndi"); attributes.add("aliases"); + attributes.add("properties-provider"); return attributes; } } Added: tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/test/java/org/apache/openejb/resource/DefaultPropertiesProviderTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/test/java/org/apache/openejb/resource/DefaultPropertiesProviderTest.java?rev=1624880&view=auto ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/test/java/org/apache/openejb/resource/DefaultPropertiesProviderTest.java (added) +++ tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/test/java/org/apache/openejb/resource/DefaultPropertiesProviderTest.java Sun Sep 14 17:36:39 2014 @@ -0,0 +1,106 @@ +/* + * 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.resource; + +import org.apache.openejb.api.resource.PropertiesResourceProvider; +import org.apache.openejb.jee.WebApp; +import org.apache.openejb.junit.ApplicationComposer; +import org.apache.openejb.testing.Configuration; +import org.apache.openejb.testing.Module; +import org.junit.Test; +import org.junit.runner.RunWith; + +import javax.annotation.Resource; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; + +@RunWith(ApplicationComposer.class) +public class DefaultPropertiesProviderTest { + @Resource(name = "r1") + private MyResource r1; + + @Resource(name = "_r2") + private MyResource r2; + + @Resource(name = "_r3") + private MyResource r3; + + @Test + public void valid() { + assertEquals("r1", r1.value); + assertEquals("2", r2.value); + assertEquals("3", r3.value); + } + + @Module + public WebApp bean() { + return new WebApp(); + } + + @Configuration + public Properties config() { + final Properties p = new Properties(); + p.put(PropertiesResourceProvider.class.getName(), GlobalPropertiesProvider.class.getName()); + + p.put("r1", "new://Resource?" + + "class-name=org.apache.openejb.resource.DefaultPropertiesProviderTest$MyResource"); + p.put("r1.value", "_____________________"); + + p.put("_r2", "new://Resource?" + + "class-name=org.apache.openejb.resource.DefaultPropertiesProviderTest$MyResource" + + "&properties-provider=org.apache.openejb.resource.DefaultPropertiesProviderTest$SpecificPropertiesProvider"); + p.put("_r2.value", "____________________"); + + p.put("_r3", "new://Resource?" + + "class-name=org.apache.openejb.resource.DefaultPropertiesProviderTest$MyResource"); + p.put("_r3.value", "3"); + + return p; + } + + public static class MyResource { + private String value; + } + + public static class GlobalPropertiesProvider { + private Properties p; + private String serviceId; + + public void setProperties(final Properties p) { + this.p = p; + } + + public Properties provides() { + if (serviceId.startsWith("_r")) { + return new Properties(); + } + return new Properties() {{ + putAll(p); + setProperty("value", serviceId); + }}; + } + } + + public static class SpecificPropertiesProvider { + public Properties provides() { + return new Properties() {{ + setProperty("value", "2"); // override + }}; + } + } +} Added: tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/test/java/org/apache/openejb/resource/PropertiesProviderTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/test/java/org/apache/openejb/resource/PropertiesProviderTest.java?rev=1624880&view=auto ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/test/java/org/apache/openejb/resource/PropertiesProviderTest.java (added) +++ tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/test/java/org/apache/openejb/resource/PropertiesProviderTest.java Sun Sep 14 17:36:39 2014 @@ -0,0 +1,104 @@ +/* + * 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.resource; + +import org.apache.openejb.jee.EnterpriseBean; +import org.apache.openejb.jee.SingletonBean; +import org.apache.openejb.junit.ApplicationComposer; +import org.apache.openejb.testing.Configuration; +import org.apache.openejb.testing.Module; +import org.junit.Test; +import org.junit.runner.RunWith; + +import javax.annotation.Resource; +import javax.ejb.EJB; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; + +@RunWith(ApplicationComposer.class) +public class PropertiesProviderTest { + @EJB + private CustomPropBean bean; + + @Test + public void validAliases() { + assertEquals("r2", bean.getR2().value); + assertEquals("ok", bean.getR2().noConflict); + assertEquals("r1", bean.getR1().value); + assertEquals("ok", bean.getR1().noConflict); + } + + @Module + public EnterpriseBean bean() { + return new SingletonBean(CustomPropBean.class).localBean(); + } + + @Configuration + public Properties config() { + final Properties p = new Properties(); + + p.put("r1", "new://Resource?" + + "class-name=org.apache.openejb.resource.PropertiesProviderTest$MyResource&" + + "properties-provider=org.apache.openejb.resource.PropertiesProviderTest$PropertiesProvider"); + p.put("r1.value", "will be overriden"); + p.put("r1.noConflict", "ok"); + + p.put("r2", "new://Resource?" + + "class-name=org.apache.openejb.resource.PropertiesProviderTest$MyResource"); + p.put("r2.value", "r2"); + p.put("r2.noConflict", "ok"); + + return p; + } + + public static class CustomPropBean { + @Resource(name = "r1") + private MyResource r1; + + @Resource(name = "r2") + private MyResource r2; + + public MyResource getR1() { + return r1; + } + + public MyResource getR2() { + return r2; + } + } + + public static class MyResource { + private String value; + private String noConflict; + } + + public static class PropertiesProvider { + private Properties p; + + public void setProperties(final Properties p) { + this.p = p; + } + + public Properties provides() { + return new Properties() {{ + putAll(p); + setProperty("value", "r1"); // override + }}; + } + } +}