package data
{
import mx.collections.XMLListCollection;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.http.HTTPService;
import mx.controls.Alert;
import data.DataSource;
public class ServerInfo
{
namespace wfs = "http://www.opengis.net/wfs";
namespace xsd = "http://www.w3.org/2001/XMLSchema";
use namespace wfs;
use namespace xsd;
public var dataSource:DataSource;
private var clientCapabilities:Object = new Object();
private var serverCapabilities:Object = new Object();
private function getCapabilities(server:XML, forceLoad:Boolean = false):Server {
if(server == null || server.attribute("id").length() == 0 ||
server.attribute("clientId").length() == 0) {
return new Server();
}
var serverProps:XML = dataSource.getProps(server);
if(serverProps.@brief == 'true') {
return new Server();
}
var clientId:Boolean = 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;
}
doGetCapabilitiesRequest(serverProps, retServer);
return retServer;
}
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 = dataSource.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 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();
}
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 doGetCapabilitiesRequest(server:XML, retServer:Server):void {
var serverProps:XML = dataSource.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();
}
public function getServerLayers(server:XML, forceLoad:Boolean = false):XMLListCollection {
return getCapabilities(server, forceLoad).layers;
}
public function getFeatureTypeAttributes(server:XML, featureType:XML, forceLoad:Boolean = false):XMLListCollection {
if(featureType == null || server == null) {
return null;
}
var serverProps:XML = dataSource.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);
}
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;
}
}
}
}