This is an automated email from the ASF dual-hosted git repository.

aharui pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git

commit ae9b650477f71a3815ca6166daf64aa8cd435cd0
Author: Alex Harui <[email protected]>
AuthorDate: Thu Feb 15 01:34:27 2018 -0800

    first cut at generating VO's from JSON
---
 examples/royale/JSON2ASVO/JSON2ASVO-app.xml        | 252 +++++++++++++++++++++
 examples/royale/JSON2ASVO/asconfig.json            |  31 +++
 examples/royale/JSON2ASVO/build.xml                |  89 ++++++++
 examples/royale/JSON2ASVO/pom.xml                  |  90 ++++++++
 .../JSON2ASVO/src/main/royale/JSON2ASVO.mxml       |  36 +++
 .../JSON2ASVO/src/main/royale/MyInitialView.mxml   | 224 ++++++++++++++++++
 6 files changed, 722 insertions(+)

diff --git a/examples/royale/JSON2ASVO/JSON2ASVO-app.xml 
b/examples/royale/JSON2ASVO/JSON2ASVO-app.xml
new file mode 100644
index 0000000..f4ffb1c
--- /dev/null
+++ b/examples/royale/JSON2ASVO/JSON2ASVO-app.xml
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+
+  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.
+
+-->
+<application xmlns="http://ns.adobe.com/air/application/16.0";>
+
+<!-- Adobe AIR Application Descriptor File Template.
+
+       Specifies parameters for identifying, installing, and launching AIR 
applications.
+
+       xmlns - The Adobe AIR namespace: http://ns.adobe.com/air/application/3.8
+                       The last segment of the namespace specifies the version
+                       of the AIR runtime required for this application to run.
+
+       minimumPatchLevel - The minimum patch level of the AIR runtime required 
to run
+                       the application. Optional.
+-->
+
+       <!-- A universally unique application identifier. Must be unique across 
all AIR applications.
+       Using a reverse DNS-style name as the id is recommended. (Eg. 
com.example.ExampleApplication.) Required. -->
+       <id>org.apache.royale.json2asvo</id>
+
+       <!-- Used as the filename for the application. Required. -->
+       <filename>Apache Royale JSON to ActionScript ValueObject 
Example</filename>
+
+       <!-- The name that is displayed in the AIR application installer.
+       May have multiple values for each language. See samples or xsd schema 
file. Optional. -->
+       <name>Apache Royale JSON to ActionScript ValueObject Example</name>
+
+       <!-- A string value of the format <0-999>.<0-999>.<0-999> that 
represents application version which can be used to check for application 
upgrade.
+       Values can also be 1-part or 2-part. It is not necessary to have a 
3-part value.
+       An updated version of application must have a versionNumber value 
higher than the previous version. Required for namespace >= 2.5 . -->
+       <versionNumber>0.9.2</versionNumber>
+
+       <!-- A string value (such as "v1", "2.5", or "Alpha 1") that represents 
the version of the application, as it should be shown to users. Optional. -->
+       <!-- <versionLabel></versionLabel> -->
+
+       <!-- Description, displayed in the AIR application installer.
+       May have multiple values for each language. See samples or xsd schema 
file. Optional. -->
+       <!-- <description></description> -->
+
+       <!-- Copyright information. Optional -->
+       <copyright>Copyright 2018 The Apache Software Foundation.</copyright>
+
+       <!-- Publisher ID. Used if you're updating an application created prior 
to 1.5.3 -->
+       <!-- <publisherID></publisherID> -->
+
+       <!-- Settings for the application's initial window. Required. -->
+       <initialWindow>
+               <!-- The main SWF or HTML file of the application. Required. -->
+               <!-- Note: In Flash Builder, the SWF reference is set 
automatically. -->
+               <content>JSON2ASVO.swf</content>
+
+               <!-- The title of the main window. Optional. -->
+               <!-- <title></title> -->
+
+               <!-- The type of system chrome to use (either "standard" or 
"none"). Optional. Default standard. -->
+               <!-- <systemChrome></systemChrome> -->
+
+               <!-- Whether the window is transparent. Only applicable when 
systemChrome is none. Optional. Default false. -->
+               <!-- <transparent></transparent> -->
+
+               <!-- Whether the window is initially visible. Optional. Default 
false. -->
+               <!-- <visible></visible> -->
+
+               <!-- Whether the user can minimize the window. Optional. 
Default true. -->
+               <!-- <minimizable></minimizable> -->
+
+               <!-- Whether the user can maximize the window. Optional. 
Default true. -->
+               <!-- <maximizable></maximizable> -->
+
+               <!-- Whether the user can resize the window. Optional. Default 
true. -->
+               <!-- <resizable></resizable> -->
+
+               <!-- The window's initial width in pixels. Optional. -->
+               <width>640</width>
+
+               <!-- The window's initial height in pixels. Optional. -->
+               <height>720</height>
+
+               <!-- The window's initial x position. Optional. -->
+               <!-- <x></x> -->
+
+               <!-- The window's initial y position. Optional. -->
+               <!-- <y></y> -->
+
+               <!-- The window's minimum size, specified as a width/height 
pair in pixels, such as "400 200". Optional. -->
+               <!-- <minSize></minSize> -->
+
+               <!-- The window's initial maximum size, specified as a 
width/height pair in pixels, such as "1600 1200". Optional. -->
+               <!-- <maxSize></maxSize> -->
+
+        <!-- The initial aspect ratio of the app when launched (either 
"portrait" or "landscape"). Optional. Mobile only. Default is the natural 
orientation of the device -->
+
+        <!-- <aspectRatio></aspectRatio> -->
+
+        <!-- Whether the app will begin auto-orienting on launch. Optional. 
Mobile only. Default false -->
+
+        <!-- <autoOrients></autoOrients> -->
+
+        <!-- Whether the app launches in full screen. Optional. Mobile only. 
Default false -->
+
+        <!-- <fullScreen></fullScreen> -->
+
+        <!-- The render mode for the app (either auto, cpu, gpu, or direct). 
Optional. Default auto -->
+
+        <!-- <renderMode></renderMode> -->
+
+               <!-- Whether or not to pan when a soft keyboard is raised or 
lowered (either "pan" or "none").  Optional.  Defaults "pan." -->
+               <!-- <softKeyboardBehavior></softKeyboardBehavior> -->
+       <autoOrients>false</autoOrients>
+        <fullScreen>false</fullScreen>
+        <visible>true</visible>
+    </initialWindow>
+
+       <!-- We recommend omitting the supportedProfiles element, -->
+       <!-- which in turn permits your application to be deployed to all -->
+       <!-- devices supported by AIR. If you wish to restrict deployment -->
+       <!-- (i.e., to only mobile devices) then add this element and list -->
+       <!-- only the profiles which your application does support. -->
+       <!-- <supportedProfiles>desktop extendedDesktop mobileDevice 
extendedMobileDevice</supportedProfiles> -->
+       <supportedProfiles>extendedDesktop desktop</supportedProfiles>
+
+       <!-- The subpath of the standard default installation location to use. 
Optional. -->
+       <installFolder>Apache Royale</installFolder>
+
+       <!-- The subpath of the Programs menu to use. (Ignored on operating 
systems without a Programs menu.) Optional. -->
+       <programMenuFolder>Apache Royale</programMenuFolder>
+
+       <!-- The icon the system uses for the application. For at least one 
resolution,
+       specify the path to a PNG file included in the AIR package. Optional. 
-->
+       <icon>
+               <image16x16>assets/icons/16.png</image16x16>
+               <image29x29>assets/icons/29.png</image29x29>
+               <image32x32>assets/icons/32.png</image32x32>
+               <image36x36>assets/icons/36.png</image36x36>
+               <image48x48>assets/icons/48.png</image48x48>
+               <image57x57>assets/icons/57.png</image57x57>
+               <image72x72>assets/icons/72.png</image72x72>
+               <image114x114>assets/icons/114.png</image114x114>
+               <image128x128>assets/icons/128.png</image128x128>
+       </icon>
+
+       <!-- Whether the application handles the update when a user 
double-clicks an update version
+       of the AIR file (true), or the default AIR application installer 
handles the update (false).
+       Optional. Default false. -->
+       <!-- <customUpdateUI></customUpdateUI> -->
+
+       <!-- Whether the application can be launched when the user clicks a 
link in a web browser.
+       Optional. Default false. -->
+       <!-- <allowBrowserInvocation></allowBrowserInvocation> -->
+
+       <!-- Listing of file types for which the application can register. 
Optional. -->
+       <!-- <fileTypes> -->
+
+               <!-- Defines one file type. Optional. -->
+               <!-- <fileType> -->
+
+                       <!-- The name that the system displays for the 
registered file type. Required. -->
+                       <!-- <name></name> -->
+
+                       <!-- The extension to register. Required. -->
+                       <!-- <extension></extension> -->
+
+                       <!-- The description of the file type. Optional. -->
+                       <!-- <description></description> -->
+
+                       <!-- The MIME content type. -->
+                       <!-- <contentType></contentType> -->
+
+                       <!-- The icon to display for the file type. Optional. 
-->
+                       <!-- <icon>
+                               <image16x16></image16x16>
+                               <image32x32></image32x32>
+                               <image48x48></image48x48>
+                               <image128x128></image128x128>
+                       </icon> -->
+
+               <!-- </fileType> -->
+       <!-- </fileTypes> -->
+
+    <!-- iOS specific capabilities -->
+       <!-- <iPhone> -->
+               <!-- A list of plist key/value pairs to be added to the 
application Info.plist -->
+               <!-- <InfoAdditions>
+            <![CDATA[
+                <key>UIDeviceFamily</key>
+                <array>
+                    <string>1</string>
+                    <string>2</string>
+                </array>
+                <key>UIStatusBarStyle</key>
+                <string>UIStatusBarStyleBlackOpaque</string>
+                <key>UIRequiresPersistentWiFi</key>
+                <string>YES</string>
+            ]]>
+        </InfoAdditions> -->
+        <!-- A list of plist key/value pairs to be added to the application 
Entitlements.plist -->
+               <!-- <Entitlements>
+            <![CDATA[
+                <key>keychain-access-groups</key>
+                <array>
+                    <string></string>
+                    <string></string>
+                </array>
+            ]]>
+        </Entitlements> -->
+       <!-- Display Resolution for the app (either "standard" or "high"). 
Optional. Default "standard" -->
+       <!-- <requestedDisplayResolution></requestedDisplayResolution> -->
+       <!-- </iPhone> -->
+
+       <!-- Specify Android specific tags that get passed to 
AndroidManifest.xml file. -->
+    <!--<android> -->
+    <!--       <manifestAdditions>
+               <![CDATA[
+                       <manifest android:installLocation="auto">
+                               <uses-permission 
android:name="android.permission.INTERNET"/>
+                               <uses-permission 
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+                               <uses-permission 
android:name="android.permission.ACCESS_FINE_LOCATION"/>
+                               <uses-feature android:required="true" 
android:name="android.hardware.touchscreen.multitouch"/>
+                               <application android:enabled="true">
+                                       <activity 
android:excludeFromRecents="false">
+                                               <intent-filter>
+                                                       <action 
android:name="android.intent.action.MAIN"/>
+                                                       <category 
android:name="android.intent.category.LAUNCHER"/>
+                                               </intent-filter>
+                                       </activity>
+                               </application>
+            </manifest>
+               ]]>
+        </manifestAdditions> -->
+           <!-- Color depth for the app (either "32bit" or "16bit"). Optional. 
Default 16bit before namespace 3.0, 32bit after -->
+        <!-- <colorDepth></colorDepth> -->
+    <!-- </android> -->
+       <!-- End of the schema for adding the android specific tags in 
AndroidManifest.xml file -->
+
+</application>
diff --git a/examples/royale/JSON2ASVO/asconfig.json 
b/examples/royale/JSON2ASVO/asconfig.json
new file mode 100644
index 0000000..63d357b
--- /dev/null
+++ b/examples/royale/JSON2ASVO/asconfig.json
@@ -0,0 +1,31 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+{
+    "config": "royale",
+    "compilerOptions": {
+        "debug": false,
+        "targets": ["JSRoyale","SWF"],
+        "source-map": true
+    },
+    "additionalOptions": "-remove-circulars 
-js-output-optimization=skipAsCoercions",
+    "files":
+    [
+        "src/main/royale/JSON2ASVO.mxml"
+    ]
+}
diff --git a/examples/royale/JSON2ASVO/build.xml 
b/examples/royale/JSON2ASVO/build.xml
new file mode 100644
index 0000000..446078a
--- /dev/null
+++ b/examples/royale/JSON2ASVO/build.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0"?>
+<!--
+
+  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.
+
+-->
+
+
+<project name="JSON2ASVO" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../.."/>
+    <property name="example" value="JSON2ASVO" />
+    
+    <!-- this project needs AIR 3.4 FP 11.4 -->
+    <property name="swf.version" value="17" />
+    <property name="playerglobal.version" value="11.4" />
+    
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+    <property name="AIR_HOME" value="${env.AIR_HOME}"/>
+    <property name="config_arg" value="air"/>
+    
+    <condition property="adl" value="adl.exe">
+        <os family="windows"/>
+    </condition>
+    
+    <condition property="adl" value="adl">
+        <os family="mac"/>
+    </condition>
+    
+    <condition property="runtime" value="win">
+        <os family="windows"/>
+    </condition>
+    
+    <condition property="runtime" value="mac">
+        <os family="mac"/>
+    </condition>
+
+    <include file="${basedir}/../../build_example.xml" />
+
+    <target name="main" depends="clean,build_example.compile" 
description="Clean build of ${example}">
+        <copy todir="${basedir}/bin-debug" >
+            <fileset dir="${basedir}">
+                <include name="*-app.xml" />
+            </fileset>
+        </copy>
+        <copy todir="${basedir}/bin-release" >
+            <fileset dir="${basedir}">
+                <include name="*-app.xml" />
+            </fileset>
+        </copy>
+    </target>
+    
+    <target name="clean">
+        <delete dir="${basedir}/bin" failonerror="false" />
+        <delete dir="${basedir}/bin-debug" failonerror="false" />
+        <delete dir="${basedir}/bin-release" failonerror="false" />
+        <delete dir="${basedir}/target" failonerror="false" />
+    </target>
+    
+    <target name="run">
+        <property name="which" value="debug" />
+        <antcall target="build_example.run.air.desktop" />
+    </target>
+    
+    <target name="examine" depends="build_example.get.browser">
+        <property name="which" value="debug" />
+        <echo message="View map."/>
+        <antcall target="build_example.run.air.desktop" />
+        <exec executable="${browser}" dir="${basedir}/bin/js-${which}" 
failonerror="true">
+            <arg value="${basedir}/bin/js-${which}/index.html"/>
+        </exec>
+    </target>
+
+</project>
diff --git a/examples/royale/JSON2ASVO/pom.xml 
b/examples/royale/JSON2ASVO/pom.xml
new file mode 100644
index 0000000..00bdce7
--- /dev/null
+++ b/examples/royale/JSON2ASVO/pom.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+  <modelVersion>4.0.0</modelVersion>
+
+  <!--
+        TODO:
+          Flash version:
+            Needs AIR
+  -->
+
+  <parent>
+    <groupId>org.apache.royale.examples</groupId>
+    <artifactId>examples-royale</artifactId>
+    <version>0.9.2-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>JSON2ASVO</artifactId>
+  <version>0.9.2-SNAPSHOT</version>
+  <packaging>swf</packaging>
+
+  <name>Apache Royale: Examples: Royale: JSON2ASVO</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.royale.compiler</groupId>
+        <artifactId>royale-maven-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <mainClass>JSON2ASVO.mxml</mainClass>
+          <removeCirculars>true</removeCirculars>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.adobe.air.framework</groupId>
+      <artifactId>airglobal</artifactId>
+      <version>${air.version}</version>
+      <type>swc</type>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>GoogleMaps</artifactId>
+      <version>0.9.2-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>GoogleMaps</artifactId>
+      <version>0.9.2-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    
+    <dependency>
+        <groupId>org.apache.royale.typedefs</groupId>
+        <artifactId>royale-typedefs-googlemaps</artifactId>
+        <version>${royale.typedefs.version}</version>
+        <type>swc</type>
+        <classifier>typedefs</classifier>
+        <scope>runtime</scope>
+    </dependency>
+
+  </dependencies>
+
+</project>
diff --git a/examples/royale/JSON2ASVO/src/main/royale/JSON2ASVO.mxml 
b/examples/royale/JSON2ASVO/src/main/royale/JSON2ASVO.mxml
new file mode 100644
index 0000000..925c947
--- /dev/null
+++ b/examples/royale/JSON2ASVO/src/main/royale/JSON2ASVO.mxml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!---
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+-->
+<js:AirApplication xmlns:fx="http://ns.adobe.com/mxml/2009";
+                                  xmlns:local="*"
+                                  xmlns:models="models.*"
+                                  
xmlns:js="library://ns.apache.org/royale/basic" 
+                                  >    
+       <js:valuesImpl>
+               <js:SimpleCSSValuesImpl />
+       </js:valuesImpl>
+       <js:initialView>
+               <local:MyInitialView width="100%" height="100%" />
+       </js:initialView>
+       <js:beads>
+               <js:MixinManager />
+       </js:beads>
+       
+</js:AirApplication>
diff --git a/examples/royale/JSON2ASVO/src/main/royale/MyInitialView.mxml 
b/examples/royale/JSON2ASVO/src/main/royale/MyInitialView.mxml
new file mode 100644
index 0000000..cc5a0ce
--- /dev/null
+++ b/examples/royale/JSON2ASVO/src/main/royale/MyInitialView.mxml
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+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.
+
+-->
+<js:View xmlns:fx="http://ns.adobe.com/mxml/2009";
+                               xmlns:js="library://ns.apache.org/royale/basic"
+                               xmlns:local="*"
+                               initComplete="startup()">
+    <fx:Script>
+        <![CDATA[                      
+                       import org.apache.royale.storage.PermanentStorage;
+                       import org.apache.royale.storage.events.FileEvent;
+                       import org.apache.royale.storage.events.FileErrorEvent;
+                       import org.apache.royale.storage.file.IDataInput;
+                       import org.apache.royale.storage.file.IDataOutput;
+                       
+                       private function startup():void
+                       {
+                               trace("Starting up");
+                       }
+                       
+                       public function set ready(value:Boolean):void
+                       {
+                               status.text = "Now Ready";
+                       }
+                       
+            private var json:Object;
+
+            private var subClasses:Object = {};
+            private var subObjects:Array = [];
+            
+                       private function onSave():void
+                       {
+                try {
+                    json = JSON.parse(contentField.text);
+                }
+                catch (e:Error)
+                {
+                    status.text = "Error parsing JSON result"
+                }
+                writeClass(json, writeFileNameField.text);
+            }
+            
+            private function writeClass(obj:Object, className:String):void
+            {
+                obj["__JSON2ASVO__"] = className; // mark as seen so we don't 
loop on circular references
+                status.text = "Writing class: " + className;
+                
+                               var storage:PermanentStorage = new 
PermanentStorage();
+
+                var firstChar:String;
+                var key:String;
+                               var useFile:String = className + ".as";
+                               var useContent:String = "package\n{\n";
+                useContent += "public class " + className + "\n{\n";
+                for (var p:String in obj)
+                {
+                    if (p == "__JSON2ASVO__") continue;
+                    
+                    var value:Object = obj[p];
+                    useContent += "    public var " + p + ":";
+                    if (value is Array)
+                    {
+                        useContent += "Array;\n";
+                        if (value.length > 0)
+                        {
+                            value = value[0];
+                            if (!(value is String ||
+                                  value is Number ||
+                                  value === true || 
+                                  value === false))
+                            {
+                                key = generateKey(value);
+                                if (!subClasses[key])
+                                {
+                                    firstChar = p.charAt(0).toUpperCase();
+                                    typeName = className + firstChar + 
p.substr(1);
+                                    subClasses[key] = typeName;
+                                    subObjects.push(value);                    
                
+                                }
+                            }
+                        }
+                    }
+                    else if (value is String)
+                    {
+                        useContent += "String;\n";
+                    }
+                    else if (value is Number)
+                    {
+                        if (Math.round(value as Number) === value)
+                            useContent += "int;\n";
+                        else
+                            useContent += "Number;\n";
+                    }
+                    else if (value === true || value === false)
+                    {
+                        useContent += "Boolean;\n";
+                    }
+                    else if (value === null)
+                    {
+                        useContent += "Object; // was null\n";                 
       
+                    }
+                    else
+                    {
+                        var typeName:String = value["__JSON2ASVO__"];
+                        if (typeName)
+                            useContent += typeName + ";\n";
+                        else
+                        {
+                            key = generateKey(value);
+                            typeName = subClasses[key];
+                            if (typeName)
+                                useContent += typeName + ";\n";
+                            else
+                            {
+                                firstChar = p.charAt(0).toUpperCase();
+                                typeName = className + firstChar + p.substr(1);
+                                subClasses[key] = typeName;
+                                useContent += typeName + ";\n";
+                                subObjects.push(value);
+                            }
+                        }
+                    }
+                }
+                               
+                useContent += "}\n"; // end class
+                useContent += "}\n"; // end package
+                
+                               storage.addEventListener("WRITE", handleSave);
+                               storage.addEventListener("ERROR", 
handleSaveError);
+                               storage.writeTextToDataFile(useFile, 
useContent);
+                       }
+                       
+                       private function handleSave(event:FileEvent):void
+                       {
+                var foundOne:Boolean = false;
+                while (subObjects.length)
+                {
+                    var value:Object = subObjects.shift();
+                    if (value["__JSON2ASVO__"]) continue; // already seen it
+                    var key:String = generateKey(value);
+                    var className:String = subClasses[key];
+                    foundOne = true;
+                    writeClass(value, className);
+                    break;
+                }
+                if (!foundOne)
+                    status.text = "Done!";
+                       }
+                       
+                       private function 
handleSaveError(event:FileErrorEvent):void
+                       {
+                               status.text = "Error: "+event.errorMessage;
+                       }
+                       
+            private function generateKey(value:Object):String
+            {
+                var parts:Array = [];
+                for (var p:String in value)
+                {
+                    var key:String = "";
+                    key += p;
+                    key += ":";
+                    key += typeof value[p];
+                    parts.push(key);
+                }
+                parts.sort();
+                return parts.join(";");
+            }
+               ]]>
+    </fx:Script>
+       
+       <fx:Style>
+       
+       .labelStyle {
+               color: #9999FF;
+       }
+       
+       .contentStyle {
+               font-size: 18pt;
+       }
+       
+       </fx:Style>
+       
+       <js:beads>
+               <js:ViewDataBinding />
+       </js:beads>
+       
+       <js:VGroup>
+               <js:Label text="Generate ActionScript ValueObjects (Data 
Classes) from a JSON result" width="100%" />
+               <js:Spacer height="20" />
+        <js:Label id="status" text="** APP STATUS HERE **" />
+        <js:Spacer height="20" />
+               
+        <js:Label text="Generated classes will be written to the application 
storage folder" width="100%" />
+               <js:HGroup>
+                       <js:Label text="Output Class Name:" 
className="labelStyle" />
+                       <js:TextInput id="writeFileNameField" 
text="ValueObject" />
+               </js:HGroup>
+        <js:Label text="Sub-Objects will be given a class name based on the 
field where it was discovered." width="100%" />
+        <js:Label text="So if you set Output Class Name to 'Foo' and the JSON 
result has a sub-object" width="100%" />
+        <js:Label text="in a 'bar' field, that sub-object will have the class 
name FooBar." width="100%" />
+        <js:Spacer height="20" />
+               <js:Label text="Enter JSON result:" className="labelStyle" />
+               <js:TextArea id="contentField" width="100%" height="300" />
+               <js:TextButton text="Generate Classes" click="onSave()" />      
        
+       </js:VGroup>            
+
+</js:View>

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to