122 lines
3.4 KiB
JavaScript
122 lines
3.4 KiB
JavaScript
goog.provide('ol.parser.ogc.Versioned');
|
|
goog.require('goog.dom.xml');
|
|
goog.require('ol.parser.ogc.ExceptionReport');
|
|
|
|
|
|
|
|
/**
|
|
* @constructor
|
|
* @param {Object=} opt_options Options which will be set on this object.
|
|
*/
|
|
ol.parser.ogc.Versioned = function(opt_options) {
|
|
var options = goog.isDef(opt_options) ? opt_options : {};
|
|
this.options = options;
|
|
this.defaultVersion = options.defaultVersion || null;
|
|
this.version = options.version;
|
|
this.profile = options.profile;
|
|
if (goog.isDef(options.allowFallback)) {
|
|
this.allowFallback = options.allowFallback;
|
|
} else {
|
|
this.allowFallback = false;
|
|
}
|
|
if (goog.isDef(options.stringifyOutput)) {
|
|
this.stringifyOutput = options.stringifyOutput;
|
|
} else {
|
|
this.stringifyOutput = false;
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {Element} root root element.
|
|
* @param {Object=} opt_options optional configuration object.
|
|
* @return {string} the version to use.
|
|
*/
|
|
ol.parser.ogc.Versioned.prototype.getVersion = function(root, opt_options) {
|
|
var version;
|
|
// read
|
|
if (root) {
|
|
version = this.version;
|
|
if (!version) {
|
|
version = root.getAttribute('version');
|
|
if (!version) {
|
|
version = this.defaultVersion;
|
|
}
|
|
}
|
|
} else {
|
|
// write
|
|
version = (opt_options && opt_options.version) ||
|
|
this.version || this.defaultVersion;
|
|
}
|
|
return version;
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {string} version the version to use.
|
|
* @return {Object} the parser to use.
|
|
*/
|
|
ol.parser.ogc.Versioned.prototype.getParser = function(version) {
|
|
version = version || this.defaultVersion;
|
|
var profile = this.profile ? '_' + this.profile : '';
|
|
if (!this.parser || this.parser.VERSION != version) {
|
|
var format = this.parsers['v' + version.replace(/\./g, '_') + profile];
|
|
if (!format) {
|
|
if (profile !== '' && this.allowFallback) {
|
|
// fallback to the non-profiled version of the parser
|
|
profile = '';
|
|
format = this.parsers['v' + version.replace(/\./g, '_') + profile];
|
|
}
|
|
if (!format) {
|
|
throw 'Can\'t find a parser for version ' +
|
|
version + profile;
|
|
}
|
|
}
|
|
this.parser = new format(this.options);
|
|
}
|
|
return this.parser;
|
|
};
|
|
|
|
|
|
/**
|
|
* Write a document.
|
|
*
|
|
* @param {Object} obj An object representing the document.
|
|
* @param {Object=} opt_options Optional configuration object.
|
|
* @return {Element|string} the XML created.
|
|
*/
|
|
ol.parser.ogc.Versioned.prototype.write = function(obj, opt_options) {
|
|
var version = this.getVersion(null, opt_options);
|
|
this.parser = this.getParser(version);
|
|
var root = this.parser.write(obj, opt_options);
|
|
if (this.stringifyOutput === false) {
|
|
return root;
|
|
} else {
|
|
return goog.dom.xml.serialize(root);
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {string|Document} data Data to read.
|
|
* @param {Object=} opt_options Options for the reader.
|
|
* @return {Object} An object representing the document.
|
|
*/
|
|
ol.parser.ogc.Versioned.prototype.read = function(data, opt_options) {
|
|
if (goog.isString(data)) {
|
|
data = goog.dom.xml.loadXml(data);
|
|
}
|
|
var root = data.documentElement;
|
|
var version = this.getVersion(root);
|
|
this.parser = this.getParser(version);
|
|
var obj = this.parser.read(data, opt_options);
|
|
var errorProperty = this.parser.errorProperty || null;
|
|
if (errorProperty !== null && obj[errorProperty] === undefined) {
|
|
// an error must have happened, so parse it and report back
|
|
var format = new ol.parser.ogc.ExceptionReport();
|
|
obj.error = format.read(data);
|
|
}
|
|
obj.version = version;
|
|
return obj;
|
|
};
|