Author: dblevins
Date: Thu Feb  4 16:14:10 2010
New Revision: 906542

URL: http://svn.apache.org/viewvc?rev=906542&view=rev
Log:
OPENEJB-1232: Client Failover and ConnnectionStrategy configurable on a per 
bean basis

Added:
    
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/EjbDeploymentPropertiesTest.java
   (with props)
    
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DynamicConnectionStrategyTest.java
   (with props)
    
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/PropertiesPropogationTest.java
   (with props)
Modified:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.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/EjbJarInfoBuilder.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/SuperProperties.java
    
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/OpenEjbConfigurationValidationTest.java
    
openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/oejb3/EjbDeployment.java
    
openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/oejb3/OpenejbJar.java
    
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java
    
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionManager.java
    
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/EJBMetaDataImpl.java
    
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/EJBRequest.java
    
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
    
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ClientObjectFactory.java
    
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/JndiRequestHandler.java

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
 Thu Feb  4 16:14:10 2010
@@ -27,6 +27,7 @@
 import java.util.Map;
 import java.util.List;
 import java.util.Set;
+import java.util.Properties;
 import javax.naming.Context;
 import javax.ejb.ScheduleExpression;
 
@@ -141,6 +142,8 @@
 
     public <T> T set(Class<T> type, T value);
 
+    public Properties getProperties();
+
     public boolean retainIfExeption(Method removeMethod);
 
     public boolean isLoadOnStartup();

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
 Thu Feb  4 16:14:10 2010
@@ -158,6 +158,8 @@
 
         deployment.getInjections().addAll(injections);
 
+        deployment.getProperties().putAll(bean.properties);
+
         // ejbTimeout
         deployment.setEjbTimeout(getTimeout(ejbClass, bean.timeoutMethod));
 

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java
 Thu Feb  4 16:14:10 2010
@@ -18,6 +18,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Properties;
 
 public abstract class EnterpriseBeanInfo extends InfoObject {
 
@@ -35,6 +36,8 @@
 
     public int type;
 
+    public final Properties properties = new Properties();
+    
     public String codebase;
     public String description;
     public String displayName;

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=906542&r1=906541&r2=906542&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
 Thu Feb  4 16:14:10 2010
@@ -282,6 +282,16 @@
         }
     }
 
+    /**
+     * Main loop that gets executed when OpenEJB starts up
+     * Reads config files and produces the basic "AST"
+     * the assembler needs to actually build the contianer system
+     *
+     * This method is called by the Assembler once at startup.
+     * 
+     * @return
+     * @throws OpenEJBException
+     */
     public OpenEjbConfiguration getOpenEjbConfiguration() throws 
