org.codice.ddf.spatial.ogc.csw.catalog.converter.DefaultCswRecordMap.java Source code

Java tutorial

Introduction

Here is the source code for org.codice.ddf.spatial.ogc.csw.catalog.converter.DefaultCswRecordMap.java

Source

/**
 * Copyright (c) Codice Foundation
 *
 * This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
 * General Public License as published by the Free Software Foundation, either version 3 of the
 * License, or any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details. A copy of the GNU Lesser General Public License
 * is distributed along with this program and can be found at
 * <http://www.gnu.org/licenses/lgpl.html>.
 *
 **/
package org.codice.ddf.spatial.ogc.csw.catalog.converter;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.XMLConstants;
import javax.xml.namespace.QName;

import org.apache.commons.collections.map.CaseInsensitiveMap;
import org.codice.ddf.spatial.ogc.csw.catalog.common.CswConstants;
import org.codice.ddf.spatial.ogc.csw.catalog.common.CswRecordMetacardType;
import org.xml.sax.helpers.NamespaceSupport;

import ddf.catalog.data.Metacard;

/**
 * DefaultCswRecordMap defines the system map between CSW Records and a framework Metacard. It
 * provides functions to retrieve the mapped values in either direction, and to retrieve metacard
 * fields for a CSW field as a {@link QName} or just a local name as a {@link String}. If a mapped
 * value isn't found, then the input value is used as the mapped value.
 *
 */
public class DefaultCswRecordMap {
    private static final Map<QName, String> CSW_RECORD_QNAME_MAPPING;

    private static final Map<String, String> CSW_RECORD_LOCAL_NAME_MAPPING;

    private static final Map<String, List<QName>> METACARD_MAPPING;

    private static final Map<String, String> PREFIX_TO_URI_MAPPING;

    private static final DefaultCswRecordMap MAPPING;

