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);