Author: dblevins
Date: Sat Aug 11 20:03:44 2012
New Revision: 1372013

URL: http://svn.apache.org/viewvc?rev=1372013&view=rev
Log:
[jira is still down for maintenance, not sure what number this is]
Improve the ability to use <Resource> and similar without a service-jar.xml
<Resource> et. al now support 'class-name', 'constructor' and 'factory-name' 
just like <ServiceProvider> does.

Added:
    
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/sys/NoServiceJarTest.java
Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1372013&r1=1372012&r2=1372013&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
 Sat Aug 11 20:03:44 2012
@@ -404,6 +404,7 @@ public class ConfigurationFactory implem
         sys.containerSystem = new ContainerSystemInfo();
         sys.facilities = new FacilitiesInfo();
 
+        // TODO: This is wrong not all services are JndiContexts
         for (Service service : openejb.getServices()) {
             final JndiContextInfo info = configureService(service, 
JndiContextInfo.class);
             sys.facilities.services.add(info);
@@ -930,10 +931,15 @@ public class ConfigurationFactory implem
 
             ServiceProvider provider = resolveServiceProvider(service, 
infoType);
 
-            /* we mock the provider if not found now
             if (provider == null) {
                 final List<ServiceProvider> providers = 
ServiceUtils.getServiceProvidersByServiceType(providerType);
                 final StringBuilder sb = new StringBuilder();
+//                for (ServiceProvider p : providers) {
+//                    sb.append(System.getProperty("line.separator"));
+//                    sb.append("  <").append(p.getService());
+//                    sb.append(" id=\"").append(service.getId()).append('"');
+//                    sb.append(" 
provider=\"").append(p.getId()).append("\"/>");
+//                }
 
                 final List<String> types = new ArrayList<String>();
                 for (final ServiceProvider p : providers) {
@@ -949,15 +955,6 @@ public class ConfigurationFactory implem
                 final String noProviderMessage = 
messages.format("configureService.noProviderForService", providerType, 
service.getId(), service.getType(), service.getProvider(), sb.toString());
                 throw new NoSuchProviderException(noProviderMessage);
             }
-            */
-
-            if (provider == null) { // mock it, service-jar.xml is just a pain 
for simple resources with no real default
-                String type = service.getProperties().getProperty("class");
-                if (type == null) {
-                    type = service.getType();
-                }
-                provider = new ServiceProvider(type, service.getId(), 
providerType);
-            }
 
             if (service.getId() == null) service.setId(provider.getId());
 
@@ -1065,6 +1062,21 @@ public class ConfigurationFactory implem
     @SuppressWarnings({"unchecked"})
     private ServiceProvider resolveServiceProvider(final 
org.apache.openejb.config.Service service, final Class infoType) throws 
OpenEJBException {
 
+        if (service.getClassName() != null) {
+            if (service.getType() == null) {
+                service.setType(service.getClassName());
+            }
+
+            final ServiceProvider provider = new ServiceProvider();
+            provider.setId(service.getId());
+            provider.setService(service.getClass().getSimpleName());
+            provider.getTypes().add(service.getType());
+            provider.setClassName(service.getClassName());
+            provider.setConstructor(service.getConstructor());
+            provider.setFactoryName(service.getFactoryName());
+            return provider;
+        }
+
         if (service.getProvider() != null) {
             return ServiceUtils.getServiceProvider(service.getProvider());
         }

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java?rev=1372013&r1=1372012&r2=1372013&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java
 Sat Aug 11 20:03:44 2012
@@ -54,4 +54,10 @@ public interface Service {
     public String getType();
 
     public void setType(String type);
+
+    public String getClassName();
+
+    public String getConstructor();
+
+    public String getFactoryName();
 }
\ No newline at end of file

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java?rev=1372013&r1=1372012&r2=1372013&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java
 Sat Aug 11 20:03:44 2012
@@ -59,6 +59,24 @@ public abstract class AbstractService im
     @XmlAttribute
     protected String type;
 
+    /**
+     * Mutually exclusive with 'provider'
+     */
+    @XmlAttribute(name = "class-name")
+    protected String className;
+
+    /**
+     * Mutually exclusive with 'provider'
+     */
+    @XmlAttribute(name = "constructor")
+    protected String constructor;
+
+    /**
+     * Mutually exclusive with 'provider'
+     */
+    @XmlAttribute(name = "factory-name")
+    protected String factoryName;
+
 
     protected AbstractService(String id) {
         this(id, null, null);
@@ -171,6 +189,30 @@ public abstract class AbstractService im
         this.type = type;
     }
 
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getConstructor() {
+        return constructor;
+    }
+
+    public void setConstructor(String constructor) {
+        this.constructor = constructor;
+    }
+
+    public String getFactoryName() {
+        return factoryName;
+    }
+
+    public void setFactoryName(String factoryName) {
+        this.factoryName = factoryName;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;

Added: 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/sys/NoServiceJarTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/sys/NoServiceJarTest.java?rev=1372013&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/sys/NoServiceJarTest.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/sys/NoServiceJarTest.java
 Sat Aug 11 20:03:44 2012
@@ -0,0 +1,141 @@
+/*
+ * 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.sys;
+
+import junit.framework.TestCase;
+import org.apache.openejb.AppContext;
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.ResourceInfo;
+import org.apache.openejb.assembler.classic.SecurityServiceInfo;
+import org.apache.openejb.assembler.classic.TransactionServiceInfo;
+import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.SingletonBean;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class NoServiceJarTest extends TestCase {
+
+    public void test() throws Exception {
+        final ConfigurationFactory factory = new ConfigurationFactory();
+        final Assembler assembler = new Assembler();
+
+        final Resource orange = new Resource("Orange");
+        orange.setClassName(Color.class.getName());
+        orange.getProperties().setProperty("red", "255");
+        orange.getProperties().setProperty("green", "200");
+        orange.getProperties().setProperty("blue", "0");
+
+        final ResourceInfo resourceInfo = factory.configureService(orange, 
ResourceInfo.class);
+        assembler.createResource(resourceInfo);
+
+        
assembler.createSecurityService(factory.configureService(SecurityServiceInfo.class));
+        
assembler.createTransactionManager(factory.configureService(TransactionServiceInfo.class));
+
+        final EjbJar ejbJar = new EjbJar();
+        ejbJar.addEnterpriseBean(new SingletonBean(MyBean.class));
+        final AppContext application = 
assembler.createApplication(factory.configureApplication(new 
EjbModule(ejbJar)));
+
+        final MyBean myBean = (MyBean) 
application.getBeanContexts().get(0).getBusinessLocalBeanHome().create();
+
+        final Color color = myBean.getColor();
+        assertNotNull(color);
+        assertEquals(255, color.getRed());
+        assertEquals(200, color.getGreen());
+        assertEquals(0, color.getBlue());
+    }
+
+    public void testInvalid() throws Exception {
+        final ConfigurationFactory factory = new ConfigurationFactory();
+
+        final Resource orange = new Resource("Orange");
+        orange.getProperties().setProperty("red", "255");
+        orange.getProperties().setProperty("green", "200");
+        orange.getProperties().setProperty("blue", "0");
+
+        try {
+            factory.configureService(orange, ResourceInfo.class);
+            fail("OpenEJBException should have been thrown");
+        } catch (OpenEJBException e) {
+            // pass
+        }
+    }
+
+    public void testInvalidJustType() throws Exception {
+        final ConfigurationFactory factory = new ConfigurationFactory();
+
+        final Resource orange = new Resource("Orange");
+        orange.setType(Color.class.getName());
+        orange.getProperties().setProperty("red", "255");
+        orange.getProperties().setProperty("green", "200");
+        orange.getProperties().setProperty("blue", "0");
+
+        try {
+            factory.configureService(orange, ResourceInfo.class);
+            fail("OpenEJBException should have been thrown");
+        } catch (OpenEJBException e) {
+            // pass
+        }
+    }
+
+
+    public static class Color {
+        private int red;
+        private int green;
+        private int blue;
+
+        public Color() {
+        }
+
+        public int getRed() {
+            return red;
+        }
+
+        public void setRed(int red) {
+            this.red = red;
+        }
+
+        public int getGreen() {
+            return green;
+        }
+
+        public void setGreen(int green) {
+            this.green = green;
+        }
+
+        public int getBlue() {
+            return blue;
+        }
+
+        public void setBlue(int blue) {
+            this.blue = blue;
+        }
+    }
+
+    public static class MyBean {
+
+        @javax.annotation.Resource
+        private Color color;
+
+        public Color getColor() {
+            return color;
+        }
+    }
+}


Reply via email to