/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.csw;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.opengis.cat.csw20.CapabilitiesType;
import net.opengis.cat.csw20.Csw20Factory;
import net.opengis.cat.csw20.GetCapabilitiesType;
import net.opengis.ows10.AddressType;
import net.opengis.ows10.CodeType;
import net.opengis.ows10.ContactType;
import net.opengis.ows10.DCPType;
import net.opengis.ows10.DomainType;
import net.opengis.ows10.HTTPType;
import net.opengis.ows10.KeywordsType;
import net.opengis.ows10.OnlineResourceType;
import net.opengis.ows10.OperationType;
import net.opengis.ows10.OperationsMetadataType;
import net.opengis.ows10.Ows10Factory;
import net.opengis.ows10.RequestMethodType;
import net.opengis.ows10.ResponsiblePartySubsetType;
import net.opengis.ows10.SectionsType;
import net.opengis.ows10.ServiceIdentificationType;
import net.opengis.ows10.ServiceProviderType;
import net.opengis.ows10.TelephoneType;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.geoserver.catalog.KeywordInfo;
import org.geoserver.config.ContactInfo;
import org.geoserver.csw.records.RecordDescriptor;
import org.geoserver.csw.store.CatalogStore;
import org.geoserver.ows.URLMangler.URLType;
import org.geoserver.ows.util.RequestUtils;
import org.geoserver.ows.util.ResponseUtils;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.factory.GeoTools;
import org.geotools.filter.capability.FilterCapabilitiesImpl;
import org.geotools.filter.capability.ScalarCapabilitiesImpl;
import org.geotools.filter.capability.SpatialCapabiltiesImpl;
import org.geotools.filter.capability.SpatialOperatorsImpl;
import org.geotools.util.logging.Logging;
import org.geotools.xml.EMFUtils;
import org.opengis.feature.type.Name;
import org.opengis.filter.FilterFactory2;
import org.opengis.filter.capability.ArithmeticOperators;
import org.opengis.filter.capability.ComparisonOperators;
import org.opengis.filter.capability.FilterCapabilities;
import org.opengis.filter.capability.GeometryOperand;
import org.opengis.filter.capability.IdCapabilities;
import org.opengis.filter.capability.Operator;
import org.opengis.filter.capability.ScalarCapabilities;
import org.opengis.filter.capability.SpatialCapabilities;
import org.opengis.filter.capability.SpatialOperator;
import org.opengis.filter.capability.SpatialOperators;
import org.springframework.context.ApplicationContext;
import org.xml.sax.helpers.NamespaceSupport;
/**
* The CSW GetCapabilities implementation
*
* @author Alessio Fabiani - GeoSolutions
*
*/
@SuppressWarnings("unchecked")
public class GetCapabilities {
private static final String CSW_VERSION = "2.0.2";
static final Logger LOGGER = Logging.getLogger(GetCapabilities.class);
static Csw20Factory cswf = Csw20Factory.eINSTANCE;
static Ows10Factory owsf = Ows10Factory.eINSTANCE;
private static final String version = CSW_VERSION;
static public Map<String, List<DomainType>> operationParameters = new HashMap<String, List<DomainType>>();
static public Map<String, List<DomainType>> operationConstraints = new HashMap<String, List<DomainType>>();
static
{
/**
* OperationMetadata
**/
operationParameters.put("OperationsMetadata", new LinkedList<DomainType>());
operationConstraints.put("OperationsMetadata", new LinkedList<DomainType>());
// - Parameters
DomainType opMetadataParam1 = owsf.createDomainType();
DomainType opMetadataParam2 = owsf.createDomainType();
opMetadataParam1.setName("service");
opMetadataParam1.getValue().add("http://www.opengis.net/cat/csw/2.0.2");
opMetadataParam2.setName("version");
opMetadataParam2.getValue().add(version);
operationParameters.get("OperationsMetadata").add(opMetadataParam1);
operationParameters.get("OperationsMetadata").add(opMetadataParam2);
// - Constraints
DomainType opMetadataConstraint1 = owsf.createDomainType();
opMetadataConstraint1.setName("PostEncoding");
opMetadataConstraint1.getValue().add("XML");
operationConstraints.get("OperationsMetadata").add(opMetadataConstraint1);
/**
* GetCapabilities
**/
operationParameters.put("GetCapabilities", new LinkedList<DomainType>());
operationConstraints.put("GetCapabilities", new LinkedList<DomainType>());
// - Parameters
DomainType getCapabilitiesParam = owsf.createDomainType();
getCapabilitiesParam.setName("sections");
getCapabilitiesParam.getValue().add("ServiceIdentification");
getCapabilitiesParam.getValue().add("ServiceProvider");
getCapabilitiesParam.getValue().add("OperationsMetadata");
getCapabilitiesParam.getValue().add("Filter_Capabilities");
operationParameters.get("GetCapabilities").add(getCapabilitiesParam);
// - Constraints
DomainType getCapabilitiesConstraint = owsf.createDomainType();
getCapabilitiesConstraint.setName("PostEncoding");
getCapabilitiesConstraint.getValue().add("XML");
operationConstraints.get("GetCapabilities").add(getCapabilitiesConstraint);
/**
* DescribeRecord
**/
operationParameters.put("DescribeRecord", new LinkedList<DomainType>());
operationConstraints.put("DescribeRecord", new LinkedList<DomainType>());
// - Parameters
DomainType describeRecordParam1 = owsf.createDomainType();
DomainType describeRecordParam2 = owsf.createDomainType();
DomainType describeRecordParam3 = owsf.createDomainType();
describeRecordParam1.setName("typeName");
describeRecordParam1.getValue().add("csw:Record");
describeRecordParam1.getValue().add("gmd:MD_Metadata");
describeRecordParam2.setName("outputFormat");
describeRecordParam2.getValue().add("application/xml");
describeRecordParam3.setName("schemaLanguage");
describeRecordParam3.getValue().add("http://www.w3.org/TR/xmlschema-1/");
operationParameters.get("DescribeRecord").add(describeRecordParam1);
operationParameters.get("DescribeRecord").add(describeRecordParam2);
operationParameters.get("DescribeRecord").add(describeRecordParam3);
// - Constraints
DomainType describeRecordConstraint = owsf.createDomainType();
describeRecordConstraint.setName("PostEncoding");
describeRecordConstraint.getValue().add("XML");
operationConstraints.get("DescribeRecord").add(describeRecordConstraint);
/**
* GetRecords
**/
operationParameters.put("GetRecords", new LinkedList<DomainType>());
operationConstraints.put("GetRecords", new LinkedList<DomainType>());
// - Parameters
DomainType getRecordsParam1 = owsf.createDomainType();
DomainType getRecordsParam2 = owsf.createDomainType();
DomainType getRecordsParam3 = owsf.createDomainType();
DomainType getRecordsParam4 = owsf.createDomainType();
DomainType getRecordsParam5 = owsf.createDomainType();
getRecordsParam1.setName("resultType");
getRecordsParam1.getValue().add("hits");
getRecordsParam1.getValue().add("results");
getRecordsParam1.getValue().add("validate");
getRecordsParam2.setName("outputFormat");
getRecordsParam2.getValue().add("application/xml");
getRecordsParam3.setName("outputSchema");
getRecordsParam3.getValue().add("http://www.opengis.net/cat/csw/2.0.2");
getRecordsParam3.getValue().add("http://www.isotc211.org/2005/gmd");
getRecordsParam4.setName("typeNames");
getRecordsParam4.getValue().add("csw:Record");
getRecordsParam4.getValue().add("gmd:MD_Metadata");
getRecordsParam5.setName("CONSTRAINTLANGUAGE");
getRecordsParam5.getValue().add("FILTER");
getRecordsParam5.getValue().add("CQL_TEXT");
operationParameters.get("GetRecords").add(getRecordsParam1);
operationParameters.get("GetRecords").add(getRecordsParam2);
operationParameters.get("GetRecords").add(getRecordsParam3);
operationParameters.get("GetRecords").add(getRecordsParam4);
operationParameters.get("GetRecords").add(getRecordsParam5);
// - Constraints
DomainType getRecordConstraint1 = owsf.createDomainType();
getRecordConstraint1.setName("PostEncoding");
getRecordConstraint1.getValue().add("XML");
operationConstraints.get("GetRecords").add(getRecordConstraint1);
/**
* GetRecordById
**/
operationParameters.put("GetRecordById", new LinkedList<DomainType>());
operationConstraints.put("GetRecordById", new LinkedList<DomainType>());
// - Parameters
DomainType getRecordByIdParam1 = owsf.createDomainType();
DomainType getRecordByIdParam2 = owsf.createDomainType();
DomainType getRecordByIdParam3 = owsf.createDomainType();
DomainType getRecordByIdParam4 = owsf.createDomainType();
getRecordByIdParam1.setName("resultType");
getRecordByIdParam1.getValue().add("hits");
getRecordByIdParam1.getValue().add("results");
getRecordByIdParam1.getValue().add("validate");
getRecordByIdParam2.setName("outputFormat");
getRecordByIdParam2.getValue().add("application/xml");
getRecordByIdParam3.setName("outputSchema");
getRecordByIdParam3.getValue().add("http://www.opengis.net/cat/csw/2.0.2");
getRecordByIdParam3.getValue().add("http://www.isotc211.org/2005/gmd");
getRecordByIdParam4.setName("ElementSetName");
getRecordByIdParam4.getValue().add("brief");
getRecordByIdParam4.getValue().add("summary");
getRecordByIdParam4.getValue().add("full");
operationParameters.get("GetRecordById").add(getRecordByIdParam1);
operationParameters.get("GetRecordById").add(getRecordByIdParam2);
operationParameters.get("GetRecordById").add(getRecordByIdParam3);
operationParameters.get("GetRecordById").add(getRecordByIdParam4);
// - Constraints
DomainType getRecordByIdConstraint1 = owsf.createDomainType();
getRecordByIdConstraint1.setName("PostEncoding");
getRecordByIdConstraint1.getValue().add("XML");
operationConstraints.get("GetRecordById").add(getRecordByIdConstraint1);
/**
* GetDomain
**/
operationParameters.put("GetDomain", new LinkedList<DomainType>());
operationConstraints.put("GetDomain", new LinkedList<DomainType>());
// - Parameters
DomainType getDomainParam1 = owsf.createDomainType();
DomainType getDomainParam2 = owsf.createDomainType();
getDomainParam1.setName("parameterName");
getDomainParam1.getValue().add("xsd:anyURI");
getDomainParam2.setName("propertyName");
getDomainParam2.getValue().add("xsd:anyURI");
operationParameters.get("GetDomain").add(getDomainParam1);
operationParameters.get("GetDomain").add(getDomainParam2);
/**
* Transaction
**/
operationParameters.put("Transaction", new LinkedList<DomainType>());
operationConstraints.put("Transaction", new LinkedList<DomainType>());
}
private static final boolean logicalOperators = true;
private static final boolean eid = true;
private static final boolean fid = true;
public CSWInfo csw;
public CatalogStore store;
ApplicationContext context;
public GetCapabilities(CSWInfo csw, CatalogStore store, ApplicationContext context) {
this.csw = csw;
this.store = store;
this.context = context;
}
public CapabilitiesType run(GetCapabilitiesType request) throws CSWException {
// do the version negotiation dance
SectionsType sections = null;
List<String> provided = Collections.singletonList(CSW_VERSION);
List<String> accepted = null;
if (request.getAcceptVersions() != null)
accepted = request.getAcceptVersions().getVersion();
String version = RequestUtils.getVersionOws11(provided, accepted);
if (!CSW_VERSION.equals(version)) {
throw new CSWException("Could not understand version:" + version);
}
if (request.getSections() != null) {
sections = request.getSections();
}
// encode the response
CapabilitiesType caps = cswf.createCapabilitiesType();
caps.setVersion(CSW_VERSION);
// ServiceIdentification
if (sections == null || requestedSection("ServiceIdentification", sections)) {
ServiceIdentificationType si = owsf.createServiceIdentificationType();
caps.setServiceIdentification(si);
si.setTitle(csw.getTitle());
si.setAbstract(csw.getAbstract());
KeywordsType kw = null;
List<KeywordInfo> keywords = csw.getKeywords();
if (keywords != null && keywords.size() > 0) {
kw = owsf.createKeywordsType();
for (KeywordInfo keyword : keywords) {
kw.getKeyword().add(keyword.getValue());
}
}
if (kw != null) {
si.getKeywords().add(kw);
}
CodeType CSW = owsf.createCodeType();
CSW.setValue("CSW");
si.setServiceType(CSW);
si.setServiceTypeVersion(CSW_VERSION);
si.setFees(csw.getFees());
if (csw.getAccessConstraints() != null) {
si.setAccessConstraints(csw.getAccessConstraints());
}
}
// ServiceProvider
if (sections == null || requestedSection("ServiceProvider", sections)) {
ServiceProviderType sp = owsf.createServiceProviderType();
caps.setServiceProvider(sp);
final ContactInfo contact = csw.getGeoServer().getGlobal().getSettings().getContact();
sp.setProviderName((contact.getContactOrganization() != null ? contact.getContactOrganization() : ""));
OnlineResourceType providerSite = owsf.createOnlineResourceType();
sp.setProviderSite(providerSite);
providerSite.setHref((csw.getOnlineResource() != null ? csw.getOnlineResource() : ""));
ResponsiblePartySubsetType serviceContact = owsf.createResponsiblePartySubsetType();
sp.setServiceContact(serviceContact);
serviceContact.setIndividualName(contact.getContactPerson());
serviceContact.setPositionName(contact.getContactPosition());
ContactType contactInfo = owsf.createContactType();
serviceContact.setContactInfo(contactInfo);
AddressType address = owsf.createAddressType();
contactInfo.setAddress(address);
address.setAdministrativeArea(contact.getAddressState());
address.setCity(contact.getAddressCity());
address.setCountry(contact.getAddressCountry());
address.setDeliveryPoint(null);
address.setElectronicMailAddress(contact.getContactEmail());
address.setPostalCode(contact.getAddressPostalCode());
contactInfo.setContactInstructions(null);
contactInfo.setHoursOfService(null);
OnlineResourceType onlineResource = owsf.createOnlineResourceType();
contactInfo.setOnlineResource(onlineResource);
onlineResource.setHref(contact.getOnlineResource());
TelephoneType telephone = owsf.createTelephoneType();
contactInfo.setPhone(telephone);
telephone.setFacsimile(contact.getContactFacsimile());
telephone.setVoice(contact.getContactVoice());
serviceContact.setRole(null);
}
// Operations Metadata
if (sections == null || requestedSection("OperationsMetadata", sections)) {
final String baseUrl = (String) EMFUtils.get(request, "baseUrl");
if (baseUrl == null) {
throw new IllegalArgumentException("Request object" + request
+ " has no 'baseUrl' property.");
}
OperationsMetadataType operationsMetadata = owsf.createOperationsMetadataType();
caps.setOperationsMetadata(operationsMetadata);
OperationMetadata_GetCapabilities(owsf, baseUrl, operationsMetadata);
OperationMetadata_DescribeRecord(owsf, baseUrl, operationsMetadata);
OperationMetadata_GetDomain(owsf, baseUrl, operationsMetadata);
OperationMetadata_GetRecords(owsf, baseUrl, operationsMetadata);
OperationMetadata_GetRecordById(owsf, baseUrl, operationsMetadata);
if (store.getCapabilities().supportsTransactions()) {
OperationMetadata_Transaction(owsf, baseUrl, operationsMetadata);
}
// - Parameters
for (DomainType param : operationParameters.get("OperationsMetadata"))
{
// clone the object, as the caps decorators might want to modify it
operationsMetadata.getParameter().add(EcoreUtil.copy(param));
}
// - Constraints
for (DomainType constraint : operationConstraints.get("OperationsMetadata"))
{
// clone the object, as the caps decorators might want to modify it
operationsMetadata.getConstraint().add(EcoreUtil.copy(constraint));
}
}
// Filter Capabilities
// this part is not optional, the schema has min = 0, so we don't check for the sections
final FilterFactory2 ffFactory = CommonFactoryFinder.getFilterFactory2(GeoTools.getDefaultHints());
// - Spatial Capabilities
//SpatialCapabilities spatialCapabilities = ffFactory.spatialCapabilities(geometryOperands, spatialOperands);
SpatialCapabilities spatialCapabilities = new CSWSpatialCapabilities();
// - Scalar Capabilities
Operator[] operators = new Operator[] { ffFactory.operator("EqualTo"),
ffFactory.operator("Like"), ffFactory.operator("LessThan"),
ffFactory.operator("GreaterThan"), ffFactory.operator("LessThanEqualTo"),
ffFactory.operator("GreaterThanEqualTo"), ffFactory.operator("NotEqualTo"),
ffFactory.operator("Between"), ffFactory.operator("NullCheck") };
ComparisonOperators comparisonOperators = ffFactory.comparisonOperators(operators);
ArithmeticOperators arithmeticOperators = ffFactory.arithmeticOperators(true, null);
ScalarCapabilities scalarCapabilities = ffFactory.scalarCapabilities(
comparisonOperators, arithmeticOperators, logicalOperators);
// - removing Arithmetic Operators...
((ScalarCapabilitiesImpl)scalarCapabilities).setArithmeticOperators(null);
// - Id Capabilities
IdCapabilities id = ffFactory.idCapabilities(eid, fid);
FilterCapabilities filterCapabilities = ffFactory.capabilities("1.1.0",
scalarCapabilities, spatialCapabilities, id);
((FilterCapabilitiesImpl)filterCapabilities).setScalar(scalarCapabilities);
((FilterCapabilitiesImpl)filterCapabilities).setSpatial(spatialCapabilities);
((FilterCapabilitiesImpl)filterCapabilities).setId(id);
caps.setFilterCapabilities(filterCapabilities);
return caps;
}
private static boolean requestedSection(String sectionName, SectionsType sections) {
boolean sectionIsRequested = false;
for (Object section : sections.getSection()) {
if (((String) section).equalsIgnoreCase(sectionName)) {
sectionIsRequested = true;
break;
}
}
return sectionIsRequested;
}
/**
* @param owsf
* @param baseUrl
* @param operationsMetadata
*/
private void OperationMetadata_GetCapabilities(Ows10Factory owsf, final String baseUrl,
OperationsMetadataType operationsMetadata) {
// - GetCapabilities
OperationType getCapabilities = owsf.createOperationType();
operationsMetadata.getOperation().add(getCapabilities);
getCapabilities.setName("GetCapabilities");
DCPType getCapabilitiesDCP = owsf.createDCPType();
getCapabilities.getDCP().add(getCapabilitiesDCP);
HTTPType getCapabilitiesHTTP = owsf.createHTTPType();
getCapabilitiesDCP.setHTTP(getCapabilitiesHTTP);
String getCapabilitiesHref = ResponseUtils.buildURL(baseUrl, "csw",
new HashMap<String, String>(), URLType.SERVICE);
RequestMethodType getCapabilitiesGet = owsf.createRequestMethodType();
getCapabilitiesGet.setHref(getCapabilitiesHref);
getCapabilitiesHTTP.getGet().add(getCapabilitiesGet);
RequestMethodType getCapabilitiesPost = owsf.createRequestMethodType();
getCapabilitiesPost.setHref(getCapabilitiesHref);
getCapabilitiesHTTP.getPost().add(getCapabilitiesPost);
// - Parameters
for (DomainType param : operationParameters.get("GetCapabilities"))
{
// clone the object, as the caps decorators might want to modify it
getCapabilities.getParameter().add(EcoreUtil.copy(param));
}
// - Constraints
for (DomainType constraint : operationConstraints.get("GetCapabilities"))
{
// clone the object, as the caps decorators might want to modify it
getCapabilities.getConstraint().add(EcoreUtil.copy(constraint));
}
}
/**
*
* @param owsf
* @param baseUrl
* @param operationsMetadata
*/
private void OperationMetadata_DescribeRecord(Ows10Factory owsf, String baseUrl,
OperationsMetadataType operationsMetadata) {
// - DescribeRecord
OperationType describeRecord = owsf.createOperationType();
operationsMetadata.getOperation().add(describeRecord);
describeRecord.setName("DescribeRecord");
DCPType describeRecordDCP = owsf.createDCPType();
describeRecord.getDCP().add(describeRecordDCP);
HTTPType describeRecordHTTP = owsf.createHTTPType();
describeRecordDCP.setHTTP(describeRecordHTTP);
String describeRecordHref = ResponseUtils.buildURL(baseUrl, "csw",
new HashMap<String, String>(), URLType.SERVICE);
RequestMethodType describeRecordGet = owsf.createRequestMethodType();
describeRecordGet.setHref(describeRecordHref);
describeRecordHTTP.getGet().add(describeRecordGet);
RequestMethodType describeRecordPost = owsf.createRequestMethodType();
describeRecordPost.setHref(describeRecordHref);
// - DescribeRecord - constraints
DomainType describeRecordPostConstraints = owsf.createDomainType();
describeRecordPostConstraints.setName("PostEncoding");
describeRecordPostConstraints.getValue().add("XML");
describeRecordPost.getConstraint().add(describeRecordPostConstraints);
describeRecordHTTP.getPost().add(describeRecordPost);
// - Parameters
for (DomainType param : operationParameters.get("DescribeRecord"))
{
// clone the object, as the caps decorators might want to modify it
describeRecord.getParameter().add(EcoreUtil.copy(param));
}
// - Constraints
for (DomainType constraint : operationConstraints.get("DescribeRecord"))
{
// clone the object, as the caps decorators might want to modify it
describeRecord.getConstraint().add(EcoreUtil.copy(constraint));
}
}
/**
*
* @param owsf
* @param baseUrl
* @param operationsMetadata
*/
private void OperationMetadata_GetRecords(Ows10Factory owsf, String baseUrl,
OperationsMetadataType operationsMetadata) {
// - GetRecords
OperationType getRecords = owsf.createOperationType();
operationsMetadata.getOperation().add(getRecords);
getRecords.setName("GetRecords");
DCPType getRecordsDCP = owsf.createDCPType();
getRecords.getDCP().add(getRecordsDCP);
HTTPType getRecordsHTTP = owsf.createHTTPType();
getRecordsDCP.setHTTP(getRecordsHTTP);
String getRecordsHref = ResponseUtils.buildURL(baseUrl, "csw",
new HashMap<String, String>(), URLType.SERVICE);
RequestMethodType getRecordsGet = owsf.createRequestMethodType();
getRecordsGet.setHref(getRecordsHref);
getRecordsHTTP.getGet().add(getRecordsGet);
RequestMethodType getRecordsPost = owsf.createRequestMethodType();
getRecordsPost.setHref(getRecordsHref);
// - GetRecords - constraints
DomainType getRecordsPostConstraints = owsf.createDomainType();
getRecordsPostConstraints.setName("PostEncoding");
getRecordsPostConstraints.getValue().add("XML");
getRecordsPost.getConstraint().add(getRecordsPostConstraints);
getRecordsHTTP.getPost().add(getRecordsPost);
// - Parameters
for (DomainType param : operationParameters.get("GetRecords"))
{
// clone the object, as the caps decorators might want to modify it
getRecords.getParameter().add(EcoreUtil.copy(param));
}
// - Constraints
for (DomainType constraint : operationConstraints.get("GetRecords"))
{
// clone the object, as the caps decorators might want to modify it
getRecords.getConstraint().add(EcoreUtil.copy(constraint));
}
// the additional queriables based on the store
try {
for(RecordDescriptor rd : store.getRecordDescriptors()) {
List<Name> queriables = store.getCapabilities().getQueriables(rd.getFeatureDescriptor().getName() );
if(queriables != null && queriables.size() > 0) {
DomainType dt = owsf.createDomainType();
dt.setName(rd.getQueryablesDescription());
NamespaceSupport nss = rd.getNamespaceSupport();
for (Name q : queriables) {
String prefix = nss.getPrefix(q.getNamespaceURI());
dt.getValue().add(prefix==null? q.getLocalPart() : prefix + ":" + q.getLocalPart());
}
getRecords.getConstraint().add(dt);
}
}
DomainType dt = owsf.createDomainType();
dt.setName("XPathQueryables");
dt.getValue().add("allowed");
getRecords.getConstraint().add(dt);
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Failed to encode getRecords additional queriables", e);
}
}
/**
*
* @param owsf
* @param baseUrl
* @param operationsMetadata
*/
private void OperationMetadata_GetRecordById(Ows10Factory owsf, String baseUrl,
OperationsMetadataType operationsMetadata) {
// - GetRecordById
OperationType getRecordById = owsf.createOperationType();
operationsMetadata.getOperation().add(getRecordById);
getRecordById.setName("GetRecordById");
DCPType getRecordByIdDCP = owsf.createDCPType();
getRecordById.getDCP().add(getRecordByIdDCP);
HTTPType getRecordByIdHTTP = owsf.createHTTPType();
getRecordByIdDCP.setHTTP(getRecordByIdHTTP);
String getRecordByIdHref = ResponseUtils.buildURL(baseUrl, "csw",
new HashMap<String, String>(), URLType.SERVICE);
RequestMethodType getRecordByIdGet = owsf.createRequestMethodType();
getRecordByIdGet.setHref(getRecordByIdHref);
getRecordByIdHTTP.getGet().add(getRecordByIdGet);
RequestMethodType getRecordByIdPost = owsf.createRequestMethodType();
getRecordByIdPost.setHref(getRecordByIdHref);
// - GetRecordById - constraints
DomainType getRecordByIdPostConstraints = owsf.createDomainType();
getRecordByIdPostConstraints.setName("PostEncoding");
getRecordByIdPostConstraints.getValue().add("XML");
getRecordByIdPost.getConstraint().add(getRecordByIdPostConstraints);
getRecordByIdHTTP.getPost().add(getRecordByIdPost);
// - Parameters
for (DomainType param : operationParameters.get("GetRecordById"))
{
// clone the object, as the caps decorators might want to modify it
getRecordById.getParameter().add(EcoreUtil.copy(param));
}
// - Constraints
for (DomainType constraint : operationConstraints.get("GetRecordById"))
{
// clone the object, as the caps decorators might want to modify it
getRecordById.getConstraint().add(EcoreUtil.copy(constraint));
}
}
/**
*
* @param owsf
* @param baseUrl
* @param operationsMetadata
*/
private void OperationMetadata_GetDomain(Ows10Factory owsf, String baseUrl,
OperationsMetadataType operationsMetadata) {
// - GetDomain
OperationType getDomain = owsf.createOperationType();
operationsMetadata.getOperation().add(getDomain);
getDomain.setName("GetDomain");
DCPType getDomainDCP = owsf.createDCPType();
getDomain.getDCP().add(getDomainDCP);
HTTPType getDomainHTTP = owsf.createHTTPType();
getDomainDCP.setHTTP(getDomainHTTP);
String getDomainHref = ResponseUtils.buildURL(baseUrl, "csw",
new HashMap<String, String>(), URLType.SERVICE);
RequestMethodType getDomainGet = owsf.createRequestMethodType();
getDomainGet.setHref(getDomainHref);
getDomainHTTP.getGet().add(getDomainGet);
RequestMethodType getDomainPost = owsf.createRequestMethodType();
getDomainPost.setHref(getDomainHref);
// - GetDomain - constraints
DomainType getDomainPostConstraints = owsf.createDomainType();
getDomainPostConstraints.setName("PostEncoding");
getDomainPostConstraints.getValue().add("XML");
getDomainPost.getConstraint().add(getDomainPostConstraints);
getDomainHTTP.getPost().add(getDomainPost);
// - Fixed Parameters
for (DomainType param : operationParameters.get("GetDomain"))
{
// clone the object, as the caps decorators might want to modify it
getDomain.getParameter().add(EcoreUtil.copy(param));
}
// The domain queriables list from the catalog store
try {
Set<String> summary = new HashSet<String>();
for (RecordDescriptor rd : store.getRecordDescriptors()) {
List<Name> queriables = store.getCapabilities().getDomainQueriables(rd.getFeatureDescriptor().getName());
if (queriables != null && queriables.size() > 0) {
NamespaceSupport nss = rd.getNamespaceSupport();
for (Name q : queriables) {
String prefix = nss.getPrefix(q.getNamespaceURI());
summary.add(prefix==null? q.getLocalPart() : prefix + ":" + q.getLocalPart());
}
}
}
if(summary.size() > 0) {
List<String> sorted = new ArrayList<String>(summary);
Collections.sort(sorted);
DomainType dt = owsf.createDomainType();
dt.setName("PropertyName");
for (String name : sorted) {
dt.getValue().add(name);
}
getDomain.getParameter().add(dt);
}
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Failed to encode getDomain ParameterName values", e);
}
// - Constraints
for (DomainType constraint : operationConstraints.get("GetDomain"))
{
getDomain.getConstraint().add(EcoreUtil.copy(constraint));
}
}
/**
*
* @param owsf
* @param baseUrl
* @param operationsMetadata
*/
private void OperationMetadata_Transaction(Ows10Factory owsf, String baseUrl,
OperationsMetadataType operationsMetadata) {
// - Transaction
OperationType transaction = owsf.createOperationType();
operationsMetadata.getOperation().add(transaction);
transaction.setName("Transaction");
DCPType transactionDCP = owsf.createDCPType();
transaction.getDCP().add(transactionDCP);
HTTPType transactionHTTP = owsf.createHTTPType();
transactionDCP.setHTTP(transactionHTTP);
String transactionHref = ResponseUtils.buildURL(baseUrl, "csw",
new HashMap<String, String>(), URLType.SERVICE);
RequestMethodType transactionGet = owsf.createRequestMethodType();
transactionGet.setHref(transactionHref);
transactionHTTP.getGet().add(transactionGet);
RequestMethodType transactionPost = owsf.createRequestMethodType();
transactionPost.setHref(transactionHref);
// - Transaction - constraints
DomainType transactionPostConstraints = owsf.createDomainType();
transactionPostConstraints.setName("PostEncoding");
transactionPostConstraints.getValue().add("XML");
transactionPost.getConstraint().add(transactionPostConstraints);
transactionHTTP.getPost().add(transactionPost);
// - Parameters
for (DomainType param : operationParameters.get("Transaction"))
{
// clone the object, as the caps decorators might want to modify it
transaction.getParameter().add(EcoreUtil.copy(param));
}
// - Constraints
for (DomainType constraint : operationConstraints.get("Transaction"))
{
// clone the object, as the caps decorators might want to modify it
transaction.getConstraint().add(EcoreUtil.copy(constraint));
}
}
}
class CSWSpatialCapabilities extends SpatialCapabiltiesImpl {
static final SpatialOperator[] spatialOperators = new SpatialOperator[] {
spatialOperator("BBOX"),
spatialOperator("Equals"),
spatialOperator("Overlaps"),
spatialOperator("Disjoint"),
spatialOperator("Intersects"),
spatialOperator("Touches"),
spatialOperator("Crosses"),
spatialOperator("Within"),
spatialOperator("Contains"),
spatialOperator("Beyond"),
spatialOperator("DWithin") };
static final GeometryOperand[] geometryOpertors = new GeometryOperand[] {
GeometryOperand.get("http://www.opengis.net/gml", "Envelope"),
GeometryOperand.get("http://www.opengis.net/gml", "Point"),
GeometryOperand.get("http://www.opengis.net/gml", "LineString"),
GeometryOperand.get("http://www.opengis.net/gml", "Polygon") };
SpatialOperators spatialOperands = new SpatialOperatorsImpl();
List<GeometryOperand> geometryOperands = new LinkedList<GeometryOperand>();
@Override
public Collection<GeometryOperand> getGeometryOperands() {
synchronized(geometryOperands)
{
if(geometryOperands == null || geometryOperands.isEmpty())
{
// - sorting Geometry Operands
for (GeometryOperand operator : geometryOpertors)
{
geometryOperands.add(operator);
}
Collections.sort(geometryOperands, new Comparator<GeometryOperand>() {
@Override
public int compare(GeometryOperand o1, GeometryOperand o2) {
if (o2.getLocalPart().contains("Envelope"))
{
return -1;
}
if (o2.getLocalPart().contains("Point"))
{
if (o1.getLocalPart().contains("Envelope"))
{
return -1;
}
else
{
return 1;
}
}
if (o2.getLocalPart().contains("LineString"))
{
if (o1.getLocalPart().contains("Point"))
{
return -1;
}
else
{
return 1;
}
}
if (o2.getLocalPart().contains("Polygon"))
{
if (o1.getLocalPart().contains("LineString"))
{
return -1;
}
else
{
return 1;
}
}
return 0;
}
});
}
}
return geometryOperands;
}
@Override
public SpatialOperatorsImpl getSpatialOperators() {
synchronized(spatialOperands)
{
if (spatialOperands == null || spatialOperands.getOperators() == null || spatialOperands.getOperators().size() == 0)
{
spatialOperands = new SpatialOperatorsImpl();
for (SpatialOperator operator : spatialOperators)
{
if(((SpatialOperatorsImpl)spatialOperands).getOperators() == null)
{
((SpatialOperatorsImpl)spatialOperands).setOperators(new HashSet<SpatialOperator>());
}
((SpatialOperatorsImpl)spatialOperands).getOperators().add(operator);
}
}
}
return (SpatialOperatorsImpl) spatialOperands;
}
private static SpatialOperator spatialOperator(final String name) {
return new SpatialOperator() {
@Override
public String getName() {
return name;
}
@Override
public Collection<GeometryOperand> getGeometryOperands() {
return null;
}
};
}
};