You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2014/03/12 05:36:35 UTC
[1/7] git commit: [flex-asjs] [refs/heads/develop] - need one more
fake file for exporting release builds from FB
Repository: flex-asjs
Updated Branches:
refs/heads/develop d21756911 -> e0597f0a9
need one more fake file for exporting release builds from FB
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/b606f59d
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/b606f59d
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/b606f59d
Branch: refs/heads/develop
Commit: b606f59d79c1ee0929c2ab362c7c19a02a13e48c
Parents: d217569
Author: Alex Harui <ah...@apache.org>
Authored: Mon Mar 3 10:00:29 2014 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:35:59 2014 -0700
----------------------------------------------------------------------
installer.xml | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/b606f59d/installer.xml
----------------------------------------------------------------------
diff --git a/installer.xml b/installer.xml
index 4126942..e5943a2 100644
--- a/installer.xml
+++ b/installer.xml
@@ -692,6 +692,7 @@
<mkdir dir="${FLEXJS_HOME}/frameworks/themes/Halo" />
<copy file="${FLEXJS_HOME}/frameworks/as/libs/MXMLCClasses.swc"
tofile="${FLEXJS_HOME}/frameworks/themes/Halo/Halo.swc" />
+ <touch file="${FLEXJS_HOME}/frameworks/themes/Spark/spark.css" />
<copy file="${FLEXJS_HOME}/frameworks/air-config.xml"
tofile="${FLEXJS_HOME}/frameworks/airmobile-config.xml" />
<touch file="${FLEXJS_HOME}/frameworks/macfonts.ser" />
[4/7] git commit: [flex-asjs] [refs/heads/develop] - changes required
to get BasicTests to pass on two simple tests
Posted by ah...@apache.org.
changes required to get BasicTests to pass on two simple tests
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/89002bb0
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/89002bb0
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/89002bb0
Branch: refs/heads/develop
Commit: 89002bb0e717c1b1cf2f3676b804b396294cdba8
Parents: dec3558
Author: Alex Harui <ah...@apache.org>
Authored: Mon Mar 3 15:48:30 2014 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:36:06 2014 -0700
----------------------------------------------------------------------
.../src/org/apache/flex/core/Application.as | 28 +++++++++++++++++++-
.../src/org/apache/flex/core/ContainerBase.as | 2 ++
.../src/org/apache/flex/core/IFlexInfo.as | 2 +-
.../src/org/apache/flex/core/IParent.as | 10 +++++++
.../org/apache/flex/core/SimpleStatesImpl.as | 20 +++++++++-----
.../FlexJSUI/src/org/apache/flex/core/UIBase.as | 13 +++++++++
.../src/org/apache/flex/createjs/Application.as | 2 +-
.../org/apache/flex/createjs/core/ViewBase.as | 4 +++
.../apache/flex/utils/MXMLDataInterpreter.as | 8 +++---
.../src/org/apache/flex/utils/MixinManager.as | 4 +--
10 files changed, 78 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
index 57f658d..80e3961 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
@@ -92,6 +92,19 @@ package org.apache.flex.core
loaderInfo.addEventListener(flash.events.Event.INIT, initHandler);
}
+
+ /**
+ * The document property is used to provide
+ * a property lookup context for non-display objects.
+ * For Application, it points to itself.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public var document:Object = this;
+
private function initHandler(event:flash.events.Event):void
{
ValuesManager.valuesImpl = valuesImpl;
@@ -102,6 +115,7 @@ package org.apache.flex.core
initialView.applicationModel = model;
this.addElement(initialView);
dispatchEvent(new Event("viewChanged"));
+ dispatchEvent(new Event("applicationComplete"));
}
/**
@@ -275,7 +289,7 @@ package org.apache.flex.core
* @playerversion AIR 2.6
* @productversion FlexJS 0.0
*/
- public function get info():Object
+ public function info():Object
{
if (!_info)
{
@@ -359,5 +373,17 @@ package org.apache.flex.core
removeChild(c as DisplayObject);
}
+ /**
+ * @copy org.apache.flex.core.IParent#numElements
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function get numElements():int
+ {
+ return numChildren;
+ }
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/ContainerBase.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/ContainerBase.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/ContainerBase.as
index f13cfc4..6c32cba 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/ContainerBase.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/ContainerBase.as
@@ -134,6 +134,8 @@ package org.apache.flex.core
public function set states(value:Array):void
{
_states = value;
+ _currentState = _states[0].name;
+
try{
if (getBeadByType(IStatesImpl) == null)
addBead(new (ValuesManager.valuesImpl.getValue(this, "iStatesImpl")) as IBead);
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IFlexInfo.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IFlexInfo.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IFlexInfo.as
index 984ec10..637918e 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IFlexInfo.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IFlexInfo.as
@@ -38,6 +38,6 @@ package org.apache.flex.core
* @playerversion AIR 2.6
* @productversion FlexJS 0.0
*/
- function get info():Object
+ function info():Object
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IParent.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IParent.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IParent.as
index 85f4663..864382a 100755
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IParent.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IParent.as
@@ -79,5 +79,15 @@ package org.apache.flex.core
* @productversion FlexJS 0.0
*/
function removeElement(c:Object):void;
+
+ /**
+ * The number of elements in the parent.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function get numElements():int;
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/SimpleStatesImpl.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/SimpleStatesImpl.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/SimpleStatesImpl.as
index 72d838d..a228c16 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/SimpleStatesImpl.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/SimpleStatesImpl.as
@@ -104,7 +104,9 @@ package org.apache.flex.core
var ai:AddItems = AddItems(o);
for each (var item:DisplayObject in ai.items)
{
- var parent:IParent = ai.document[ai.destination] as IParent;
+ var parent:IParent = ai.document as IParent;
+ if (ai.destination != null)
+ parent = parent[ai.destination] as IParent;
parent.removeElement(item);
}
if (parent is IContainer)
@@ -133,13 +135,19 @@ package org.apache.flex.core
}
for each (var item:DisplayObject in ai.items)
{
- var parent:IParent = ai.document[ai.destination] as IParent;
+ var parent:IParent = ai.document as IParent;
+ if (ai.destination != null)
+ parent = parent[ai.destination] as IParent;
if (ai.relativeTo != null)
{
- var child:Object = ai.document[ai.relativeTo];
- var index:int = parent.getElementIndex(child);
- if (ai.position == "after")
- index++;
+ var index:int = parent.numElements;
+ if (ai.relativeTo != null)
+ {
+ var child:Object = ai.document[ai.relativeTo];
+ index = parent.getElementIndex(child);
+ if (ai.position == "after")
+ index++;
+ }
parent.addElementAt(item, index);
}
else
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/UIBase.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/UIBase.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/UIBase.as
index 2590735..59f9839 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/UIBase.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/UIBase.as
@@ -542,6 +542,19 @@ package org.apache.flex.core
}
/**
+ * @copy org.apache.flex.core.IParent#numElements
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function get numElements():int
+ {
+ return numChildren;
+ }
+
+ /**
* The method called when added to a parent. This is a good
* time to set up beads.
*
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/Application.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/Application.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/Application.as
index 2214325..dd3ed37 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/Application.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/Application.as
@@ -127,7 +127,7 @@ package org.apache.flex.createjs
return null;
}
- public function get info():Object
+ public function info():Object
{
return {};
}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/core/ViewBase.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/core/ViewBase.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/core/ViewBase.as
index 195821f..40c1e14 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/core/ViewBase.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/core/ViewBase.as
@@ -81,6 +81,10 @@ package org.apache.flex.createjs.core
removeChild(c as DisplayObject);
}
+ public function get numElements():int
+ {
+ return numChildren;
+ }
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
index 40709c3..577690d 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
@@ -157,8 +157,8 @@ public class MXMLDataInterpreter
IStrand(comp).addBead(value as IBead);
}
var beadOffset:int = i + (m - 1) * 3;
- if (beadOffset >= -1)
- trace(beadOffset, data[beadOffset]);
+ //if (beadOffset >= -1)
+ // trace(beadOffset, data[beadOffset]);
if (m > 0 && data[beadOffset] == "beads")
{
m--;
@@ -321,8 +321,8 @@ public class MXMLDataInterpreter
m = data[i++]; // num props
var beadOffset:int = i + (m - 1) * 3;
- if (beadOffset >= -1)
- trace(beadOffset, data[beadOffset]);
+ //if (beadOffset >= -1)
+ // (beadOffset, data[beadOffset]);
if (m > 0 && data[beadOffset] == "beads")
{
m--;
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MixinManager.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MixinManager.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MixinManager.as
index b61222e..bbac35e 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MixinManager.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MixinManager.as
@@ -67,8 +67,8 @@ public class MixinManager implements IBead
var app:IFlexInfo = value as IFlexInfo;
if (app)
{
- var mixins:Array = app.info.mixins;
- var domain:ApplicationDomain = app.info.currentDomain;
+ var mixins:Array = app.info().mixins;
+ var domain:ApplicationDomain = app.info().currentDomain;
for each (var mixin:String in mixins)
{
var mixinClass:Object = domain.getDefinition(mixin);
[5/7] git commit: [flex-asjs] [refs/heads/develop] - more changes to
get FlexJS basic tests to pass two simple tests. Needs newer mustella.swc
from SDK
Posted by ah...@apache.org.
more changes to get FlexJS basic tests to pass two simple tests. Needs newer mustella.swc from SDK
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/abbfdf9e
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/abbfdf9e
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/abbfdf9e
Branch: refs/heads/develop
Commit: abbfdf9e4b507bc273e59762d2dabfd5661f0b47
Parents: 89002bb
Author: Alex Harui <ah...@apache.org>
Authored: Mon Mar 3 15:49:18 2014 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:36:07 2014 -0700
----------------------------------------------------------------------
build.xml | 4 +-
.../tests/basicTests/BasicTestsApp-config.xml | 17 +++++++-
mustella/tests/basicTests/FlexJSContext.as | 43 ++++++++++++++++++++
.../halo/scripts/ButtonTestScript.mxml | 4 +-
.../halo/scripts/CheckBoxTestScript.mxml | 4 +-
5 files changed, 65 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/abbfdf9e/build.xml
----------------------------------------------------------------------
diff --git a/build.xml b/build.xml
index 182ff95..1a1956a 100644
--- a/build.xml
+++ b/build.xml
@@ -1151,8 +1151,8 @@
Tests: The current checkintests that must be run before every checkin
-->
- <target name="checkintests" description="Run these tests before every checkin" />
- <!--<target name="checkintests" depends="basictests-mustella" description="Run these tests before every checkin" />-->
+ <!--<target name="checkintests" description="Run these tests before every checkin" />-->
+ <target name="checkintests" depends="basictests-mustella" description="Run these tests before every checkin" />
<!--<target name="checkintests" depends="dependencychecker-framework,basictests-mustella,checkintests-mobile" description="Run these tests before every checkin"/-->
<!--
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/abbfdf9e/mustella/tests/basicTests/BasicTestsApp-config.xml
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/BasicTestsApp-config.xml b/mustella/tests/basicTests/BasicTestsApp-config.xml
index e87fca1..2ab123a 100644
--- a/mustella/tests/basicTests/BasicTestsApp-config.xml
+++ b/mustella/tests/basicTests/BasicTestsApp-config.xml
@@ -26,25 +26,37 @@
-->
<symbol>halo.scripts.ButtonTestScript</symbol>
<symbol>halo.scripts.CheckBoxTestScript</symbol>
+ <!-- temporarily
<symbol>halo.scripts.RadioButtonTestScript</symbol>
<symbol>halo.scripts.TextInputTestScript</symbol>
<symbol>halo.scripts.TextAreaTestScript</symbol>
<symbol>halo.scripts.ComboBoxTestScript</symbol>
+ -->
<!--<symbol>halo.scripts.ColorPickerTestScript</symbol>-->
+ <!-- temporarily
<symbol>halo.scripts.NumericStepperTestScript</symbol>
+ -->
<!--<symbol>halo.scripts.DateFieldTestScript</symbol>-->
<!--<symbol>halo.scripts.MenuTestScript</symbol>-->
<!--<symbol>halo.scripts.MenuBarTestScript</symbol>-->
<!--<symbol>halo.scripts.FocusManagerTestScript</symbol>-->
+ <!-- temporarily
<symbol>halo.scripts.ListAndDataGridTestScript</symbol>
+ -->
<!--<symbol>halo.scripts.TreeTestScript</symbol>-->
+ <!-- temporarily
<symbol>halo.scripts.ImageTestScript</symbol>
+ -->
<!--<symbol>halo.scripts.SWFLoaderTestScript</symbol>-->
+ <!-- temporarily
<symbol>halo.scripts.TextTestScript</symbol>
+ -->
<!--<symbol>halo.scripts.FTETextTestScript</symbol>-->
<!--<symbol>halo.scripts.ProgressBarTestScript</symbol>-->
+ <!-- temporarily
<symbol>halo.scripts.SliderTestScript</symbol>
<symbol>halo.scripts.AlertTestScript</symbol>
+ -->
<!--<symbol>halo.scripts.TabNavigatorTestScript</symbol>-->
<!--<symbol>halo.scripts.AccordionTestScript</symbol>-->
<!--<symbol>halo.scripts.RPCDataBindingTestScript</symbol>-->
@@ -79,7 +91,9 @@
<!--<symbol>spark.scripts.FXG2RuntimeTestScript</symbol>-->
<!--<symbol>dmv.scripts.ADGTestScript</symbol>-->
<!--<symbol>dmv.scripts.ODGTestScript</symbol>-->
- <symbol>dmv.scripts.ChartsTestScript</symbol>
+ <!-- temporarily
+ <symbol>dmv.scripts.ChartsTestScript</symbol>
+ -->
<!--<symbol>spark.scripts.AnimateConstraintsTestScript</symbol>-->
<!--<symbol>spark.scripts.ImageTestScript</symbol>-->
<!--<symbol>spark.scripts.DateTimeFormatterTestScript</symbol>-->
@@ -98,5 +112,6 @@
<symbol>ExitWhenDone</symbol>
<symbol>SetShowRTE</symbol>
<symbol>SendFormattedResultsToLog</symbol>
+ <symbol>FlexJSContext</symbol>
</includes>
</flex-config>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/abbfdf9e/mustella/tests/basicTests/FlexJSContext.as
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/FlexJSContext.as b/mustella/tests/basicTests/FlexJSContext.as
new file mode 100644
index 0000000..4f03402
--- /dev/null
+++ b/mustella/tests/basicTests/FlexJSContext.as
@@ -0,0 +1,43 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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
+{
+
+[Mixin]
+public class FlexJSContext
+{
+ public function FlexJSContext()
+ {
+ super();
+ }
+
+ public static function init(o:Object):void
+ {
+ UnitTester.contextFunction = contextFunction;
+ }
+
+ public static function contextFunction():Object
+ {
+ return UnitTester._root["initialView"];
+ }
+}
+
+
+}
+
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/abbfdf9e/mustella/tests/basicTests/halo/scripts/ButtonTestScript.mxml
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/halo/scripts/ButtonTestScript.mxml b/mustella/tests/basicTests/halo/scripts/ButtonTestScript.mxml
index 50792b9..096e528 100644
--- a/mustella/tests/basicTests/halo/scripts/ButtonTestScript.mxml
+++ b/mustella/tests/basicTests/halo/scripts/ButtonTestScript.mxml
@@ -45,8 +45,8 @@
<TestCase testID="SetupButtonTest">
<body>
<SetProperty target="" propertyName="currentState" value="haloButtonTest"
- waitEvent="updateComplete" />
- <AssertPropertyValue target="haloButtonTests.testButton" propertyName="label" value="test button" />
+ waitEvent="enterFrame" />
+ <AssertPropertyValue target="haloButtonTests.testButton" propertyName="text" value="test button" />
<AssertPropertyValue target="haloButtonTests.testLabel" propertyName="text" value="test" />
</body>
</TestCase>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/abbfdf9e/mustella/tests/basicTests/halo/scripts/CheckBoxTestScript.mxml
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/halo/scripts/CheckBoxTestScript.mxml b/mustella/tests/basicTests/halo/scripts/CheckBoxTestScript.mxml
index b0fa0d0..a7ad95d 100644
--- a/mustella/tests/basicTests/halo/scripts/CheckBoxTestScript.mxml
+++ b/mustella/tests/basicTests/halo/scripts/CheckBoxTestScript.mxml
@@ -45,8 +45,8 @@
<TestCase testID="SetupCheckBoxTest">
<body>
<SetProperty target="" propertyName="currentState" value="haloCheckBoxTest"
- waitEvent="updateComplete" />
- <AssertPropertyValue target="haloCheckBoxTests.testCheckBox" propertyName="label" value="test CheckBox" />
+ waitEvent="enterFrame" />
+ <AssertPropertyValue target="haloCheckBoxTests.testCheckBox" propertyName="text" value="test CheckBox" />
</body>
</TestCase>
<TestCase testID="CheckBoxTest1">
[3/7] git commit: [flex-asjs] [refs/heads/develop] - more legacy
classes need to make mustella happy. Some are stripped down to eliminate
undesirable dependencies
Posted by ah...@apache.org.
more legacy classes need to make mustella happy. Some are stripped down to eliminate undesirable dependencies
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/dec3558f
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/dec3558f
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/dec3558f
Branch: refs/heads/develop
Commit: dec3558fd2e48ffe82bbe41411c3044e80d072cd
Parents: b606f59
Author: Alex Harui <ah...@apache.org>
Authored: Mon Mar 3 15:47:15 2014 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:36:03 2014 -0700
----------------------------------------------------------------------
.../projects/MXMLCClasses/src/MXMLCClasses.as | 4 +
.../src/mx/binding/BindabilityInfo.as | 279 ++++
.../MXMLCClasses/src/mx/core/FlexGlobals.as | 55 +
.../MXMLCClasses/src/mx/core/IMXMLObject.as | 61 +
.../src/mx/core/IPropertyChangeNotifier.as | 67 +-
.../projects/MXMLCClasses/src/mx/core/IUID.as | 62 +
.../src/mx/events/PropertyChangeEvent.as | 72 +
.../src/mx/utils/DescribeTypeCache.as | 172 +++
.../src/mx/utils/DescribeTypeCacheRecord.as | 129 ++
.../MXMLCClasses/src/mx/utils/ObjectProxy.as | 825 ++++++++++
.../MXMLCClasses/src/mx/utils/ObjectUtil.as | 1424 ++++++++++++++++++
.../MXMLCClasses/src/mx/utils/StringUtil.as | 364 +++++
.../MXMLCClasses/src/mx/utils/UIDUtil.as | 296 ++++
.../MXMLCClasses/src/mx/utils/object_proxy.as | 34 +
14 files changed, 3839 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/MXMLCClasses.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/MXMLCClasses.as b/frameworks/as/projects/MXMLCClasses/src/MXMLCClasses.as
index 2bb6511..dc3661e 100644
--- a/frameworks/as/projects/MXMLCClasses/src/MXMLCClasses.as
+++ b/frameworks/as/projects/MXMLCClasses/src/MXMLCClasses.as
@@ -42,8 +42,10 @@ internal class MXMLCClasses
import mx.binding.XMLWatcher; XMLWatcher;
import mx.core.DeferredInstanceFromClass; DeferredInstanceFromClass;
import mx.core.DeferredInstanceFromFunction; DeferredInstanceFromFunction;
+ import mx.core.FlexGlobals; FlexGlobals;
import mx.core.IDeferredInstance; IDeferredInstance;
import mx.core.IFlexModuleFactory; IFlexModuleFactory;
+ import mx.core.IMXMLObject; IMXMLObject;
import mx.core.IPropertyChangeNotifier; IPropertyChangeNotifier;
import mx.core.IStateClient2; IStateClient2;
import mx.core.mx_internal; use namespace mx_internal;
@@ -54,6 +56,8 @@ internal class MXMLCClasses
import mx.styles.CSSStyleDeclaration; CSSStyleDeclaration;
import mx.styles.IStyleManager2; IStyleManager2;
import mx.styles.StyleManager; StyleManager;
+ import mx.utils.ObjectUtil; ObjectUtil;
+ import mx.utils.StringUtil; StringUtil;
}
}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/binding/BindabilityInfo.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/binding/BindabilityInfo.as b/frameworks/as/projects/MXMLCClasses/src/mx/binding/BindabilityInfo.as
new file mode 100644
index 0000000..1d48569
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/binding/BindabilityInfo.as
@@ -0,0 +1,279 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.binding
+{
+
+import mx.events.PropertyChangeEvent;
+
+[ExcludeClass]
+
+/**
+ * @private
+ * Bindability information for children (properties or methods)
+ * of a given class, based on the describeType() structure for that class.
+ */
+public class BindabilityInfo
+{
+
+ //--------------------------------------------------------------------------
+ //
+ // Class constants
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Name of [Bindable] metadata.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static const BINDABLE:String = "Bindable";
+
+ /**
+ * Name of [Managed] metadata.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static const MANAGED:String = "Managed";
+
+ /**
+ * Name of [ChangeEvent] metadata.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static const CHANGE_EVENT:String = "ChangeEvent";
+
+ /**
+ * Name of [NonCommittingChangeEvent] metadata.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static const NON_COMMITTING_CHANGE_EVENT:String =
+ "NonCommittingChangeEvent";
+
+ /**
+ * Name of describeType() <accessor> element.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static const ACCESSOR:String = "accessor";
+
+ /**
+ * Name of describeType() <method> element.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static const METHOD:String = "method";
+
+ //--------------------------------------------------------------------------
+ //
+ // Constructor
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Constructor.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function BindabilityInfo(typeDescription:XML)
+ {
+ super();
+
+ this.typeDescription = typeDescription;
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Variables
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ private var typeDescription:XML;
+
+ /**
+ * @private
+ * event name -> true
+ */
+ private var classChangeEvents:Object;
+
+ /**
+ * @private
+ * child name -> { event name -> true }
+ */
+ private var childChangeEvents:Object = {};
+
+ //--------------------------------------------------------------------------
+ //
+ // Variables
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Object containing { eventName: true } for each change event
+ * (class- or child-level) that applies to the specified child.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function getChangeEvents(childName:String):Object
+ {
+ var changeEvents:Object = childChangeEvents[childName];
+
+ if (!changeEvents)
+ {
+ // Seed with class-level events.
+ changeEvents = copyProps(getClassChangeEvents(), {});
+
+ // Get child-specific events.
+ var childDesc:XMLList =
+ typeDescription.accessor.(@name == childName) +
+ typeDescription.method.(@name == childName);
+
+ var numChildren:int = childDesc.length();
+
+ if (numChildren == 0)
+ {
+ // we've been asked for events on an unknown property
+ if (!typeDescription.@dynamic)
+ {
+ trace("warning: no describeType entry for '" +
+ childName + "' on non-dynamic type '" +
+ typeDescription.@name + "'");
+ }
+ }
+ else
+ {
+ if (numChildren > 1)
+ {
+ trace("warning: multiple describeType entries for '" +
+ childName + "' on type '" + typeDescription.@name +
+ "':\n" + childDesc);
+ }
+
+ addBindabilityEvents(childDesc.metadata, changeEvents);
+ }
+
+ childChangeEvents[childName] = changeEvents;
+ }
+
+ return changeEvents;
+ }
+
+ /**
+ * @private
+ * Build or return cached class change events object.
+ */
+ private function getClassChangeEvents():Object
+ {
+ if (!classChangeEvents)
+ {
+ classChangeEvents = {};
+
+ addBindabilityEvents(typeDescription.metadata, classChangeEvents);
+
+ // Class-level [Managed] means all properties
+ // dispatch propertyChange.
+ if (typeDescription.metadata.(@name == MANAGED).length() > 0)
+ {
+ classChangeEvents[PropertyChangeEvent.PROPERTY_CHANGE] = true;
+ }
+ }
+
+ return classChangeEvents;
+ }
+
+ /**
+ * @private
+ */
+ private function addBindabilityEvents(metadata:XMLList,
+ eventListObj:Object):void
+ {
+ addChangeEvents(metadata.(@name == BINDABLE), eventListObj, true);
+ addChangeEvents(metadata.(@name == CHANGE_EVENT), eventListObj, true);
+ addChangeEvents(metadata.(@name == NON_COMMITTING_CHANGE_EVENT),
+ eventListObj, false);
+ }
+
+ /**
+ * @private
+ * Transfer change events from a list of change-event-carrying metadata
+ * to an event list object.
+ * Note: metadata's first arg value is assumed to be change event name.
+ */
+ private function addChangeEvents(metadata:XMLList, eventListObj:Object, isCommit:Boolean):void
+ {
+ for each (var md:XML in metadata)
+ {
+ var arg:XMLList = md.arg;
+ if (arg.length() > 0)
+ {
+ var eventName:String = arg[0].@value;
+ eventListObj[eventName] = isCommit;
+ }
+ else
+ {
+ trace("warning: unconverted Bindable metadata in class '" +
+ typeDescription.@name + "'");
+ }
+ }
+ }
+
+ /**
+ * @private
+ * Copy properties from one object to another.
+ */
+ private function copyProps(from:Object, to:Object):Object
+ {
+ for (var propName:String in from)
+ {
+ to[propName] = from[propName];
+ }
+
+ return to;
+ }
+}
+
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/core/FlexGlobals.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/core/FlexGlobals.as b/frameworks/as/projects/MXMLCClasses/src/mx/core/FlexGlobals.as
new file mode 100644
index 0000000..b07a5d2
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/core/FlexGlobals.as
@@ -0,0 +1,55 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.core
+{
+
+/**
+ * A class that contains variables that are global to all applications within
+ * the same ApplicationDomain.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10
+ * @playerversion AIR 1.5
+ * @productversion Flex 4
+ *
+ */
+public class FlexGlobals
+{
+ //--------------------------------------------------------------------------
+ //
+ // Class variables
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * The first application run in an ApplicationDomain is the top-level application.
+ * This property is set to a reference to the top-level application in the top-level
+ * application's constructor. Each ApplicationDomain will have its own
+ * <code>topLevelApplication</code>.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10
+ * @playerversion AIR 1.5
+ * @productversion Flex 4
+ */
+ public static var topLevelApplication:Object;
+}
+
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/core/IMXMLObject.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/core/IMXMLObject.as b/frameworks/as/projects/MXMLCClasses/src/mx/core/IMXMLObject.as
new file mode 100644
index 0000000..9b6ec90
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/core/IMXMLObject.as
@@ -0,0 +1,61 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.core
+{
+
+/**
+ * The IMXMLObject interface defines the APIs that a non-visual component
+ * must implement in order to work properly with the MXML compiler.
+ * Currently, the only supported method is the <code>initialized()</code>
+ * method.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+public interface IMXMLObject
+{
+ //--------------------------------------------------------------------------
+ //
+ // Methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Called after the implementing object has been created and all
+ * component properties specified on the MXML tag have been initialized.
+ *
+ * @param document The MXML document that created this object.
+ *
+ * @param id The identifier used by <code>document</code> to refer
+ * to this object.
+ * If the object is a deep property on <code>document</code>,
+ * <code>id</code> is null.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ function initialized(document:Object, id:String):void;
+}
+
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/core/IPropertyChangeNotifier.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/core/IPropertyChangeNotifier.as b/frameworks/as/projects/MXMLCClasses/src/mx/core/IPropertyChangeNotifier.as
index 39d86ed..fbef45e 100644
--- a/frameworks/as/projects/MXMLCClasses/src/mx/core/IPropertyChangeNotifier.as
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/core/IPropertyChangeNotifier.as
@@ -20,13 +20,70 @@
package mx.core
{
+import flash.events.IEventDispatcher;
+
/**
- * @private
- * This class is used to satisfy old MXML codegen
- * for both Falcon and MXML, but in FlexJS with mxml.children-as-data output
- * it isn't needed so there is no JS equivalent
+ * The <code>IPropertyChangeNotifier</code> interface defines a marker
+ * interface.
+ * Classes that support this interface declare support for event propagation
+ * in a specialized manner.
+ * Classes that implement this interface must dispatch events for each property
+ * of this class and any nested classes publicly exposed as properties.
+ * For those properties that are anonymous (complex and not strongly typed),
+ * implementing classes provide custom support or directly use the
+ * ObjectProxy class.
+ * Implementors of this interface should use the
+ * <code>PropertyChangeEvent.createUpdateEvent()</code> method to construct an
+ * appropriate update event for dispatch.
+ * @example
+ * <code><pre>
+ *
+ * function set myProperty(value:Object):void
+ * {
+ * var oldValue:IPropertyChangeNotifier = _myProperty;
+ * var newValue:IPropertyChangeNotifier = value;
+ *
+ * // Need to ensure to dispatch changes on the new property.
+ * // Listeners use the source property to determine which object
+ * // actually originated the event.
+ * // In their event handler code, they can tell if an event has been
+ * // propagated from deep within the object graph by comparing
+ * // event.target and event.source. If they are equal, then the property
+ * // change is at the surface of the object. If they are not equal, the
+ * // property change is somewhere deeper in the object graph.
+ * newValue.addEventListener(
+ * PropertyChangeEvent.PROPERTY_CHANGE,
+ * dispatchEvent);
+ *
+ * // need to stop listening for events from the old property
+ * oldValue.removeEventListener(
+ * PropertyChangeEvent.PROPERTY_CHANGE,
+ * dispatchEvent);
+ *
+ * _myProperty = newValue;
+ *
+ * // now notify anyone that is listening
+ * if (dispatcher.hasEventListener(PropertyChangeEvent.PROPERTY_CHANGE))
+ * {
+ * var event:PropertyChangeEvent =
+ * PropertyChangeEvent.createUpdateEvent(
+ * this,
+ * "myProperty",
+ * newValue,
+ * oldValue);
+ * dispatchEvent(event);
+ * }
+ * }
+ *
+ *
+ * </pre></code>
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
*/
-public interface IPropertyChangeNotifier
+public interface IPropertyChangeNotifier extends IEventDispatcher, IUID
{
//--------------------------------------------------------------------------
//
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/core/IUID.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/core/IUID.as b/frameworks/as/projects/MXMLCClasses/src/mx/core/IUID.as
new file mode 100644
index 0000000..cd0f321
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/core/IUID.as
@@ -0,0 +1,62 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.core
+{
+
+/**
+ * The IUID interface defines the interface for objects that must have
+ * Unique Identifiers (UIDs) to uniquely identify the object.
+ * UIDs do not need to be universally unique for most uses in Flex.
+ * One exception is for messages send by data services.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+public interface IUID
+{
+ //--------------------------------------------------------------------------
+ //
+ // Properties
+ //
+ //--------------------------------------------------------------------------
+
+ //----------------------------------
+ // uid
+ //----------------------------------
+
+ /**
+ * The unique identifier for this object.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ function get uid():String;
+
+ /**
+ * @private
+ */
+ function set uid(value:String):void;
+}
+
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/events/PropertyChangeEvent.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/events/PropertyChangeEvent.as b/frameworks/as/projects/MXMLCClasses/src/mx/events/PropertyChangeEvent.as
index dcb2996..47033ec 100644
--- a/frameworks/as/projects/MXMLCClasses/src/mx/events/PropertyChangeEvent.as
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/events/PropertyChangeEvent.as
@@ -73,6 +73,78 @@ public class PropertyChangeEvent extends Event
super(type, bubbles, cancelable);
}
+ //----------------------------------
+ // kind
+ //----------------------------------
+
+ /**
+ * Specifies the kind of change.
+ * The possible values are <code>PropertyChangeEventKind.UPDATE</code>,
+ * <code>PropertyChangeEventKind.DELETE</code>, and <code>null</code>.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public var kind:String;
+
+ //----------------------------------
+ // newValue
+ //----------------------------------
+
+ /**
+ * The value of the property after the change.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public var newValue:Object;
+
+ //----------------------------------
+ // oldValue
+ //----------------------------------
+
+ /**
+ * The value of the property before the change.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public var oldValue:Object;
+
+ //----------------------------------
+ // property
+ //----------------------------------
+
+ /**
+ * A String, QName, or int specifying the property that changed.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public var property:Object;
+
+ //----------------------------------
+ // source
+ //----------------------------------
+
+ /**
+ * The object that the change occured on.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public var source:Object;
+
}
}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCache.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCache.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCache.as
new file mode 100644
index 0000000..1517b55
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCache.as
@@ -0,0 +1,172 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.utils
+{
+
+import flash.utils.describeType;
+import flash.utils.getDefinitionByName;
+import flash.utils.getQualifiedClassName;
+import mx.binding.BindabilityInfo;
+
+[ExcludeClass]
+
+/**
+ * @private
+ * DescribeTypeCache is a convenience class that is used to
+ * cache the return values of <code>flash.utils.describeType()</code>
+ * so that calls made subsequent times return faster.
+ *
+ * This class also lets you set handler functions for specific value types.
+ * These will get called when the user tries to access these values on
+ * the <code>DescribeTypeCacheRecord</code> class.
+ *
+ * @see mx.utils.DescribeTypeCacheRecord
+ */
+public class DescribeTypeCache
+{
+
+ //--------------------------------------------------------------------------
+ //
+ // Class initialization
+ //
+ //--------------------------------------------------------------------------
+
+ registerCacheHandler("bindabilityInfo", bindabilityInfoHandler);
+
+ //--------------------------------------------------------------------------
+ //
+ // Class variables
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ private static var typeCache:Object = {};
+
+ /**
+ * @private
+ */
+ private static var cacheHandlers:Object = {};
+
+ //--------------------------------------------------------------------------
+ //
+ // Class methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Calls <code>flash.utils.describeType()</code> for the first time and caches
+ * the return value so that subsequent calls return faster.
+ *
+ * @param o Can be either a string describing a fully qualified class name or any
+ * ActionScript value, including all available ActionScript types, object instances,
+ * primitive types (such as <code>uint</code>), and class objects.
+ *
+ * @return Returns the cached record.
+ *
+ * @see flash.utils#describeType()
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function describeType(o:*):DescribeTypeCacheRecord
+ {
+ var className:String;
+ var cacheKey:String;
+
+ if (o is String)
+ cacheKey = className = o;
+ else
+ cacheKey = className = getQualifiedClassName(o);
+
+ //Need separate entries for describeType(Foo) and describeType(myFoo)
+ if (o is Class)
+ cacheKey += "$";
+
+ if (cacheKey in typeCache)
+ {
+ return typeCache[cacheKey];
+ }
+ else
+ {
+ if (o is String)
+ {
+ try
+ {
+ o = getDefinitionByName(o);
+ }
+ catch (error:ReferenceError)
+ {
+ // The o parameter doesn't refer to an ActionScript
+ // definition, it's just a string value.
+ }
+ }
+ var typeDescription:XML = flash.utils.describeType(o);
+ var record:DescribeTypeCacheRecord = new DescribeTypeCacheRecord();
+ record.typeDescription = typeDescription;
+ record.typeName = className;
+ typeCache[cacheKey] = record;
+
+ return record;
+ }
+ }
+
+ /**
+ * registerCacheHandler lets you add function handler for specific strings.
+ * These functions get called when the user refers to these values on a
+ * instance of <code>DescribeTypeCacheRecord</code>.
+ *
+ * @param valueName String that specifies the value for which the handler must be set.
+ * @param handler Function that should be called when user references valueName.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function registerCacheHandler(valueName:String, handler:Function):void
+ {
+ cacheHandlers[valueName] = handler;
+ }
+
+ /**
+ * @private
+ */
+ internal static function extractValue(valueName:String, record:DescribeTypeCacheRecord):*
+ {
+ if (valueName in cacheHandlers)
+ return cacheHandlers[valueName](record);
+
+ return undefined;
+ }
+
+ /**
+ * @private
+ */
+ private static function bindabilityInfoHandler(record:DescribeTypeCacheRecord):*
+ {
+ return new BindabilityInfo(record.typeDescription);
+ }
+}
+
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCacheRecord.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCacheRecord.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCacheRecord.as
new file mode 100644
index 0000000..ea17f6c
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCacheRecord.as
@@ -0,0 +1,129 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.utils
+{
+
+import flash.utils.Proxy;
+import flash.utils.flash_proxy;
+
+use namespace flash_proxy;
+
+[ExcludeClass]
+
+/**
+ * @private
+ * This class represents a single cache entry, this gets created
+ * as part of the <code>describeType</code> method call on the
+ * <code>DescribeTypeCache</code> class.
+ */
+
+public dynamic class DescribeTypeCacheRecord extends Proxy
+{
+ //--------------------------------------------------------------------------
+ //
+ // Class variables
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ private var cache:Object = {};
+
+ //--------------------------------------------------------------------------
+ //
+ // Class properties
+ //
+ //--------------------------------------------------------------------------
+
+ //----------------------------------
+ // typeDescription
+ //----------------------------------
+
+ /**
+ * @private
+ */
+ public var typeDescription:XML;
+
+ //----------------------------------
+ // typeName
+ //----------------------------------
+
+ /**
+ * @private
+ */
+ public var typeName:String;
+
+ //--------------------------------------------------------------------------
+ //
+ // Constructor
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ public function DescribeTypeCacheRecord()
+ {
+ super();
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Overridden methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ override flash_proxy function getProperty(name:*):*
+ {
+ var result:* = cache[name];
+
+ if (result === undefined)
+ {
+ result = DescribeTypeCache.extractValue(name, this);
+ cache[name] = result;
+ }
+
+ return result;
+ }
+
+ /**
+ * @private
+ */
+ override flash_proxy function hasProperty(name:*):Boolean
+ {
+ if (name in cache)
+ return true;
+
+ var value:* = DescribeTypeCache.extractValue(name, this);
+
+ if (value === undefined)
+ return false;
+
+ cache[name] = value;
+
+ return true;
+ }
+}
+
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectProxy.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectProxy.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectProxy.as
new file mode 100644
index 0000000..03a8f51
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectProxy.as
@@ -0,0 +1,825 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.utils
+{
+
+import flash.events.Event;
+import flash.events.EventDispatcher;
+import flash.utils.getQualifiedClassName;
+import flash.utils.IDataInput;
+import flash.utils.IDataOutput;
+import flash.utils.IExternalizable;
+import flash.utils.Proxy;
+import flash.utils.flash_proxy;
+import mx.core.IPropertyChangeNotifier;
+import mx.events.PropertyChangeEvent;
+import mx.events.PropertyChangeEventKind;
+
+use namespace flash_proxy;
+use namespace object_proxy;
+
+[Bindable("propertyChange")]
+[RemoteClass(alias="flex.messaging.io.ObjectProxy")]
+
+/**
+ * This class provides the ability to track changes to an item
+ * managed by this proxy.
+ * Any number of objects can "listen" for changes on this
+ * object, by using the <code>addEventListener()</code> method.
+ *
+ * @example
+ * <pre>
+ * import mx.events.PropertyChangeEvent;
+ * import mx.utils.ObjectUtil;
+ * import mx.utils.ObjectProxy;
+ * import mx.utils.StringUtil;
+ *
+ * var a:Object = { name: "Tyler", age: 5, ssnum: "555-55-5555" };
+ * var p:ObjectProxy = new ObjectProxy(a);
+ * p.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, updateHandler);
+ * p.name = "Jacey";
+ * p.age = 2;
+ * delete p.ssnum;
+ *
+ * // handler function
+ * function updateHandler(event:ChangeEvent):void
+ * {
+ * trace(StringUtil.substitute("updateHandler('{0}', {1}, {2}, {3}, '{4}')",
+ * event.kind,
+ * event.property,
+ * event.oldValue,
+ * event.newValue,
+ * event.target.object_proxy::UUID));
+ * }
+ *
+ * // The trace output appears as:
+ * // updateHandler('opUpdate', name, Tyler, Jacey, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+ * // updateHandler('opUpdate', age, 5, 2, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+ * // updateHandler('opDelete', ssnum, 555-55-5555, null, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+ * </pre>
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+public dynamic class ObjectProxy extends Proxy
+ implements IExternalizable,
+ IPropertyChangeNotifier
+{
+ //--------------------------------------------------------------------------
+ //
+ // Constructor
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Initializes this proxy with the specified object, id and proxy depth.
+ *
+ * @param item Object to proxy.
+ * If no item is specified, an anonymous object will be constructed
+ * and assigned.
+ *
+ * @param uid String containing the unique id
+ * for this object instance.
+ * Required for IPropertyChangeNotifier compliance as every object must
+ * provide a unique way of identifying it.
+ * If no value is specified, a random id will be assigned.
+ *
+ * @param proxyDepth An integer indicating how many levels in a complex
+ * object graph should have a proxy created during property access.
+ * The default is -1, meaning "proxy to infinite depth".
+ *
+ * @example
+ *
+ * <pre>
+ * import mx.events.PropertyChangeEvent;
+ * import mx.utils.ObjectUtil;
+ * import mx.utils.ObjectProxy;
+ * import mx.utils.StringUtil;
+ *
+ * var a:Object = { name: "Tyler", age: 5, ssnum: "555-55-5555" };
+ * var p:ObjectProxy = new ObjectProxy(a);
+ * p.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, updateHandler);
+ * p.name = "Jacey";
+ * p.age = 2;
+ * delete p.ssnum;
+ *
+ * // handler function
+ * function updateHandler(event:PropertyChangeEvent):void
+ * {
+ * trace(StringUtil.substitute("updateHandler('{0}', {1}, {2}, {3}, '{4}')",
+ * event.kind,
+ * event.property,
+ * event.oldValue,
+ * event.newValue,
+ * event.target.uid));
+ * }
+ *
+ * // trace output
+ * updateHandler('opUpdate', name, Jacey, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+ * updateHandler('opUpdate', age, 2, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+ * updateHandler('opDelete', ssnum, null, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+ * </pre>
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function ObjectProxy(item:Object = null, uid:String = null,
+ proxyDepth:int = -1)
+ {
+ super();
+
+ if (!item)
+ item = {};
+ _item = item;
+
+ _proxyLevel = proxyDepth;
+
+ notifiers = {};
+
+ dispatcher = new EventDispatcher(this);
+
+ // If we got an id, use it. Otherwise the UID is lazily
+ // created in the getter for UID.
+ if (uid)
+ _id = uid;
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Variables
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * A reference to the EventDispatcher for this proxy.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ protected var dispatcher:EventDispatcher;
+
+ /**
+ * A hashmap of property change notifiers that this proxy is
+ * listening for changes from; the key of the map is the property name.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ protected var notifiers:Object;
+
+ /**
+ * Indicates what kind of proxy to create
+ * when proxying complex properties.
+ * Subclasses should assign this value appropriately.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ protected var proxyClass:Class = ObjectProxy;
+
+ /**
+ * Contains a list of all of the property names for the proxied object.
+ * Descendants need to fill this list by overriding the
+ * <code>setupPropertyList()</code> method.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ protected var propertyList:Array;
+
+ /**
+ * Indicates how deep proxying should be performed.
+ * If -1 (default), always proxy;
+ * if this value is zero, no proxying will be performed.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ private var _proxyLevel:int;
+
+ //--------------------------------------------------------------------------
+ //
+ // Properties
+ //
+ //--------------------------------------------------------------------------
+
+ //----------------------------------
+ // object
+ //----------------------------------
+
+ /**
+ * Storage for the object property.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ private var _item:Object;
+
+ /**
+ * The object being proxied.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ object_proxy function get object():Object
+ {
+ return _item;
+ }
+
+ //----------------------------------
+ // type
+ //----------------------------------
+
+ /**
+ * @private
+ * Storage for the qualified type name.
+ */
+ private var _type:QName;
+
+ /**
+ * The qualified type name associated with this object.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ object_proxy function get type():QName
+ {
+ return _type;
+ }
+
+ /**
+ * @private
+ */
+ object_proxy function set type(value:QName):void
+ {
+ _type = value;
+ }
+
+ //----------------------------------
+ // uid
+ //----------------------------------
+
+ /**
+ * @private
+ * Storage for the uid property.
+ */
+ private var _id:String;
+
+ /**
+ * The unique identifier for this object.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function get uid():String
+ {
+ if (_id === null)
+ _id = UIDUtil.createUID();
+
+ return _id;
+ }
+
+ /**
+ * @private
+ */
+ public function set uid(value:String):void
+ {
+ _id = value;
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Overridden methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Returns the specified property value of the proxied object.
+ *
+ * @param name Typically a string containing the name of the property,
+ * or possibly a QName where the property name is found by
+ * inspecting the <code>localName</code> property.
+ *
+ * @return The value of the property.
+ * In some instances this value may be an instance of
+ * <code>ObjectProxy</code>.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ override flash_proxy function getProperty(name:*):*
+ {
+ // if we have a data proxy for this then
+ var result:*;
+
+ if (notifiers[name.toString()])
+ return notifiers[name];
+
+ result = _item[name];
+
+ if (result)
+ {
+ if (_proxyLevel == 0 || ObjectUtil.isSimple(result))
+ {
+ return result;
+ }
+ else
+ {
+ result = object_proxy::getComplexProperty(name, result);
+ } // if we are proxying
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns the value of the proxied object's method with the specified name.
+ *
+ * @param name The name of the method being invoked.
+ *
+ * @param rest An array specifying the arguments to the
+ * called method.
+ *
+ * @return The return value of the called method.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ override flash_proxy function callProperty(name:*, ... rest):*
+ {
+ return _item[name].apply(_item, rest)
+ }
+
+ /**
+ * Deletes the specified property on the proxied object and
+ * sends notification of the delete to the handler.
+ *
+ * @param name Typically a string containing the name of the property,
+ * or possibly a QName where the property name is found by
+ * inspecting the <code>localName</code> property.
+ *
+ * @return A Boolean indicating if the property was deleted.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ override flash_proxy function deleteProperty(name:*):Boolean
+ {
+ var notifier:IPropertyChangeNotifier = IPropertyChangeNotifier(notifiers[name]);
+ if (notifier)
+ {
+ notifier.removeEventListener(PropertyChangeEvent.PROPERTY_CHANGE,
+ propertyChangeHandler);
+ delete notifiers[name];
+ }
+
+ var oldVal:* = _item[name];
+ var deleted:Boolean = delete _item[name];
+
+ if (dispatcher.hasEventListener(PropertyChangeEvent.PROPERTY_CHANGE))
+ {
+ var event:PropertyChangeEvent = new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE);
+ event.kind = PropertyChangeEventKind.DELETE;
+ event.property = name;
+ event.oldValue = oldVal;
+ event.source = this;
+ dispatcher.dispatchEvent(event);
+ }
+
+ return deleted;
+ }
+
+ /**
+ * @private
+ */
+ override flash_proxy function hasProperty(name:*):Boolean
+ {
+ return(name in _item);
+ }
+
+ /**
+ * @private
+ */
+ override flash_proxy function nextName(index:int):String
+ {
+ return propertyList[index -1];
+ }
+
+ /**
+ * @private
+ */
+ override flash_proxy function nextNameIndex(index:int):int
+ {
+ if (index == 0)
+ {
+ setupPropertyList();
+ }
+
+ if (index < propertyList.length)
+ {
+ return index + 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ /**
+ * @private
+ */
+ override flash_proxy function nextValue(index:int):*
+ {
+ return _item[propertyList[index -1]];
+ }
+
+ /**
+ * Updates the specified property on the proxied object
+ * and sends notification of the update to the handler.
+ *
+ * @param name Object containing the name of the property that
+ * should be updated on the proxied object.
+ *
+ * @param value Value that should be set on the proxied object.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ override flash_proxy function setProperty(name:*, value:*):void
+ {
+ var oldVal:* = _item[name];
+ if (oldVal !== value)
+ {
+ // Update item.
+ _item[name] = value;
+
+ // Stop listening for events on old item if we currently are.
+ var notifier:IPropertyChangeNotifier =
+ IPropertyChangeNotifier(notifiers[name]);
+ if (notifier)
+ {
+ notifier.removeEventListener(
+ PropertyChangeEvent.PROPERTY_CHANGE,
+ propertyChangeHandler);
+ delete notifiers[name];
+ }
+
+ // Notify anyone interested.
+ if (dispatcher.hasEventListener(PropertyChangeEvent.PROPERTY_CHANGE))
+ {
+ if (name is QName)
+ name = QName(name).localName;
+ var event:PropertyChangeEvent =
+ PropertyChangeEvent.createUpdateEvent(
+ this, name.toString(), oldVal, value);
+ dispatcher.dispatchEvent(event);
+ }
+ }
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // object_proxy methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Provides a place for subclasses to override how a complex property that
+ * needs to be either proxied or daisy chained for event bubbling is managed.
+ *
+ * @param name Typically a string containing the name of the property,
+ * or possibly a QName where the property name is found by
+ * inspecting the <code>localName</code> property.
+ *
+ * @param value The property value.
+ *
+ * @return The property value or an instance of <code>ObjectProxy</code>.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ object_proxy function getComplexProperty(name:*, value:*):*
+ {
+ if (value is IPropertyChangeNotifier)
+ {
+ value.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE,
+ propertyChangeHandler);
+ notifiers[name] = value;
+ return value;
+ }
+
+ if (getQualifiedClassName(value) == "Object")
+ {
+ value = new proxyClass(_item[name], null,
+ _proxyLevel > 0 ? _proxyLevel - 1 : _proxyLevel);
+ value.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE,
+ propertyChangeHandler);
+ notifiers[name] = value;
+ return value;
+ }
+
+ return value;
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // IExternalizable Methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Since Flex only uses ObjectProxy to wrap anonymous objects,
+ * the server flex.messaging.io.ObjectProxy instance serializes itself
+ * as a Map that will be returned as a plain ActionScript object.
+ * You can then set the object_proxy object property to this value.
+ *
+ * @param input The source object from which the ObjectProxy is
+ * deserialized.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function readExternal(input:IDataInput):void
+ {
+ var value:Object = input.readObject();
+ _item = value;
+ }
+
+ /**
+ * Since Flex only serializes the inner ActionScript object that it wraps,
+ * the server flex.messaging.io.ObjectProxy populates itself
+ * with this anonymous object's contents and appears to the user
+ * as a Map.
+ *
+ * @param output The source object from which the ObjectProxy is
+ * deserialized.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function writeExternal(output:IDataOutput):void
+ {
+ output.writeObject(_item);
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Registers an event listener object
+ * so that the listener receives notification of an event.
+ * For more information, including descriptions of the parameters see
+ * <code>addEventListener()</code> in the
+ * flash.events.EventDispatcher class.
+ *
+ * @param type The type of event.
+ *
+ * @param listener The listener function that processes the event. This function must accept
+ * an Event object as its only parameter and must return nothing.
+ *
+ * @param useCapture Determines whether the listener works in the capture phase or the
+ * target and bubbling phases. If <code>useCapture</code> is set to <code>true</code>,
+ * the listener processes the event only during the capture phase and not in the
+ * target or bubbling phase. If <code>useCapture</code> is <code>false</code>, the
+ * listener processes the event only during the target or bubbling phase. To listen for
+ * the event in all three phases, call <code>addEventListener</code> twice, once with
+ * <code>useCapture</code> set to <code>true</code>, then again with
+ * <code>useCapture</code> set to <code>false</code>.
+ *
+ * @param priority The priority level of the event listener.
+ *
+ * @param useWeakReference Determines whether the reference to the listener is strong or
+ * weak. A strong reference (the default) prevents your listener from being garbage-collected.
+ * A weak reference does not.
+ *
+ * @see flash.events.EventDispatcher#addEventListener()
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function addEventListener(type:String, listener:Function,
+ useCapture:Boolean = false,
+ priority:int = 0,
+ useWeakReference:Boolean = false):void
+ {
+ dispatcher.addEventListener(type, listener, useCapture,
+ priority, useWeakReference);
+ }
+
+ /**
+ * Removes an event listener.
+ * If there is no matching listener registered with the EventDispatcher object,
+ * a call to this method has no effect.
+ * For more information, see
+ * the flash.events.EventDispatcher class.
+ *
+ * @param type The type of event.
+ *
+ * @param listener The listener object to remove.
+ *
+ * @param useCapture Specifies whether the listener was registered for the capture
+ * phase or the target and bubbling phases. If the listener was registered for both
+ * the capture phase and the target and bubbling phases, two calls to
+ * <code>removeEventListener()</code> are required to remove both, one call with
+ * <code>useCapture</code>
+ * set to <code>true</code>, and another call with <code>useCapture</code>
+ * set to <code>false</code>.
+ *
+ * @see flash.events.EventDispatcher#removeEventListener()
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function removeEventListener(type:String, listener:Function,
+ useCapture:Boolean = false):void
+ {
+ dispatcher.removeEventListener(type, listener, useCapture);
+ }
+
+ /**
+ * Dispatches an event into the event flow.
+ * For more information, see
+ * the flash.events.EventDispatcher class.
+ *
+ * @param event The Event object that is dispatched into the event flow. If the
+ * event is being redispatched, a clone of the event is created automatically.
+ * After an event is dispatched, its target property cannot be changed, so you
+ * must create a new copy of the event for redispatching to work.
+ *
+ * @return Returns <code>true</code> if the event was successfully dispatched.
+ * A value
+ * of <code>false</code> indicates failure or that <code>preventDefault()</code>
+ * was called on the event.
+ *
+ * @see flash.events.EventDispatcher#dispatchEvent()
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function dispatchEvent(event:Event):Boolean
+ {
+ return dispatcher.dispatchEvent(event);
+ }
+
+ /**
+ * Checks whether there are any event listeners registered
+ * for a specific type of event.
+ * This allows you to determine where an object has altered handling
+ * of an event type in the event flow hierarchy.
+ * For more information, see
+ * the flash.events.EventDispatcher class.
+ *
+ * @param type The type of event
+ *
+ * @return Returns <code>true</code> if a listener of the specified type is
+ * registered; <code>false</code> otherwise.
+ *
+ * @see flash.events.EventDispatcher#hasEventListener()
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function hasEventListener(type:String):Boolean
+ {
+ return dispatcher.hasEventListener(type);
+ }
+
+ /**
+ * Checks whether an event listener is registered with this object
+ * or any of its ancestors for the specified event type.
+ * This method returns <code>true</code> if an event listener is triggered
+ * during any phase of the event flow when an event of the specified
+ * type is dispatched to this object or any of its descendants.
+ * For more information, see the flash.events.EventDispatcher class.
+ *
+ * @param type The type of event.
+ *
+ * @return Returns <code>true</code> if a listener of the specified type will
+ * be triggered; <code>false</code> otherwise.
+ *
+ * @see flash.events.EventDispatcher#willTrigger()
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function willTrigger(type:String):Boolean
+ {
+ return dispatcher.willTrigger(type);
+ }
+
+ /**
+ * Called when a complex property is updated.
+ *
+ * @param event An event object that has changed.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function propertyChangeHandler(event:PropertyChangeEvent):void
+ {
+ dispatcher.dispatchEvent(event);
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Protected Methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * This method creates an array of all of the property names for the
+ * proxied object.
+ * Descendants must override this method if they wish to add more
+ * properties to this list.
+ * Be sure to call <code>super.setupPropertyList</code> before making any
+ * changes to the <code>propertyList</code> property.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ protected function setupPropertyList():void
+ {
+ if (getQualifiedClassName(_item) == "Object")
+ {
+ propertyList = [];
+ for (var prop:String in _item)
+ propertyList.push(prop);
+ }
+ else
+ {
+ propertyList = ObjectUtil.getClassInfo(_item, null, {includeReadOnly:true, uris:["*"]}).properties;
+ }
+ }
+}
+
+}
[6/7] git commit: [flex-asjs] [refs/heads/develop] - clean todolist
example before building release kits
Posted by ah...@apache.org.
clean todolist example before building release kits
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/686aa27b
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/686aa27b
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/686aa27b
Branch: refs/heads/develop
Commit: 686aa27b6e410707dec09c47e7c88dfbf1555a36
Parents: abbfdf9
Author: Alex Harui <ah...@apache.org>
Authored: Tue Mar 11 21:34:35 2014 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:36:07 2014 -0700
----------------------------------------------------------------------
examples/build.xml | 2 ++
1 file changed, 2 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/686aa27b/examples/build.xml
----------------------------------------------------------------------
diff --git a/examples/build.xml b/examples/build.xml
index 081ee30..9aa255c 100644
--- a/examples/build.xml
+++ b/examples/build.xml
@@ -88,6 +88,7 @@
<ant dir="${basedir}/StatesTest"/>
<ant dir="${basedir}/StockQuote"/>
<ant dir="${basedir}/BarChartExample"/>
+ <ant dir="${basedir}/TodoListSampleApp"/>
</target>
<!--
@@ -115,6 +116,7 @@
<ant dir="${basedir}/StatesTest" target="clean"/>
<ant dir="${basedir}/StockQuote" target="clean"/>
<ant dir="${basedir}/BarChartExample" target="clean"/>
+ <ant dir="${basedir}/TodoListSampleApp" target="clean"/>
</target>
</project>
[7/7] git commit: [flex-asjs] [refs/heads/develop] - don't cache
nightly falcon build
Posted by ah...@apache.org.
don't cache nightly falcon build
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/e0597f0a
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/e0597f0a
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/e0597f0a
Branch: refs/heads/develop
Commit: e0597f0a9a578d82a941f46dba8c34f990216cc8
Parents: 686aa27
Author: Alex Harui <ah...@apache.org>
Authored: Tue Mar 11 21:34:54 2014 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:36:07 2014 -0700
----------------------------------------------------------------------
installer.xml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/e0597f0a/installer.xml
----------------------------------------------------------------------
diff --git a/installer.xml b/installer.xml
index e5943a2..9b4233a 100644
--- a/installer.xml
+++ b/installer.xml
@@ -27,7 +27,7 @@
<!-- local.d32 is set/used in build.properties so this needs to be done first. -->
<condition property="local.d32" value="-d32">
<and>
- <os family="windows"/>
+ <os family="windows"/>
<equals arg1="${sun.arch.data.model}" arg2="64"/>
<equals arg1="${os.arch}" arg2="x86_64"/>
<equals arg1="${ant.java.version}" arg2="1.6"/>
@@ -51,6 +51,7 @@
<property name="flex.url.path" value="http://archive.apache.org/dist/flex/${flex.sdk.version}/binaries" />
<property name="flex.url.file" value="apache-flex-sdk-${flex.sdk.version}-bin.zip" />
+ <!-- don't forget to re-enable caching in the falcon-get task -->
<property name="falcon.url.path" value="https://builds.apache.org/job/flex-falcon/lastSuccessfulBuild/artifact/out/" />
<!--<property name="falcon.url.path" value="http://archive.apache.org/dist/flex/falcon/${falcon.version}/binaries" />-->
<property name="falcon.url.file" value="apache-flex-falconjx-${falcon.version}-bin.zip" />
@@ -269,6 +270,7 @@
<target name="falcon-get" depends="falcon-get-check" unless="falcon.downloaded" >
<mkdir dir="${download.dir}"/>
<echo>${INFO_INSTALLING_FALCON} ${falcon.url.path}/${falcon.url.file}</echo>
+ <property name="do-not-cache-next-get" value="true" />
<get src="${falcon.url.path}/${falcon.url.file}"
dest="${download.dir}/${falcon.url.file}"
verbose="false"/>
[2/7] more legacy classes need to make mustella happy. Some are
stripped down to eliminate undesirable dependencies
Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectUtil.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectUtil.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectUtil.as
new file mode 100644
index 0000000..bdf69ab
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectUtil.as
@@ -0,0 +1,1424 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.utils
+{
+
+import flash.utils.ByteArray;
+import flash.utils.Dictionary;
+import flash.utils.getQualifiedClassName;
+import flash.xml.XMLNode;
+
+/**
+ * The ObjectUtil class is an all-static class with methods for
+ * working with Objects within Flex.
+ * You do not create instances of ObjectUtil;
+ * instead you simply call static methods such as the
+ * <code>ObjectUtil.isSimple()</code> method.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+public class ObjectUtil
+{
+
+ /**
+ * Array of properties to exclude from debugging output.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ private static var defaultToStringExcludes:Array = ["password", "credentials"];
+
+ //--------------------------------------------------------------------------
+ //
+ // Class methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Compares the Objects and returns an integer value
+ * indicating if the first item is less than greater than or equal to
+ * the second item.
+ * This method will recursively compare properties on nested objects and
+ * will return as soon as a non-zero result is found.
+ * By default this method will recurse to the deepest level of any property.
+ * To change the depth for comparison specify a non-negative value for
+ * the <code>depth</code> parameter.
+ *
+ * @param a Object.
+ *
+ * @param b Object.
+ *
+ * @param depth Indicates how many levels should be
+ * recursed when performing the comparison.
+ * Set this value to 0 for a shallow comparison of only the primitive
+ * representation of each property.
+ * For example:<pre>
+ * var a:Object = {name:"Bob", info:[1,2,3]};
+ * var b:Object = {name:"Alice", info:[5,6,7]};
+ * var c:int = ObjectUtil.compare(a, b, 0);</pre>
+ *
+ * <p>In the above example the complex properties of <code>a</code> and
+ * <code>b</code> will be flattened by a call to <code>toString()</code>
+ * when doing the comparison.
+ * In this case the <code>info</code> property will be turned into a string
+ * when performing the comparison.</p>
+ *
+ * @return Return 0 if a and b are null, NaN, or equal.
+ * Return 1 if a is null or greater than b.
+ * Return -1 if b is null or greater than a.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function compare(a:Object, b:Object, depth:int = -1):int
+ {
+ return internalCompare(a, b, 0, depth, new Dictionary(true));
+ }
+
+ /**
+ * Copies the specified Object and returns a reference to the copy.
+ * The copy is made using a native serialization technique.
+ * This means that custom serialization will be respected during the copy.
+ *
+ * <p>This method is designed for copying data objects,
+ * such as elements of a collection. It is not intended for copying
+ * a UIComponent object, such as a TextInput control. If you want to create copies
+ * of specific UIComponent objects, you can create a subclass of the component and implement
+ * a <code>clone()</code> method, or other method to perform the copy.</p>
+ *
+ * @param value Object that should be copied.
+ *
+ * @return Copy of the specified Object.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function copy(value:Object):Object
+ {
+ var buffer:ByteArray = new ByteArray();
+ buffer.writeObject(value);
+ buffer.position = 0;
+ var result:Object = buffer.readObject();
+ return result;
+ }
+
+ /**
+ * Clones the specified Object and returns a reference to the clone.
+ * The clone is made using a native serialization technique.
+ * This means that custom serialization will be respected during the
+ * cloning. clone() differs from copy() in that the uid property of
+ * each object instance is retained.
+ *
+ * <p>This method is designed for cloning data objects,
+ * such as elements of a collection. It is not intended for cloning
+ * a UIComponent object, such as a TextInput control. If you want to clone
+ * specific UIComponent objects, you can create a subclass of the component
+ * and implement a <code>clone()</code> method.</p>
+ *
+ * @param value Object that should be cloned.
+ *
+ * @return Clone of the specified Object.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 4
+ */
+ public static function clone(value:Object):Object
+ {
+ var result:Object = copy(value);
+ cloneInternal(result, value);
+ return result;
+ }
+
+ /**
+ * Recursive helper used by the public clone method.
+ * @private
+ */
+ private static function cloneInternal(result:Object, value:Object):void
+ {
+ if (value && value.hasOwnProperty("uid"))
+ result.uid = value.uid;
+
+ var classInfo:Object = getClassInfo(value);
+ var v:Object;
+ for each (var p:* in classInfo.properties)
+ {
+ v = value[p];
+ if (v && v.hasOwnProperty("uid"))
+ cloneInternal(result[p], v);
+ }
+ }
+
+ /**
+ * Returns <code>true</code> if the object reference specified
+ * is a simple data type. The simple data types include the following:
+ * <ul>
+ * <li><code>String</code></li>
+ * <li><code>Number</code></li>
+ * <li><code>uint</code></li>
+ * <li><code>int</code></li>
+ * <li><code>Boolean</code></li>
+ * <li><code>Date</code></li>
+ * <li><code>Array</code></li>
+ * </ul>
+ *
+ * @param value Object inspected.
+ *
+ * @return <code>true</code> if the object specified
+ * is one of the types above; <code>false</code> otherwise.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function isSimple(value:Object):Boolean
+ {
+ var type:String = typeof(value);
+ switch (type)
+ {
+ case "number":
+ case "string":
+ case "boolean":
+ {
+ return true;
+ }
+
+ case "object":
+ {
+ return (value is Date) || (value is Array);
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Compares two numeric values.
+ *
+ * @param a First number.
+ *
+ * @param b Second number.
+ *
+ * @return 0 is both numbers are NaN.
+ * 1 if only <code>a</code> is a NaN.
+ * -1 if only <code>b</code> is a NaN.
+ * -1 if <code>a</code> is less than <code>b</code>.
+ * 1 if <code>a</code> is greater than <code>b</code>.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function numericCompare(a:Number, b:Number):int
+ {
+ if (isNaN(a) && isNaN(b))
+ return 0;
+
+ if (isNaN(a))
+ return 1;
+
+ if (isNaN(b))
+ return -1;
+
+ if (a < b)
+ return -1;
+
+ if (a > b)
+ return 1;
+
+ return 0;
+ }
+
+ /**
+ * Compares two String values.
+ *
+ * @param a First String value.
+ *
+ * @param b Second String value.
+ *
+ * @param caseInsensitive Specifies to perform a case insensitive compare,
+ * <code>true</code>, or not, <code>false</code>.
+ *
+ * @return 0 is both Strings are null.
+ * 1 if only <code>a</code> is null.
+ * -1 if only <code>b</code> is null.
+ * -1 if <code>a</code> precedes <code>b</code>.
+ * 1 if <code>b</code> precedes <code>a</code>.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function stringCompare(a:String, b:String,
+ caseInsensitive:Boolean = false):int
+ {
+ if (a == null && b == null)
+ return 0;
+
+ if (a == null)
+ return 1;
+
+ if (b == null)
+ return -1;
+
+ // Convert to lowercase if we are case insensitive.
+ if (caseInsensitive)
+ {
+ a = a.toLocaleLowerCase();
+ b = b.toLocaleLowerCase();
+ }
+
+ var result:int = a.localeCompare(b);
+
+ if (result < -1)
+ result = -1;
+ else if (result > 1)
+ result = 1;
+
+ return result;
+ }
+
+ /**
+ * Compares the two Date objects and returns an integer value
+ * indicating if the first Date object is before, equal to,
+ * or after the second item.
+ *
+ * @param a Date object.
+ *
+ * @param b Date object.
+ *
+ * @return 0 if <code>a</code> and <code>b</code> are equal
+ * (or both are <code>null</code>);
+ * -1 if <code>a</code> is before <code>b</code>
+ * (or <code>b</code> is <code>null</code>);
+ * 1 if <code>a</code> is after <code>b</code>
+ * (or <code>a</code> is <code>null</code>);
+ * 0 is both dates getTime's are NaN;
+ * 1 if only <code>a</code> getTime is a NaN;
+ * -1 if only <code>b</code> getTime is a NaN.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function dateCompare(a:Date, b:Date):int
+ {
+ if (a == null && b == null)
+ return 0;
+
+ if (a == null)
+ return 1;
+
+ if (b == null)
+ return -1;
+
+ var na:Number = a.getTime();
+ var nb:Number = b.getTime();
+
+ if (na < nb)
+ return -1;
+
+ if (na > nb)
+ return 1;
+
+ if (isNaN(na) && isNaN(nb))
+ return 0;
+
+ if (isNaN(na))
+ return 1;
+
+ if (isNaN(nb))
+ return -1;
+
+ return 0;
+ }
+
+ /**
+ * Pretty-prints the specified Object into a String.
+ * All properties will be in alpha ordering.
+ * Each object will be assigned an id during printing;
+ * this value will be displayed next to the object type token
+ * preceded by a '#', for example:
+ *
+ * <pre>
+ * (mx.messaging.messages::AsyncMessage)#2.</pre>
+ *
+ * <p>This id is used to indicate when a circular reference occurs.
+ * Properties of an object that are of the <code>Class</code> type will
+ * appear only as the assigned type.
+ * For example a custom definition like the following:</p>
+ *
+ * <pre>
+ * public class MyCustomClass {
+ * public var clazz:Class;
+ * }</pre>
+ *
+ * <p>With the <code>clazz</code> property assigned to <code>Date</code>
+ * will display as shown below:</p>
+ *
+ * <pre>
+ * (somepackage::MyCustomClass)#0
+ * clazz = (Date)</pre>
+ *
+ * @param obj Object to be pretty printed.
+ *
+ * @param namespaceURIs Array of namespace URIs for properties
+ * that should be included in the output.
+ * By default only properties in the public namespace will be included in
+ * the output.
+ * To get all properties regardless of namespace pass an array with a
+ * single element of "*".
+ *
+ * @param exclude Array of the property names that should be
+ * excluded from the output.
+ * Use this to remove data from the formatted string.
+ *
+ * @return String containing the formatted version
+ * of the specified object.
+ *
+ * @example
+ * <pre>
+ * // example 1
+ * var obj:AsyncMessage = new AsyncMessage();
+ * obj.body = [];
+ * obj.body.push(new AsyncMessage());
+ * obj.headers["1"] = { name: "myName", num: 15.3};
+ * obj.headers["2"] = { name: "myName", num: 15.3};
+ * obj.headers["10"] = { name: "myName", num: 15.3};
+ * obj.headers["11"] = { name: "myName", num: 15.3};
+ * trace(ObjectUtil.toString(obj));
+ *
+ * // will output to flashlog.txt
+ * (mx.messaging.messages::AsyncMessage)#0
+ * body = (Array)#1
+ * [0] (mx.messaging.messages::AsyncMessage)#2
+ * body = (Object)#3
+ * clientId = (Null)
+ * correlationId = ""
+ * destination = ""
+ * headers = (Object)#4
+ * messageId = "378CE96A-68DB-BC1B-BCF7FFFFFFFFB525"
+ * sequenceId = (Null)
+ * sequencePosition = 0
+ * sequenceSize = 0
+ * timeToLive = 0
+ * timestamp = 0
+ * clientId = (Null)
+ * correlationId = ""
+ * destination = ""
+ * headers = (Object)#5
+ * 1 = (Object)#6
+ * name = "myName"
+ * num = 15.3
+ * 10 = (Object)#7
+ * name = "myName"
+ * num = 15.3
+ * 11 = (Object)#8
+ * name = "myName"
+ * num = 15.3
+ * 2 = (Object)#9
+ * name = "myName"
+ * num = 15.3
+ * messageId = "1D3E6E96-AC2D-BD11-6A39FFFFFFFF517E"
+ * sequenceId = (Null)
+ * sequencePosition = 0
+ * sequenceSize = 0
+ * timeToLive = 0
+ * timestamp = 0
+ *
+ * // example 2 with circular references
+ * obj = {};
+ * obj.prop1 = new Date();
+ * obj.prop2 = [];
+ * obj.prop2.push(15.2);
+ * obj.prop2.push("testing");
+ * obj.prop2.push(true);
+ * obj.prop3 = {};
+ * obj.prop3.circular = obj;
+ * obj.prop3.deeper = new ErrorMessage();
+ * obj.prop3.deeper.rootCause = obj.prop3.deeper;
+ * obj.prop3.deeper2 = {};
+ * obj.prop3.deeper2.deeperStill = {};
+ * obj.prop3.deeper2.deeperStill.yetDeeper = obj;
+ * trace(ObjectUtil.toString(obj));
+ *
+ * // will output to flashlog.txt
+ * (Object)#0
+ * prop1 = Tue Apr 26 13:59:17 GMT-0700 2005
+ * prop2 = (Array)#1
+ * [0] 15.2
+ * [1] "testing"
+ * [2] true
+ * prop3 = (Object)#2
+ * circular = (Object)#0
+ * deeper = (mx.messaging.messages::ErrorMessage)#3
+ * body = (Object)#4
+ * clientId = (Null)
+ * code = (Null)
+ * correlationId = ""
+ * destination = ""
+ * details = (Null)
+ * headers = (Object)#5
+ * level = (Null)
+ * message = (Null)
+ * messageId = "14039376-2BBA-0D0E-22A3FFFFFFFF140A"
+ * rootCause = (mx.messaging.messages::ErrorMessage)#3
+ * sequenceId = (Null)
+ * sequencePosition = 0
+ * sequenceSize = 0
+ * timeToLive = 0
+ * timestamp = 0
+ * deeper2 = (Object)#6
+ * deeperStill = (Object)#7
+ * yetDeeper = (Object)#0
+ *
+ * // example 3 with Dictionary
+ * var point:Point = new Point(100, 100);
+ * var point2:Point = new Point(100, 100);
+ * var obj:Dictionary = new Dictionary();
+ * obj[point] = "point";
+ * obj[point2] = "point2";
+ * obj["1"] = { name: "one", num: 1};
+ * obj["two"] = { name: "2", num: 2};
+ * obj[3] = 3;
+ * trace(ObjectUtil.toString(obj));
+ *
+ * // will output to flashlog.txt
+ * (flash.utils::Dictionary)#0
+ * {(flash.geom::Point)#1
+ * length = 141.4213562373095
+ * x = 100
+ * y = 100} = "point2"
+ * {(flash.geom::Point)#2
+ * length = 141.4213562373095
+ * x = 100
+ * y = 100} = "point"
+ * {1} = (Object)#3
+ * name = "one"
+ * num = 1
+ * {3} = 3
+ * {"two"} = (Object)#4
+ * name = "2"
+ * num = 2
+ *
+ * </pre>
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function toString(value:Object,
+ namespaceURIs:Array = null,
+ exclude:Array = null):String
+ {
+ if (exclude == null)
+ {
+ exclude = defaultToStringExcludes;
+ }
+
+ refCount = 0;
+ return internalToString(value, 0, null, namespaceURIs, exclude);
+ }
+
+ /**
+ * This method cleans up all of the additional parameters that show up in AsDoc
+ * code hinting tools that developers shouldn't ever see.
+ * @private
+ */
+ private static function internalToString(value:Object,
+ indent:int = 0,
+ refs:Dictionary= null,
+ namespaceURIs:Array = null,
+ exclude:Array = null):String
+ {
+ var str:String;
+ var type:String = value == null ? "null" : typeof(value);
+ switch (type)
+ {
+ case "boolean":
+ case "number":
+ {
+ return value.toString();
+ }
+
+ case "string":
+ {
+ return "\"" + value.toString() + "\"";
+ }
+
+ case "object":
+ {
+ if (value is Date)
+ {
+ return value.toString();
+ }
+ else if (value is XMLNode)
+ {
+ return value.toString();
+ }
+ else if (value is Class)
+ {
+ return "(" + getQualifiedClassName(value) + ")";
+ }
+ else
+ {
+ var classInfo:Object = getClassInfo(value, exclude,
+ { includeReadOnly: true, uris: namespaceURIs });
+
+ var properties:Array = classInfo.properties;
+
+ str = "(" + classInfo.name + ")";
+
+ // refs help us avoid circular reference infinite recursion.
+ // Each time an object is encoumtered it is pushed onto the
+ // refs stack so that we can determine if we have visited
+ // this object already.
+ if (refs == null)
+ refs = new Dictionary(true);
+
+ // Check to be sure we haven't processed this object before
+ // Dictionary has some bugs, so we want to work around them as best we can
+ try
+ {
+ var id:Object = refs[value];
+ if (id != null)
+ {
+ str += "#" + int(id);
+ return str;
+ }
+ }
+ catch (e:Error)
+ {
+ //Since we can't test for infinite loop, we simply return toString.
+ return String(value);
+ }
+
+ if (value != null)
+ {
+ str += "#" + refCount.toString();
+ refs[value] = refCount;
+ refCount++;
+ }
+
+ var isArray:Boolean = value is Array;
+ var isDict:Boolean = value is Dictionary;
+ var prop:*;
+ indent += 2;
+
+ // Print all of the variable values.
+ for (var j:int = 0; j < properties.length; j++)
+ {
+ str = newline(str, indent);
+ prop = properties[j];
+
+ if (isArray)
+ str += "[";
+ else if (isDict)
+ str += "{";
+
+
+ if (isDict)
+ {
+ // in dictionaries, recurse on the key, because it can be a complex object
+ str += internalToString(prop, indent, refs,
+ namespaceURIs, exclude);
+ }
+ else
+ {
+ str += prop.toString();
+ }
+
+ if (isArray)
+ str += "] ";
+ else if (isDict)
+ str += "} = ";
+ else
+ str += " = ";
+
+ try
+ {
+ // print the value
+ str += internalToString(value[prop], indent, refs,
+ namespaceURIs, exclude);
+ }
+ catch(e:Error)
+ {
+ // value[prop] can cause an RTE
+ // for certain properties of certain objects.
+ // For example, accessing the properties
+ // actionScriptVersion
+ // childAllowsParent
+ // frameRate
+ // height
+ // loader
+ // parentAllowsChild
+ // sameDomain
+ // swfVersion
+ // width
+ // of a Stage's loaderInfo causes
+ // Error #2099: The loading object is not
+ // sufficiently loaded to provide this information
+ // In this case, we simply output ? for the value.
+ str += "?";
+ }
+ }
+ indent -= 2;
+ return str;
+ }
+ break;
+ }
+
+ case "xml":
+ {
+ return value.toXMLString();
+ }
+
+ default:
+ {
+ return "(" + type + ")";
+ }
+ }
+
+ return "(unknown)";
+ }
+
+ /**
+ * @private
+ * This method will append a newline and the specified number of spaces
+ * to the given string.
+ */
+ private static function newline(str:String, n:int = 0):String
+ {
+ var result:String = str;
+ result += "\n";
+
+ for (var i:int = 0; i < n; i++)
+ {
+ result += " ";
+ }
+ return result;
+ }
+
+ private static function internalCompare(a:Object, b:Object,
+ currentDepth:int, desiredDepth:int,
+ refs:Dictionary):int
+ {
+ if (a == null && b == null)
+ return 0;
+
+ if (a == null)
+ return 1;
+
+ if (b == null)
+ return -1;
+
+ if (a is ObjectProxy)
+ a = ObjectProxy(a).object_proxy::object;
+
+ if (b is ObjectProxy)
+ b = ObjectProxy(b).object_proxy::object;
+
+ var typeOfA:String = typeof(a);
+ var typeOfB:String = typeof(b);
+
+ var result:int = 0;
+
+ if (typeOfA == typeOfB)
+ {
+ switch(typeOfA)
+ {
+ case "boolean":
+ {
+ result = numericCompare(Number(a), Number(b));
+ break;
+ }
+
+ case "number":
+ {
+ result = numericCompare(a as Number, b as Number);
+ break;
+ }
+
+ case "string":
+ {
+ result = stringCompare(a as String, b as String);
+ break;
+ }
+
+ case "object":
+ {
+ var newDepth:int = desiredDepth > 0 ? desiredDepth -1 : desiredDepth;
+
+ // refs help us avoid circular reference infinite recursion.
+ var aRef:Object = getRef(a,refs);
+ var bRef:Object = getRef(b,refs);
+
+ if (aRef == bRef)
+ return 0;
+ // the cool thing about our dictionary is that if
+ // we've seen objects and determined that they are inequal, then
+ // we would've already exited out of this compare() call. So the
+ // only info in the dictionary are sets of equal items
+
+ // let's first define them as equal
+ // this stops an "infinite loop" problem where A.i = B and B.i = A
+ // if we later find that an object (one of the subobjects) is in fact unequal,
+ // then we will return false and quit out of everything. These refs are thrown away
+ // so it doesn't matter if it's correct.
+ refs[bRef] = aRef;
+
+ if (desiredDepth != -1 && (currentDepth > desiredDepth))
+ {
+ // once we try to go beyond the desired depth we should
+ // toString() our way out
+ result = stringCompare(a.toString(), b.toString());
+ }
+ else if ((a is Array) && (b is Array))
+ {
+ result = arrayCompare(a as Array, b as Array, currentDepth, desiredDepth, refs);
+ }
+ else if ((a is Date) && (b is Date))
+ {
+ result = dateCompare(a as Date, b as Date);
+ }
+ else if ((a is ByteArray) && (b is ByteArray))
+ {
+ result = byteArrayCompare(a as ByteArray, b as ByteArray);
+ }
+ else if (getQualifiedClassName(a) == getQualifiedClassName(b))
+ {
+ var aProps:Array = getClassInfo(a).properties;
+ var bProps:Array;
+
+ // if the objects are dynamic they could have different
+ // # of properties and should be treated on that basis first
+ var isDynamicObject:Boolean = isDynamicObject(a);
+
+ // if it's dynamic, check to see that they have all the same properties
+ if (isDynamicObject)
+ {
+ bProps = getClassInfo(b).properties;
+ result = arrayCompare(aProps, bProps, currentDepth, newDepth, refs);
+ if (result != 0)
+ return result;
+ }
+
+ // now that we know we have the same properties, let's compare the values
+ var propName:QName;
+ var aProp:Object;
+ var bProp:Object;
+ for (var i:int = 0; i < aProps.length; i++)
+ {
+ propName = aProps[i];
+ aProp = a[propName];
+ bProp = b[propName];
+ result = internalCompare(aProp, bProp, currentDepth+1, newDepth, refs);
+ if (result != 0)
+ {
+ return result;
+ }
+ }
+ }
+ else
+ {
+ // We must be inequal, so return 1
+ return 1;
+ }
+ break;
+ }
+ }
+ }
+ else // be consistent with the order we return here
+ {
+ return stringCompare(typeOfA, typeOfB);
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns information about the class, and properties of the class, for
+ * the specified Object.
+ *
+ * @param obj The Object to inspect.
+ *
+ * @param exclude Array of Strings specifying the property names that should be
+ * excluded from the returned result. For example, you could specify
+ * <code>["currentTarget", "target"]</code> for an Event object since these properties
+ * can cause the returned result to become large.
+ *
+ * @param options An Object containing one or more properties
+ * that control the information returned by this method.
+ * The properties include the following:
+ *
+ * <ul>
+ * <li><code>includeReadOnly</code>: If <code>false</code>,
+ * exclude Object properties that are read-only.
+ * The default value is <code>true</code>.</li>
+ * <li><code>includeTransient</code>: If <code>false</code>,
+ * exclude Object properties and variables that have <code>[Transient]</code> metadata.
+ * The default value is <code>true</code>.</li>
+ * <li><code>uris</code>: Array of Strings of all namespaces that should be included in the output.
+ * It does allow for a wildcard of "~~".
+ * By default, it is null, meaning no namespaces should be included.
+ * For example, you could specify <code>["mx_internal", "mx_object"]</code>
+ * or <code>["~~"]</code>.</li>
+ * </ul>
+ *
+ * @return An Object containing the following properties:
+ * <ul>
+ * <li><code>name</code>: String containing the name of the class.</li>
+ * <li><code>properties</code>: Sorted list of the property names of the specified object,
+ * or references to the original key if the specified object is a Dictionary. The individual
+ * array elements are QName instances, which contain both the local name of the property as well as the URI.</li>
+ * </ul>
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function getClassInfo(obj:Object,
+ excludes:Array = null,
+ options:Object = null):Object
+ {
+ var n:int;
+ var i:int;
+
+ if (obj is ObjectProxy)
+ obj = ObjectProxy(obj).object_proxy::object;
+
+ if (options == null)
+ options = { includeReadOnly: true, uris: null, includeTransient: true };
+
+ var result:Object;
+ var propertyNames:Array = [];
+ var cacheKey:String;
+
+ var className:String;
+ var classAlias:String;
+ var properties:XMLList;
+ var prop:XML;
+ var dynamic:Boolean = false;
+ var metadataInfo:Object;
+
+ if (typeof(obj) == "xml")
+ {
+ className = "XML";
+ properties = obj.text();
+ if (properties.length())
+ propertyNames.push("*");
+ properties = obj.attributes();
+ }
+ else
+ {
+ var classInfo:XML = DescribeTypeCache.describeType(obj).typeDescription;
+ className = classInfo.@name.toString();
+ classAlias = classInfo.@alias.toString();
+ dynamic = (classInfo.@isDynamic.toString() == "true");
+
+ if (options.includeReadOnly)
+ properties = classInfo..accessor.(@access != "writeonly") + classInfo..variable;
+ else
+ properties = classInfo..accessor.(@access == "readwrite") + classInfo..variable;
+
+ var numericIndex:Boolean = false;
+ }
+
+ // If type is not dynamic, check our cache for class info...
+ if (!dynamic)
+ {
+ cacheKey = getCacheKey(obj, excludes, options);
+ result = CLASS_INFO_CACHE[cacheKey];
+ if (result != null)
+ return result;
+ }
+
+ result = {};
+ result["name"] = className;
+ result["alias"] = classAlias;
+ result["properties"] = propertyNames;
+ result["dynamic"] = dynamic;
+ result["metadata"] = metadataInfo = recordMetadata(properties);
+
+ var excludeObject:Object = {};
+ if (excludes)
+ {
+ n = excludes.length;
+ for (i = 0; i < n; i++)
+ {
+ excludeObject[excludes[i]] = 1;
+ }
+ }
+
+ var isArray:Boolean = (obj is Array);
+ var isDict:Boolean = (obj is Dictionary);
+
+ if (isDict)
+ {
+ // dictionaries can have multiple keys of the same type,
+ // (they can index by reference rather than QName, String, or number),
+ // which cannot be looked up by QName, so use references to the actual key
+ for (var key:* in obj)
+ {
+ propertyNames.push(key);
+ }
+ }
+ else if (dynamic)
+ {
+ for (var p:String in obj)
+ {
+ if (excludeObject[p] != 1)
+ {
+ if (isArray)
+ {
+ var pi:Number = parseInt(p);
+ if (isNaN(pi))
+ propertyNames.push(new QName("", p));
+ else
+ propertyNames.push(pi);
+ }
+ else
+ {
+ propertyNames.push(new QName("", p));
+ }
+ }
+ }
+ numericIndex = isArray && !isNaN(Number(p));
+ }
+
+ if (isArray || isDict || className == "Object")
+ {
+ // Do nothing since we've already got the dynamic members
+ }
+ else if (className == "XML")
+ {
+ n = properties.length();
+ for (i = 0; i < n; i++)
+ {
+ p = properties[i].name();
+ if (excludeObject[p] != 1)
+ propertyNames.push(new QName("", "@" + p));
+ }
+ }
+ else
+ {
+ n = properties.length();
+ var uris:Array = options.uris;
+ var uri:String;
+ var qName:QName;
+ for (i = 0; i < n; i++)
+ {
+ prop = properties[i];
+ p = prop.@name.toString();
+ uri = prop.@uri.toString();
+
+ if (excludeObject[p] == 1)
+ continue;
+
+ if (!options.includeTransient && internalHasMetadata(metadataInfo, p, "Transient"))
+ continue;
+
+ if (uris != null)
+ {
+ if (uris.length == 1 && uris[0] == "*")
+ {
+ qName = new QName(uri, p);
+ try
+ {
+ obj[qName]; // access the property to ensure it is supported
+ propertyNames.push();
+ }
+ catch(e:Error)
+ {
+ // don't keep property name
+ }
+ }
+ else
+ {
+ for (var j:int = 0; j < uris.length; j++)
+ {
+ uri = uris[j];
+ if (prop.@uri.toString() == uri)
+ {
+ qName = new QName(uri, p);
+ try
+ {
+ obj[qName];
+ propertyNames.push(qName);
+ }
+ catch(e:Error)
+ {
+ // don't keep property name
+ }
+ }
+ }
+ }
+ }
+ else if (uri.length == 0)
+ {
+ qName = new QName(uri, p);
+ try
+ {
+ obj[qName];
+ propertyNames.push(qName);
+ }
+ catch(e:Error)
+ {
+ // don't keep property name
+ }
+ }
+ }
+ }
+
+ propertyNames.sort(Array.CASEINSENSITIVE |
+ (numericIndex ? Array.NUMERIC : 0));
+
+ // dictionary keys can be indexed by an object reference
+ // there's a possibility that two keys will have the same toString()
+ // so we don't want to remove dupes
+ if (!isDict)
+ {
+ // for Arrays, etc., on the other hand...
+ // remove any duplicates, i.e. any items that can't be distingushed by toString()
+ for (i = 0; i < propertyNames.length - 1; i++)
+ {
+ // the list is sorted so any duplicates should be adjacent
+ // two properties are only equal if both the uri and local name are identical
+ if (propertyNames[i].toString() == propertyNames[i + 1].toString())
+ {
+ propertyNames.splice(i, 1);
+ i--; // back up
+ }
+ }
+ }
+
+ // For normal, non-dynamic classes we cache the class info
+ // Don't cache XML as it can be dynamic
+ if (!dynamic && className != "XML")
+ {
+ cacheKey = getCacheKey(obj, excludes, options);
+ CLASS_INFO_CACHE[cacheKey] = result;
+ }
+
+ return result;
+ }
+
+ /**
+ * Uses <code>getClassInfo</code> and examines the metadata information to
+ * determine whether a property on a given object has the specified
+ * metadata.
+ *
+ * @param obj The object holding the property.
+ * @param propName The property to check for metadata.
+ * @param metadataName The name of the metadata to check on the property.
+ * @param excludes If any properties need to be excluded when generating class info. (Optional)
+ * @param options If any options flags need to changed when generating class info. (Optional)
+ * @return true if the property has the specified metadata.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function hasMetadata(obj:Object,
+ propName:String,
+ metadataName:String,
+ excludes:Array = null,
+ options:Object = null):Boolean
+ {
+ var classInfo:Object = getClassInfo(obj, excludes, options);
+ var metadataInfo:Object = classInfo["metadata"];
+ return internalHasMetadata(metadataInfo, propName, metadataName);
+ }
+
+ /**
+ * Returns <code>true</code> if the object is an instance of a dynamic class.
+ *
+ * @param obj The object.
+ *
+ * @return <code>true</code> if the object is an instance of a dynamic class.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function isDynamicObject(obj:Object):Boolean
+ {
+ try
+ {
+ // this test for checking whether an object is dynamic or not is
+ // pretty hacky, but it assumes that no-one actually has a
+ // property defined called "wootHackwoot"
+ obj["wootHackwoot"];
+ }
+ catch (e:Error)
+ {
+ // our object isn't from a dynamic class
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @private
+ */
+ private static function internalHasMetadata(metadataInfo:Object, propName:String, metadataName:String):Boolean
+ {
+ if (metadataInfo != null)
+ {
+ var metadata:Object = metadataInfo[propName];
+ if (metadata != null)
+ {
+ if (metadata[metadataName] != null)
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @private
+ */
+ private static function recordMetadata(properties:XMLList):Object
+ {
+ var result:Object = null;
+
+ try
+ {
+ for each (var prop:XML in properties)
+ {
+ var propName:String = prop.attribute("name").toString();
+ var metadataList:XMLList = prop.metadata;
+
+ if (metadataList.length() > 0)
+ {
+ if (result == null)
+ result = {};
+
+ var metadata:Object = {};
+ result[propName] = metadata;
+
+ for each (var md:XML in metadataList)
+ {
+ var mdName:String = md.attribute("name").toString();
+
+ var argsList:XMLList = md.arg;
+ var value:Object = {};
+
+ for each (var arg:XML in argsList)
+ {
+ var argKey:String = arg.attribute("key").toString();
+ if (argKey != null)
+ {
+ var argValue:String = arg.attribute("value").toString();
+ value[argKey] = argValue;
+ }
+ }
+
+ var existing:Object = metadata[mdName];
+ if (existing != null)
+ {
+ var existingArray:Array;
+ if (existing is Array)
+ existingArray = existing as Array;
+ else
+ {
+ existingArray = [existing];
+ delete metadata[mdName];
+ }
+ existingArray.push(value);
+ existing = existingArray;
+ }
+ else
+ {
+ existing = value;
+ }
+ metadata[mdName] = existing;
+ }
+ }
+ }
+ }
+ catch(e:Error)
+ {
+ }
+
+ return result;
+ }
+
+
+ /**
+ * @private
+ */
+ private static function getCacheKey(o:Object, excludes:Array = null, options:Object = null):String
+ {
+ var key:String = getQualifiedClassName(o);
+
+ if (excludes != null)
+ {
+ var length:int = excludes.length;
+ for (var i:uint = 0; i < length; i++)
+ {
+ var excl:String = excludes[i] as String;
+ if (excl != null)
+ key += excl;
+ }
+ }
+
+ if (options != null)
+ {
+ for (var flag:String in options)
+ {
+ key += flag;
+ var value:String = options[flag];
+ if (value != null)
+ key += value.toString();
+ }
+ }
+ return key;
+ }
+
+ /**
+ * @private
+ */
+ private static function arrayCompare(a:Array, b:Array,
+ currentDepth:int, desiredDepth:int,
+ refs:Dictionary):int
+ {
+ var result:int = 0;
+
+ if (a.length != b.length)
+ {
+ if (a.length < b.length)
+ result = -1;
+ else
+ result = 1;
+ }
+ else
+ {
+ var key:Object;
+ for (key in a)
+ {
+ if (b.hasOwnProperty(key))
+ {
+ result = internalCompare(a[key], b[key], currentDepth,
+ desiredDepth, refs);
+
+ if (result != 0)
+ return result;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+
+ for (key in b)
+ {
+ if (!a.hasOwnProperty(key))
+ {
+ return 1;
+ }
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * @private
+ */
+ private static function byteArrayCompare(a:ByteArray, b:ByteArray):int
+ {
+ var result:int = 0;
+
+ if (a == b)
+ return result;
+
+ if (a.length != b.length)
+ {
+ if (a.length < b.length)
+ result = -1;
+ else
+ result = 1;
+ }
+ else
+ {
+ for (var i:int = 0; i < a.length; i++)
+ {
+ result = numericCompare(a[i], b[i]);
+ if (result != 0)
+ {
+ i = a.length;
+ }
+ }
+ }
+ return result;
+ }
+
+
+ /**
+ * @private
+ * This is the "find" for our union-find algorithm when doing object searches.
+ * The dictionary keeps track of sets of equal objects
+ */
+ private static function getRef(o:Object, refs:Dictionary):Object
+ {
+ var oRef:Object = refs[o];
+ while (oRef && oRef != refs[oRef])
+ {
+ oRef = refs[oRef];
+ }
+ if (!oRef)
+ oRef = o;
+ if (oRef != refs[o])
+ refs[o] = oRef;
+
+ return oRef
+ }
+
+ /**
+ * @private
+ */
+ private static var refCount:int = 0;
+
+ /**
+ * @private
+ */
+ private static var CLASS_INFO_CACHE:Object = {};
+}
+
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/StringUtil.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/StringUtil.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/StringUtil.as
new file mode 100644
index 0000000..ee6a6d0
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/StringUtil.as
@@ -0,0 +1,364 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.utils
+{
+
+/**
+ * The StringUtil utility class is an all-static class with methods for
+ * working with String objects within Flex.
+ * You do not create instances of StringUtil;
+ * instead you call methods such as
+ * the <code>StringUtil.substitute()</code> method.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+public class StringUtil
+{
+
+ //--------------------------------------------------------------------------
+ //
+ // Class methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Removes all whitespace characters from the beginning and end
+ * of the specified string.
+ *
+ * @param str The String whose whitespace should be trimmed.
+ *
+ * @return Updated String where whitespace was removed from the
+ * beginning and end.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function trim(str:String):String
+ {
+ if (str == null) return '';
+
+ var startIndex:int = 0;
+ while (isWhitespace(str.charAt(startIndex)))
+ ++startIndex;
+
+ var endIndex:int = str.length - 1;
+ while (isWhitespace(str.charAt(endIndex)))
+ --endIndex;
+
+ if (endIndex >= startIndex)
+ return str.slice(startIndex, endIndex + 1);
+ else
+ return "";
+ }
+
+ /**
+ * Removes all whitespace characters from the beginning and end
+ * of each element in an Array, where the Array is stored as a String.
+ *
+ * @param value The String whose whitespace should be trimmed.
+ *
+ * @param separator The String that delimits each Array element in the string.
+ *
+ * @return Updated String where whitespace was removed from the
+ * beginning and end of each element.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function trimArrayElements(value:String, delimiter:String):String
+ {
+ if (value != "" && value != null)
+ {
+ var items:Array = value.split(delimiter);
+
+ var len:int = items.length;
+ for (var i:int = 0; i < len; i++)
+ {
+ items[i] = StringUtil.trim(items[i]);
+ }
+
+ if (len > 0)
+ {
+ value = items.join(delimiter);
+ }
+ }
+
+ return value;
+ }
+
+ /**
+ * Returns <code>true</code> if the specified string is
+ * a single space, tab, carriage return, newline, or formfeed character.
+ *
+ * @param str The String that is is being queried.
+ *
+ * @return <code>true</code> if the specified string is
+ * a single space, tab, carriage return, newline, or formfeed character.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function isWhitespace(character:String):Boolean
+ {
+ switch (character)
+ {
+ case " ":
+ case "\t":
+ case "\r":
+ case "\n":
+ case "\f":
+ // non breaking space
+ case "\u00A0":
+ // line seperator
+ case "\u2028":
+ // paragraph seperator
+ case "\u2029":
+ // ideographic space
+ case "\u3000":
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Substitutes "{n}" tokens within the specified string
+ * with the respective arguments passed in.
+ *
+ * Note that this uses String.replace and "$" can have special
+ * meaning in the argument strings escape by using "$$".
+ *
+ * @param str The string to make substitutions in.
+ * This string can contain special tokens of the form
+ * <code>{n}</code>, where <code>n</code> is a zero based index,
+ * that will be replaced with the additional parameters
+ * found at that index if specified.
+ *
+ * @param rest Additional parameters that can be substituted
+ * in the <code>str</code> parameter at each <code>{n}</code>
+ * location, where <code>n</code> is an integer (zero based)
+ * index value into the array of values specified.
+ * If the first parameter is an array this array will be used as
+ * a parameter list.
+ * This allows reuse of this routine in other methods that want to
+ * use the ... rest signature.
+ * For example <pre>
+ * public function myTracer(str:String, ... rest):void
+ * {
+ * label.text += StringUtil.substitute(str, rest) + "\n";
+ * } </pre>
+ *
+ * @return New string with all of the <code>{n}</code> tokens
+ * replaced with the respective arguments specified.
+ *
+ * @example
+ *
+ * var str:String = "here is some info '{0}' and {1}";
+ * trace(StringUtil.substitute(str, 15.4, true));
+ *
+ * // this will output the following string:
+ * // "here is some info '15.4' and true"
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function substitute(str:String, ... rest):String
+ {
+ if (str == null) return '';
+
+ // Replace all of the parameters in the msg string.
+ var len:uint = rest.length;
+ var args:Array;
+ if (len == 1 && rest[0] is Array)
+ {
+ args = rest[0] as Array;
+ len = args.length;
+ }
+ else
+ {
+ args = rest;
+ }
+
+ for (var i:int = 0; i < len; i++)
+ {
+ str = str.replace(new RegExp("\\{"+i+"\\}", "g"), args[i]);
+ }
+
+ return str;
+ }
+
+ /**
+ * Returns a string consisting of a specified string
+ * concatenated with itself a specified number of times.
+ *
+ * @param str The string to be repeated.
+ *
+ * @param n The repeat count.
+ *
+ * @return The repeated string.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10
+ * @playerversion AIR 1.5
+ * @productversion Flex 4.1
+ */
+ public static function repeat(str:String, n:int):String
+ {
+ if (n == 0)
+ return "";
+
+ var s:String = str;
+ for (var i:int = 1; i < n; i++)
+ {
+ s += str;
+ }
+ return s;
+ }
+
+ /**
+ * Removes "unallowed" characters from a string.
+ * A "restriction string" such as <code>"A-Z0-9"</code>
+ * is used to specify which characters are allowed.
+ * This method uses the same logic as the <code>restrict</code>
+ * property of TextField.
+ *
+ * @param str The input string.
+ *
+ * @param restrict The restriction string.
+ *
+ * @return The input string, minus any characters
+ * that are not allowed by the restriction string.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10
+ * @playerversion AIR 1.5
+ * @productversion Flex 4.1
+ */
+ public static function restrict(str:String, restrict:String):String
+ {
+ // A null 'restrict' string means all characters are allowed.
+ if (restrict == null)
+ return str;
+
+ // An empty 'restrict' string means no characters are allowed.
+ if (restrict == "")
+ return "";
+
+ // Otherwise, we need to test each character in 'str'
+ // to determine whether the 'restrict' string allows it.
+ var charCodes:Array = [];
+
+ var n:int = str.length;
+ for (var i:int = 0; i < n; i++)
+ {
+ var charCode:uint = str.charCodeAt(i);
+ if (testCharacter(charCode, restrict))
+ charCodes.push(charCode);
+ }
+
+ return String.fromCharCode.apply(null, charCodes);
+ }
+
+ /**
+ * @private
+ * Helper method used by restrict() to test each character
+ * in the input string against the restriction string.
+ * The logic in this method implements the same algorithm
+ * as in TextField's 'restrict' property (which is quirky,
+ * such as how it handles a '-' at the beginning of the
+ * restriction string).
+ */
+ private static function testCharacter(charCode:uint,
+ restrict:String):Boolean
+ {
+ var allowIt:Boolean = false;
+
+ var inBackSlash:Boolean = false;
+ var inRange:Boolean = false;
+ var setFlag:Boolean = true;
+ var lastCode:uint = 0;
+
+ var n:int = restrict.length;
+ var code:uint;
+
+ if (n > 0)
+ {
+ code = restrict.charCodeAt(0);
+ if (code == 94) // caret
+ allowIt = true;
+ }
+
+ for (var i:int = 0; i < n; i++)
+ {
+ code = restrict.charCodeAt(i)
+
+ var acceptCode:Boolean = false;
+ if (!inBackSlash)
+ {
+ if (code == 45) // hyphen
+ inRange = true;
+ else if (code == 94) // caret
+ setFlag = !setFlag;
+ else if (code == 92) // backslash
+ inBackSlash = true;
+ else
+ acceptCode = true;
+ }
+ else
+ {
+ acceptCode = true;
+ inBackSlash = false;
+ }
+
+ if (acceptCode)
+ {
+ if (inRange)
+ {
+ if (lastCode <= charCode && charCode <= code)
+ allowIt = setFlag;
+ inRange = false;
+ lastCode = 0;
+ }
+ else
+ {
+ if (charCode == code)
+ allowIt = setFlag;
+ lastCode = code;
+ }
+ }
+ }
+
+ return allowIt;
+ }
+}
+
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/UIDUtil.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/UIDUtil.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/UIDUtil.as
new file mode 100644
index 0000000..f6cf737
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/UIDUtil.as
@@ -0,0 +1,296 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.utils
+{
+
+import flash.utils.ByteArray;
+import flash.utils.Dictionary;
+
+import mx.core.mx_internal;
+
+use namespace mx_internal;
+
+/**
+ * The UIDUtil class is an all-static class
+ * with methods for working with UIDs (unique identifiers) within Flex.
+ * You do not create instances of UIDUtil;
+ * instead you simply call static methods such as the
+ * <code>UIDUtil.createUID()</code> method.
+ *
+ * <p><b>Note</b>: If you have a dynamic object that has no [Bindable] properties
+ * (which force the object to implement the IUID interface), Flex adds an
+ * <code>mx_internal_uid</code> property that contains a UID to the object.
+ * To avoid having this field
+ * in your dynamic object, make it [Bindable], implement the IUID interface
+ * in the object class, or set a <coded>uid</coded> property with a value.</p>
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+public class UIDUtil
+{
+
+ //--------------------------------------------------------------------------
+ //
+ // Class constants
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ * Char codes for 0123456789ABCDEF
+ */
+ private static const ALPHA_CHAR_CODES:Array = [48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57, 65, 66, 67, 68, 69, 70];
+
+ private static const DASH:int = 45; // dash ascii
+ private static const UIDBuffer:ByteArray = new ByteArray(); // static ByteArray used for UID generation to save memory allocation cost
+
+ //--------------------------------------------------------------------------
+ //
+ // Class variables
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * This Dictionary records all generated uids for all existing items.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ private static var uidDictionary:Dictionary = new Dictionary(true);
+
+ //--------------------------------------------------------------------------
+ //
+ // Class methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Generates a UID (unique identifier) based on ActionScript's
+ * pseudo-random number generator and the current time.
+ *
+ * <p>The UID has the form
+ * <code>"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"</code>
+ * where X is a hexadecimal digit (0-9, A-F).</p>
+ *
+ * <p>This UID will not be truly globally unique; but it is the best
+ * we can do without player support for UID generation.</p>
+ *
+ * @return The newly-generated UID.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function createUID():String
+ {
+ UIDBuffer.position = 0;
+
+ var i:int;
+ var j:int;
+
+ for (i = 0; i < 8; i++)
+ {
+ UIDBuffer.writeByte(ALPHA_CHAR_CODES[int(Math.random() * 16)]);
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ UIDBuffer.writeByte(DASH);
+ for (j = 0; j < 4; j++)
+ {
+ UIDBuffer.writeByte(ALPHA_CHAR_CODES[int(Math.random() * 16)]);
+ }
+ }
+
+ UIDBuffer.writeByte(DASH);
+
+ var time:uint = new Date().getTime(); // extract last 8 digits
+ var timeString:String = time.toString(16).toUpperCase();
+ // 0xFFFFFFFF milliseconds ~= 3 days, so timeString may have between 1 and 8 digits, hence we need to pad with 0s to 8 digits
+ for (i = 8; i > timeString.length; i--)
+ UIDBuffer.writeByte(48);
+ UIDBuffer.writeUTFBytes(timeString);
+
+ for (i = 0; i < 4; i++)
+ {
+ UIDBuffer.writeByte(ALPHA_CHAR_CODES[int(Math.random() * 16)]);
+ }
+
+ return UIDBuffer.toString();
+ }
+
+ /**
+ * Converts a 128-bit UID encoded as a ByteArray to a String representation.
+ * The format matches that generated by createUID. If a suitable ByteArray
+ * is not provided, null is returned.
+ *
+ * @param ba ByteArray 16 bytes in length representing a 128-bit UID.
+ *
+ * @return String representation of the UID, or null if an invalid
+ * ByteArray is provided.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function fromByteArray(ba:ByteArray):String
+ {
+ if (ba != null && ba.length >= 16 && ba.bytesAvailable >= 16)
+ {
+ UIDBuffer.position = 0;
+ var index:uint = 0;
+ for (var i:uint = 0; i < 16; i++)
+ {
+ if (i == 4 || i == 6 || i == 8 || i == 10)
+ UIDBuffer.writeByte(DASH); // Hyphen char code
+
+ var b:int = ba.readByte();
+ UIDBuffer.writeByte(ALPHA_CHAR_CODES[(b & 0xF0) >>> 4]);
+ UIDBuffer.writeByte(ALPHA_CHAR_CODES[(b & 0x0F)]);
+ }
+ return UIDBuffer.toString();
+ }
+
+ return null;
+ }
+
+ /**
+ * A utility method to check whether a String value represents a
+ * correctly formatted UID value. UID values are expected to be
+ * in the format generated by createUID(), implying that only
+ * capitalized A-F characters in addition to 0-9 digits are
+ * supported.
+ *
+ * @param uid The value to test whether it is formatted as a UID.
+ *
+ * @return Returns true if the value is formatted as a UID.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function isUID(uid:String):Boolean
+ {
+ if (uid != null && uid.length == 36)
+ {
+ for (var i:uint = 0; i < 36; i++)
+ {
+ var c:Number = uid.charCodeAt(i);
+
+ // Check for correctly placed hyphens
+ if (i == 8 || i == 13 || i == 18 || i == 23)
+ {
+ if (c != DASH)
+ {
+ return false;
+ }
+ }
+ // We allow capital alpha-numeric hex digits only
+ else if (c < 48 || c > 70 || (c > 57 && c < 65))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Converts a UID formatted String to a ByteArray. The UID must be in the
+ * format generated by createUID, otherwise null is returned.
+ *
+ * @param String representing a 128-bit UID
+ *
+ * @return ByteArray 16 bytes in length representing the 128-bits of the
+ * UID or null if the uid could not be converted.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public static function toByteArray(uid:String):ByteArray
+ {
+ if (isUID(uid))
+ {
+ var result:ByteArray = new ByteArray();
+
+ for (var i:uint = 0; i < uid.length; i++)
+ {
+ var c:String = uid.charAt(i);
+ if (c == "-")
+ continue;
+ var h1:uint = getDigit(c);
+ i++;
+ var h2:uint = getDigit(uid.charAt(i));
+ result.writeByte(((h1 << 4) | h2) & 0xFF);
+ }
+ result.position = 0;
+ return result;
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns the decimal representation of a hex digit.
+ * @private
+ */
+ private static function getDigit(hex:String):uint
+ {
+ switch (hex)
+ {
+ case "A":
+ case "a":
+ return 10;
+ case "B":
+ case "b":
+ return 11;
+ case "C":
+ case "c":
+ return 12;
+ case "D":
+ case "d":
+ return 13;
+ case "E":
+ case "e":
+ return 14;
+ case "F":
+ case "f":
+ return 15;
+ default:
+ return new uint(hex);
+ }
+ }
+}
+
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/object_proxy.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/object_proxy.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/object_proxy.as
new file mode 100644
index 0000000..5aea911
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/object_proxy.as
@@ -0,0 +1,34 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.utils
+{
+
+/**
+ * Documentation is not currently available.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+public namespace object_proxy =
+ "http://www.adobe.com/2006/actionscript/flash/objectproxy";
+
+}