package data
{
import events.LoginEvent;
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import mx.binding.utils.BindingUtils;
import mx.collections.XMLListCollection;
import mx.controls.Alert;
import mx.core.Application;
import mx.events.CollectionEvent;
import mx.managers.PopUpManager;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.http.HTTPService;
import panels.ServerLoginPanel;
[Event(name="ready")]
[Event(name="serverCacheDropped")]
public class DataSource extends EventDispatcher
{
[Bindable]
public var contextTree:XMLList;
[Bindable]
public var serverProps:XMLList;
[Bindable]
public var guiTree:XMLList;
[Bindable]
public var guiConfigs:XMLList;
[Bindable]
public var defaultConfig:XMLList;
private var layerProps:XMLListCollection = new XMLListCollection();
private var contextProps:XMLListCollection = new XMLListCollection();
private var mapProps:XMLListCollection = new XMLListCollection();
private var queryAspectProps:XMLListCollection = new XMLListCollection();
private var templateProps:XMLListCollection = new XMLListCollection();
private var reportProps:XMLListCollection = new XMLListCollection();
private var colorProps:XMLListCollection = new XMLListCollection();
private var lastId:Number = 0;
private var _serverUrl:String;
private var _proxyServerUrl:String;
private var _login:String;
private var _configsUrl:String;
private var _defaultConfigUrl:String;
private var getRequestCounter:Number;
namespace wfs = "http://www.opengis.net/wfs";
namespace xsd = "http://www.w3.org/2001/XMLSchema";
use namespace wfs;
use namespace xsd;
private function getRequestCompleted():void
{
getRequestCounter--;
if(getRequestCounter == 0)
{
buildGUIDataSource();
dispatchEvent(new Event("ready"));
}
}
private function buildGUIDataSource():void{
var tree:XML = ;
for(var i:Number=0;i 0){
colorNodes[j] = guiConfig.Colors.child(colorName)[0];
}
}
newConfig.ButtonBars = guiConfig.ButtonBars;
var buttonNodes:XMLList = newConfig.ActionButtons.children();
buttonNodes += newConfig.PaneButtons.children();
buttonNodes += newConfig.MapViewerButtons.children();
var orgButtonNodes:XMLList = guiConfig.ActionButtons.children();
orgButtonNodes += guiConfig.PaneButtons.children();
orgButtonNodes += guiConfig.MapViewerButtons.children();
for(var j:Number=0;j 0) {
treePutRequestCounter++;
var contextTreePutter:URLLoader = new URLLoader();
contextTreePutter.addEventListener(Event.COMPLETE, function():void
{
var response:XML = XML(contextTreePutter.data);
if(response.localName() == "Error")
{
Alert.show("Coulnd't store context map tree"
+ "\n" + response.ErrorMessage);
}
else
{
treePutRequestCompleted();
}
});
removeDeleted(contextTree.Context);
var contextTreePutRequest:URLRequest
= new URLRequest(_serverUrl + "request=PutContextsTree");
contextTreePutRequest.method = "POST";
contextTreePutRequest.data = "" +
contextTree.toString();
contextTreePutter.load(contextTreePutRequest);
}
if(treePutRequestCounter == 0) {
treePutRequestCounter++;
treePutRequestCompleted();
}
});
proxyReload.load(new URLRequest(this._proxyServerUrl + "/?service=reload"));
}
public function logout(callback:Function):void {
var logoutLoader:URLLoader = new URLLoader();
logoutLoader.addEventListener(Event.COMPLETE, function():void
{
callback();
});
logoutLoader.load(new URLRequest(_serverUrl + "request=Logout"));
}
private function loadData():void {
getRequestCounter = 10;
var contextTreeLoader:URLLoader = new URLLoader();
contextTreeLoader.addEventListener(Event.COMPLETE, function():void
{
contextTree = new XMLList(XML(contextTreeLoader.data));
getRequestCompleted();
});
contextTreeLoader.load(new URLRequest(_serverUrl + "request=GetContextsTree"));
var layerPropsLoader:URLLoader = new URLLoader();
layerPropsLoader.addEventListener(Event.COMPLETE, function():void
{
layerProps.source = new XMLList(XML(layerPropsLoader.data));
getRequestCompleted();
});
layerPropsLoader.load(new URLRequest(_serverUrl + "request=GetLayers"));
var contextPropsLoader:URLLoader = new URLLoader();
contextPropsLoader.addEventListener(Event.COMPLETE, function():void
{
contextProps.source = new XMLList(XML(contextPropsLoader.data));
getRequestCompleted();
});
contextPropsLoader.load(new URLRequest(_serverUrl + "request=GetContexts"));
var mapPropsLoader:URLLoader = new URLLoader();
mapPropsLoader.addEventListener(Event.COMPLETE, function():void
{
mapProps.source = new XMLList(XML(mapPropsLoader.data));
getRequestCompleted();
});
mapPropsLoader.load(new URLRequest(_serverUrl + "request=GetMaps"));
var serverPropsLoader:URLLoader = new URLLoader();
serverPropsLoader.addEventListener(Event.COMPLETE, function():void
{
serverProps = new XMLList(XML(serverPropsLoader.data));
getRequestCompleted();
});
serverPropsLoader.load(new URLRequest(_serverUrl + "request=GetServers"));
var queryAspectsPropsLoader:URLLoader = new URLLoader();
queryAspectsPropsLoader.addEventListener(Event.COMPLETE, function():void
{
queryAspectProps.source = new XMLList(XML(queryAspectsPropsLoader.data));
getRequestCompleted();
});
queryAspectsPropsLoader.load(new URLRequest(_serverUrl + "request=GetQueryAspects"));
var templatesPropsLoader:URLLoader = new URLLoader();
templatesPropsLoader.addEventListener(Event.COMPLETE, function():void
{
templateProps.source = new XMLList(XML(templatesPropsLoader.data));
getRequestCompleted();
});
templatesPropsLoader.load(new URLRequest(_serverUrl + "request=GetTemplates"));
var reportsPropsLoader:URLLoader = new URLLoader();
reportsPropsLoader.addEventListener(Event.COMPLETE, function():void
{
reportProps.source = new XMLList(XML(reportsPropsLoader.data));
getRequestCompleted();
});
reportsPropsLoader.load(new URLRequest(_serverUrl + "request=GetReports"));
var configsLoader:URLLoader = new URLLoader();
configsLoader.addEventListener(Event.COMPLETE, function():void
{
guiConfigs = XMLList(configsLoader.data).children();
getRequestCompleted();
});
configsLoader.load(new URLRequest(_configsUrl + "?author=" + _login));
var defaultConfigLoader:URLLoader = new URLLoader();
defaultConfigLoader.addEventListener(Event.COMPLETE, function():void
{
defaultConfig =XMLList(defaultConfigLoader.data);
getRequestCompleted();
});
defaultConfigLoader.load(new URLRequest(_defaultConfigUrl));
}
public function DataSource(callback:Function)
{
var configLoader:URLLoader = new URLLoader();
configLoader.addEventListener(Event.COMPLETE, function():void
{
_serverUrl = XML(configLoader.data).server.toString();
_proxyServerUrl = XML(configLoader.data).proxyServer.toString();
_configsUrl = XML(configLoader.data).guiConfigsUrl.toString();
_defaultConfigUrl = XML(configLoader.data).defaultGUIConfigUrl.toString();
var getAuthorRequest:URLLoader = new URLLoader();
getAuthorRequest.addEventListener(IOErrorEvent.IO_ERROR, function():void {
dispatchEvent(new Event("ioError"));
});
getAuthorRequest.addEventListener(Event.COMPLETE, function():void
{
var response:XML = XML(getAuthorRequest.data);
_login = response.Name.toString();
callback();
loadData();
});
getAuthorRequest.load(new URLRequest(_serverUrl + "request=GetAuthor"));
});
configLoader.load(new URLRequest("config.xml"));
}
public function getLayers(mapItem:XML):XMLList
{
if(mapItem.child("@clientId").length() > 0 && mapItem.@clientId == true) {
return contextTree.Context.Maps.Map.(child("@clientId").length() > 0 && @clientId == true && @id == mapItem.@id).Layers
}
else {
return contextTree.Context.Maps.Map.((child("@clientId").length() == 0 || @clientId == false) && @id == mapItem.@id).Layers
}
}
private function getMaps(contextItem:XML):XMLList
{
if(contextItem.child("@clientId").length() > 0 && contextItem.@clientId == true) {
return contextTree.Context.(child("@clientId").length() > 0 && @clientId == true && @id == contextItem.@id).Maps;
}
else {
return contextTree.Context.((child("@clientId").length() == 0 || @clientId == false) && @id == contextItem.@id).Maps;
}
}
public function getQueryAspects(mapItem:XML):XMLList
{
if(mapItem.child("@clientId").length() > 0 && mapItem.@clientId == true) {
return contextTree.Context.Maps.Map.(child("@clientId").length() > 0 && @clientId == true && @id == mapItem.@id).QueryAspects
} else {
return contextTree.Context.Maps.Map.((child("@clientId").length() == 0 || @clientId == false) && @id == mapItem.@id).QueryAspects
}
}
public function getTemplates(mapItem:XML):XMLList
{
if(mapItem.child("@clientId").length() > 0 && mapItem.@clientId == true) {
return contextTree.Context.Maps.Map.(child("@clientId").length() > 0 && @clientId == true && @id == mapItem.@id).Templates
} else {
return contextTree.Context.Maps.Map.((child("@clientId").length() == 0 || @clientId == false) && @id == mapItem.@id).Templates
}
}
public function getProps(item:XML):XMLList
{
if(item == null)
return null;
if(item.localName() == "Featureserver") {
item = item.copy();
item.setLocalName("Server");
}
var list:XMLList;
var clientId:Boolean = false;
if(item.attribute("clientId").length() > 0)
{
clientId = item.@clientId.toString().
toLocaleLowerCase() == "true" ? true : false;
}
switch(item.localName())
{
case "Context":
list = contextProps.source;
break;
case "Map":
list = mapProps.source;
break;
case "Server":
list = serverProps;
break;
case "Layer":
list = layerProps.source;
break;
case "QueryAspect":
list = queryAspectProps.source;
break;
case "Template":
list = templateProps.source;
break;
case "Report":
list = reportProps.source;
break;
case "Colors":
list = colorProps.source;
break;
}
if(list == null)
return null;
for each(var currentItem:XML in list.child(item.localName()))
{
var currentClientId:Boolean = false;
if(currentItem.attribute("clientId").length() > 0)
{
currentClientId = currentItem.@clientId.toString().
toLocaleLowerCase() == "true" ? true : false;
}
if(currentClientId == clientId
&& currentItem.@id == item.@id)
{
return new XMLList(currentItem);
}
}
return new XMLList();
}
public function getXMLAsString():String
{
return "\nlayerProps:\n" + layerProps.toString()
+ "\nmapProps:\n" + mapProps.toString()
+ "\ncontextTree:\n" + contextTree.toString()
+ "\ncontextProps:\n" + contextProps.toString()
+ "\nserverProps:\n" + serverProps.toString()
+ "\nqueryAspectProps:\n" + queryAspectProps.toString()
+ "\ntemplateProps:\n" + templateProps.toString();
}
public function isGroupLayer(layerItem:XML):Boolean
{
return getProps(layerItem).Type == "Group";
}
public function isOwner(item:XML):Boolean
{
var props:XML = item.child("Owner").length() == 0 ? getProps(item)[0] : item;
if(props != null && props.Owner.length() > 0) {
return props.Owner == _login;
}
return false;
}
private function isClientId(item:XML):Boolean {
return item.child("@clientId").length() > 0 && item.@clientId;
}
public function duplicateItem(item:XML):XML {
var newItem:XML = item.copy();
newItem.@clientId = true;
newItem.@id = lastId++;
newItem.@status = "new";
if(item.localName() == "Server") {
newItem.Title = item.Title + "_copy";
} else {
newItem.Name = item.Name + "_copy";
}
addItem(newItem);
//Copy subitem refs
switch(item.localName()) {
case 'Map':
for each(var map:XML in contextTree.Context.Maps.Map)
{
if(isClientId(map) == isClientId(item) && map.@id == item.@id) {
var dupRef:XML = map.copy();
dupRef.@id = newItem.@id;
dupRef.@clientId = true;
XML(map.parent()).appendChild(dupRef);
}
}
break;
case 'Context':
for each(var context:XML in contextTree.Context)
{
if(isClientId(context) == isClientId(item) && context.@id == item.@id) {
dupRef = context.copy();
dupRef.@id = newItem.@id;
dupRef.@clientId = true;
XML(context.parent()).appendChild(dupRef);
}
}
}
return newItem;
}
public function duplicateItemRef(itemRef:XML):XML
{
var item:XMLList = getProps(itemRef);
var newItem:XML = duplicateItem(item[0]);
return newRef(newItem);
}
private function updateLayerTree(layers:XMLList):void {
for each(var layer:XML in layers) {
if(isGroupLayer(layer)) {
layer.setChildren(getProps(layer).Layers.Layer.copy());
updateLayerTree(layer.Layer);
}
}
}
public function newRef(item:XML):XML
{
var itemRef:XML = new XML("<" + item.localName()
+ ">" + item.localName() + ">");
itemRef.@status = item.@status;
itemRef.@id = item.@id;
if(item.attribute("clientId").length() > 0)
{
itemRef.@clientId = item.@clientId;
}
if(item.localName() == "Map") {
itemRef.appendChild(item.Layers.copy());
updateLayerTree(itemRef.Layers.Layer);
itemRef.appendChild(item.QueryAspects.copy());
itemRef.appendChild(item.Templates.copy());
itemRef.appendChild(item.Reports.copy());
} else if(item.localName() == "Context") {
itemRef.appendChild();
} else if(item.localName() == "Layer") {
for each(var layer:XML in item.Layers.Layer) {
itemRef.appendChild(layer.copy());
}
}
return itemRef;
}
public function newLayer():XML
{
var newItem:XML =
Layer
en
nl
de
;
newItem.@id = lastId++;
newItem.Owner = _login;
newItem.Server.@id = serverProps.Server[0].@id;
return newItem;
}
public function newGroupLayer():XML
{
var newItem:XML =
Group
en
nl
de
;
newItem.@id = lastId++;
newItem.Owner = _login;
return newItem;
}
public function newMap():XML
{
var newItem:XML =
;
newItem.@id = lastId++;
newItem.Owner = _login;
return newItem;
}
public function newServer():XML
{
var newItem:XML =
;
newItem.@id = lastId++;
newItem.Owner = _login;
return newItem;
}
public function newQueryAspect():XML
{
var newItem:XML =
en
nl
de
;
newItem.@id = lastId++;
newItem.Owner = _login;
return newItem;
}
public function newTemplate():XML
{
var newItem:XML =
en
nl
de
10
10
10
10
map
0
0
0
0
;
newItem.@id = lastId++;
newItem.Owner = _login;
return newItem;
}
public function newReport(mapId:Number):XML
{
var newItem:XML =
en
nl
de
{mapId}
newItem.@id = lastId++;
return newItem;
}
public function newContext():XML
{
var newItem:XML =
newItem.@id = lastId++;
newItem.Owner = _login;
return newItem;
}
public function addItem(newItem:XML):void
{
switch(newItem.localName())
{
case 'Layer':
XML(layerProps[0]).appendChild(newItem);
break;
case 'Map':
XML(mapProps[0]).appendChild(newItem);
break;
case 'Server':
XML(serverProps[0]).appendChild(newItem);
break;
case 'Context':
XML(contextProps[0]).appendChild(newItem);
break;
case 'QueryAspect':
XML(queryAspectProps[0]).appendChild(newItem);
case 'Template':
XML(templateProps[0]).appendChild(newItem);
case 'Report':
XML(reportProps[0]).appendChild(newItem);
}
}
private function replaceClientId(clientId:Number, serverId:Number,
items:XMLList, recursive:Boolean = true):void
{
var newItems:XMLList = items.(@status == "new").(@id == clientId);
for each(var item:XML in newItems)
{
delete item.@clientId;
item.@id = serverId;
item.@status = "existing";
}
if(recursive)
{
for each(item in items)
{
replaceClientId(clientId, serverId, item.children());
}
}
}
private function removeDeleted(items:XMLList):void
{
for each(var item:XML in items)
{
if(item.attribute("status").length() > 0)
{
if(item.@status == "deleted")
{
delete items.(@id == item.@id && @status == "deleted")[0];
continue;
}
}
removeDeleted(item.children());
}
}
private function setLayerId(list:XMLList, clientId:String, serverId:String):void {
for each(var layerRef:XML in list..Layer.
(attribute("clientId").length() > 0
&& @clientId.toString().toLowerCase() == "true"
&& @id == clientId)) {
layerRef.@id = serverId;
delete layerRef.@clientId;
layerRef.@status = "existing";
}
}
private function setMapId(list:XMLList, clientId:String, serverId:String):void {
for each(var mapRef:XML in list..Map.
(attribute("clientId").length() > 0
&& @clientId.toString().toLowerCase() == "true"
&& @id == clientId)) {
mapRef.@id = serverId;
delete mapRef.@clientId;
mapRef.@status = "existing";
}
}
private function setContextId(list:XMLList, clientId:String, serverId:String):void {
for each(var contextRef:XML in list..Context.
(attribute("clientId").length() > 0
&& @clientId.toString().toLowerCase() == "true"
&& @id == clientId)) {
contextRef.@id = serverId;
delete contextRef.@clientId;
contextRef.@status = "existing";
}
}
private function setTemplateId(list:XMLList, clientId:String, templateId:String):void {
for each(var templateRef:XML in list..Template.
(attribute("clientId").length() > 0
&& @clientId.toString().toLowerCase() == "true"
&& @id == clientId)) {
templateRef.@id = templateId;
delete templateRef.@clientId;
templateRef.@status = "existing";
}
}
private function setReportId(list:XMLList, clientId:String, reportId:String):void {
for each(var reportRef:XML in list..Report.
(attribute("clientId").length() > 0
&& @clientId.toString().toLowerCase() == "true"
&& @id == clientId)) {
reportRef.@id = reportId;
delete reportRef.@clientId;
reportRef.@status = "existing";
}
}
private function setQueryAspectId(list:XMLList, clientId:String, serverId:String):void {
for each(var queryAspectRef:XML in list..QueryAspect.
(attribute("clientId").length() > 0
&& @clientId.toString().toLowerCase() == "true"
&& @id == clientId)) {
queryAspectRef.@id = serverId;
delete queryAspectRef.@clientId;
queryAspectRef.@status = "existing";
}
}
private function setServerId(list:XMLList, clientId:String, serverId:String):void {
for each(var server:XML in list..Server.
(attribute("clientId").length() > 0
&& @clientId.toString().toLowerCase() == "true"
&& @id == clientId)) {
server.@id = serverId;
delete server.@clientId;
server.@status = 'existing';
}
for each(server in list..Featureserver.
(attribute("clientId").length() > 0
&& @clientId.toString().toLowerCase() == "true"
&& @id == clientId)) {
server.@id = serverId;
delete server.@clientId;
server.@status = 'existing';
}
}
public function save():void {
var updateServers:XMLList = serverProps.Server.(@status != "existing");
if(updateServers.length() > 0)
{
var serverPutter:URLLoader = new URLLoader();
serverPutter.addEventListener(Event.COMPLETE, function():void
{
var response:XML = XML(serverPutter.data);
if(XML(response).localName() == "Error")
{
Alert.show("Couldn't store server properties!"
+ "\n" + response.ErrorMessage);
}
else
{
for each(var server:XML in response.Server)
{
setServerId(contextProps.source, server.@clientId, server.@Id);
setServerId(layerProps.source, server.@clientId, server.@Id);
setServerId(queryAspectProps.source, server.@clientId, server.@Id);
setServerId(serverProps, server.@clientId, server.@Id);
}
for each(server in serverProps.child("Server").(@status == 'changed'))
{
server.@status = 'existing';
}
removeDeleted(serverProps);
saveNewChangedEntities();
}
});
var serverPutRequest:URLRequest = new URLRequest(_serverUrl + "request=PutServers");
serverPutRequest.method = "POST";
serverPutRequest.data = "" + .appendChild(
updateServers.copy()).toString();
serverPutter.load(serverPutRequest);
} else {
saveNewChangedEntities();
}
}
private function putMaps(maps:XMLList, callback:Function):void {
if(maps.length() == 0) {
callback();
} else {
var mapPutter:URLLoader = new URLLoader();
mapPutter.addEventListener(Event.COMPLETE, function():void
{
var response:XML = XML(mapPutter.data);
if(XML(response).localName() == "Error")
{
Alert.show("Couldn't store map properties!"
+ "\n" + response.ErrorMessage);
}
else
{
for each(var map:XML in response.Map)
{
setMapId(contextTree, map.@clientId, map.@Id);
setMapId(mapProps.source, map.@clientId, map.@Id);
}
for each(map in mapProps.child("Map").(@status == 'changed'))
{
map.@status = 'existing';
}
callback();
}
});
var mapPutRequest:URLRequest = new URLRequest(_serverUrl + "request=PutMaps");
mapPutRequest.method = "POST";
mapPutRequest.data = "" + .appendChild(
maps.copy()).toString();
mapPutter.load(mapPutRequest);
}
}
private function putLayers(layers:XMLList, callback:Function):void {
if(layers.length() == 0) {
callback();
} else {
var layerPutter:URLLoader = new URLLoader();
layerPutter.addEventListener(Event.COMPLETE, function():void
{
var response:XML = XML(layerPutter.data);
if(XML(response).localName() == "Error")
{
Alert.show("Coulnd't store layer properties!"
+ "\n" + response.ErrorMessage);
}
else
{
for each(var layer:XML in response.Layer)
{
setLayerId(contextTree, layer.@clientId, layer.@Id);
setLayerId(layerProps.source, layer.@clientId, layer.@Id);
var properties:XML = XML(layerProps.source.Layer.(@id == layer.@clientId && @status == 'new')[0])
properties.@id = layer.@Id;
delete properties.@clientId;
properties.@status = 'existing';
}
for each(layer in layerProps.child("Layer").(@status == 'changed'))
{
layer.@status = 'existing';
}
callback();
}
});
var layerPutRequest:URLRequest = new URLRequest(_serverUrl + "request=PutLayers");
layerPutRequest.method = "POST";
layerPutRequest.data = "" + .appendChild(
layers.copy()).toString();
layerPutter.load(layerPutRequest);
}
}
private function putContexts(contexts:XMLList, callback:Function):void {
if(contexts.length() == 0) {
callback();
} else {
var contextPutter:URLLoader = new URLLoader();
contextPutter.addEventListener(Event.COMPLETE, function():void
{
var response:XML = XML(contextPutter.data);
if(XML(response).localName() == "Error")
{
Alert.show("Couldn't store context properties!"
+ "\n" + response.ErrorMessage);
}
else
{
for each(var context:XML in response.Context)
{
setContextId(contextTree, context.@clientId, context.@Id);
setContextId(contextProps.source, context.@clientId, context.@Id);
}
for each(context in contextProps.child("Context").(@status == 'changed'))
{
context.@status = 'existing';
}
callback();
}
});
var contextPutRequest:URLRequest = new URLRequest(_serverUrl + "request=PutContexts");
contextPutRequest.method = "POST";
contextPutRequest.data = "" + .appendChild(
contexts.copy()).toString();
contextPutter.load(contextPutRequest);
}
}
private function putQueryAspects(queryAspects:XMLList, callback:Function):void {
if(queryAspects.length() == 0) {
callback();
} else {
var queryAspectPutter:URLLoader = new URLLoader();
queryAspectPutter.addEventListener(Event.COMPLETE, function():void
{
var response:XML = XML(queryAspectPutter.data);
if(XML(response).localName() == "Error")
{
Alert.show("Couldn't store query aspect properties!"
+ "\n" + response.ErrorMessage);
}
else
{
for each(var queryAspect:XML in response.QueryAspect)
{
setQueryAspectId(contextTree, queryAspect.@clientId, queryAspect.@Id);
setQueryAspectId(queryAspectProps.source, queryAspect.@clientId, queryAspect.@Id);
}
for each(queryAspect in queryAspectProps.child("QueryAspect").(@status == 'changed'))
{
queryAspect.@status = 'existing';
}
callback();
}
});
var queryApsectPutRequest:URLRequest = new URLRequest(_serverUrl + "request=PutQueryAspects");
queryApsectPutRequest.method = "POST";
queryApsectPutRequest.data = "" + .appendChild(
queryAspects.copy()).toString();
queryAspectPutter.load(queryApsectPutRequest);
}
}
private function putTemplates(templates:XMLList, callback:Function):void {
if(templates.length() == 0) {
callback();
} else {
var templatePutter:URLLoader = new URLLoader();
templatePutter.addEventListener(Event.COMPLETE, function():void
{
var response:XML = XML(templatePutter.data);
if(XML(response).localName() == "Error")
{
Alert.show("Couldn't store template properties!"
+ "\n" + response.ErrorMessage);
}
else
{
for each(var template:XML in response.Template)
{
setTemplateId(templateProps.source, template.@clientId, template.@Id);
setTemplateId(contextTree, template.@clientId, template.@Id);
setTemplateId(mapProps.children(), template.@clientId, template.@Id);
}
for each(template in templateProps.child("Template").(@status == 'changed'))
{
template.@status = 'existing';
}
callback();
}
});
var templatePutRequest:URLRequest = new URLRequest(_serverUrl + "request=PutTemplates");
templatePutRequest.method = "POST";
templatePutRequest.data = "" + .appendChild(
templates.copy()).toString();
templatePutter.load(templatePutRequest);
}
}
private function putReports(reports:XMLList, callback:Function):void {
if(reports.length() == 0) {
callback();
} else {
var reportPutter:URLLoader = new URLLoader();
reportPutter.addEventListener(Event.COMPLETE, function():void
{
var response:XML = XML(reportPutter.data);
if(XML(response).localName() == "Error")
{
Alert.show("Couldn't store report properties!"
+ "\n" + response.ErrorMessage);
}
else
{
for each(var report:XML in response.Report)
{
setReportId(reportProps.source, report.@clientId, report.@Id);
setReportId(contextTree, report.@clientId, report.@Id);
}
for each(report in reportProps.child("Report").(@status == 'changed'))
{
report.@status = 'existing';
}
callback();
}
});
var reportPutRequest:URLRequest = new URLRequest(_serverUrl + "request=PutReports");
reportPutRequest.method = "POST";
reportPutRequest.data = "" + .appendChild(
reports.copy()).toString();
reportPutter.load(reportPutRequest);
}
}
public function saveNewChangedEntities():void
{
var updateTemplates:XMLList = templateProps.source.Template.(@status != "existing");
putTemplates(updateTemplates, function():void {
var updateQueryAspects:XMLList = queryAspectProps.source.QueryAspect.(@status != "existing");
putQueryAspects(updateQueryAspects, function():void {
var updateLayers:XMLList = layerProps.source.Layer.(@status != "existing");
putLayers(updateLayers, function():void {
var updateReports:XMLList = reportProps.source.Report;
putReports(updateReports, function():void {
var updateMaps:XMLList = mapProps.source.Map.(@status != "existing");
putMaps(updateMaps, function():void {
var updateContexts:XMLList = contextProps.source.Context.(@status != "existing");
putContexts(updateContexts, function():void {
finishSave();
});
});
});
});
});
});
}
public function hasChanges():Boolean {
return (XMLList(contextProps.source.Context.(@status != "existing"))
.length() > 0 ||
XMLList(serverProps.source.Server.(@status != "existing"))
.length() > 0 ||
XMLList(layerProps.source.Layer.(@status != "existing"))
.length() > 0 ||
XMLList(mapProps.source.Map.(@status != "existing"))
.length() > 0);
}
public function addCollectionsEventListener(listener:Function):void
{
layerProps.addEventListener(CollectionEvent.COLLECTION_CHANGE, listener);
contextProps.addEventListener(CollectionEvent.COLLECTION_CHANGE, listener);
mapProps.addEventListener(CollectionEvent.COLLECTION_CHANGE, listener);
queryAspectProps.addEventListener(CollectionEvent.COLLECTION_CHANGE, listener);
templateProps.addEventListener(CollectionEvent.COLLECTION_CHANGE, listener);
reportProps.addEventListener(CollectionEvent.COLLECTION_CHANGE, listener);
}
private var clientCapabilities:Object = new Object();
private var serverCapabilities:Object = new Object();
private function doGetCapabilitiesRequest(server:XML, retServer:Server):void {
var serverProps:XML = getProps(server)[0];
var service:HTTPService = new HTTPService();
service.url = getCapabilitiesUrl(serverProps, retServer);
service.resultFormat = "e4x";
service.addEventListener(FaultEvent.FAULT, function(event:FaultEvent):void {
Alert.show(event.toString());
});
service.addEventListener(ResultEvent.RESULT, function():void {
var result:XMLList = XMLList(service.lastResult);
var serviceType:String = serverProps.Service.toString();
retServer.capabilities.source = result;
retServer.layers.source = getServerLayersFromResponse(
result, serviceType);
if(serviceType == "OGC:WFS") {
retServer.featureTypes.source = result.FeatureTypeList.FeatureType.copy();
for each(var type:XML in result.FeatureTypeList.FeatureType) {
var name:String = type.Name;
var uri:String = null;
if(name.indexOf(":") != -1) {
var prefix:String = name.split(":")[0];
name = name.split(":")[1];
uri = type.namespace(prefix);
}
var list:XMLListCollection =
retServer.getFeatureTypeAttributes(new QName(uri, name));
doDescribeFeatureRequest(serverProps, uri, name, list);
}
} else if(serviceType == "GI") {
retServer.featureTypes.source = result.FeatureTypesLocalWFSClient.FeatureType.copy();
for each(type in result.FeatureTypesLocalWFSClient.FeatureType) {
name = type.toString();
uri = null;
if(name.indexOf(":") != -1) {
prefix = name.split(":")[0];
name = name.split(":")[1];
uri = type.namespace(prefix);
}
list =
retServer.getFeatureTypeAttributes(new QName(uri, name));
doDescribeFeatureRequest(serverProps, uri, name, list);
}
}
retServer.featureTypesEmptyItem.source =
+ retServer.featureTypes.source.copy();
if(serviceType == "GI") {
for each(var layer:XML in retServer.capabilities.source.Layer) {
name = layer.FeatureType;
uri = null;
if(name.indexOf(":") != -1) {
prefix = name.split(":")[0];
name = name.split(":")[1];
uri = layer.FeatureType.namespace(prefix);
}
list = retServer.getLayerFeatureTypeAttributes(layer.Name.toString());
doDescribeFeatureRequest(serverProps, uri, name, list);
retServer.layerFeatureTypes[layer.Name] = layer.FeatureType[0];
}
}
});
service.send();
}
private function getCapabilities(server:XML, forceLoad:Boolean = false):Server {
var clientId:Boolean = false;
if(server.child("@clientId").length() > 0) {
clientId = server.@clientId == "true";
}
var retServer:Server;
if(!forceLoad) {
retServer = clientId ?
clientCapabilities["" + server.@id] :
serverCapabilities["" + server.@id];
if(retServer != null) {
return retServer;
}
}
retServer = new Server();
if(clientId) {
clientCapabilities["" + server.@id] = retServer;
} else {
serverCapabilities["" + server.@id] = retServer;
}
var serverProps:XML = getProps(server)[0];
if(serverProps.child("Security").length() > 0
&& serverProps.Security != "none"
&& XML(serverProps.Security[0]).children().length() != 0) {
var serverLoginPanel:ServerLoginPanel = new ServerLoginPanel();
PopUpManager.addPopUp(serverLoginPanel, DisplayObject(Application.application), true);
BindingUtils.bindProperty(serverLoginPanel, "maxHeight", Application.application, "height");
BindingUtils.bindProperty(serverLoginPanel, "maxWidth", Application.application, "width");
BindingUtils.bindSetter(function():void {
PopUpManager.centerPopUp(serverLoginPanel);
}, mx.core.Application.application, "height");
BindingUtils.bindSetter(function():void {
PopUpManager.centerPopUp(serverLoginPanel);
}, mx.core.Application.application, "width");
PopUpManager.centerPopUp(serverLoginPanel);
serverLoginPanel.loginHeading = serverProps.Title;
serverLoginPanel.addEventListener(LoginEvent.LOGIN,
function(event:LoginEvent):void {
PopUpManager.removePopUp(serverLoginPanel);
retServer.user = event.login;
retServer.password = event.password;
doGetCapabilitiesRequest(serverProps, retServer);
});
} else {
doGetCapabilitiesRequest(serverProps, retServer);
}
return retServer;
}
public function getServerLayers(server:XML, forceLoad:Boolean = false):XMLListCollection {
return getCapabilities(server, forceLoad).layers;
}
public function getFeatureTypes(server:XML, forceLoad:Boolean = false, emptyItem:Boolean = true):XMLListCollection {
if(emptyItem) {
return getCapabilities(server, forceLoad).featureTypesEmptyItem;
} else {
return getCapabilities(server, forceLoad).featureTypes;
}
}
public function getFeatureTypeAttributes(server:XML, featureType:XML, forceLoad:Boolean = false):XMLListCollection {
if(featureType == null || server == null) {
return null;
}
var serverProps:XML = getProps(server)[0];
var name:String = null;
if(serverProps.Service == "OGC:WFS") {
name = featureType.Name;
} else if(serverProps.Service == "GI") {
name = featureType.children()[0];
}
var uri:String = null;
if(name.indexOf(":") != -1) {
uri = featureType.namespace(name.split(":")[0]);
name = name.split(":")[1];
}
var serverObj:Server = getCapabilities(server, forceLoad);
return serverObj.getFeatureTypeAttributes(new QName(uri, name), forceLoad);
}
private function getCapabilitiesUrl(server:XML, retServer:Server):String {
var url:String = "";
switch(server.Service.toString()) {
case "GI":
url = server.Onlineresource.toString() + "request=GetCapabilities";
break;
case "OGC:WMS":
url = server.Onlineresource.toString() + "service=WMS&request=GetCapabilities&version=" + server.Version.toString();
break;
case "OGC:WFS":
url = server.Onlineresource.toString() + "service=WFS&request=GetCapabilities&version=" + server.Version.toString();
}
if(server.child("Proxy").length() > 0
&& server.Proxy.toString() == "t") {
url = this._proxyServerUrl + "/"
+ url.split("//")[1];
}
if(server.child("Security").length() > 0) {
switch(server.Security.toString()) {
case "ows":
url += "&user=" + retServer.user + "&password=" + retServer.password;
}
}
return url;
}
private function removeNameless(layers:XMLList):XMLList {
return layers.(child("Name").length() > 0);
}
private function flattenLayerList(rootLayer:XML):XMLList {
var list:XMLList = new XMLList();
XML(list[0]).appendChild(rootLayer.copy()[0]);
var subLayers:XMLList = rootLayer.Layer.copy();
delete list.Layer.Layer;
for each(var layer:XML in subLayers) {
for each(var subLayer:XML in flattenLayerList(layer)) {
XML(list[0]).appendChild(subLayer);
}
}
return list.children();
}
private function getServerLayersFromResponse(serverResponse:XMLList, service:String):XMLList {
switch(service) {
case "GI":
return serverResponse.Layer;
case "OGC:WMS":
return removeNameless(
flattenLayerList(serverResponse.Capability.Layer[0]));
}
return null;
}
private function getFeatureTypeNamesFromResponse(serverResponse:XMLList, server:XML):Array {
var names:Array = new Array();
var serviceType:String = server.Service;
if(serviceType == "OGC:WFS") {
for each(var type:XML in serverResponse.FeatureTypeList.FeatureType) {
var name:String = type.Name;
var uri:String = null;
if(name.indexOf(":") != -1) {
var prefix:String = name.split(":")[0];
name = name.split(":")[1];
uri = type.namespace(prefix);
}
var list:XMLListCollection = new XMLListCollection();
doDescribeFeatureRequest(server, uri, name, list);
names.push([new QName(uri, name), list]);
}
} else if(serviceType == "GI") {
}
return names;
}
private function doDescribeFeatureRequest(server:XML, uri:String, name:String, list:XMLListCollection):void {
var service:HTTPService = new HTTPService();
service.url = server.Onlineresource.toString() + "service=WFS&version=1.1.0&request=DescribeFeatureType"
+ "&typeName=" + (uri ? "pref:" : "") + name;
if(uri != null) {
service.url += "&namespace=xmlns(" +
"pref=" + uri + ")";
}
service.resultFormat = "e4x";
service.addEventListener(ResultEvent.RESULT, function(event:ResultEvent):void
{
var result:XMLList = XMLList(service.lastResult);
var typeName:String = result.element.(@name == name).@type;
var prefix:String = "";
var nspace:String = "";
if(typeName.indexOf(":") != -1) {
var parts:Array = typeName.split(":");
if(result.namespace(parts[0]) == result.@targetNamespace) {
typeName = parts[1];
}
prefix = parts[0];
nspace = parts[1];
}
var complexType:XMLList = result.complexType.(@name == typeName);
var elements:XMLList = new XMLList();
elements.elements += complexType..element;
elements.@prefix = prefix;
elements.@nspace = nspace;
list.source = elements.element;
});
service.send();
}
public function getLayerFeatureTypeAttributes(server:XML, layer:String, forceLoad:Boolean = false):XMLListCollection {
return getCapabilities(server, forceLoad).getLayerFeatureTypeAttributes(layer);
}
public function getFeatureTypeForQueryLayer(layer:XML, server:XML, forceLoad:Boolean = false):XML {
var serverProps:XML = getProps(server)[0];
if(serverProps.Service == "OGC:WFS") {
return layer;
} else if(serverProps.Service == "GI") {
return getCapabilities(server, forceLoad).layerFeatureTypes[layer.Name];
}
return null;
}
public function getQueryLayers(server:XML, forceLoad:Boolean = false):XMLListCollection {
if(server == null) {
return null;
}
var serverProps:XML = getProps(server)[0];
if(serverProps.Service == "GI") {
return getServerLayers(server, forceLoad);
} else if(serverProps.Service == "OGC:WFS") {
return getFeatureTypes(server, forceLoad, false);
}
return null;
}
private function getServerVersion(version:XMLList, position:Number):Number {
var str:String = version.toString();
var index:Number = -1;
for(var i:Number = 0; i < position; i++) {
index = str.indexOf(".", index + 1);
}
var end:Number = str.indexOf(".", index + 1);
if(end == -1) {
str = str.substr(index + 1);
} else {
str = str.substring(index + 1, end);
}
return Number(str);
}
public function getTransformationServers():XMLList {
return serverProps.Server.(Service == "GI")
.(getServerVersion(Version, 0) == 3);
}
public function getMapServers():XMLList {
return serverProps.Server
.(Service == "GI"
|| Service == "OGC:WMS");
}
public function getQueryServers(omitWfs:Boolean = false):XMLList {
return serverProps.Server
.(Service == "GI"
|| (Service == "OGC:WFS" && !omitWfs));
}
public function getFeatureServers():XMLList {
return serverProps.Server
.(Service == "OGC:WFS");
}
public function supportsFormats(server:XML):Boolean {
return getProps(server).Service == "OGC:WMS";
}
public function supportsSelections(server:XML):Boolean {
return getProps(server).Service == "GI";
}
public function isUnique(type:String, name:String, newElement:Boolean = false):Boolean {
var count:Number = newElement ? 0 : 1;
switch(type)
{
case 'Context':
return XMLList(contextProps.source.Context.(Name == name)).length() == count;
break;
case 'Layer':
return XMLList(layerProps.source.Layer.(Name == name)).length() == count;
break;
case 'QueryAspect':
return XMLList(queryAspectProps.source.QueryAspect.(Name == name)).length() == count;
break;
case 'Template':
return XMLList(templateProps.source.Template.(Name == name)).length() == count;
break
case 'Map':
return XMLList(mapProps.source.Map.(Name == name)).length() == count;
}
return true;
}
public function updateSameItem(item:XML):void {
if(item.localName() == "Layers"
|| item.localName() == "QueryAspects"
|| item.localName() == "Templates") { //Map item
for each(var map:XML in contextTree.Context.Maps.Map.(@id == Object(item).parent().@id)) {
if(map != item.parent()) {
map.setChildren(item.parent().children().copy());
}
}
} else if(item.localName() == "Layer") { //Grouplayer item
item = item.copy();
delete item..Layer.@name;
for each(var layer:XML in contextTree.Context.Maps.Map.Layers..Layer.(@id == item.@id)) {
if(layer != item) {
layer.setChildren(item.children().copy());
}
}
var props:XML = getProps(item)[0];
if(props.child("Layers").length() == 0) {
props.appendChild();
}
props.Layers.setChildren(item.Layer.copy());
props.@status = "changed";
}
if(item.localName() == "Templates") {
var parent:XML = getProps(item.parent())[0];
parent.Templates.setChildren(item.children().copy());
parent.@status = "changed";
}
}
public function getUnusedLayers(map:XML):XMLList {
var list:XMLList = layerProps.source.Layer.copy();
var usedLayers:XMLList = this.getLayers(map).copy();
for(var i:Number = 0; i < list.length(); i++) {
var clientId:Boolean = false;
if(XML(list[i]).attribute("clientId").length() > 0) {
clientId = list[i].@clientId;
}
for each(var currentLayer:XML in
(clientId ? (
usedLayers..Layer.(attribute("clientId").length() > 0 && @clientId == true))
: (
usedLayers..Layer.(attribute("clientId").length() == 0 || @clientId == false )) ) ) {
if(currentLayer.@id == list[i].@id) {
delete list[i];
i--;
}
}
}
return list;
}
public function getUnusedMaps(context:XML):XMLList {
var list:XMLList = mapProps.source.Map.copy();
var usedMaps:XMLList = this.getMaps(context).copy();
for(var i:Number = 0; i < list.length(); i++) {
var clientId:Boolean = false;
if(XML(list[i]).attribute("clientId").length() > 0) {
clientId = list[i].@clientId;
}
for each(var currentMap:XML in
(clientId ? (
usedMaps..Map.(attribute("clientId").length() > 0 && @clientId == true))
: (
usedMaps..Map.(attribute("clientId").length() == 0 || @clientId == false )) ) ) {
if(currentMap.@id == list[i].@id) {
delete list[i];
i--;
}
}
}
return list;
}
public function getUnusedQueryAspects(map:XML):XMLList {
var list:XMLList = queryAspectProps.source.QueryAspect.copy();
var usedQueryAspects:XMLList = this.getQueryAspects(map).copy();
for(var i:Number = 0; i < list.length(); i++) {
var clientId:Boolean = false;
if(XML(list[i]).attribute("clientId").length() > 0) {
clientId = list[i].@clientId;
}
for each(var currentQueryAspect:XML in
(clientId ? (
usedQueryAspects..QueryAspect.(attribute("clientId").length() > 0 && @clientId == true))
: (
usedQueryAspects..QueryAspect.(attribute("clientId").length() == 0 || @clientId == false )) ) ) {
if(currentQueryAspect.@id == list[i].@id) {
delete list[i];
i--;
}
}
}
return list;
}
public function getUnusedTemplates(map:XML):XMLList {
var list:XMLList = templateProps.source.Template.copy();
var usedTemplates:XMLList = this.getTemplates(map).copy();
for(var i:Number = 0; i < list.length(); i++) {
var clientId:Boolean = false;
if(XML(list[i]).attribute("clientId").length() > 0) {
clientId = list[i].@clientId;
}
for each(var currentTemplate:XML in
(clientId ? (
usedTemplates..Template.(attribute("clientId").length() > 0 && @clientId == true))
: (
usedTemplates..Template.(attribute("clientId").length() == 0 || @clientId == false )) ) ) {
if(currentTemplate.@id == list[i].@id) {
delete list[i];
i--;
}
}
}
return list;
}
public function dropServerCache(server:XML):void {
var clientId:Boolean = false;
if(server.child("@clientId").length() > 0) {
clientId = server.@clientId == "true";
}
if(clientId) {
clientCapabilities["" + server.@id] = null;
} else {
serverCapabilities["" + server.@id] = null;
}
//dispatchEvent(new Event("serverCacheDropped"));
}
public function isServerUsed(server:XML):Boolean {
if(server.localName() != "Server") {
return false;
}
var clientId:Boolean = false;
if(server.attribute("clientId").length() > 0) {
clientId = server.@clientId.toString().toLowerCase() == "true";
}
for each(var currentServer:XML in layerProps.source..Server) {
var currentClientId:Boolean = false;
if(currentServer.attribute("clientId").length() > 0) {
currentClientId = currentServer.@clientId.toString().toLowerCase() == "true";
}
if(currentClientId == clientId
&& currentServer.@id == server.@id) {
return true;
}
}
for each(currentServer in layerProps.source..Featureserver) {
currentClientId = false;
if(currentServer.attribute("clientId").length() > 0) {
currentClientId = currentServer.@clientId.toString().toLowerCase() == "true";
}
if(currentClientId == clientId
&& currentServer.@id == server.@id) {
return true;
}
}
for each(currentServer in queryAspectProps.source..Server) {
currentClientId = false;
if(currentServer.attribute("clientId").length() > 0) {
currentClientId = currentServer.@clientId.toString().toLowerCase() == "true";
}
if(currentClientId == clientId
&& currentServer.@id == server.@id) {
return true;
}
}
for each(currentServer in contextProps.source..Server) {
currentClientId = false;
if(currentServer.attribute("clientId").length() > 0) {
currentClientId = currentServer.@clientId.toString().toLowerCase() == "true";
}
if(currentClientId == clientId
&& currentServer.@id == server.@id) {
return true;
}
}
return false;
}
}
}