Author: kentam
Date: Mon Apr 25 15:41:31 2005
New Revision: 164678

URL: http://svn.apache.org/viewcvs?rev=164678&view=rev
Log:
BEEHIVE-270: Validate event handler exceptions against event declaration 
signature

Tightend up control event handler validation; we now check that the return 
types match between the event handler and the eventset method, as well as 
requiring that the event handler's throws clause is a subset of the eventset 
method's throws clause.

Also fixed some bugs related to control client initialization in the absence of 
a control context, and activated the some @EventHandler tests in the DRT.


Modified:
    
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/Controls.java
    
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ClientInitializer.java
    
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java
    
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptMethod.java
    
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm
    
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/event/EventHandlerTest.java

Modified: 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/Controls.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/Controls.java?rev=164678&r1=164677&r2=164678&view=diff
==============================================================================
--- 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/Controls.java
 (original)
+++ 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/Controls.java
 Mon Apr 25 15:41:31 2005
@@ -138,8 +138,16 @@
             Method m = initClass.getMethod( "initialize", 
ControlBeanContext.class, clientClass );
             m.invoke(null, cbc, client );
         }
-        catch ( Exception e )
+        catch ( Throwable e )
         {
+            if ( e instanceof InvocationTargetException )
+            {
+                if ( e.getCause() != null )
+                {
+                    e = e.getCause();
+                }
+            }
+                
             throw new ControlException( "Exception trying to run client 
initializer: " + e.getClass().getName() + ", " +
                                         e.getMessage() );
         }

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ClientInitializer.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ClientInitializer.java?rev=164678&r1=164677&r2=164678&view=diff
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ClientInitializer.java
 (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ClientInitializer.java
 Mon Apr 25 15:41:31 2005
@@ -20,6 +20,7 @@
 import java.lang.reflect.AnnotatedElement;
 import org.apache.beehive.controls.api.context.ControlBeanContext;
 import org.apache.beehive.controls.api.properties.PropertyMap;
+import org.apache.beehive.controls.api.properties.AnnotatedElementMap;
 import org.apache.beehive.controls.api.versioning.VersionRequired;
 import org.apache.beehive.controls.api.versioning.Version;
 
@@ -49,10 +50,13 @@
     }
 
     /**
-     * Returns the annotation map for the specified bean/element combination.
+     * Returns the annotation map for the specified element.
      */
     public static PropertyMap getAnnotationMap(ControlBeanContext cbc, 
AnnotatedElement annotElem)
     {
+        if ( cbc == null )
+            return new AnnotatedElementMap(annotElem);
+
         return cbc.getAnnotationMap(annotElem);
     }
 }

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java?rev=164678&r1=164677&r2=164678&view=diff
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java
 (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java
 Mon Apr 25 15:41:31 2005
@@ -18,6 +18,7 @@
  */
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -302,8 +303,26 @@
                     // comparison will fail.  If parameterized, we don't 
validate.
                     //
                     if (controlEvent.hasParameterizedArguments() ||
-                        
controlEvent.getArgTypes().equals(handlerMethod.getArgTypes()))
+                        
(controlEvent.getArgTypes().equals(handlerMethod.getArgTypes()) &&
+                         
controlEvent.getReturnType().equals(handlerMethod.getReturnType())
+                        )
+                       )
                     {
+                        HashSet<String> throwSet = new 
HashSet<String>(controlEvent.getThrowsList());
+                        ArrayList<String> handlerThrows = 
handlerMethod.getThrowsList();
+                        boolean throwsMatches = true;
+                        for ( String t : handlerThrows )
+                        {
+                            if ( !throwSet.contains(t) )
+                                throwsMatches = false;
+                        }
+                    
+                        if ( !throwsMatches )
+                        {
+                            
_env.getMessager().printError(clientMethod.getPosition(),
+                                "Handler method " + handlerMethod.getName() + 
" throws clause is not a proper subset of the eventset method's throws claus.  
Handlers may only throw throwables declared by the eventset method.");
+                        }
+
                         adaptor.addHandler(controlEvent, 
                                        new AptEventHandler(controlEvent, 
clientMethod, _env));
                         found = true;

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptMethod.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptMethod.java?rev=164678&r1=164677&r2=164678&view=diff
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptMethod.java
 (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptMethod.java
 Mon Apr 25 15:41:31 2005
@@ -305,9 +305,9 @@
     /**
      * Returns an ArrayList of thrown exceptions
      */
-    public ArrayList getThrowsList()
+    public ArrayList<String> getThrowsList()
     {
-        ArrayList throwsList = new ArrayList();
+        ArrayList<String> throwsList = new ArrayList<String>();
 
         if ( _methodDecl == null ||
              _methodDecl.getThrownTypes() == null ||

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm?rev=164678&r1=164677&r2=164678&view=diff
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm
 (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm
 Mon Apr 25 15:41:31 2005
@@ -106,7 +106,7 @@
 ## bean into the context.
 ##
 #macro (initControl $control)
-    $control.controlBean.className $control.localName = 
($control.controlBean.className)cbc.getBean("$control.name");
+    $control.controlBean.className $control.localName = (cbc == null ? null : 
($control.controlBean.className)cbc.getBean("$control.name"));
     if ($control.localName == null)
         $control.localName = (${control.controlBean.className}) 
Controls.instantiate(${control.controlBean.className}.class, 
getAnnotationMap(cbc, ${control.reflectField}), cbc, "$control.name" );
     #initEventAdaptors($control)

Modified: 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/event/EventHandlerTest.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/event/EventHandlerTest.java?rev=164678&r1=164677&r2=164678&view=diff
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/event/EventHandlerTest.java
 (original)
+++ 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/event/EventHandlerTest.java
 Mon Apr 25 15:41:31 2005
@@ -5,6 +5,7 @@
 import junit.framework.TestCase;
 import java.beans.Beans;
 import org.apache.beehive.controls.api.bean.Control;
+import org.apache.beehive.controls.api.bean.Controls;
 import org.apache.beehive.controls.api.bean.ControlBean;
 import org.apache.beehive.controls.api.events.EventHandler;
 import org.apache.beehive.controls.test.controls.event.HelloBean;
@@ -16,7 +17,6 @@
  * All tests on controls instantiated declaratively are deactivated until this 
feature is supported.
  */
 @Freq("checkin")
[EMAIL PROTECTED]("inactive")
 public class EventHandlerTest extends TestCase
 {
        private boolean event1Received=false;
@@ -28,34 +28,45 @@
     @Control
     public HelloBean myHellobean;
 
-    public EventHandlerTest(String s) { super(s); }
-
-
-       /** EventHandler that receives EventSet1 from myHelloBean*/
-    @EventHandler (field="myHellobean", eventSet= HelloBean.EventSet1.class,
-                                   eventName="method1")
+    public EventHandlerTest(String s)
+    { 
+        super(s);
+
+        try
+        {
+            Controls.initializeClient( null, this, null );
+        }
+        catch ( ClassNotFoundException cnfe )
+        {
+                       fail("Failed to initialize controls client");
+        }
+    }
+
+
+     /** EventHandler that receives EventSet1 from myHelloBean*/
+     @EventHandler (field="myHellobean",
+                    eventSet=HelloBean.EventSet1.class,
+                    eventName="method1")
      public void myHelloBeanMessageHandler()
      {
         // Invoked with event is received
-        /*
         System.out.println("***************************************");
         System.out.println("EventSet1 receive!");
         System.out.println("***************************************");
-               */
                event1Received=true;
      }
 
 
-    /** EventHandler that receives EventSet2 from myHelloBean*/
-    @EventHandler (field="myHellobean", eventSet= HelloBean.EventSet2.class, 
eventName="set2Method2")
+     /** EventHandler that receives EventSet2 from myHelloBean*/
+     @EventHandler (field="myHellobean",
+                    eventSet=HelloBean.EventSet2.class,
+                    eventName="set2Method2")
      public int myHelloBeanMessageHandler2()
      {
         // Invoked when event is received
-        /*
         
System.out.println("***************************************************");
         System.out.println("EventSet2 receive!");
         
System.out.println("***************************************************");
-               */
                event2Received=true;
         return 0;
      }
@@ -67,15 +78,19 @@
      */
     public void testHandlerReceiveEvents() throws Exception
     {
+        System.out.println("************************************");
+        System.out.println("******    entered TestHandlerReceiveEvents 
******");
+        System.out.println("************************************");
                Assert.assertNotNull(myHellobean);
-               /*
         System.out.println("************************************");
-        System.out.println("******    events triggered    ******");
+        System.out.println("******    myHelloBean is valid ******");
         System.out.println("************************************");
-               */
                /* Invokes the method on the control while will trigger the 
events*/
                try{
                    myHellobean.triggerEvents();
+        System.out.println("************************************");
+        System.out.println("******    events triggered    ******");
+        System.out.println("************************************");
 
                        /*Wait for the events*/
                        Thread.currentThread().sleep(1000);


Reply via email to