Author: dain
Date: Sat Sep  8 11:15:15 2007
New Revision: 573889

URL: http://svn.apache.org/viewvc?rev=573889&view=rev
Log:
Switch resource binding code to use new service type field in service provider

Modified:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ServiceUtils.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ListAdapter.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ServiceProvider.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=573889&r1=573888&r2=573889&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
 Sat Sep  8 11:15:15 2007
@@ -21,8 +21,6 @@
 import org.apache.openejb.assembler.classic.ContainerInfo;
 import org.apache.openejb.assembler.classic.ResourceInfo;
 import org.apache.openejb.assembler.classic.LinkResolver;
-import org.apache.openejb.config.sys.JaxbOpenejb;
-import org.apache.openejb.config.sys.Resource;
 import org.apache.openejb.jee.MessageDrivenBean;
 import org.apache.openejb.jee.ActivationConfig;
 import org.apache.openejb.jee.EnterpriseBean;
@@ -50,7 +48,6 @@
 import java.util.Properties;
 import java.util.Set;
 import java.util.TreeSet;
-import java.util.TreeMap;
 import java.util.HashMap;
 import java.net.URI;
 
@@ -58,16 +55,6 @@
     public static Messages messages = new 
Messages("org.apache.openejb.util.resources");
     public static Logger logger = Logger.getInstance(LogCategory.OPENEJB, 
"org.apache.openejb.util.resources");
 
