/*---------------- 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; } }