Author: dblevins
Date: Wed Aug 15 04:00:20 2012
New Revision: 1373201

URL: http://svn.apache.org/viewvc?rev=1373201&view=rev
Log:
OPENEJB-1887 ServiceProvider inheritance

Added:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/MalformedProviderNameException.java
Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ID.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/InvalidProviderDeclarationException.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ProviderManager.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
    
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/ProviderManagerTest.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ID.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ID.java?rev=1373201&r1=1373200&r2=1373201&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ID.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ID.java
 Wed Aug 15 04:00:20 2012
@@ -64,7 +64,7 @@ public class ID {
             return new ID(parts[0], parts[1]);
         }
 
-        throw new ProviderManager.MalformedProviderNameException(raw);
+        throw new MalformedProviderNameException(raw);
     }
 
     @Override

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/InvalidProviderDeclarationException.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/InvalidProviderDeclarationException.java?rev=1373201&r1=1373200&r2=1373201&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/InvalidProviderDeclarationException.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/InvalidProviderDeclarationException.java
 Wed Aug 15 04:00:20 2012
@@ -27,7 +27,7 @@ public class InvalidProviderDeclarationE
     private final ServiceProvider provider;
 
     public InvalidProviderDeclarationException(String s, ID id, 
ServiceProvider provider) {
-        super(s);
+        super(String.format("%s - %s", id, s));
         this.id = id;
         this.provider = provider;
     }

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/MalformedProviderNameException.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/MalformedProviderNameException.java?rev=1373201&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/MalformedProviderNameException.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/MalformedProviderNameException.java
 Wed Aug 15 04:00:20 2012
@@ -0,0 +1,26 @@
+/*
+ * 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.config.provider;
+
+/**
+* @version $Rev$ $Date$
+*/
+public class MalformedProviderNameException extends IllegalArgumentException {
+    public MalformedProviderNameException(String s) {
+        super(s);
+    }
+}

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ProviderManager.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ProviderManager.java?rev=1373201&r1=1373200&r2=1373201&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ProviderManager.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ProviderManager.java
 Wed Aug 15 04:00:20 2012
