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));