Author: kentam
Date: Fri Feb 25 10:46:41 2005
New Revision: 155360

URL: http://svn.apache.org/viewcvs?view=rev&rev=155360
Log:
BEEHIVE-20: Binding unsupported

A simple form of external control implementation binding.  The infrastructure 
now supports a properties file "controlbindings.properties" -- property keys 
are control bean classnames, mapped to values that are control implementation 
classnames.

Added a DRT test to illustrate usage.  I'll update the wiki w/ more details.

This is meant largely as a proof-of-concept; a generalized approach to external 
configuration (potentially incorporating integration with other lightweight 
frameworks) will eventually obsolete this.



Added:
    
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControl.java
   (with props)
    
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControlImpl.jcs
   (with props)
    
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestOverrideControlImpl.jcs
   (with props)
    
incubator/beehive/trunk/controls/test/src/drivers/controlbindings.properties   
(with props)
Modified:
    
incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/bean/JavaControlFactory.java
    incubator/beehive/trunk/controls/test/build.xml
    
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/jpf/binding/TestControlBinding.java
    
incubator/beehive/trunk/controls/test/webapps/controlsWeb/binding/BindingTests.jpf
    incubator/beehive/trunk/controls/test/webapps/controlsWeb/binding/index.jsp

Modified: 
incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/bean/JavaControlFactory.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/bean/JavaControlFactory.java?view=diff&r1=155359&r2=155360
==============================================================================
--- 
incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/bean/JavaControlFactory.java
 (original)
+++ 
incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/bean/JavaControlFactory.java
 Fri Feb 25 10:46:41 2005
@@ -18,30 +18,51 @@
  */
 
 import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
 import java.lang.reflect.InvocationTargetException;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.Properties;
+import java.io.InputStream;
+import java.io.IOException;
 
 import org.apache.beehive.controls.api.properties.PropertyMap;
+import org.apache.beehive.controls.api.properties.BeanPropertyMap;
+import org.apache.beehive.controls.api.properties.PropertyKey;
 import org.apache.beehive.controls.api.bean.ControlBean;
 import org.apache.beehive.controls.api.context.ControlBeanContext;
 import org.apache.beehive.controls.api.ControlException;
 
