service/OGC/util/OWS.js Source
import {
    Zondy
} from '../../common/Base';
import {readHref} from './XLink';
import XML from './XML';
import {readString} from './xsd';
import {
    makeObjectPropertyPusher,
    makeObjectPropertySetter,
    makeStructureNS,
    pushParseAndPop
}from './base/xml';

/**
 * @private
 * @const NAMESPACE_URIS 命名空间标识
 * @type {Array<null|string>}
 */
const NAMESPACE_URIS = [null, 'http://www.opengis.net/ows/1.1'];

/**
 * @private
 * @const PARSERS
 * @type {Object<string, Object<string>>}
 */
const PARSERS = makeStructureNS(
    NAMESPACE_URIS, {
        'ServiceIdentification': makeObjectPropertySetter(readServiceIdentification),
        'ServiceProvider': makeObjectPropertySetter(readServiceProvider),
        'OperationsMetadata': makeObjectPropertySetter(readOperationsMetadata)
    });

/**
 * @private
 * @classdesc 用于读取OWS数据的类
 */
class OWS extends XML {
    constructor() {
        super();
    }

    /**
     * @private
     * @function Zondy.Format.OWS.prototype.readFromDocument
     * @description 从文档中读取信息,继承于父类XML
     * @return {owsObject|null}
     */
    readFromDocument(doc) {
        for (let n = doc.firstChild; n; n = n.nextSibling) {
            if (n.nodeType == Node.ELEMENT_NODE) {
                return this.readFromNode(n);
            }
        }
        return null;
    }

    /**
     * @private
     * @function Zondy.Format.OWS.prototype.readFromNode
     * @description 从文档节点中读取信息,继承于父类XML
     * @return {owsObject|null}
     */
    readFromNode(node) {
        const owsObject = pushParseAndPop({},
            PARSERS, node, []);
        return owsObject ? owsObject : null;
    }
}

/**
 * @private
 * @const ADDRESS_PARSERS
 * @type {Object<string, Object<string>>}
 */
const ADDRESS_PARSERS = makeStructureNS(
    NAMESPACE_URIS, {
        'DeliveryPoint': makeObjectPropertySetter(readString),
        'City': makeObjectPropertySetter(readString),
        'AdministrativeArea': makeObjectPropertySetter(readString),
        'PostalCode': makeObjectPropertySetter(readString),
        'Country': makeObjectPropertySetter(readString),
        'ElectronicMailAddress': makeObjectPropertySetter(readString)
    });

/**
 * @private
 * @const ALLOWED_VALUES_PARSERS
 * @type {Object<string, Object<string>>}
 */
const ALLOWED_VALUES_PARSERS = makeStructureNS(
    NAMESPACE_URIS, {
        'Value': makeObjectPropertyPusher(readValue)
    });

/**
 * @private
 * @const CONSTRAINT_PARSERS
 * @type {Object<string, Object<string>>}
 */
const CONSTRAINT_PARSERS = makeStructureNS(
    NAMESPACE_URIS, {
        'AllowedValues': makeObjectPropertySetter(readAllowedValues)
    });

/**
 * @private
 * @const CONTACT_INFO_PARSERS
 * @type {Object<string, Object<string>>}
 */
const CONTACT_INFO_PARSERS = makeStructureNS(
    NAMESPACE_URIS, {
        'Phone': makeObjectPropertySetter(readPhone),
        'Address': makeObjectPropertySetter(readAddress)
    });

/**
 * @private
 * @const DCP_PARSERS
 * @type {Object<string, Object<string>>}
 */
const DCP_PARSERS = makeStructureNS(
    NAMESPACE_URIS, {
        'HTTP': makeObjectPropertySetter(readHttp)
    });

/**
 * @private
 * @const HTTP_PARSERS
 * @type {Object<string, Object<string>>}
 */
const HTTP_PARSERS = makeStructureNS(
    NAMESPACE_URIS, {
        'Get': makeObjectPropertyPusher(readGet),
        'Post': undefined // TODO
    });

/**
 * @private
 * @const OPERATION_PARSERS
 * @type {Object<string, Object<string>>}
 */
const OPERATION_PARSERS = makeStructureNS(
    NAMESPACE_URIS, {
        'DCP': makeObjectPropertySetter(readDcp)
    });

/**
 * @private
 * @const OPERATIONS_METADATA_PARSERS
 * @type {Object<string, Object<string>>}
 */
const OPERATIONS_METADATA_PARSERS = makeStructureNS(
    NAMESPACE_URIS, {
        'Operation': readOperation
    });

/**
 * @private
 * @const PHONE_PARSERS
 * @type {Object<string, Object<string>>}
 */
const PHONE_PARSERS = makeStructureNS(
    NAMESPACE_URIS, {
        'Voice': makeObjectPropertySetter(readString),
        'Facsimile': makeObjectPropertySetter(readString)
    });

/**
 * @private
 * @const REQUEST_METHOD_PARSERS
 * @type {Object<string, Object<string>>}
 */