OpenEJBException {
 
         if (sys != null) {
@@ -619,6 +629,22 @@
 
     private static final Map<Class<? extends ServiceInfo>, Class<? extends 
Service>> types = new HashMap<Class<? extends ServiceInfo>, Class<? extends 
Service>>();
 
+    /**
+     * This is the magic that allows people to be really vague in their 
openejb.xml and not specify
+     * the provider for one of their declared services.  We look here for the 
default service id
+     *
+     * We then look in the default provider "namespace" that is setup, which 
will usually be either one of:
+     *
+     *   - org.apache.openejb
+     *   - org.apache.openejb.embedded
+     *   - org.apache.openejb.tomcat
+     *   - org.apache.openejb.jetty
+     *
+     * As in:
+     *
+     *   - META-INF/<provider>/service-jar.xml
+     * 
+     */
     static {
         defaultProviders.put(MdbContainerInfo.class, new 
DefaultService("MESSAGE", Container.class));
         defaultProviders.put(ManagedContainerInfo.class, new 
DefaultService("MANAGED", Container.class));
@@ -661,6 +687,20 @@
     }
 
 
+    /**
+     * This is the major piece of code that configures servics
+     * It merges the data from the <ServiceProvider> declaration
+     * with the data from the openejb.xml file (say <Resource>)
+     *
+     * The end result is a canonical (i.e. flattened) ServiceInfo
+     * The ServiceInfo will be of a specific type (ContainerInfo, 
ResourceInfo, etc)
+     * 
+     * @param service
+     * @param infoType
+     * @param <T>
+     * @return
+     * @throws OpenEJBException
+     */
     public <T extends ServiceInfo> T configureService(Service service, Class<? 
extends T> infoType) throws OpenEJBException {
         try {
             if (infoType == null) throw new NullPointerException("type");

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
 Thu Feb  4 16:14:10 2010
@@ -557,6 +557,7 @@
         TransactionType txType = s.getTransactionType();
         bean.transactionType = (txType != null)?txType.toString(): 
TransactionType.CONTAINER.toString();
         bean.serviceEndpoint = s.getServiceEndpoint();
+        bean.properties.putAll(d.getProperties());
 
         return bean;
     }
@@ -588,6 +589,7 @@
         bean.ejbName = mdb.getEjbName();
         TransactionType txType = mdb.getTransactionType();
         bean.transactionType = (txType != null)?txType.toString(): 
TransactionType.CONTAINER.toString();
+        bean.properties.putAll(d.getProperties());
 
         if (mdb.getMessagingType() != null) {
             bean.mdbInterface = mdb.getMessagingType();
@@ -669,6 +671,7 @@
         bean.primKeyField = e.getPrimkeyField();
         bean.persistenceType = e.getPersistenceType().toString();
         bean.reentrant = e.getReentrant() + "";
+        bean.properties.putAll(d.getProperties());
 
         CmpVersion cmpVersion = e.getCmpVersion();
         if (e.getPersistenceType() == PersistenceType.CONTAINER) {

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
 Thu Feb  4 16:14:10 2010
@@ -27,6 +27,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.Properties;
 import javax.ejb.EJBHome;
 import javax.ejb.EJBLocalHome;
 import javax.ejb.EJBLocalObject;
@@ -98,6 +99,8 @@
     private String destinationId;
     private final Map<Class, Object> data = new HashMap<Class, Object>();
 
+    private final Properties properties = new Properties();
+
     private String ejbName;
     private String moduleId;
     private String runAs;
@@ -322,6 +325,10 @@
         return (T) data.put(type, value);
     }
 
+    public Properties getProperties() {
+        return properties;
+    }
+
     public List<Injection> getInjections() {
         return injections;
     }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/SuperProperties.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/SuperProperties.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/SuperProperties.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/SuperProperties.java
 Thu Feb  4 16:14:10 2010
@@ -76,7 +76,7 @@
     protected LinkedHashMap<Object,Object> properties = new 
LinkedHashMap<Object,Object>();
 
     /**
-     * Comments for the properties.
+     * Comments for individual the properties.
      */
     protected LinkedHashMap<String,String> comments = new 
LinkedHashMap<String,String>();
 

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/OpenEjbConfigurationValidationTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/OpenEjbConfigurationValidationTest.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/OpenEjbConfigurationValidationTest.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/OpenEjbConfigurationValidationTest.java
 Thu Feb  4 16:14:10 2010
@@ -32,6 +32,21 @@
 import java.util.Set;
 
 /**
+ * This test verifies that no architectural constraints have been violated
+ * in the Info Object tree.  Basically those are:
+ *
+ * - Only public fields of basic data types are allowed.
+ *
+ * So this means *no*
+ * - methods
+ * - constructors
+ * - Complex data types (Class, ClassLoader, etc)
+ *
+ * Keeps the Info Objects inline with the concept of a basic AST (Abstract 
Syntax Tree)
+ * which is produced by the ConfigurationFactory and built by the Assembler,
+ *
+ * See http://openejb.apache.org/configuration-and-assembly.html 
+ *
  * @version $Rev$ $Date$
  */
 public class OpenEjbConfigurationValidationTest extends TestCase {
@@ -53,21 +68,28 @@
 
         String simpleName = clazz.getSimpleName();
 
+        // Constructors are not allowed in Info objects
         Constructor[] constructors = clazz.getDeclaredConstructors();
         assertEquals("constructors are not allowed: " + simpleName, 1, 
constructors.length);
         assertEquals("constructors are not allowed: " + simpleName, 0, 
constructors[0].getParameterTypes().length);
 
+        // Methods are not allowed in Info objects
         Method[] methods = clazz.getDeclaredMethods();
         assertEquals("methods are not allowed: " + simpleName, 0, 
methods.length);
 
+        // Annotations are not allowed in Info objects
         Annotation[] annotations = clazz.getDeclaredAnnotations();
         assertEquals("annotations are not allowed: " + simpleName, 0, 
annotations.length);
 
+        // We are very picky on fields as well
+        // Only certain data types are allowed
         Field[] fields = clazz.getDeclaredFields();
         for (Field field : fields) {
 
+            // Only public fields are allowed
             assertTrue("Non-public fields are not allowed: " + simpleName + 
"." + field.getName(), Modifier.isPublic(field.getModifiers()));
 
+            // Annotations of fields are not allowed
             annotations = clazz.getDeclaredAnnotations();
             assertEquals("annotations are not allowed: " + simpleName + "." + 
field.getName(), 0, annotations.length);
 
@@ -76,37 +98,51 @@
                 type = type.getComponentType();
             }
 
+            // All lists and collections *must* specify the generic type
+            // No vague lists that are typeless
+            // Garantees that the data type in the list is one of the allowed 
types
             if (List.class.isAssignableFrom(type)) {
                 type = getGenericType(field);
                 assertNotNull("Lists must have a generic type: " + simpleName 
+ "." + field.getName(), type);
             }
 
+            // Same rules for java.util.Set collections
             if (Set.class.isAssignableFrom(type)) {
                 type = getGenericType(field);
                 assertNotNull("Sets must have a generic type: " + simpleName + 
"." + field.getName(), type);
             }
 
+            //  Now we check the data type of the field
+            //  Complex types are not allowed
+
+            // Primitives are OK
             if (type.isPrimitive()) {
                 continue;
             }
 
+            // String is OK
             if (String.class.isAssignableFrom(type)) {
                 continue;
             }
 
+            //  Properties is OK
             if (Properties.class.isAssignableFrom(type)) {
                 continue;
             }
 
+            // OK
             if (QName.class.isAssignableFrom(type)) {
                 continue;
             }
 
+            // Other InfoObjects are OK
             if (InfoObject.class.isAssignableFrom(type)) {
                 validate(type);
                 continue;
             }
 
+            //  All else is NOT allowed
+            //  Referrences to java.lang.Class or ClassLoaders, or URLs or 
anything else is all bad
             fail("Field is not of an allowed type: " + simpleName + "." + 
field.getName());
         }
     }

Added: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/EjbDeploymentPropertiesTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/EjbDeploymentPropertiesTest.java?rev=906542&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/EjbDeploymentPropertiesTest.java
 (added)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/EjbDeploymentPropertiesTest.java
 Thu Feb  4 16:14:10 2010
@@ -0,0 +1,74 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.config;
+
+import junit.framework.TestCase;
+import org.apache.openejb.DeploymentInfo;
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.SecurityServiceInfo;
+import org.apache.openejb.assembler.classic.TransactionServiceInfo;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.StatelessBean;
+import org.apache.openejb.jee.oejb3.EjbDeployment;
+import org.apache.openejb.jee.oejb3.OpenejbJar;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.ContainerSystem;
+
+import java.util.Properties;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class EjbDeploymentPropertiesTest extends TestCase {
+
+    public void test() throws Exception {
+        ConfigurationFactory config = new ConfigurationFactory();
+        Assembler assembler = new Assembler();
+
+        
assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class));
+        
assembler.createSecurityService(config.configureService(SecurityServiceInfo.class));
+
+        // Setup the descriptor information
+
+        EjbModule ejbModule = new EjbModule(new EjbJar(), new OpenejbJar());
+        EjbJar ejbJar = ejbModule.getEjbJar();
+        OpenejbJar openejbJar = ejbModule.getOpenejbJar();
+
+        StatelessBean statelessBean = ejbJar.addEnterpriseBean(new 
StatelessBean(WidgetBean.class));
+        EjbDeployment deployment = openejbJar.addEjbDeployment(statelessBean);
+        deployment.getProperties().put("color", "orange");
+
+        assembler.createApplication(config.configureApplication(ejbModule));
+
+        ContainerSystem containerSystem = 
SystemInstance.get().getComponent(ContainerSystem.class);
+
+        DeploymentInfo deploymentInfo = 
containerSystem.getDeploymentInfo("WidgetBean");
+
+        Properties properties = deploymentInfo.getProperties();
+        assertTrue(properties.containsKey("color"));
+        assertEquals("orange", properties.getProperty("color"));
+    }
+
+
+    public static interface Widget {
+
+    }
+
+    public static class WidgetBean implements Widget {
+
+    }
+}

Propchange: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/EjbDeploymentPropertiesTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/oejb3/EjbDeployment.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/oejb3/EjbDeployment.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/oejb3/EjbDeployment.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/oejb3/EjbDeployment.java
 Thu Feb  4 16:14:10 2010
@@ -16,6 +16,8 @@
  */
 package org.apache.openejb.jee.oejb3;
 
+import org.apache.openejb.jee.EnterpriseBean;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
@@ -30,9 +32,10 @@
 import java.util.Map;
 import java.util.LinkedHashMap;
 import java.util.Iterator;
+import java.util.Properties;
 
 @XmlAccessorType(XmlAccessType.FIELD)
-...@xmltype(propOrder = {"jndi","ejbLink", "resourceLink", "query"})
+...@xmltype(propOrder = {"jndi","ejbLink", "resourceLink", "query", 
"properties"})
 @XmlRootElement(name = "ejb-deployment")
 public class EjbDeployment {
 
@@ -59,6 +62,10 @@
     @XmlAttribute(name = "ejb-name")
     protected String ejbName;
 
+    @XmlElement(name = "properties")
+    @XmlJavaTypeAdapter(PropertiesAdapter.class)
+    protected Properties properties;
+    
     public EjbDeployment() {
     }
 
@@ -68,6 +75,11 @@
         this.ejbName = ejbName;
     }
 
+    public EjbDeployment(EnterpriseBean bean) {
+        this.deploymentId = bean.getEjbName();
+        this.ejbName = bean.getEjbName();
+    }
+
     public List<EjbLink> getEjbLink() {
         if (ejbLink == null) {
             ejbLink = new ArrayList<EjbLink>();
@@ -165,4 +177,11 @@
     public void addQuery(Query query) {
         getQuery().add(query);
     }
+
+    public Properties getProperties() {
+        if (properties == null) {
+            properties = new Properties();
+        }
+        return properties;
+    }
 }

Modified: 
openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/oejb3/OpenejbJar.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/oejb3/OpenejbJar.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/oejb3/OpenejbJar.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/oejb3/OpenejbJar.java
 Thu Feb  4 16:14:10 2010
@@ -18,6 +18,9 @@
 
 package org.apache.openejb.jee.oejb3;
 
+import org.apache.openejb.jee.StatelessBean;
+import org.apache.openejb.jee.EnterpriseBean;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
@@ -71,8 +74,9 @@
         return getEjbDeployment().size();
     }
 
-    public void addEjbDeployment(EjbDeployment ejbDeployment) {
+    public EjbDeployment addEjbDeployment(EjbDeployment ejbDeployment) {
         getEjbDeployment().add(ejbDeployment);
+        return ejbDeployment;
     }
 
     public void removeEjbDeployment(EjbDeployment ejbDeployment) {
@@ -85,5 +89,8 @@
         }
         return properties;
     }
-    
+
+    public EjbDeployment addEjbDeployment(EnterpriseBean bean) {
+        return addEjbDeployment(new EjbDeployment(bean));
+    }
 }

