You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by da...@apache.org on 2007/02/27 09:41:55 UTC

svn commit: r512178 - in /incubator/openejb/trunk/openejb3: assembly/openejb-standalone/src/main/resources/ container/openejb-core/src/main/java/org/apache/openejb/config/ container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/

Author: dain
Date: Tue Feb 27 00:41:54 2007
New Revision: 512178

URL: http://svn.apache.org/viewvc?view=rev&rev=512178
Log:
When auto creating connectors check if a provider exists with the same name of the link, and if so, create it

Modified:
    incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb.conf
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoDeploy.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ServiceUtils.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/RedeployTest.java

Modified: incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb.conf
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb.conf?view=diff&rev=512178&r1=512177&r2=512178
==============================================================================
--- incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb.conf (original)
+++ incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb.conf Tue Feb 27 00:41:54 2007
@@ -155,6 +155,7 @@
 </Container>
 
 <Connector id="Default JDBC Database" />
+<Connector id="Default Unmanaged JDBC Database" />
 
 <!-- 
 <Connector id="InstantDB Database">            

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoDeploy.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoDeploy.java?view=diff&rev=512178&r1=512177&r2=512178
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoDeploy.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoDeploy.java Tue Feb 27 00:41:54 2007
@@ -20,6 +20,7 @@
 import java.util.List;
 
 import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.config.sys.ServiceProvider;
 import org.apache.openejb.assembler.classic.ConnectorInfo;
 import org.apache.openejb.assembler.classic.ContainerInfo;
 import org.apache.openejb.jee.ResourceRef;
@@ -135,61 +136,19 @@
 
                 ResourceLink link = ejbDeployment.getResourceLink(ref.getResRefName());
                 if (link == null) {
-                    link = new ResourceLink();
-                    List<String> connectorMap = configFactory.getConnectorIds();
                     String resRefName = ref.getResRefName();
 
-                    String id = null;
-                    if (!connectorMap.contains(resRefName)) {
-                        String name = resRefName.replaceFirst(".*/", "");
-                        if (!connectorMap.contains(name)) {
-                            String message = "No existing Connector found while attempting to Auto-link unmapped res-ref-name '"+resRefName+"' for bean '" + ejbDeployment.getDeploymentId() + "'.  Looked for Connector(id=" + resRefName + ") and Connector(id=" + name + ")";
-                            if (!autoCreateConnectors){
-                                throw new OpenEJBException(message);
-                            }
-
-                            logger.error(message);
-
-                            if (connectorMap.size() > 0) {
-                                id = connectorMap.get(0);
-                            } else {
-                                ConnectorInfo connectorInfo = configFactory.configureService(ConnectorInfo.class);
-                                id = connectorInfo.id;
-                                logger.warning("Auto-creating a connector with res-id " + link.getResId() + " for bean '"+ejbDeployment.getDeploymentId()+"'.  THERE IS LITTLE CHANCE THIS WILL WORK!");
-                                configFactory.install(connectorInfo);
-                            }
-                        }
-                    }
+                    String id = getDataSourceId(ejbDeployment.getDeploymentId(), resRefName);
                     logger.warning("Auto-linking res-ref-name '" + resRefName + "' in bean " + ejbDeployment.getDeploymentId() + " to Connector(id=" + id + ")");
+
+                    link = new ResourceLink();
                     link.setResId(id);
                     link.setResRefName(resRefName);
                     ejbDeployment.addResourceLink(link);
                 } else {
-
-                    List<String> connectorMap = configFactory.getConnectorIds();
-                    if (!connectorMap.contains(link.getResId())) {
-                        String message = "Bad resource-link in bean '" + ejbDeployment.getDeploymentId() + "': No such connector with specified res-id: ResourceLink(res-ref-name=" + link.getResRefName() + ", res-id" + link.getResId() + ")";
-                        if (!autoCreateConnectors){
-                            throw new OpenEJBException(message);
-                        }
-
-                        logger.error(message);
-
-                        String id = null;
-                        if (connectorMap.size() > 0) {
-                            id = connectorMap.get(0);
-                        } else {
-                            ConnectorInfo connectorInfo = configFactory.configureService(ConnectorInfo.class);
-                            id = connectorInfo.id;
-                            logger.warning("Auto-creating a connector with res-id " + link.getResId() + " for bean '"+ejbDeployment.getDeploymentId()+"'.  THERE IS LITTLE CHANCE THIS WILL WORK!");
-                            configFactory.install(connectorInfo);
-                        }
-                        String resRefName = ref.getResRefName();
-                        String badResId = link.getResId();
-                        logger.warning("Auto-linking res-ref-name '" + resRefName + "' in bean " + ejbDeployment.getDeploymentId() + " to Connector(id=" + id + ").  Ignoring configured link to non-existent Connector(id="+badResId +")");
-                        link.setResId(id);
-                        link.setResRefName(resRefName);
-                    }
+                    String id = getDataSourceId(ejbDeployment.getDeploymentId(), link.getResId());
+                    link.setResId(id);
+                    link.setResRefName(ref.getResRefName());
                 }
             }
         }
