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
+            }};
+        }
+    }
+}


Reply via email to