Author: rmannibucau
Date: Fri Aug 26 11:43:19 2011
New Revision: 1162070
URL: http://svn.apache.org/viewvc?rev=1162070&view=rev
Log:
starting work about DatasourceDefinition - still a lot to do
Added:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CommonInfoObject.java
- copied, changed from r1161530,
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfoObject.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinition.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinitionHelper.java
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java
Removed:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfoObject.java
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/dynamic/PassthroughFactory.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
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/Module.java
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
Fri Aug 26 11:43:19 2011
@@ -61,6 +61,7 @@ import javax.resource.spi.ResourceAdapte
import javax.resource.spi.ResourceAdapterInternalException;
import javax.resource.spi.XATerminator;
import javax.resource.spi.work.WorkManager;
+import javax.sql.DataSource;
import javax.transaction.TransactionManager;
import javax.transaction.TransactionSynchronizationRegistry;
import javax.validation.ValidationException;
@@ -84,7 +85,9 @@ import org.apache.openejb.NoSuchApplicat
import org.apache.openejb.OpenEJB;
import org.apache.openejb.OpenEJBException;
import org.apache.openejb.UndeployException;
+import org.apache.openejb.assembler.dynamic.PassthroughFactory;
import org.apache.openejb.cdi.CdiBuilder;
+import org.apache.openejb.config.DatasourceDefinitionHelper;
import org.apache.openejb.core.ConnectorReference;
import org.apache.openejb.core.CoreContainerSystem;
import org.apache.openejb.core.CoreUserTransaction;
@@ -128,55 +131,6 @@ import org.apache.xbean.recipe.ObjectRec
import org.apache.xbean.recipe.Option;
import org.apache.xbean.recipe.UnsetPropertiesRecipe;
-import javax.management.InstanceNotFoundException;
-import javax.management.MBeanRegistrationException;
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-import javax.naming.Binding;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NameAlreadyBoundException;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.persistence.EntityManagerFactory;
-import javax.resource.spi.BootstrapContext;
-import javax.resource.spi.ConnectionManager;
-import javax.resource.spi.ManagedConnectionFactory;
-import javax.resource.spi.ResourceAdapter;
-import javax.resource.spi.ResourceAdapterInternalException;
-import javax.resource.spi.XATerminator;
-import javax.resource.spi.work.WorkManager;
-import javax.transaction.TransactionManager;
-import javax.transaction.TransactionSynchronizationRegistry;
-import javax.validation.ValidationException;
-import javax.validation.ValidatorFactory;
-import java.io.File;
-import java.io.IOException;
-import java.lang.instrument.ClassFileTransformer;
-import java.lang.instrument.Instrumentation;
-import java.lang.management.ManagementFactory;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicInteger;
-
public class Assembler extends AssemblerTool implements
org.apache.openejb.spi.Assembler {
static {
@@ -654,6 +608,7 @@ public class Assembler extends Assembler
for (ResourceInfo adminObject : connector.adminObject) {
createResource(adminObject);
}
+ createDatasources(connector.datasourceDefinitions,
classLoader);
} finally {
Thread.currentThread().setContextClassLoader(oldClassLoader);
}
@@ -751,6 +706,8 @@ public class Assembler extends Assembler
}
}
+ createDatasources(ejbJar.datasourceDefinitions, classLoader);
+
allDeployments.addAll(deployments.values());
}
@@ -830,6 +787,8 @@ public class Assembler extends Assembler
containerSystemContext.bind("openejb/client/" +
clientClassName, clientInfo.moduleId);
logger.getChildLogger("client").info("createApplication.createLocalClient",
clientClassName, clientInfo.moduleId);
}
+
+ createDatasources(clientInfo.datasourceDefinitions,
classLoader);
}
SystemInstance systemInstance = SystemInstance.get();
@@ -866,6 +825,18 @@ public class Assembler extends Assembler
}
}
+ private void createDatasources(Set<ResourceInfo> datasourceDefinitions,
ClassLoader classLoader) throws OpenEJBException {
+ for (ResourceInfo dataSource : datasourceDefinitions) {
+ DataSource ds = DatasourceDefinitionHelper.newInstance(dataSource,
classLoader);
+ if (ds == null) {
+ logger.error("can't instantiate " + dataSource.id);
+ continue;
+ }
+ PassthroughFactory.add(dataSource, ds);
+ createResource(dataSource);
+ }
+ }
+
private void ensureWebBeansContext(AppContext appContext) {
WebBeansContext webBeansContext =
appContext.get(WebBeansContext.class);
if (webBeansContext == null) webBeansContext =
appContext.getWebBeansContext();
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
Fri Aug 26 11:43:19 2011
@@ -21,7 +21,7 @@ import java.util.ArrayList;
import java.util.Set;
import java.util.TreeSet;
-public class ClientInfo extends ValidationInfoObject {
+public class ClientInfo extends CommonInfoObject {
public String path;
public String description;
Copied:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CommonInfoObject.java
(from r1161530,
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfoObject.java)
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CommonInfoObject.java?p2=openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CommonInfoObject.java&p1=openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfoObject.java&r1=1161530&r2=1162070&rev=1162070&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfoObject.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CommonInfoObject.java
Fri Aug 26 11:43:19 2011
@@ -16,10 +16,14 @@
*/
package org.apache.openejb.assembler.classic;
+import java.util.HashSet;
+import java.util.Set;
+
/**
* @author Romain Manni-Bucau
*/
-public class ValidationInfoObject extends InfoObject {
+public class CommonInfoObject extends InfoObject {
public ValidationInfo validationInfo;
public String uniqueId;
+ public Set<ResourceInfo> datasourceDefinitions = new
HashSet<ResourceInfo>();
}
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
Fri Aug 26 11:43:19 2011
@@ -21,7 +21,7 @@ import java.util.ArrayList;
import java.util.Set;
import java.util.TreeSet;
-public class ConnectorInfo extends ValidationInfoObject {
+public class ConnectorInfo extends CommonInfoObject {
public String path;
public String description;
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
Fri Aug 26 11:43:19 2011
@@ -23,7 +23,7 @@ import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
-public class EjbJarInfo extends ValidationInfoObject {
+public class EjbJarInfo extends CommonInfoObject {
public final Properties properties = new Properties();
public String moduleName;
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
Fri Aug 26 11:43:19 2011
@@ -21,7 +21,7 @@ import java.util.TreeSet;
import java.util.List;
import java.util.ArrayList;
-public class WebAppInfo extends ValidationInfoObject {
+public class WebAppInfo extends CommonInfoObject {
public String path;
public String description;
public String displayName;
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/dynamic/PassthroughFactory.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/dynamic/PassthroughFactory.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/dynamic/PassthroughFactory.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/dynamic/PassthroughFactory.java
Fri Aug 26 11:43:19 2011
@@ -16,10 +16,7 @@
*/
package org.apache.openejb.assembler.dynamic;
-import java.util.Map;
import java.util.Properties;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
import org.apache.openejb.assembler.classic.ServiceInfo;
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
Fri Aug 26 11:43:19 2011
@@ -130,6 +130,8 @@ import javax.annotation.security.DenyAll
import javax.annotation.security.PermitAll;
import javax.annotation.security.RolesAllowed;
import javax.annotation.security.RunAs;
+import javax.annotation.sql.DataSourceDefinition;
+import javax.annotation.sql.DataSourceDefinitions;
import javax.ejb.AccessTimeout;
import javax.ejb.AfterBegin;
import javax.ejb.AfterCompletion;
@@ -260,8 +262,14 @@ public class AnnotationDeployer implemen
private final ProcessAnnotatedBeans processAnnotatedBeans;
private final EnvEntriesPropertiesDeployer envEntriesPropertiesDeployer;
private final MBeanDeployer mBeanDeployer;
+ private final AutoConfig autoConfig;
public AnnotationDeployer() {
+ this(null);
+ }
+
+ public AnnotationDeployer(AutoConfig autoConfig) {
+ this.autoConfig = autoConfig;
discoverAnnotatedBeans = new DiscoverAnnotatedBeans();
processAnnotatedBeans = new ProcessAnnotatedBeans();
envEntriesPropertiesDeployer = new EnvEntriesPropertiesDeployer();
@@ -333,7 +341,6 @@ public class AnnotationDeployer implemen
return jndiName.startsWith("java:global/") ||
jndiName.startsWith("java:app/") || jndiName.startsWith("java:module/");
}
public static class DiscoverAnnotatedBeans implements DynamicDeployer {
-
public AppModule deploy(AppModule appModule) throws OpenEJBException {
for (EjbModule ejbModule : appModule.getEjbModules()) {
setModule(ejbModule);
@@ -417,6 +424,8 @@ public class AnnotationDeployer implemen
}
}
+ addDatasourceDefinitions(clientModule, finder);
+
return clientModule;
}
@@ -681,6 +690,8 @@ public class AnnotationDeployer implemen
process(connectorModule.getClassLoader(),
activationSpec.getActivationSpecClass(), activationSpec);
}
}
+
+ addDatasourceDefinitions(connectorModule, finder);
return connectorModule;
}
@@ -981,7 +992,7 @@ public class AnnotationDeployer implemen
}
/*
- *REST
+ * REST
*/
// get by annotations
webModule.getRestClasses().addAll(findRestClasses(webModule,
finder));
@@ -991,6 +1002,8 @@ public class AnnotationDeployer implemen
webModule.getRestApplications().add(app.getName());
}
+ addDatasourceDefinitions(webModule, finder);
+
return webModule;
}
@@ -1256,9 +1269,55 @@ public class AnnotationDeployer implemen
}
}
+ addDatasourceDefinitions(ejbModule, finder);
+
return ejbModule;
}
+ private void addDatasourceDefinitions(Module module, IAnnotationFinder
finder) {
+ List<DataSourceDefinition> datasources = new
ArrayList<DataSourceDefinition>();
+
+ List<Annotated<Class<?>>> dataSourceDefinitionsClasses =
finder.findMetaAnnotatedClasses(DataSourceDefinitions.class);
+ for (Annotated<Class<?>> dsDefsClass :
dataSourceDefinitionsClasses) {
+ DataSourceDefinitions defs =
dsDefsClass.getAnnotation(DataSourceDefinitions.class);
+ for (DataSourceDefinition dsDef : defs.value()) {
+ datasources.add(dsDef);
+ }
+ }
+
+ List<Annotated<Class<?>>> dataSourceDefinitionClasses =
finder.findMetaAnnotatedClasses(DataSourceDefinition.class);
+ for (Annotated<Class<?>> dsDefsClass :
dataSourceDefinitionClasses) {
+
datasources.add(dsDefsClass.getAnnotation(DataSourceDefinition.class));
+ }
+
+ for (DataSourceDefinition dsDef : datasources) {
+ DatasourceDefinition def = getDatasourceDefinitaion(dsDef);
+ module.getDatasources().add(def);
+ }
+ }
+
+ private DatasourceDefinition
getDatasourceDefinitaion(DataSourceDefinition dsDef) {
+ DatasourceDefinition def = new DatasourceDefinition();
+ def.setTransactional(dsDef.transactional());
+ def.setInitialPoolSize(dsDef.initialPoolSize());
+ def.setIsolationLevel(dsDef.isolationLevel());
+ def.setMaxIdleTime(dsDef.maxIdleTime());
+ def.setMaxPoolSize(dsDef.maxPoolSize());
+ def.setMaxStatements(dsDef.maxStatements());
+ def.setMinPoolSize(dsDef.minPoolSize());
+ def.setPortNumber(dsDef.portNumber());
+ def.setDatabaseName(dsDef.databaseName());
+ def.setDescription(dsDef.description());
+ def.setPassword(dsDef.password());
+ def.setServerName(dsDef.serverName());
+ def.setUrl(dsDef.url());
+ def.setUser(dsDef.user());
+ def.setProperties(dsDef.properties());
+ def.setClassName(dsDef.className());
+ def.setName(dsDef.name());
+ return def;
+ }
+
private List<String> getBeanClasses(IAnnotationFinder finder) {
// What we're hoping in this method is to get lucky and find
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
Fri Aug 26 11:43:19 2011
@@ -19,6 +19,7 @@ package org.apache.openejb.config;
import org.apache.openejb.OpenEJBException;
import org.apache.openejb.assembler.classic.AppInfo;
import org.apache.openejb.assembler.classic.ClientInfo;
+import org.apache.openejb.assembler.classic.CommonInfoObject;
import org.apache.openejb.assembler.classic.ConnectorInfo;
import org.apache.openejb.assembler.classic.EjbJarInfo;
import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
@@ -168,6 +169,7 @@ class AppInfoBuilder {
ejbJarInfo.portInfos.addAll(configureWebservices(ejbModule.getWebservices()));
ejbJarInfo.uniqueId = ejbModule.getUniqueId();
ejbJarInfo.repositories = ejbModule.getRepositories();
+ copyDatasources(ejbModule, ejbJarInfo);
configureWebserviceSecurity(ejbJarInfo, ejbModule);
ejbJarInfos.put(ejbModule, ejbJarInfo);
@@ -268,6 +270,45 @@ class AppInfoBuilder {
}
+ private void copyDatasources(Module module, CommonInfoObject info) {
+ for (DatasourceDefinition def : module.getDatasources()) {
+ ResourceInfo resourceInfo = new ResourceInfo();
+ resourceInfo.id = def.getName();
+
+ int idx;
+ if (resourceInfo.id != null) {
+ idx = resourceInfo.id.indexOf(':');
+ if (idx > -1) {
+ resourceInfo.id = resourceInfo.id.substring(idx + 1);
+ }
+ }
+
+ resourceInfo.service = "Resource";
+ resourceInfo.types.add("javax.sql.DataSource");
+
+ resourceInfo.properties = new Properties();
+ resourceInfo.properties.put("transactional",
def.isTransactional());
+ resourceInfo.properties.put("initialPoolSize",
def.getInitialPoolSize());
+ resourceInfo.properties.put("isolationLevel",
def.getIsolationLevel());
+ resourceInfo.properties.put("maxIdleTime", def.getMaxIdleTime());
+ resourceInfo.properties.put("maxPoolSize", def.getMaxPoolSize());
+ resourceInfo.properties.put("maxStatements",
def.getMaxStatements());
+ resourceInfo.properties.put("minPoolSize", def.getMinPoolSize());
+ resourceInfo.properties.put("portNumber", def.getPortNumber());
+ resourceInfo.properties.put("databaseName", def.getDatabaseName());
+ resourceInfo.properties.put("description", def.getDescription());
+ resourceInfo.properties.put("password", def.getPassword());
+ resourceInfo.properties.put("serverName", def.getServerName());
+ resourceInfo.properties.put("url", def.getUrl());
+ resourceInfo.properties.put("user", def.getUser());
+ resourceInfo.properties.put("properties", def.getProperties());
+ resourceInfo.properties.put("className", def.getClassName());
+ resourceInfo.properties.put("name", def.getName());
+
+ info.datasourceDefinitions.add(resourceInfo);
+ }
+ }
+
private void buildClientModules(AppModule appModule, AppInfo appInfo,
JndiEncInfoBuilder jndiEncInfoBuilder) throws OpenEJBException {
for (ClientModule clientModule : appModule.getClientModules()) {
ApplicationClient applicationClient =
clientModule.getApplicationClient();
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=1162070&r1=1162069&r2=1162070&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
Fri Aug 26 11:43:19 2011
@@ -72,6 +72,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
Added:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinition.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinition.java?rev=1162070&view=auto
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinition.java
(added)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinition.java
Fri Aug 26 11:43:19 2011
@@ -0,0 +1,169 @@
+package org.apache.openejb.config;
+
+/**
+ * @author rmannibucau
+ */
+public class DatasourceDefinition {
+ private boolean transactional;
+ private int initialPoolSize;
+ private int isolationLevel;
+ private int loginTimeout;
+ private int maxIdleTime;
+ private int maxPoolSize;
+ private int maxStatements;
+ private int minPoolSize;
+ private int portNumber;
+ private String databaseName;
+ private String description;
+ private String password;
+ private String serverName;
+ private String url;
+ private String user;
+ private String[] properties;
+ private String className;
+ private String name;
+
+ public boolean isTransactional() {
+ return transactional;
+ }
+
+ public void setTransactional(boolean transactional) {
+ this.transactional = transactional;
+ }
+
+ public int getInitialPoolSize() {
+ return initialPoolSize;
+ }
+
+ public void setInitialPoolSize(int initialPoolSize) {
+ this.initialPoolSize = initialPoolSize;
+ }
+
+ public int getIsolationLevel() {
+ return isolationLevel;
+ }
+
+ public void setIsolationLevel(int isolationLevel) {
+ this.isolationLevel = isolationLevel;
+ }
+
+ public int getLoginTimeout() {
+ return loginTimeout;
+ }
+
+ public void setLoginTimeout(int loginTimeout) {
+ this.loginTimeout = loginTimeout;
+ }
+
+ public int getMaxIdleTime() {
+ return maxIdleTime;
+ }
+
+ public void setMaxIdleTime(int maxIdleTime) {
+ this.maxIdleTime = maxIdleTime;
+ }
+
+ public int getMaxPoolSize() {
+ return maxPoolSize;
+ }
+
+ public void setMaxPoolSize(int maxPoolSize) {
+ this.maxPoolSize = maxPoolSize;
+ }
+
+ public int getMaxStatements() {
+ return maxStatements;
+ }
+
+ public void setMaxStatements(int maxStatements) {
+ this.maxStatements = maxStatements;
+ }
+
+ public int getMinPoolSize() {
+ return minPoolSize;
+ }
+
+ public void setMinPoolSize(int minPoolSize) {
+ this.minPoolSize = minPoolSize;
+ }
+
+ public int getPortNumber() {
+ return portNumber;
+ }
+
+ public void setPortNumber(int portNumber) {
+ this.portNumber = portNumber;
+ }
+
+ public String getDatabaseName() {
+ return databaseName;
+ }
+
+ public void setDatabaseName(String databaseName) {
+ this.databaseName = databaseName;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getServerName() {
+ return serverName;
+ }
+
+ public void setServerName(String serverName) {
+ this.serverName = serverName;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public void setUser(String user) {
+ this.user = user;
+ }
+
+ public String[] getProperties() {
+ return properties;
+ }
+
+ public void setProperties(String[] properties) {
+ this.properties = properties;
+ }
+
+ public String getClassName() {
+ return className;
+ }
+
+ public void setClassName(String className) {
+ this.className = className;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Added:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinitionHelper.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinitionHelper.java?rev=1162070&view=auto
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinitionHelper.java
(added)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinitionHelper.java
Fri Aug 26 11:43:19 2011
@@ -0,0 +1,124 @@
+package org.apache.openejb.config;
+
+import org.apache.commons.dbcp.BasicDataSource;
+import org.apache.openejb.assembler.classic.ResourceInfo;
+import org.apache.openejb.resource.jdbc.DataSourceFactory;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+import org.apache.xbean.recipe.ObjectRecipe;
+import org.apache.xbean.recipe.Option;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * @author rmannibucau
+ */
+public final class DatasourceDefinitionHelper {
+ public static final Logger logger =
Logger.getInstance(LogCategory.OPENEJB_STARTUP,
DatasourceDefinitionHelper.class.getPackage().getName());
+
+ private static final Collection<String> MANUALLY_SET_PROPERTIES =
Arrays.asList("serName", "portNumber", "url");
+
+ private DatasourceDefinitionHelper() {
+ // no-op
+ }
+
+ /**
+ * datasource has to be created here since resources deployment was
already done at start up time.
+ *
+ *
+ * @param resourceInfo the datasource definition
+ * @param classLoader the classloader to use
+ * @return the datasource defined by dsDef
+ */
+ public static DataSource newInstance(ResourceInfo resourceInfo,
ClassLoader classLoader) {
+ String className = resourceInfo.properties.getProperty("className");
+ String url = resourceInfo.properties.getProperty("url");
+ String server = resourceInfo.properties.getProperty("serverName");
+ int port = (Integer) resourceInfo.properties.get("portNumber");
+
+ DataSource ds;
+
+ Class<?> clazz;
+ try {
+ clazz = classLoader.loadClass(className);
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+
+ if (!BasicDataSource.class.isAssignableFrom(clazz)) {
+ ObjectRecipe objectRecipe = new ObjectRecipe(className);
+ objectRecipe.allow(Option.FIELD_INJECTION);
+ objectRecipe.allow(Option.PRIVATE_PROPERTIES);
+ objectRecipe.allow(Option.IGNORE_MISSING_PROPERTIES);
+ objectRecipe.allow(Option.NAMED_PARAMETERS);
+
+ if (port <= 0) {
+ objectRecipe.setProperty("url", url);
+ } else {
+ objectRecipe.setProperty("serverName", server);
+ objectRecipe.setProperty("portNumber", port);
+ }
+
+ for (Map.Entry<Object, Object> prop :
resourceInfo.properties.entrySet()) {
+ String name = (String) prop.getKey();
+ if (!MANUALLY_SET_PROPERTIES.contains(name)) {
+ Object value = prop.getValue();
+ if (value != null
+ && ((value instanceof Number && ((Number)
value).intValue() > 0)
+ || !(value instanceof Number))) {
+ objectRecipe.setProperty(name, value);
+ }
+ if (name.endsWith("Name")) {
+ // depending of implementations...
+ objectRecipe.setProperty(name.substring(0,
name.length() - 4), value);
+ }
+ }
+ }
+
+ ds = (DataSource) objectRecipe.create(classLoader);
+ } else {
+ ds = DataSourceFactory.create(true);
+ BasicDataSource bd = (BasicDataSource) ds;
+ if (server != null && port > 0) {
+ if (url != null) { // try to use the pattern provided
+ int startHost = url.indexOf("//");
+ int endHost = url.indexOf("/", startHost + 2);
+ url = url.replace(url.substring(startHost + 2, endHost),
server + ":" + port);
+ } else {
+ url = "jdbc:derby://" + server + ":" + port
+ + "/" +
resourceInfo.properties.getProperty("databaseName");
+ }
+ }
+ bd.setUrl(url);
+
+ bd.setInitialSize((Integer)
resourceInfo.properties.get("initialPoolSize"));
+ try {
+ if ((Integer) resourceInfo.properties.get("loginTimeout") > 0)
{
+ bd.setLoginTimeout((Integer)
resourceInfo.properties.get("loginTimeout"));
+ }
+ } catch (SQLException e) {
+ // ignored
+ }
+ if ((Integer) resourceInfo.properties.get("maxIdleTime") > 0) {
+ bd.setMaxIdle((Integer)
resourceInfo.properties.get("maxIdleTime"));
+ }
+ if ((Integer) resourceInfo.properties.get("maxStatements") > 0) {
+ bd.setMaxOpenPreparedStatements((Integer)
resourceInfo.properties.get("maxStatements"));
+ }
+ if ((Integer) resourceInfo.properties.get("minPoolSize") > 0) {
+ bd.setMinIdle((Integer)
resourceInfo.properties.get("minPoolSize"));
+ }
+ if ((Integer) resourceInfo.properties.get("maxPoolSize") > 0) {
+ bd.setMaxIdle((Integer)
resourceInfo.properties.get("maxPoolSize"));
+ }
+ bd.setPassword(resourceInfo.properties.getProperty("password"));
+ bd.setUsername(resourceInfo.properties.getProperty("user"));
+ }
+
+ return ds;
+ }
+}
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
Fri Aug 26 11:43:19 2011
@@ -19,7 +19,9 @@ package org.apache.openejb.config;
import org.apache.openejb.jee.bval.ValidationConfigType;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
public class Module {
private static int currentId = 1; // unique id to be able to bind
something for each module in the jndi tree
@@ -31,6 +33,7 @@ public class Module {
private ValidationConfigType validationConfig;
private final Map<String, Object> altDDs = new HashMap<String, Object>();
private String uniqueId;
+ private Set<DatasourceDefinition> datasources = new
HashSet<DatasourceDefinition>();
public Module() {
uniqueId = Integer.toString(currentId++);
@@ -67,5 +70,8 @@ public class Module {
public void setClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
-
+
+ public Set<DatasourceDefinition> getDatasources() {
+ return datasources;
+ }
}
Added:
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java?rev=1162070&view=auto
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java
(added)
+++
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java
Fri Aug 26 11:43:19 2011
@@ -0,0 +1,50 @@
+package org.apache.openejb.assembler.classic;
+
+import org.apache.openejb.jee.Empty;
+import org.apache.openejb.jee.StatelessBean;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.junit.Module;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.annotation.sql.DataSourceDefinition;
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.sql.DataSource;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+
+/**
+ * @author rmannibucau
+ */
+@RunWith(ApplicationComposer.class)
+public class DataSourceDefinitionTest {
+ @EJB private DatasourceDefinitionBean bean;
+
+ @Module public Class<?>[] app() throws Exception {
+ return new Class<?>[]{ DatasourceDefinitionBean.class };
+ }
+
+ @DataSourceDefinition(
+ name = "superDS",
+ className = "org.hsqldb.jdbc.jdbcDataSource",
+ url = "jdbc:hsqldb:mem:superDS"
+ )
+ @Stateless
+ public static class DatasourceDefinitionBean {
+// @Resource(lookup = "java:openjeb/Resource/superDS") private
DataSource ds;
+ @Resource private DataSource ds;
+
+ public DataSource getDs() {
+ return ds;
+ }
+ }
+
+ @Test @Ignore("Resource annotation needs lookup to make it work") public
void assertDs() {
+ assertNotNull(bean.getDs());
+ assertEquals("org.hsqldb.jdbc.jdbcDataSource",
bean.getDs().getClass().getName());
+ }
+}