Modified: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java
 Thu Feb  4 16:14:10 2010
@@ -75,7 +75,7 @@
 
         Connection conn = null;
         try {
-            conn = ConnectionManager.getConnection(cluster, server);
+            conn = ConnectionManager.getConnection(cluster, server, req);
         } catch (IOException e) {
             throw new RemoteException("Unable to connect",e);
         }

Modified: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionManager.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionManager.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionManager.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionManager.java
 Thu Feb  4 16:14:10 2010
@@ -18,6 +18,7 @@
 
 import java.io.IOException;
 import java.net.URI;
+import java.util.Properties;
 
 public class ConnectionManager {
 
@@ -44,9 +45,14 @@
     }
 
 
-    public static Connection getConnection(ClusterMetaData cluster, 
ServerMetaData server) throws IOException {
+    public static Connection getConnection(ClusterMetaData cluster, 
ServerMetaData server, Request req) throws IOException {
         String name = cluster.getConnectionStrategy();
 
+        if (req instanceof EJBRequest) {
+            EJBRequest ejbRequest = (EJBRequest) req;
+            final Properties p = ejbRequest.getEjbMetaData().getProperties();
+            name = p.getProperty("openejb.client.connection.strategy", name);
+        }
         if (name == null) name = "default";
 
         ConnectionStrategy strategy = strategies.get(name);

Modified: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/EJBMetaDataImpl.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/EJBMetaDataImpl.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/EJBMetaDataImpl.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/EJBMetaDataImpl.java
 Thu Feb  4 16:14:10 2010
@@ -19,8 +19,12 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
 import java.util.List;
 import java.util.ArrayList;
+import java.util.Properties;
+import java.util.Map;
 
 import javax.ejb.EJBHome;
 
@@ -47,6 +51,8 @@
 
     protected final transient List<Class> businessClasses = new 
ArrayList<Class>();
 
+    protected final transient Properties properties = new Properties();
+
     protected transient Class keyClass;
 
     protected transient EJBHome ejbHomeProxy;
@@ -150,6 +156,10 @@
         return businessClasses;
     }
 
+    public Properties getProperties() {
+        return properties;
+    }
+
     public Object getPrimaryKey() {
         return primaryKey;
     }
@@ -178,6 +188,20 @@
         }
 
         out.writeByte(interfaceType.ordinal());
