You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by gr...@apache.org on 2019/07/03 22:26:49 UTC
[royale-asjs] 01/03: EventHandler processing of event properties
works via reflection (works for public vars in release build)
This is an automated email from the ASF dual-hosted git repository.
gregdove pushed a commit to branch feature/Crux
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
commit 5d16f48182c7005a91ebbe2d4f3ba9a3f01a52a1
Author: greg-dove <gr...@gmail.com>
AuthorDate: Thu Jul 4 09:51:56 2019 +1200
EventHandler processing of event properties works via reflection (works for public vars in release build)
---
.../crux/processors/EventHandlerProcessor.as | 3 -
.../royale/crux/reflection/TypeDescriptor.as | 4 -
.../apache/royale/crux/utils/event/EventHandler.as | 94 +++++++++++++++-------
3 files changed, 66 insertions(+), 35 deletions(-)
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/EventHandlerProcessor.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/EventHandlerProcessor.as
index d4c2141..0f82c73 100644
--- a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/EventHandlerProcessor.as
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/EventHandlerProcessor.as
@@ -103,9 +103,6 @@ package org.apache.royale.crux.processors
{
var eventHandlerTag:EventHandlerMetadataTag = metadataTag as EventHandlerMetadataTag;
- /* if( eventHandlerTag.name == MEDIATE )
- logger.warn( "[Mediate] has been deprecated in favor of [EventHandler]. Please update {0} accordingly.", bean );
-*/
if( validateEventHandlerMetadataTag( eventHandlerTag ) )
{
var expression:EventTypeExpression = new EventTypeExpression( eventHandlerTag.event, crux );
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/reflection/TypeDescriptor.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/reflection/TypeDescriptor.as
index ffe210f..79c2b54 100644
--- a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/reflection/TypeDescriptor.as
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/reflection/TypeDescriptor.as
@@ -57,10 +57,6 @@ package org.apache.royale.crux.reflection
/**
* @royalesuppresspublicvarwarning
*/
- // public var description:XML;
- /**
- * @royalesuppresspublicvarwarning
- */
public var typeDefinition:TypeDefinition;
/**
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/utils/event/EventHandler.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/utils/event/EventHandler.as
index d2fbd9d..ce8097f 100644
--- a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/utils/event/EventHandler.as
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/utils/event/EventHandler.as
@@ -43,6 +43,11 @@ package org.apache.royale.crux.utils.event
import org.apache.royale.crux.utils.async.AsyncTokenOperation;
import org.apache.royale.crux.utils.async.IAsynchronousEvent;
import org.apache.royale.crux.utils.async.IAsynchronousOperation;
+ import org.apache.royale.reflection.TypeDefinition;
+ import org.apache.royale.reflection.MethodDefinition;
+ import org.apache.royale.reflection.VariableDefinition;
+
+ import org.apache.royale.reflection.utils.getMembersWithNameMatch;
/**
* Represents a deferred request for mediation.
@@ -160,7 +165,7 @@ package org.apache.royale.crux.utils.event
if( hostMethod.parameterCount > 0 && event is getParameterType( 0 ) )
result = method.apply( null, [ event ] );
else
- result = method.apply();
+ result = method.call(null);
}
if( event is IAsynchronousEvent && IAsynchronousEvent( event ).step != null )
@@ -199,6 +204,9 @@ package org.apache.royale.crux.utils.event
throw new Error( "The properties attribute of " + metadataTag.asTag + " is not compatible with the method signature of " + hostMethod.name + "()." );
}
+
+ protected var accessChains:Object ;
+
/**
* Validate Event
*
@@ -210,26 +218,54 @@ package org.apache.royale.crux.utils.event
*/
protected function validateEvent( event:Event, metadataTag:EventHandlerMetadataTag ):Boolean
{
- for each( var property:String in metadataTag.properties )
- {
- if( property.indexOf( "." ) < 0 && !( property in event ) )
- {
- throw new Error( "Unable to handle event: " + property + " does not exist as a property of " + getQualifiedClassName( event ) + "." );
- }
- else
+
+ if (!accessChains) {
+ //set up access chains
+ accessChains = {};
+ var eventClassDescriptor:TypeDescriptor = TypeCache.getTypeDescriptor( eventClass );
+ var eventDefinition:TypeDefinition = eventClassDescriptor.typeDefinition;
+
+ for each( var property:String in metadataTag.properties )
{
var chain:Array = property.split( "." );
- var o:Object = event;
- while( chain.length > 0 )
- {
+ var accessChain:Array = [];
+ var definition:TypeDefinition = eventDefinition;
+ while (chain.length) {
var prop:String = chain.shift();
-
- if( prop in o )
- o = o[ prop ];
- else
- throw new Error( "Unable to handle event: " + prop + " does not exist as a property of " + getQualifiedClassName( o ) + " as defined in " + metadataTag.asTag + "." );
+ var search:Array = getMembersWithNameMatch(definition.variables,prop);
+ if (search.length==0) getMembersWithNameMatch(definition.accessors,prop, search);
+ if (search.length != 1) {
+ throw new Error( "Unable to handle event: " + property + " does not exist as a property of " + eventClassDescriptor.className + "." );
+ }
+ var varDef:VariableDefinition = search[0];
+ accessChain.push(varDef);
+ if (chain.length) {
+ //continue with next definition
+ definition = varDef.type;
+ }
+ }
+ accessChains[property] = accessChain;
+ }
+ }
+
+ //now validate it
+ for each( property in metadataTag.properties )
+ {
+ accessChain = accessChains[property];
+ var o:Object = event;
+ var defName:String = eventDefinition.qualifiedName;
+ if (accessChain.length > 1) {
+ var index:int = 0;
+ var l:int = accessChain.length-1;
+ while (index<l) {
+ if (o == null) {
+ throw new Error( "Unable to handle event: " + varDef.name + " is null as a property of " + defName + " as defined in " + metadataTag.asTag + "." );
+ }
+ varDef = accessChain[index];
+ o = varDef.getValue(o)
}
}
+
}
return true;
@@ -247,21 +283,23 @@ package org.apache.royale.crux.utils.event
for each( var property:String in properties )
{
- if( property.indexOf( "." ) < 0 )
- {
- args[ args.length ] = event[ property ];
- }
- else
- {
- var chain:Array = property.split( "." );
+
+ var varDef:VariableDefinition;
+ var chain:Array = accessChains[property];
+ var l:uint = chain.length;
+ if (l == 1) {
+ varDef = chain[0];
+ args[ args.length ] = VariableDefinition(chain[0]).getValue(event);
+ } else {
var o:Object = event;
- while( chain.length > 1 )
- o = o[ chain.shift() ];
-
- args[ args.length ] = o[ chain.shift() ];
+ for (var i:int=0; i<l;i++) {
+ o = VariableDefinition(chain[i]).getValue(o);
+ }
+ args[ args.length ] = o
}
+
}
-
+ //trace('EventHandler... args', args)
return args;
}