wps-js-52-north
Version:
Web Processing Service JavaScrict library
527 lines (404 loc) • 17 kB
JavaScript
/*
* definition of parameter names and values that will be used for
* generating the process description. Values will have standard values
* for WPS 2.0.
*
* In subclasses, these values shall be overridden to alter the values!!!!
*/
var PROCESS_OFFERING_VERSION = "2.0.0";
var PROCESS_OFFERING_XML_TAG_NAME = "wps\\:ProcessOffering, ProcessOffering";
var PROCESS_VERSION_ATTR_NAME = "processVersion";
var PROCESS_VERSION_ATTR_NAME_WITH_NS = "wps\\:processVersion";
var JOB_CONTROL_OPTIONS_ATTR_NAME = "jobControlOptions";
var JOB_CONTROL_OPTIONS_ATTR_NAME_WITH_NS = "wps\\:jobControlOptions";
var OUTPUT_TRANSMISSION_ATTR_NAME = "outputTransmission";
var OUTPUT_TRANSMISSION_ATTR_NAME_WITH_NS = "wps\\:outputTransmission";
var PROCESS_TAG_NAME = "wps\\:Process, Process";
var TITLE_TAG_NAME = "ows\\:Title, Title";
var ABSTRACT_TAG_NAME = "ows\\:Abstract, Abstract";
var IDENTIFIER_TAG_NAME = "ows\\:Identifier, Identifier";
var PROCESS_INPUT_TAG_NAME = "wps\\:Input, Input";
var PROCESS_OUTPUT_TAG_NAME = "wps\\:Output, Output";
var LITERAL_DATA_TAG_NAME = "wps\\:LiteralData, ns\\:LiteralData, LiteralData";
var COMPLEX_DATA_TAG_NAME = "wps\\:ComplexData, ns\\:ComplexData, ComplexData";
var BBOX_DATA_TAG_NAME = "wps\\:BoundingBoxData, ns\\:BoundingBoxData, BoundingBoxData";
var LITERAL_DATA_OUTPUT_TAG_NAME = "wps\\:LiteralData, ns\\:LiteralData, LiteralData";
var COMPLEX_DATA_OUTPUT_TAG_NAME = "wps\\:ComplexData, ns\\:ComplexData, ComplexData";
var BBOX_DATA_OUTPUT_TAG_NAME = "wps\\:BoundingBoxData, ns\\:BoundingBoxData, BoundingBoxData";
var MIN_OCCURS_ATTR_NAME = "minOccurs";
var MIN_OCCURS_ATTR_NAME_WITH_NS = "wps\\:minOccurs";
var MAX_OCCURS_ATTR_NAME = "maxOccurs";
var MAX_OCCURS_ATTR_NAME_WITH_NS = "wps\\:maxOccurs";
var FORMAT_TAG_NAME = "ns\\:Format, wps\\:Format, Format";
var FORMAT_MIME_TYPE_ATTR_NAME = "mimeType";
var FORMAT_ENCODING_ATTR_NAME = "encoding";
var FORMAT_SCHEMA_ATTR_NAME = "schema";
var LITERAL_DATA_DOMAIN_TAG_NAME = "wps\\:LiteralDataDomain, LiteralDataDomain";
var LITERAL_DATA_ANY_VALUE_TAG_NAME = "ows\\:AnyValue, AnyValue";
var LITERAL_DATA_ALLOWED_VALUES_TAG_NAME = "ows\\:AllowedValues, AllowedValues";
var LITERAL_DATA_ALLOWED_VALUES_VALUE_TAG_NAME = "ows\\:Value, Value";
var LITERAL_DATA_ALLOWED_VALUES_RANGE_TAG_NAME = "ows\\:Range, Range";
var LITERAL_DATA_ALLOWED_VALUES_RANGE_MINIMUM_VALUE_TAG_NAME = "ows\\:MinimumValue, MinimumValue";
var LITERAL_DATA_ALLOWED_VALUES_RANGE_MAXIMUM_VALUE_TAG_NAME = "ows\\:MaximumValue, MaximumValue";
var LITERAL_DATA_DATA_TYPE_TAG_NAME = "ows\\:DataType, DataType";
var LITERAL_DATA_VALUES_REFERENCE_TAG_NAME = "ows\\:ValuesReference, ValuesReference";
var LITERAL_DATA_REFERENCE_ATTR_NAME = "reference";
var LITERAL_DATA_REFERENCE_ATTR_NAME_WITH_NS = "ows\\:reference";
var LITERAL_DATA_DEFAULT_VALUE_TAG_NAME = "ows\\:DefaultValue, DefaultValue";
var LITERAL_DATA_UNIT_OF_MEASURE_TAG_NAME = "ows\\:UOM, UOM";
//var SUPPORTED_CRS_TAG_NAME = "SupportedCRS";
var CRS_TAG_NAME = "ows\\:CRS, wps\\:CRS, CRS";
var DescribeProcessResponse_xml = DescribeProcessResponse.extend({
instantiate : function(wpsResponse) {
/*
* in child classes, this method may change certain values
* of the above listed variables, that are used to extract
* information out of the XML document
*/
this.resetParameterVariables();
/*
* version
*/
this.processOffering.version = PROCESS_OFFERING_VERSION;
var processOfferingXml = $(wpsResponse).find(PROCESS_OFFERING_XML_TAG_NAME);
/*
processOfferingXml */
this.processOffering.processVersion = processOfferingXml.attr(PROCESS_VERSION_ATTR_NAME) || processOfferingXml.attr(PROCESS_VERSION_ATTR_NAME_WITH_NS);
this.processOffering.jobControlOptions = this.createJobControlOptions(processOfferingXml);
this.processOffering.outputTransmissionModes = this.createOutputTransmissionModes(processOfferingXml);
/*
* process
*/
// var processXml = processOfferingXml.find(PROCESS_TAG_NAME);
/*
* .find(selector) will return more instances of title, abstract and identifier
* than just the ones for the process.
*
* Instead it will also include objects for each Input and Output.
*
* Hence we simply take the first returned objects, as those will be the process level.
*/
this.processOffering.process.title = $(processOfferingXml.find(TITLE_TAG_NAME)[0]).text();
this.processOffering.process.abstractValue = $(processOfferingXml.find(ABSTRACT_TAG_NAME)[0]).text() || undefined;
this.processOffering.process.identifier = $(processOfferingXml.find(IDENTIFIER_TAG_NAME)[0]).text();
/*
* TODO how to deal with nested input and nested output???
*
*/
this.processOffering.process.inputs = this.createInputs(processOfferingXml.find(PROCESS_INPUT_TAG_NAME));
this.processOffering.process.outputs = this.createOutputs(processOfferingXml.find(PROCESS_OUTPUT_TAG_NAME));
},
/**
* in child classes this method should be overridden in order to reset parameter values
*/
resetParameterVariables : function(){
/*
* here do noting
*/
},
createJobControlOptions : function(processOfferingXml){
/*
* must be overridden in child classes
*
* it differs fpr various WPS version!
*/
},
createOutputTransmissionModes : function(processOfferingXml){
/*
* must be overridden in child classes
*
* it differs for various WPS version!
*/
},
createInputs : function(xmlNodes){
var array = new Array(xmlNodes.length);
for (var index = 0; index < xmlNodes.length; index++) {
var inputXml = $(xmlNodes[index]);
if(inputXml.find(LITERAL_DATA_TAG_NAME).length > 0)
array[index] = this.createLiteralDataInputFromXml(inputXml);
else if (inputXml.find(COMPLEX_DATA_TAG_NAME).length > 0)
array[index] = this.createComplexDataInputFromXml(inputXml);
else if (inputXml.find(BBOX_DATA_TAG_NAME).length > 0)
array[index] = this.createBboxDataInputFromXml(inputXml);
/*
* nested input!
*/
else if(inputXml.find(PROCESS_INPUT_TAG_NAME).length > 0)
array[index] = this.createInputs(inputXml);
}
return array;
},
createLiteralDataInputFromXml : function(xmlNode) {
var minOccurs = xmlNode.attr(MIN_OCCURS_ATTR_NAME) || xmlNode.attr(MIN_OCCURS_ATTR_NAME_WITH_NS);
var maxOccurs = xmlNode.attr(MAX_OCCURS_ATTR_NAME) || xmlNode.attr(MAX_OCCURS_ATTR_NAME_WITH_NS);
var title = xmlNode.find(TITLE_TAG_NAME).text();
var abstractValue = xmlNode.find(ABSTRACT_TAG_NAME).text() || undefined;
var identifier = xmlNode.find(IDENTIFIER_TAG_NAME).text();
/*
* literal data input
*/
var formatNodes = this.extractFormatNodes(xmlNode);
/*
* in WPS 1.0 there is no format for a literal input!
*
* but in WPS 2.0 there is!
*
* Hence, we just add an "|| undefined"
*/
var formatArray = this.createFormatArray(formatNodes) || undefined;
var literalDataDomainArray = this.createLiteralDataDomainArray(xmlNode.find(LITERAL_DATA_TAG_NAME));
// this.createLiteralDataDomainArray(xmlNode.find(LITERAL_DATA_DOMAIN_TAG_NAME));
return this.createLiteralDataInput(title, abstractValue, identifier, minOccurs,
maxOccurs, formatArray, literalDataDomainArray);
},
/**
* extracts all Format nodes. Varies for different WPS version
*/
extractFormatNodes : function(xmlNode){
/*
* override in child classes
*/
},
createLiteralDataDomainArray : function(literalDataDomainXml){
/*
* for various WPS version, this call produces different results!
*/
return this.createAllLiteralDataDomainObjects(literalDataDomainXml);
},
/**
* create all literal data domain object.
* for differnt WPS version, the number of allowed instances varies. In WPS 1.0
* only one occurence is allowed, whereas in WPS 2.0 a new Tag called "LiteralDataDomain"
* is introduced which may occur multiple times!
*
* Hence we override this method in child classes to provide the correct results!
*/
createAllLiteralDataDomainObjects : function(literalDataXml){
/*
* override in child methods!
*/
},
/**
* regardsles of the WPS version, this method should provide the expected results
* to instantiate an instance of literalDataObject!
*/
createLiteralDataDomainObject : function(literalDataDomain_xml){
var literalDataDomainObject = new Object();
/*
* on of the three tags for allowed value specification can occur:
*
* 1: AnyValue
*
* 2: AllowedValues
*
* 3: ValuesReference
*/
literalDataDomainObject.anyValue = false;
if(literalDataDomain_xml.find(LITERAL_DATA_ANY_VALUE_TAG_NAME).length > 0)
literalDataDomainObject.anyValue = true;
else if(literalDataDomain_xml.find(LITERAL_DATA_ALLOWED_VALUES_TAG_NAME).length > 0)
literalDataDomainObject.allowedValues = this.createAllowedValues(literalDataDomain_xml.find(LITERAL_DATA_ALLOWED_VALUES_TAG_NAME));
else
literalDataDomainObject.valuesReference = literalDataDomain_xml.find(LITERAL_DATA_VALUES_REFERENCE_TAG_NAME).text();
var dataType_xml = literalDataDomain_xml.find(LITERAL_DATA_DATA_TYPE_TAG_NAME);
var dataTypeObject = new Object();
dataTypeObject.type = dataType_xml.text() || undefined;
dataTypeObject.reference = dataType_xml.attr(LITERAL_DATA_REFERENCE_ATTR_NAME) || dataType_xml.attr(LITERAL_DATA_REFERENCE_ATTR_NAME_WITH_NS);
literalDataDomainObject.dataType = dataTypeObject;
literalDataDomainObject.defaultValue = literalDataDomain_xml.find(LITERAL_DATA_DEFAULT_VALUE_TAG_NAME).text() || undefined;
/*
* uom = unit of measure
*
* TODO create new extraction method that is overridden in child classes
*/
literalDataDomainObject.unitOfMeasure = this.extractUnitOfMeasure(literalDataDomain_xml);
return literalDataDomainObject;
},
/**
* extracts the unit of measure.
*
* Differs for different WPS versions
*/
extractUnitOfMeasure : function(literalDataXml){
/*
* override in child classes!
*/
},
createAllowedValues : function(allowedValues_xml){
/*
* if allowedValues_xml actually exists:
*
* allowedValues_xml might either be an array of "Value"-tags or
*
* have a child node called "Range".
*/
var object = new Object();
var values_xml = allowedValues_xml.find(LITERAL_DATA_ALLOWED_VALUES_VALUE_TAG_NAME);
var numberOfValues = values_xml.length;
/*
* case Value array
*/
if (numberOfValues > 0){
/*
* return an array with all values
*/
object.values = new Array(numberOfValues);
for (var i=0; i < numberOfValues; i++){
object.values[i] = $(values_xml[i]).text();
}
}
/*
* case Range child node
*/
else{
object.range = new Object();
var range_xml = allowedValues_xml.find(LITERAL_DATA_ALLOWED_VALUES_RANGE_TAG_NAME);
object.range.minimumValue = range_xml.find(LITERAL_DATA_ALLOWED_VALUES_RANGE_MINIMUM_VALUE_TAG_NAME).text();
object.range.maximumValue = range_xml.find(LITERAL_DATA_ALLOWED_VALUES_RANGE_MAXIMUM_VALUE_TAG_NAME).text();
}
return object;
},
createComplexDataInputFromXml : function(xmlNode) {
var minOccurs = xmlNode.attr(MIN_OCCURS_ATTR_NAME) || xmlNode.attr(MIN_OCCURS_ATTR_NAME_WITH_NS);
var maxOccurs = xmlNode.attr(MAX_OCCURS_ATTR_NAME) || xmlNode.attr(MAX_OCCURS_ATTR_NAME_WITH_NS);
var title = xmlNode.find(TITLE_TAG_NAME).text();
var abstractValue = xmlNode.find(ABSTRACT_TAG_NAME).text() || undefined;
var identifier = xmlNode.find(IDENTIFIER_TAG_NAME).text();
/*
* complex data input
*/
var formatNodes = this.extractFormatNodes(xmlNode);
var formatArray = this.createFormatArray(formatNodes);
return this.createComplexDataInput(title, abstractValue, identifier, minOccurs, maxOccurs, formatArray);
},
createBboxDataInputFromXml : function(xmlNode) {
var minOccurs = xmlNode.attr(MIN_OCCURS_ATTR_NAME) || xmlNode.attr(MIN_OCCURS_ATTR_NAME_WITH_NS);
var maxOccurs = xmlNode.attr(MAX_OCCURS_ATTR_NAME) || xmlNode.attr(MAX_OCCURS_ATTR_NAME_WITH_NS);
var title = xmlNode.find(TITLE_TAG_NAME).text();
var abstractValue = xmlNode.find(ABSTRACT_TAG_NAME).text() || undefined;
var identifier = xmlNode.find(IDENTIFIER_TAG_NAME).text();
//TODO BBOX
var formatNodes = this.extractFormatNodes(xmlNode);
/*
* in WPS 1.0 there is no format for a bbox input!
*
* but in WPS 2.0 there is!
*
* Hence, we just add an "|| undefined"
*/
var formatArray = this.createFormatArray(formatNodes) || undefined;
var supportedCRSs = this.createCrsArray(xmlNode.find(CRS_TAG_NAME));
return this.createBboxInput(title, abstractValue, identifier, minOccurs, maxOccurs, formatArray, supportedCRSs);
},
createCrsArray : function(supportedCRSs_xml){
var supportedCrsArray = new Array(supportedCRSs_xml.length);
for (var index = 0; index < supportedCRSs_xml.length; index++) {
supportedCrsArray[index] = $(supportedCRSs_xml[index]).text();
}
return supportedCrsArray;
},
createFormatArray : function(formatNodes) {
if(formatNodes.length == 0)
return undefined;
var formatArray = new Array();
for (var index = 0; index < formatNodes.length; index++) {
var formatXml = $(formatNodes[index]);
var mimeType = this.extractMimeType(formatXml);
var encoding = this.extractEncoding(formatXml);
var schema = this.extractSchema(formatXml);
formatArray[index] = this.createFormat(mimeType, encoding, schema);
}
return formatArray;
},
/**
* override in child method to extract the mime type from the format xml node.
*
* Differs for various WPS versions.
*/
extractMimeType : function(formatXml){
},
/**
* override in child method to extract the encoding from the format xml node.
*
* Differs for various WPS versions.
*/
extractEncoding : function(formatXml){
},
/**
* override in child method to extract the schema from the format xml node.
*
* Differs for various WPS versions.
*/
extractSchema : function(formatXml){
},
createOutputs : function (outputNodes){
var array = new Array(outputNodes.length);
for (var index = 0; index < outputNodes.length; index++) {
var OutputXml = $(outputNodes[index]);
if(OutputXml.find(LITERAL_DATA_OUTPUT_TAG_NAME).length > 0)
array[index] = this.createLiteralDataOutputFromXml(OutputXml);
else if (OutputXml.find(COMPLEX_DATA_OUTPUT_TAG_NAME).length > 0)
array[index] = this.createComplexDataOutputFromXml(OutputXml);
else if (OutputXml.find(BBOX_DATA_OUTPUT_TAG_NAME).length > 0)
array[index] = this.createBboxDataOutputFromXml(OutputXml);
/*
* nested output!
*/
else if (OutputXml.find(PROCESS_OUTPUT_TAG_NAME).length > 0)
array[index] = this.createOutputs(OutputXml);
}
return array;
},
/**
* TODO outputs vary... no format for literal data but multiple UOMs...
*/
createLiteralDataOutputFromXml : function(outputXml){
var title = outputXml.find(TITLE_TAG_NAME).text();
var abstractValue = outputXml.find(ABSTRACT_TAG_NAME).text() || undefined;
var identifier = outputXml.find(IDENTIFIER_TAG_NAME).text();
/*
* literal data input
*/
var formatNodes = this.extractFormatNodes(outputXml);
/*
* in WPS 1.0 there is no format for a literal otput!
*
* but in WPS 2.0 there is!
*
* Hence, we just add an "|| undefined"
*/
var formatArray = this.createFormatArray(formatNodes) ||undefined;
var literalDataDomainArray = this.createLiteralDataDomainArray(outputXml.find(LITERAL_DATA_TAG_NAME));
return this.createLiteralDataOutput(title, abstractValue, identifier,
formatArray, literalDataDomainArray);
},
createComplexDataOutputFromXml : function(outputXml) {
var title = outputXml.find(TITLE_TAG_NAME).text();
var abstractValue = outputXml.find(ABSTRACT_TAG_NAME).text() || undefined;
var identifier = outputXml.find(IDENTIFIER_TAG_NAME).text();
/*
* complex data input
*/
var formatNodes = this.extractFormatNodes(outputXml);
var formatArray = this.createFormatArray(formatNodes);
return this.createComplexDataOutput(title, abstractValue,
identifier, formatArray);
},
createBboxDataOutputFromXml : function(outputXml) {
var title = outputXml.find(TITLE_TAG_NAME).text();
var abstractValue = outputXml.find(ABSTRACT_TAG_NAME).text() || undefined;
var identifier = outputXml.find(IDENTIFIER_TAG_NAME).text();
var formatNodes = this.extractFormatNodes(outputXml);
/*
* in WPS 1.0 there is no format for a bbox output!
*
* but in WPS 2.0 there is!
*
* Hence, we just add an "|| undefined"
*/
var formatArray = this.createFormatArray(formatNodes) || undefined;
var supportedCRSs = this.createCrsArray(outputXml.find(CRS_TAG_NAME));
return this.createBboxOutput(title, abstractValue, identifier,
formatArray, supportedCRSs);
}
});