/*---------------- FILE HEADER ---------------------------------------
This file is part of Geoide.
Copyright (C) 2005-2006 by:
IDgis B.V.
http://www.idgis.nl
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact:
Herman Assink
IDgis bv
P.O. Box 15
7450 AA Holten
The Netherlands
E-Mail: herman.assink@idgis.nl
* @version 1.4.0
* @author IDgis team
*
------------------------------------------------------------------------*/
import nl.idgis.giclient.util.XMLTools;
import nl.idgis.giclient.filterencoding.ComplexFilter;
import nl.idgis.giclient.framework.DialogFrame;
import nl.idgis.giclient.gis.Feature;
import nl.idgis.giclient.query.OperationViewer;
import nl.idgis.giclient.query.QueryAspect;
import nl.idgis.giclient.query.QueryAspectViewer;
import nl.idgis.giclient.synch.SynchSocket;
import nl.idgis.giclient.webserviceconnector.QueryConnector;
import nl.idgis.giclient.webserviceconnector.wfsconnector.Delete;
import nl.idgis.giclient.webserviceconnector.wfsconnector.DescribeFeatureType;
import nl.idgis.giclient.webserviceconnector.wfsconnector.FeatureType;
import nl.idgis.giclient.webserviceconnector.wfsconnector.GetFeature;
import nl.idgis.giclient.webserviceconnector.wfsconnector.Insert;
import nl.idgis.giclient.webserviceconnector.wfsconnector.Transaction;
import nl.idgis.giclient.webserviceconnector.wfsconnector.TransactionResponse;
import nl.idgis.giclient.webserviceconnector.wfsconnector.Update;
import nl.idgis.giclient.webserviceconnector.FeatureCollection;
import nl.idgis.giclient.query.QueryColumn;
import nl.idgis.giclient.io.XMLServer;
import nl.idgis.giclient.webserviceconnector.wfsconnector.WFSQueryResponse;
import nl.idgis.giclient.io.XMLResponseListener;
import nl.idgis.giclient.webserviceconnector.wfsconnector.FeaturesByFilterResponseHandler;
import nl.idgis.giclient.util.Strings;
import nl.idgis.giclient.framework.ModalFrameFactory;
class nl.idgis.giclient.webserviceconnector.wfsconnector.WFSConnector implements QueryConnector {
static private var instances:Array = new Array();
static function getInstance(url:String):WFSConnector {
var instance:WFSConnector = null;
for (var i:String in instances) {
instance = WFSConnector(instances[i]);
if (instance.getURL() == url) {
return instance;
}
}
instance = new WFSConnector(url);
instances.push(instance);
return instance;
}
private var url:String = null;
var dialogID:Number = 0;
function WFSConnector(url:String) {
if (url == null) {
// EXCEPTION
return;
}
this.url = url;
// performGetCapabilities(null);
}
function getURL():String {
return url;
}
/* function performGetCapabilities(synchListener:SynchListener):Void {
var requestString:String = "";
requestString += "\n";
requestString += "\n";
//request(null, null, synchListener);
}*/
function performDescribeFeatureType(featureTypeName:String, synchSocket:SynchSocket):Void {
var describeFeatureType:DescribeFeatureType = new DescribeFeatureType(featureTypeName);
request(describeFeatureType, processDescribeFeatureType, synchSocket);
}
function performGetFeature(featureTypeName:String, synchSocket:SynchSocket):Void {
/*var numFilterElements:Number = ((extent == null)? 0: 1) + ((whereClauses == null)? 0: whereClauses.length) + ((notWhereClause == null)? 0: 1);
if (numFilterElements > 0) {
requestString += " \n";
if (numFilterElements > 1) {
requestString += " \n";
}
if (extent != null) {
requestString += " \n";
requestString += " " + featureType.getGeometryColumnName() + "\n";
requestString += " \n";
requestString += " " + extent.getMinX() + " " + extent.getMinY() + "\n";
requestString += " " + extent.getMaxX() + " " + extent.getMaxY() + "\n";
requestString += " \n";
requestString += " \n";
}
if ((whereClauses != null) && (whereClauses.length > 0)) {
var whereClause:WhereClause = null;
for (var i:String in whereClauses) {
whereClause = WhereClause(whereClauses[i]);
requestString += " \n";
requestString += " " + whereClause.getColumnName() + "\n";
requestString += " " + whereClause.getValue() + "\n";
requestString += " \n";
}
}
if (notWhereClause != null) {
requestString += " \n";
requestString += " \n";
requestString += " " + notWhereClause.getColumnName() + "\n";
requestString += " " + notWhereClause.getValue() + "\n";
requestString += " \n";
requestString += " \n";
}
if (numFilterElements > 1) {
requestString += " \n";
}
requestString += " \n";
}*/
var getFeature:GetFeature = new GetFeature(featureTypeName);
request(getFeature, processGetFeature, synchSocket);
}
function performTransaction(features:Array, save:Boolean, synchSocket:SynchSocket, checkObj:Object, checkMethod:String):Void {
if (features == null) {
// EXCEPTION
return;
}
var transaction:Transaction = new Transaction();
var feature:Feature = null;
var editingStatus:Number = -1;
for (var i:Number = 0; i < features.length; i++) {
feature = Feature(features[i]);
editingStatus = features[i].editingStatus;
if (editingStatus == Feature.ADDED) {
transaction.addOperation(new Insert(feature));
} else if (editingStatus == Feature.CHANGED) {
transaction.addOperation(new Update(feature));
} else if (editingStatus == Feature.REMOVED) {
transaction.addOperation(new Delete(feature));
}
}
if (transaction.getOperations().length == 0) {
synchSocket.setSynchObjectValue("responseCode", "CANCELED");
synchSocket.invoke();
} else {
if (save) {
request(transaction, processTransaction, synchSocket);
} else {
var initObject:Object = new Object();
initObject["scrollContent"] = "lib://ConfirmationFrame";
initObject["paneTitle"] =
Strings.getFile("Geoide").getString("SaveChanges"); //"Bewerkingen opslaan";
initObject["isScrolling"] = false;
initObject["resizable"] = false;
initObject["hasShader"] = false;
initObject["doorzichtig"] = false;
initObject["_x"] = 100;
initObject["_y"] = 100;
initObject["contentProperties"] = new Object();
initObject["contentProperties"]["question"] =
Strings.getFile("Geoide").getString("SaveChangesQuestion", {layerTitle: feature.getLayer().getTitle()}); //"Wilt u de bewerkingen in kaartlaag\n\"" + feature.getLayer().getTitle() + "\"\nopslaan?";
initObject["contentProperties"]["synchSocket"] = new SynchSocket(this, onConfirm, {transaction: transaction, synchSocket: synchSocket, checkObj: checkObj, checkMethod: checkMethod});
//_root.frameWork.makeFrame("confirmationFrame" + dialogID++,initObject,200,100);
ModalFrameFactory.makeFrame(initObject, 200, 100);
}
}
}
function onConfirm(synchObject:Object):Void {
//var dialogFrame:MovieClip = DialogFrame(synchObject["dialogFrame"])._parent._parent;
var answer:Boolean = Boolean(synchObject["answer"]);
var transaction:Transaction = Transaction(synchObject["transaction"]);
var synchSocket:SynchSocket = SynchSocket(synchObject["synchSocket"]);
var checkObj:Object = synchObject["checkObj"];
var checkMethod:String = String(synchObject["checkMethod"]);
//dialogFrame.removeMovieClip();
ModalFrameFactory.removeFrame();
if (answer) {
if((checkObj == null || checkMethod == null) || checkObj[checkMethod]()) {
request(transaction, processTransaction, synchSocket);
}
else {
synchSocket.setSynchObjectValue("responseCode", "CHECKFAILED");
synchSocket.invoke();
}
} else {
synchSocket.setSynchObjectValue("responseCode", "CANCELED");
synchSocket.invoke();
}
}
function request(requestObject:Object, processMethod:Function, synchSocket:SynchSocket):Void {
var env:WFSConnector = this;
var responseXML:XML = new XML();
responseXML.ignoreWhite = true;
responseXML.onLoad = function(successful:Boolean):Void {
if (!successful) {
_root["frameWork"].state("Could not parse the response from the wfs connector at url \"" + env.url + "\".", 0);
_root["frameWork"].state(requestObject.toXML(), 1);
processMethod.call(env, requestObject, null, synchSocket);
} else if (this.firstChild.nodeName == "ServiceExceptionReport") {
var exceptionMessage:String = XMLTools.getStringValue("ServiceException", this.firstChild);
_root["frameWork"].state("The response from the wfs connector at url \"" + env.url + "\" was an exception. \n" + exceptionMessage, 0);
_root["frameWork"].state(requestObject.toXML(), 1);
processMethod.call(env, requestObject, null, synchSocket);
} else {
processMethod.call(env, requestObject, this, synchSocket);
}
};
var requestXML:XML = new XML(requestObject.toXML());
requestXML.xmlDecl = "\n";
requestXML.addRequestHeader("Content-Type", "text/xml;charset=utf-8");
requestXML.addRequestHeader("Accept", "text/xml");
requestXML.sendAndLoad(url, responseXML);
}
/*function processGetCapabilities(responseXML:XML, featureType:FeatureType, actionEventListener:SynchListener):Void {
}*/
function processDescribeFeatureType(requestObject:Object, responseXML:XML, synchSocket:SynchSocket):Void {
if (responseXML != null) {
var featureType:FeatureType = new FeatureType(responseXML.firstChild);
synchSocket.setSynchObjectValue("featureType", featureType);
}
synchSocket.invoke();
}
function processGetFeature(requestObject:Object, responseXML:XML, synchSocket:SynchSocket):Void {
if (responseXML != null) {
var featureCollection:FeatureCollection = new FeatureCollection(responseXML.firstChild);
synchSocket.setSynchObjectValue("featureCollection", featureCollection);
}
synchSocket.invoke();
}
function processTransaction(requestObject:Object, responseXML:XML, synchSocket:SynchSocket):Void {
var transactionResponse:TransactionResponse = new TransactionResponse(responseXML.firstChild);
if ((responseXML != null) && (transactionResponse.isSuccess())) {
synchSocket.setSynchObjectValue("responseCode", "SUCCEEDED");
synchSocket.setSynchObjectValue("ids", transactionResponse.getIds());
} else if (responseXML != null) {
trace("Transaction failed");
trace("responseXML = " + responseXML.toString());
synchSocket.setSynchObjectValue("responseCode", "FAILED");
} else {
synchSocket.setSynchObjectValue("responseCode", "FAILED");
}
synchSocket.invoke();
}
function getFeaturesByFilter(queryAspect:QueryAspect, serverParams:Object, responseHandler:Object, filter:ComplexFilter):Void {
//partly copied from GIConnector.getFeaturesByFilter()
//voeg responseHandler toe aan de serverParams
if(serverParams==null){
serverParams = new Object();
}
serverParams["responseHandler"] = responseHandler;
var xml:XML = null;
var xmlQueryString:String = createGetFeatureQuery("results", "pfx:" + queryAspect.getLayerName(), queryAspect.getNamespace(), null);
var queryParts:Array = xmlQueryString.split("$_DUMMY_FILTER_$");
//TODO
var xmlString:String = null;
if ( filter == null ) {
//trace("filter = null" );
xmlString = queryParts[0] + queryParts[1] ;
} else {
var filterXML:XML = filter.toXML("ftFiltering");
//trace("\n*~* FILTER *~* \n" + filterXML.toString());
xmlString = queryParts[0] + filterXML.toString() + queryParts[1] ;
}
//trace("**************************\n" + xmlString );
xml = new XML(xmlString);
xml.xmlDecl = ""; //TODO make encoding configurable
var xmlServer:XMLServer = new XMLServer(queryAspect.getServerURL());
var handler:XMLResponseListener = new FeaturesByFilterResponseHandler(queryAspect, this);
xmlServer.postAndLoad(xml, handler, "", serverParams);
}
function getItem(operationViewer:OperationViewer, queryAspectViewer:QueryAspectViewer):Void {
var xml:XML = null;
var filter:ComplexFilter = queryAspectViewer.getFilter();
var queryColumn:QueryColumn = operationViewer.queryColumn;
var xmlQueryString:String = createGetFeatureQuery("results", queryColumn.getOperandValueFT(), queryColumn.getOperandNamespace(),
queryColumn.getOperandLabelField());
var queryParts:Array = xmlQueryString.split("$_DUMMY_FILTER_$");
var xmlString:String = null;
if ( filter == null ) {
//trace("filter = null" );
xmlString = queryParts[0] + queryParts[1] ;
} else {
var filterXML:XML = filter.toXML("ftFiltering");
//trace("\n*** FILTER ***\n" + filterXML.toString());
xmlString = queryParts[0] + filterXML.toString() + queryParts[1] ;
}
//trace("**************************\n" + xmlString );
xml = new XML(xmlString);
xml.docTypeDecl = ""; //TODO make encoding configurable
var xmlServer:XMLServer = new XMLServer(queryAspectViewer.queryAspect.getServerURL());
xmlServer.postAndLoad(xml, new WFSQueryResponse(operationViewer), "", null);
}
function createGetFeatureQuery(resultType:String, ftName:String, namespace:String, sortField:String):String {
var query:String = null;
query = "";
query += " ";
query += "$_DUMMY_FILTER_$";
if(sortField != null) {
query += "";
query += sortField;
query += "";
}
query += " ";
query += "";
return query;
}
}