Author: dblevins
Date: Fri Dec 7 19:35:50 2007
New Revision: 602310
URL: http://svn.apache.org/viewvc?rev=602310&view=rev
Log:
Extended ability to configure via system properties to instantiation as well,
rather than just overriding. I.e. you could only override what was declared in
your openejb.xml file, now you can declare things too.
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/cmd/Info2Properties.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/sys/JaxbOpenejb.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Openejb.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/URISupport.java
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/ConfigureServiceTest.java
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/cmd/Info2Properties.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/cmd/Info2Properties.java?rev=602310&r1=602309&r2=602310&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/cmd/Info2Properties.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/cmd/Info2Properties.java
Fri Dec 7 19:35:50 2007
@@ -29,6 +29,7 @@
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.util.Messages;
import org.apache.openejb.util.OpenEjbVersion;
+import org.apache.openejb.util.URISupport;
import javax.naming.Context;
import javax.naming.InitialContext;
@@ -39,6 +40,8 @@
import java.util.Date;
import java.util.Map;
import java.util.Properties;
+import java.util.HashMap;
+import java.net.URISyntaxException;
/**
* @version $Rev$ $Date$
@@ -225,6 +228,20 @@
// comment("codebase: " + info.codebase);
comment("");
Properties p = new Properties();
+
+
+ String uri = "new://" + info.service;
+ if (info.service.matches("Container|Resource|Connector")){
+ try {
+ Map query = new HashMap();
+ query.put("type", info.types.get(0));
+ uri += "?" + URISupport.createQueryString(query);
+ } catch (Exception e) {
+ }
+ }
+
+ p.put(info.id, uri);
+
for (Map.Entry<Object, Object> entry : info.properties.entrySet())
{
if (!(entry.getKey() instanceof String)) continue;
if (!(entry.getValue() instanceof String)) continue;
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=602310&r1=602309&r2=602310&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
Fri Dec 7 19:35:50 2007
@@ -57,6 +57,8 @@
import org.apache.openejb.config.sys.ServiceProvider;
import org.apache.openejb.config.sys.TransactionManager;
import org.apache.openejb.config.sys.JaxbOpenejb;
+import org.apache.openejb.config.sys.AbstractService;
+import org.apache.openejb.config.sys.Deployments;
import org.apache.openejb.jee.ApplicationClient;
import org.apache.openejb.jee.EjbJar;
import org.apache.openejb.jee.Connector;
@@ -87,10 +89,13 @@
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
import org.apache.openejb.util.Messages;
+import org.apache.openejb.util.URISupport;
import javax.xml.bind.JAXBException;
import java.io.File;
import java.net.URL;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -231,6 +236,8 @@
openejb = JaxbOpenejb.createOpenejb();
}
+ loadPropertiesDeclaredConfiguration(openejb);
+
sys = new OpenEjbConfiguration();
sys.containerSystem = new ContainerSystemInfo();
sys.facilities = new FacilitiesInfo();
@@ -297,6 +304,71 @@
return sys;
}
+ private void loadPropertiesDeclaredConfiguration(Openejb openejb) {
+
+ Properties sysProps = new Properties(System.getProperties());
+ sysProps.putAll(SystemInstance.get().getProperties());
+
+ for (Map.Entry<Object, Object> entry : sysProps.entrySet()) {
+
+ Object o = entry.getValue();
+ if (!(o instanceof String)) continue;
+ if (!((String) o).startsWith("new://")) continue;
+
+ String name = (String) entry.getKey();
+ String value = (String) entry.getValue();
+
+ try {
+ URI uri = new URI(value);
+
+ openejb.add(toConfigDeclaration(name, uri));
+ } catch (URISyntaxException e) {
+ logger.error("Error declaring service '" + name + "'. Invalid
Service URI '" + value + "'. java.net.URISyntaxException: " + e.getMessage());
+ } catch (OpenEJBException e) {
+ logger.error(e.getMessage());
+ }
+ }
+ }
+
+ public Object toConfigDeclaration(String id, URI uri) throws
OpenEJBException {
+ String serviceType = null;
+ try {
+ serviceType = uri.getHost();
+
+ Object object = null;
+ try {
+ object = JaxbOpenejb.create(serviceType);
+ } catch (Exception e) {
+ throw new OpenEJBException("Invalid URI '" + uri + "'. " +
e.getMessage());
+ }
+
+ Map<String, String> map = null;
+ try {
+ map = URISupport.parseParamters(uri);
+ } catch (URISyntaxException e) {
+ throw new OpenEJBException("Unable to parse URI parameters '"
+ uri + "'. URISyntaxException: " + e.getMessage());
+ }
+
+ if (object instanceof AbstractService) {
+ AbstractService service = (AbstractService) object;
+
+ service.setId(id);
+
+
+ service.setType(map.remove("type"));
+ service.setProvider(map.remove("provider"));
+ service.getProperties().putAll(map);
+ } else if (object instanceof Deployments){
+ Deployments deployments = (Deployments) object;
+ deployments.setDir(map.remove("dir"));
+ deployments.setJar(map.remove("jar"));
+ }
+
+ return object;
+ } catch (Exception e) {
+ throw new OpenEJBException("Error declaring service '" + id + "'.
Unable to create Service definition from URI '" + uri.toString() + "'", e);
+ }
+ }
public AppInfo configureApplication(File jarFile) throws OpenEJBException {
logger.debug("Beginning load: " + jarFile.getAbsolutePath());
@@ -349,7 +421,7 @@
}
public AppInfo configureApplication(AppModule appModule) throws
OpenEJBException {
-
+
logger.info(messages.format("config.configApp",
appModule.getJarLocation()));
deployer.deploy(appModule);
@@ -663,7 +735,7 @@
portInfo.handlerChains.addAll(handlerChains);
// todo configure jaxrpc mappings here
-
+
portMap.add(portInfo);
}
}
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java?rev=602310&r1=602309&r2=602310&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
Fri Dec 7 19:35:50 2007
@@ -85,6 +85,37 @@
throw new IllegalArgumentException("Unknown type " + type.getName());
}
+ public static <T> T create(String type) {
+ if (type == null) throw new NullPointerException("type is null");
+
+ if (type.equals("ConnectionManager")) {
+ return (T) createConnectionManager();
+ } else if (type.equals("Connector")) {
+ return (T) createConnector();
+ } else if (type.equals("Container")) {
+ return (T) createContainer();
+ } else if (type.equals("Deployments")) {
+ return (T) createDeployments();
+ } else if (type.equals("JndiProvider")) {
+ return (T) createJndiProvider();
+ } else if (type.equals("Openejb")) {
+ return (T) createOpenejb();
+ } else if (type.equals("ProxyFactory")) {
+ return (T) createProxyFactory();
+ } else if (type.equals("Resource")) {
+ return (T) createResource();
+ } else if (type.equals("SecurityService")) {
+ return (T) createSecurityService();
+ } else if (type.equals("ServiceProvider")) {
+ return (T) createServiceProvider();
+ } else if (type.equals("ServicesJar")) {
+ return (T) createServicesJar();
+ } else if (type.equals("TransactionManager")) {
+ return (T) createTransactionManager();
+ }
+ throw new IllegalArgumentException("Unknown type " + type);
+ }
+
public static ServicesJar readServicesJar(String providerName) throws
OpenEJBException {
InputStream in = null;
URL url = null;
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Openejb.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Openejb.java?rev=602310&r1=602309&r2=602310&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Openejb.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Openejb.java
Fri Dec 7 19:35:50 2007
@@ -288,4 +288,26 @@
}
return this.deployments;
}
+
+ public void add(Object service) {
+ if (service instanceof Container) {
+ getContainer().add((Container) service);
+ } else if (service instanceof Connector) {
+ getConnector().add((Connector) service);
+ } else if (service instanceof Resource) {
+ getResource().add((Resource) service);
+ } else if (service instanceof JndiProvider) {
+ getJndiProvider().add((JndiProvider) service);
+ } else if (service instanceof ConnectionManager) {
+ setConnectionManager((ConnectionManager) service);
+ } else if (service instanceof ProxyFactory) {
+ setProxyFactory((ProxyFactory) service);
+ } else if (service instanceof TransactionManager) {
+ setTransactionManager((TransactionManager) service);
+ } else if (service instanceof SecurityService) {
+ setSecurityService((SecurityService) service);
+ } else if (service instanceof Deployments) {
+ getDeployments().add((Deployments) service);
+ }
+ }
}
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/URISupport.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/URISupport.java?rev=602310&r1=602309&r2=602310&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/URISupport.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/URISupport.java
Fri Dec 7 19:35:50 2007
@@ -94,7 +94,7 @@
}
}
- public static Map parseQuery(String uri) throws URISyntaxException{
+ public static Map<String, String> parseQuery(String uri) throws
URISyntaxException{
try{
Map<String, String> rc=new HashMap<String,String>();
if(uri!=null){
@@ -116,7 +116,7 @@
}
}
- public static Map parseParamters(URI uri) throws URISyntaxException {
+ public static Map<String, String> parseParamters(URI uri) throws
URISyntaxException {
return uri.getQuery()==null ? Collections.EMPTY_MAP :
parseQuery(stripPrefix(uri.getQuery(), "?"));
}
Modified:
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/ConfigureServiceTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/ConfigureServiceTest.java?rev=602310&r1=602309&r2=602310&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/ConfigureServiceTest.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/ConfigureServiceTest.java
Fri Dec 7 19:35:50 2007
@@ -18,12 +18,11 @@
import junit.framework.TestCase;
import org.apache.openejb.assembler.classic.StatelessSessionContainerInfo;
-import org.apache.openejb.assembler.classic.ResourceInfo;
import org.apache.openejb.assembler.classic.ContainerInfo;
-import org.apache.openejb.config.sys.Resource;
import org.apache.openejb.config.sys.Container;
-import java.util.Properties;
+import java.net.URI;
+import java.net.URLEncoder;
/**
* @version $Rev$ $Date$
@@ -116,6 +115,25 @@
assertEquals("org.apache.openejb.core.stateless.StatelessContainer",
myStatelessContainer.className);
}
+ public void testConfigureServiceAddedPropertyViaURI() throws Exception {
+ ConfigurationFactory factory = new ConfigurationFactory();
+
+ URI uri = new
URI("new://Container?type=STATELESS&provider=org.acme%23CheddarContainer");
+
+ Container container = (Container)
factory.toConfigDeclaration("MyContainer", uri);
+
+ container.getProperties().setProperty("anotherProperty", "Cheese is
good");
+ StatelessSessionContainerInfo myStatelessContainer =
factory.configureService(container, StatelessSessionContainerInfo.class);
+ assertNotNull(myStatelessContainer);
+ assertEquals("MyContainer", myStatelessContainer.id);
+ assertEquals("org.acme.SuperContainer",
myStatelessContainer.className);
+ assertNotNull(myStatelessContainer.constructorArgs);
+ assertNotNull(myStatelessContainer.properties);
+
assertNotNull(myStatelessContainer.properties.getProperty("myProperty"));
+ assertEquals("Yummy Cheese",
myStatelessContainer.properties.getProperty("myProperty"));
+
assertNotNull(myStatelessContainer.properties.getProperty("anotherProperty"));
+ assertEquals("Cheese is good",
myStatelessContainer.properties.getProperty("anotherProperty"));
+ }
}