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"));
+    }
 }
 


Reply via email to