+
+        if (properties.size() == 0) {
+            out.writeBoolean(false);
+        } else {
+            out.writeBoolean(true);
+            final ByteArrayOutputStream tmp = new ByteArrayOutputStream();
+            properties.store(tmp, "");
+            tmp.close();
+            final byte[] bytes = tmp.toByteArray();
+            final int length = bytes.length;
+            out.writeInt(length);
+            out.write(bytes);
+        }
+
     }
 
     public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
@@ -202,6 +226,15 @@
             byte typeIndex = in.readByte();
             interfaceType = InterfaceType.values()[typeIndex];
         }
+
+        final boolean hasProperties = in.readBoolean();
+        if (hasProperties) {
+            final int bufferLength = in.readInt();
+            final byte[] buffer = new byte[bufferLength];
+            in.read(buffer);
+            final ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
+            properties.load(bais);
+        }
     }
 
     public String toString() {
@@ -227,4 +260,15 @@
         }
         return sb.toString();
     }
-}
\ No newline at end of file
+
+    public void loadProperties(Properties properties) {
+        for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+            if (entry.getKey() instanceof String) {
+                String key = (String) entry.getKey();
+                if (key.startsWith("openejb.client.")){
+                    this.properties.put(key, entry.getValue());
+                }
+            }
+        }
+    }
+}

