/** * Copyright (C) 2012-2017 52°North Initiative for Geospatial Open Source * Software GmbH * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. * * If the program is linked with libraries which are licensed under one of * the following licenses, the combination of the program with the linked * library is not considered a "derivative work" of the program: * * - Apache License, version 2.0 * - Apache Software License, version 1.0 * - GNU Lesser General Public License, version 3 * - Mozilla Public License, versions 1.0, 1.1 and 2.0 * - Common Development and Distribution License (CDDL), version 1.0 * * Therefore the distribution of the program linked with libraries licensed * under the aforementioned licenses, is permitted by the copyright holders * if the distribution is compliant with both the GNU General Public * License version 2 and the aforementioned licenses. * * 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 General * Public License for more details. */ package org.n52.sos.encoder; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; import javax.xml.XMLConstants; import javax.xml.transform.dom.DOMSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; import org.hamcrest.Matchers; import org.joda.time.DateTime; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.n52.sos.encode.InspireXmlEncoder; import org.n52.sos.exception.ows.concrete.UnsupportedEncoderInputException; import org.n52.sos.inspire.InspireConformity; import org.n52.sos.inspire.InspireConformity.InspireDegreeOfConformity; import org.n52.sos.inspire.InspireConformityCitation; import org.n52.sos.inspire.InspireConstants; import org.n52.sos.inspire.InspireDateOfCreation; import org.n52.sos.inspire.InspireDateOfLastRevision; import org.n52.sos.inspire.InspireDateOfPublication; import org.n52.sos.inspire.InspireKeyword; import org.n52.sos.inspire.InspireLanguageISO6392B; import org.n52.sos.inspire.InspireMandatoryKeyword; import org.n52.sos.inspire.InspireMandatoryKeywordValue; import org.n52.sos.inspire.InspireMetadataPointOfContact; import org.n52.sos.inspire.InspireOriginatingControlledVocabulary; import org.n52.sos.inspire.InspireResourceLocator; import org.n52.sos.inspire.InspireSupportedCRS; import org.n52.sos.inspire.InspireSupportedLanguages; import org.n52.sos.inspire.InspireTemporalReference; import org.n52.sos.inspire.InspireUniqueResourceIdentifier; import org.n52.sos.inspire.capabilities.FullInspireExtendedCapabilities; import org.n52.sos.inspire.capabilities.InspireCapabilities.InspireServiceSpatialDataResourceType; import org.n52.sos.inspire.capabilities.InspireCapabilities.InspireSpatialDataServiceType; import org.n52.sos.inspire.capabilities.MinimalInspireExtendedCapabilities; import org.n52.sos.ogc.gml.time.TimeInstant; import org.n52.sos.ogc.gml.time.TimePeriod; import org.n52.sos.ogc.ows.OwsExceptionReport; import org.n52.sos.service.ServiceConfiguration; import org.n52.sos.util.http.MediaTypes; import org.xml.sax.SAXException; import com.google.common.collect.Sets; public class InspireEncoderTest { private static XmlOptions xmlOptions = new XmlOptions(); /* * xmlns:xsd="http://www.w3.org/2001/XMLSchema" * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= * "http://inspire.ec.europa.eu/schemas/inspire_dls/1.0 http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd" */ // // @BeforeClass // public static void init() { // Map<String, String> prefixes = new HashMap<String, String>(); // prefixes.put(InspireConstants.NS_INSPIRE_COMMON, InspireConstants.NS_INSPIRE_COMMON_PREFIX); // prefixes.put(InspireConstants.NS_INSPIRE_DLS, InspireConstants.NS_INSPIRE_DLS_PREFIX); // xmlOptions.setSaveSuggestedPrefixes(prefixes); // xmlOptions.setSaveImplicitNamespaces(prefixes); // xmlOptions.setSaveAggressiveNamespaces(); // xmlOptions.setSavePrettyPrint(); // xmlOptions.setSaveNamespacesFirst(); // xmlOptions.setCharacterEncoding("UTF-8"); // } // // @Test // public void enocodeMinimalInspireExtendedCapabilities() throws UnsupportedEncoderInputException, // OwsExceptionReport, SAXException, IOException { // InspireXmlEncoder inspireEncoder = new InspireXmlEncoder(); // validate(inspireEncoder.encode(getMinimalInspireExtendedCapabilities())); // } // // @Test // public void enocodeFullIsnpireExtendedCapabilities() throws UnsupportedEncoderInputException, OwsExceptionReport, // SAXException, IOException { // InspireXmlEncoder inspireEncoder = new InspireXmlEncoder(); // validate(inspireEncoder.encode(getFullInspireExtendedCapabilities())); // } // // @Test // public void valid_iso8601() { // // date // String datePattern = "\\d{4}-(1[0-2]|0[1-9])-(3[0-1]|0[1-9]|[1-2][0-9])"; // String date = "2013-09-26"; // Assert.assertThat(Pattern.matches(datePattern, date), Matchers.is(true)); // // time // String timePattern = "(T(2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])(\\.[0-9]+)?)?"; // String time_HH_MM_SS_S = "T12:49:41.740"; // Assert.assertThat(Pattern.matches(timePattern, time_HH_MM_SS_S), Matchers.is(true)); // String time_HH_MM_SS = "T12:49:41"; // Assert.assertThat(Pattern.matches(timePattern, time_HH_MM_SS), Matchers.is(true)); // // offset // String offsetPattern = "(Z|[+|-](2[0-3]|[0-1][0-9]):([0-5][0-9]))?"; // String offset_PLUS_HH_MM = "+02:00"; // Assert.assertThat(Pattern.matches(offsetPattern, offset_PLUS_HH_MM), Matchers.is(true)); // String offset_MINUS_HH_MM = "-02:00"; // Assert.assertThat(Pattern.matches(offsetPattern, offset_MINUS_HH_MM), Matchers.is(true)); // String offset_Z = "Z"; // Assert.assertThat(Pattern.matches(offsetPattern, offset_Z), Matchers.is(true)); // // date time // String dtPattern = datePattern + timePattern; // Assert.assertThat(Pattern.matches(dtPattern, date + time_HH_MM_SS_S), Matchers.is(true)); // Assert.assertThat(Pattern.matches(dtPattern, date + time_HH_MM_SS), Matchers.is(true)); // // date time offset // String dtoPattern = dtPattern + offsetPattern; // Assert.assertThat(Pattern.matches(dtoPattern, date + time_HH_MM_SS_S + offset_PLUS_HH_MM), Matchers.is(true)); // Assert.assertThat(Pattern.matches(dtoPattern, date + time_HH_MM_SS_S + offset_MINUS_HH_MM), Matchers.is(true)); // Assert.assertThat(Pattern.matches(dtoPattern, date + time_HH_MM_SS_S + offset_Z), Matchers.is(true)); // Assert.assertThat(Pattern.matches(dtoPattern, date + time_HH_MM_SS + offset_PLUS_HH_MM), Matchers.is(true)); // Assert.assertThat(Pattern.matches(dtoPattern, date + time_HH_MM_SS + offset_MINUS_HH_MM), Matchers.is(true)); // Assert.assertThat(Pattern.matches(dtoPattern, date + time_HH_MM_SS + offset_Z), Matchers.is(true)); // // valid patter for schema: \d{4}-(1[0-2]|0[1-9])-(3[0-1]|0[1-9]|[1-2][0-9])(T(2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?)?(Z|[+|-](2[0-3]|[0-1][0-9]):([0-5][0-9]))? // //// String pattern = //// "\\d{4}-(1[0-2]|0[1-9])-(3[0-1]|0[1-9]|[1-2][0-9])(T(2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])(\\.[0-9]+)?)?(Z|([+|-](2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])(\\.[0-9])?)?)?"; //// Assert.assertThat(Pattern.matches(pattern, "2013-09-26T12:49:41.740+02:00"), Matchers.is(true)); // } private MinimalInspireExtendedCapabilities getMinimalInspireExtendedCapabilities() { // -------------------- InspireResourceLocator resourceLocator = new InspireResourceLocator(ServiceConfiguration.getInstance().getServiceURL()); resourceLocator.addMediaType(MediaTypes.APPLICATION_SOAP_XML); // -------------------- InspireSupportedLanguages inspireSupportedLanguages = new InspireSupportedLanguages(InspireLanguageISO6392B.ENG); // -------------------- InspireLanguageISO6392B responseLanguage = InspireLanguageISO6392B.ENG; // -------------------- Set<InspireUniqueResourceIdentifier> spatialDataSetIdentifier = Sets.newHashSet(); InspireUniqueResourceIdentifier iuri = new InspireUniqueResourceIdentifier("test"); iuri.setNamespace("http://test.org"); spatialDataSetIdentifier.add(iuri); // -------------------- return new MinimalInspireExtendedCapabilities(resourceLocator, inspireSupportedLanguages, responseLanguage, spatialDataSetIdentifier,new InspireSupportedCRS("4326")); } private void validate(XmlObject xmlObject) throws SAXException, IOException { SchemaFactory sf = SchemaFactory.newInstance( XMLConstants.XML_NS_URI ); Schema schema = sf.newSchema(InspireEncoderTest.class.getResource("/inspire_dls/1.0/inspire_dls.xsd")); Validator validator = schema.newValidator(); validator.validate(new DOMSource(xmlObject.getDomNode())); } private FullInspireExtendedCapabilities getFullInspireExtendedCapabilities() { InspireResourceLocator resourceLocator = new InspireResourceLocator(ServiceConfiguration.getInstance().getServiceURL()); resourceLocator.addMediaType(MediaTypes.APPLICATION_SOAP_XML); // ------------------- InspireTemporalReference temporalReference = new InspireTemporalReference(); temporalReference.setDateOfCreation(new InspireDateOfCreation(new DateTime())); temporalReference.setDateOfLastRevision(new InspireDateOfLastRevision(new DateTime())); temporalReference.addDateOfPublication(new InspireDateOfPublication(new DateTime())); temporalReference.addTemporalExtent(new TimeInstant(new DateTime())); temporalReference.addTemporalExtent(new TimePeriod(new DateTime(), new DateTime().plus(3456))); // ------------------- InspireConformityCitation inspireConformityCitation = new InspireConformityCitation("Test", new InspireDateOfCreation(new DateTime())); InspireConformity conformity = new InspireConformity(inspireConformityCitation, InspireDegreeOfConformity.notEvaluated); // ------------------- InspireMetadataPointOfContact inspireMetadataPointOfContact = new InspireMetadataPointOfContact("test", "test@test.te"); // ------------------- InspireOriginatingControlledVocabulary inspireOriginatingControlledVocabulary = new InspireOriginatingControlledVocabulary("Test", new InspireDateOfCreation(new DateTime())); InspireMandatoryKeyword inspireMandatoryKeyword = new InspireMandatoryKeyword(InspireMandatoryKeywordValue.humanServiceEditor, inspireOriginatingControlledVocabulary); // -------------------- InspireSupportedLanguages inspireSupportedLanguages = new InspireSupportedLanguages(InspireLanguageISO6392B.ENG); // -------------------- InspireLanguageISO6392B responseLanguage = InspireLanguageISO6392B.ENG; // -------------------- InspireUniqueResourceIdentifier iuri = new InspireUniqueResourceIdentifier("test"); iuri.setNamespace("http://test.org"); // -------------------- FullInspireExtendedCapabilities inspireExtendedCapabilities = new FullInspireExtendedCapabilities(resourceLocator, inspireSupportedLanguages, responseLanguage, iuri, new InspireSupportedCRS("4326")); inspireExtendedCapabilities.setResourceType(InspireServiceSpatialDataResourceType.service); inspireExtendedCapabilities.addKeyword(new InspireKeyword("test")); inspireExtendedCapabilities.addMandatoryKeyword(inspireMandatoryKeyword); // ------------------- inspireExtendedCapabilities.setMetadataDate(new TimeInstant(new DateTime())); // ------------------- inspireExtendedCapabilities.addMetadataPointOfContact(inspireMetadataPointOfContact); inspireExtendedCapabilities.addConformity(conformity); inspireExtendedCapabilities.addTemporalReference(temporalReference); return inspireExtendedCapabilities; } }