    static {
        Map<String, String> localNameMap = new CaseInsensitiveMap();

        localNameMap.put(CswConstants.ANY_TEXT, Metacard.ANY_TEXT);
        localNameMap.put(CswConstants.CSW_TITLE, Metacard.TITLE);
        localNameMap.put(CswRecordMetacardType.CSW_TITLE, Metacard.TITLE);
        localNameMap.put(CswRecordMetacardType.CSW_ALTERNATIVE, Metacard.TITLE);
        localNameMap.put(CswRecordMetacardType.CSW_TYPE, Metacard.CONTENT_TYPE);
        localNameMap.put(CswRecordMetacardType.CSW_IDENTIFIER, Metacard.ID);
        localNameMap.put(CswRecordMetacardType.CSW_BIBLIOGRAPHIC_CITATION, Metacard.ID);
        localNameMap.put(CswRecordMetacardType.CSW_SOURCE, Metacard.RESOURCE_URI);
        localNameMap.put(CswConstants.CSW_CREATED, Metacard.CREATED);
        localNameMap.put(CswConstants.CSW_MODIFIED, Metacard.MODIFIED);
        localNameMap.put(CswRecordMetacardType.CSW_CREATED, Metacard.CREATED);
        localNameMap.put(CswRecordMetacardType.CSW_MODIFIED, Metacard.MODIFIED);
        localNameMap.put(CswRecordMetacardType.CSW_DATE, Metacard.MODIFIED);
        localNameMap.put(CswRecordMetacardType.CSW_DATE_SUBMITTED, Metacard.MODIFIED);
        localNameMap.put(CswRecordMetacardType.CSW_ISSUED, Metacard.MODIFIED);
        localNameMap.put(CswRecordMetacardType.CSW_DATE_ACCEPTED, Metacard.EFFECTIVE);
        localNameMap.put(CswRecordMetacardType.CSW_DATE_COPYRIGHTED, Metacard.EFFECTIVE);
        localNameMap.put(CswRecordMetacardType.CSW_VALID, Metacard.EXPIRATION);

        CSW_RECORD_LOCAL_NAME_MAPPING = Collections.unmodifiableMap(localNameMap);

        Map<QName, String> qNameMap = new HashMap<QName, String>();

        qNameMap.put(CswRecordMetacardType.CSW_IDENTIFIER_QNAME, Metacard.ID);
        qNameMap.put(CswRecordMetacardType.CSW_BIBLIOGRAPHIC_CITATION_QNAME, Metacard.ID);
        qNameMap.put(CswRecordMetacardType.CSW_SOURCE_QNAME, Metacard.RESOURCE_URI);
        qNameMap.put(CswRecordMetacardType.CSW_TITLE_QNAME, Metacard.TITLE);
        qNameMap.put(CswRecordMetacardType.CSW_ALTERNATIVE_QNAME, Metacard.TITLE);
        qNameMap.put(CswRecordMetacardType.CSW_TYPE_QNAME, Metacard.CONTENT_TYPE);
        qNameMap.put(CswRecordMetacardType.CSW_DATE_QNAME, Metacard.MODIFIED);
        qNameMap.put(CswRecordMetacardType.CSW_MODIFIED_QNAME, Metacard.MODIFIED);
        qNameMap.put(CswRecordMetacardType.CSW_CREATED_QNAME, Metacard.CREATED);
        qNameMap.put(CswRecordMetacardType.CSW_DATE_ACCEPTED_QNAME, Metacard.EFFECTIVE);
        qNameMap.put(CswRecordMetacardType.CSW_DATE_COPYRIGHTED_QNAME, Metacard.EFFECTIVE);
        qNameMap.put(CswRecordMetacardType.CSW_DATE_SUBMITTED_QNAME, Metacard.MODIFIED);
        qNameMap.put(CswRecordMetacardType.CSW_ISSUED_QNAME, Metacard.MODIFIED);
        qNameMap.put(CswRecordMetacardType.CSW_VALID_QNAME, Metacard.EXPIRATION);

        CSW_RECORD_QNAME_MAPPING = Collections.unmodifiableMap(qNameMap);

        Map<String, List<QName>> metacardMap = new HashMap<String, List<QName>>();

        metacardMap.put(Metacard.ID, Arrays.asList(CswRecordMetacardType.CSW_IDENTIFIER_QNAME,
                CswRecordMetacardType.CSW_BIBLIOGRAPHIC_CITATION_QNAME));
        metacardMap.put(Metacard.TITLE,
                Arrays.asList(CswRecordMetacardType.CSW_TITLE_QNAME, CswRecordMetacardType.CSW_ALTERNATIVE_QNAME));
        metacardMap.put(Metacard.CONTENT_TYPE, Arrays.asList(CswRecordMetacardType.CSW_TYPE_QNAME));
        metacardMap.put(Metacard.MODIFIED,
                Arrays.asList(CswRecordMetacardType.CSW_DATE_QNAME, CswRecordMetacardType.CSW_MODIFIED_QNAME,
                        CswRecordMetacardType.CSW_DATE_SUBMITTED_QNAME, CswRecordMetacardType.CSW_ISSUED_QNAME));

        metacardMap.put(Metacard.CREATED, Arrays.asList(CswRecordMetacardType.CSW_CREATED_QNAME));
        metacardMap.put(Metacard.EFFECTIVE, Arrays.asList(CswRecordMetacardType.CSW_DATE_ACCEPTED_QNAME,
                CswRecordMetacardType.CSW_DATE_COPYRIGHTED_QNAME));
        metacardMap.put(Metacard.EXPIRATION, Arrays.asList(CswRecordMetacardType.CSW_VALID_QNAME));
        metacardMap.put(Metacard.RESOURCE_URI, Arrays.asList(CswRecordMetacardType.CSW_SOURCE_QNAME));

        METACARD_MAPPING = Collections.unmodifiableMap(metacardMap);

        Map<String, String> prefixMapping = new HashMap<String, String>();

        prefixMapping.put(XMLConstants.XML_NS_PREFIX, XMLConstants.XML_NS_URI);
        prefixMapping.put(CswConstants.XML_SCHEMA_INSTANCE_NAMESPACE_PREFIX,
                XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);
        prefixMapping.put(CswConstants.XML_SCHEMA_NAMESPACE_PREFIX, XMLConstants.W3C_XML_SCHEMA_NS_URI);
        prefixMapping.put(CswConstants.OWS_NAMESPACE_PREFIX, CswConstants.OWS_NAMESPACE);
        prefixMapping.put(CswConstants.CSW_NAMESPACE_PREFIX, CswConstants.CSW_OUTPUT_SCHEMA);
        prefixMapping.put(CswConstants.DUBLIN_CORE_NAMESPACE_PREFIX, CswConstants.DUBLIN_CORE_SCHEMA);
        prefixMapping.put(CswConstants.DUBLIN_CORE_TERMS_NAMESPACE_PREFIX, CswConstants.DUBLIN_CORE_TERMS_SCHEMA);

        PREFIX_TO_URI_MAPPING = Collections.unmodifiableMap(prefixMapping);

        MAPPING = new DefaultCswRecordMap();
    }