@@ -204,11 +163,11 @@
 
         Persistence persistence = persistenceModule.getPersistence();
         for (PersistenceUnit persistenceUnit : persistence.getPersistenceUnit()) {
-            String jtaDataSourceId = getDataSourceId(persistenceUnit.getJtaDataSource(), persistenceUnit);
+            String jtaDataSourceId = getDataSourceId(persistenceUnit.getName(), persistenceUnit.getJtaDataSource());
             if (jtaDataSourceId != null) {
                 persistenceUnit.setJtaDataSource("java:openejb/Connector/" + jtaDataSourceId);
             }
-            String nonJtaDataSourceId = getDataSourceId(persistenceUnit.getNonJtaDataSource(), persistenceUnit);
+            String nonJtaDataSourceId = getDataSourceId(persistenceUnit.getName(), persistenceUnit.getNonJtaDataSource());
             if (nonJtaDataSourceId != null) {
                 persistenceUnit.setNonJtaDataSource("java:openejb/Connector/" + nonJtaDataSourceId);
             }
@@ -217,7 +176,7 @@
         return persistenceModule;
     }
 
-    private String getDataSourceId(String dataSource, PersistenceUnit persistenceUnit) throws OpenEJBException {
+    private String getDataSourceId(String beanName, String dataSource) throws OpenEJBException {
         if(dataSource == null){
             return null;
         }
@@ -225,33 +184,42 @@
             dataSource = dataSource.substring("java:comp/env".length());
         }
 
-        String id = null;
         List<String> connectorMap = configFactory.getConnectorIds();
-        if (!connectorMap.contains(dataSource)) {
-            String name = dataSource.replaceFirst(".*/", "");
-            if (!connectorMap.contains(name)) {
-                String message = "No existing datasource found while attempting to Auto-link unmapped datasource '" + dataSource + "' for persistence-unit '" + persistenceUnit.getName() + "'.  Looked for Datasource(id=" + dataSource + ") and Datasource(id=" + name + ")";
-                if (!autoCreateConnectors){
-                    throw new OpenEJBException(message);
-                }
+        if (connectorMap.contains(dataSource)) {
+            return dataSource;
+        }
 
-                logger.error(message);
+        String name = dataSource.replaceFirst(".*/", "");
+        if (connectorMap.contains(name)) {
+            return name;
+        }
 
-                if (connectorMap.size() > 0) {
-                    id = connectorMap.get(0);
-                } else {
-                    ConnectorInfo connectorInfo = configFactory.configureService(ConnectorInfo.class);
-                    id = connectorInfo.id;
-                    logger.warning("Auto-creating a datasource with res-id " + id + " for persistence-unit '" + persistenceUnit.getName() + "'.  THERE IS LITTLE CHANCE THIS WILL WORK!");
-                    configFactory.install(connectorInfo);
-                }
-            } else {
-                return name;
-            }
-        } else {
-            return dataSource;
+        // throw an exception or log an error
+        String message = "No existing datasource found while attempting to Auto-link unmapped datasource '" + dataSource + "' for '" + beanName + "'.  Looked for Datasource(id=" + dataSource + ") and Datasource(id=" + name + ")";
+        if (!autoCreateConnectors){
+            throw new OpenEJBException(message);
         }
-        return id;
+        logger.error(message);
+
+        // if there is a provider with the specified name. use it
+        if (ServiceUtils.hasServiceProvider(name)) {
+            ConnectorInfo connectorInfo = configFactory.configureService(ConnectorInfo.class, name, null, name, null);
+            configFactory.install(connectorInfo);
+            return connectorInfo.id;
+        }
+
+        // if there is only one connector, use it
+        // todo this check needs to be type specific to support JDBC and JMS
+        if (connectorMap.size() > 0) {
+            return connectorMap.get(0);
+        }
+
+        // Just use the default conector
+        // todo again this needs to be type specific
+        ConnectorInfo connectorInfo = configFactory.configureService(ConnectorInfo.class);
+        logger.warning("Auto-creating a datasource with res-id " + connectorInfo.id + " for '" + beanName + "'.  THERE IS LITTLE CHANCE THIS WILL WORK!");
+        configFactory.install(connectorInfo);
+        return connectorInfo.id;
     }
 
     private String getUsableContainer(Class<? extends ContainerInfo> containerInfoType) {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ServiceUtils.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ServiceUtils.java?view=diff&rev=512178&r1=512177&r2=512178
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ServiceUtils.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ServiceUtils.java Tue Feb 27 00:41:54 2007
@@ -33,9 +33,8 @@
 import java.util.Properties;
 
 public class ServiceUtils {
-
     public static final String defaultProviderURL = "org.apache.openejb";
-    private static Map loadedServiceJars = new HashMap();
+    private static Map<String, Map<String, ServiceProvider>> loadedServiceJars = new HashMap<String, Map<String, ServiceProvider>>();
     public static Messages messages = new Messages("org.apache.openejb.util.resources");
     public static Logger logger = Logger.getInstance("OpenEJB", "org.apache.openejb.util.resources");
 
@@ -57,34 +56,47 @@
         }
     }
 
-    public static ServiceProvider getServiceProvider(String id) throws OpenEJBException {
+    public static boolean hasServiceProvider(String id) {
+        try {
+            ProviderInfo info = getProviderInfo(id);
+
+            Map<String, ServiceProvider> services = getServices(info.getPackageName());
+
+            return  services.containsKey(info.getServiceName());
+        } catch (OpenEJBException e) {
+            // someone else will load the file and get the exception
+            return false;
+        }
+    }
 
+    public static ServiceProvider getServiceProvider(String id) throws OpenEJBException {
         ProviderInfo info = getProviderInfo(id);
 
-        ServiceProvider service = null;
-
-        if (loadedServiceJars.get(info.getPackageName()) == null) {
-            ServicesJar sj = readServicesJar(info.getPackageName());
-            ServiceProvider[] sp = sj.getServiceProvider();
-            HashMap services = new HashMap(sj.getServiceProviderCount());
-
-            for (int i = 0; i < sp.length; i++) {
-                services.put(sp[i].getId(), sp[i]);
-            }
-
-            loadedServiceJars.put(info.getPackageName(), services);
-
-            service = (ServiceProvider) services.get(info.getServiceName());
-        } else {
-            Map provider = (Map) loadedServiceJars.get(info.getPackageName());
-            service = (ServiceProvider) provider.get(info.getServiceName());
-        }
+        Map<String, ServiceProvider> services = getServices(info.getPackageName());
 
+        ServiceProvider service = services.get(info.getServiceName());
         if (service == null) {
             throw new NoSuchProviderException(messages.format("conf.4901", info.getServiceName(), info.getPackageName()));
         }
 
         return service;
+    }
+
+    private static Map<String, ServiceProvider> getServices(String packageName) throws OpenEJBException {
+        Map<String, ServiceProvider> services = loadedServiceJars.get(packageName);
+        if (services == null) {
+            ServicesJar servicesJar = readServicesJar(packageName);
+
+            // index services by provider id
+            services = new HashMap<String, ServiceProvider>(servicesJar.getServiceProviderCount());
+            for (ServiceProvider serviceProvider : servicesJar.getServiceProvider()) {
+                services.put(serviceProvider.getId(), serviceProvider);
+
+            }
+
+            loadedServiceJars.put(packageName, services);
+        }
+        return services;
     }
 
     private static ProviderInfo getProviderInfo(String id) {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/RedeployTest.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/RedeployTest.java?view=diff&rev=512178&r1=512177&r2=512178
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/RedeployTest.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/RedeployTest.java Tue Feb 27 00:41:54 2007
@@ -50,6 +50,9 @@
 
         assembler.createConnectionManager(config.configureService(ConnectionManagerInfo.class));
         assembler.createConnector(config.configureService(ConnectorInfo.class));
+        ConnectorInfo connectorInfo = config.configureService(ConnectorInfo.class);
+        connectorInfo.id = "Default Unmanaged JDBC Database";
+        assembler.createConnector(connectorInfo);
 
         assembler.createContainer(config.configureService(BmpEntityContainerInfo.class));
         assembler.createContainer(config.configureService(CmpEntityContainerInfo.class));