<?xml version="1.0" encoding="utf-8"?>
<mx:Application frameRate="60" xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="setEndpoint(); ro.getServices(); init();" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10">
<mx:states>
<mx:State name="testService">
<mx:SetProperty target="{rightPanel}" name="visible" value="true"/>
<mx:SetStyle target="{form1}" name="paddingBottom" value="10"/>
<mx:SetStyle target="{form1}" name="paddingLeft" value="10"/>
<mx:SetStyle target="{form1}" name="paddingRight" value="10"/>
<mx:SetStyle target="{form1}" name="paddingTop" value="10"/>
</mx:State>
<mx:State name="testMethod" basedOn="testService">
<mx:SetProperty target="{output}" name="visible" value="true"/>
<mx:SetProperty target="{output}" name="height" value="200"/>
</mx:State>
</mx:states>
<mx:Script>
<![CDATA[
import mx.controls.dataGridClasses.DataGridColumn;
import mx.controls.dataGridClasses.DataGridBase;
import mx.collections.ArrayCollection;
import mx.utils.ObjectUtil;
import com.adobe.serialization.json.JSON;
import mx.controls.List;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
[Bindable]
public var methods:Object;
[Bindable]
public var currentService:Object;
[Bindable]
public var currentMethod:Object;
[Bindable]
public var currentMethodName:String;
var sro:RemoteObject;
var time:Number;
function setEndpoint()
{
var url:String = Application.application.url;
if(url.indexOf('http') != -1)
{
ro.endpoint = url.substr(0, url.lastIndexOf('/')) + "gateway.php";
}
}
function init():void
{
sro = new RemoteObject("amfphp");
sro.addEventListener(ResultEvent.RESULT, onResult);
sro.addEventListener(FaultEvent.FAULT, onFault);
}
function describeService(data:Object):void
{
methods = data;
var links:Array = new Array();
for(var i in data)
{
links.push({label:i, data:i});
}
links = links.sortOn("label");
if(links.length > 0)
{
methodLinks.dataProvider = links;
methodLinks.selectedIndex = 0;
currentMethod = methods[links[0].data];
currentMethodName = links[0].data;
currentState = "testService";
}
}
function sendRequest()
{
time = getTimer();
currentMethodName = methodLinks.dataProvider[methodLinks.selectedIndex].data;
sro.source = currentService.data.split('/').join('.').split('\\').join('.') + currentService.label;
sro[currentMethodName].send.apply(null, getArgs());
}
function getArgs()
{
var parsedArgs:Array = new Array();
if(arg is Array)
{
for(var i:int = 0; i < arg.length; i++)
{
try
{
var text = arg[i].text;
if(text.indexOf('{') == -1 &&
text.indexOf('[') == -1 &&
text.indexOf('"') == -1 &&
text.indexOf("'") == -1)
{
var val = parseInt(text);
if(isNaN(val))
{
text = '"' + text + '"';
}
}
parsedArgs.push(JSON.decode(text));
}
catch(e:*)
{
}
}
}
return parsedArgs;
}
function onResult(event)
{
currentState = "testMethod";
resultsText.text = ObjectUtil.toString(event.result);
infoText.text = "Query took: " + (getTimer() - time) + " ms";
if((event.result is Array && event.result[0] is Object) ||
(event.result is ArrayCollection && event.result.getItemAt(0) is Object))
{
var keys = new Array();
for(var i in event.result[0])
{
keys.push(new DataGridColumn(i));
}
resultsDg.columns = keys;
resultsDg.dataProvider = event.result;
}
else
{
resultsDg.columns = new Array();
resultsDg.dataProvider = new Array();
}
output.selectedIndex = 0;
}
function onFault(event)
{
currentState = "testMethod";
resultsText.text = ObjectUtil.toString(event.fault);
infoText.text = "Query took: " + (getTimer() - time) + " ms";
resultsDg.dataProvider = new Array();
output.selectedIndex = 0;
}
function enableLinks()
{
for(var i=0; i<methodLinks.numChildren; i++){
var curItem = methodLinks.getChildAt(i);
curItem.enabled = i == methodLinks.selectedIndex ? false : true;
}
}
]]>
</mx:Script>
<mx:RemoteObject showBusyCursor="true" destination="amfphp" endpoint="http://flashservices/gateway.php" source="amfphp.DiscoveryService" id="ro">
<mx:method name="getServices" result="methodTree.dataProvider = event.result"/>
<mx:method name="describeService" result="describeService(event.result)" />
</mx:RemoteObject>
<mx:HDividedBox width="100%" height="100%">
<mx:VBox height="100%">
<mx:HBox width="100%" verticalAlign="middle">
<mx:Label fontSize="10" fontWeight="bold" text="Service Browser"/>
<mx:Spacer width="100%"/>
<mx:Button label="Settings" visible="false"/>
<mx:Button label="Refresh" click="ro.getServices();"/>
</mx:HBox>
<mx:Tree width="100%"
height="100%"
id="methodTree"
openDuration="0"
change="if((methodTree.selectedItem.children is Array)){return;} currentService = methodTree.selectedItem; ro.describeService(methodTree.selectedItem)"
/>
</mx:VBox>
<mx:Panel id="rightPanel" visible="false" title="{'Exploring ' + currentService.label}" height="100%" borderThickness="3" paddingLeft="5" paddingRight="5" paddingBottom="5" paddingTop="5" borderThicknessBottom="3" borderThicknessLeft="3" borderThicknessRight="3" borderThicknessTop="3">
<mx:VDividedBox label="Test" width="100%" height="100%" paddingBottom="0" paddingLeft="0" paddingRight="0" paddingTop="0">
<mx:TabNavigator width="100%" height="100%" historyManagementEnabled="false">
<mx:VBox width="100%" label="Test">
<mx:LinkBar id="methodLinks" itemClick="currentMethod = methods[event.item.data]; currentMethodName = event.item.label; enableLinks();" fontWeight="normal" horizontalGap="0"/>
<mx:VBox width="100%">
<mx:Form width="100%" id="form1">
<mx:Text fontWeight="bold" htmlText="{'Method: ' + currentMethodName}" width="100%"/>
<mx:Text htmlText="{currentMethod.description}" width="100%"/>
<mx:Repeater width="100%" recycleChildren="false" id="args" dataProvider="{currentMethod.arguments}">
<mx:FormItem width="100%" label="{args.currentItem != null ? args.currentItem : ''}">
<mx:TextInput id="arg" width="100%"/>
</mx:FormItem>
</mx:Repeater>
<mx:Button label="Call" click="sendRequest();"/>
</mx:Form>
</mx:VBox>
</mx:VBox>
<mx:VBox label="Code generator">
<mx:Text text="Not yet implemented." />
</mx:VBox>
</mx:TabNavigator>
<mx:TabNavigator creationPolicy="all" id="output" width="100%" paddingTop="0" historyManagementEnabled="false" height="0" visible="false">
<mx:VBox label="Results" height="100%">
<mx:TextArea editable="false" focusEnabled="false" height="100%" width="100%" id="resultsText" borderThickness="0" borderStyle="none"/>
</mx:VBox>
<mx:VBox label="RecordSet view" width="100%" height="100%" borderThickness="0">
<mx:DataGrid width="100%" height="100%" borderStyle="none" id="resultsDg"></mx:DataGrid>
</mx:VBox>
<mx:VBox label="Trace" width="100%" height="100%">
<mx:TextArea editable="false" focusEnabled="false" x="305" y="220" width="100%" height="100%" text="Not yet implemented." borderThickness="0" borderStyle="none"/>
</mx:VBox>
<mx:VBox label="Info" width="100%" height="100%">
<mx:Text text="Text" id="infoText"/>
</mx:VBox>
</mx:TabNavigator>
</mx:VDividedBox>
</mx:Panel>
</mx:HDividedBox>
</mx:Application>