-    private static Map<String,String> defaultResourceIds = new 
TreeMap<String,String>();
-    static {
-        defaultResourceIds.put("javax.sql.DataSource", "Default Unmanaged JDBC 
Database");
-        defaultResourceIds.put("javax.jms.ConnectionFactory", "Default JMS 
Connection Factory");
-        defaultResourceIds.put("javax.jms.QueueConnectionFactory", "Default 
JMS Connection Factory");
-        defaultResourceIds.put("javax.jms.TopicConnectionFactory", "Default 
JMS Connection Factory");
-        defaultResourceIds.put("org.omg.CORBA.ORB", "Default ORB");
-        defaultResourceIds.put("javax.mail.Session", "Default Mail Session");
-    }
-
     private static Set<String> ignoredReferenceTypes = new TreeSet<String>();
     static{
         // Context objects are automatically handled
@@ -697,19 +684,17 @@
             return installResource(beanName, resourceInfo);
         }
 
-        // if there is only one resource, use it
+        // if there are any resources of the desired type, use the first one
         if (resourceIds.size() > 0) {
             return resourceIds.get(0);
         }
 
-        // look for a default resource based on the type
-        Resource resource = getDefaultResource(type);
-        if (resource == null) {
-            // no default resource for this type... give up
-            throw new OpenEJBException("No default resource defined for 
reference '" + resourceId + "' of type '" + type  + "' for '" + beanName + 
"'.");
+        // Auto create a resource using the first provider that can supply a 
resource of the desired type
+        resourceId = ServiceUtils.getServiceProviderId(type);
+        if (resourceId == null) {
+            throw new OpenEJBException("No provider available for resource 
reference '" + resourceId + "' of type '" + type + "' for '" + beanName + "'.");
         }
-        ResourceInfo resourceInfo = configFactory.configureService(resource, 
ResourceInfo.class);
-        logger.warning("Auto-creating a resource with id '" + resourceInfo.id 
+  "' of type '" + type  + " for '" + beanName + "'.  THERE IS LITTLE CHANCE 
THIS WILL WORK!");
+        ResourceInfo resourceInfo = configFactory.configureService(resourceId, 
ResourceInfo.class);
         return installResource(beanName, resourceInfo);
     }
 
@@ -726,17 +711,6 @@
         return resourceInfo.id;
     }
 
-    private Resource getDefaultResource(String type) {
-        String providerId = defaultResourceIds.get(type);
-        if (providerId == null) {
-            return null;
-        }
-        Resource resource = JaxbOpenejb.createResource();
-        resource.setProvider(providerId);
-        resource.setId(providerId);
-        return resource;
-    }
-
     private String getResourceEnvId(String beanName, String resourceId, String 
type) throws OpenEJBException {
         if(resourceId == null){
             return null;
@@ -766,30 +740,15 @@
         logger.info(message);
 
 
-        // if there isn't a type we can't create a default resource
-        if (type == null) {
-            throw new OpenEJBException("No provider available for resource 
reference '" + resourceId + "' of type '" + type + "' for '" + beanName + "'.");
+        // Auto create a resource using the first provider that can supply a 
resource of the desired type
+        String providerId = ServiceUtils.getServiceProviderId(type);
+        if (providerId == null) {
+                throw new OpenEJBException("No provider available for resource 
reference '" + resourceId + "' of type '" + type + "' for '" + beanName + "'.");
         }
-
-        // properties for new resource
         Properties properties = new Properties();
         properties.setProperty("destination", resourceId);
-
-        // Search for a provider like "Default javax.jms.Queue"
-        String longId = "Default " + type;
-        if (ServiceUtils.hasServiceProvider(longId)) {
-            ResourceInfo resourceInfo = 
configFactory.configureService(ResourceInfo.class, resourceId, properties, 
longId, null);
-            return installResource(beanName, resourceInfo);
-        }
-
-        // Search for a provider like "Default Queue"
-        String shortId = "Default " + type.replaceFirst(".*\\.", "");
-        if (ServiceUtils.hasServiceProvider(shortId)) {
-            ResourceInfo resourceInfo = 
configFactory.configureService(ResourceInfo.class, resourceId, properties, 
shortId, null);
-            return installResource(beanName, resourceInfo);
-        }
-
-        throw new OpenEJBException("No provider available for resource 
reference '" + resourceId + "' of type '" + type + "' for '" + beanName + "'.  
Looked for Resource(id=" + longId + ") and Resource(id=" + shortId + ")");
+        ResourceInfo resourceInfo = 
configFactory.configureService(ResourceInfo.class, resourceId, properties, 
providerId, null);
+        return installResource(beanName, resourceInfo);
     }
 
     private String getUsableContainer(Class<? extends ContainerInfo> 
containerInfoType, Object bean) {

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=573889&r1=573888&r2=573889&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
 Sat Sep  8 11:15:15 2007
@@ -601,14 +601,14 @@
 
         OpenEjbConfiguration runningConfig = getRunningConfig();
         for (ResourceInfo resourceInfo : runningConfig.facilities.resources) {
-            if (isResourceType(resourceInfo.properties, type)) {
+            if (isResourceType(resourceInfo.serviceType, type)) {
                 resourceIds.add(resourceInfo.id);
             }
         }
 
         if (sys != null) {
             for (ResourceInfo resourceInfo : sys.facilities.resources) {
-                if (isResourceType(resourceInfo.properties, type)) {
+                if (isResourceType(resourceInfo.serviceType, type)) {
                     resourceIds.add(resourceInfo.id);
                 }
             }
@@ -617,7 +617,7 @@
             // the above sys instance
             if (openejb != null) {
                 for (Resource resource : openejb.getResource()) {
-                    if (isResourceType(resource.getProperties(), type)) {
+                    if (isResourceType(resource.getType(), type)) {
                         resourceIds.add(resource.getId());
                     }
                 }
@@ -626,14 +626,12 @@
         return resourceIds;
     }
 
-    private static boolean isResourceType(Properties properties, String type) {
+    private static boolean isResourceType(String serviceTypes, String type) {
         if (type == null) return true;
+        if (serviceTypes == null) return false;
 
-        String connectionInterfaces = 
properties.getProperty("ConnectionInterface");
-        if (connectionInterfaces == null) return false;
-
-        for (String connectionInterface : connectionInterfaces.split(" *, *")) 
{
-            if (connectionInterface.equals(type)) return true;
+        for (String serviceType : serviceTypes.split(" *, *")) {
+            if (serviceType.equals(type)) return true;
         }
         return false;
     }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ServiceUtils.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ServiceUtils.java?rev=573889&r1=573888&r2=573889&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ServiceUtils.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ServiceUtils.java
 Sat Sep  8 11:15:15 2007
@@ -33,10 +33,11 @@
 import java.util.Map;
 import java.util.Properties;
 import java.util.List;
+import java.util.ArrayList;
 
 public class ServiceUtils {
     public static final String defaultProviderURL = "org.apache.openejb";
-    private static Map<String, Map<String, ServiceProvider>> loadedServiceJars 
= new HashMap<String, Map<String, ServiceProvider>>();
+    private static Map<String, List<ServiceProvider>> loadedServiceJars = new 
HashMap<String, List<ServiceProvider>>();
     public static Messages messages = new 
Messages("org.apache.openejb.util.resources");
     public static Logger logger = Logger.getInstance(LogCategory.OPENEJB, 
"org.apache.openejb.util.resources");
 
@@ -62,40 +63,54 @@
         try {
             ProviderInfo info = getProviderInfo(id);
 
-            Map<String, ServiceProvider> services = 
getServices(info.getPackageName());
+            List<ServiceProvider> services = 
getServices(info.getPackageName());
 
-            return  services.containsKey(info.getServiceName());
-        } catch (OpenEJBException e) {
+            for (ServiceProvider service : services) {
+                if (service.getId().equals(id)) {
+                    return true;
+                }
+            }
+        } catch (OpenEJBException ignored) {
             // someone else will load the file and get the exception
-            return false;
         }
+        return false;
     }
 
     public static ServiceProvider getServiceProvider(String id) throws 
OpenEJBException {
         ProviderInfo info = getProviderInfo(id);
 
-        Map<String, ServiceProvider> services = 
getServices(info.getPackageName());
+        List<ServiceProvider> services = getServices(info.getPackageName());
+
+        for (ServiceProvider service : services) {
+            if (service.getId().equals(info.getServiceName())) {
+                return service;
+            }
+        }
+        throw new NoSuchProviderException(messages.format("conf.4901", 
info.getServiceName(), info.getPackageName()));
+    }
+
+    public static String getServiceProviderId(String type) throws 
OpenEJBException {
+        if (type == null) return null;
+
+        List<ServiceProvider> services = getServices(defaultProviderURL);
 
-        ServiceProvider service = services.get(info.getServiceName());
-        if (service == null) {
-            throw new NoSuchProviderException(messages.format("conf.4901", 
info.getServiceName(), info.getPackageName()));
+        for (ServiceProvider service : services) {
+            if (service.getServiceTypes().contains(type)) {
+                return service.getId();
+            }
         }
 
-        return service;
+        return null;
     }
 
-    private static Map<String, ServiceProvider> getServices(String 
packageName) throws OpenEJBException {
-        Map<String, ServiceProvider> services = 
loadedServiceJars.get(packageName);
+    private static List<ServiceProvider> getServices(String packageName) 
throws OpenEJBException {
+        List<ServiceProvider> services = loadedServiceJars.get(packageName);
         if (services == null) {
             ServicesJar servicesJar = JaxbOpenejb.readServicesJar(packageName);
 
             // index services by provider id
             List<ServiceProvider> serviceProviders = 
servicesJar.getServiceProvider();
-            services = new HashMap<String, 
ServiceProvider>(serviceProviders.size());
-            for (ServiceProvider serviceProvider : serviceProviders) {
-                services.put(serviceProvider.getId(), serviceProvider);
-
-            }
+            services = new ArrayList<ServiceProvider>(serviceProviders);
 
             loadedServiceJars.put(packageName, services);
         }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ListAdapter.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ListAdapter.java?rev=573889&r1=573888&r2=573889&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ListAdapter.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ListAdapter.java
 Sat Sep  8 11:15:15 2007
@@ -26,13 +26,13 @@
 /**
  * @version $Rev$ $Date$
  */
-public class ListAdapter extends XmlAdapter<String, List> {
-    public List unmarshal(String s) throws Exception {
+public class ListAdapter extends XmlAdapter<String, List<String>> {
+    public List<String> unmarshal(String s) throws Exception {
         String[] strings = s.split(", *");
-        return new ArrayList(Arrays.asList(strings));
+        return new ArrayList<String>(Arrays.asList(strings));
     }
 
-    public String marshal(List list) throws Exception {
+    public String marshal(List<String> list) throws Exception {
         return Join.join(", ", list);
     }
 }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ServiceProvider.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ServiceProvider.java?rev=573889&r1=573888&r2=573889&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ServiceProvider.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ServiceProvider.java
 Sat Sep  8 11:15:15 2007
@@ -74,7 +74,8 @@
     protected String providerType;
     @XmlAttribute(name = "service-types", required = false)
     @XmlJavaTypeAdapter(ListAdapter.class)
-    protected List<String> serviceTypes;
+    // for some reason when this field is type List JaxB gives us a 
List<List<String>>
+    protected Object serviceTypes;
 
     /**
      * Gets the value of the properties property.
@@ -241,10 +242,11 @@
         this.providerType = value;
     }
 
+    @SuppressWarnings({"unchecked"})
     public List<String> getServiceTypes() {
         if (serviceTypes == null){
             serviceTypes = new ArrayList<String>();
         }
-        return serviceTypes;
+        return (List<String>) serviceTypes;
     }
 }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml?rev=573889&r1=573888&r2=573889&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml
 Sat Sep  8 11:15:15 2007
@@ -418,11 +418,6 @@
     # original logical connection wrapper.
     
     AccessToUnderlyingConnectionAllowed        false
-
-    # Interface type of this factory
-    # This is used to auto map resource references
-
-    ConnectionInterface javax.sql.DataSource
   </ServiceProvider>
 
   <ServiceProvider
@@ -607,11 +602,6 @@
     # original logical connection wrapper.
 
     AccessToUnderlyingConnectionAllowed        false
-
-    # Interface type of this factory
-    # This is used to auto map resource references
-
-    ConnectionInterface javax.sql.DataSource
   </ServiceProvider>
 
   <!--
@@ -642,8 +632,6 @@
           class-name="org.apache.activemq.ra.ActiveMQManagedConnectionFactory">
     
     ResourceAdapter Default JMS Resource Adapter
-
-    ConnectionInterface javax.jms.ConnectionFactory, 
javax.jms.QueueConnectionFactory, javax.jms.TopicConnectionFactory
   </ServiceProvider>
 
   <ServiceProvider


Reply via email to