|
/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for |
|
* full list of contributors). Published under the Clear BSD license. |
|
* See http://svn.openlayers.org/trunk/openlayers/license.txt for the |
|
* full text of the license. */ |
|
|
|
/** |
|
* @requires OpenLayers/Format/GML.js |
|
* @requires OpenLayers/Console.js |
|
*/ |
|
|
|
/** |
|
* Class: OpenLayers.Format.WFS |
|
* Read/Write WFS. |
|
* |
|
* Inherits from: |
|
* - <OpenLayers.Format.GML> |
|
*/ |
|
OpenLayers.Format.WFS = OpenLayers.Class(OpenLayers.Format.GML, { |
|
|
|
/** |
|
* Property: layer |
|
*/ |
|
layer: null, |
|
|
|
/** |
|
* APIProperty: wfsns |
|
*/ |
|
wfsns: "http://www.opengis.net/wfs", |
|
|
|
/** |
|
* Property: ogcns |
|
*/ |
|
ogcns: "http://www.opengis.net/ogc", |
|
|
|
/* |
|
* Constructor: OpenLayers.Format.WFS |
|
* Create a WFS-T formatter. This requires a layer: that layer should |
|
* have two properties: geometry_column and typename. The parser |
|
* for this format is subclassed entirely from GML: There is a writer |
|
* only, which uses most of the code from the GML layer, and wraps |
|
* it in transactional elements. |
|
* |
|
* Parameters: |
|
* options - {Object} |
|
* layer - {<OpenLayers.Layer>} |
|
*/ |
|
|
|
initialize: function(options, layer) { |
|
OpenLayers.Format.GML.prototype.initialize.apply(this, [options]); |
|
this.layer = layer; |
|
if (this.layer.featureNS) { |
|
this.featureNS = this.layer.featureNS; |
|
} |
|
if (this.layer.options.geometry_column) { |
|
this.geometryName = this.layer.options.geometry_column; |
|
} |
|
if (this.layer.options.typename) { |
|
this.featureName = this.layer.options.typename; |
|
} |
|
}, |
|
|
|
/** |
|
* Method: write |
|
* Takes a feature list, and generates a WFS-T Transaction |
|
* |
|
* Parameters: |
|
* features - {Array(<OpenLayers.Feature.Vector>)} |
|
*/ |
|
write: function(features) { |
|
|
|
var transaction = this.createElementNS(this.wfsns, 'wfs:Transaction'); |
|
transaction.setAttribute("version","1.0.0"); |
|
transaction.setAttribute("service","WFS"); |
|
for (var i=0; i < features.length; i++) { |
|
switch (features[i].state) { |
|
case OpenLayers.State.INSERT: |
|
transaction.appendChild(this.insert(features[i])); |
|
break; |
|
case OpenLayers.State.UPDATE: |
|
transaction.appendChild(this.update(features[i])); |
|
break; |
|
case OpenLayers.State.DELETE: |
|
transaction.appendChild(this.remove(features[i])); |
|
break; |
|
} |
|
} |
|
|
|
return OpenLayers.Format.XML.prototype.write.apply(this,[transaction]); |
|
}, |
|
|
|
/** |
|
* Method: createFeatureXML |
|
* |
|
* Parameters: |
|
* feature - {<OpenLayers.Feature.Vector>} |
|
*/ |
|
createFeatureXML: function(feature) { |
|
var geometryNode = this.buildGeometryNode(feature.geometry); |
|
var geomContainer = this.createElementNS(this.featureNS, "feature:" + this.geometryName); |
|
geomContainer.appendChild(geometryNode); |
|
var featureContainer = this.createElementNS(this.featureNS, "feature:" + this.featureName); |
|
featureContainer.appendChild(geomContainer); |
|
for(var attr in feature.attributes) { |
|
var attrText = this.createTextNode(feature.attributes[attr]); |
|
var nodename = attr; |
|
if (attr.search(":") != -1) { |
|
nodename = attr.split(":")[1]; |
|
} |
|
var attrContainer = this.createElementNS(this.featureNS, "feature:" + nodename); |
|
attrContainer.appendChild(attrText); |
|
featureContainer.appendChild(attrContainer); |
|
} |
|
return featureContainer; |
|
}, |
|
|
|
/** |
|
* Method: insert |
|
* Takes a feature, and generates a WFS-T Transaction "Insert" |
|
* |
|
* Parameters: |
|
* feature - {<OpenLayers.Feature.Vector>} |
|
*/ |
|
insert: function(feature) { |
|
var insertNode = this.createElementNS(this.wfsns, 'wfs:Insert'); |
|
insertNode.appendChild(this.createFeatureXML(feature)); |
|
return insertNode; |
|
}, |
|
|
|
/** |
|
* Method: update |
|
* Takes a feature, and generates a WFS-T Transaction "Update" |
|
* |
|
* Parameters: |
|
* feature - {<OpenLayers.Feature.Vector>} |
|
*/ |
|
update: function(feature) { |
|
if (!feature.fid) { OpenLayers.Console.userError(OpenLayers.i18n("noFID")); } |
|
var updateNode = this.createElementNS(this.wfsns, 'wfs:Update'); |
|
updateNode.setAttribute("typeName", this.featurePrefix + ':' + this.featureName); |
|
updateNode.setAttribute("xmlns:" + this.featurePrefix, this.featureNS); |
|
|
|
var propertyNode = this.createElementNS(this.wfsns, 'wfs:Property'); |
|
var nameNode = this.createElementNS(this.wfsns, 'wfs:Name'); |
|
|
|
var txtNode = this.createTextNode(this.geometryName); |
|
nameNode.appendChild(txtNode); |
|
propertyNode.appendChild(nameNode); |
|
|
|
var valueNode = this.createElementNS(this.wfsns, 'wfs:Value'); |
|
|
|
var geometryNode = this.buildGeometryNode(feature.geometry); |
|
|
|
if(feature.layer){ |
|
geometryNode.setAttribute( |
|
"srsName", feature.layer.projection.getCode() |
|
); |
|
} |
|
|
|
valueNode.appendChild(geometryNode); |
|
|
|
propertyNode.appendChild(valueNode); |
|
updateNode.appendChild(propertyNode); |
|
|
|
// add in attributes |
|
for(var propName in feature.attributes) { |
|
propertyNode = this.createElementNS(this.wfsns, 'wfs:Property'); |
|
nameNode = this.createElementNS(this.wfsns, 'wfs:Name'); |
|
nameNode.appendChild(this.createTextNode(propName)); |
|
propertyNode.appendChild(nameNode); |
|
valueNode = this.createElementNS(this.wfsns, 'wfs:Value'); |
|
valueNode.appendChild(this.createTextNode(feature.attributes[propName])); |
|
propertyNode.appendChild(valueNode); |
|
updateNode.appendChild(propertyNode); |
|
} |
|
|
|
|
|
var filterNode = this.createElementNS(this.ogcns, 'ogc:Filter'); |
|
var filterIdNode = this.createElementNS(this.ogcns, 'ogc:FeatureId'); |
|
filterIdNode.setAttribute("fid", feature.fid); |
|
filterNode.appendChild(filterIdNode); |
|
updateNode.appendChild(filterNode); |
|
|
|
return updateNode; |
|
}, |
|
|
|
/** |
|
* Method: remove |
|
* Takes a feature, and generates a WFS-T Transaction "Delete" |
|
* |
|
* Parameters: |
|
* feature - {<OpenLayers.Feature.Vector>} |
|
*/ |
|
remove: function(feature) { |
|
if (!feature.fid) { |
|
OpenLayers.Console.userError(OpenLayers.i18n("noFID")); |
|
return false; |
|
} |
|
var deleteNode = this.createElementNS(this.wfsns, 'wfs:Delete'); |
|
deleteNode.setAttribute("typeName", this.featurePrefix + ':' + this.featureName); |
|
deleteNode.setAttribute("xmlns:" + this.featurePrefix, this.featureNS); |
|
|
|
var filterNode = this.createElementNS(this.ogcns, 'ogc:Filter'); |
|
var filterIdNode = this.createElementNS(this.ogcns, 'ogc:FeatureId'); |
|
filterIdNode.setAttribute("fid", feature.fid); |
|
filterNode.appendChild(filterIdNode); |
|
deleteNode.appendChild(filterNode); |
|
|
|
return deleteNode; |
|
}, |
|
|
|
/** |
|
* APIMethod: destroy |
|
* Remove ciruclar ref to layer |
|
*/ |
|
destroy: function() { |
|
this.layer = null; |
|
}, |
|
|
|
CLASS_NAME: "OpenLayers.Format.WFS" |
|
}); |
|
|