const REQUEST_METHOD_PARSERS = makeStructureNS(
    NAMESPACE_URIS, {
        'Constraint': makeObjectPropertyPusher(readConstraint)
    });

/**
 * @private
 * @const SERVICE_CONTACT_PARSERS
 * @type {Object<string, Object<string>>}
 */
const SERVICE_CONTACT_PARSERS =
    makeStructureNS(
        NAMESPACE_URIS, {
            'IndividualName': makeObjectPropertySetter(readString),
            'PositionName': makeObjectPropertySetter(readString),
            'ContactInfo': makeObjectPropertySetter(readContactInfo)
        });

/**
 * @private
 * @const SERVICE_IDENTIFICATION_PARSERS
 * @type {Object<string, Object<string>>}
 */
const SERVICE_IDENTIFICATION_PARSERS =
    makeStructureNS(
        NAMESPACE_URIS, {
            'Abstract': makeObjectPropertySetter(readString),
            'AccessConstraints': makeObjectPropertySetter(readString),
            'Fees': makeObjectPropertySetter(readString),
            'Title': makeObjectPropertySetter(readString),
            'ServiceTypeVersion': makeObjectPropertySetter(readString),
            'ServiceType': makeObjectPropertySetter(readString)
        });

/**
 * @private
 * @const SERVICE_PROVIDER_PARSERS
 * @type {Object<string, Object<string>>}
 */
const SERVICE_PROVIDER_PARSERS =
    makeStructureNS(
        NAMESPACE_URIS, {
            'ProviderName': makeObjectPropertySetter(readString),
            'ProviderSite': makeObjectPropertySetter(readHref),
            'ServiceContact': makeObjectPropertySetter(readServiceContact)
        });

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readAddress
 * @description 读取Address
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The address.
 */
function readAddress(node, objectStack) {
    return pushParseAndPop({},
        ADDRESS_PARSERS, node, objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readAllowedValues
 * @description 读取AllowedValues
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The values.
 */
function readAllowedValues(node, objectStack) {
    return pushParseAndPop({},
        ALLOWED_VALUES_PARSERS, node, objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readConstraint
 * @description 读取Constraint
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The constraint.
 */
function readConstraint(node, objectStack) {
    const name = node.getAttribute('name');
    if (!name) {
        return undefined;
    }
    return pushParseAndPop({
            'name': name
        },
        CONSTRAINT_PARSERS, node,
        objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readContactInfo
 * @description 读取ContactInfo
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The contact info.
 */
function readContactInfo(node, objectStack) {
    return pushParseAndPop({},
        CONTACT_INFO_PARSERS, node, objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readDcp
 * @description 读取Dcp
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The DCP.
 */
function readDcp(node, objectStack) {
    return pushParseAndPop({},
        DCP_PARSERS, node, objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readGet
 * @description 读取Get
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The GET object.
 */
function readGet(node, objectStack) {
    const href = readHref(node);
    if (!href) {
        return undefined;
    }
    return pushParseAndPop({
            'href': href
        },
        REQUEST_METHOD_PARSERS, node, objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readHttp
 * @description 读取Http
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The HTTP object.
 */
function readHttp(node, objectStack) {
    return pushParseAndPop({}, HTTP_PARSERS, node, objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readOperation
 * @description 读取Operation
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The operation.
 */
function readOperation(node, objectStack) {
    const name = node.getAttribute('name');
    const value = pushParseAndPop({},
        OPERATION_PARSERS, node, objectStack);
    if (!value) {
        return undefined;
    }
    const object = /** @type {Object} */
        (objectStack[objectStack.length - 1]);
    object[name] = value;
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readOperationsMetadata
 * @description 读取OperationsMetadata
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The operations metadata.
 */
function readOperationsMetadata(node, objectStack) {
    return pushParseAndPop({},
        OPERATIONS_METADATA_PARSERS, node,
        objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readPhone
 * @description 读取Phone
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The phone.
 */
function readPhone(node, objectStack) {
    return pushParseAndPop({},
        PHONE_PARSERS, node, objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readServiceIdentification
 * @description 读取ServiceIdentification
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The service identification.
 */
function readServiceIdentification(node, objectStack) {
    return pushParseAndPop({}, SERVICE_IDENTIFICATION_PARSERS, node,
        objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readServiceContact
 * @description 读取ServiceContact
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The service contact.
 */
function readServiceContact(node, objectStack) {
    return pushParseAndPop({}, SERVICE_CONTACT_PARSERS, node,
        objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readServiceProvider
 * @description 读取ServiceProvider
 * @param {Element} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {Object|undefined} The service provider.
 */
function readServiceProvider(node, objectStack) {
    return pushParseAndPop({}, SERVICE_PROVIDER_PARSERS, node,
        objectStack);
}

/**
 * @private
 * @function Zondy.Format.OWS.prototype.readValue
 * @description 读取Value
 * @param {Node} node 节点.
 * @param {Array<*>} objectStack 对象堆栈.
 * @return {string|undefined} The value.
 */
function readValue(node, objectStack) {
    return readString(node);
}

export default OWS;
Zondy.Format.OWS = OWS;