@@ -97,8 +97,6 @@ public class ProviderManager {
     private void register(ID id, ServiceProvider provider, Set<ID> seen) {
         if (providers.containsKey(id)) return;
 
-        validate(id, provider);
-
         if (provider.getParent() != null) {
 
             final ID parentId = ID.parse(provider.getParent(), id);
@@ -113,6 +111,8 @@ public class ProviderManager {
             inherit(provider, parent);
         }
 
+        validate(id, provider);
+
         providers.put(id, provider);
     }
 
@@ -120,7 +120,7 @@ public class ProviderManager {
 
         if (n(child.getClassName())) child.setClassName(parent.getClassName());
         if (n(child.getConstructor())) 
child.setConstructor(parent.getConstructor());
-        if (n(child.getFactoryName())) 
child.setDisplayName(parent.getFactoryName());
+        if (n(child.getFactoryName())) 
child.setFactoryName(parent.getFactoryName());
         if (n(child.getDescription())) 
child.setDescription(parent.getDescription());
         if (n(child.getDisplayName())) 
child.setDisplayName(parent.getDisplayName());
         if (n(child.getService())) child.setService(parent.getService());
@@ -172,6 +172,9 @@ public class ProviderManager {
     private void validate(ID id, ServiceProvider provider) {
         id.validate();
 
+        if (provider.getService() == null) {
+            throw new InvalidProviderDeclarationException("'service' attribute 
cannot be null", id, provider);
+        }
         // TODO - validate provider
     }
 
@@ -180,9 +183,4 @@ public class ProviderManager {
     }
 
 
-    public static class MalformedProviderNameException extends 
IllegalArgumentException {
-        public MalformedProviderNameException(String s) {
-            super(s);
-        }
-    }
 }

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java?rev=1373201&r1=1373200&r2=1373201&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
 Wed Aug 15 04:00:20 2012
@@ -180,7 +180,7 @@ public abstract class JaxbOpenejb {
         return servicesJar;
     }
 
-    private static ServicesJar parseServicesJar(InputStream in) throws 
ParserConfigurationException, SAXException, IOException {
+    public static ServicesJar parseServicesJar(InputStream in) throws 
ParserConfigurationException, SAXException, IOException {
         InputSource inputSource = new InputSource(in);
 
         SAXParserFactory factory = SAX_PARSER_FACTORY;
@@ -206,7 +206,7 @@ public abstract class JaxbOpenejb {
                 provider.setFactoryName(att.getValue("", "factory-name"));
                 provider.setConstructor(att.getValue("", "constructor"));
                 provider.setClassName(att.getValue("", "class-name"));
-                provider.setParent(att.getValue("", "provider"));
+                provider.setParent(att.getValue("", "parent"));
                 String typesString = att.getValue("", "types");
                 if (typesString != null){
                     ListAdapter listAdapter = new ListAdapter();

Modified: 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/ProviderManagerTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/ProviderManagerTest.java?rev=1373201&r1=1373200&r2=1373201&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/ProviderManagerTest.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/ProviderManagerTest.java
 Wed Aug 15 04:00:20 2012
@@ -321,6 +321,111 @@ public class ProviderManagerTest extends
         }
     }
 
+    public void testInheritedAttributes() throws Exception {
+
+        final ProviderManager manager = new ProviderManager(new 
ProviderLoader() {
+            @Override
+            public ServiceProvider load(ID id) {
+                if ("color".equalsIgnoreCase(id.getName())) {
+                    final ServiceProvider color = new ServiceProvider();
+                    color.setClassName(Color.class.getName());
+                    color.setFactoryName("fooFactory");
+                    color.setId("Color");
+                    color.setService("Resource");
+                    color.setConstructor("one, two, three");
+                    color.setDescription("the description");
+                    color.setDisplayName("the display name");
+                    color.getProperties().setProperty("red", "0");
+                    color.getProperties().setProperty("green", "0");
+                    color.getProperties().setProperty("blue", "0");
+                    color.getTypes().add(Color.class.getName());
+                    return color;
+                }
+
+                if ("red".equalsIgnoreCase(id.getName())) {
+                    final ServiceProvider red = new ServiceProvider();
+                    red.setId("Red");
+                    red.setParent("Color");
+                    red.getProperties().setProperty("red", "255");
+                    return red;
+                }
+
+                if ("orange".equalsIgnoreCase(id.getName())) {
+                    final ServiceProvider orange = new ServiceProvider();
+                    orange.setId("Orange");
+                    orange.setParent("Red");
+                    orange.getProperties().setProperty("green", "200");
+                    return orange;
+                }
+
+                throw new IllegalStateException(id.toString());
+            }
+
+            @Override
+            public List<ServiceProvider> load(String namespace) {
+                List<ServiceProvider> list = new ArrayList<ServiceProvider>();
+                list.add(load(new ID(namespace, "color")));
+                list.add(load(new ID(namespace, "red")));
+                list.add(load(new ID(namespace, "orange")));
+                return list;
+            }
+        });
+
+        { // Assert Orange
+
+            // Should have inherited from Red
+
+            final ServiceProvider provider = manager.get("dEFAUlT", "orAngE");
+            assertNotNull(provider);
+            assertEquals(Color.class.getName(), provider.getClassName());
+            assertEquals("Resource", provider.getService());
+            assertEquals("one, two, three", provider.getConstructor());
+            assertEquals("the description", provider.getDescription());
+            assertEquals("the display name", provider.getDisplayName());
+            assertEquals("fooFactory", provider.getFactoryName());
+            assertEquals("255", provider.getProperties().getProperty("reD"));
+            assertEquals("200", provider.getProperties().get("grEeN"));
+            assertEquals("0", provider.getProperties().get("bLue"));
+            assertEquals(1, provider.getTypes().size());
+        }
+
+        { // Assert Red
+
+            // Should have inherited green and blue values from Color
+
+            final ServiceProvider provider = manager.get("dEFaulT", "REd");
+            assertNotNull(provider);
+            assertEquals(Color.class.getName(), provider.getClassName());
+            assertEquals("Resource", provider.getService());
+            assertEquals("one, two, three", provider.getConstructor());
+            assertEquals("the description", provider.getDescription());
+            assertEquals("the display name", provider.getDisplayName());
+            assertEquals("fooFactory", provider.getFactoryName());
+            assertEquals("255", provider.getProperties().getProperty("rED"));
+            assertEquals("0", provider.getProperties().get("grEEN"));
+            assertEquals("0", provider.getProperties().get("bLUe"));
+        }
+
+        { // Assert Color
+            // Must be able to retrieve provider and properties in a 
case-insensitive manner
+
+            final ServiceProvider provider = manager.get("DeFaulT", "CoLoR");
+            assertNotNull(provider);
+            assertEquals(Color.class.getName(), provider.getClassName());
+            assertEquals("Resource", provider.getService());
+            assertEquals("one, two, three", provider.getConstructor());
+            assertEquals("the description", provider.getDescription());
+            assertEquals("the display name", provider.getDisplayName());
+            assertEquals("fooFactory", provider.getFactoryName());
+            assertEquals("0", provider.getProperties().getProperty("rEd"));
+            assertEquals("0", provider.getProperties().get("grEEn"));
+            assertEquals("0", provider.getProperties().get("blUE"));
+        }
+
+        assertEquals(3, manager.getAll().size());
+    }
+
+
     public static class Color {
         private int red;
         private int green;


Reply via email to