Modified: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/EJBRequest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/EJBRequest.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/EJBRequest.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/EJBRequest.java
 Thu Feb  4 16:14:10 2010
@@ -37,9 +37,11 @@
     private transient Object clientIdentity;
     private transient String deploymentId;
     private transient int serverHash;
-
     private transient Body body;
 
+    // Only visible on the client side
+    private transient final EJBMetaDataImpl ejbMetaData;
+
     public static final int SESSION_BEAN_STATELESS = 6;
     public static final int SESSION_BEAN_STATEFUL = 7;
     public static final int ENTITY_BM_PERSISTENCE = 8;
@@ -47,11 +49,13 @@
 
     public EJBRequest() {
         body = new Body(null);
+        ejbMetaData = null;
     }
 
     public EJBRequest(int requestMethod, EJBMetaDataImpl ejb, Method method, 
Object[] args, Object primaryKey) {
         body = new Body(ejb);
 
+        this.ejbMetaData = ejb;
         this.requestMethod = requestMethod;
         setDeploymentCode(ejb.deploymentCode);
         setDeploymentId(ejb.deploymentID);
@@ -60,6 +64,10 @@
         setPrimaryKey(primaryKey);
     }
 
+    public EJBMetaDataImpl getEjbMetaData() {
+        return ejbMetaData;
+    }
+
     public Class getInterfaceClass() {
         return body.getInterfaceClass();
     }

Modified: 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
 Thu Feb  4 16:14:10 2010
@@ -48,7 +48,9 @@
         Properties p = System.getProperties();
 
         size = getInt(p, "openejb.client.connectionpool.size", size);
+        size = getInt(p, "openejb.client.connection.pool.size", size);
         timeout = getInt(p, "openejb.client.connectionpool.timeout", timeout);
+        timeout = getInt(p, "openejb.client.connection.pool.timeout", timeout);
     }
 
     public static int getInt(Properties p, String property, int defaultValue){

Modified: 
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ClientObjectFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ClientObjectFactory.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ClientObjectFactory.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ClientObjectFactory.java
 Thu Feb  4 16:14:10 2010
@@ -18,6 +18,7 @@
 
 import java.net.URI;
 import java.util.Properties;
+import java.util.Map;
 
 import org.apache.openejb.DeploymentInfo;
 import org.apache.openejb.ProxyInfo;
@@ -52,12 +53,7 @@
         DeploymentInfo deployment = info.getDeploymentInfo();
         int idCode = -1;
 
-        EJBMetaDataImpl metaData = new 
EJBMetaDataImpl(deployment.getHomeInterface(),
-                deployment.getRemoteInterface(),
-                deployment.getPrimaryKeyClass(),
-                deployment.getComponentType().toString(),
-                deployment.getDeploymentID().toString(),
-                idCode, convert(info.getInterfaceType()), null);
+        EJBMetaDataImpl metaData = buildEjbMetaData(info, deployment, idCode);
         return metaData;
     }
 
