/* * Constellation - An open source and standard compliant SDI * http://www.constellation-sdi.org * * Copyright 2014 Geomatys. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.constellation.metadata; import net.jcip.annotations.Immutable; import org.constellation.dto.AccessConstraint; import org.constellation.dto.Contact; import org.constellation.dto.Details; import org.constellation.ws.MimeType; import org.geotoolkit.csw.xml.AbstractCapabilities; import org.geotoolkit.csw.xml.CswXmlFactory; import org.geotoolkit.ogc.xml.v110.ComparisonOperatorType; import org.geotoolkit.ogc.xml.v110.ComparisonOperatorsType; import org.geotoolkit.ogc.xml.v110.FilterCapabilities; import org.geotoolkit.ogc.xml.v110.GeometryOperandsType; import org.geotoolkit.ogc.xml.v110.IdCapabilitiesType; import org.geotoolkit.ogc.xml.v110.ScalarCapabilitiesType; import org.geotoolkit.ogc.xml.v110.SpatialCapabilitiesType; import org.geotoolkit.ogc.xml.v110.SpatialOperatorType; import org.geotoolkit.ogc.xml.v110.SpatialOperatorsType; import org.geotoolkit.ows.xml.AbstractContact; import org.geotoolkit.ows.xml.AbstractDCP; import org.geotoolkit.ows.xml.AbstractDomain; import org.geotoolkit.ows.xml.AbstractOnlineResourceType; import org.geotoolkit.ows.xml.AbstractOperation; import org.geotoolkit.ows.xml.AbstractOperationsMetadata; import org.geotoolkit.ows.xml.AbstractResponsiblePartySubset; import org.geotoolkit.ows.xml.AbstractServiceIdentification; import org.geotoolkit.ows.xml.AbstractServiceProvider; import org.geotoolkit.ows.xml.OWSXmlFactory; import org.opengis.filter.capability.Operator; import org.opengis.filter.capability.SpatialOperator; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.apache.sis.util.ArgumentChecks.ensureNonNull; import static org.geotoolkit.gml.xml.v311.ObjectFactory._Envelope_QNAME; import static org.geotoolkit.gml.xml.v311.ObjectFactory._LineString_QNAME; import static org.geotoolkit.gml.xml.v311.ObjectFactory._Point_QNAME; import static org.geotoolkit.gml.xml.v311.ObjectFactory._Polygon_QNAME; /** * CSW constants. * * @version $Id$ * @author Guilhem Legal (Geomatys) */ @Immutable public abstract class CSWConstants { /** * Request parameters. */ public static final String CSW_202_VERSION = "2.0.2"; public static final String CSW = "CSW"; public static final String OUTPUT_SCHEMA = "outputSchema"; public static final String TYPENAMES = "TypeNames"; public static final String FILTER_CAPABILITIES = "Filter_Capabilities"; public static final String PARAMETERNAME = "parameterName"; public static final String TRANSACTION_TYPE = "TransactionType"; public static final String SOURCE = "Source"; public static final String ALL = "All"; public static final String NAMESPACE = "namespace"; public static final String XML_EXT = ".xml"; public static final String NETCDF_EXT = ".nc"; public static final String NCML_EXT = ".ncml"; public static final String CSW_SCHEMA_LOCATION = "http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/csw.xsd"; public static final String ISO_SCHEMA_LOCATION = "http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd http://www.isotc211.org/2005/gmx http://schemas.opengis.net/iso/19139/20070417/gmx/gmx.xsd"; // TODO those 3 namespace must move to geotk Namespace class public static final String EBRIM_25 = "urn:oasis:names:tc:ebxml-regrep:rim:xsd:2.5"; public static final String EBRIM_30 = "urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0"; /** * A list of supported MIME type. */ public static final List<String> ACCEPTED_OUTPUT_FORMATS; static { ACCEPTED_OUTPUT_FORMATS = new ArrayList<>(); ACCEPTED_OUTPUT_FORMATS.add(MimeType.TEXT_XML); ACCEPTED_OUTPUT_FORMATS.add(MimeType.APPLICATION_XML); ACCEPTED_OUTPUT_FORMATS.add(MimeType.TEXT_HTML); ACCEPTED_OUTPUT_FORMATS.add(MimeType.TEXT_PLAIN); } /** * Error message */ public static final String NOT_EXIST = " does not exist"; public static final String MALFORMED = " is malformed"; public static final AbstractOperationsMetadata OPERATIONS_METADATA; static { final List<AbstractDCP> getAndPost = new ArrayList<>(); getAndPost.add(OWSXmlFactory.buildDCP("1.0.0", "somURL", "someURL")); final List<AbstractDCP> onlyPost = new ArrayList<>(); onlyPost.add(OWSXmlFactory.buildDCP("1.0.0", "somURL", "someURL")); final List<AbstractOperation> operations = new ArrayList<>(); final List<AbstractDomain> gcParameters = new ArrayList<>(); gcParameters.add(OWSXmlFactory.buildDomain("1.0.0", "sections", Arrays.asList("All", "ServiceIdentification", "ServiceProvider", "OperationsMetadata", "Filter_Capabilities"))); gcParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Version", Arrays.asList("2.0.2"))); gcParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Service", Arrays.asList("CSW"))); final AbstractOperation getCapabilities = OWSXmlFactory.buildOperation("1.0.0", getAndPost, gcParameters, null, "GetCapabilities"); operations.add(getCapabilities); final List<AbstractDomain> grParameters = new ArrayList<>(); grParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Version", Arrays.asList("2.0.2"))); grParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Service", Arrays.asList("CSW"))); grParameters.add(OWSXmlFactory.buildDomain("1.0.0", "TypeNames", Arrays.asList("gmd:MD_Metadata", "csw:Record"))); grParameters.add(OWSXmlFactory.buildDomain("1.0.0", "outputFormat", Arrays.asList("text/xml", "application/xml"))); grParameters.add(OWSXmlFactory.buildDomain("1.0.0", "outputSchema", Arrays.asList("http://www.opengis.net/cat/csw/2.0.2", "http://www.isotc211.org/2005/gmd"))); grParameters.add(OWSXmlFactory.buildDomain("1.0.0", "resultType", Arrays.asList("hits", "results", "validate"))); grParameters.add(OWSXmlFactory.buildDomain("1.0.0", "ElementSetName", Arrays.asList("brief", "summary", "full"))); grParameters.add(OWSXmlFactory.buildDomain("1.0.0", "CONSTRAINTLANGUAGE", Arrays.asList("Filter", "CQL"))); final List<AbstractDomain> grConstraints = new ArrayList<>(); final List<String> supportedISOQueryable = new ArrayList<>(); supportedISOQueryable.add("RevisionDate"); supportedISOQueryable.add("AlternateTitle"); supportedISOQueryable.add("CreationDate"); supportedISOQueryable.add("PublicationDate"); supportedISOQueryable.add("OrganisationName"); supportedISOQueryable.add("HasSecurityConstraints"); supportedISOQueryable.add("Language"); supportedISOQueryable.add("ResourceIdentifier"); supportedISOQueryable.add("ParentIdentifier"); supportedISOQueryable.add("KeywordType"); supportedISOQueryable.add("TopicCategory"); supportedISOQueryable.add("ResourceLanguage"); supportedISOQueryable.add("GeographicDescriptionCode"); supportedISOQueryable.add("DistanceValue"); supportedISOQueryable.add("DistanceUOM"); supportedISOQueryable.add("TempExtent_begin"); supportedISOQueryable.add("TempExtent_end"); supportedISOQueryable.add("ServiceType"); supportedISOQueryable.add("ServiceTypeVersion"); supportedISOQueryable.add("Operation"); supportedISOQueryable.add("CouplingType"); supportedISOQueryable.add("OperatesOn"); supportedISOQueryable.add("Denominator"); supportedISOQueryable.add("OperatesOnIdentifier"); supportedISOQueryable.add("OperatesOnWithOpName"); grConstraints.add(OWSXmlFactory.buildDomain("1.0.0", "SupportedISOQueryables", supportedISOQueryable)); grConstraints.add(OWSXmlFactory.buildDomain("1.0.0", "AdditionalQueryables", Arrays.asList("HierarchyLevelName"))); final AbstractOperation getRecords = OWSXmlFactory.buildOperation("1.0.0", getAndPost, grParameters, grConstraints, "GetRecords"); operations.add(getRecords); final List<AbstractDomain> grbParameters = new ArrayList<>(); grbParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Version", Arrays.asList("2.0.2"))); grbParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Service", Arrays.asList("CSW"))); grbParameters.add(OWSXmlFactory.buildDomain("1.0.0", "ElementSetName", Arrays.asList("brief", "summary", "full"))); grbParameters.add(OWSXmlFactory.buildDomain("1.0.0", "outputSchema", Arrays.asList("http://www.opengis.net/cat/csw/2.0.2", "http://www.isotc211.org/2005/gmd"))); grbParameters.add(OWSXmlFactory.buildDomain("1.0.0", "outputFormat", Arrays.asList("text/xml", "application/xml"))); final AbstractOperation getRecordById = OWSXmlFactory.buildOperation("1.0.0", getAndPost, grbParameters, null, "GetRecordById"); operations.add(getRecordById); final List<AbstractDomain> drParameters = new ArrayList<>(); drParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Version", Arrays.asList("2.0.2"))); drParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Service", Arrays.asList("CSW"))); drParameters.add(OWSXmlFactory.buildDomain("1.0.0", "TypeName", Arrays.asList("gmd:MD_Metadata", "csw:Record"))); drParameters.add(OWSXmlFactory.buildDomain("1.0.0", "SchemaLanguage", Arrays.asList("http://www.w3.org/XML/Schema", "XMLSCHEMA"))); drParameters.add(OWSXmlFactory.buildDomain("1.0.0", "outputFormat", Arrays.asList("text/xml", "application/xml"))); final AbstractOperation describeRecord = OWSXmlFactory.buildOperation("1.0.0", getAndPost, drParameters, null, "DescribeRecord"); operations.add(describeRecord); final List<AbstractDomain> gdParameters = new ArrayList<>(); gdParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Version", Arrays.asList("2.0.2"))); gdParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Service", Arrays.asList("CSW"))); final AbstractOperation getDomain = OWSXmlFactory.buildOperation("1.0.0", getAndPost, gdParameters, null, "GetDomain"); operations.add(getDomain); final List<AbstractDomain> tParameters = new ArrayList<>(); tParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Version", Arrays.asList("2.0.2"))); tParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Service", Arrays.asList("CSW"))); tParameters.add(OWSXmlFactory.buildDomain("1.0.0", "ResourceType", Arrays.asList("toUpdate"))); final AbstractOperation transaction = OWSXmlFactory.buildOperation("1.0.0", onlyPost, tParameters, null, "Transaction"); operations.add(transaction); final List<AbstractDomain> hParameters = new ArrayList<>(); hParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Version", Arrays.asList("2.0.2"))); hParameters.add(OWSXmlFactory.buildDomain("1.0.0", "Service", Arrays.asList("CSW"))); hParameters.add(OWSXmlFactory.buildDomain("1.0.0", "ResourceType", Arrays.asList("toUpdate"))); final AbstractOperation harvest = OWSXmlFactory.buildOperation("1.0.0", onlyPost, hParameters, null, "Harvest"); operations.add(harvest); final List<AbstractDomain> parameters = new ArrayList<>(); parameters.add(OWSXmlFactory.buildDomain("1.0.0", "service", Arrays.asList("CSW"))); parameters.add(OWSXmlFactory.buildDomain("1.0.0", "version", Arrays.asList("2.0.2"))); final List<AbstractDomain> constraints = new ArrayList<>(); constraints.add(OWSXmlFactory.buildDomain("1.0.0", "PostEncoding", Arrays.asList("XML"))); OPERATIONS_METADATA = OWSXmlFactory.buildOperationsMetadata("1.0.0", operations, parameters, constraints, null); } public static final FilterCapabilities CSW_FILTER_CAPABILITIES = new FilterCapabilities(); static { final GeometryOperandsType geom = new GeometryOperandsType(Arrays.asList(_Envelope_QNAME, _Point_QNAME, _LineString_QNAME, _Polygon_QNAME)); final SpatialOperator[] spaOps = new SpatialOperator[11]; spaOps[0] = new SpatialOperatorType("BBOX", null); spaOps[1] = new SpatialOperatorType("BEYOND", null); spaOps[2] = new SpatialOperatorType("CONTAINS", null); spaOps[3] = new SpatialOperatorType("CROSSES", null); spaOps[4] = new SpatialOperatorType("DISJOINT", null); spaOps[5] = new SpatialOperatorType("D_WITHIN", null); spaOps[6] = new SpatialOperatorType("EQUALS", null); spaOps[7] = new SpatialOperatorType("INTERSECTS", null); spaOps[8] = new SpatialOperatorType("OVERLAPS", null); spaOps[9] = new SpatialOperatorType("TOUCHES", null); spaOps[10] = new SpatialOperatorType("WITHIN", null); final SpatialOperatorsType spaOp = new SpatialOperatorsType(spaOps); final SpatialCapabilitiesType spatial = new SpatialCapabilitiesType(geom, spaOp); CSW_FILTER_CAPABILITIES.setSpatialCapabilities(spatial); final Operator[] compOps = new Operator[9]; compOps[0] = ComparisonOperatorType.BETWEEN; compOps[1] = ComparisonOperatorType.EQUAL_TO; compOps[2] = ComparisonOperatorType.NOT_EQUAL_TO; compOps[3] = ComparisonOperatorType.LESS_THAN; compOps[4] = ComparisonOperatorType.LESS_THAN_EQUAL_TO; compOps[5] = ComparisonOperatorType.GREATER_THAN; compOps[6] = ComparisonOperatorType.GREATER_THAN_EQUAL_TO; compOps[7] = ComparisonOperatorType.LIKE; compOps[8] = ComparisonOperatorType.NULL_CHECK; final ComparisonOperatorsType compOp = new ComparisonOperatorsType(compOps); final ScalarCapabilitiesType scalar = new ScalarCapabilitiesType(compOp, null, true); CSW_FILTER_CAPABILITIES.setScalarCapabilities(scalar); final IdCapabilitiesType id = new IdCapabilitiesType(false, true); CSW_FILTER_CAPABILITIES.setIdCapabilities(id); } /** * Generates the base capabilities for a WMS from the service metadata. * * @param metadata the service metadata * @return the service base capabilities */ public static AbstractCapabilities createCapabilities(final String version, final Details metadata) { ensureNonNull("metadata", metadata); ensureNonNull("version", version); final Contact currentContact = metadata.getServiceContact(); final AccessConstraint constraint = metadata.getServiceConstraints(); final AbstractServiceIdentification servIdent; if (constraint != null) { servIdent = OWSXmlFactory.buildServiceIdentification("1.0.0", metadata.getName(), metadata.getDescription(), metadata.getKeywords(), "CSW", metadata.getVersions(), constraint.getFees(), Arrays.asList(constraint.getAccessConstraint())); } else { servIdent = OWSXmlFactory.buildServiceIdentification("1.0.0", metadata.getName(), metadata.getDescription(), metadata.getKeywords(), "CSW", metadata.getVersions(), null, new ArrayList<String>()); } final AbstractServiceProvider servProv; if (currentContact != null) { // Create provider part. final AbstractContact contact = OWSXmlFactory.buildContact("1.0.0", currentContact.getPhone(), currentContact.getFax(), currentContact.getEmail(), currentContact.getAddress(), currentContact.getCity(), currentContact.getState(), currentContact.getZipCode(), currentContact.getCountry(), currentContact.getHoursOfService(), currentContact.getContactInstructions()); final AbstractResponsiblePartySubset responsible = OWSXmlFactory.buildResponsiblePartySubset("1.0.0", currentContact.getFullname(), currentContact.getPosition(), contact, null); AbstractOnlineResourceType orgUrl = null; if (currentContact.getUrl() != null) { orgUrl = OWSXmlFactory.buildOnlineResource("1.0.0", currentContact.getUrl()); } servProv = OWSXmlFactory.buildServiceProvider("1.0.0", currentContact.getOrganisation(), orgUrl, responsible); } else { servProv = OWSXmlFactory.buildServiceProvider("1.0.0", "", null, null); } // Create capabilities base. return CswXmlFactory.createCapabilities(version, servIdent, servProv, null, null, null); } public final static Map<String, List<String>> ISO_BRIEF_FIELDS = new HashMap<>(); static { ISO_BRIEF_FIELDS.put("identifier", Arrays.asList("/gmd:MD_Metadata/gmd:fileIdentifier/gco:CharacterString")); ISO_BRIEF_FIELDS.put("title", Arrays.asList("/gmd:MD_Metadata/gmd:identificationInfo/*/gmd:citation/gmd:CI_Citation/gmd:title/gco:CharacterString")); ISO_BRIEF_FIELDS.put("date", Arrays.asList("/gmd:MD_Metadata/gmd:dateStamp/gco:DateTime", "/gmd:MD_Metadata/gmd:dateStamp/gco:Date")); ISO_BRIEF_FIELDS.put("creator", Arrays.asList("/gmd:MD_Metadata/gmd:contact/gmd:CI_ResponsibleParty/gmd:organisationName/gco:CharacterString")); } private CSWConstants() {} }