goog.provide('M.layer.WFS');
goog.require('M.Layer');
goog.require('M.layer.Vector');
goog.require('M.utils');
goog.require('M.exception');
goog.require('M.geom');
(function() {
/**
* @classdesc
* Main constructor of the class. Creates a WFS layer
* with parameters specified by the user
*
* @constructor
* @extends {M.layer.Vector}
* @param {string|Mx.parameters.WFS} userParameters parameters
* @param {Mx.parameters.LayerOptions} options provided by the user
* @api stable
*/
M.layer.WFS = (function(userParameters, options = {}, impl = new M.impl.layer.WFS(options)) {
// checks if the implementation can create WFS layers
if (M.utils.isUndefined(M.impl.layer.WFS)) {
M.exception('La implementación usada no puede crear capas WFS');
}
// checks if the param is null or empty
if (M.utils.isNullOrEmpty(userParameters)) {
M.exception('No ha especificado ningún parámetro');
}
var parameters = M.parameter.layer(userParameters, M.layer.type.WFS);
// calls the super constructor
goog.base(this, parameters, options, impl);
// namespace
this.namespace = parameters.namespace;
// legend
this.legend = parameters.legend;
// cql
this.cql = parameters.cql;
// geometry
this.geometry = parameters.geometry;
// ids
this.ids = parameters.ids;
// version
this.version = parameters.version;
// options
this.options = options;
});
goog.inherits(M.layer.WFS, M.layer.Vector);
/**
* 'type' This property indicates if
* the layer was selected
*/
Object.defineProperty(M.layer.WFS.prototype, "type", {
get: function() {
return M.layer.type.WFS;
},
// defining new type is not allowed
set: function(newType) {
if (!M.utils.isUndefined(newType) && !M.utils.isNullOrEmpty(newType) && (newType !== M.layer.type.WFS)) {
M.exception('El tipo de capa debe ser \''.concat(M.layer.type.WFS).concat('\' pero se ha especificado \'').concat(newType).concat('\''));
}
}
});
/**
* 'namespace' the layer name
*/
Object.defineProperty(M.layer.WFS.prototype, "namespace", {
get: function() {
return this.getImpl().namespace;
},
// defining new type is not allowed
set: function(newNamespace) {
this.getImpl().namespace = newNamespace;
}
});
/**
* 'legend' the layer name
*/
Object.defineProperty(M.layer.WFS.prototype, "legend", {
get: function() {
return this.getImpl().legend;
},
// defining new type is not allowed
set: function(newLegend) {
if (M.utils.isNullOrEmpty(newLegend)) {
this.getImpl().legend = this.name;
}
else {
this.getImpl().legend = newLegend;
}
}
});
/**
* 'cql' the layer name
*/
Object.defineProperty(M.layer.WFS.prototype, "cql", {
get: function() {
return this.getImpl().cql;
},
// defining new type is not allowed
set: function(newCQL) {
this.getImpl().cql = newCQL;
}
});
/**
* 'geometry' the layer name
*/
Object.defineProperty(M.layer.WFS.prototype, "geometry", {
get: function() {
return this.getImpl().geometry;
},
// defining new type is not allowed
set: function(newGeometry) {
if (!M.utils.isNullOrEmpty(newGeometry)) {
var parsedGeom = M.geom.parse(newGeometry);
if (M.utils.isNullOrEmpty(parsedGeom)) {
M.exception('El tipo de capa WFS <b>' + newGeometry + '</b> no se reconoce. Los tipos disponibles son: POINT, LINE, POLYGON, MPOINT, MLINE, MPOLYGON');
}
this.getImpl().geometry = parsedGeom;
}
}
});
/**
* 'ids' the layer name
*/
Object.defineProperty(M.layer.WFS.prototype, "ids", {
get: function() {
return this.getImpl().ids;
},
// defining new type is not allowed
set: function(newIds) {
if (M.utils.isNullOrEmpty(newIds)) {
this.getImpl().ids = this.ids;
}
else {
this.getImpl().ids = newIds;
}
}
});
/**
* 'version' the layer name
*/
Object.defineProperty(M.layer.WFS.prototype, "version", {
get: function() {
return this.getImpl().version;
},
// defining new type is not allowed
set: function(newVersion) {
if (!M.utils.isNullOrEmpty(newVersion)) {
this.getImpl().version = newVersion;
}
else {
this.getImpl().version = '1.0.0'; // default value
}
}
});
/**
* This function checks if an object is equals
* to this layer
*
* @function
* @api stable
*/
M.layer.WFS.prototype.setCQL = function(newCQL) {
this.getImpl().getDescribeFeatureType().then(function(describeFeatureType) {
if (!M.utils.isNullOrEmpty(newCQL)) {
var geometryName = describeFeatureType.geometryName;
// if exist, replace {{geometryName}} with the value geometryName
newCQL = newCQL.replace(/{{geometryName}}/g, geometryName);
}
if (this.getImpl().cql !== newCQL) {
this.getImpl().setCQL(newCQL);
}
}.bind(this));
};
/**
* TODO
*
* @function
* @api stable
*/
M.layer.WFS.prototype.setStyle = function(style, applyToFeature = false) {
const applyStyleFn = function() {
if (M.utils.isNullOrEmpty(style)) {
style = M.utils.generateStyleLayer(M.layer.WFS.DEFAULT_OPTIONS_STYLE, this);
}
let isCluster = style instanceof M.style.Cluster;
let isPoint = [M.geom.geojson.type.POINT, M.geom.geojson.type.MULTI_POINT].includes(M.utils.getGeometryType(this));
if (style instanceof M.Style && (!isCluster || isPoint)) {
if (!M.utils.isNullOrEmpty(this.style_)) {
this.style_.unapply(this);
}
style.apply(this, applyToFeature);
this.style_ = style;
}
};
if (this.getImpl().isLoaded()) {
applyStyleFn.bind(this)();
}
else {
this.once(M.evt.LOAD, applyStyleFn, this);
}
};
/**
* This function checks if an object is equals
* to this layer
*
* @function
* @api stable
*/
M.layer.WFS.prototype.equals = function(obj) {
var equals = false;
if (obj instanceof M.layer.WFS) {
equals = (this.url === obj.url);
equals = equals && (this.namespace === obj.namespace);
equals = equals && (this.name === obj.name);
equals = equals && (this.ids === obj.ids);
equals = equals && (this.cql === obj.cql);
equals = equals && (this.version === obj.version);
}
return equals;
};
/**
* Style options by default for this layer
* @const
* @type {object}
* @public
* @api stable
*/
M.layer.WFS.DEFAULT_OPTIONS_STYLE = {
fill: {
color: 'rgba(103, 175, 19, 0.2)',
opacity: 0.4
},
stroke: {
color: '#67af13',
width: 1
},
radius: 5
};
})();