/**
* 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;
}
}