    public static DefaultCswRecordMap getDefaultCswRecordMap() {
        return MAPPING;
    }

    /**
     * NOTE: This is a {@link CaseInsensitiveMap}.
     */
    public Map<String, String> getCswToMetacardAttributeNames() {
        return CSW_RECORD_LOCAL_NAME_MAPPING;
    }

    public String getDefaultMetacardFieldFor(QName cswField) {
        if (CSW_RECORD_QNAME_MAPPING.containsKey(cswField)) {
            return CSW_RECORD_QNAME_MAPPING.get(cswField);
        }

        return getDefaultMetacardFieldFor(cswField.getLocalPart());
    }

    public boolean hasDefaultMetacardFieldFor(QName cswField) {
        return CSW_RECORD_QNAME_MAPPING.containsKey(cswField);
    }

    public boolean hasDefaultMetacardFieldFor(String cswField) {
        return CSW_RECORD_LOCAL_NAME_MAPPING.containsKey(cswField);
    }

    public String getDefaultMetacardFieldFor(String cswField) {
        if (CSW_RECORD_LOCAL_NAME_MAPPING.containsKey(cswField)) {
            return CSW_RECORD_LOCAL_NAME_MAPPING.get(cswField);
        }

        return cswField;
    }

    public boolean hasDefaultMetacardFieldForPrefixedString(String name) {
        return hasDefaultMetacardFieldForPrefixedString(name, null);
    }

    public boolean hasDefaultMetacardFieldForPrefixedString(String propertyName,
            NamespaceSupport namespaceSupport) {
        if (propertyName.contains(":")) {
            String prefix = propertyName.substring(0, propertyName.indexOf(":"));
            String localName = propertyName.substring(propertyName.indexOf(":") + 1);
            if (namespaceSupport != null && namespaceSupport.getURI(prefix) != null) {
                String uri = namespaceSupport.getURI(prefix);
                QName qname = new QName(uri, localName, prefix);
                return hasDefaultMetacardFieldFor(qname);
            } else {
                return hasDefaultMetacardFieldFor(localName);
            }
        } else {
            return hasDefaultMetacardFieldFor(propertyName);
        }
    }

    public String getDefaultMetacardFieldForPrefixedString(String name) {
        return getDefaultMetacardFieldForPrefixedString(name, null);
    }

    public String getDefaultMetacardFieldForPrefixedString(String propertyName, NamespaceSupport namespaceSupport) {
        String name;
        if (propertyName.contains(":")) {
            String prefix = propertyName.substring(0, propertyName.indexOf(":"));
            String localName = propertyName.substring(propertyName.indexOf(":") + 1);
            if (namespaceSupport != null && namespaceSupport.getURI(prefix) != null) {
                String uri = namespaceSupport.getURI(prefix);
                QName qname = new QName(uri, localName, prefix);
                name = getDefaultMetacardFieldFor(qname);
            } else {
                name = getDefaultMetacardFieldFor(localName);
            }
        } else {
            name = getDefaultMetacardFieldFor(propertyName);
        }
        return name;
    }

    public List<QName> getCswFieldsFor(String metacardField) {
        if (METACARD_MAPPING.containsKey(metacardField)) {
            return METACARD_MAPPING.get(metacardField);
        }
        return Arrays.asList(new QName(metacardField));
    }

    public Map<String, String> getPrefixToUriMapping() {
        return PREFIX_TO_URI_MAPPING;
    }
}