@@ -74,12 +70,7 @@
 
         }
         ClientMetaData cMetaData = new ClientMetaData(securityIdentity);
-        EJBMetaDataImpl eMetaData = new 
EJBMetaDataImpl(deployment.getHomeInterface(),
-                deployment.getRemoteInterface(),
-                deployment.getPrimaryKeyClass(),
-                deployment.getComponentType().toString(),
-                deployment.getDeploymentID().toString(),
-                idCode, convert(info.getInterfaceType()), null);
+        EJBMetaDataImpl eMetaData = buildEjbMetaData(info, deployment, idCode);
         Object primKey = info.getPrimaryKey();
 
         EJBObjectHandler hanlder = 
EJBObjectHandler.createEJBObjectHandler(eMetaData, getServerMetaData(), 
cMetaData, primKey);
@@ -108,12 +99,7 @@
             e.printStackTrace();
         }
         ClientMetaData cMetaData = new ClientMetaData(securityIdentity);
-        EJBMetaDataImpl eMetaData = new 
EJBMetaDataImpl(deployment.getHomeInterface(),
-                deployment.getRemoteInterface(),
-                deployment.getPrimaryKeyClass(),
-                deployment.getComponentType().toString(),
-                deployment.getDeploymentID().toString(),
-                idCode, convert(info.getInterfaceType()), null);
+        EJBMetaDataImpl eMetaData = buildEjbMetaData(info, deployment, idCode);
 
         EJBHomeHandler hanlder = 
EJBHomeHandler.createEJBHomeHandler(eMetaData, getServerMetaData(), cMetaData);
 
@@ -133,12 +119,7 @@
             e.printStackTrace();
         }
         ClientMetaData cMetaData = new ClientMetaData(securityIdentity);
-        EJBMetaDataImpl eMetaData = new 
EJBMetaDataImpl(deployment.getHomeInterface(),
-                deployment.getRemoteInterface(),
-                deployment.getPrimaryKeyClass(),
-                deployment.getComponentType().toString(),
-                deployment.getDeploymentID().toString(),
-                idCode, convert(info.getInterfaceType()), null);
+        EJBMetaDataImpl eMetaData = buildEjbMetaData(info, deployment, idCode);
         Object primKey = info.getPrimaryKey();
 
         EJBObjectHandler hanlder = 
EJBObjectHandler.createEJBObjectHandler(eMetaData, getServerMetaData(), 
cMetaData, primKey);
@@ -164,6 +145,8 @@
                 deployment.getComponentType().toString(),
                 deployment.getDeploymentID().toString(),
                 idCode, convert(info.getInterfaceType()), 
info.getInterfaces());
+        eMetaData.loadProperties(deployment.getProperties());
+        
         Object primKey = info.getPrimaryKey();
 
         EJBObjectHandler hanlder = 
EJBObjectHandler.createEJBObjectHandler(eMetaData, getServerMetaData(), 
cMetaData, primKey);
@@ -198,16 +181,21 @@
             e.printStackTrace();
         }
         ClientMetaData cMetaData = new ClientMetaData(securityIdentity);
+        EJBMetaDataImpl eMetaData = buildEjbMetaData(info, deployment, idCode);
+
+        EJBHomeHandler hanlder = 
EJBHomeHandler.createEJBHomeHandler(eMetaData, getServerMetaData(), cMetaData);
+
+        return hanlder.createEJBHomeProxy();
+    }
+
+    private EJBMetaDataImpl buildEjbMetaData(ProxyInfo info, DeploymentInfo 
deployment, int idCode) {
         EJBMetaDataImpl eMetaData = new 
EJBMetaDataImpl(deployment.getHomeInterface(),
                 deployment.getRemoteInterface(),
                 deployment.getPrimaryKeyClass(),
                 deployment.getComponentType().toString(),
                 deployment.getDeploymentID().toString(),
                 idCode, convert(info.getInterfaceType()), null);
-
-        EJBHomeHandler hanlder = 
EJBHomeHandler.createEJBHomeHandler(eMetaData, getServerMetaData(), cMetaData);
-
-        return hanlder.createEJBHomeProxy();
+        eMetaData.loadProperties(deployment.getProperties());
+        return eMetaData;
     }
