/* * 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.coverage.ws; import org.constellation.dto.AccessConstraint; import org.constellation.dto.Contact; import org.constellation.dto.Details; import org.constellation.ws.MimeType; import org.geotoolkit.gml.xml.v311.CodeListType; 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.geotoolkit.wcs.xml.GetCapabilitiesResponse; import org.geotoolkit.wcs.xml.WCSXmlFactory; import org.geotoolkit.wcs.xml.v100.DCPTypeType; import org.geotoolkit.wcs.xml.v100.DCPTypeType.HTTP.Get; import org.geotoolkit.wcs.xml.v100.DCPTypeType.HTTP.Post; import org.geotoolkit.wcs.xml.v100.OnlineResourceType; import org.geotoolkit.wcs.xml.v100.Request; import org.geotoolkit.wcs.xml.v100.WCSCapabilityType; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static org.apache.sis.util.ArgumentChecks.ensureNonNull; import org.geotoolkit.wcs.xml.ServiceMetadata; import org.geotoolkit.wcs.xml.v200.ServiceMetadataType; /** * WCS Constants * * @author Guilhem Legal (Geomatys) */ public final class WCSConstant { private WCSConstant() {} /** * WCS Query service */ public static final String WCS_SERVICE = "WCS"; /** * Request parameters. */ public static final String DESCRIBECOVERAGE = "DescribeCoverage"; public static final String GETCOVERAGE = "GetCoverage"; public static final String GETCAPABILITIES = "GetCapabilities"; /** Parameter used in getCoverage 1.1.1 */ public static final String KEY_IDENTIFIER = "IDENTIFIER"; /** Parameter used in getCoverage 1.0.0 */ public static final String KEY_COVERAGE = "COVERAGE"; /** Parameter used in getCoverage 2.0.1 */ public static final String KEY_COVERAGE_ID = "COVERAGEID"; /** BBOX for getCoverage in version 1.1.1 */ public static final String KEY_BOUNDINGBOX = "BOUNDINGBOX"; /** BBOX for getCoverage in version 1.1.1 */ public static final String KEY_STORE = "STORE"; /** Parameter used in getCapabilities 1.0.0 */ public static final String KEY_SECTION = "SECTION"; /** Parameter used in getCoverage 1.0.0 */ public static final String KEY_TIME = "TIME"; /** Parameter used in getCoverage 1.1.1 */ public static final String KEY_TIMESEQUENCE = "TIMESEQUENCE"; /** Parameter used in getCoverage 1.0.0 */ public static final String KEY_BBOX = "BBOX"; /** Parameter used in getCoverage 1.0.0 and 1.1.1 */ public static final String KEY_CRS = "CRS"; /** Parameter used in getCoverage 1.0.0 */ public static final String KEY_RESPONSE_CRS = "RESPONSE_CRS"; /** Parameter used in getCoverage */ public static final String KEY_WIDTH = "WIDTH"; /** Parameter used in getCoverage */ public static final String KEY_HEIGHT = "HEIGHT"; /** Parameter used in getCoverage */ public static final String KEY_DEPTH = "DEPTH"; /** Parameter used in getCoverage */ public static final String KEY_RESX = "RESX"; /** Parameter used in getCoverage */ public static final String KEY_RESY = "RESY"; /** Parameter used in getCoverage */ public static final String KEY_RESZ = "RESZ"; /** Parameter used in getCoverage */ public static final String KEY_INTERPOLATION = "INTERPOLATION"; /** Specific Geomatys parameter used in getCoverage */ public static final String KEY_CATEGORIES = "CATEGORIES"; /** Parameter used in getCoverage 1.1.1 */ public static final String KEY_GRIDCS = "GRIDCS"; /** Parameter used in getCoverage 1.1.1 */ public static final String KEY_GRIDOFFSETS = "GRIDOFFSETS"; /** Parameter used in getCoverage 1.1.1 */ public static final String KEY_GRIDORIGIN = "GRIDORIGIN"; /** Parameter used in getCoverage 1.1.1 */ public static final String KEY_GRIDTYPE = "GRIDTYPE"; /** Parameter used in getCoverage 1.1.1 */ public static final String KEY_GRIDBASECRS = "GRIDBASECRS"; /** Parameter used in getCoverage 1.1.1 */ public static final String KEY_RANGESUBSET = "RANGESUBSET"; /** Parameter used in getCoverage */ public static final String KEY_FORMAT = "FORMAT"; /** Parameter used in getCoverage v200*/ public static final String KEY_MEDIA_TYPE = "MEDIATYPE"; /** Format value used in getCoverage */ public static final String MATRIX = "MATRIX"; /** Format value used in getCoverage */ public static final String ASCII_GRID = "ASCII-GRID"; /** Format value used in getCoverage */ public static final String GEOTIFF = "GEOTIFF"; /** Format value used in getCoverage */ public static final String NETCDF = "NETCDF"; /** Format value used in getCoverage */ public static final String PNG = "PNG"; /** Format value used in getCoverage */ public static final String GIF = "GIF"; /** Format value used in getCoverage */ public static final String JPG = "JPG"; /** Format value used in getCoverage */ public static final String JPEG = "JPEG"; /** Format value used in getCoverage */ public static final String BMP = "BMP"; /** Format value used in getCoverage */ public static final String TIF = "TIF"; /** Format value used in getCoverage */ public static final String TIFF = "TIFF"; /* * A list supported formats * */ public static final List<CodeListType> SUPPORTED_FORMATS_100 = new ArrayList<>(); static { SUPPORTED_FORMATS_100.add(new CodeListType("png")); SUPPORTED_FORMATS_100.add(new CodeListType("gif")); SUPPORTED_FORMATS_100.add(new CodeListType("jpeg")); SUPPORTED_FORMATS_100.add(new CodeListType("bmp")); SUPPORTED_FORMATS_100.add(new CodeListType("tiff")); SUPPORTED_FORMATS_100.add(new CodeListType("geotiff")); SUPPORTED_FORMATS_100.add(new CodeListType("matrix")); SUPPORTED_FORMATS_100.add(new CodeListType("ascii-grid")); } public static final List<String> SUPPORTED_FORMATS_111 = new ArrayList<>(); static { SUPPORTED_FORMATS_111.add(MimeType.IMAGE_PNG); SUPPORTED_FORMATS_111.add(MimeType.IMAGE_GIF); SUPPORTED_FORMATS_111.add(MimeType.IMAGE_JPEG); SUPPORTED_FORMATS_111.add(MimeType.IMAGE_BMP); SUPPORTED_FORMATS_111.add("matrix"); SUPPORTED_FORMATS_111.add("ascii-grid"); } public static final List<String> SUPPORTED_FORMATS_200 = new ArrayList<>(); static { SUPPORTED_FORMATS_200.add(MimeType.IMAGE_TIFF); SUPPORTED_FORMATS_200.add(MimeType.NETCDF); } /** * A list of supported interpolation */ public static final List<org.geotoolkit.wcs.xml.v100.InterpolationMethod> SUPPORTED_INTERPOLATIONS_V100 = new ArrayList<>(); static { SUPPORTED_INTERPOLATIONS_V100.add(org.geotoolkit.wcs.xml.v100.InterpolationMethod.BILINEAR); SUPPORTED_INTERPOLATIONS_V100.add(org.geotoolkit.wcs.xml.v100.InterpolationMethod.BICUBIC); SUPPORTED_INTERPOLATIONS_V100.add(org.geotoolkit.wcs.xml.v100.InterpolationMethod.NEAREST_NEIGHBOR); } public static final org.geotoolkit.wcs.xml.v100.SupportedInterpolationsType INTERPOLATION_V100 = new org.geotoolkit.wcs.xml.v100.SupportedInterpolationsType( org.geotoolkit.wcs.xml.v100.InterpolationMethod.NEAREST_NEIGHBOR, SUPPORTED_INTERPOLATIONS_V100); /** * A list of supported interpolation */ public static final List<org.geotoolkit.wcs.xml.v111.InterpolationMethod> SUPPORTED_INTERPOLATIONS_V111 = new ArrayList<>(); static { SUPPORTED_INTERPOLATIONS_V111.add(org.geotoolkit.wcs.xml.v111.InterpolationMethod.BILINEAR); SUPPORTED_INTERPOLATIONS_V111.add(org.geotoolkit.wcs.xml.v111.InterpolationMethod.BICUBIC); SUPPORTED_INTERPOLATIONS_V111.add(org.geotoolkit.wcs.xml.v111.InterpolationMethod.NEAREST_NEIGHBOR); } public static final org.geotoolkit.wcs.xml.v111.InterpolationMethods INTERPOLATION_V111 = new org.geotoolkit.wcs.xml.v111.InterpolationMethods(SUPPORTED_INTERPOLATIONS_V111 , org.geotoolkit.wcs.xml.v111.InterpolationMethod.NEAREST_NEIGHBOR.value()); public static final WCSCapabilityType OPERATIONS_METADATA_100; static { final Get get = new DCPTypeType.HTTP.Get(new OnlineResourceType("someurl")); final Post post = new DCPTypeType.HTTP.Post(new OnlineResourceType("someurl")); final DCPTypeType dcp = new DCPTypeType(new DCPTypeType.HTTP(get, post)); final Request REQUEST_100 = new Request(); final Request.DescribeCoverage describeCoverage = new Request.DescribeCoverage(Arrays.asList(dcp)); REQUEST_100.setDescribeCoverage(describeCoverage); final Request.GetCapabilities getCapabilities = new Request.GetCapabilities(Arrays.asList(dcp)); REQUEST_100.setGetCapabilities(getCapabilities); final Request.GetCoverage getCoverage = new Request.GetCoverage(Arrays.asList(dcp)); REQUEST_100.setGetCoverage(getCoverage); final WCSCapabilityType.Exception ex = new WCSCapabilityType.Exception(Arrays.asList("application/vnd.ogc.se_xml", "text/xml")); OPERATIONS_METADATA_100 = new WCSCapabilityType(REQUEST_100, ex); } public static final AbstractOperationsMetadata OPERATIONS_METADATA_111; static { final List<AbstractDCP> dcps = new ArrayList<>(); dcps.add(WCSXmlFactory.buildDCP("1.1.1", "someURL", "someURL")); final List<AbstractDCP> dcps2 = new ArrayList<>(); dcps2.add(WCSXmlFactory.buildDCP("1.1.1", null, "someURL")); final List<AbstractOperation> operations = new ArrayList<>(); final List<AbstractDomain> gcParameters = new ArrayList<>(); gcParameters.add(WCSXmlFactory.buildDomain("1.1.1", "AcceptVersions", Arrays.asList("1.0.0","1.1.1"))); gcParameters.add(WCSXmlFactory.buildDomain("1.1.1", "AcceptFormats", Arrays.asList("text/xml","application/vnd.ogc.wcs_xml"))); gcParameters.add(WCSXmlFactory.buildDomain("1.1.1", "Service", Arrays.asList("WCS"))); gcParameters.add(WCSXmlFactory.buildDomain("1.1.1", "Sections", Arrays.asList("ServiceIdentification","ServiceProvider","OperationsMetadata","Contents"))); AbstractOperation getCapabilities = WCSXmlFactory.buildOperation("1.1.1", dcps, gcParameters, null, "GetCapabilities"); operations.add(getCapabilities); final List<AbstractDomain> gcoParameters = new ArrayList<>(); gcoParameters.add(WCSXmlFactory.buildDomain("1.1.1", "Version", Arrays.asList("1.0.0","1.1.1"))); gcoParameters.add(WCSXmlFactory.buildDomain("1.1.1", "Service", Arrays.asList("WCS"))); gcoParameters.add(WCSXmlFactory.buildDomain("1.1.1", "Format", Arrays.asList("image/gif","image/png","image/jpeg","matrix"))); gcoParameters.add(WCSXmlFactory.buildDomain("1.1.1", "Store", Arrays.asList("false"))); AbstractOperation getCoverage = WCSXmlFactory.buildOperation("1.1.1", dcps, gcoParameters, null, "GetCoverage"); operations.add(getCoverage); final List<AbstractDomain> dcParameters = new ArrayList<>(); dcParameters.add(WCSXmlFactory.buildDomain("1.1.1", "Version", Arrays.asList("1.0.0","1.1.1"))); dcParameters.add(WCSXmlFactory.buildDomain("1.1.1", "Service", Arrays.asList("WCS"))); dcParameters.add(WCSXmlFactory.buildDomain("1.1.1", "Format", Arrays.asList("text/xml"))); AbstractOperation describeCoverage = WCSXmlFactory.buildOperation("1.1.1", dcps, dcParameters, null, "DescribeCoverage"); operations.add(describeCoverage); final List<AbstractDomain> constraints = new ArrayList<>(); constraints.add(WCSXmlFactory.buildDomain("1.1.1", "PostEncoding", Arrays.asList("XML"))); OPERATIONS_METADATA_111 = OWSXmlFactory.buildOperationsMetadata("1.1.0", operations, null, constraints, null); } public static final AbstractOperationsMetadata OPERATIONS_METADATA_200; static { final List<AbstractDCP> dcps = new ArrayList<>(); dcps.add(WCSXmlFactory.buildDCP("2.0.1", "someURL", "someURL")); final List<AbstractDCP> dcps2 = new ArrayList<>(); dcps2.add(WCSXmlFactory.buildDCP("2.0.1", null, "someURL")); final List<AbstractOperation> operations = new ArrayList<>(); final List<AbstractDomain> gcParameters = new ArrayList<>(); gcParameters.add(WCSXmlFactory.buildDomain("2.0.1", "AcceptVersions", Arrays.asList("1.0.0","2.0.1"))); gcParameters.add(WCSXmlFactory.buildDomain("2.0.1", "AcceptFormats", Arrays.asList("text/xml","application/vnd.ogc.wcs_xml"))); gcParameters.add(WCSXmlFactory.buildDomain("2.0.1", "Service", Arrays.asList("WCS"))); gcParameters.add(WCSXmlFactory.buildDomain("2.0.1", "Sections", Arrays.asList("ServiceIdentification","ServiceProvider","OperationsMetadata","Contents"))); AbstractOperation getCapabilities = WCSXmlFactory.buildOperation("2.0.1", dcps, gcParameters, null, "GetCapabilities"); operations.add(getCapabilities); final List<AbstractDomain> gcoParameters = new ArrayList<>(); gcoParameters.add(WCSXmlFactory.buildDomain("2.0.1", "Version", Arrays.asList("1.0.0","2.0.1"))); gcoParameters.add(WCSXmlFactory.buildDomain("2.0.1", "Service", Arrays.asList("WCS"))); gcoParameters.add(WCSXmlFactory.buildDomain("2.0.1", "Format", SUPPORTED_FORMATS_200)); gcoParameters.add(WCSXmlFactory.buildDomain("2.0.1", "MediaType", Arrays.asList("multipart/mixed"))); AbstractOperation getCoverage = WCSXmlFactory.buildOperation("2.0.1", dcps, gcoParameters, null, "GetCoverage"); operations.add(getCoverage); final List<AbstractDomain> dcParameters = new ArrayList<>(); dcParameters.add(WCSXmlFactory.buildDomain("2.0.1", "Version", Arrays.asList("1.0.0","2.0.1"))); dcParameters.add(WCSXmlFactory.buildDomain("2.0.1", "Service", Arrays.asList("WCS"))); dcParameters.add(WCSXmlFactory.buildDomain("2.0.1", "Format", Arrays.asList("text/xml"))); AbstractOperation describeCoverage = WCSXmlFactory.buildOperation("2.0.1", dcps, dcParameters, null, "DescribeCoverage"); operations.add(describeCoverage); final List<AbstractDomain> constraints = new ArrayList<>(); constraints.add(WCSXmlFactory.buildDomain("2.0.1", "PostEncoding", Arrays.asList("XML"))); OPERATIONS_METADATA_200 = OWSXmlFactory.buildOperationsMetadata("2.0.0", operations, null, constraints, null); } public static void applyProfile(final String version, final AbstractServiceIdentification si) { if (version.equals("2.0.1")) { si.getProfile().add("http://www.opengis.net/spec/WCS/2.0/conf/core"); si.getProfile().add("http://www.opengis.net/spec/WCS_protocol-binding_get-kvp/1.0/conf/get-kvp"); si.getProfile().add("http://www.opengis.net/spec/WCS_protocol-binding_post-xml/1.0/conf/post-xml"); si.getProfile().add("http://www.opengis.net/spec/GMLCOV/1.0/conf/multipart"); si.getProfile().add("http://www.opengis.net/spec/GMLCOV/1.0/conf/special-format"); si.getProfile().add("http://www.opengis.net/spec/GMLCOV_geotiff-coverages/1.0/conf/geotiff-coverage"); } } public static ServiceMetadata getServiceMetadata(final String version) { ServiceMetadata sm = null; if (version.equals("2.0.1")) { sm = new ServiceMetadataType(SUPPORTED_FORMATS_200); } return sm; } public static AbstractOperationsMetadata getOperationMetadata(final String version) { if (version.equals("1.0.0")) { return OPERATIONS_METADATA_100.clone(); } else if (version.equals("2.0.1")) { return OPERATIONS_METADATA_200.clone(); } else if (version.equals("1.1.1")){ return OPERATIONS_METADATA_111.clone(); } else { throw new IllegalArgumentException("unexpected version:" + version); } } /** * Generates the base capabilities for a WMS from the service metadata. * * @param metadata the service metadata * @return the service base capabilities */ public static GetCapabilitiesResponse 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 = WCSXmlFactory.createServiceIdentification(version, metadata.getName(), metadata.getDescription(), metadata.getKeywords(), "WCS", metadata.getVersions(), constraint.getFees(), Arrays.asList(constraint.getAccessConstraint())); } else { servIdent = WCSXmlFactory.createServiceIdentification(version, metadata.getName(), metadata.getDescription(), metadata.getKeywords(), "WCS", metadata.getVersions(), null, new ArrayList<String>()); } // Create provider part. final AbstractServiceProvider servProv; if (currentContact != null) { final AbstractContact contact = WCSXmlFactory.buildContact(version, currentContact.getPhone(), currentContact.getFax(), currentContact.getEmail(), currentContact.getAddress(), currentContact.getCity(), currentContact.getState(), currentContact.getZipCode(), currentContact.getCountry(), currentContact.getHoursOfService(), currentContact.getContactInstructions()); final AbstractResponsiblePartySubset responsible = WCSXmlFactory.buildResponsiblePartySubset(version, currentContact.getFullname(), currentContact.getPosition(), contact, null); // url AbstractOnlineResourceType orgUrl = null; if (currentContact.getUrl() != null) { orgUrl = WCSXmlFactory.buildOnlineResource(version, currentContact.getUrl()); } servProv = WCSXmlFactory.buildServiceProvider(version, currentContact.getOrganisation(), orgUrl, responsible); } else { servProv = WCSXmlFactory.buildServiceProvider(version, "", null, null); } // Create capabilities base. return WCSXmlFactory.createCapabilitiesResponse(version, servIdent, servProv, null, null, null, null); } }