]> dev.renevier.net Git - syp.git/blob - openlayers/lib/OpenLayers/Format/WFS.js
initial commit
[syp.git] / openlayers / lib / OpenLayers / Format / WFS.js
1 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD
2  * license.  See http://svn.openlayers.org/trunk/openlayers/license.txt for the
3  * full text of the license. */
4
5 /**
6  * @requires OpenLayers/Format/GML.js
7  * @requires OpenLayers/Console.js
8  */
9
10 /**
11  * Class: OpenLayers.Format.WFS
12  * Read/Write WFS. 
13  *
14  * Inherits from:
15  *  - <OpenLayers.Format.GML>
16  */
17 OpenLayers.Format.WFS = OpenLayers.Class(OpenLayers.Format.GML, {
18     
19     /** 
20      * Property: layer
21      */
22     layer: null,
23     
24     /**
25      * APIProperty: wfsns
26      */
27     wfsns: "http://www.opengis.net/wfs",
28     
29     /**
30      * Property: ogcns
31      */
32     ogcns: "http://www.opengis.net/ogc",
33     
34     /*
35      * Constructor: OpenLayers.Format.WFS
36      * Create a WFS-T formatter. This requires a layer: that layer should
37      * have two properties: geometry_column and typename. The parser
38      * for this format is subclassed entirely from GML: There is a writer 
39      * only, which uses most of the code from the GML layer, and wraps
40      * it in transactional elements.
41      * 
42      * Parameters: 
43      * options - {Object} 
44      * layer - {<OpenLayers.Layer>} 
45      */
46     
47     initialize: function(options, layer) {
48         OpenLayers.Format.GML.prototype.initialize.apply(this, [options]);
49         this.layer = layer;
50         if (this.layer.featureNS) {
51             this.featureNS = this.layer.featureNS;
52         }    
53         if (this.layer.options.geometry_column) {
54             this.geometryName = this.layer.options.geometry_column;
55         }
56         if (this.layer.options.typename) {
57             this.featureName = this.layer.options.typename;
58         }
59     },
60     
61     /**
62      * Method: write 
63      * Takes a feature list, and generates a WFS-T Transaction 
64      *
65      * Parameters:
66      * features - {Array(<OpenLayers.Feature.Vector>)} 
67      */
68     write: function(features) {
69     
70         var transaction = this.createElementNS(this.wfsns, 'wfs:Transaction');
71         transaction.setAttribute("version","1.0.0");
72         transaction.setAttribute("service","WFS");
73         for (var i=0; i < features.length; i++) {
74             switch (features[i].state) {
75                 case OpenLayers.State.INSERT:
76                     transaction.appendChild(this.insert(features[i]));
77                     break;
78                 case OpenLayers.State.UPDATE:
79                     transaction.appendChild(this.update(features[i]));
80                     break;
81                 case OpenLayers.State.DELETE:
82                     transaction.appendChild(this.remove(features[i]));
83                     break;
84             }
85         }
86         
87         return OpenLayers.Format.XML.prototype.write.apply(this,[transaction]);
88     },
89    
90     /**
91      * Method: createFeatureXML
92      *
93      * Parameters: 
94      * feature - {<OpenLayers.Feature.Vector>}
95      */ 
96     createFeatureXML: function(feature) {
97         var geometryNode = this.buildGeometryNode(feature.geometry);
98         var geomContainer = this.createElementNS(this.featureNS, "feature:" + this.geometryName);
99         geomContainer.appendChild(geometryNode);
100         var featureContainer = this.createElementNS(this.featureNS, "feature:" + this.featureName);
101         featureContainer.appendChild(geomContainer);
102         for(var attr in feature.attributes) {
103             var attrText = this.createTextNode(feature.attributes[attr]); 
104             var nodename = attr;
105             if (attr.search(":") != -1) {
106                 nodename = attr.split(":")[1];
107             }    
108             var attrContainer = this.createElementNS(this.featureNS, "feature:" + nodename);
109             attrContainer.appendChild(attrText);
110             featureContainer.appendChild(attrContainer);
111         }    
112         return featureContainer;
113     },
114     
115     /**
116      * Method: insert 
117      * Takes a feature, and generates a WFS-T Transaction "Insert" 
118      *
119      * Parameters: 
120      * feature - {<OpenLayers.Feature.Vector>} 
121      */
122     insert: function(feature) {
123         var insertNode = this.createElementNS(this.wfsns, 'wfs:Insert');
124         insertNode.appendChild(this.createFeatureXML(feature));
125         return insertNode;
126     },
127     
128     /**
129      * Method: update
130      * Takes a feature, and generates a WFS-T Transaction "Update" 
131      *
132      * Parameters:
133      * feature - {<OpenLayers.Feature.Vector>} 
134      */
135     update: function(feature) {
136         if (!feature.fid) { OpenLayers.Console.userError(OpenLayers.i18n("noFID")); }
137         var updateNode = this.createElementNS(this.wfsns, 'wfs:Update');
138         updateNode.setAttribute("typeName", this.featurePrefix + ':' + this.featureName); 
139         updateNode.setAttribute("xmlns:" + this.featurePrefix, this.featureNS); 
140
141         var propertyNode = this.createElementNS(this.wfsns, 'wfs:Property');
142         var nameNode = this.createElementNS(this.wfsns, 'wfs:Name');
143         
144         var txtNode = this.createTextNode(this.geometryName);
145         nameNode.appendChild(txtNode);
146         propertyNode.appendChild(nameNode);
147         
148         var valueNode = this.createElementNS(this.wfsns, 'wfs:Value');
149         
150         var geometryNode = this.buildGeometryNode(feature.geometry);
151         
152         if(feature.layer){
153             geometryNode.setAttribute(
154                 "srsName", feature.layer.projection.getCode()
155             );
156         }
157         
158         valueNode.appendChild(geometryNode);
159         
160         propertyNode.appendChild(valueNode);
161         updateNode.appendChild(propertyNode);
162         
163          // add in attributes
164         for(var propName in feature.attributes) {
165             propertyNode = this.createElementNS(this.wfsns, 'wfs:Property');
166             nameNode = this.createElementNS(this.wfsns, 'wfs:Name');
167             nameNode.appendChild(this.createTextNode(propName));
168             propertyNode.appendChild(nameNode);
169             valueNode = this.createElementNS(this.wfsns, 'wfs:Value');
170             valueNode.appendChild(this.createTextNode(feature.attributes[propName]));
171             propertyNode.appendChild(valueNode);
172             updateNode.appendChild(propertyNode);
173         }
174         
175         
176         var filterNode = this.createElementNS(this.ogcns, 'ogc:Filter');
177         var filterIdNode = this.createElementNS(this.ogcns, 'ogc:FeatureId');
178         filterIdNode.setAttribute("fid", feature.fid);
179         filterNode.appendChild(filterIdNode);
180         updateNode.appendChild(filterNode);
181
182         return updateNode;
183     },
184     
185     /**
186      * Method: remove 
187      * Takes a feature, and generates a WFS-T Transaction "Delete" 
188      *
189      * Parameters:
190      * feature - {<OpenLayers.Feature.Vector>} 
191      */
192     remove: function(feature) {
193         if (!feature.fid) { 
194             OpenLayers.Console.userError(OpenLayers.i18n("noFID")); 
195             return false; 
196         }
197         var deleteNode = this.createElementNS(this.wfsns, 'wfs:Delete');
198         deleteNode.setAttribute("typeName", this.featurePrefix + ':' + this.featureName); 
199         deleteNode.setAttribute("xmlns:" + this.featurePrefix, this.featureNS); 
200
201         var filterNode = this.createElementNS(this.ogcns, 'ogc:Filter');
202         var filterIdNode = this.createElementNS(this.ogcns, 'ogc:FeatureId');
203         filterIdNode.setAttribute("fid", feature.fid);
204         filterNode.appendChild(filterIdNode);
205         deleteNode.appendChild(filterNode);
206
207         return deleteNode;
208     },
209
210     /**
211      * APIMethod: destroy
212      * Remove ciruclar ref to layer 
213      */
214     destroy: function() {
215         this.layer = null;
216     },
217
218     CLASS_NAME: "OpenLayers.Format.WFS" 
219 });