-
 }
\ No newline at end of file

Modified: 
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/JndiRequestHandler.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/JndiRequestHandler.java?rev=906542&r1=906541&r2=906542&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/JndiRequestHandler.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/JndiRequestHandler.java
 Thu Feb  4 16:14:10 2010
@@ -372,6 +372,8 @@
                         deployment.getComponentType().toString(),
                         deploymentID,
                         -1, convert(proxyInfo.getInterfaceType()), null);
+                metaData.loadProperties(deployment.getProperties());
+
                 res.setResult(metaData);
                 break;
             }
@@ -390,6 +392,8 @@
                         deploymentID,
                         -1, convert(proxyInfo.getInterfaceType()), 
proxyInfo.getInterfaces());
                 metaData.setPrimaryKey(proxyInfo.getPrimaryKey());
+                metaData.loadProperties(deployment.getProperties());
+
                 res.setResult(metaData);
                 break;
             }

Added: 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DynamicConnectionStrategyTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DynamicConnectionStrategyTest.java?rev=906542&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DynamicConnectionStrategyTest.java
 (added)
+++ 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DynamicConnectionStrategyTest.java
 Thu Feb  4 16:14:10 2010
@@ -0,0 +1,117 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.server.ejbd;
+
+import junit.framework.TestCase;
+import org.apache.openejb.OpenEJB;
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.client.ClusterMetaData;
+import org.apache.openejb.client.Connection;
+import org.apache.openejb.client.ConnectionManager;
+import org.apache.openejb.client.ConnectionStrategy;
+import org.apache.openejb.client.ServerMetaData;
+import org.apache.openejb.client.StickyConnectionStrategy;
+import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.core.ServerFederation;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.StatelessBean;
+import org.apache.openejb.jee.oejb3.EjbDeployment;
+import org.apache.openejb.jee.oejb3.OpenejbJar;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.ServiceDaemon;
+import org.apache.openejb.server.ServicePool;
+
+import javax.ejb.Remote;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import java.io.IOException;
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class DynamicConnectionStrategyTest extends TestCase {
+
+    public void test() throws Exception {
+
+        ConnectionManager.registerStrategy("test", new 
TestConnectionStrategy());
+        EjbServer ejbServer = new EjbServer();
+
+        Properties initProps = new Properties();
+        initProps.setProperty("openejb.deployments.classpath.include", "");
+        
initProps.setProperty("openejb.deployments.classpath.filter.descriptors", 
"true");
+        OpenEJB.init(initProps, new ServerFederation());
+        ejbServer.init(new Properties());
+
+        ServicePool pool = new ServicePool(ejbServer, "ejbd", 10);
+        ServiceDaemon serviceDaemon = new ServiceDaemon(pool, 0, "localhost");
+        serviceDaemon.start();
+
+        int port = serviceDaemon.getPort();
+
+        Assembler assembler = 
SystemInstance.get().getComponent(Assembler.class);
+        ConfigurationFactory config = new ConfigurationFactory();
+
+        EjbModule ejbModule = new EjbModule(new EjbJar(), new OpenejbJar());
+        EjbJar ejbJar = ejbModule.getEjbJar();
+        OpenejbJar openejbJar = ejbModule.getOpenejbJar();
+
+        StatelessBean statelessBean = ejbJar.addEnterpriseBean(new 
StatelessBean(WidgetBean.class));
+        EjbDeployment deployment = openejbJar.addEjbDeployment(statelessBean);
+        deployment.getProperties().put("openejb.client.connection.strategy", 
"test");
+
+        assembler.createApplication(config.configureApplication(ejbModule));
+
+        Properties props = new Properties();
+        props.put("java.naming.factory.initial", 
"org.apache.openejb.client.RemoteInitialContextFactory");
+        props.put("java.naming.provider.url", "ejbd://127.0.0.1:" + port);
+        Context context = new InitialContext(props);
+
+        Widget remote = (Widget) context.lookup("WidgetBeanRemote");
+
+        assertFalse(TestConnectionStrategy.called.get());
+
+        remote.echo("foo");
+
+        assertTrue(TestConnectionStrategy.called.get());
+    }
+
+
+    @Remote
+    public static interface Widget {
+        public Object echo(Object o);
+    }
+
+    public static class WidgetBean implements Widget {
+        public Object echo(Object o) {
+            return o;
+        }
+    }
+
+    public static class TestConnectionStrategy implements ConnectionStrategy {
+        public static final AtomicBoolean called = new AtomicBoolean();
+
+        private final StickyConnectionStrategy strategy = new 
StickyConnectionStrategy();
+
+        public Connection connect(ClusterMetaData cluster, ServerMetaData 
server) throws IOException {
+            called.set(true);
+            return strategy.connect(cluster, server);
+        }
+    }
+}
\ No newline at end of file