-import org.apache.beehive.controls.spi.bean.ControlFactory;
-
 /**
  * The SimpleControlFactory class is a default implementation of the 
  * <code>org.apache.beehive.controls.api.bean.ControlFactory</code> interface. 
 It
  * uses Java reflection to create new control instances.
  *
- * @see org.apache.beehive.controls.api.Controls#instantiate
- * @see org.apache.beehive.controls.spi.ControlFactory
+ * @see org.apache.beehive.controls.api.bean.Controls#instantiate
+ * @see org.apache.beehive.controls.spi.bean.ControlFactory
  */
 public class JavaControlFactory implements ControlFactory
 {
     private static ConcurrentHashMap<Class, Constructor> _constructors =
         new ConcurrentHashMap<Class, Constructor>();
 
+    private static final Properties _extImplBindings = new Properties();
+
+    private static final String EXT_IMPL_BINDING_CONFIG = 
"controlbindings.properties";
+
+    static
+    {
+        InputStream is = JavaControlFactory.class.getClassLoader().
+                           getResourceAsStream( EXT_IMPL_BINDING_CONFIG );
+
+        if ( is != null )
+        {
+            try
+            {
+                _extImplBindings.load( is );
+            }
+            catch ( IOException ie ) { }
+        }
+    }
+
     /**
      * Instantiates a new ControlBean of the requested class, using mechanisms 
provided
      * by a provider-specific JavaBeans framework.
@@ -54,13 +75,29 @@
      *                execution context.
      * @param id the bean control ID.  Must be unique within the containing 
context.  If
      *           null, a unique identifier will be auto-generated.
-     * @returns a new ControlBean instance of the requested class.
+     * @return a new ControlBean instance of the requested class.
      */
     public <T extends ControlBean> T instantiate(Class<T> beanClass,
                                                  PropertyMap props,
                                                  ControlBeanContext context,
                                                  String id)
     {
+        String beanClassName = beanClass.getName();
+
+        String extImplBinding = _extImplBindings.getProperty( beanClassName + 
"_" + id );
+        if ( extImplBinding == null )
+            extImplBinding = _extImplBindings.getProperty( beanClassName );
+
+        if ( extImplBinding != null )
+        {
+            BeanPropertyMap bpm = props == null ? new BeanPropertyMap( 
beanClass ) : new BeanPropertyMap( props );
+            PropertyKey propKey = new PropertyKey( 
org.apache.beehive.controls.api.properties.BaseProperties.class,
+                                                   "controlImplementation" );
+
+            bpm.setProperty( propKey, extImplBinding );
+            props = bpm;
+        }
+
         T ret = null;
         try
         {

Modified: incubator/beehive/trunk/controls/test/build.xml
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/build.xml?view=diff&r1=155359&r2=155360
==============================================================================
--- incubator/beehive/trunk/controls/test/build.xml (original)
+++ incubator/beehive/trunk/controls/test/build.xml Fri Feb 25 10:46:41 2005
@@ -264,6 +264,11 @@
                <pathelement location="${milton.jar}"/>
             </classpath>
         </javac>
+        <copy todir="${build.drivers}">
+            <fileset dir="${controls.test.drivers}">
+                <include name="controlbindings.properties"/>
+            </fileset>
+        </copy>
         <jar destfile="${controlstestdrivers.jar}" basedir="${build.drivers}"/>
         <property name="_build.test.drivers.ran" value="true"/>
     </target>

Added: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControl.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControl.java?view=auto&rev=155360
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControl.java
 (added)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControl.java
 Fri Feb 25 10:46:41 2005
@@ -0,0 +1,11 @@
+package org.apache.beehive.controls.test.controls.binding;
+
+import org.apache.beehive.controls.api.bean.ControlInterface;
+import org.apache.beehive.controls.api.properties.BaseProperties;
+
[EMAIL PROTECTED]
[EMAIL 
PROTECTED](controlImplementation="org.apache.beehive.controls.test.controls.binding.ExternalBindingTestControlImpl")
+public interface ExternalBindingTestControl
+{ 
+    public String getStatus();
+}

Propchange: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControlImpl.jcs
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControlImpl.jcs?view=auto&rev=155360
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControlImpl.jcs
 (added)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControlImpl.jcs
 Fri Feb 25 10:46:41 2005
@@ -0,0 +1,15 @@
+package org.apache.beehive.controls.test.controls.binding;
+
+import org.apache.beehive.controls.api.bean.ControlImplementation;
+
+import org.apache.beehive.test.tools.milton.common.Report;
+
[EMAIL PROTECTED]
+public class ExternalBindingTestControlImpl 
+    implements java.io.Serializable, ExternalBindingTestControl
+{
+    public String getStatus()
+    {
+       return Report.FAIL;
+    }
+}

Propchange: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestControlImpl.jcs
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestOverrideControlImpl.jcs
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestOverrideControlImpl.jcs?view=auto&rev=155360
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestOverrideControlImpl.jcs
 (added)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestOverrideControlImpl.jcs
 Fri Feb 25 10:46:41 2005
@@ -0,0 +1,15 @@
+package org.apache.beehive.controls.test.controls.binding;
+
+import org.apache.beehive.controls.api.bean.ControlImplementation;
+
+import org.apache.beehive.test.tools.milton.common.Report;
+
[EMAIL PROTECTED]
+public class ExternalBindingTestOverrideControlImpl 
+    implements java.io.Serializable, ExternalBindingTestControl
+{
+    public String getStatus()
+    {
+       return Report.PASS;
+    }
+}

Propchange: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/binding/ExternalBindingTestOverrideControlImpl.jcs
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
incubator/beehive/trunk/controls/test/src/drivers/controlbindings.properties
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/drivers/controlbindings.properties?view=auto&rev=155360
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/drivers/controlbindings.properties 
(added)
+++ 
incubator/beehive/trunk/controls/test/src/drivers/controlbindings.properties 
Fri Feb 25 10:46:41 2005
@@ -0,0 +1,2 @@
+org.apache.beehive.controls.test.controls.binding.ExternalBindingTestControlBean=org.apache.beehive.controls.test.controls.binding.ExternalBindingTestOverrideControlImpl
+

Propchange: 
incubator/beehive/trunk/controls/test/src/drivers/controlbindings.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/jpf/binding/TestControlBinding.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/jpf/binding/TestControlBinding.java?view=diff&r1=155359&r2=155360
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/jpf/binding/TestControlBinding.java
 (original)
+++ 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/jpf/binding/TestControlBinding.java
 Fri Feb 25 10:46:41 2005
@@ -25,4 +25,12 @@
     {
        assertReport("/controlsWeb/binding/index.jsp", "testDefaultBinding");
     }
+
+    @Freq("checkin")
+    @Desc("Test that a control implementation can be overridden with external 
binding " +
+         "to an impl that is specified in controlbindings.properties")
+    public void testExternalBinding() throws Exception
+    {
+       assertReport("/controlsWeb/binding/index.jsp", "testExternalBinding");
+    }
 }

Modified: 
incubator/beehive/trunk/controls/test/webapps/controlsWeb/binding/BindingTests.jpf
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/webapps/controlsWeb/binding/BindingTests.jpf?view=diff&r1=155359&r2=155360
==============================================================================
--- 
incubator/beehive/trunk/controls/test/webapps/controlsWeb/binding/BindingTests.jpf
 (original)
+++ 
incubator/beehive/trunk/controls/test/webapps/controlsWeb/binding/BindingTests.jpf
 Fri Feb 25 10:46:41 2005
@@ -28,6 +28,7 @@
 
 import org.apache.beehive.controls.test.controls.binding.BindingTestControl;
 import 
org.apache.beehive.controls.test.controls.binding.DefaultBindingTestControl;
+import 
org.apache.beehive.controls.test.controls.binding.ExternalBindingTestControl;
 
 import org.apache.beehive.test.tools.milton.common.Report;
 
@@ -46,6 +47,9 @@
     @Control
     public DefaultBindingTestControl dbtc;
 
+    @Control
+    public ExternalBindingTestControl ebtc;
+
     @Jpf.Action
     protected Forward begin()
     {
@@ -65,5 +69,12 @@
     {
        return new Forward(Report.RESULTS, Report.KEY, new 
                           Report(dbtc.getStatus()));
+    }
+
+    @Jpf.Action
+    protected Forward testExternalBinding()
+    {
+       return new Forward(Report.RESULTS, Report.KEY, new 
+                          Report(ebtc.getStatus()));
     }
 }

Modified: 
incubator/beehive/trunk/controls/test/webapps/controlsWeb/binding/index.jsp
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/webapps/controlsWeb/binding/index.jsp?view=diff&r1=155359&r2=155360
==============================================================================
--- incubator/beehive/trunk/controls/test/webapps/controlsWeb/binding/index.jsp 
(original)
+++ incubator/beehive/trunk/controls/test/webapps/controlsWeb/binding/index.jsp 
Fri Feb 25 10:46:41 2005
@@ -5,6 +5,7 @@
     </head>
     <body>
         <netui:anchor 
action="testDefaultBinding">testDefaultBinding</netui:anchor><br>
-        <netui:anchor 
action="testBindingOverride">testBindingOverride</netui:anchor>
+        <netui:anchor 
action="testBindingOverride">testBindingOverride</netui:anchor><br>
+        <netui:anchor 
action="testExternalBinding">testExternalBinding</netui:anchor>
     </body>
 </html>


Reply via email to