Propchange: 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DynamicConnectionStrategyTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/PropertiesPropogationTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/PropertiesPropogationTest.java?rev=906542&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/PropertiesPropogationTest.java
 (added)
+++ 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/PropertiesPropogationTest.java
 Thu Feb  4 16:14:10 2010
@@ -0,0 +1,108 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.server.ejbd;
+
+import junit.framework.TestCase;
+import org.apache.openejb.OpenEJB;
+import org.apache.openejb.client.proxy.ProxyManager;
+import org.apache.openejb.client.proxy.InvocationHandler;
+import org.apache.openejb.client.EJBObjectHandler;
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.EjbJarInfo;
+import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.core.ServerFederation;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.StatelessBean;
+import org.apache.openejb.jee.oejb3.OpenejbJar;
+import org.apache.openejb.jee.oejb3.EjbDeployment;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.ServiceDaemon;
+import org.apache.openejb.server.ServicePool;
+
+import javax.ejb.Remote;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import java.util.Properties;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class PropertiesPropogationTest extends TestCase {
+
+    public void test() throws Exception {
+        EjbServer ejbServer = new EjbServer();
+
+        Properties initProps = new Properties();
+        initProps.setProperty("openejb.deployments.classpath.include", "");
+        
initProps.setProperty("openejb.deployments.classpath.filter.descriptors", 
"true");
+        OpenEJB.init(initProps, new ServerFederation());
+        ejbServer.init(new Properties());
+
+        ServicePool pool = new ServicePool(ejbServer, "ejbd", 10);
+        ServiceDaemon serviceDaemon = new ServiceDaemon(pool, 0, "localhost");
+        serviceDaemon.start();
+
+        int port = serviceDaemon.getPort();
+
+        Assembler assembler = 
SystemInstance.get().getComponent(Assembler.class);
+        ConfigurationFactory config = new ConfigurationFactory();
+
+        EjbModule ejbModule = new EjbModule(new EjbJar(), new OpenejbJar());
+        EjbJar ejbJar = ejbModule.getEjbJar();
+        OpenejbJar openejbJar = ejbModule.getOpenejbJar();
+
+        StatelessBean statelessBean = ejbJar.addEnterpriseBean(new 
StatelessBean(WidgetBean.class));
+        EjbDeployment deployment = openejbJar.addEjbDeployment(statelessBean);
+        deployment.getProperties().put("color", "orange");
+        deployment.getProperties().put("openejb.client.color", "red");
+
+        assembler.createApplication(config.configureApplication(ejbModule));
+
+        Properties props = new Properties();
+        props.put("java.naming.factory.initial", 
"org.apache.openejb.client.RemoteInitialContextFactory");
+        props.put("java.naming.provider.url", "ejbd://127.0.0.1:" + port);
+        Context context = new InitialContext(props);
+
+        Widget remote = (Widget) context.lookup("WidgetBeanRemote");
+
+        InvocationHandler handler = ProxyManager.getInvocationHandler(remote);
+
+        EJBObjectHandler objectHandler = EJBObjectHandler.class.cast(handler);
+
+        Properties properties = objectHandler.getEjb().getProperties();
+
+        // Should only contain "openejb.client.*" properties
+        assertFalse(properties.containsKey("color"));
+
+        // The openejb.client.color property should have been propogated
+        assertTrue(properties.containsKey("openejb.client.color"));
+        assertEquals("red", properties.getProperty("openejb.client.color"));
+    }
+
+
+    @Remote
+    public static interface Widget {
+        public Object echo(Object o);
+    }
+
+    public static class WidgetBean implements Widget {
+        public Object echo(Object o) {
+            return o;
+        }
+    }
+}

Propchange: 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/PropertiesPropogationTest.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to