From 493b64ad7adefe1cd3a2cdfc792a8a3fb3eb3028 Mon Sep 17 00:00:00 2001 From: Gobe Hobona Date: Thu, 19 Nov 2020 09:38:39 +0000 Subject: [PATCH] initial upload --- .gitignore | 2 + LICENSE.txt | 12 + README.adoc | 29 + jenkinsfiles/build/Jenkinsfile | 27 + jenkinsfiles/release/Jenkinsfile | 35 + pom.xml | 349 + src/assembly/aio.xml | 20 + src/assembly/ctl-scripts.xml | 26 + src/assembly/deps.xml | 36 + src/docker/Dockerfile | 25 + src/main/config/logging.properties | 18 + src/main/config/teamengine/config.xml | 32 + src/main/config/test-run-props.xml | 7 + .../CommandLineArguments.java | 60 + .../cite/ogcapiprocesses10/CommonFixture.java | 99 + .../cite/ogcapiprocesses10/ETSAssert.java | 210 + .../cite/ogcapiprocesses10/ErrorMessage.java | 49 + .../ogcapiprocesses10/ErrorMessageKeys.java | 22 + .../cite/ogcapiprocesses10/Namespaces.java | 31 + .../ReusableEntityFilter.java | 26 + .../ogcapiprocesses10/SuiteAttribute.java | 50 + .../SuiteFixtureListener.java | 121 + .../ogcapiprocesses10/SuitePreconditions.java | 39 + .../TestFailureListener.java | 97 + .../ogcapiprocesses10/TestNGController.java | 169 + .../cite/ogcapiprocesses10/TestRunArg.java | 18 + .../ogcapiprocesses10/TestRunListener.java | 26 + .../level1/Capability1Tests.java | 95 + .../level1/package-info.java | 14 + .../cite/ogcapiprocesses10/package-info.java | 8 + .../ogcapiprocesses10/util/ClientUtils.java | 173 + .../util/NamespaceBindings.java | 104 + .../util/TestSuiteLogger.java | 73 + .../cite/ogcapiprocesses10/util/URIUtils.java | 137 + .../util/ValidationUtils.java | 162 + .../cite/ogcapiprocesses10/util/XMLUtils.java | 410 + .../ogcapiprocesses10/util/package-info.java | 4 + src/main/javadoc/index.html | 10 + src/main/javadoc/overview.html | 96 + ....occamlab.te.spi.jaxrs.TestSuiteController | 1 + .../MessageBundle.properties | 12 + .../MessageBundle_en.properties | 12 + .../cite/ogcapiprocesses10/ets.properties | 3 + .../cite/ogcapiprocesses10/rnc/atom.rnc | 283 + .../cite/ogcapiprocesses10/sch/gml-3.2.1.sch | 110 + .../cite/ogcapiprocesses10/schema-catalog.xml | 40 + .../ogcapiprocesses10/schematron-catalog.xml | 10 + .../opengis/cite/ogcapiprocesses10/testng.xml | 22 + .../xsd/iso/19139/2007/gco-2007.xsd | 428 + .../xsd/iso/19139/2007/gmd-2007.xsd | 2857 ++++++ .../xsd/iso/19139/2007/gsr-2007.xsd | 25 + .../xsd/iso/19139/2007/gss-2007.xsd | 33 + .../xsd/iso/19139/2007/gts-2007.xsd | 32 + .../xsd/opengis/gml/3.2.1/gml-3.2.1.xsd | 7806 +++++++++++++++++ .../xsd/opengis/xlink/1.0/xlink-1.0.xsd | 98 + .../xsd/w3c/2008/06/xlink.xsd | 273 + .../ogcapiprocesses10/xsd/w3c/2009/01/xml.xsd | 36 + src/main/resources/test-run-props.xml | 7 + .../scripts/ctl/ogcapi-processes10-suite.ctl | 142 + src/site/asciidoc/changelog.adoc | 7 + src/site/asciidoc/how-to-run-the-tests.adoc | 50 + src/site/asciidoc/index.adoc | 89 + src/site/resources/css/site.css | 20 + src/site/resources/img/ogc-logo.png | Bin 0 -> 2812 bytes src/site/resources/img/specifications.png | Bin 0 -> 4521 bytes src/site/site.xml | 35 + .../ogcapiprocesses10/VerifyETSAssert.java | 73 + .../VerifySuiteFixtureListener.java | 70 + .../VerifyTestNGController.java | 71 + .../level1/VerifyCapability1Tests.java | 72 + .../util/VerifyURIUtils.java | 83 + .../util/VerifyValidationUtils.java | 43 + .../util/VerifyXMLUtils.java | 147 + src/test/resources/Alpha-1.xml | 17 + src/test/resources/Alpha-xinclude.xml | 14 + src/test/resources/Gamma.xml | 7 + src/test/resources/atom-feed-2.xml | 23 + src/test/resources/atom-feed.xml | 24 + src/test/resources/capabilities-simple.xml | 149 + src/test/resources/xsd/gamma.xsd | 13 + 80 files changed, 16158 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.adoc create mode 100644 jenkinsfiles/build/Jenkinsfile create mode 100644 jenkinsfiles/release/Jenkinsfile create mode 100644 pom.xml create mode 100644 src/assembly/aio.xml create mode 100644 src/assembly/ctl-scripts.xml create mode 100644 src/assembly/deps.xml create mode 100644 src/docker/Dockerfile create mode 100644 src/main/config/logging.properties create mode 100644 src/main/config/teamengine/config.xml create mode 100644 src/main/config/test-run-props.xml create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/CommandLineArguments.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/CommonFixture.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/ETSAssert.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/ErrorMessage.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/ErrorMessageKeys.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/Namespaces.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/ReusableEntityFilter.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/SuiteAttribute.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/SuiteFixtureListener.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/SuitePreconditions.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/TestFailureListener.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/TestNGController.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/TestRunArg.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/TestRunListener.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/level1/Capability1Tests.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/level1/package-info.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/package-info.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/util/ClientUtils.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/util/NamespaceBindings.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/util/TestSuiteLogger.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/util/URIUtils.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/util/ValidationUtils.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/util/XMLUtils.java create mode 100644 src/main/java/org/opengis/cite/ogcapiprocesses10/util/package-info.java create mode 100644 src/main/javadoc/index.html create mode 100644 src/main/javadoc/overview.html create mode 100644 src/main/resources/META-INF/services/com.occamlab.te.spi.jaxrs.TestSuiteController create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/MessageBundle.properties create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/MessageBundle_en.properties create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/ets.properties create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/rnc/atom.rnc create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/sch/gml-3.2.1.sch create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/schema-catalog.xml create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/schematron-catalog.xml create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/testng.xml create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gco-2007.xsd create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gmd-2007.xsd create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gsr-2007.xsd create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gss-2007.xsd create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gts-2007.xsd create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/opengis/gml/3.2.1/gml-3.2.1.xsd create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/opengis/xlink/1.0/xlink-1.0.xsd create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/w3c/2008/06/xlink.xsd create mode 100644 src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/w3c/2009/01/xml.xsd create mode 100644 src/main/resources/test-run-props.xml create mode 100644 src/main/scripts/ctl/ogcapi-processes10-suite.ctl create mode 100644 src/site/asciidoc/changelog.adoc create mode 100644 src/site/asciidoc/how-to-run-the-tests.adoc create mode 100644 src/site/asciidoc/index.adoc create mode 100644 src/site/resources/css/site.css create mode 100644 src/site/resources/img/ogc-logo.png create mode 100644 src/site/resources/img/specifications.png create mode 100644 src/site/site.xml create mode 100644 src/test/java/org/opengis/cite/ogcapiprocesses10/VerifyETSAssert.java create mode 100644 src/test/java/org/opengis/cite/ogcapiprocesses10/VerifySuiteFixtureListener.java create mode 100644 src/test/java/org/opengis/cite/ogcapiprocesses10/VerifyTestNGController.java create mode 100644 src/test/java/org/opengis/cite/ogcapiprocesses10/level1/VerifyCapability1Tests.java create mode 100644 src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyURIUtils.java create mode 100644 src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyValidationUtils.java create mode 100644 src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyXMLUtils.java create mode 100644 src/test/resources/Alpha-1.xml create mode 100644 src/test/resources/Alpha-xinclude.xml create mode 100644 src/test/resources/Gamma.xml create mode 100644 src/test/resources/atom-feed-2.xml create mode 100644 src/test/resources/atom-feed.xml create mode 100644 src/test/resources/capabilities-simple.xml create mode 100644 src/test/resources/xsd/gamma.xsd diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a44d20e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +/target/ diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..5faa899 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,12 @@ +Copyright 2015 [Open Geospatial Consortium](http://www.opengeospatial.org/) + +This work is licensed under the Apache License, Version 2.0 (the "License"). +You may obtain a copy of the License from the OSI site at + +http://opensource.org/licenses/Apache-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. diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..3632676 --- /dev/null +++ b/README.adoc @@ -0,0 +1,29 @@ += Draft OGC API - Processes Conformance Test Suite + +== Scope + +This executable test suite is for the OGC API - Processes draft standard. + +Visit the http://opengeospatial.github.io/ets-ogcapi-processes10/[project documentation website] +for more information, including the API documentation. + +== How to build the test suite + +The test suite is built using https://maven.apache.org/[Apache Maven v3]. + +== How to run the test suite +The options for running the suite are summarized in + +include::src/site/asciidoc/how-to-run-the-tests.adoc[] + +== How to contribute + +If you would like to get involved, you can: + +* https://github.com/opengeospatial/ets-ogcapi-processes10/issues[Report an issue] such as a defect or +an enhancement request +* Help to resolve an https://github.com/opengeospatial/ets-ogcapi-features10/issues?q=is%3Aopen[open issue] +* Fix a bug: Fork the repository, apply the fix, and create a pull request +* Add new tests: Fork the repository, implement and verify the tests on a new topic branch, +and create a pull request (don't forget to periodically rebase long-lived branches so +there are no extraneous conflicts) diff --git a/jenkinsfiles/build/Jenkinsfile b/jenkinsfiles/build/Jenkinsfile new file mode 100644 index 0000000..1e0bec9 --- /dev/null +++ b/jenkinsfiles/build/Jenkinsfile @@ -0,0 +1,27 @@ +pipeline { + agent any + tools { + maven 'mvn' + jdk 'JDK 8' + } + stages { + stage('Preparation') { + steps{ + deleteDir() + sh 'git clone git@github.com:opengeospatial/ets-ogcapi-processes10.git .' + } + } + stage('Build') { + steps{ + sh 'mvn --version' + sh 'mvn clean install site -Pintegration-tests,docker' + } + } + stage('Results') { + steps{ + junit '**/target/surefire-reports/TEST-*.xml' + archive 'target/*' + } + } + } +} diff --git a/jenkinsfiles/release/Jenkinsfile b/jenkinsfiles/release/Jenkinsfile new file mode 100644 index 0000000..4c48bdf --- /dev/null +++ b/jenkinsfiles/release/Jenkinsfile @@ -0,0 +1,35 @@ +pipeline { + agent any + tools { + maven 'mvn' + jdk 'JDK 8' + } + stages { + stage('Preparation') { + steps{ + deleteDir() + sh 'git clone git@github.com:opengeospatial/ets-ogcapi-processes10.git .' + } + } + stage('Release') { + steps{ + sh 'mvn --version' + sh 'mvn -Dresume=false -DdryRun=true release:prepare -Psign-artifacts-with-ogc,integration-tests,docker -DreleaseVersion=${releaseVersion} -DdevelopmentVersion=${developmentVersion}' + sh 'mvn -Dresume=false release:prepare release:perform -Psign-artifacts-with-ogc,integration-tests,docker -DreleaseVersion=${releaseVersion} -DdevelopmentVersion=${developmentVersion}' + } + } + stage('Publication of site') { + steps{ + sh 'mvn --version' + sh 'git checkout ${releaseVersion}' + sh 'mvn clean install site site:stage scm-publish:publish-scm' + } + } + stage('Results') { + steps{ + junit '**/target/surefire-reports/TEST-*.xml' + archive 'target/*' + } + } + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..cc3628e --- /dev/null +++ b/pom.xml @@ -0,0 +1,349 @@ + + + + org.opengis.cite + ets-common + 9 + + + 4.0.0 + org.opengis.cite + ets-ogcapi-processes10 + 0.1-SNAPSHOT + jar + + OGC API - Processes Standard 1.0 Conformance Test Suite + Describe purpose of test suite. + http://opengeospatial.github.io/ets-ogcapi-processes10/ + + + Apache License, Version 2.0 + http://opensource.org/licenses/Apache-2.0 + + + + + Open Geospatial Consortium + http://www.opengeospatial.org/ + + + scm:git:https://github.com/opengeospatial/ets-ogcapi-processes10.git + scm:git:git@github.com:opengeospatial/ets-ogcapi-processes10.git + https://github.com/opengeospatial/ets-ogcapi-processes10 + HEAD + + + GitHub Issue Tracker + https://github.com/opengeospatial/ets-ogcapi-processes10/issues + + + + Alpha Beta + https://github.com/ + UTC + + + + + ogcapi-processes10 + 1.0 + 5.4 + + + + + org.opengis.cite.teamengine + teamengine-spi + + + org.opengis.cite + schema-utils + + + com.sun.jersey + jersey-client + + + junit + junit + + + org.mockito + mockito-core + + + + + + + maven-javadoc-plugin + 2.10.4 + + 8 + true + package + + http://testng.org/javadocs/ + + + + + attach-javadocs + + jar + + + + + + maven-assembly-plugin + + + + org.opengis.cite.ogcapiprocesses10.TestNGController + + + + ${basedir}/src/assembly/deps.xml + ${basedir}/src/assembly/ctl-scripts.xml + ${basedir}/src/assembly/aio.xml + + + + + package + + single + + + + + + maven-surefire-plugin + + + maven-compiler-plugin + + + maven-jar-plugin + + + maven-release-plugin + 2.5.3 + + true + @{project.version} + release + + + + org.apache.maven.plugins + maven-site-plugin + 3.7.1 + + + site-package + prepare-package + + jar + + + + + + org.asciidoctor + asciidoctor-maven-plugin + 1.5.7.1 + + + + false + + + + org.codehaus.mojo + buildnumber-maven-plugin + + + maven-scm-publish-plugin + 1.1 + + gh-pages + + + + + + + io.fabric8 + docker-maven-plugin + 0.28.0 + + + + ogccite/${project.artifactId} + + ${project.basedir}/src/docker + + ${project.version}-teamengine-${docker.teamengine.version} + + + + + + ${project.build.directory} + . + + dependency/*teamengine-*.war + dependency/*teamengine-*.zip + *ets-*.zip + + + + + + + + + 8081:8080 + + + + http://localhost:8081/teamengine + + + + + + + + + + maven-dependency-plugin + 3.0.0 + + + + org.opengis.cite.teamengine + teamengine-web + ${docker.teamengine.version} + war + + + org.opengis.cite.teamengine + teamengine-web + ${docker.teamengine.version} + common-libs + zip + + + org.opengis.cite.teamengine + teamengine-console + ${docker.teamengine.version} + base + zip + + + + + + + + + + + integration-tests + + + + maven-failsafe-plugin + 2.22.0 + + + + integration-test + verify + + + + + + + + + docker + + + + io.fabric8 + docker-maven-plugin + + + build + + build + + + + push + + push + + + + + + maven-dependency-plugin + + + + copy + + + + + + + + + release + + + + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + + + + + + + + + + + + + sonatype-nexus-staging + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + site + scm:git:git@github.com:opengeospatial/ets-ogcapi-processes10.git + + + diff --git a/src/assembly/aio.xml b/src/assembly/aio.xml new file mode 100644 index 0000000..637399b --- /dev/null +++ b/src/assembly/aio.xml @@ -0,0 +1,20 @@ + + + + aio + + jar + + false + + + / + true + true + runtime + + com.sun.jersey:jersey-server + + + + diff --git a/src/assembly/ctl-scripts.xml b/src/assembly/ctl-scripts.xml new file mode 100644 index 0000000..36cbd01 --- /dev/null +++ b/src/assembly/ctl-scripts.xml @@ -0,0 +1,26 @@ + + + ctl + + zip + + true + ${ets-code}/${spec-version} + true + + + ${project.build.scriptSourceDirectory}/ctl + ctl + true + + + + + ${basedir}/src/main/config/teamengine/config.xml + true + + + diff --git a/src/assembly/deps.xml b/src/assembly/deps.xml new file mode 100644 index 0000000..e878346 --- /dev/null +++ b/src/assembly/deps.xml @@ -0,0 +1,36 @@ + + + deps + + zip + tar.gz + + false + + + + com.sun.jersey:jersey-client + org.opengis.cite:schema-utils + + / + false + runtime + false + + + + org.opengis.cite.teamengine:teamengine-spi + com.sun.jersey:jersey-client + org.opengis.cite:schema-utils + + / + false + runtime + true + true + + + diff --git a/src/docker/Dockerfile b/src/docker/Dockerfile new file mode 100644 index 0000000..551e8e1 --- /dev/null +++ b/src/docker/Dockerfile @@ -0,0 +1,25 @@ +FROM tomcat:7.0-jre8 + +# add TEAM engine webapp +ADD maven/dependency/teamengine-web-*.war /root/ +RUN cd /root/ && unzip -q teamengine-web-*.war -d /usr/local/tomcat/webapps/teamengine + +# add common libs +ADD maven/dependency/teamengine-web-*-common-libs.zip /root/ +RUN cd /root/ && unzip -q teamengine-web-*-common-libs.zip -d /usr/local/tomcat/lib + +# add TEAM engine console +ADD maven/dependency/teamengine-console-*-base.zip /root/ +RUN cd /root/ && unzip -q teamengine-console-*-base.zip -d /root/te_base + +# set TE_BASE +ENV JAVA_OPTS="-Xms1024m -Xmx2048m -DTE_BASE=/root/te_base" + +# add ETS +ADD maven/ets-ogcapi-processes10-*-ctl.zip /root/ +RUN cd /root/ && unzip -q ets-ogcapi-processes10-*-ctl.zip -d /root/te_base/scripts +ADD maven/ets-ogcapi-processes10-*-deps.zip /root/ +RUN cd /root/ && unzip -q -o ets-ogcapi-processes10-*-deps.zip -d /usr/local/tomcat/webapps/teamengine/WEB-INF/lib + +# run tomcat +CMD ["catalina.sh", "jpda", "run"] \ No newline at end of file diff --git a/src/main/config/logging.properties b/src/main/config/logging.properties new file mode 100644 index 0000000..1bacc07 --- /dev/null +++ b/src/main/config/logging.properties @@ -0,0 +1,18 @@ +# Add handlers to the root logger +handlers = java.util.logging.ConsoleHandler + +# Logging level of the root logger +.level = WARNING + +java.util.logging.ConsoleHandler.level = CONFIG +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter + +java.util.logging.FileHandler.level = ALL +java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter +java.util.logging.FileHandler.pattern = target/ets-log.txt +java.util.logging.FileHandler.encoding = UTF-8 +java.util.logging.FileHandler.append = false + +org.opengis.cite.ogcapiprocesses10.handlers = java.util.logging.FileHandler +org.opengis.cite.ogcapiprocesses10.useParentHandlers = true +org.opengis.cite.ogcapiprocesses10.level=CONFIG diff --git a/src/main/config/teamengine/config.xml b/src/main/config/teamengine/config.xml new file mode 100644 index 0000000..6b31d7f --- /dev/null +++ b/src/main/config/teamengine/config.xml @@ -0,0 +1,32 @@ + + + + + OGC + + OGC API - Processes + + ${spec-version} + + http://www.opengis.net/cite/ogcapi-processes10 + tns + ets-ogcapi-processes10-${version} + ets-ogcapi-processes10 Conformance Test Suite + Describe scope of testing. + + + + ${project.version} + Beta + + ogcapi-processes10/${spec-version}/ctl + + ogcapi-processes10/${spec-version}/site + + + + diff --git a/src/main/config/test-run-props.xml b/src/main/config/test-run-props.xml new file mode 100644 index 0000000..c292b29 --- /dev/null +++ b/src/main/config/test-run-props.xml @@ -0,0 +1,7 @@ + + + + Sample test run arguments (ets-ogcapi-processes10) + http://www.w3schools.com/xml/note.xml + class-A,class-B + diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/CommandLineArguments.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/CommandLineArguments.java new file mode 100644 index 0000000..afc064e --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/CommandLineArguments.java @@ -0,0 +1,60 @@ +package org.opengis.cite.ogcapiprocesses10; + +import com.beust.jcommander.Parameter; +import java.io.File; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +/** + * Declares supported command line arguments that are parsed using the + * JCommander library. All arguments are optional. The default values are as + * follows: + * + * + *

+ * Synopsis + *

+ * + *
+ * ets-${ets-code}-${version}-aio.jar [-o|--outputDir $TMPDIR] [-d|--deleteSubjectOnFinish] [test-run-props.xml]
+ * 
+ */ +public class CommandLineArguments { + + @Parameter(description = "Properties file") + private final List xmlProps; + + @Parameter(names = {"-o", "--outputDir"}, description = "Output directory") + private String outputDir; + + @Parameter(names = {"-d", "--deleteSubjectOnFinish"}, description = "Delete file containing representation of test subject when finished") + private boolean deleteSubjectOnFinish = false; + + public CommandLineArguments() { + this.xmlProps = new ArrayList<>(); + } + + public File getPropertiesFile() { + File fileRef; + if (xmlProps.isEmpty()) { + fileRef = new File(System.getProperty("user.home"), "test-run-props.xml"); + } else { + String propsFile = xmlProps.get(0); + fileRef = (propsFile.startsWith("file:")) ? new File(URI.create(propsFile)) : new File(propsFile); + } + return fileRef; + } + + public String getOutputDir() { + return (null != outputDir) ? outputDir : System.getProperty("user.home"); + } + + public boolean doDeleteSubjectOnFinish() { + return deleteSubjectOnFinish; + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/CommonFixture.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/CommonFixture.java new file mode 100644 index 0000000..d3dcf37 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/CommonFixture.java @@ -0,0 +1,99 @@ +package org.opengis.cite.ogcapiprocesses10; + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientRequest; +import com.sun.jersey.api.client.ClientResponse; +import java.net.URI; +import java.util.Map; +import javax.ws.rs.core.MediaType; +import org.opengis.cite.ogcapiprocesses10.util.ClientUtils; +import org.testng.ITestContext; +import org.testng.SkipException; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.w3c.dom.Document; + +/** + * A supporting base class that sets up a common test fixture. These + * configuration methods are invoked before those defined in a subclass. + */ +public class CommonFixture { + + /** + * Root test suite package (absolute path). + */ + public static final String ROOT_PKG_PATH = "/org/opengis/cite/ogcapiprocesses10/"; + /** + * HTTP client component (JAX-RS Client API). + */ + protected Client client; + /** + * An HTTP request message. + */ + protected ClientRequest request; + /** + * An HTTP response message. + */ + protected ClientResponse response; + + /** + * Initializes the common test fixture with a client component for + * interacting with HTTP endpoints. + * + * @param testContext The test context that contains all the information for + * a test run, including suite attributes. + */ + @BeforeClass + public void initCommonFixture(ITestContext testContext) { + Object obj = testContext.getSuite().getAttribute(SuiteAttribute.CLIENT.getName()); + if (null != obj) { + this.client = Client.class.cast(obj); + } + obj = testContext.getSuite().getAttribute(SuiteAttribute.TEST_SUBJECT.getName()); + if (null == obj) { + throw new SkipException("Test subject not found in ITestContext."); + } + } + + @BeforeMethod + public void clearMessages() { + this.request = null; + this.response = null; + } + + /** + * Obtains the (XML) response entity as a DOM Document. This convenience + * method wraps a static method call to facilitate unit testing (Mockito + * workaround). + * + * @param response A representation of an HTTP response message. + * @param targetURI The target URI from which the entity was retrieved (may + * be null). + * @return A Document representing the entity. + * + * @see ClientUtils#getResponseEntityAsDocument + */ + public Document getResponseEntityAsDocument(ClientResponse response, + String targetURI) { + return ClientUtils.getResponseEntityAsDocument(response, targetURI); + } + + /** + * Builds an HTTP request message that uses the GET method. This convenience + * method wraps a static method call to facilitate unit testing (Mockito + * workaround). + * + * @param endpoint A URI indicating the target resource. + * @param qryParams A Map containing query parameters (may be null); + * @param mediaTypes A list of acceptable media types; if not specified, + * generic XML ("application/xml") is preferred. + * @return A ClientRequest object. + * + * @see ClientUtils#buildGetRequest + */ + public ClientRequest buildGetRequest(URI endpoint, + Map qryParams, MediaType... mediaTypes) { + return ClientUtils.buildGetRequest(endpoint, qryParams, mediaTypes); + } + +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/ETSAssert.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/ETSAssert.java new file mode 100644 index 0000000..fbd2c4d --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/ETSAssert.java @@ -0,0 +1,210 @@ +package org.opengis.cite.ogcapiprocesses10; + +import java.net.URL; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.namespace.QName; +import javax.xml.transform.Source; +import javax.xml.transform.dom.DOMResult; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Validator; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.opengis.cite.ogcapiprocesses10.util.NamespaceBindings; +import org.opengis.cite.ogcapiprocesses10.util.XMLUtils; +import org.opengis.cite.validation.SchematronValidator; +import org.opengis.cite.validation.ValidationErrorHandler; +import org.testng.Assert; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import com.sun.jersey.api.client.ClientResponse; + +/** + * Provides a set of custom assertion methods. + */ +public class ETSAssert { + + private static final Logger LOGR = Logger.getLogger(ETSAssert.class.getPackage().getName()); + + private ETSAssert() { + } + + /** + * Asserts that the qualified name of a DOM Node matches the expected value. + * + * @param node + * The Node to check. + * @param qName + * A QName object containing a namespace name (URI) and a local + * part. + */ + public static void assertQualifiedName(Node node, QName qName) { + Assert.assertEquals(node.getLocalName(), qName.getLocalPart(), ErrorMessage.get(ErrorMessageKeys.LOCAL_NAME)); + Assert.assertEquals(node.getNamespaceURI(), qName.getNamespaceURI(), + ErrorMessage.get(ErrorMessageKeys.NAMESPACE_NAME)); + } + + /** + * Asserts that an XPath 1.0 expression holds true for the given evaluation + * context. The following standard namespace bindings do not need to be + * explicitly declared: + * + *
    + *
  • ows: {@value org.opengis.cite.ogcapiprocesses10.Namespaces#OWS}
  • + *
  • xlink: {@value org.opengis.cite.ogcapiprocesses10.Namespaces#XLINK}
  • + *
  • gml: {@value org.opengis.cite.ogcapiprocesses10.Namespaces#GML}
  • + *
+ * + * @param expr + * A valid XPath 1.0 expression. + * @param context + * The context node. + * @param namespaceBindings + * A collection of namespace bindings for the XPath expression, + * where each entry maps a namespace URI (key) to a prefix + * (value). It may be {@code null}. + */ + public static void assertXPath(String expr, Node context, Map namespaceBindings) { + if (null == context) { + throw new NullPointerException("Context node is null."); + } + NamespaceBindings bindings = NamespaceBindings.withStandardBindings(); + bindings.addAllBindings(namespaceBindings); + XPath xpath = XPathFactory.newInstance().newXPath(); + xpath.setNamespaceContext(bindings); + Boolean result; + try { + result = (Boolean) xpath.evaluate(expr, context, XPathConstants.BOOLEAN); + } catch (XPathExpressionException xpe) { + String msg = ErrorMessage.format(ErrorMessageKeys.XPATH_ERROR, expr); + LOGR.log(Level.WARNING, msg, xpe); + throw new AssertionError(msg); + } + Element elemNode; + if (Document.class.isInstance(context)) { + elemNode = Document.class.cast(context).getDocumentElement(); + } else { + elemNode = (Element) context; + } + Assert.assertTrue(result, ErrorMessage.format(ErrorMessageKeys.XPATH_RESULT, elemNode.getNodeName(), expr)); + } + + /** + * Asserts that an XML resource is schema-valid. + * + * @param validator + * The Validator to use. + * @param source + * The XML Source to be validated. + */ + public static void assertSchemaValid(Validator validator, Source source) { + ValidationErrorHandler errHandler = new ValidationErrorHandler(); + validator.setErrorHandler(errHandler); + try { + validator.validate(source); + } catch (Exception e) { + throw new AssertionError(ErrorMessage.format(ErrorMessageKeys.XML_ERROR, e.getMessage())); + } + Assert.assertFalse(errHandler.errorsDetected(), ErrorMessage.format(ErrorMessageKeys.NOT_SCHEMA_VALID, + errHandler.getErrorCount(), errHandler.toString())); + } + + /** + * Asserts that an XML resource satisfies all applicable constraints defined + * for the specified phase in a Schematron (ISO 19757-3) schema. The "xslt2" + * query language binding is supported. Two phase names have special + * meanings: + *
    + *
  • "#ALL": All patterns are active
  • + *
  • "#DEFAULT": The phase identified by the defaultPhase attribute on the + * schema element should be used.
  • + *
+ * + * @param schemaRef + * A URL that denotes the location of a Schematron schema. + * @param xmlSource + * The XML Source to be validated. + * @param activePhase + * The active phase (pattern set) whose patterns are used for + * validation; this is set to "#ALL" if not specified. + */ + public static void assertSchematronValid(URL schemaRef, Source xmlSource, String activePhase) { + String phase = (null == activePhase || activePhase.isEmpty()) ? "#ALL" : activePhase; + SchematronValidator validator; + try { + validator = new SchematronValidator(new StreamSource(schemaRef.toString()), phase); + } catch (Exception e) { + StringBuilder msg = new StringBuilder("Failed to process Schematron schema at "); + msg.append(schemaRef).append('\n'); + msg.append(e.getMessage()); + throw new AssertionError(msg); + } + DOMResult result = (DOMResult) validator.validate(xmlSource); + Assert.assertFalse(validator.ruleViolationsDetected(), ErrorMessage.format(ErrorMessageKeys.NOT_SCHEMA_VALID, + validator.getRuleViolationCount(), XMLUtils.writeNodeToString(result.getNode()))); + } + + /** + * Asserts that the given XML entity contains the expected number of + * descendant elements having the specified name. + * + * @param xmlEntity + * A Document representing an XML entity. + * @param elementName + * The qualified name of the element. + * @param expectedCount + * The expected number of occurrences. + */ + public static void assertDescendantElementCount(Document xmlEntity, QName elementName, int expectedCount) { + NodeList features = xmlEntity.getElementsByTagNameNS(elementName.getNamespaceURI(), elementName.getLocalPart()); + Assert.assertEquals(features.getLength(), expectedCount, + String.format("Unexpected number of %s descendant elements.", elementName)); + } + + /** + * Asserts that the given response message contains an OGC exception report. + * The message body must contain an XML document that has a document element + * with the following properties: + * + *
    + *
  • [local name] = "ExceptionReport"
  • + *
  • [namespace name] = "http://www.opengis.net/ows/2.0"
  • + *
+ * + * @param rsp + * A ClientResponse object representing an HTTP response message. + * @param exceptionCode + * The expected OGC exception code. + * @param locator + * A case-insensitive string value expected to occur in the + * locator attribute (e.g. a parameter name); the attribute value + * will be ignored if the argument is null or empty. + */ + public static void assertExceptionReport(ClientResponse rsp, String exceptionCode, String locator) { + Assert.assertEquals(rsp.getStatus(), ClientResponse.Status.BAD_REQUEST.getStatusCode(), + ErrorMessage.get(ErrorMessageKeys.UNEXPECTED_STATUS)); + Document doc = rsp.getEntity(Document.class); + String expr = String.format("//ows:Exception[@exceptionCode = '%s']", exceptionCode); + NodeList nodeList = null; + try { + nodeList = XMLUtils.evaluateXPath(doc, expr, null); + } catch (XPathExpressionException xpe) { + // won't happen + } + Assert.assertTrue(nodeList.getLength() > 0, "Exception not found in response: " + expr); + if (null != locator && !locator.isEmpty()) { + Element exception = (Element) nodeList.item(0); + String locatorValue = exception.getAttribute("locator").toLowerCase(); + Assert.assertTrue(locatorValue.contains(locator.toLowerCase()), + String.format("Expected locator attribute to contain '%s']", locator)); + } + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/ErrorMessage.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/ErrorMessage.java new file mode 100644 index 0000000..8fca8d5 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/ErrorMessage.java @@ -0,0 +1,49 @@ +package org.opengis.cite.ogcapiprocesses10; + +import java.text.MessageFormat; +import java.util.ResourceBundle; + +/** + * Utility class for retrieving and formatting localized error messages that + * describe failed assertions. + */ +public class ErrorMessage { + + private static final String BASE_NAME = + "org.opengis.cite.ogcapiprocesses10.MessageBundle"; + private static ResourceBundle msgResources = + ResourceBundle.getBundle(BASE_NAME); + + /** + * Produces a formatted error message using the supplied substitution + * arguments and the current locale. The arguments should reflect the order + * of the placeholders in the message template. + * + * @param msgKey + * The key identifying the message template; it should be a + * member of {@code ErrorMessageKeys}. + * @param args + * An array of arguments to be formatted and substituted in the + * content of the message. + * @return A String containing the message content. If no message is found + * for the given key, a {@link java.util.MissingResourceException} + * is thrown. + */ + public static String format(String msgKey, Object... args) { + return MessageFormat.format(msgResources.getString(msgKey), args); + } + + /** + * Retrieves a simple message according to the current locale. + * + * @param msgKey + * The key identifying the message; it should be a member of + * {@code ErrorMessageKeys}. + * @return A String containing the message content. If no message is found + * for the given key, a {@link java.util.MissingResourceException} + * is thrown. + */ + public static String get(String msgKey) { + return msgResources.getString(msgKey); + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/ErrorMessageKeys.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/ErrorMessageKeys.java new file mode 100644 index 0000000..ee0cf1b --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/ErrorMessageKeys.java @@ -0,0 +1,22 @@ +package org.opengis.cite.ogcapiprocesses10; + +/** + * Defines keys used to access localized messages for assertion errors. The + * messages are stored in Properties files that are encoded in ISO-8859-1 + * (Latin-1). For some languages the {@code native2ascii} tool must be used to + * process the files and produce escaped Unicode characters. + */ +public class ErrorMessageKeys { + + public static final String NOT_SCHEMA_VALID = "NotSchemaValid"; + public static final String EMPTY_STRING = "EmptyString"; + public static final String XPATH_RESULT = "XPathResult"; + public static final String NAMESPACE_NAME = "NamespaceName"; + public static final String LOCAL_NAME = "LocalName"; + public static final String XML_ERROR = "XMLError"; + public static final String XPATH_ERROR = "XPathError"; + public static final String MISSING_INFOSET_ITEM = "MissingInfosetItem"; + public static final String UNEXPECTED_STATUS = "UnexpectedStatus"; + public static final String UNEXPECTED_MEDIA_TYPE = "UnexpectedMediaType"; + public static final String MISSING_ENTITY = "MissingEntity"; +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/Namespaces.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/Namespaces.java new file mode 100644 index 0000000..b7f30c2 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/Namespaces.java @@ -0,0 +1,31 @@ +package org.opengis.cite.ogcapiprocesses10; + +import java.net.URI; + +/** + * XML namespace names. + * + * @see Namespaces in XML 1.0 + * + */ +public class Namespaces { + + private Namespaces() { + } + + /** SOAP 1.2 message envelopes. */ + public static final String SOAP_ENV = "http://www.w3.org/2003/05/soap-envelope"; + /** W3C XLink */ + public static final String XLINK = "http://www.w3.org/1999/xlink"; + /** OGC 06-121r3 (OWS 1.1) */ + public static final String OWS = "http://www.opengis.net/ows/1.1"; + /** ISO 19136 (GML 3.2) */ + public static final String GML = "http://www.opengis.net/gml/3.2"; + /** W3C XML Schema namespace */ + public static final URI XSD = URI + .create("http://www.w3.org/2001/XMLSchema"); + /** Schematron (ISO 19757-3) namespace */ + public static final URI SCH = URI + .create("http://purl.oclc.org/dsdl/schematron"); + +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/ReusableEntityFilter.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/ReusableEntityFilter.java new file mode 100644 index 0000000..cc85b25 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/ReusableEntityFilter.java @@ -0,0 +1,26 @@ +package org.opengis.cite.ogcapiprocesses10; + +import com.sun.jersey.api.client.ClientHandlerException; +import com.sun.jersey.api.client.ClientRequest; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.filter.ClientFilter; + +/** + * Buffers the (response) entity so it can be read multiple times. + * + *

WARNING: The entity InputStream must be reset after each + * read attempt.

+ */ +public class ReusableEntityFilter extends ClientFilter { + + @Override + public ClientResponse handle(ClientRequest req) throws ClientHandlerException { + // leave request entity--it can usually be read multiple times + ClientResponse rsp = getNext().handle(req); + if (rsp.hasEntity()) { + rsp.bufferEntity(); + } + return rsp; + } + +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/SuiteAttribute.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/SuiteAttribute.java new file mode 100644 index 0000000..02d4c79 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/SuiteAttribute.java @@ -0,0 +1,50 @@ +package org.opengis.cite.ogcapiprocesses10; + +import com.sun.jersey.api.client.Client; + +import java.io.File; + +import org.w3c.dom.Document; + +/** + * An enumerated type defining ISuite attributes that may be set to constitute a + * shared test fixture. + */ +@SuppressWarnings("rawtypes") +public enum SuiteAttribute { + + /** + * A client component for interacting with HTTP endpoints. + */ + CLIENT("httpClient", Client.class), + /** + * A DOM Document that represents the test subject or metadata about it. + */ + TEST_SUBJECT("testSubject", Document.class), + /** + * A File containing the test subject or a description of it. + */ + TEST_SUBJ_FILE("testSubjectFile", File.class); + private final Class attrType; + private final String attrName; + + private SuiteAttribute(String attrName, Class attrType) { + this.attrName = attrName; + this.attrType = attrType; + } + + public Class getType() { + return attrType; + } + + public String getName() { + return attrName; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(attrName); + sb.append('(').append(attrType.getName()).append(')'); + return sb.toString(); + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/SuiteFixtureListener.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/SuiteFixtureListener.java new file mode 100644 index 0000000..6d0eb02 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/SuiteFixtureListener.java @@ -0,0 +1,121 @@ +package org.opengis.cite.ogcapiprocesses10; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.util.Map; +import java.util.logging.Level; + +import org.opengis.cite.ogcapiprocesses10.util.ClientUtils; +import org.opengis.cite.ogcapiprocesses10.util.TestSuiteLogger; +import org.opengis.cite.ogcapiprocesses10.util.URIUtils; +import org.opengis.cite.ogcapiprocesses10.util.XMLUtils; +import org.testng.ISuite; +import org.testng.ISuiteListener; +import org.w3c.dom.Document; + +import com.sun.jersey.api.client.Client; + +/** + * A listener that performs various tasks before and after a test suite is run, + * usually concerned with maintaining a shared test suite fixture. Since this + * listener is loaded using the ServiceLoader mechanism, its methods will be + * called before those of other suite listeners listed in the test suite + * definition and before any annotated configuration methods. + * + * Attributes set on an ISuite instance are not inherited by constituent test + * group contexts (ITestContext). However, suite attributes are still accessible + * from lower contexts. + * + * @see org.testng.ISuite ISuite interface + */ +public class SuiteFixtureListener implements ISuiteListener { + + @Override + public void onStart(ISuite suite) { + processSuiteParameters(suite); + registerClientComponent(suite); + } + + @Override + public void onFinish(ISuite suite) { + if (null != System.getProperty("deleteSubjectOnFinish")) { + deleteTempFiles(suite); + System.getProperties().remove("deleteSubjectOnFinish"); + } + } + + /** + * Processes test suite arguments and sets suite attributes accordingly. The + * entity referenced by the {@link TestRunArg#IUT iut} argument is retrieved + * and written to a File that is set as the value of the suite attribute + * {@link SuiteAttribute#TEST_SUBJ_FILE testSubjectFile}. + * + * @param suite + * An ISuite object representing a TestNG test suite. + */ + void processSuiteParameters(ISuite suite) { + Map params = suite.getXmlSuite().getParameters(); + TestSuiteLogger.log(Level.CONFIG, "Suite parameters\n" + params.toString()); + String iutParam = params.get(TestRunArg.IUT.toString()); + if ((null == iutParam) || iutParam.isEmpty()) { + throw new IllegalArgumentException("Required test run parameter not found: " + TestRunArg.IUT.toString()); + } + URI iutRef = URI.create(iutParam.trim()); + File entityFile = null; + try { + entityFile = URIUtils.dereferenceURI(iutRef); + } catch (IOException iox) { + throw new RuntimeException("Failed to dereference resource located at " + iutRef, iox); + } + TestSuiteLogger.log(Level.FINE, String.format("Wrote test subject to file: %s (%d bytes)", + entityFile.getAbsolutePath(), entityFile.length())); + suite.setAttribute(SuiteAttribute.TEST_SUBJ_FILE.getName(), entityFile); + Document iutDoc = null; + try { + iutDoc = URIUtils.parseURI(entityFile.toURI()); + } catch (Exception x) { + throw new RuntimeException("Failed to parse resource retrieved from " + iutRef, x); + } + suite.setAttribute(SuiteAttribute.TEST_SUBJECT.getName(), iutDoc); + if (TestSuiteLogger.isLoggable(Level.FINE)) { + StringBuilder logMsg = new StringBuilder("Parsed resource retrieved from "); + logMsg.append(iutRef).append("\n"); + logMsg.append(XMLUtils.writeNodeToString(iutDoc)); + TestSuiteLogger.log(Level.FINE, logMsg.toString()); + } + } + + /** + * A client component is added to the suite fixture as the value of the + * {@link SuiteAttribute#CLIENT} attribute; it may be subsequently accessed + * via the {@link org.testng.ITestContext#getSuite()} method. + * + * @param suite + * The test suite instance. + */ + void registerClientComponent(ISuite suite) { + Client client = ClientUtils.buildClient(); + if (null != client) { + suite.setAttribute(SuiteAttribute.CLIENT.getName(), client); + } + } + + /** + * Deletes temporary files created during the test run if TestSuiteLogger is + * enabled at the INFO level or higher (they are left intact at the CONFIG + * level or lower). + * + * @param suite + * The test suite. + */ + void deleteTempFiles(ISuite suite) { + if (TestSuiteLogger.isLoggable(Level.CONFIG)) { + return; + } + File testSubjFile = (File) suite.getAttribute(SuiteAttribute.TEST_SUBJ_FILE.getName()); + if (testSubjFile.exists()) { + testSubjFile.delete(); + } + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/SuitePreconditions.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/SuitePreconditions.java new file mode 100644 index 0000000..bfdb165 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/SuitePreconditions.java @@ -0,0 +1,39 @@ +package org.opengis.cite.ogcapiprocesses10; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.testng.ITestContext; +import org.testng.annotations.BeforeSuite; + +/** + * Checks that various preconditions are satisfied before the test suite is run. + * If any of these (BeforeSuite) methods fail, all tests will be skipped. + */ +public class SuitePreconditions { + + private static final Logger LOGR = Logger.getLogger(SuitePreconditions.class.getName()); + + /** + * Verifies that the referenced test subject exists and has the expected + * type. + * + * @param testContext + * Information about the (pending) test run. + */ + @BeforeSuite + @SuppressWarnings("rawtypes") + public void verifyTestSubject(ITestContext testContext) { + SuiteAttribute testFileAttr = SuiteAttribute.TEST_SUBJ_FILE; + Object sutObj = testContext.getSuite().getAttribute(testFileAttr.getName()); + Class expectedType = testFileAttr.getType(); + if (null != sutObj && expectedType.isInstance(sutObj)) { + // TODO: Verify test subject + } else { + String msg = String.format("Value of test suite attribute '%s' is missing or is not an instance of %s", + testFileAttr.getName(), expectedType.getName()); + LOGR.log(Level.SEVERE, msg); + throw new AssertionError(msg); + } + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/TestFailureListener.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/TestFailureListener.java new file mode 100644 index 0000000..b39d489 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/TestFailureListener.java @@ -0,0 +1,97 @@ +package org.opengis.cite.ogcapiprocesses10; + +import com.sun.jersey.api.client.ClientRequest; +import com.sun.jersey.api.client.ClientResponse; +import java.nio.charset.StandardCharsets; +import javax.ws.rs.core.MediaType; +import org.opengis.cite.ogcapiprocesses10.util.ClientUtils; +import org.opengis.cite.ogcapiprocesses10.util.XMLUtils; +import org.testng.ITestResult; +import org.testng.TestListenerAdapter; +import org.w3c.dom.Document; + +/** + * A listener that augments a test result with diagnostic information in the + * event that a test method failed. This information will appear in the XML + * report when the test run is completed. + */ +public class TestFailureListener extends TestListenerAdapter { + + /** + * Sets the "request" and "response" attributes of a test result. The value + * of these attributes is a string that contains information about the + * content of an outgoing or incoming message: target resource, status code, + * headers, entity (if present). The entity is represented as a String with + * UTF-8 character encoding. + * + * @param result A description of a test result (with a fail verdict). + */ + @Override + public void onTestFailure(ITestResult result) { + super.onTestFailure(result); + Object instance = result.getInstance(); + if (CommonFixture.class.isInstance(instance)) { + CommonFixture fixture = CommonFixture.class.cast(instance); + result.setAttribute("request", getRequestMessageInfo(fixture.request)); + result.setAttribute("response", getResponseMessageInfo(fixture.response)); + } + } + + /** + * Gets diagnostic information about a request message. If the request + * contains a message body, it should be represented as a DOM Document node + * or as an object having a meaningful toString() implementation. + * + * @param req An object representing an HTTP request message. + * @return A string containing information gleaned from the request message. + */ + String getRequestMessageInfo(ClientRequest req) { + if (null == req) { + return "No request message."; + } + StringBuilder msgInfo = new StringBuilder(); + msgInfo.append("Method: ").append(req.getMethod()).append('\n'); + msgInfo.append("Target URI: ").append(req.getURI()).append('\n'); + msgInfo.append("Headers: ").append(req.getHeaders()).append('\n'); + if (null != req.getEntity()) { + Object entity = req.getEntity(); + String body; + if (Document.class.isInstance(entity)) { + Document doc = Document.class.cast(entity); + body = XMLUtils.writeNodeToString(doc); + } else { + body = entity.toString(); + } + msgInfo.append(body).append('\n'); + } + return msgInfo.toString(); + } + + /** + * Gets diagnostic information about a response message. + * + * @param rsp An object representing an HTTP response message. + * @return A string containing information gleaned from the response + * message. + */ + String getResponseMessageInfo(ClientResponse rsp) { + if (null == rsp) { + return "No response message."; + } + StringBuilder msgInfo = new StringBuilder(); + msgInfo.append("Status: ").append(rsp.getStatus()).append('\n'); + msgInfo.append("Headers: ").append(rsp.getHeaders()).append('\n'); + if (rsp.hasEntity()) { + if (rsp.getType().isCompatible(MediaType.APPLICATION_XML_TYPE)) { + Document doc = ClientUtils.getResponseEntityAsDocument(rsp, null); + msgInfo.append(XMLUtils.writeNodeToString(doc)); + } else { + byte[] body = rsp.getEntity(byte[].class); + msgInfo.append(new String(body, StandardCharsets.UTF_8)); + } + msgInfo.append('\n'); + } + return msgInfo.toString(); + } + +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/TestNGController.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/TestNGController.java new file mode 100644 index 0000000..3345596 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/TestNGController.java @@ -0,0 +1,169 @@ +package org.opengis.cite.ogcapiprocesses10; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.logging.Level; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Source; + +import org.opengis.cite.ogcapiprocesses10.util.TestSuiteLogger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.ParameterException; +import com.occamlab.te.spi.executors.TestRunExecutor; +import com.occamlab.te.spi.executors.testng.TestNGExecutor; +import com.occamlab.te.spi.jaxrs.TestSuiteController; + +/** + * Main test run controller oversees execution of TestNG test suites. + */ +public class TestNGController implements TestSuiteController { + + private TestRunExecutor executor; + private Properties etsProperties = new Properties(); + + /** + * A convenience method for running the test suite using a command-line + * interface. The default values of the test run arguments are as follows: + *
    + *
  • XML properties file: ${user.home}/test-run-props.xml
  • + *
  • outputDir: ${user.home}
  • + *
  • deleteSubjectOnFinish: false
  • + *
+ *

+ * Synopsis + *

+ * + *
+     * ets-*-aio.jar [-o|--outputDir $TMPDIR] [-d|--deleteSubjectOnFinish] [test-run-props.xml]
+     * 
+ * + * @param args + * Test run arguments (optional). The first argument must refer + * to an XML properties file containing the expected set of test + * run arguments. If no argument is supplied, the file located at + * ${user.home}/test-run-props.xml will be used. + * @throws Exception + * If the test run cannot be executed (usually due to + * unsatisfied pre-conditions). + */ + public static void main(String[] args) throws Exception { + CommandLineArguments testRunArgs = new CommandLineArguments(); + JCommander cmd = new JCommander(testRunArgs); + try { + cmd.parse(args); + } catch (ParameterException px) { + System.out.println(px.getMessage()); + cmd.usage(); + } + if (testRunArgs.doDeleteSubjectOnFinish()) { + System.setProperty("deleteSubjectOnFinish", "true"); + } + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + File xmlArgs = testRunArgs.getPropertiesFile(); + Document testRunProps = db.parse(xmlArgs); + TestNGController controller = new TestNGController(testRunArgs.getOutputDir()); + Source testResults = controller.doTestRun(testRunProps); + System.out.println("Test results: " + testResults.getSystemId()); + } + + /** + * Default constructor uses the location given by the "java.io.tmpdir" + * system property as the root output directory. + */ + public TestNGController() { + this(System.getProperty("java.io.tmpdir")); + } + + /** + * Construct a controller that writes results to the given output directory. + * + * @param outputDir + * The location of the directory in which test results will be + * written (a file system path or a 'file' URI). It will be + * created if it does not exist. + */ + public TestNGController(String outputDir) { + InputStream is = getClass().getResourceAsStream("ets.properties"); + try { + this.etsProperties.load(is); + } catch (IOException ex) { + TestSuiteLogger.log(Level.WARNING, "Unable to load ets.properties. " + ex.getMessage()); + } + URL tngSuite = TestNGController.class.getResource("testng.xml"); + File resultsDir; + if (null == outputDir || outputDir.isEmpty()) { + resultsDir = new File(System.getProperty("user.home")); + } else if (outputDir.startsWith("file:")) { + resultsDir = new File(URI.create(outputDir)); + } else { + resultsDir = new File(outputDir); + } + TestSuiteLogger.log(Level.CONFIG, "Using TestNG config: " + tngSuite); + TestSuiteLogger.log(Level.CONFIG, "Using outputDirPath: " + resultsDir.getAbsolutePath()); + // NOTE: setting third argument to 'true' enables the default listeners + this.executor = new TestNGExecutor(tngSuite.toString(), resultsDir.getAbsolutePath(), false); + } + + @Override + public String getCode() { + return etsProperties.getProperty("ets-code"); + } + + @Override + public String getVersion() { + return etsProperties.getProperty("ets-version"); + } + + @Override + public String getTitle() { + return etsProperties.getProperty("ets-title"); + } + + @Override + public Source doTestRun(Document testRunArgs) throws Exception { + validateTestRunArgs(testRunArgs); + return executor.execute(testRunArgs); + } + + /** + * Validates the test run arguments. The test run is aborted if any of these + * checks fail. + * + * @param testRunArgs + * A DOM Document containing a set of XML properties (key-value + * pairs). + * @throws IllegalArgumentException + * If any arguments are missing or invalid for some reason. + */ + void validateTestRunArgs(Document testRunArgs) { + if (null == testRunArgs || !testRunArgs.getDocumentElement().getNodeName().equals("properties")) { + throw new IllegalArgumentException("Input is not an XML properties document."); + } + NodeList entries = testRunArgs.getDocumentElement().getElementsByTagName("entry"); + if (entries.getLength() == 0) { + throw new IllegalArgumentException("No test run arguments found."); + } + Map args = new HashMap(); + for (int i = 0; i < entries.getLength(); i++) { + Element entry = (Element) entries.item(i); + args.put(entry.getAttribute("key"), entry.getTextContent()); + } + if (!args.containsKey(TestRunArg.IUT.toString())) { + throw new IllegalArgumentException( + String.format("Missing argument: '%s' must be present.", TestRunArg.IUT)); + } + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/TestRunArg.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/TestRunArg.java new file mode 100644 index 0000000..200312f --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/TestRunArg.java @@ -0,0 +1,18 @@ +package org.opengis.cite.ogcapiprocesses10; + +/** + * An enumerated type defining all recognized test run arguments. + */ +public enum TestRunArg { + + /** + * An absolute URI that refers to a representation of the test subject or + * metadata about it. + */ + IUT; + + @Override + public String toString() { + return name().toLowerCase(); + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/TestRunListener.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/TestRunListener.java new file mode 100644 index 0000000..c7eb1cb --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/TestRunListener.java @@ -0,0 +1,26 @@ +package org.opengis.cite.ogcapiprocesses10; + +import org.testng.IExecutionListener; + +/** + * A listener that is invoked before and after a test run. It is often used to + * configure a shared fixture that endures for the duration of the entire test + * run. A FixtureManager may be used to manage such a fixture. + * + *

A shared fixture should be used with caution in order to avoid undesirable + * test interactions. In general, it should be populated with "read-only" + * objects that are not modified during the test run.

+ * + * @see com.occamlab.te.spi.executors.FixtureManager FixtureManager + * + */ +public class TestRunListener implements IExecutionListener { + + @Override + public void onExecutionStart() { + } + + @Override + public void onExecutionFinish() { + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/level1/Capability1Tests.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/level1/Capability1Tests.java new file mode 100644 index 0000000..9acc478 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/level1/Capability1Tests.java @@ -0,0 +1,95 @@ +package org.opengis.cite.ogcapiprocesses10.level1; + +import java.io.IOException; +import java.net.URL; +import javax.xml.transform.Source; +import javax.xml.transform.dom.DOMSource; +import org.opengis.cite.ogcapiprocesses10.CommonFixture; +import org.opengis.cite.ogcapiprocesses10.ErrorMessage; +import org.opengis.cite.ogcapiprocesses10.ErrorMessageKeys; +import org.opengis.cite.ogcapiprocesses10.SuiteAttribute; +import org.opengis.cite.validation.RelaxNGValidator; +import org.opengis.cite.validation.ValidationErrorHandler; +import org.testng.Assert; +import org.testng.ITestContext; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +/** + * Includes various tests of capability 1. + */ +public class Capability1Tests extends CommonFixture { + + private Document testSubject; + + /** + * Obtains the test subject from the ISuite context. The suite attribute + * {@link org.opengis.cite.ogcapiprocesses10.SuiteAttribute#TEST_SUBJECT} should + * evaluate to a DOM Document node. + * + * @param testContext + * The test (group) context. + */ + @BeforeClass + public void obtainTestSubject(ITestContext testContext) { + Object obj = testContext.getSuite().getAttribute( + SuiteAttribute.TEST_SUBJECT.getName()); + if ((null != obj) && Document.class.isAssignableFrom(obj.getClass())) { + this.testSubject = Document.class.cast(obj); + } + } + + /** + * Sets the test subject. This method is intended to facilitate unit + * testing. + * + * @param testSubject A Document node representing the test subject or + * metadata about it. + */ + public void setTestSubject(Document testSubject) { + this.testSubject = testSubject; + } + + /** + * Verifies the string is empty. + */ + @Test(description = "Implements ATC 1-1") + public void isEmpty() { + String str = " foo "; + Assert.assertTrue(str.isEmpty(), + ErrorMessage.get(ErrorMessageKeys.EMPTY_STRING)); + } + + /** + * Checks the behavior of the trim function. + */ + @Test(description = "Implements ATC 1-2") + public void trim() { + String str = " foo "; + Assert.assertTrue("foo".equals(str.trim())); + } + + /** + * Verify the test subject is a valid Atom feed. + * + * @throws SAXException + * If the resource cannot be parsed. + * @throws IOException + * If the resource is not accessible. + */ + @Test(description = "Implements ATC 1-3") + public void docIsValidAtomFeed() throws SAXException, IOException { + URL schemaRef = getClass().getResource( + "/org/opengis/cite/ogcapiprocesses10/rnc/atom.rnc"); + RelaxNGValidator rngValidator = new RelaxNGValidator(schemaRef); + Source xmlSource = (null != testSubject) + ? new DOMSource(testSubject) : null; + rngValidator.validate(xmlSource); + ValidationErrorHandler err = rngValidator.getErrorHandler(); + Assert.assertFalse(err.errorsDetected(), + ErrorMessage.format(ErrorMessageKeys.NOT_SCHEMA_VALID, + err.getErrorCount(), err.toString())); + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/level1/package-info.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/level1/package-info.java new file mode 100644 index 0000000..d75c227 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/level1/package-info.java @@ -0,0 +1,14 @@ +/** + * Conformance Level 1 includes basic facilities. The following capabilities + * must be supported: + *
    + *
  • Capability 1.1
  • + *
  • Capability 1.2
  • + *
  • Capability 1.3
  • + *
+ * + * @see HTML5 + * - Conformance classes + */ +package org.opengis.cite.ogcapiprocesses10.level1; diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/package-info.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/package-info.java new file mode 100644 index 0000000..bbb908e --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/package-info.java @@ -0,0 +1,8 @@ +/** + * The root package includes supporting classes of general utility such as the + * main controller, listeners, and reporters. + * + *

Subsidiary packages correspond to distinct test groups such as conformance + * classes.

+ */ +package org.opengis.cite.ogcapiprocesses10; \ No newline at end of file diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/util/ClientUtils.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/ClientUtils.java new file mode 100644 index 0000000..693766c --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/ClientUtils.java @@ -0,0 +1,173 @@ +package org.opengis.cite.ogcapiprocesses10.util; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.SocketAddress; +import java.net.URL; + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientRequest; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.api.client.filter.LoggingFilter; +import com.sun.jersey.client.urlconnection.HttpURLConnectionFactory; +import com.sun.jersey.client.urlconnection.URLConnectionClientHandler; +import java.net.URI; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.ws.rs.HttpMethod; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriBuilder; +import javax.xml.transform.Source; +import javax.xml.transform.dom.DOMSource; +import org.opengis.cite.ogcapiprocesses10.ReusableEntityFilter; +import org.w3c.dom.Document; + +/** + * Provides various utility methods for creating and configuring HTTP client + * components. + */ +public class ClientUtils { + + /** + * Builds a client component for interacting with HTTP endpoints. The client + * will automatically redirect to the URI declared in 3xx responses. The + * connection timeout is 10 s. Request and response messages may be logged + * to a JDK logger (in the namespace "com.sun.jersey.api.client"). + * + * @return A Client component. + */ + public static Client buildClient() { + ClientConfig config = new DefaultClientConfig(); + config.getProperties().put( + ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true); + config.getProperties().put( + ClientConfig.PROPERTY_CONNECT_TIMEOUT, 10000); + Client client = Client.create(config); + client.addFilter(new ReusableEntityFilter()); + client.addFilter(new LoggingFilter()); + return client; + } + + /** + * Constructs a client component that uses a specified web proxy. Proxy + * authentication is not supported. Configuring the client to use an + * intercepting proxy can be useful when debugging a test. + * + * @param proxyHost The host name or IP address of the proxy server. + * @param proxyPort The port number of the proxy listener. + * + * @return A Client component that submits requests through a web proxy. + */ + public static Client buildClientWithProxy(final String proxyHost, + final int proxyPort) { + ClientConfig config = new DefaultClientConfig(); + config.getProperties().put( + ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true); + Client client = new Client(new URLConnectionClientHandler( + new HttpURLConnectionFactory() { + SocketAddress addr = new InetSocketAddress(proxyHost, proxyPort); + Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); + + @Override + public HttpURLConnection getHttpURLConnection(URL url) throws IOException { + return (HttpURLConnection) url.openConnection(proxy); + } + }), config); + client.addFilter(new LoggingFilter()); + return client; + } + + /** + * Builds an HTTP request message that uses the GET method. + * + * @param endpoint A URI indicating the target resource. + * @param qryParams A Map containing query parameters (may be null); + * @param mediaTypes A list of acceptable media types; if not specified, + * generic XML ("application/xml") is preferred. + * + * @return A ClientRequest object. + */ + public static ClientRequest buildGetRequest(URI endpoint, + Map qryParams, MediaType... mediaTypes) { + UriBuilder uriBuilder = UriBuilder.fromUri(endpoint); + if (null != qryParams) { + for (Map.Entry param : qryParams.entrySet()) { + uriBuilder.queryParam(param.getKey(), param.getValue()); + } + } + URI uri = uriBuilder.build(); + ClientRequest.Builder reqBuilder = ClientRequest.create(); + if (null == mediaTypes || mediaTypes.length == 0) { + reqBuilder = reqBuilder.accept(MediaType.APPLICATION_XML_TYPE); + } else { + reqBuilder = reqBuilder.accept(mediaTypes); + } + ClientRequest req = reqBuilder.build(uri, HttpMethod.GET); + return req; + } + + /** + * Creates a copy of the given MediaType object but without any parameters. + * + * @param mediaType A MediaType descriptor. + * @return A new (immutable) MediaType object having the same type and + * subtype. + */ + public static MediaType removeParameters(MediaType mediaType) { + return new MediaType(mediaType.getType(), mediaType.getSubtype()); + } + + /** + * Obtains the (XML) response entity as a JAXP Source object and resets the + * entity input stream for subsequent reads. + * + * @param response A representation of an HTTP response message. + * @param targetURI The target URI from which the entity was retrieved (may + * be null). + * @return A Source to read the entity from; its system identifier is set + * using the given targetURI value (this may be used to resolve any relative + * URIs found in the source). + */ + public static Source getResponseEntityAsSource(ClientResponse response, + String targetURI) { + Source source = response.getEntity(DOMSource.class); + if (null != targetURI && !targetURI.isEmpty()) { + source.setSystemId(targetURI); + } + if (response.getEntityInputStream().markSupported()) { + try { + // NOTE: entity was buffered by client filter + response.getEntityInputStream().reset(); + } catch (IOException ex) { + Logger.getLogger(ClientUtils.class.getName()).log(Level.WARNING, + "Failed to reset response entity.", ex); + } + } + return source; + } + + /** + * Obtains the (XML) response entity as a DOM Document and resets the entity + * input stream for subsequent reads. + * + * @param response A representation of an HTTP response message. + * @param targetURI The target URI from which the entity was retrieved (may + * be null). + * @return A Document representing the entity; its base URI is set using the + * given targetURI value (this may be used to resolve any relative URIs + * found in the document). + */ + public static Document getResponseEntityAsDocument(ClientResponse response, + String targetURI) { + DOMSource domSource = (DOMSource) getResponseEntityAsSource(response, + targetURI); + Document entityDoc = (Document) domSource.getNode(); + entityDoc.setDocumentURI(domSource.getSystemId()); + return entityDoc; + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/util/NamespaceBindings.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/NamespaceBindings.java new file mode 100644 index 0000000..344e5c0 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/NamespaceBindings.java @@ -0,0 +1,104 @@ +package org.opengis.cite.ogcapiprocesses10.util; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import javax.xml.namespace.NamespaceContext; +import org.opengis.cite.ogcapiprocesses10.Namespaces; + +/** + * Provides namespace bindings for evaluating XPath 1.0 expressions using the + * JAXP XPath API. A namespace name (URI) may be bound to only one prefix. + */ +public class NamespaceBindings implements NamespaceContext { + + private Map bindings = new HashMap(); + + @Override + public String getNamespaceURI(String prefix) { + String nsName = null; + for (Map.Entry binding : bindings.entrySet()) { + if (binding.getValue().equals(prefix)) { + nsName = binding.getKey(); + break; + } + } + return nsName; + } + + @Override + public String getPrefix(String namespaceURI) { + return bindings.get(namespaceURI); + } + + @Override + public Iterator getPrefixes(String namespaceURI) { + return Arrays.asList(getPrefix(namespaceURI)).iterator(); + } + + /** + * Adds a namespace binding that associates a namespace name with a prefix. + * If a binding for a given namespace name already exists it will be + * replaced. + * + * @param namespaceURI + * A String denoting a namespace name (an absolute URI value). + * @param prefix + * A prefix associated with the namespace name. + */ + public void addNamespaceBinding(String namespaceURI, String prefix) { + bindings.put(namespaceURI, prefix); + } + + /** + * Adds all of the supplied namespace bindings to the existing set of + * entries. + * + * @param nsBindings + * A Map containing a collection of namespace bindings where the + * key is an absolute URI specifying the namespace name and the + * value denotes the associated prefix. + */ + public void addAllBindings(Map nsBindings) { + if (null != nsBindings) + bindings.putAll(nsBindings); + } + + /** + * Returns an unmodifiable view of the declared namespace bindings. + * + * @return An immutable Map containing zero or more namespace bindings where + * the key is an absolute URI specifying the namespace name and the + * value is the associated prefix. + */ + public Map getAllBindings() { + return Collections.unmodifiableMap(this.bindings); + } + + /** + * Creates a NamespaceBindings object that declares the following namespace + * bindings: + * + *
    + *
  • ows: {@value org.opengis.cite.ogcapiprocesses10.Namespaces#OWS}
  • + *
  • xlink: {@value org.opengis.cite.ogcapiprocesses10.Namespaces#XLINK}
  • + *
  • gml: {@value org.opengis.cite.ogcapiprocesses10.Namespaces#GML}
  • + *
+ * + * @return A NamespaceBindings object. + */ + public static NamespaceBindings withStandardBindings() { + NamespaceBindings nsBindings = new NamespaceBindings(); + nsBindings.addNamespaceBinding(Namespaces.OWS, "ows"); + nsBindings.addNamespaceBinding(Namespaces.XLINK, "xlink"); + nsBindings.addNamespaceBinding(Namespaces.GML, "gml"); + return nsBindings; + } + + @Override + public String toString() { + return "NamespaceBindings:\n" + bindings; + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/util/TestSuiteLogger.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/TestSuiteLogger.java new file mode 100644 index 0000000..186962c --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/TestSuiteLogger.java @@ -0,0 +1,73 @@ +package org.opengis.cite.ogcapiprocesses10.util; + +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Logging utility class that provides simple access to the JDK Logging API. Set + * the "java.util.logging.config.file" system property to specify the location + * of the desired logging configuration file. A sample configuration file is + * available at {@code src/main/config/logging.properties}. + * + * @see java.util.logging.LogManager LogManager + */ +public class TestSuiteLogger { + + private static final Logger LOGR = + Logger.getLogger(TestSuiteLogger.class.getPackage().getName()); + + /** + * Logs a message at the specified logging level with the given message + * parameters. + * + * @param level The logging {@link Level level}. + * @param message A String representing the content of the log message. + * @param params An array of message parameters. + */ + public static void log(Level level, String message, Object[] params) { + if (LOGR.isLoggable(level)) { + LOGR.log(level, message, params); + } + } + + /** + * Logs a message at the specified logging level with the given Exception + * object that represents a noteworthy error condition. + * + * @param level The logging {@link Level level}. + * @param message A String representing the content of the log message. + * @param except An object that indicates an exceptional situation. + */ + public static void log(Level level, String message, Exception except) { + if (LOGR.isLoggable(level)) { + LOGR.log(level, message, except); + } + } + + /** + * Logs a simple message at the specified logging level. + * + * @param level The logging {@link Level level}. + * @param message A String representing the content of the log message. + */ + public static void log(Level level, String message) { + if (LOGR.isLoggable(level)) { + LOGR.log(level, message); + } + } + + /** + * Indicates if the logger is enabled at a given logging level. Message + * levels lower than this value will be discarded. + * + * @param level The logging {@link Level level}. + * @return true if the logger is currently enabled for this logging level; + * false otherwise. + */ + public static boolean isLoggable(Level level) { + return LOGR.isLoggable(level); + } + + private TestSuiteLogger() { + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/util/URIUtils.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/URIUtils.java new file mode 100644 index 0000000..ed996ea --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/URIUtils.java @@ -0,0 +1,137 @@ +package org.opengis.cite.ogcapiprocesses10.util; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URI; +import java.util.logging.Level; + +import javax.ws.rs.core.HttpHeaders; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.WebResource; + +/** + * Provides a collection of utility methods for manipulating or resolving URI + * references. + */ +public class URIUtils { + + private static final String FIXUP_BASE_URI = "http://apache.org/xml/features/xinclude/fixup-base-uris"; + + /** + * Parses the content of the given URI as an XML document and returns a new + * DOM Document object. Entity reference nodes will not be expanded. XML + * inclusions (xi:include elements) will be processed if present. + * + * @param uriRef + * An absolute URI specifying the location of an XML resource. + * @return A DOM Document node representing an XML resource. + * @throws SAXException + * If the resource cannot be parsed. + * @throws IOException + * If the resource is not accessible. + */ + public static Document parseURI(URI uriRef) throws SAXException, + IOException { + if ((null == uriRef) || !uriRef.isAbsolute()) { + throw new IllegalArgumentException( + "Absolute URI is required, but received " + uriRef); + } + DocumentBuilderFactory docFactory = DocumentBuilderFactory + .newInstance(); + docFactory.setNamespaceAware(true); + docFactory.setExpandEntityReferences(false); + docFactory.setXIncludeAware(true); + Document doc = null; + try { + // XInclude processor will not add xml:base attributes + docFactory.setFeature(FIXUP_BASE_URI, false); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + doc = docBuilder.parse(uriRef.toString()); + } catch (ParserConfigurationException x) { + TestSuiteLogger.log(Level.WARNING, + "Failed to create DocumentBuilder." + x); + } + if (null != doc) { + doc.setDocumentURI(uriRef.toString()); + } + return doc; + } + + /** + * Dereferences the given URI and stores the resulting resource + * representation in a local file. The file will be located in the default + * temporary file directory. + * + * @param uriRef + * An absolute URI specifying the location of some resource. + * @return A File containing the content of the resource; it may be empty if + * resolution failed for any reason. + * @throws IOException + * If an IO error occurred. + */ + public static File dereferenceURI(URI uriRef) throws IOException { + if ((null == uriRef) || !uriRef.isAbsolute()) { + throw new IllegalArgumentException( + "Absolute URI is required, but received " + uriRef); + } + if (uriRef.getScheme().equalsIgnoreCase("file")) { + return new File(uriRef); + } + Client client = Client.create(); + WebResource webRes = client.resource(uriRef); + ClientResponse rsp = webRes.get(ClientResponse.class); + String suffix = null; + if (rsp.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE).endsWith("xml")) { + suffix = ".xml"; + } + File destFile = File.createTempFile("entity-", suffix); + if (rsp.hasEntity()) { + InputStream is = rsp.getEntityInputStream(); + OutputStream os = new FileOutputStream(destFile); + byte[] buffer = new byte[8 * 1024]; + int bytesRead; + while ((bytesRead = is.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + is.close(); + os.flush(); + os.close(); + } + TestSuiteLogger.log(Level.FINE, "Wrote " + destFile.length() + + " bytes to file at " + destFile.getAbsolutePath()); + return destFile; + } + + /** + * Constructs an absolute URI from the given URI reference and a base URI. + * + * @see RFC 3986, + * 5.2 + * + * @param baseURI + * The base URI; if present, it must be an absolute URI. + * @param uriRef + * A URI reference that may be relative to the given base URI. + * @return The resulting URI. + * + */ + public static URI resolveRelativeURI(String baseURI, String uriRef) { + URI uri = (null != baseURI) ? URI.create(baseURI) : URI.create(""); + if (null != baseURI && null == uri.getScheme()) { + throw new IllegalArgumentException( + "Base URI has no scheme component: " + baseURI); + } + return uri.resolve(uriRef); + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/util/ValidationUtils.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/ValidationUtils.java new file mode 100644 index 0000000..da72a73 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/ValidationUtils.java @@ -0,0 +1,162 @@ +package org.opengis.cite.ogcapiprocesses10.util; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URL; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Level; + +import javax.xml.XMLConstants; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.Attribute; +import javax.xml.stream.events.StartElement; +import javax.xml.transform.Source; +import javax.xml.transform.stream.StreamSource; + +import org.apache.xerces.util.XMLCatalogResolver; +import org.opengis.cite.ogcapiprocesses10.Namespaces; +import org.opengis.cite.validation.SchematronValidator; +import org.w3c.dom.ls.LSResourceResolver; + +/** + * A utility class that provides convenience methods to support schema + * validation. + */ +public class ValidationUtils { + + static final String ROOT_PKG = "/org/opengis/cite/ogcapiprocesses10/"; + private static final XMLCatalogResolver SCH_RESOLVER = initCatalogResolver(); + + private static XMLCatalogResolver initCatalogResolver() { + return (XMLCatalogResolver) createSchemaResolver(Namespaces.SCH); + } + + /** + * Creates a resource resolver suitable for locating schemas using an entity + * catalog. In effect, local copies of standard schemas are returned instead + * of retrieving them from external repositories. + * + * @param schemaLanguage + * A URI that identifies a schema language by namespace name. + * @return A {@code LSResourceResolver} object that is configured to use an + * OASIS entity catalog. + */ + public static LSResourceResolver createSchemaResolver(URI schemaLanguage) { + String catalogFileName; + if (schemaLanguage.equals(Namespaces.XSD)) { + catalogFileName = "schema-catalog.xml"; + } else { + catalogFileName = "schematron-catalog.xml"; + } + URL catalogURL = ValidationUtils.class.getResource(ROOT_PKG + + catalogFileName); + XMLCatalogResolver resolver = new XMLCatalogResolver(); + resolver.setCatalogList(new String[] { catalogURL.toString() }); + return resolver; + } + + /** + * Constructs a SchematronValidator that will check an XML resource against + * the rules defined in a Schematron schema. An attempt is made to resolve + * the schema reference using an entity catalog; if this fails the reference + * is used as given. + * + * @param schemaRef + * A reference to a Schematron schema; this is expected to be a + * relative or absolute URI value, possibly matching the system + * identifier for some entry in an entity catalog. + * @param phase + * The name of the phase to invoke. + * @return A SchematronValidator instance, or {@code null} if the validator + * cannot be constructed (e.g. invalid schema reference or phase + * name). + */ + public static SchematronValidator buildSchematronValidator( + String schemaRef, String phase) { + Source source = null; + try { + String catalogRef = SCH_RESOLVER + .resolveSystem(schemaRef.toString()); + if (null != catalogRef) { + source = new StreamSource(URI.create(catalogRef).toString()); + } else { + source = new StreamSource(schemaRef); + } + } catch (IOException x) { + TestSuiteLogger.log(Level.WARNING, + "Error reading Schematron schema catalog.", x); + } + SchematronValidator validator = null; + try { + validator = new SchematronValidator(source, phase); + } catch (Exception e) { + TestSuiteLogger.log(Level.WARNING, + "Error creating Schematron validator.", e); + } + return validator; + } + + /** + * Extracts a set of XML Schema references from a source XML document. The + * document element is expected to include the standard xsi:schemaLocation + * attribute. + * + * @param source + * The source instance to read from; its base URI (systemId) + * should be set. + * @param baseURI + * An alternative base URI to use if the source does not have a + * system identifier set or if its system id is a {@code file} + * URI. This will usually be the URI used to retrieve the + * resource; it may be null. + * @return A Set containing absolute URI references that specify the + * locations of XML Schema resources. + * @throws XMLStreamException + * If an error occurs while reading the source instance. + */ + public static Set extractSchemaReferences(Source source, String baseURI) + throws XMLStreamException { + XMLInputFactory factory = XMLInputFactory.newInstance(); + XMLEventReader reader = factory.createXMLEventReader(source); + // advance to document element + StartElement docElem = reader.nextTag().asStartElement(); + Attribute schemaLoc = docElem.getAttributeByName(new QName( + XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "schemaLocation")); + if (null == schemaLoc) { + throw new RuntimeException( + "No xsi:schemaLocation attribute found. See ISO 19136, A.3.1."); + } + String[] uriValues = schemaLoc.getValue().split("\\s+"); + if (uriValues.length % 2 != 0) { + throw new RuntimeException( + "xsi:schemaLocation attribute contains an odd number of URI values:\n" + + Arrays.toString(uriValues)); + } + Set schemaURIs = new HashSet(); + // one or more pairs of [namespace name] [schema location] + for (int i = 0; i < uriValues.length; i += 2) { + URI schemaURI = null; + if (!URI.create(uriValues[i + 1]).isAbsolute() + && (null != source.getSystemId())) { + String schemaRef = URIUtils.resolveRelativeURI( + source.getSystemId(), uriValues[i + 1]).toString(); + if (schemaRef.startsWith("file") + && !new File(schemaRef).exists() && (null != baseURI)) { + schemaRef = URIUtils.resolveRelativeURI(baseURI, + uriValues[i + 1]).toString(); + } + schemaURI = URI.create(schemaRef); + } else { + schemaURI = URI.create(uriValues[i + 1]); + } + schemaURIs.add(schemaURI); + } + return schemaURIs; + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/util/XMLUtils.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/XMLUtils.java new file mode 100644 index 0000000..6486c79 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/XMLUtils.java @@ -0,0 +1,410 @@ +package org.opengis.cite.ogcapiprocesses10.util; + +import java.io.OutputStream; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import net.sf.saxon.s9api.DOMDestination; +import net.sf.saxon.s9api.DocumentBuilder; +import net.sf.saxon.s9api.Processor; +import net.sf.saxon.s9api.SaxonApiException; +import net.sf.saxon.s9api.XPathCompiler; +import net.sf.saxon.s9api.XPathSelector; +import net.sf.saxon.s9api.XQueryCompiler; +import net.sf.saxon.s9api.XQueryEvaluator; +import net.sf.saxon.s9api.XQueryExecutable; +import net.sf.saxon.s9api.XdmNode; +import net.sf.saxon.s9api.XdmValue; +import net.sf.saxon.s9api.XsltCompiler; +import net.sf.saxon.s9api.XsltExecutable; +import net.sf.saxon.s9api.XsltTransformer; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * Provides various utility methods for accessing or manipulating XML + * representations. + */ +public class XMLUtils { + + private static final Logger LOGR = Logger.getLogger(XMLUtils.class.getPackage().getName()); + private static final XMLInputFactory STAX_FACTORY = initXMLInputFactory(); + private static final XPathFactory XPATH_FACTORY = initXPathFactory(); + + private static XPathFactory initXPathFactory() { + XPathFactory factory = XPathFactory.newInstance(); + return factory; + } + + private static XMLInputFactory initXMLInputFactory() { + XMLInputFactory factory = XMLInputFactory.newInstance(); + factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE); + return factory; + } + + /** + * Writes the content of a DOM Node to a string. The XML declaration is + * omitted and the character encoding is set to "US-ASCII" (any character + * outside of this set is serialized as a numeric character reference). + * + * @param node + * The DOM Node to be serialized. + * @return A String representing the content of the given node. + */ + public static String writeNodeToString(Node node) { + if (null == node) { + return ""; + } + Writer writer = null; + try { + Transformer idTransformer = TransformerFactory.newInstance().newTransformer(); + Properties outProps = new Properties(); + outProps.setProperty(OutputKeys.ENCODING, "US-ASCII"); + outProps.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + outProps.setProperty(OutputKeys.INDENT, "yes"); + idTransformer.setOutputProperties(outProps); + writer = new StringWriter(); + idTransformer.transform(new DOMSource(node), new StreamResult(writer)); + } catch (TransformerException ex) { + TestSuiteLogger.log(Level.WARNING, "Failed to serialize node " + node.getNodeName(), ex); + } + return writer.toString(); + } + + /** + * Writes the content of a DOM Node to a byte stream. An XML declaration is + * always omitted. + * + * @param node + * The DOM Node to be serialized. + * @param outputStream + * The destination OutputStream reference. + */ + public static void writeNode(Node node, OutputStream outputStream) { + try { + Transformer idTransformer = TransformerFactory.newInstance().newTransformer(); + Properties outProps = new Properties(); + outProps.setProperty(OutputKeys.METHOD, "xml"); + outProps.setProperty(OutputKeys.ENCODING, "UTF-8"); + outProps.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + outProps.setProperty(OutputKeys.INDENT, "yes"); + idTransformer.setOutputProperties(outProps); + idTransformer.transform(new DOMSource(node), new StreamResult(outputStream)); + } catch (TransformerException ex) { + String nodeName = (node.getNodeType() == Node.DOCUMENT_NODE) + ? Document.class.cast(node).getDocumentElement().getNodeName() : node.getNodeName(); + TestSuiteLogger.log(Level.WARNING, "Failed to serialize DOM node: " + nodeName, ex); + } + } + + /** + * Evaluates an XPath 1.0 expression using the given context and returns the + * result as a node set. + * + * @param context + * The context node. + * @param expr + * An XPath expression. + * @param namespaceBindings + * A collection of namespace bindings for the XPath expression, + * where each entry maps a namespace URI (key) to a prefix + * (value). Standard bindings do not need to be declared (see + * {@link NamespaceBindings#withStandardBindings()}. + * @return A NodeList containing nodes that satisfy the expression (it may + * be empty). + * @throws XPathExpressionException + * If the expression cannot be evaluated for any reason. + */ + public static NodeList evaluateXPath(Node context, String expr, Map namespaceBindings) + throws XPathExpressionException { + Object result = evaluateXPath(context, expr, namespaceBindings, XPathConstants.NODESET); + if (!NodeList.class.isInstance(result)) { + throw new XPathExpressionException("Expression does not evaluate to a NodeList: " + expr); + } + return (NodeList) result; + } + + /** + * Evaluates an XPath expression using the given context and returns the + * result as the specified type. + * + *

+ * Note: The Saxon implementation supports XPath 2.0 + * expressions when using the JAXP XPath APIs (the default implementation + * will throw an exception). + *

+ * + * @param context + * The context node. + * @param expr + * An XPath expression. + * @param namespaceBindings + * A collection of namespace bindings for the XPath expression, + * where each entry maps a namespace URI (key) to a prefix + * (value). Standard bindings do not need to be declared (see + * {@link NamespaceBindings#withStandardBindings()}. + * @param returnType + * The desired return type (as declared in {@link XPathConstants} + * ). + * @return The result converted to the desired returnType. + * @throws XPathExpressionException + * If the expression cannot be evaluated for any reason. + */ + public static Object evaluateXPath(Node context, String expr, Map namespaceBindings, + QName returnType) throws XPathExpressionException { + NamespaceBindings bindings = NamespaceBindings.withStandardBindings(); + bindings.addAllBindings(namespaceBindings); + XPathFactory factory = XPATH_FACTORY; + // WARNING: If context node is Saxon NodeOverNodeInfo, the factory must + // use the same Configuration object to avoid IllegalArgumentException + XPath xpath = factory.newXPath(); + xpath.setNamespaceContext(bindings); + Object result = xpath.evaluate(expr, context, returnType); + return result; + } + + /** + * Evaluates an XPath 2.0 expression using the Saxon s9api interfaces. + * + * @param xmlSource + * The XML Source. + * @param expr + * The XPath expression to be evaluated. + * @param nsBindings + * A collection of namespace bindings required to evaluate the + * XPath expression, where each entry maps a namespace URI (key) + * to a prefix (value); this may be {@code null} if not needed. + * @return An XdmValue object representing a value in the XDM data model; + * this is a sequence of zero or more items, where each item is + * either an atomic value or a node. + * @throws SaxonApiException + * If an error occurs while evaluating the expression; this + * always wraps some other underlying exception. + */ + public static XdmValue evaluateXPath2(Source xmlSource, String expr, Map nsBindings) + throws SaxonApiException { + Processor proc = new Processor(false); + XPathCompiler compiler = proc.newXPathCompiler(); + if (null != nsBindings) { + for (String nsURI : nsBindings.keySet()) { + compiler.declareNamespace(nsBindings.get(nsURI), nsURI); + } + } + XPathSelector xpath = compiler.compile(expr).load(); + DocumentBuilder builder = proc.newDocumentBuilder(); + XdmNode node = null; + if (DOMSource.class.isInstance(xmlSource)) { + DOMSource domSource = (DOMSource) xmlSource; + node = builder.wrap(domSource.getNode()); + } else { + node = builder.build(xmlSource); + } + xpath.setContextItem(node); + return xpath.evaluate(); + } + + /** + * Evaluates an XQuery 1.0 expression using the Saxon s9api interfaces. + * + * @param source + * The XML Source. + * @param query + * The query expression. + * @param nsBindings + * A collection of namespace bindings required to evaluate the + * query, where each entry maps a namespace URI (key) to a prefix + * (value). + * @return An XdmValue object representing a value in the XDM data model. + * @throws SaxonApiException + * If an error occurs while evaluating the query (this always + * wraps some other underlying exception). + */ + public static XdmValue evaluateXQuery(Source source, String query, Map nsBindings) + throws SaxonApiException { + Processor proc = new Processor(false); + XQueryCompiler xqCompiler = proc.newXQueryCompiler(); + if (null != nsBindings) { + for (String nsURI : nsBindings.keySet()) { + xqCompiler.declareNamespace(nsBindings.get(nsURI), nsURI); + } + } + XQueryExecutable xqExec = xqCompiler.compile(query); + XQueryEvaluator xqEval = xqExec.load(); + xqEval.setSource(source); + return xqEval.evaluate(); + } + + /** + * Creates a new Element having the specified qualified name. The element + * must be {@link Document#adoptNode(Node) adopted} when inserted into + * another Document. + * + * @param qName + * A QName object. + * @return An Element node (with a Document owner but no parent). + */ + public static Element createElement(QName qName) { + Document doc = null; + try { + doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + } catch (ParserConfigurationException e) { + throw new RuntimeException(e); + } + Element elem = doc.createElementNS(qName.getNamespaceURI(), qName.getLocalPart()); + return elem; + } + + /** + * Returns a List of all descendant Element nodes having the specified + * [namespace name] property. The elements are listed in document order. + * + * @param node + * The node to search from. + * @param namespaceURI + * An absolute URI denoting a namespace name. + * @return A List containing elements in the specified namespace; the list + * is empty if there are no elements in the namespace. + */ + public static List getElementsByNamespaceURI(Node node, String namespaceURI) { + List list = new ArrayList(); + NodeList children = node.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() != Node.ELEMENT_NODE) + continue; + if (child.getNamespaceURI().equals(namespaceURI)) + list.add((Element) child); + } + return list; + } + + /** + * Transforms the content of a DOM Node using a specified XSLT stylesheet. + * + * @param xslt + * A Source object representing a stylesheet (XSLT 1.0 or 2.0). + * @param source + * A Node representing the XML source. If it is an Element node + * it will be imported into a new DOM Document. + * @return A DOM Document containing the result of the transformation. + */ + public static Document transform(Source xslt, Node source) { + Document sourceDoc = null; + Document resultDoc = null; + try { + resultDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + if (source.getNodeType() == Node.DOCUMENT_NODE) { + sourceDoc = (Document) source; + } else { + sourceDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + sourceDoc.appendChild(sourceDoc.importNode(source, true)); + } + } catch (ParserConfigurationException pce) { + throw new RuntimeException(pce); + } + Processor processor = new Processor(false); + XsltCompiler compiler = processor.newXsltCompiler(); + try { + XsltExecutable exec = compiler.compile(xslt); + XsltTransformer transformer = exec.load(); + transformer.setSource(new DOMSource(sourceDoc)); + transformer.setDestination(new DOMDestination(resultDoc)); + transformer.transform(); + } catch (SaxonApiException e) { + throw new RuntimeException(e); + } + return resultDoc; + } + + /** + * Expands character entity ({@literal &name;}) and numeric references ( + * {@literal &#xhhhh;} or {@literal &dddd;}) that occur within a given + * string value. It may be necessary to do this before processing an XPath + * expression. + * + * @param value + * A string representing text content. + * @return A string with all included references expanded. + */ + public static String expandReferencesInText(String value) { + StringBuilder wrapper = new StringBuilder(""); + wrapper.append(value).append(""); + Reader reader = new StringReader(wrapper.toString()); + String str = null; + try { + XMLStreamReader xsr = STAX_FACTORY.createXMLStreamReader(reader); + xsr.nextTag(); // document element + str = xsr.getElementText(); + } catch (XMLStreamException xse) { + LOGR.log(Level.WARNING, xse.getMessage(), xse); + } + return str; + } + + /** + * Creates a DOM Document with the given Element as the document element. A + * deep copy of the element is imported; the source element is not altered. + * + * @param elem + * An Element node. + * @return A Document node. + */ + public static Document importElement(Element elem) { + javax.xml.parsers.DocumentBuilder docBuilder = null; + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + docBuilder = factory.newDocumentBuilder(); + } catch (ParserConfigurationException ex) { + LOGR.log(Level.WARNING, null, ex); + } + Document newDoc = docBuilder.newDocument(); + Node newNode = newDoc.importNode(elem, true); + newDoc.appendChild(newNode); + return newDoc; + } + + /** + * Returns a List view of the nodes in the given NodeList collection. + * + * @param nodeList + * An ordered collection of DOM nodes. + * @return A List containing the original sequence of Node objects. + */ + public static List asList(NodeList nodeList) { + List nodes = new ArrayList<>(); + for (int i = 0; i < nodeList.getLength(); i++) { + nodes.add(nodeList.item(i)); + } + return nodes; + } +} diff --git a/src/main/java/org/opengis/cite/ogcapiprocesses10/util/package-info.java b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/package-info.java new file mode 100644 index 0000000..26ceb85 --- /dev/null +++ b/src/main/java/org/opengis/cite/ogcapiprocesses10/util/package-info.java @@ -0,0 +1,4 @@ +/** + * This package includes miscellaneous utility classes to support testing. + */ +package org.opengis.cite.ogcapiprocesses10.util; diff --git a/src/main/javadoc/index.html b/src/main/javadoc/index.html new file mode 100644 index 0000000..5143475 --- /dev/null +++ b/src/main/javadoc/index.html @@ -0,0 +1,10 @@ + + + + + + + </head> + <body> + </body> +</html> diff --git a/src/main/javadoc/overview.html b/src/main/javadoc/overview.html new file mode 100644 index 0000000..13f0d6a --- /dev/null +++ b/src/main/javadoc/overview.html @@ -0,0 +1,96 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> + <head> + <title>OGC API - Processes Standard 1.0 Conformance Test Suite + + + + +

OGC API - Processes Standard 1.0 Conformance Test Suite

+

This executable test suite (ETS) verifies the conformance of the implementation + under test (IUT) with respect to all relevant specifications. Conformance testing + is a kind of "black box" testing that examines externally visible characteristics + or behaviors of the IUT and is independent of any implementation details.

+ +

The test run arguments are summarized in the following table. The Obligation + descriptor can have the following values: M (mandatory), O (optional), or C + (conditional).

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Test run arguments
NameValue domainObligationDescription
iutURIMA URI that refers to the implementation under test or metadata about it. + Ampersand ('&') characters must be percent-encoded as '%26'.
icsA comma-separated list of string values.OAn implementation conformance statement that indicates which conformance + classes or options are supported.
+ + + diff --git a/src/main/resources/META-INF/services/com.occamlab.te.spi.jaxrs.TestSuiteController b/src/main/resources/META-INF/services/com.occamlab.te.spi.jaxrs.TestSuiteController new file mode 100644 index 0000000..7483210 --- /dev/null +++ b/src/main/resources/META-INF/services/com.occamlab.te.spi.jaxrs.TestSuiteController @@ -0,0 +1 @@ +org.opengis.cite.ogcapiprocesses10.TestNGController \ No newline at end of file diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/MessageBundle.properties b/src/main/resources/org/opengis/cite/ogcapiprocesses10/MessageBundle.properties new file mode 100644 index 0000000..0aa5996 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/MessageBundle.properties @@ -0,0 +1,12 @@ +# assertion error messages in English (default) +NotSchemaValid = {0} schema validation error(s) detected.\n {1} +EmptyString = Expected empty string. +XPathResult = Unexpected result evaluating XPath expression with context node {0}: {1} +NamespaceName = Node has unexpected [namespace name] value. +LocalName = Node has unexpected [local name] value. +XMLError = Failed to read XML resource. {0} +XPathError = XPath expression cannot be evaluated: {0}. {1} +MissingInfosetItem = Infoset item is missing or empty: {0}. Location: {1} +UnexpectedStatus = Unexpected HTTP status code. +UnexpectedMediaType = Response entity has unexpected media type. +MissingEntity = Response entity is missing. diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/MessageBundle_en.properties b/src/main/resources/org/opengis/cite/ogcapiprocesses10/MessageBundle_en.properties new file mode 100644 index 0000000..0aa5996 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/MessageBundle_en.properties @@ -0,0 +1,12 @@ +# assertion error messages in English (default) +NotSchemaValid = {0} schema validation error(s) detected.\n {1} +EmptyString = Expected empty string. +XPathResult = Unexpected result evaluating XPath expression with context node {0}: {1} +NamespaceName = Node has unexpected [namespace name] value. +LocalName = Node has unexpected [local name] value. +XMLError = Failed to read XML resource. {0} +XPathError = XPath expression cannot be evaluated: {0}. {1} +MissingInfosetItem = Infoset item is missing or empty: {0}. Location: {1} +UnexpectedStatus = Unexpected HTTP status code. +UnexpectedMediaType = Response entity has unexpected media type. +MissingEntity = Response entity is missing. diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/ets.properties b/src/main/resources/org/opengis/cite/ogcapiprocesses10/ets.properties new file mode 100644 index 0000000..e06e192 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/ets.properties @@ -0,0 +1,3 @@ +ets-title = ${project.name} +ets-version = ${project.version} +ets-code = ${ets-code} diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/rnc/atom.rnc b/src/main/resources/org/opengis/cite/ogcapiprocesses10/rnc/atom.rnc new file mode 100644 index 0000000..3777e94 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/rnc/atom.rnc @@ -0,0 +1,283 @@ +# RELAX NG Compact Syntax Grammar for the Atom Format Specification +# See + + namespace atom = "http://www.w3.org/2005/Atom" + namespace xhtml = "http://www.w3.org/1999/xhtml" + namespace s = "http://www.ascc.net/xml/schematron" + namespace local = "" + + start = atomFeed | atomEntry + + atomCommonAttributes = + attribute xml:base { atomUri }?, + attribute xml:lang { atomLanguageTag }?, + undefinedAttribute* + + atomPlainTextConstruct = + atomCommonAttributes, + attribute type { "text" | "html" }?, + text + + atomXHTMLTextConstruct = + atomCommonAttributes, + attribute type { "xhtml" }, + xhtmlDiv + + atomTextConstruct = atomPlainTextConstruct | atomXHTMLTextConstruct + + atomPersonConstruct = + atomCommonAttributes, + (element atom:name { text } + & element atom:uri { atomUri }? + & element atom:email { atomEmailAddress }? + & extensionElement*) + + atomDateConstruct = + atomCommonAttributes, + xsd:dateTime + + atomFeed = + [ + s:rule [ + context = "atom:feed" + s:assert [ + test = "atom:author or not(atom:entry[not(atom:author)])" + "An atom:feed must have an atom:author unless all " + ~ "of its atom:entry children have an atom:author." + ] + ] + ] + element atom:feed { + atomCommonAttributes, + (atomAuthor* + & atomCategory* + & atomContributor* + & atomGenerator? + & atomIcon? + & atomId + & atomLink* + & atomLogo? + & atomRights? + & atomSubtitle? + & atomTitle + & atomUpdated + & extensionElement*), + atomEntry* + } + + atomEntry = + [ + s:rule [ + context = "atom:entry" + s:assert [ + test = "atom:link[@rel='alternate'] " + ~ "or atom:link[not(@rel)] " + ~ "or atom:content" + "An atom:entry must have at least one atom:link element " + ~ "with a rel attribute of 'alternate' " + ~ "or an atom:content." + ] + ] + s:rule [ + context = "atom:entry" + s:assert [ + test = "atom:author or " + ~ "../atom:author or atom:source/atom:author" + "An atom:entry must have an atom:author " + ~ "if its feed does not." + ] + ] + ] + element atom:entry { + atomCommonAttributes, + (atomAuthor* + & atomCategory* + & atomContent? + & atomContributor* + & atomId + & atomLink* + & atomPublished? + & atomRights? + & atomSource? + & atomSummary? + & atomTitle + & atomUpdated + & extensionElement*) + } + + atomInlineTextContent = + element atom:content { + atomCommonAttributes, + attribute type { "text" | "html" }?, + (text)* + } + + atomInlineXHTMLContent = + element atom:content { + atomCommonAttributes, + attribute type { "xhtml" }, + xhtmlDiv + } + + atomInlineOtherContent = + element atom:content { + atomCommonAttributes, + attribute type { atomMediaType }?, + (text|anyElement)* + } + + atomOutOfLineContent = + element atom:content { + atomCommonAttributes, + attribute type { atomMediaType }?, + attribute src { atomUri }, + empty + } + + atomContent = atomInlineTextContent + | atomInlineXHTMLContent + | atomInlineOtherContent + | atomOutOfLineContent + + atomAuthor = element atom:author { atomPersonConstruct } + + # atom:category + + atomCategory = + element atom:category { + atomCommonAttributes, + attribute term { text }, + attribute scheme { atomUri }?, + attribute label { text }?, + undefinedContent + } + + atomContributor = element atom:contributor { atomPersonConstruct } + + atomGenerator = element atom:generator { + atomCommonAttributes, + attribute uri { atomUri }?, + attribute version { text }?, + text + } + + atomIcon = element atom:icon { + atomCommonAttributes, + (atomUri) + } + + atomId = element atom:id { + atomCommonAttributes, + (atomUri) + } + + atomLogo = element atom:logo { + atomCommonAttributes, + (atomUri) + } + + atomLink = + element atom:link { + atomCommonAttributes, + attribute href { atomUri }, + attribute rel { atomNCName | atomUri }?, + attribute type { atomMediaType }?, + attribute hreflang { atomLanguageTag }?, + attribute title { text }?, + attribute length { text }?, + undefinedContent + } + + atomPublished = element atom:published { atomDateConstruct } + + atomRights = element atom:rights { atomTextConstruct } + + atomSource = + element atom:source { + atomCommonAttributes, + (atomAuthor* + & atomCategory* + & atomContributor* + & atomGenerator? + & atomIcon? + & atomId? + & atomLink* + & atomLogo? + & atomRights? + & atomSubtitle? + & atomTitle? + & atomUpdated? + & extensionElement*) + } + + atomSubtitle = element atom:subtitle { atomTextConstruct } + + atomSummary = element atom:summary { atomTextConstruct } + + atomTitle = element atom:title { atomTextConstruct } + + atomUpdated = element atom:updated { atomDateConstruct } + + atomNCName = xsd:string { minLength = "1" pattern = "[^:]*" } + + # Whatever a media type is, it contains at least one slash + atomMediaType = xsd:string { pattern = ".+/.+" } + + # As defined in RFC 3066 + atomLanguageTag = xsd:string { + pattern = "[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*" + } + + # Unconstrained; it's not entirely clear how IRI fit into + # xsd:anyURI so let's not try to constrain it here + atomUri = text + + # Whatever an email address is, it contains at least one @ + atomEmailAddress = xsd:string { pattern = ".+@.+" } + + simpleExtensionElement = + element * - atom:* { + text + } + + structuredExtensionElement = + element * - atom:* { + (attribute * { text }+, + (text|anyElement)*) + | (attribute * { text }*, + (text?, anyElement+, (text|anyElement)*)) + } + + extensionElement = + simpleExtensionElement | structuredExtensionElement + + undefinedAttribute = + attribute * - (xml:base | xml:lang | local:*) { text } + + undefinedContent = (text|anyForeignElement)* + + anyElement = + element * { + (attribute * { text } + | text + | anyElement)* + } + + anyForeignElement = + element * - atom:* { + (attribute * { text } + | text + | anyElement)* + } + + anyXHTML = element xhtml:* { + (attribute * { text } + | text + | anyXHTML)* + } + + xhtmlDiv = element xhtml:div { + (attribute * { text } + | text + | anyXHTML)* + } diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/sch/gml-3.2.1.sch b/src/main/resources/org/opengis/cite/ogcapiprocesses10/sch/gml-3.2.1.sch new file mode 100644 index 0000000..3e16139 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/sch/gml-3.2.1.sch @@ -0,0 +1,110 @@ + + + Schematron constraints for GML 3.2 (ISO 19136) + + + + + + ValueArray may not carry both a reference to a + codeSpace and a uom + + + + + All components shall be of the same type + All components shall be of the same type + + + + + The presence of a dimension attribute + implies the presence of the srsName attribute. + The presence of an axisLabels attribute + implies the presence of the srsName attribute. + The presence of an uomLabels attribute implies + the presence of the srsName attribute. + The + presence of an uomLabels attribute implies the presence of the axisLabels attribute and vice + versa. + + + + + All patches shall + be gml:PolygonPatch elements or an element in the substitution group of gml:PolygonPatch. + Note that the test currently does not identify substitutable elements correctly, this will + require the use of XPath 2 in the future. + + + + + All patches shall be + gml:Triangle elements or an element in the substitution group of gml:PolygonPatch. Note that + the test currently does not identify substitutable elements correctly, this will require the + use of XPath 2 in the future. + + + + + Property element may not carry both a + reference to an object and contain an object. + Property element shall either carry a reference to + an object or contain an object. + + + + + All values in + the domain set shall be gml:MultiPoint elements or an element in its substitution group. + Note that the test currently does not identify substitutable elements correctly, this will + require the use of XPath 2 in the future. + + + + + All values in + the domain set shall be gml:MultiCurve elements or an element in its substitution group. + Note that the test currently does not identify substitutable elements correctly, this will + require the use of XPath 2 in the future. + + + + + All values in + the domain set shall be gml:MultiSurface elements or an element in its substitution group. + Note that the test currently does not identify substitutable elements correctly, this will + require the use of XPath 2 in the future. + + + + + All values in + the domain set shall be gml:MultiSolid elements or an element in its substitution group. + Note that the test currently does not identify substitutable elements correctly, this will + require the use of XPath 2 in the future. + + + + + All values in the + domain set shall be gml:Grid elements or an element in its substitution group. Note that the + test currently does not identify substitutable elements correctly, this will require the use + of XPath 2 in the future. + + + + + All values in + the domain set shall be gml:RectifiedGrid elements or an element in its substitution group. + Note that the test currently does not identify substitutable elements correctly, this will + require the use of XPath 2 in the future. + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/schema-catalog.xml b/src/main/resources/org/opengis/cite/ogcapiprocesses10/schema-catalog.xml new file mode 100644 index 0000000..d1a9389 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/schema-catalog.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/schematron-catalog.xml b/src/main/resources/org/opengis/cite/ogcapiprocesses10/schematron-catalog.xml new file mode 100644 index 0000000..7520f85 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/schematron-catalog.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/testng.xml b/src/main/resources/org/opengis/cite/ogcapiprocesses10/testng.xml new file mode 100644 index 0000000..21c3e08 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/testng.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gco-2007.xsd b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gco-2007.xsd new file mode 100644 index 0000000..7037f53 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gco-2007.xsd @@ -0,0 +1,428 @@ + + + + Geographic information -- Metadata -- XML schema implementation (ISO/TS + 19139:2007) + All include statements have been resolved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A TypeName is a LocalName that references either a recordType or object type + in some form of schema. The stored value "aName" is the returned value for the "aName()" + operation. This is the types name. - For parsing from types (or objects) the parsible name + normally uses a "." navigation separator, so that it is of the form + [class].[member].[memberOfMember]. ...) + + + + + + + + + + + + + + + + + + + + + + + A MemberName is a LocalName that references either an attribute slot in a + record or recordType or an attribute, operation, or association role in an object instance + or type description in some form of schema. The stored value "aName" is the returned value + for the "aName()" operation. + + + + + + + + + + + + + + + + + + + + + + + + Use to represent the possible cardinality of a relation. Represented by a + set of simple multiplicity ranges. + + + + + + + + + + + + + + + + + + + + + + + A component of a multiplicity, consisting of an non-negative lower bound, + and a potentially infinite upper bound. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gmd-2007.xsd b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gmd-2007.xsd new file mode 100644 index 0000000..058ee25 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gmd-2007.xsd @@ -0,0 +1,2857 @@ + + + + Geographic information -- Metadata -- XML schema implementation (ISO/TS + 19139:2007) + All include statements have been resolved. + + + + + + + + Types and numbers of raster spatial objects in the + dataset + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the vector spatial objects in the + dataset + + + + + + + + + + + + + + + + + + + + + + + + Digital mechanism used to represent spatial information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + New metadata element, not found in ISO 19115, which is required to describe + geographic data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information describing metadata extensions. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information identifing the feature catalogue + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the domain of the raster cell + + + + + + + + + + + + + + + + + + + + + + + + + Information about an image's suitability for use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Set of adjacent wavelengths in the electro-magnetic spectrum with a common + characteristic, such as the visible band + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the application schema used to build the + dataset + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information identifing the portrayal catalogue used + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + quantitative_result from Quality Procedures - - renamed to remove implied + use limitiation. + + + + + + + + + + + + + + + + + + + + + + + + + Quantitative_conformance_measure from Quality Procedures. - - Renamed to + remove implied use limitation - - OCL - -- result is type specified by valueDomain - + result.tupleType = valueDomain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Restrictions on the access and use of a dataset or + metadata + + + + + + + + + + + + + + + + + + + + + + + Restrictions and legal prerequisites for accessing and using the + dataset. + + + + + + + + + + + + + + + + + + + + + + + + + Handling restrictions imposed on the dataset because of national security, + privacy, or other concerns + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the media on which the data can be + distributed + + + + + + + + + + + + + + + + + + + + + + + + + + + + Technical means and media by which a dataset is obtained from the + distributor + + + + + + + + + + + + + + + + + + + + + + + + + + Common ways in which the dataset may be obtained or received, and related + instructions and fee information + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the distributor + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the distributor of and options for obtaining the + dataset + + + + + + + + + + + + + + + + + + + + + + + + + Description of the form of the data to be distributed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Time period covered by the content of the dataset + + + + + + + + + + + + + + + + + + + + + + + Vertical domain of dataset + + + + + + + + + + + + + + + + + + + + + + + + + Boundary enclosing the dataset expressed as the closed set of (x,y) + coordinates of the polygon (last point replicates first point) + + + + + + + + + + + + + + + + + + + + + + + Information about spatial, vertical, and temporal extent + + + + + + + + + + + + + + + + + + + + + + + + + + Geographic area of the dataset + + + + + + + + + + + + + + + + + + + + + + + Geographic area of the entire dataset referenced to WGS + 84 + + + + + + + + + + + + + + + + + + + + + + + + + + Extent with respect to date and time + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Description of the spatial and temporal reference systems used in the + dataset + + + + + + + + + + + + + + + + + + + + + + + Identification of, and means of communication with, person(s) and + organisations associated with the dataset + + + + + + + + + + + + + + + + + + + + + + + + + + + Standardized resource reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Location of the responsible individual or organisation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about online sources from which the dataset, specification, or + community profile name and extended metadata elements can be obtained. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information required enabling contact with the responsible person and/or + organisation + + + + + + + + + + + + + + + + + + + + + + + + + + + Telephone numbers for contacting the responsible individual or + organisation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the scope and frequency of updating + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Description of the class of information covered by the + information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basic information about data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Graphic that provides an illustration of the dataset (should include a + legend for the graphic) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + See 19119 for further info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Brief description of ways in which the dataset is currently + used. + + + + + + + + + + + + + + + + + + + + + + + + + + Keywords, their type and reference source + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Encapsulates the dataset aggregation information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + High-level geospatial data thematic classification to assist in the grouping + and search of available geospatial datasets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Identifiable collection of datasets + + + + + + + + + + + + + + + + + + + + + + + + + + Identifiable collection of data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gsr-2007.xsd b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gsr-2007.xsd new file mode 100644 index 0000000..6bad300 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gsr-2007.xsd @@ -0,0 +1,25 @@ + + + + + Geographic information -- Metadata -- XML schema implementation (ISO/TS + 19139:2007) + All include statements have been resolved. + + + + + + + + + + + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gss-2007.xsd b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gss-2007.xsd new file mode 100644 index 0000000..6b8763a --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gss-2007.xsd @@ -0,0 +1,33 @@ + + + + + Geographic information -- Metadata -- XML schema implementation (ISO/TS + 19139:2007) + All include statements have been resolved. + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gts-2007.xsd b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gts-2007.xsd new file mode 100644 index 0000000..dc8600d --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/iso/19139/2007/gts-2007.xsd @@ -0,0 +1,32 @@ + + + + + Geographic information -- Metadata -- XML schema implementation (ISO/TS + 19139:2007) + All include statements have been resolved. + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/opengis/gml/3.2.1/gml-3.2.1.xsd b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/opengis/gml/3.2.1/gml-3.2.1.xsd new file mode 100644 index 0000000..a0bd81e --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/opengis/gml/3.2.1/gml-3.2.1.xsd @@ -0,0 +1,7806 @@ + + + + gml.xsd + Geographic information -- Geography Markup Language (ISO/TS + 19136:2007) + Also published + as OGC 07-036 (GML 3.2.1) + All include statements have been resolved. + + + + + + + + Evidence is represented by a simple gml:dataSource or gml:dataSourceReference + property that indicates the source of the temporal data. The remote link attributes of the + gml:dataSource element have been deprecated along with its current type. + + + + + Evidence is represented by a simple gml:dataSource or gml:dataSourceReference + property that indicates the source of the temporal data. + + + + + A convenience group. This allows an application schema developer to include + dynamic properties in a content model in a standard fashion. + + + + + + + + + + + States are captured by time-stamped instances of a feature. The content model + extends the standard gml:AbstractFeatureType with the gml:dynamicProperties model group. + Each time-stamped instance represents a 'snapshot' of a feature. The dynamic feature classes + will normally be extended to suit particular applications. A dynamic feature bears either a + time stamp or a history. + + + + + + + + + + + + A gml:DynamicFeatureCollection is a feature collection that has a gml:validTime + property (i.e. is a snapshot of the feature collection) or which has a gml:history property + that contains one or more gml:AbstractTimeSlices each of which contain values of the time + varying properties of the feature collection. Note that the gml:DynamicFeatureCollection may + be one of the following: 1. A feature collection which consists of static feature members + (members do not change in time) but which has properties of the collection object as a whole + that do change in time . 2. A feature collection which consists of dynamic feature members + (the members are gml:DynamicFeatures) but which also has properties of the collection as a + whole that vary in time. + + + + + + + + + + + + + + + + + + + + + + + + + To describe an event — an action that occurs at an instant or over an interval + of time — GML provides the gml:AbtractTimeSlice element. A timeslice encapsulates the + time-varying properties of a dynamic feature -- it shall be extended to represent a time + stamped projection of a specific feature. The gml:dataSource property describes how the + temporal data was acquired. A gml:AbstractTimeSlice instance is a GML object that + encapsulates updates of the dynamic—or volatile—properties that reflect some change event; + it thus includes only those feature properties that have actually changed due to some + process. gml:AbstractTimeSlice basically provides a facility for attribute-level time + stamping, in contrast to the object-level time stamping of dynamic feature instances. The + time slice can thus be viewed as event or process-oriented, whereas a snapshot is more state + or structure-oriented. A timeslice has richer causality, whereas a snapshot merely portrays + the status of the whole. + + + + + + + + + + + + + + + A generic sequence of events constitute a gml:history of an object. The + gml:history element contains a set of elements in the substitution group headed by the + abstract element gml:AbstractTimeSlice, representing the time-varying properties of + interest. The history property of a dynamic feature associates a feature instance with a + sequence of time slices (i.e. change events) that encapsulate the evolution of the + feature. + + + + + + + + + + + + + + + + + + + + + + A property that has a geometric complex as its value domain may either be an + appropriate geometry element encapsulated in an element of this type or an XLink reference + to a remote geometry element (where remote includes geometry elements located elsewhere in + the same document). Either the reference or the contained element shall be given, but + neither both nor none. + + + + + + + + + + + + + + + + + + + + + + + + + A gml:CompositeCurve is represented by a sequence of (orientable) curves such + that each curve in the sequence terminates at the start point of the subsequent curve in the + list. curveMember references or contains inline one curve in the composite curve. The curves + are contiguous, the collection of curves is ordered. Therefore, if provided, the + aggregationType attribute shall have the value "sequence". + + + + + + + + + + + + + + + A gml:CompositeSurface is represented by a set of orientable surfaces. It is + geometry type with all the geometric properties of a (primitive) surface. Essentially, a + composite surface is a collection of surfaces that join in pairs on common boundary curves + and which, when considered as a whole, form a single surface. surfaceMember references or + contains inline one surface in the composite surface. The surfaces are + contiguous. + + + + + + + + + + + + + + + gml:CompositeSolid implements ISO 19107 GM_CompositeSolid (see ISO 19107:2003, + 6.6.7) as specified in D.2.3.6. A gml:CompositeSolid is represented by a set of orientable + surfaces. It is a geometry type with all the geometric properties of a (primitive) solid. + Essentially, a composite solid is a collection of solids that join in pairs on common + boundary surfaces and which, when considered as a whole, form a single solid. solidMember + references or contains one solid in the composite solid. The solids are + contiguous. + + + + + This abstract type supplies the root or base type for all topological elements + including primitives and complexes. It inherits AbstractGMLType and hence can be identified + using the gml:id attribute. + + + + + + + + + + + + + + gml:AbstractTopoPrimitive acts as the base type for all topological primitives. + Topology primitives are the atomic (smallest possible) units of a topology complex. Each + topology primitive may contain references to other topology primitives of codimension 2 or + more (gml:isolated). Conversely, nodes may have faces as containers and nodes and edges may + have solids as containers (gml:container). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + In the case of planar topology, a gml:Node must have a clockwise + sequence of gml:directedEdge properties, to ensure a lossless topology + representation as defined by Kuijpers, et. al. (see OGC 05-102 Topology + IPR). + + + + + + + + + + + gml:Node represents the 0-dimensional primitive. The optional coboundary of a + node (gml:directedEdge) is a sequence of directed edges which are incident on this node. + Edges emanating from this node appear in the node coboundary with a negative orientation. If + provided, the aggregationType attribute shall have the value "sequence". A node may + optionally be realised by a 0-dimensional geometric primitive + (gml:pointProperty). + + + + + A gml:directedNode property element describes the boundary of topology edges + and is used in the support of topological point features via the gml:TopoPoint expression, + see below. The orientation attribute of type gml:SignType expresses the sense in which the + included node is used: start ("-") or end ("+") node. + + + + + + + + + + + + + + + + + + + + + + + + + + gml:Edge represents the 1-dimensional primitive. The topological boundary of an + Edge (gml:directedNode) consists of a negatively directed start Node and a positively + directed end Node. The optional coboundary of an edge (gml:directedFace) is a circular + sequence of directed faces which are incident on this edge in document order. In the 2D + case, the orientation of the face on the left of the edge is "+"; the orientation of the + face on the right on its right is "-". If provided, the aggregationType attribute shall have + the value "sequence". An edge may optionally be realised by a 1-dimensional geometric + primitive (gml:curveProperty). + + + + + A gml:directedEdge property element describes the boundary of topology faces, + the coBoundary of topology nodes and is used in the support of topological line features via + the gml:TopoCurve expression, see below. The orientation attribute of type gml:SignType + expresses the sense in which the included edge is used, i.e. forward or + reverse. + + + + + + + + + + + + + + + + + + + + + + + If the topological representation exists an unbounded manifold (e.g. + Euclidean plane), a gml:Face must indicate whether it is a universal face or not, to + ensure a lossless topology representation as defined by Kuijpers, et. al. (see OGC + 05-102 Topology IPR). The optional universal attribute of type boolean is used to + indicate this. NOTE The universal face is normally not part of any feature, and is + used to represent the unbounded portion of the data set. Its interior boundary (it has + no exterior boundary) would normally be considered the exterior boundary of the map + represented by the data set. + + + + + + + + gml:Face represents the 2-dimensional topology primitive. The topological + boundary of a face (gml:directedEdge) consists of a sequence of directed edges. If provided, + the aggregationType attribute shall have the value "sequence". The optional coboundary of a + face (gml:directedTopoSolid) is a pair of directed solids which are bounded by this face. A + positively directed solid corresponds to a solid which lies in the direction of the + negatively directed normal to the face in any geometric realisation. A face may optionally + be realised by a 2-dimensional geometric primitive (gml:surfaceProperty). + + + + + The gml:directedFace property element describes the boundary of topology + solids, in the coBoundary of topology edges and is used in the support of surface features + via the gml:TopoSurface expression, see below. The orientation attribute of type + gml:SignType expresses the sense in which the included face is used i.e. inward or outward + with respect to the surface normal in any geometric realisation. + + + + + + + + + + + + + + + + + + + + + + A gml:TopoSolid must indicate whether it is a universal topo-solid or + not, to ensure a lossless topology representation as defined by Kuijpers, et. al. (see + OGC 05-102 Topology IPR). The optional universal attribute of type boolean is used to + indicate this and the default is fault. NOTE The universal topo-solid is normally not + part of any feature, and is used to represent the unbounded portion of the data set. + Its interior boundary (it has no exterior boundary) would normally be considered the + exterior boundary of the data set. + + + + + + + + gml:TopoSolid represents the 3-dimensional topology primitive. The topological + boundary of a solid (gml:directedFace) consists of a set of directed faces. A solid may + optionally be realised by a 3-dimensional geometric primitive + (gml:solidProperty). + + + + + The gml:directedSolid property element describes the coBoundary of topology + faces and is used in the support of volume features via the gml:TopoVolume expression, see + below. The orientation attribute of type gml:SignType expresses the sense in which the + included solid appears in the face coboundary. In the context of a gml:TopoVolume the + orientation attribute has no meaning. + + + + + + + + + + + + + + + + + + + + + + The intended use of gml:TopoPoint is to appear within a point feature to + express the structural and possibly geometric relationships of this feature to other + features via shared node definitions. + + + + + + + + + + + The gml:topoPointProperty property element may be used in features to express + their relationship to the referenced topology node. + + + + + + + + + + + + + + + gml:TopoCurve represents a homogeneous topological expression, a sequence of + directed edges, which if realised are isomorphic to a geometric curve primitive. The + intended use of gml:TopoCurve is to appear within a line feature to express the structural + and geometric relationships of this feature to other features via the shared edge + definitions. If provided, the aggregationType attribute shall have the value + "sequence". + + + + + + + + + + + The gml:topoCurveProperty property element may be used in features to express + their relationship to the referenced topology edges. + + + + + + + + + + + + + + + gml:TopoSurface represents a homogeneous topological expression, a set of + directed faces, which if realised are isomorphic to a geometric surface primitive. The + intended use of gml:TopoSurface is to appear within a surface feature to express the + structural and possibly geometric relationships of this surface feature to other features + via the shared face definitions. + + + + + + + + + + + The gml:topoSurfaceProperty property element may be used in features to express + their relationship to the referenced topology faces. + + + + + + + + + + + + + + + gml:TopoVolume represents a homogeneous topological expression, a set of + directed topologic solids, which if realised are isomorphic to a geometric solid primitive. + The intended use of gml:TopoVolume is to appear within a solid feature to express the + structural and geometric relationships of this solid feature to other features via the + shared solid definitions. + + + + + + + + + + + The gml:topoVolumeProperty element may be used in features to express their + relationship to the referenced topology volume. + + + + + + + + + + + + + + + + + + + + gml:TopoComplex is a collection of topological primitives. Each complex holds a + reference to its maximal complex (gml:maximalComplex) and optionally to sub- or + super-complexes (gml:subComplex, gml:superComplex). A topology complex contains its + primitive and sub-complex members. + + + + + The property elements gml:subComplex, gml:superComplex and gml:maximalComplex + provide an encoding for relationships between topology complexes as described for + gml:TopoComplex above. + + + + + The property elements gml:subComplex, gml:superComplex and gml:maximalComplex + provide an encoding for relationships between topology complexes as described for + gml:TopoComplex above. + + + + + The property elements gml:subComplex, gml:superComplex and gml:maximalComplex + provide an encoding for relationships between topology complexes as described for + gml:TopoComplex above. + + + + + The gml:topoPrimitiveMember property element encodes for the relationship + between a topology complex and a single topology primitive. + + + + + + + + + + + + The gml:topoPrimitiveMembers property element encodes the relationship between + a topology complex and an arbitrary number of topology primitives. + + + + + + + + + + + + + + + + + The gml:Grid implicitly defines an unrectified grid, which is a network + composed of two or more sets of curves in which the members of each set intersect the + members of the other sets in an algorithmic way. The region of interest within the grid is + given in terms of its gml:limits, being the grid coordinates of diagonally opposed corners + of a rectangular region. gml:axisLabels is provided with a list of labels of the axes of the + grid (gml:axisName has been deprecated). gml:dimension specifies the dimension of the grid. + The gml:limits element contains a single gml:GridEnvelope. The gml:low and gml:high property + elements of the envelope are each integerLists, which are coordinate tuples, the coordinates + being measured as offsets from the origin of the grid along each axis, of the diagonally + opposing corners of a "rectangular" region of interest. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A rectified grid is a grid for which there is an affine transformation between + the grid coordinates and the coordinates of an external coordinate reference system. It is + defined by specifying the position (in some geometric space) of the grid "origin" and of the + vectors that specify the post locations. Note that the grid limits (post indexes) and axis + name properties are inherited from gml:GridType and that gml:RectifiedGrid adds a gml:origin + property (contains or references a gml:Point) and a set of gml:offsetVector + properties. + + + + + + + + + + + + + + + The base type for coverages is gml:AbstractCoverageType. The basic elements of + a coverage can be seen in this content model: the coverage contains gml:domainSet and + gml:rangeSet properties. The gml:domainSet property describes the domain of the coverage and + the gml:rangeSet property describes the range of the coverage. + + + + + + + + + + + + + This element serves as the head of a substitution group which may contain any + coverage whose type is derived from gml:AbstractCoverageType. It may act as a variable in + the definition of content models where it is required to permit any coverage to be + valid. + + + + + + + + + + + + + + A discrete coverage consists of a domain set, range set and optionally a + coverage function. The domain set consists of either spatial or temporal geometry objects, + finite in number. The range set is comprised of a finite number of attribute values each of + which is associated to every direct position within any single spatiotemporal object in the + domain. In other words, the range values are constant on each spatiotemporal object in the + domain. This coverage function maps each element from the coverage domain to an element in + its range. The coverageFunction element describes the mapping function. This element serves + as the head of a substitution group which may contain any discrete coverage whose type is + derived from gml:DiscreteCoverageType. + + + + + + + + + + + + + + A continuous coverage as defined in ISO 19123 is a coverage that can return + different values for the same feature attribute at different direct positions within a + single spatiotemporal object in its spatiotemporal domain. The base type for continuous + coverages is AbstractContinuousCoverageType. The coverageFunction element describes the + mapping function. The abstract element gml:AbstractContinuousCoverage serves as the head of + a substitution group which may contain any continuous coverage whose type is derived from + gml:AbstractContinuousCoverageType. + + + + + The gml:domainSet property element describes the spatio-temporal region of + interest, within which the coverage is defined. Its content model is given by + gml:DomainSetType. The value of the domain is thus a choice between a gml:AbstractGeometry + and a gml:AbstractTimeObject. In the instance these abstract elements will normally be + substituted by a geometry complex or temporal complex, to represent spatial coverages and + time-series, respectively. The presence of the gml:AssociationAttributeGroup means that + domainSet follows the usual GML property model and may use the xlink:href attribute to point + to the domain, as an alternative to describing the domain inline. Ownership semantics may be + provided using the gml:OwnershipAttributeGroup. + + + + + + + + + + + + + + + The gml:rangeSet property element contains the values of the coverage + (sometimes called the attribute values). Its content model is given by gml:RangeSetType. + This content model supports a structural description of the range. The semantic information + describing the range set is embedded using a uniform method, as part of the explicit values, + or as a template value accompanying the representation using gml:DataBlock and gml:File. The + values from each component (or "band") in the range may be encoded within a gml:ValueArray + element or a concrete member of the gml:AbstractScalarValueList substitution group . Use of + these elements satisfies the value-type homogeneity requirement. + + + + + + + + + + + + + gml:DataBlock describes the Range as a block of text encoded values similar to + a Common Separated Value (CSV) representation. The range set parameterization is described + by the property gml:rangeParameters. + + + + + + + + + + + + + + + gml:CoordinatesType consists of a list of coordinate tuples, with each + coordinate tuple separated by the ts or tuple separator (whitespace), and each coordinate in + the tuple by the cs or coordinate separator (comma). The gml:tupleList encoding is + effectively "band-interleaved". + + + + + gml:doubleOrNilReasonList consists of a list of gml:doubleOrNilReason values, + each separated by a whitespace. The gml:doubleOrNilReason values are grouped into tuples + where the dimension of each tuple in the list is equal to the number of range + parameters. + + + + + for efficiency reasons, GML also provides a means of encoding the range set in + an arbitrary external encoding, such as a binary file. This encoding may be "well-known" but + this is not required. This mode uses the gml:File element. The values of the coverage + (attribute values in the range set) are transmitted in a external file that is referenced + from the XML structure described by gml:FileType. The external file is referenced by the + gml:fileReference property that is an anyURI (the gml:fileName property has been + deprecated). This means that the external file may be located remotely from the referencing + GML instance. The gml:compression property points to a definition of a compression algorithm + through an anyURI. This may be a retrievable, computable definition or simply a reference to + an unambiguous name for the compression method. The gml:mimeType property points to a + definition of the file mime type. The gml:fileStructure property is defined by a codelist. + Note further that all values shall be enclosed in a single file. Multi-file structures for + values are not supported in GML. The semantics of the range set is described as above using + the gml:rangeParameters property. Note that if any compression algorithm is applied, the + structure above applies only to the pre-compression or post-decompression structure of the + file. Note that the fields within a record match the gml:valueComponents of the + gml:CompositeValue in document order. + + + + + + + + + deprecated + + + + + + + + + + + + The gml:coverageFunction property describes the mapping function from the + domain to the range of the coverage. The value of the CoverageFunction is one of + gml:CoverageMappingRule and gml:GridFunction. If the gml:coverageFunction property is + omitted for a gridded coverage (including rectified gridded coverages) the gml:startPoint is + assumed to be the value of the gml:low property in the gml:Grid geometry, and the + gml:sequenceRule is assumed to be linear and the gml:axisOrder property is assumed to be "+1 + +2". + + + + + + + + + + + + gml:CoverageMappingRule provides a formal or informal description of the + coverage function. The mapping rule may be defined as an in-line string (gml:ruleDefinition) + or via a remote reference through xlink:href (gml:ruleReference). If no rule name is + specified, the default is 'Linear' with respect to members of the domain in document + order. + + + + + + + + + + + gml:GridFunction provides an explicit mapping rule for grid geometries, i.e. + the domain shall be a geometry of type grid. It describes the mapping of grid posts + (discrete point grid coverage) or grid cells (discrete surface coverage) to the values in + the range set. The gml:startPoint is the index position of a point in the grid that is + mapped to the first point in the range set (this is also the index position of the first + grid post). If the gml:startPoint property is omitted the gml:startPoint is assumed to be + equal to the value of gml:low in the gml:Grid geometry. Subsequent points in the mapping are + determined by the value of the gml:sequenceRule. + + + + + + + + + + + The gml:SequenceRuleType is derived from the gml:SequenceRuleEnumeration + through the addition of an axisOrder attribute. The gml:SequenceRuleEnumeration is an + enumerated type. The rule names are defined in ISO 19123. If no rule name is specified the + default is "Linear". + + + + + + deprecated + + + + + + + + + + + + + + + + + + + The different values in a gml:AxisDirectionList indicate the incrementation + order to be used on all axes of the grid. Each axis shall be mentioned once and only + once. + + + + + + The value of a gml:AxisDirection indicates the incrementation order to be used + on an axis of the grid. + + + + + + + + In a gml:MultiPointCoverage the domain set is a gml:MultiPoint, that is a + collection of arbitrarily distributed geometric points. The content model is identical with + gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiPoint. In a + gml:MultiPointCoverage the mapping from the domain to the range is straightforward. - For + gml:DataBlock encodings the points of the gml:MultiPoint are mapped in document order to the + tuples of the data block. - For gml:CompositeValue encodings the points of the + gml:MultiPoint are mapped to the members of the composite value in document order. - For + gml:File encodings the points of the gml:MultiPoint are mapped to the records of the file in + sequential order. + + + + + In a gml:MultiCurveCoverage the domain is partioned into a collection of curves + comprising a gml:MultiCurve. The coverage function then maps each curve in the collection to + a value in the range set. The content model is identical with gml:DiscreteCoverageType, but + that gml:domainSet shall have values gml:MultiCurve. In a gml:MultiCurveCoverage the mapping + from the domain to the range is straightforward. - For gml:DataBlock encodings the curves of + the gml:MultiCurve are mapped in document order to the tuples of the data block. - For + gml:CompositeValue encodings the curves of the gml:MultiCurve are mapped to the members of + the composite value in document order. - For gml:File encodings the curves of the + gml:MultiCurve are mapped to the records of the file in sequential order. + + + + + In a gml:MultiSurfaceCoverage the domain is partioned into a collection of + surfaces comprising a gml:MultiSurface. The coverage function than maps each surface in the + collection to a value in the range set. The content model is identical with + gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiSurface. In a + gml:MultiSurfaceCoverage the mapping from the domain to the range is straightforward. - For + gml:DataBlock encodings the surfaces of the gml:MultiSurface are mapped in document order to + the tuples of the data block. - For gml:CompositeValue encodings the surfaces of the + gml:MultiSurface are mapped to the members of the composite value in document order. - For + gml:File encodings the surfaces of the gml:MultiSurface are mapped to the records of the + file in sequential order. + + + + + In a gml:MultiSolidCoverage the domain is partioned into a collection of solids + comprising a gml:MultiSolid. The coverage function than maps each solid in the collection to + a value in the range set. The content model is identical with gml:DiscreteCoverageType, but + that gml:domainSet shall have values gml:MultiSolid. In a gml:MultiSolidCoverage the mapping + from the domain to the range is straightforward. - For gml:DataBlock encodings the solids of + the gml:MultiSolid are mapped in document order to the tuples of the data block. - For + gml:CompositeValue encodings the solids of the gml:MultiSolid are mapped to the members of + the composite value in document order. - For gml:File encodings the solids of the + gml:MultiSolid are mapped to the records of the file in sequential order. + + + + + A gml:GriddedCoverage is a discrete point coverage in which the domain set is a + geometric grid of points. Note that this is the same as the gml:MultiPointCoverage except + that we have a gml:Grid to describe the domain. The simple gridded coverage is not + geometrically referenced and hence no geometric positions are assignable to the points in + the grid. Such geometric positioning is introduced in the + gml:RectifiedGridCoverage. + + + + + The gml:RectifiedGridCoverage is a discrete point coverage based on a rectified + grid. It is similar to the grid coverage except that the points of the grid are + geometrically referenced. The rectified grid coverage has a domain that is a + gml:RectifiedGrid geometry. + + + + + gml:CoordinateSystemAxis is a definition of a coordinate system + axis. + + + + + + + + + + + + + + + The uom attribute provides an identifier of the unit of measure used for + this coordinate system axis. The value of this coordinate in a coordinate tuple shall + be recorded using this unit of measure, whenever those coordinates use a coordinate + reference system that uses a coordinate system that uses this axis. + + + + + + + + gml:axisAbbrev is the abbreviation used for this coordinate system axis; this + abbreviation is also used to identify the coordinates in the coordinate tuple. The codeSpace + attribute may reference a source of more information on a set of standardized abbreviations, + or on this abbreviation. + + + + + gml:axisDirection is the direction of this coordinate system axis (or in the + case of Cartesian projected coordinates, the direction of this coordinate system axis at the + origin). Within any set of coordinate system axes, only one of each pair of terms may be + used. For earth-fixed CRSs, this direction is often approximate and intended to provide a + human interpretable meaning to the axis. When a geodetic datum is used, the precise + directions of the axes may therefore vary slightly from this approximate direction. The + codeSpace attribute shall reference a source of information specifying the values and + meanings of all the allowed string values for this property. + + + + + The gml:minimumValue and gml:maximumValue properties allow the specification of + minimum and maximum value normally allowed for this axis, in the unit of measure for the + axis. For a continuous angular axis such as longitude, the values wrap-around at this value. + Also, values beyond this minimum/maximum can be used for specified purposes, such as in a + bounding box. A value of minus infinity shall be allowed for the gml:minimumValue element, a + value of plus infiniy for the gml:maximumValue element. If these elements are omitted, the + value is unspecified. + + + + + The gml:minimumValue and gml:maximumValue properties allow the specification of + minimum and maximum value normally allowed for this axis, in the unit of measure for the + axis. For a continuous angular axis such as longitude, the values wrap-around at this value. + Also, values beyond this minimum/maximum can be used for specified purposes, such as in a + bounding box. A value of minus infinity shall be allowed for the gml:minimumValue element, a + value of plus infiniy for the gml:maximumValue element. If these elements are omitted, the + value is unspecified. + + + + + gml:rangeMeaning describes the meaning of axis value range specified by + gml:minimumValue and gml:maximumValue. This element shall be omitted when both + gml:minimumValue and gml:maximumValue are omitted. This element should be included when + gml:minimumValue and/or gml:maximumValue are included. If this element is omitted when the + gml:minimumValue and/or gml:maximumValue are included, the meaning is unspecified. The + codeSpace attribute shall reference a source of information specifying the values and + meanings of all the allowed string values for this property. + + + + + gml:CoordinateSystemAxisPropertyType is a property type for association roles + to a coordinate system axis, either referencing or containing the definition of that + axis. + + + + + + + + + gml:AbstractCoordinateSystem is a coordinate system (CS) is the non-repeating + sequence of coordinate system axes that spans a given coordinate space. A CS is derived from + a set of mathematical rules for specifying how coordinates in a given space are to be + assigned to points. The coordinate values in a coordinate tuple shall be recorded in the + order in which the coordinate system axes associations are recorded. This abstract complex + type shall not be used, extended, or restricted, in an Application Schema, to define a + concrete subtype with a meaning equivalent to a concrete subtype specified in this + document. + + + + + + + + + + + + + + + The gml:axis property is an association role (ordered sequence) to the + coordinate system axes included in this coordinate system. The coordinate values in a + coordinate tuple shall be recorded in the order in which the coordinate system axes + associations are recorded, whenever those coordinates use a coordinate reference system that + uses this coordinate system. The gml:AggregationAttributeGroup should be used to specify + that the axis objects are ordered. + + + + + gml:CoordinateSystemPropertyType is a property type for association roles to a + coordinate system, either referencing or containing the definition of that coordinate + system. + + + + + + + + + gml:EllipsoidalCS is a two- or three-dimensional coordinate system in which + position is specified by geodetic latitude, geodetic longitude, and (in the + three-dimensional case) ellipsoidal height. An EllipsoidalCS shall have two or three + gml:axis property elements; the number of associations shall equal the dimension of the + CS. + + + + + + + + + + gml:EllipsoidalCSPropertyType is a property type for association roles to an + ellipsoidal coordinate system, either referencing or containing the definition of that + coordinate system. + + + + + + + + + gml:CartesianCS is a 1-, 2-, or 3-dimensional coordinate system. In the + 1-dimensional case, it contains a single straight coordinate axis. In the 2- and + 3-dimensional cases gives the position of points relative to orthogonal straight axes. In + the multi-dimensional case, all axes shall have the same length unit of measure. A + CartesianCS shall have one, two, or three gml:axis property elements. + + + + + + + + + + gml:CartesianCSPropertyType is a property type for association roles to a + Cartesian coordinate system, either referencing or containing the definition of that + coordinate system. + + + + + + + + + gml:VerticalCS is a one-dimensional coordinate system used to record the + heights or depths of points. Such a coordinate system is usually dependent on the Earth's + gravity field, perhaps loosely as when atmospheric pressure is the basis for the vertical + coordinate system axis. A VerticalCS shall have one gml:axis property + element. + + + + + + + + + + gml:VerticalCSPropertyType is a property type for association roles to a + vertical coordinate system, either referencing or containing the definition of that + coordinate system. + + + + + + + + + gml:TimeCS is a one-dimensional coordinate system containing a time axis, used + to describe the temporal position of a point in the specified time units from a specified + time origin. A TimeCS shall have one gml:axis property element. + + + + + + + + + + gml:TimeCSPropertyType is a property type for association roles to a time + coordinate system, either referencing or containing the definition of that coordinate + system. + + + + + + + + + gml:LinearCS is a one-dimensional coordinate system that consists of the points + that lie on the single axis described. The associated coordinate is the distance – with or + without offset – from the specified datum to the point along the axis. A LinearCS shall have + one gml:axis property element. + + + + + + + + + + gml:LinearCSPropertyType is a property type for association roles to a linear + coordinate system, either referencing or containing the definition of that coordinate + system. + + + + + + + + + gml:UserDefinedCS is a two- or three-dimensional coordinate system that + consists of any combination of coordinate axes not covered by any other coordinate system + type. A UserDefinedCS shall have two or three gml:axis property elements; the number of + property elements shall equal the dimension of the CS. + + + + + + + + + + gml:UserDefinedCSPropertyType is a property type for association roles to a + user-defined coordinate system, either referencing or containing the definition of that + coordinate system. + + + + + + + + + gml:SphericalCS is a three-dimensional coordinate system with one distance + measured from the origin and two angular coordinates. A SphericalCS shall have three + gml:axis property elements. + + + + + + + + + + gml:SphericalCSPropertyType is property type for association roles to a + spherical coordinate system, either referencing or containing the definition of that + coordinate system. + + + + + + + + + gml:PolarCS ia s two-dimensional coordinate system in which position is + specified by the distance from the origin and the angle between the line from the origin to + a point and a reference direction. A PolarCS shall have two gml:axis property + elements. + + + + + + + + + + gml:PolarCSPropertyType is a property type for association roles to a polar + coordinate system, either referencing or containing the definition of that coordinate + system. + + + + + + + + + gml:CylindricalCS is a three-dimensional coordinate system consisting of a + polar coordinate system extended by a straight coordinate axis perpendicular to the plane + spanned by the polar coordinate system. A CylindricalCS shall have three gml:axis property + elements. + + + + + + + + + + gml:CylindricalCSPropertyType is a property type for association roles to a + cylindrical coordinate system, either referencing or containing the definition of that + coordinate system. + + + + + + + + + gml:AffineCS is a two- or three-dimensional coordinate system with straight + axes that are not necessarily orthogonal. An AffineCS shall have two or three gml:axis + property elements; the number of property elements shall equal the dimension of the + CS. + + + + + + + + + + gml:AffineCSPropertyType is a property type for association roles to an affine + coordinate system, either referencing or containing the definition of that coordinate + system. + + + + + + + + + A gml:AbstractDatum specifies the relationship of a coordinate system to the + earth, thus creating a coordinate reference system. A datum uses a parameter or set of + parameters that determine the location of the origin of the coordinate reference system. + Each datum subtype may be associated with only specific types of coordinate systems. This + abstract complex type shall not be used, extended, or restricted, in a GML Application + Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype + specified in this document. + + + + + + + + + + + + + + + + + gml:anchorDefinition is a description, possibly including coordinates, of the + definition used to anchor the datum to the Earth. Also known as the "origin", especially for + engineering and image datums. The codeSpace attribute may be used to reference a source of + more detailed on this point or surface, or on a set of such descriptions. - For a geodetic + datum, this point is also known as the fundamental point, which is traditionally the point + where the relationship between geoid and ellipsoid is defined. In some cases, the + "fundamental point" may consist of a number of points. In those cases, the parameters + defining the geoid/ellipsoid relationship have been averaged for these points, and the + averages adopted as the datum definition. - For an engineering datum, the anchor definition + may be a physical point, or it may be a point with defined coordinates in another CRS.may - + For an image datum, the anchor definition is usually either the centre of the image or the + corner of the image. - For a temporal datum, this attribute is not defined. Instead of the + anchor definition, a temporal datum carries a separate time origin of type + DateTime. + + + + + gml:realizationEpoch is the time after which this datum definition is valid. + See ISO 19111 Table 32 for details. + + + + + gml:DatumPropertyType is a property type for association roles to a datum, + either referencing or containing the definition of that datum. + + + + + + + + + gml:GeodeticDatum is a geodetic datum defines the precise location and + orientation in 3-dimensional space of a defined ellipsoid (or sphere), or of a Cartesian + coordinate system centered in this ellipsoid (or sphere). + + + + + + + + + + + + + + + gml:primeMeridian is an association role to the prime meridian used by this + geodetic datum. + + + + + gml:ellipsoid is an association role to the ellipsoid used by this geodetic + datum. + + + + + gml:GeodeticDatumPropertyType is a property type for association roles to a + geodetic datum, either referencing or containing the definition of that + datum. + + + + + + + + + A gml:Ellipsoid is a geometric figure that may be used to describe the + approximate shape of the earth. In mathematical terms, it is a surface formed by the + rotation of an ellipse about its minor axis. + + + + + + + + + + + + + + + gml:semiMajorAxis specifies the length of the semi-major axis of the ellipsoid, + with its units. Uses the MeasureType with the restriction that the unit of measure + referenced by uom must be suitable for a length, such as metres or feet. + + + + + gml:secondDefiningParameter is a property containing the definition of the + second parameter that defines the shape of an ellipsoid. An ellipsoid requires two defining + parameters: semi-major axis and inverse flattening or semi-major axis and semi-minor axis. + When the reference body is a sphere rather than an ellipsoid, only a single defining + parameter is required, namely the radius of the sphere; in that case, the semi-major axis + "degenerates" into the radius of the sphere. The inverseFlattening element contains the + inverse flattening value of the ellipsoid. This value is a scale factor (or ratio). It uses + gml:LengthType with the restriction that the unit of measure referenced by the uom attribute + must be suitable for a scale factor, such as percent, permil, or parts-per-million. The + semiMinorAxis element contains the length of the semi-minor axis of the ellipsoid. When the + isSphere element is included, the ellipsoid is degenerate and is actually a sphere. The + sphere is completely defined by the semi-major axis, which is the radius of the + sphere. + + + + + + + + + + + + + + + + + + + gml:EllipsoidPropertyType is a property type for association roles to an + ellipsoid, either referencing or containing the definition of that + ellipsoid. + + + + + + + + + A gml:PrimeMeridian defines the origin from which longitude values are + determined. The default value for the prime meridian gml:identifier value is + "Greenwich". + + + + + + + + + + + + + + gml:greenwichLongitude is the longitude of the prime meridian measured from the + Greenwich meridian, positive eastward. If the value of the prime meridian "name" is + "Greenwich" then the value of greenwichLongitude shall be 0 degrees. + + + + + gml:PrimeMeridianPropertyType is a property type for association roles to a + prime meridian, either referencing or containing the definition of that + meridian. + + + + + + + + + gml:EngineeringDatum defines the origin of an engineering coordinate reference + system, and is used in a region around that origin. This origin may be fixed with respect to + the earth (such as a defined point at a construction site), or be a defined point on a + moving vehicle (such as on a ship or satellite). + + + + + + + + + + gml:EngineeringDatumPropertyType is a property type for association roles to an + engineering datum, either referencing or containing the definition of that + datum. + + + + + + + + + gml:ImageDatum defines the origin of an image coordinate reference system, and + is used in a local context only. For an image datum, the anchor definition is usually either + the centre of the image or the corner of the image. For more information, see ISO 19111 + B.3.5. + + + + + + + + + + + + + + gml:pixelInCell is a specification of the way an image grid is associated with + the image data attributes. The required codeSpace attribute shall reference a source of + information specifying the values and meanings of all the allowed string values for this + property. + + + + + gml:ImageDatumPropertyType is a property type for association roles to an image + datum, either referencing or containing the definition of that datum. + + + + + + + + + gml:VerticalDatum is a textual description and/or a set of parameters + identifying a particular reference level surface used as a zero-height surface, including + its position with respect to the Earth for any of the height types recognized by this + International Standard. + + + + + + + + + + gml:VerticalDatumPropertyType is property type for association roles to a + vertical datum, either referencing or containing the definition of that + datum. + + + + + + + + + A gml:TemporalDatum defines the origin of a Temporal Reference System. This + type omits the "anchorDefinition" and "realizationEpoch" elements and adds the "origin" + element with the dateTime type. + + + + + + + + + + + + + + The TemporalDatumBaseType partially defines the origin of a temporal coordinate + reference system. This type restricts the AbstractDatumType to remove the "anchorDefinition" + and "realizationEpoch" elements. + + + + + + + + + + + + + + + + + + + + gml:origin is the date and time origin of this temporal datum. + + + + + gml:TemporalDatumPropertyType is a property type for association roles to a + temporal datum, either referencing or containing the definition of that + datum. + + + + + + + + + gml:IdentifiedObjectType provides identification properties of a CRS-related + object. In gml:DefinitionType, the gml:identifier element shall be the primary name by which + this object is identified, encoding the "name" attribute in the UML model. Zero or more of + the gml:name elements can be an unordered set of "identifiers", encoding the "identifier" + attribute in the UML model. Each of these gml:name elements can reference elsewhere the + object's defining information or be an identifier by which this object can be referenced. + Zero or more other gml:name elements can be an unordered set of "alias" alternative names by + which this CRS related object is identified, encoding the "alias" attributes in the UML + model. An object may have several aliases, typically used in different contexts. The context + for an alias is indicated by the value of its (optional) codeSpace attribute. Any needed + version information shall be included in the codeSpace attribute of a gml:identifier and + gml:name elements. In this use, the gml:remarks element in the gml:DefinitionType shall + contain comments on or information about this object, including data source + information. + + + + + + + + gml:AbstractCRS specifies a coordinate reference system which is usually single + but may be compound. This abstract complex type shall not be used, extended, or restricted, + in a GML Application Schema, to define a concrete subtype with a meaning equivalent to a + concrete subtype specified in this document. + + + + + + + + + + + + + + + The gml:domainOfValidity property implements an association role to an + EX_Extent object as encoded in ISO/TS 19139, either referencing or containing the definition + of that extent. + + + + + + + + + + + The gml:scope property provides a description of the usage, or limitations of + usage, for which this CRS-related object is valid. If unknown, enter "not + known". + + + + + gml:CRSPropertyType is a property type for association roles to a CRS abstract + coordinate reference system, either referencing or containing the definition of that + CRS. + + + + + + + + + gml:AbstractCoordinateOperation is a mathematical operation on coordinates that + transforms or converts coordinates to another coordinate reference system. Many but not all + coordinate operations (from CRS A to CRS B) also uniquely define the inverse operation (from + CRS B to CRS A). In some cases, the operation method algorithm for the inverse operation is + the same as for the forward algorithm, but the signs of some operation parameter values + shall be reversed. In other cases, different algorithms are required for the forward and + inverse operations, but the same operation parameter values are used. If (some) entirely + different parameter values are needed, a different coordinate operation shall be defined. + The optional coordinateOperationAccuracy property elements provide estimates of the impact + of this coordinate operation on point position accuracy. + + + + + + + + + + + + + + + + + + + gml:operationVersion is the version of the coordinate transformation (i.e., + instantiation due to the stochastic nature of the parameters). Mandatory when describing a + transformation, and should not be supplied for a conversion. + + + + + gml:coordinateOperationAccuracy is an association role to a + DQ_PositionalAccuracy object as encoded in ISO/TS 19139, either referencing or containing + the definition of that positional accuracy. That object contains an estimate of the impact + of this coordinate operation on point accuracy. That is, it gives position error estimates + for the target coordinates of this coordinate operation, assuming no errors in the source + coordinates. + + + + + + + + + + + gml:sourceCRS is an association role to the source CRS (coordinate reference + system) of this coordinate operation. + + + + + gml:targetCRS is an association role to the target CRS (coordinate reference + system) of this coordinate operation. + + + + + gml:CoordinateOperationPropertyType is a property type for association roles to + a coordinate operation, either referencing or containing the definition of that coordinate + operation. + + + + + + + + + gml:AbstractSingleOperation is a single (not concatenated) coordinate + operation. + + + + + gml:SingleOperationPropertyType is a property type for association roles to a + single operation, either referencing or containing the definition of that single + operation. + + + + + + + + + gm:AbstractGeneralConversion is an abstract operation on coordinates that does + not include any change of datum. The best-known example of a coordinate conversion is a map + projection. The parameters describing coordinate conversions are defined rather than + empirically derived. Note that some conversions have no parameters. The operationVersion, + sourceCRS, and targetCRS elements are omitted in a coordinate conversion. This abstract + complex type is expected to be extended for well-known operation methods with many + Conversion instances, in GML Application Schemas that define operation-method-specialized + element names and contents. This conversion uses an operation method, usually with + associated parameter values. However, operation methods and parameter values are directly + associated with concrete subtypes, not with this abstract type. All concrete types derived + from this type shall extend this type to include a "usesMethod" element that references the + "OperationMethod" element. Similarly, all concrete types derived from this type shall extend + this type to include zero or more elements each named "uses...Value" that each use the type + of an element substitutable for the "AbstractGeneralParameterValue" element. + + + + + + + + + + + + + + + + + + + + + + + gml:GeneralConversionPropertyType is a property type for association roles to a + general conversion, either referencing or containing the definition of that + conversion. + + + + + + + + + gml:AbstractGeneralTransformation is an abstract operation on coordinates that + usually includes a change of Datum. The parameters of a coordinate transformation are + empirically derived from data containing the coordinates of a series of points in both + coordinate reference systems. This computational process is usually "over-determined", + allowing derivation of error (or accuracy) estimates for the transformation. Also, the + stochastic nature of the parameters may result in multiple (different) versions of the same + coordinate transformation. The operationVersion, sourceCRS, and targetCRS proeprty elements + are mandatory in a coordinate transformation. This abstract complex type is expected to be + extended for well-known operation methods with many Transformation instances, in Application + Schemas that define operation-method-specialized value element names and contents. This + transformation uses an operation method with associated parameter values. However, operation + methods and parameter values are directly associated with concrete subtypes, not with this + abstract type. All concrete types derived from this type shall extend this type to include a + "usesMethod" element that references one "OperationMethod" element. Similarly, all concrete + types derived from this type shall extend this type to include one or more elements each + named "uses...Value" that each use the type of an element substitutable for the + "AbstractGeneralParameterValue" element. + + + + + + + + + + + + + + + + + + + + + + + + + + gml:GeneralTransformationPropertyType is a property type for association roles + to a general transformation, either referencing or containing the definition of that + transformation. + + + + + + + + + + gml:ConcatenatedOperation is an ordered sequence of two or more coordinate + operations. This sequence of operations is constrained by the requirement that the source + coordinate reference system of step (n+1) must be the same as the target coordinate + reference system of step (n). The source coordinate reference system of the first step and + the target coordinate reference system of the last step are the source and target coordinate + reference system associated with the concatenated operation. Instead of a forward operation, + an inverse operation may be used for one or more of the operation steps mentioned above, if + the inverse operation is uniquely defined by the forward operation. The gml:coordOperation + property elements are an ordered sequence of associations to the two or more operations used + by this concatenated operation. The AggregationAttributeGroup should be used to specify that + the coordOperation associations are ordered. + + + + + + + + + + + + + gml:coordOperation is an association role to a coordinate + operation. + + + + + gml:ConcatenatedOperationPropertyType is a property type for association roles + to a concatenated operation, either referencing or containing the definition of that + concatenated operation. + + + + + + + + + gml:PassThroughOperation is a pass-through operation specifies that a subset of + a coordinate tuple is subject to a specific coordinate operation. The modifiedCoordinate + property elements are an ordered sequence of positive integers defining the positions in a + coordinate tuple of the coordinates affected by this pass-through operation. The + AggregationAttributeGroup should be used to specify that the modifiedCoordinate elements are + ordered. + + + + + + + + + + + + + + + + gml:modifiedCoordinate is a positive integer defining a position in a + coordinate tuple. + + + + + gml:PassThroughOperationPropertyType is a property type for association roles + to a pass through operation, either referencing or containing the definition of that pass + through operation. + + + + + + + + + gml:Conversion is a concrete operation on coordinates that does not include any + change of Datum. The best-known example of a coordinate conversion is a map projection. The + parameters describing coordinate conversions are defined rather than empirically derived. + Note that some conversions have no parameters. This concrete complex type can be used + without using a GML Application Schema that defines operation-method-specialized element + names and contents, especially for methods with only one Conversion instance. The usesValue + property elements are an unordered list of composition associations to the set of parameter + values used by this conversion operation. + + + + + + + + + + + + + + + gml:method is an association role to the operation method used by a coordinate + operation. + + + + + gml:parameterValue is a composition association to a parameter value or group + of parameter values used by a coordinate operation. + + + + + gml:ConversionPropertyType is a property type for association roles to a + concrete general-purpose conversion, either referencing or containing the definition of that + conversion. + + + + + + + + + gml:Transformation is a concrete object element derived from + gml:GeneralTransformation (13.6.2.13). This concrete object can be used for all operation + methods, without using a GML Application Schema that defines operation-method-specialized + element names and contents, especially for methods with only one Transformation instance. + The parameterValue elements are an unordered list of composition associations to the set of + parameter values used by this conversion operation. + + + + + + + + + + + + + + + gml:TransformationPropertyType is a property type for association roles to a + transformation, either referencing or containing the definition of that + transformation. + + + + + + + + + gml:AbstractGeneralParameterValue is an abstract parameter value or group of + parameter values. This abstract complexType is expected to be extended and restricted for + well-known operation methods with many instances, in Application Schemas that define + operation-method-specialized element names and contents. Specific parameter value elements + are directly contained in concrete subtypes, not in this abstract type. All concrete types + derived from this type shall extend this type to include one "...Value" element with an + appropriate type, which should be one of the element types allowed in the + ParameterValueType. In addition, all derived concrete types shall extend this type to + include a "operationParameter" property element that references one element substitutable + for the "OperationParameter" object element. + + + + + + + + gml:AbstractGeneralParameterValuePropertyType is a property type for inline + association roles to a parameter value or group of parameter values, always containing the + values. + + + + + + + + gml:ParameterValue is a parameter value, an ordered sequence of values, or a + reference to a file of parameter values. This concrete complex type may be used for + operation methods without using an Application Schema that defines + operation-method-specialized element names and contents, especially for methods with only + one instance. This complex type may be used, extended, or restricted for well-known + operation methods, especially for methods with many instances. + + + + + + + + + + + + + + + + + + + + + + + + gml:value is a numeric value of an operation parameter, with its associated + unit of measure. + + + + + gml:stringValue is a character string value of an operation parameter. A string + value does not have an associated unit of measure. + + + + + gml:integerValue is a positive integer value of an operation parameter, usually + used for a count. An integer value does not have an associated unit of + measure. + + + + + gml:booleanValue is a boolean value of an operation parameter. A Boolean value + does not have an associated unit of measure. + + + + + gml:valueList is an ordered sequence of two or more numeric values of an + operation parameter list, where each value has the same associated unit of measure. An + element of this type contains a space-separated sequence of double values. + + + + + gml:integerValueList is an ordered sequence of two or more integer values of an + operation parameter list, usually used for counts. These integer values do not have an + associated unit of measure. An element of this type contains a space-separated sequence of + integer values. + + + + + gml:valueFile is a reference to a file or a part of a file containing one or + more parameter values, each numeric value with its associated unit of measure. When + referencing a part of a file, that file shall contain multiple identified parts, such as an + XML encoded document. Furthermore, the referenced file or part of a file may reference + another part of the same or different files, as allowed in XML documents. + + + + + gml:operationParameter is an association role to the operation parameter of + which this is a value. + + + + + gml:ParameterValueGroup is a group of related parameter values. The same group + can be repeated more than once in a Conversion, Transformation, or higher level + ParameterValueGroup, if those instances contain different values of one or more + parameterValues which suitably distinquish among those groups. This concrete complex type + can be used for operation methods without using an Application Schema that defines + operation-method-specialized element names and contents. This complex type may be used, + extended, or restricted for well-known operation methods, especially for methods with only + one instance. The parameterValue elements are an unordered set of composition association + roles to the parameter values and groups of values included in this group. + + + + + + + + + + + + + + + gml:group is an association role to the operation parameter group for which + this element provides parameter values. + + + + + gml:OperationMethod is a method (algorithm or procedure) used to perform a + coordinate operation. Most operation methods use a number of operation parameters, although + some coordinate conversions use none. Each coordinate operation using the method assigns + values to these parameters. The parameter elements are an unordered list of associations to + the set of operation parameters and parameter groups used by this operation + method. + + + + + + + + + + + + + + + + + + + + gml:formulaCitation provides a reference to a publication giving the formula(s) + or procedure used by an coordinate operation method. + + + + + + + + + + + gml:formula Formula(s) or procedure used by an operation method. The use of the + codespace attribite has been deprecated. The property value shall be a character + string. + + + + + gml:sourceDimensions is the number of dimensions in the source CRS of this + operation method. + + + + + gml:targetDimensions is the number of dimensions in the target CRS of this + operation method. + + + + + gml:parameter is an association to an operation parameter or parameter + group. + + + + + gml:OperationMethodPropertyType is a property type for association roles to a + concrete general-purpose operation method, either referencing or containing the definition + of that method. + + + + + + + + + gml:GeneralOperationParameter is the abstract definition of a parameter or + group of parameters used by an operation method. + + + + + + + + + + + + + + gml:minimumOccurs is the minimum number of times that values for this parameter + group or parameter are required. If this attribute is omitted, the minimum number shall be + one. + + + + + gml:AbstractGeneralOperationParameterPropertyType is a property type for + association roles to an operation parameter or group, either referencing or containing the + definition of that parameter or group. + + + + + + + + + gml:OperationParameter is the definition of a parameter used by an operation + method. Most parameter values are numeric, but other types of parameter values are possible. + This complex type is expected to be used or extended for all operation methods, without + defining operation-method-specialized element names. + + + + + + + + + + + + gml:OperationParameterPropertyType is a property type for association roles to + an operation parameter, either referencing or containing the definition of that + parameter. + + + + + + + + + gml:OperationParameterGroup is the definition of a group of parameters used by + an operation method. This complex type is expected to be used or extended for all applicable + operation methods, without defining operation-method-specialized element names. The + generalOperationParameter elements are an unordered list of associations to the set of + operation parameters that are members of this group. + + + + + + + + + + + + + + + gml:maximumOccurs is the maximum number of times that values for this parameter + group may be included. If this attribute is omitted, the maximum number shall be + one. + + + + + gml:OperationParameterPropertyType is a property type for association roles to + an operation parameter group, either referencing or containing the definition of that + parameter group. + + + + + + + + + gml:AbstractSingleCRS implements a coordinate reference system consisting of + one coordinate system and one datum (as opposed to a Compound CRS). + + + + + gml:SingleCRSPropertyType is a property type for association roles to a single + coordinate reference system, either referencing or containing the definition of that + coordinate reference system. + + + + + + + + + gml:AbstractGeneralDerivedCRS is a coordinate reference system that is defined + by its coordinate conversion from another coordinate reference system. This abstract complex + type shall not be used, extended, or restricted, in a GML Application Schema, to define a + concrete subtype with a meaning equivalent to a concrete subtype specified in this + document. + + + + + + + + + + + + + + gml:conversion is an association role to the coordinate conversion used to + define the derived CRS. + + + + + gml:CompundCRS is a coordinate reference system describing the position of + points through two or more independent coordinate reference systems. It is associated with a + non-repeating sequence of two or more instances of SingleCRS. + + + + + + + + + + + + + + + The gml:componentReferenceSystem elements are an ordered sequence of + associations to all the component coordinate reference systems included in this compound + coordinate reference system. The gml:AggregationAttributeGroup should be used to specify + that the gml:componentReferenceSystem properties are ordered. + + + + + gml:CompoundCRSPropertyType is a property type for association roles to a + compound coordinate reference system, either referencing or containing the definition of + that reference system. + + + + + + + + + + gml:GeodeticCRS is a coordinate reference system based on a geodetic + datum. + + + + + + + + + + + + + + + + + gml:ellipsoidalCS is an association role to the ellipsoidal coordinate system + used by this CRS. + + + + + gml:cartesianCS is an association role to the Cartesian coordinate system used + by this CRS. + + + + + gml:sphericalCS is an association role to the spherical coordinate system used + by this CRS. + + + + + gml:geodeticDatum is an association role to the geodetic datum used by this + CRS. + + + + + gml:GeodeticCRSPropertyType is a property type for association roles to a + geodetic coordinate reference system, either referencing or containing the definition of + that reference system. + + + + + + + + + gml:VerticalCRS is a 1D coordinate reference system used for recording heights + or depths. Vertical CRSs make use of the direction of gravity to define the concept of + height or depth, but the relationship with gravity may not be straightforward. By + implication, ellipsoidal heights (h) cannot be captured in a vertical coordinate reference + system. Ellipsoidal heights cannot exist independently, but only as an inseparable part of a + 3D coordinate tuple defined in a geographic 3D coordinate reference system. + + + + + + + + + + + + + + + gml:verticalCS is an association role to the vertical coordinate system used by + this CRS. + + + + + gml:verticalDatum is an association role to the vertical datum used by this + CRS. + + + + + gml:VerticalCRSPropertyType is a property type for association roles to a + vertical coordinate reference system, either referencing or containing the definition of + that reference system. + + + + + + + + + gml:ProjectedCRS is a 2D coordinate reference system used to approximate the + shape of the earth on a planar surface, but in such a way that the distortion that is + inherent to the approximation is carefully controlled and known. Distortion correction is + commonly applied to calculated bearings and distances to produce values that are a close + match to actual field values. + + + + + + + + + + + + + + + + + + gml:baseGeodeticCRS is an association role to the geodetic coordinate reference + system used by this projected CRS. + + + + + gml:ProjectedCRSPropertyType is a property type for association roles to a + projected coordinate reference system, either referencing or containing the definition of + that reference system. + + + + + + + + + gml:DerivedCRS is a single coordinate reference system that is defined by its + coordinate conversion from another single coordinate reference system known as the base CRS. + The base CRS can be a projected coordinate reference system, if this DerivedCRS is used for + a georectified grid coverage as described in ISO 19123, Clause 8. + + + + + + + + + + + + + + + + gml:baseCRS is an association role to the coordinate reference system used by + this derived CRS. + + + + + The gml:derivedCRSType property describes the type of a derived coordinate + reference system. The required codeSpace attribute shall reference a source of information + specifying the values and meanings of all the allowed string values for this + property. + + + + + An association role to the coordinate system used by this CRS. + + + + + gml:DerivedCRSPropertyType is a property type for association roles to a + non-projected derived coordinate reference system, either referencing or containing the + definition of that reference system. + + + + + + + + + gml:EngineeringCRS is a contextually local coordinate reference system which + can be divided into two broad categories: - earth-fixed systems applied to engineering + activities on or near the surface of the earth; - CRSs on moving platforms such as road + vehicles, vessels, aircraft, or spacecraft, see ISO 19111 8.3. + + + + + + + + + + + + + + + + + deprecated + + + + + + + + + + + gml:cylindricalCS is an association role to the cylindrical coordinate system + used by this CRS. + + + + + gml:linearCS is an association role to the linear coordinate system used by + this CRS. + + + + + gml:polarCS is an association role to the polar coordinate system used by this + CRS. + + + + + gml:userDefinedCS is an association role to the user defined coordinate system + used by this CRS. + + + + + gml:engineeringDatum is an association role to the engineering datum used by + this CRS. + + + + + gml:EngineeringCRSPropertyType is a property type for association roles to an + engineering coordinate reference system, either referencing or containing the definition of + that reference system. + + + + + + + + + gml:ImageCRS is an engineering coordinate reference system applied to locations + in images. Image coordinate reference systems are treated as a separate sub-type because the + definition of the associated image datum contains two attributes not relevant to other + engineering datums. + + + + + + + + + + + + + + + + + + + gml:affineCS is an association role to the affine coordinate system used by + this CRS. + + + + + gml:imageDatum is an association role to the image datum used by this + CRS. + + + + + gml:ImageCRSPropertyType is a property type for association roles to an image + coordinate reference system, either referencing or containing the definition of that + reference system. + + + + + + + + + gml:TemporalCRS is a 1D coordinate reference system used for the recording of + time. + + + + + + + + + + + + + + + + + + gml:timeCS is an association role to the time coordinate system used by this + CRS. + + + + + gml:temporalDatum is an association role to the temporal datum used by this + CRS. + + + + + gml:TemporalCRSPropertyType is a property type for association roles to a + temporal coordinate reference system, either referencing or containing the definition of + that reference system. + + + + + + + + + gml:AbstractSurfaceType is an abstraction of a surface to support the different + levels of complexity. A surface is always a continuous region of a plane. + + + + + + + + The AbstractSurface element is the abstract head of the substitution group for + all (continuous) surface elements. + + + + + A property that has a surface as its value domain may either be an appropriate + geometry element encapsulated in an element of this type or an XLink reference to a remote + geometry element (where remote includes geometry elements located elsewhere in the same + document). Either the reference or the contained element shall be given, but neither both + nor none. + + + + + + + + + + This property element either references a surface via the XLink-attributes or + contains the surface element. surfaceProperty is the predefined property which may be used + by GML Application Schemas whenever a GML feature has a property with a value that is + substitutable for AbstractSurface. + + + + + gml:SurfaceArrayPropertyType is a container for an array of surfaces. The + elements are always contained in the array property, referencing geometry elements or arrays + of geometry elements via XLinks is not supported. + + + + + + + + + + + + + + + + + + + A Polygon is a special surface that is defined by a single surface patch (see + D.3.6). The boundary of this patch is coplanar and the polygon uses planar interpolation in + its interior. The elements exterior and interior describe the surface boundary of the + polygon. + + + + + A boundary of a surface consists of a number of rings. In the normal 2D case, + one of these rings is distinguished as being the exterior boundary. In a general manifold + this is not always possible, in which case all boundaries shall be listed as interior + boundaries, and the exterior will be empty. + + + + + A boundary of a surface consists of a number of rings. The "interior" rings + separate the surface / surface patch from the area enclosed by the rings. + + + + + + + + An abstraction of a ring to support surface boundaries of different complexity. + The AbstractRing element is the abstract head of the substituition group for all closed + boundaries of a surface patch. + + + + + A property with the content model of gml:AbstractRingPropertyType encapsulates + a ring to represent the surface boundary property of a surface. + + + + + + + + + + + + + + + + + + + + + + + + + A LinearRing is defined by four or more coordinate tuples, with linear + interpolation between them; the first and last coordinates shall be coincident. The number + of direct positions in the list shall be at least four. + + + + + A property with the content model of gml:LinearRingPropertyType encapsulates a + linear ring to represent a component of a surface boundary. + + + + + + + + + + + + + + + + + A curve is a 1-dimensional primitive. Curves are continuous, connected, and + have a measurable length in terms of the coordinate system. A curve is composed of one or + more curve segments. Each curve segment within a curve may be defined using a different + interpolation method. The curve segments are connected to one another, with the end point of + each segment except the last being the start point of the next segment in the segment list. + The orientation of the curve is positive. The element segments encapsulates the segments of + the curve. + + + + + + + + + + + + + + + The property baseCurve references or contains the base curve, i.e. it either + references the base curve via the XLink-attributes or contains the curve element. A curve + element is any element which is substitutable for AbstractCurve. The base curve has positive + orientation. + + + + + OrientableCurve consists of a curve and an orientation. If the orientation is + "+", then the OrientableCurve is identical to the baseCurve. If the orientation is "-", then + the OrientableCurve is related to another AbstractCurve with a parameterization that + reverses the sense of the curve traversal. + + + + + + + + + + A curve segment defines a homogeneous segment of a curve. The attributes + numDerivativesAtStart, numDerivativesAtEnd and numDerivativesInterior specify the type of + continuity as specified in ISO 19107:2003, 6.4.9.3. The AbstractCurveSegment element is the + abstract head of the substituition group for all curve segment elements, i.e. continuous + segments of the same interpolation mechanism. All curve segments shall have an attribute + interpolation with type gml:CurveInterpolationType specifying the curve interpolation + mechanism used for this segment. This mechanism uses the control points and control + parameters to determine the position of this curve segment. + + + + + gml:CurveSegmentArrayPropertyType is a container for an array of curve + segments. + + + + + + + + This property element contains a list of curve segments. The order of the + elements is significant and shall be preserved when processing the array. + + + + + gml:CurveInterpolationType is a list of codes that may be used to identify the + interpolation mechanisms specified by an application schema. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A LineStringSegment is a curve segment that is defined by two or more control + points including the start and end point, with linear interpolation between them. The + content model follows the general pattern for the encoding of curve + segments. + + + + + + + + + + + + + + + + + + + + + + + + An ArcString is a curve segment that uses three-point circular arc + interpolation ("circularArc3Points"). The number of arcs in the arc string may be explicitly + stated in the attribute numArc. The number of control points in the arc string shall be 2 * + numArc + 1. The content model follows the general pattern for the encoding of curve + segments. + + + + + + + + + + + + + + + + + + + + + + + An Arc is an arc string with only one arc unit, i.e. three control points + including the start and end point. As arc is an arc string consisting of a single arc, the + attribute "numArc" is fixed to "1". + + + + + + + + + + A Circle is an arc whose ends coincide to form a simple closed loop. The three + control points shall be distinct non-co-linear points for the circle to be unambiguously + defined. The arc is simply extended past the third control point until the first control + point is encountered. + + + + + + + + + + + + + + + + + + + + + + + + + + This variant of the arc computes the mid points of the arcs instead of storing + the coordinates directly. The control point sequence consists of the start and end points of + each arc plus the bulge (see ISO 19107:2003, 6.4.17.2). The normal is a vector normal + (perpendicular) to the chord of the arc (see ISO 19107:2003, 6.4.17.4). The interpolation is + fixed as "circularArc2PointWithBulge". The number of arcs in the arc string may be + explicitly stated in the attribute numArc. The number of control points in the arc string + shall be numArc + 1. The content model follows the general pattern for the encoding of curve + segments. + + + + + + + + + + + + + + + + + + + + + + + + + An ArcByBulge is an arc string with only one arc unit, i.e. two control points, + one bulge and one normal vector. As arc is an arc string consisting of a single arc, the + attribute "numArc" is fixed to "1". + + + + + + + + + + + + + + + + + + + + + + + + + + + This variant of the arc requires that the points on the arc shall be computed + instead of storing the coordinates directly. The single control point is the center point of + the arc plus the radius and the bearing at start and end. This representation can be used + only in 2D. The element radius specifies the radius of the arc. The element startAngle + specifies the bearing of the arc at the start. The element endAngle specifies the bearing of + the arc at the end. The interpolation is fixed as "circularArcCenterPointWithRadius". Since + this type describes always a single arc, the attribute "numArc" is fixed to "1". The content + model follows the general pattern for the encoding of curve segments. + + + + + + + + + + + + + + + + + + + + + + + A gml:CircleByCenterPoint is an gml:ArcByCenterPoint with identical start and + end angle to form a full circle. Again, this representation can be used only in + 2D. + + + + + + + + + + + + + + + + + + + + + + + + + + The number of control points shall be at least three. vectorAtStart is the unit + tangent vector at the start point of the spline. vectorAtEnd is the unit tangent vector at + the end point of the spline. Only the direction of the vectors shall be used to determine + the shape of the cubic spline, not their length. interpolation is fixed as "cubicSpline". + degree shall be the degree of the polynomial used for the interpolation in this spline. + Therefore the degree for a cubic spline is fixed to "3". The content model follows the + general pattern for the encoding of curve segments. + + + + + + + + + + + + + + + + + + + + + + + + + + + A B-Spline is a piecewise parametric polynomial or rational curve described in + terms of control points and basis functions as specified in ISO 19107:2003, 6.4.30. + Therefore, interpolation may be either "polynomialSpline" or "rationalSpline" depending on + the interpolation type; default is "polynomialSpline". degree shall be the degree of the + polynomial used for interpolation in this spline. knot shall be the sequence of distinct + knots used to define the spline basis functions (see ISO 19107:2003, 6.4.26.2). The + attribute isPolynomial shall be set to "true" if this is a polynomial spline (see ISO + 19107:2003, 6.4.30.5). The attribute knotType shall provide the type of knot distribution + used in defining this spline (see ISO 19107:2003, 6.4.30.4). The content model follows the + general pattern for the encoding of curve segments. + + + + + + + + + + + + gml:KnotPropertyType encapsulates a knot to use it in a geometric + type. + + + + + A knot is a breakpoint on a piecewise spline curve. value is the value of + the parameter at the knot of the spline (see ISO 19107:2003, 6.4.24.2). multiplicity is + the multiplicity of this knot used in the definition of the spline (with the same + weight). weight is the value of the averaging weight used for this knot of the + spline. + + + + + + + This enumeration type specifies values for the knots' type (see ISO 19107:2003, + 6.4.25). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bezier curves are polynomial splines that use Bezier or Bernstein polynomials + for interpolation purposes. It is a special case of the B-Spline curve with two knots. + degree shall be the degree of the polynomial used for interpolation in this spline. knot + shall be the sequence of distinct knots used to define the spline basis functions. + interpolation is fixed as "polynomialSpline". isPolynomial is fixed as "true". knotType is + not relevant for Bezier curve segments. + + + + + + + + + + + + + + + + An offset curve is a curve at a constant distance from the basis curve. + offsetBase is the base curve from which this curve is defined as an offset. distance and + refDirection have the same meaning as specified in ISO 19107:2003, 6.4.23. The content model + follows the general pattern for the encoding of curve segments. + + + + + + + + + + + + + location, refDirection, inDimension and outDimension have the same meaning as + specified in ISO 19107:2003, 6.4.21. + + + + + + + + + + + + + + + + + + + + + + + + A clothoid, or Cornu's spiral, is plane curve whose curvature is a fixed + function of its length. refLocation, startParameter, endParameter and scaleFactor have the + same meaning as specified in ISO 19107:2003, 6.4.22. interpolation is fixed as "clothoid". + The content model follows the general pattern for the encoding of curve + segments. + + + + + + + + + + + + + + + + A sequence of geodesic segments. The number of control points shall be at least + two. interpolation is fixed as "geodesic". The content model follows the general pattern for + the encoding of curve segments. + + + + + + + + + + + + + + + + + + + + A Surface is a 2-dimensional primitive and is composed of one or more surface + patches as specified in ISO 19107:2003, 6.3.17.1. The surface patches are connected to one + another. patches encapsulates the patches of the surface. + + + + + + + + + + + + + + + The property baseSurface references or contains the base surface. The property + baseSurface either references the base surface via the XLink-attributes or contains the + surface element. A surface element is any element which is substitutable for + gml:AbstractSurface. The base surface has positive orientation. + + + + + OrientableSurface consists of a surface and an orientation. If the orientation + is "+", then the OrientableSurface is identical to the baseSurface. If the orientation is + "-", then the OrientableSurface is a reference to a gml:AbstractSurface with an up-normal + that reverses the direction for this OrientableSurface, the sense of "the top of the + surface". + + + + + + A surface patch defines a homogenuous portion of a surface. The + AbstractSurfacePatch element is the abstract head of the substituition group for all surface + patch elements describing a continuous portion of a surface. All surface patches shall have + an attribute interpolation (declared in the types derived from gml:AbstractSurfacePatchType) + specifying the interpolation mechanism used for the patch using + gml:SurfaceInterpolationType. + + + + + gml:SurfacePatchArrayPropertyType is a container for a sequence of surface + patches. + + + + + + + + The patches property element contains the sequence of surface patches. The + order of the elements is significant and shall be preserved when processing the + array. + + + + + gml:SurfaceInterpolationType is a list of codes that may be used to identify + the interpolation mechanisms specified by an application schema. + + + + + + + + + + + + + + + + + + + + + + + + + + + + A gml:PolygonPatch is a surface patch that is defined by a set of boundary + curves and an underlying surface to which these curves adhere. The curves shall be coplanar + and the polygon uses planar interpolation in its interior. interpolation is fixed to + "planar", i.e. an interpolation shall return points on a single plane. The boundary of the + patch shall be contained within that plane. + + + + + + + + + + + + + + + gml:Triangle represents a triangle as a surface patch with an outer boundary + consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. + The number of points in the linear ring shall be four. The ring (element exterior) shall be + a gml:LinearRing and shall form a triangle, the first and the last position shall be + coincident. interpolation is fixed to "planar", i.e. an interpolation shall return points on + a single plane. The boundary of the patch shall be contained within that + plane. + + + + + + + + + + + + + + + gml:Rectangle represents a rectangle as a surface patch with an outer boundary + consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. + The number of points in the linear ring shall be five. The ring (element exterior) shall be + a gml:LinearRing and shall form a rectangle; the first and the last position shall be + coincident. interpolation is fixed to "planar", i.e. an interpolation shall return points on + a single plane. The boundary of the patch shall be contained within that + plane. + + + + + + + + + + + + + + + A ring is used to represent a single connected component of a surface boundary + as specified in ISO 19107:2003, 6.3.6. Every gml:curveMember references or contains one + curve, i.e. any element which is substitutable for gml:AbstractCurve. In the context of a + ring, the curves describe the boundary of the surface. The sequence of curves shall be + contiguous and connected in a cycle. If provided, the aggregationType attribute shall have + the value "sequence". + + + + + + A property with the content model of gml:RingPropertyType encapsulates a ring + to represent a component of a surface boundary. + + + + + + + + A gml:PointGrid group contains or references points or positions which are + organised into sequences or grids. All rows shall have the same number of positions + (columns). + + + + + + + + + + + + + + + + + + + + + + + + + The element provides a substitution group head for the surface patches based on + parametric curves. All properties are specified in the derived subtypes. All derived + subtypes shall conform to the constraints specified in ISO 19107:2003, 6.4.40. If provided, + the aggregationType attribute shall have the value "set". + + + + + + + + + + + + + + + + if provided, rows gives the number of rows, columns the number of columns in + the parameter grid. The parameter grid is represented by an instance of the gml:PointGrid + group. The element provides a substitution group head for the surface patches based on a + grid. All derived subtypes shall conform to the constraints specified in ISO 19107:2003, + 6.4.41. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A polyhedral surface is a surface composed of polygon patches connected along + their common boundary curves. This differs from the surface type only in the restriction on + the types of surface patches acceptable. polygonPatches encapsulates the polygon patches of + the polyhedral surface. + + + + + A triangulated surface is a polyhedral surface that is composed only of + triangles. There is no restriction on how the triangulation is derived. trianglePatches + encapsulates the triangles of the triangulated surface. + + + + + + + + + + + + + + + + + + + + + + + + A tin is a triangulated surface that uses the Delauny algorithm or a similar + algorithm complemented with consideration of stoplines (stopLines), breaklines (breakLines), + and maximum length of triangle sides (maxLength). controlPoint shall contain a set of the + positions (three or more) used as posts for this TIN (corners of the triangles in the TIN). + See ISO 19107:2003, 6.4.39 for details. + + + + + gml:LineStringSegmentArrayPropertyType provides a container for line + strings. + + + + + + + + gml:AbstractSolidType is an abstraction of a solid to support the different + levels of complexity. The solid may always be viewed as a geometric primitive, i.e. is + contiguous. + + + + + + + + The AbstractSolid element is the abstract head of the substituition group for + all (continuous) solid elements. + + + + + A property that has a solid as its value domain may either be an appropriate + geometry element encapsulated in an element of this type or an XLink reference to a remote + geometry element (where remote includes geometry elements located elsewhere in the same + document). Either the reference or the contained element shall be given, but neither both + nor none. + + + + + + + + + + This property element either references a solid via the XLink-attributes or + contains the solid element. solidProperty is the predefined property which may be used by + GML Application Schemas whenever a GML feature has a property with a value that is + substitutable for AbstractSolid. + + + + + gml:SolidArrayPropertyType is a container for an array of solids. The elements + are always contained in the array property, referencing geometry elements or arrays of + geometry elements is not supported. + + + + + + + + + + + + + + + + + + + A solid is the basis for 3-dimensional geometry. The extent of a solid is + defined by the boundary surfaces as specified in ISO 19107:2003, 6.3.18. exterior specifies + the outer boundary, interior the inner boundary of the solid. + + + + + + + + + + + A shell is used to represent a single connected component of a solid boundary + as specified in ISO 19107:2003, 6.3.8. Every gml:surfaceMember references or contains one + surface, i.e. any element which is substitutable for gml:AbstractSurface. In the context of + a shell, the surfaces describe the boundary of the solid. If provided, the aggregationType + attribute shall have the value "set". + + + + + This property element either references a surface via the XLink-attributes or + contains the surface element. A surface element is any element, which is substitutable for + gml:AbstractSurface. + + + + + A property with the content model of gml:ShellPropertyType encapsulates a shell + to represent a component of a solid boundary. + + + + + + + + + + + + + + + gml:AbstractGeometricAggregate is the abstract head of the substitution group + for all geometric aggregates. + + + + + + + + + + + + + + + gml:MultiGeometry is a collection of one or more GML geometry objects of + arbitrary type. The members of the geometric aggregate may be specified either using the + "standard" property (gml:geometryMember) or the array property (gml:geometryMembers). It is + also valid to use both the "standard" and the array properties in the same + collection. + + + + + This property element either references a geometry element via the + XLink-attributes or contains the geometry element. + + + + + This property element contains a list of geometry elements. The order of the + elements is significant and shall be preserved when processing the array. + + + + + A property that has a geometric aggregate as its value domain may either be an + appropriate geometry element encapsulated in an element of this type or an XLink reference + to a remote geometry element (where remote includes geometry elements located elsewhere in + the same document). Either the reference or the contained element shall be given, but + neither both nor none. + + + + + + + + + + + + + + + + + + + + A gml:MultiPoint consists of one or more gml:Points. The members of the + geometric aggregate may be specified either using the "standard" property (gml:pointMember) + or the array property (gml:pointMembers). It is also valid to use both the "standard" and + the array properties in the same collection. + + + + + This property element either references a Point via the XLink-attributes or + contains the Point element. + + + + + This property element contains a list of points. The order of the elements is + significant and shall be preserved when processing the array. + + + + + A property that has a collection of points as its value domain may either be an + appropriate geometry element encapsulated in an element of this type or an XLink reference + to a remote geometry element (where remote includes geometry elements located elsewhere in + the same document). Either the reference or the contained element shall be given, but + neither both nor none. + + + + + + + + + + + + + + + + + + + + A gml:MultiCurve is defined by one or more gml:AbstractCurves. The members of + the geometric aggregate may be specified either using the "standard" property + (gml:curveMember) or the array property (gml:curveMembers). It is also valid to use both the + "standard" and the array properties in the same collection. + + + + + This property element contains a list of curves. The order of the elements is + significant and shall be preserved when processing the array. + + + + + A property that has a collection of curves as its value domain may either be an + appropriate geometry element encapsulated in an element of this type or an XLink reference + to a remote geometry element (where remote includes geometry elements located elsewhere in + the same document). Either the reference or the contained element shall be given, but + neither both nor none. + + + + + + + + + + + + + + + + + + + + A gml:MultiSurface is defined by one or more gml:AbstractSurfaces. The members + of the geometric aggregate may be specified either using the "standard" property + (gml:surfaceMember) or the array property (gml:surfaceMembers). It is also valid to use both + the "standard" and the array properties in the same collection. + + + + + This property element contains a list of surfaces. The order of the elements is + significant and shall be preserved when processing the array. + + + + + A property that has a collection of surfaces as its value domain may either be + an appropriate geometry element encapsulated in an element of this type or an XLink + reference to a remote geometry element (where remote includes geometry elements located + elsewhere in the same document). Either the reference or the contained element shall be + given, but neither both nor none. + + + + + + + + + + + + + + + + + + + + A gml:MultiSolid is defined by one or more gml:AbstractSolids. The members of + the geometric aggregate may be specified either using the "standard" property + (gml:solidMember) or the array property (gml:solidMembers). It is also valid to use both the + "standard" and the array properties in the same collection. + + + + + This property element either references a solid via the XLink-attributes or + contains the solid element. A solid element is any element, which is substitutable for + gml:AbstractSolid. + + + + + This property element contains a list of solids. The order of the elements is + significant and shall be preserved when processing the array. + + + + + A property that has a collection of solids as its value domain may either be an + appropriate geometry element encapsulated in an element of this type or an XLink reference + to a remote geometry element (where remote includes geometry elements located elsewhere in + the same document). Either the reference or the contained element shall be given, but + neither both nor none. + + + + + + + + + + The basic feature model is given by the gml:AbstractFeatureType. The content + model for gml:AbstractFeatureType adds two specific properties suitable for geographic + features to the content model defined in gml:AbstractGMLType. The value of the gml:boundedBy + property describes an envelope that encloses the entire feature instance, and is primarily + useful for supporting rapid searching for features that occur in a particular location. The + value of the gml:location property describes the extent, position or relative location of + the feature. + + + + + + + + + + + + + This abstract element serves as the head of a substitution group which may + contain any elements whose content model is derived from gml:AbstractFeatureType. This may + be used as a variable in the construction of content models. gml:AbstractFeature may be + thought of as "anything that is a GML feature" and may be used to define variables or + templates in which the value of a GML property is "any feature". This occurs in particular + in a GML feature collection where the feature member properties contain one or multiple + copies of gml:AbstractFeature respectively. + + + + + + + + + + + + This property describes the minimum bounding box or rectangle that encloses the + entire feature. + + + + + + + + + + + + + + gml:EnvelopeWithTimePeriod is provided for envelopes that include a temporal + extent. It adds two time position properties, gml:beginPosition and gml:endPosition, which + describe the extent of a time-envelope. Since gml:EnvelopeWithTimePeriod is assigned to the + substitution group headed by gml:Envelope, it may be used whenever gml:Envelope is + valid. + + + + + + + + + + + + + + + + The gml:locationName property element is a convenience property where the text + value describes the location of the feature. If the location names are selected from a + controlled list, then the list shall be identified in the codeSpace + attribute. + + + + + The gml:locationReference property element is a convenience property where the + text value referenced by the xlink:href attribute describes the location of the + feature. + + + + + To create a collection of GML features, a property type shall be derived by + extension from gml:AbstractFeatureMemberType. By default, this abstract property type does + not imply any ownership of the features in the collection. The owns attribute of + gml:OwnershipAttributeGroup may be used on a property element instance to assert ownership + of a feature in the collection. A collection shall not own a feature already owned by + another object. + + + + + + + The property gml:direction is intended as a pre-defined property expressing a + direction to be assigned to features defined in a GML application schema. + + + + + + + + + + + + + + + + Direction vectors are specified by providing components of a + vector. + + + + + + deprecated + + + + + + + + + direction descriptions are specified by a compass point code, a keyword, a + textual description or a reference to a description. A gml:compassPoint is specified by a + simple enumeration. In addition, thre elements to contain text-based descriptions of + direction are provided. If the direction is specified using a term from a list, gml:keyword + should be used, and the list indicated using the value of the codeSpace attribute. if the + direction is decribed in prose, gml:direction or gml:reference should be used, allowing the + value to be included inline or by reference. + + + + + + + + + + + These directions are necessarily approximate, giving direction with a precision + of 22.5°. It is thus generally unnecessary to specify the reference frame, though this may + be detailed in the definition of a GML application language. + + + + + + + + + + + + + + + + + + + + + + + The element gml:unitOfMeasure is a property element to refer to a unit of + measure. This is an empty element which carries a reference to a unit of measure + definition. + + + + + + + + + A gml:UnitDefinition is a general definition of a unit of measure. This generic + element is used only for units for which no relationship with other units or units systems + is known. The content model of gml:UnitDefinition adds three additional properties to + gml:Definition, gml:quantityType, gml:quantityTypeReference and gml:catalogSymbol. The + gml:catalogSymbol property optionally gives the short symbol used for this unit. This + element is usually used when the relationship of this unit to other units or units systems + is unknown. + + + + + + + + + + + + + + + + The gml:quantityType property indicates the phenomenon to which the units + apply. This element contains an informal description of the phenomenon or type of physical + quantity that is measured or observed. When the physical quantity is the result of an + observation or measurement, this term is known as observable type or measurand. The use of + gml:quantityType for references to remote values is deprecated. + + + + + The gml:quantityTypeReference property indicates the phenomenon to which the + units apply. The content is a reference to a remote value. + + + + + The catalogSymbol is the preferred lexical symbol used for this unit of + measure. The codeSpace attribute in gml:CodeType identifies a namespace for the catalog + symbol value, and might reference the external catalog. The string value in gml:CodeType + contains the value of a symbol that should be unique within this catalog namespace. This + symbol often appears explicitly in the catalog, but it could be a combination of symbols + using a specified algebra of units. + + + + + A base unit is a unit of measure that cannot be derived by combination of other + base units within a particular system of units. For example, in the SI system of units, the + base units are metre, kilogram, second, Ampere, Kelvin, mole, and candela, for the physical + quantity types length, mass, time interval, electric current, thermodynamic temperature, + amount of substance and luminous intensity, respectively. gml:BaseUnit extends generic + gml:UnitDefinition with the property gml:unitsSystem, which carries a reference to the units + system to which this base unit is asserted to belong. + + + + + + + + + + + + + + Derived units are defined by combination of other units. Derived units are used + for quantities other than those corresponding to the base units, such as hertz (s-1) for + frequency, Newton (kg.m/s2) for force. Derived units based directly on base units are + usually preferred for quantities other than the fundamental quantities within a system. If a + derived unit is not the preferred unit, the gml:ConventionalUnit element should be used + instead. The gml:DerivedUnit extends gml:UnitDefinition with the property + gml:derivationUnitTerms. + + + + + + + + + + + + + + A set of gml:derivationUnitTerm elements describes a derived unit of measure. + Each element carries an integer exponent. The terms are combined by raising each referenced + unit to the power of its exponent and forming the product. This unit term references another + unit of measure (uom) and provides an integer exponent applied to that unit in defining the + compound unit. The exponent may be positive or negative, but not zero. + + + + + + + + + + + + Conventional units that are neither base units nor defined by direct + combination of base units are used in many application domains. For example electronVolt for + energy, feet and nautical miles for length. In most cases there is a known, usually linear, + conversion to a preferred unit which is either a base unit or derived by direct combination + of base units. The gml:ConventionalUnit extends gml:UnitDefinition with a property that + describes a conversion to a preferred unit for this physical quantity. When the conversion + is exact, the element gml:conversionToPreferredUnit should be used, or when the conversion + is not exact the element gml:roughConversionToPreferredUnit is available. Both of these + elements have the same content model. The gml:derivationUnitTerm property defined above is + included to allow a user to optionally record how this unit may be derived from other ("more + primitive") units. + + + + + + + + + + + + + + + + + + The elements gml:conversionToPreferredUnit and + gml:roughConversionToPreferredUnit represent parameters used to convert conventional units + to preferred units for this physical quantity type. A preferred unit is either a Base Unit + or a Derived Unit that is selected for all values of one physical quantity + type. + + + + + The elements gml:conversionToPreferredUnit and + gml:roughConversionToPreferredUnit represent parameters used to convert conventional units + to preferred units for this physical quantity type. A preferred unit is either a Base Unit + or a Derived Unit that is selected for all values of one physical quantity + type. + + + + + The inherited attribute uom references the preferred unit that this conversion + applies to. The conversion of a unit to the preferred unit for this physical quantity type + is specified by an arithmetic conversion (scaling and/or offset). The content model extends + gml:UnitOfMeasureType, which has a mandatory attribute uom which identifies the preferred + unit for the physical quantity type that this conversion applies to. The conversion is + specified by a choice of - gml:factor, which defines the scale factor, or - gml:formula, + which defines a formula by which a value using the conventional unit of measure can be + converted to obtain the corresponding value using the preferred unit of measure. The formula + defines the parameters of a simple formula by which a value using the conventional unit of + measure can be converted to the corresponding value using the preferred unit of measure. The + formula element contains elements a, b, c and d, whose values use the XML Schema type + double. These values are used in the formula y = (a + bx) / (c + dx), where x is a value + using this unit, and y is the corresponding value using the base unit. The elements a and d + are optional, and if values are not provided, those parameters are considered to be zero. If + values are not provided for both a and d, the formula is equivalent to a fraction with + numerator and denominator parameters. + + + + + + + + + + + + + + + + + + + + + The value of a physical quantity, together with its unit. + + + + + This is a prototypical definition for a specific measure type defined as a + vacuous extension (i.e. aliases) of gml:MeasureType. In this case, the content model + supports the description of a length (or distance) quantity, with its units. The unit of + measure referenced by uom shall be suitable for a length, such as metres or + feet. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The gml:angle property element is used to record the value of an angle quantity + as a single number, with its units. + + + + + All geometry elements are derived directly or indirectly from this abstract + supertype. A geometry element may have an identifying attribute (gml:id), one or more names + (elements identifier and name) and a description (elements description and + descriptionReference) . It may be associated with a spatial reference system (attribute + group gml:SRSReferenceGroup). The following rules shall be adhered to: - Every geometry type + shall derive from this abstract type. - Every geometry element (i.e. an element of a + geometry type) shall be directly or indirectly in the substitution group of + AbstractGeometry. + + + + + + + + + + The attribute group SRSReferenceGroup is an optional reference to the CRS used + by this geometry, with optional additional information to simplify the processing of the + coordinates when a more complete definition of the CRS is not needed. In general the + attribute srsName points to a CRS instance of gml:AbstractCoordinateReferenceSystem. For + well-known references it is not required that the CRS description exists at the location the + URI points to. If no srsName attribute is given, the CRS shall be specified as part of the + larger context this geometry element is part of. + + + + + + + + The attributes uomLabels and axisLabels, defined in the SRSInformationGroup + attribute group, are optional additional and redundant information for a CRS to simplify the + processing of the coordinate values when a more complete definition of the CRS is not + needed. This information shall be the same as included in the complete definition of the + CRS, referenced by the srsName attribute. When the srsName attribute is included, either + both or neither of the axisLabels and uomLabels attributes shall be included. When the + srsName attribute is omitted, both of these attributes shall be omitted. The attribute + axisLabels is an ordered list of labels for all the axes of this CRS. The gml:axisAbbrev + value should be used for these axis labels, after spaces and forbidden characters are + removed. When the srsName attribute is included, this attribute is optional. When the + srsName attribute is omitted, this attribute shall also be omitted. The attribute uomLabels + is an ordered list of unit of measure (uom) labels for all the axes of this CRS. The value + of the string in the gml:catalogSymbol should be used for this uom labels, after spaces and + forbidden characters are removed. When the axisLabels attribute is included, this attribute + shall also be included. When the axisLabels attribute is omitted, this attribute shall also + be omitted. + + + + + + + The AbstractGeometry element is the abstract head of the substitution group for + all geometry elements of GML. This includes pre-defined and user-defined geometry elements. + Any geometry element shall be a direct or indirect extension/restriction of + AbstractGeometryType and shall be directly or indirectly in the substitution group of + AbstractGeometry. + + + + + A geometric property may either be any geometry element encapsulated in an + element of this type or an XLink reference to a remote geometry element (where remote + includes geometry elements located elsewhere in the same or another document). Note that + either the reference or the contained element shall be given, but not both or none. If a + feature has a property that takes a geometry element as its value, this is called a geometry + property. A generic type for such a geometry property is + GeometryPropertyType. + + + + + + + + + + If a feature has a property which takes an array of geometry elements as its + value, this is called a geometry array property. A generic type for such a geometry property + is GeometryArrayPropertyType. The elements are always contained inline in the array + property, referencing geometry elements or arrays of geometry elements via XLinks is not + supported. + + + + + + + + + Direct position instances hold the coordinates for a position within some + coordinate reference system (CRS). Since direct positions, as data types, will often be + included in larger objects (such as geometry elements) that have references to CRS, the + srsName attribute will in general be missing, if this particular direct position is included + in a larger element with such a reference to a CRS. In this case, the CRS is implicitly + assumed to take on the value of the containing object's CRS. if no srsName attribute is + given, the CRS shall be specified as part of the larger context this geometry element is + part of, typically a geometric object like a point, curve, etc. + + + + + + + + + + + posList instances (and other instances with the content model specified by + DirectPositionListType) hold the coordinates for a sequence of direct positions within the + same coordinate reference system (CRS). if no srsName attribute is given, the CRS shall be + specified as part of the larger context this geometry element is part of, typically a + geometric object like a point, curve, etc. The optional attribute count specifies the number + of direct positions in the list. If the attribute count is present then the attribute + srsDimension shall be present, too. The number of entries in the list is equal to the + product of the dimensionality of the coordinate reference system (i.e. it is a derived value + of the coordinate reference system definition) and the number of direct + positions. + + + + + + + + + + + + GML supports two different ways to specify a geometric position: either by a + direct position (a data type) or a point (a geometric object). pos elements are positions + that are "owned" by the geometric primitive encapsulating this geometric position. + pointProperty elements contain a point that may be referenced from other geometry elements + or reference another point defined elsewhere (reuse of existing points). + + + + + + + + + GML supports two different ways to specify a list of geometric positions: + either by a sequence of geometric positions (by reusing the group definition) or a sequence + of direct positions (element posList). The posList element allows for a compact way to + specify the coordinates of the positions, if all positions are represented in the same + coordinate reference system. + + + + + + + + + For some applications the components of the position may be adjusted to yield a + unit vector. + + + + + + + + + + + + + + + deprecated + + + + + + + + + Envelope defines an extent using a pair of positions defining opposite corners + in arbitrary dimensions. The first direct position is the "lower corner" (a coordinate + position consisting of all the minimal ordinates for each dimension for all points within + the envelope), the second one the "upper corner" (a coordinate position consisting of all + the maximal ordinates for each dimension for all points within the envelope). The use of the + properties "coordinates" and "pos" has been deprecated. The explicitly named properties + "lowerCorner" and "upperCorner" shall be used instead. + + + + + gml:AbstractGeometricPrimitiveType is the abstract root type of the geometric + primitives. A geometric primitive is a geometric object that is not decomposed further into + other primitives in the system. All primitives are oriented in the direction implied by the + sequence of their coordinate tuples. + + + + + + + + The AbstractGeometricPrimitive element is the abstract head of the substitution + group for all (pre- and user-defined) geometric primitives. + + + + + A property that has a geometric primitive as its value domain may either be an + appropriate geometry element encapsulated in an element of this type or an XLink reference + to a remote geometry element (where remote includes geometry elements located elsewhere in + the same document). Either the reference or the contained element shall be given, but + neither both nor none. + + + + + + + + + + + + + + + + + + + + + + A Point is defined by a single coordinate tuple. The direct position of a point + is specified by the pos element which is of type DirectPositionType. + + + + + A property that has a point as its value domain may either be an appropriate + geometry element encapsulated in an element of this type or an XLink reference to a remote + geometry element (where remote includes geometry elements located elsewhere in the same + document). Either the reference or the contained element shall be given, but neither both + nor none. + + + + + + + + + + This property element either references a point via the XLink-attributes or + contains the point element. pointProperty is the predefined property which may be used by + GML Application Schemas whenever a GML feature has a property with a value that is + substitutable for Point. + + + + + gml:PointArrayPropertyType is a container for an array of points. The elements + are always contained inline in the array property, referencing geometry elements or arrays + of geometry elements via XLinks is not supported. + + + + + + + + + gml:AbstractCurveType is an abstraction of a curve to support the different + levels of complexity. The curve may always be viewed as a geometric primitive, i.e. is + continuous. + + + + + + + + The AbstractCurve element is the abstract head of the substitution group for + all (continuous) curve elements. + + + + + A property that has a curve as its value domain may either be an appropriate + geometry element encapsulated in an element of this type or an XLink reference to a remote + geometry element (where remote includes geometry elements located elsewhere in the same + document). Either the reference or the contained element shall be given, but neither both + nor none. + + + + + + + + + + This property element either references a curve via the XLink-attributes or + contains the curve element. curveProperty is the predefined property which may be used by + GML Application Schemas whenever a GML feature has a property with a value that is + substitutable for AbstractCurve. + + + + + A container for an array of curves. The elements are always contained in the + array property, referencing geometry elements or arrays of geometry elements via XLinks is + not supported. + + + + + + + + + + + + + + + + + + + + + + + + + + A LineString is a special curve that consists of a single segment with linear + interpolation. It is defined by two or more coordinate tuples, with linear interpolation + between them. The number of direct positions in the list shall be at least + two. + + + + + + + + + + + + + + + A gml:Category has an optional XML attribute codeSpace, whose value is a URI + which identifies a dictionary, codelist or authority for the term. + + + + + + + + + + + + + + + + + + + + + + + An XML attribute uom ("unit of measure") is required, whose value is a URI + which identifies the definition of a ratio scale or units by which the numeric value shall + be multiplied, or an interval or position scale on which the value occurs. + + + + + + + + + + + + + gml:AbstractValue is an abstract element which acts as the head of a + substitution group which contains gml:AbstractScalarValue, gml:AbstractScalarValueList, + gml:CompositeValue and gml:ValueExtent, and (transitively) the elements in their + substitution groups. These elements may be used in an application schema as variables, so + that in an XML instance document any member of its substitution group may + occur. + + + + + gml:AbstractScalarValue is an abstract element which acts as the head of a + substitution group which contains gml:Boolean, gml:Category, gml:Count and gml:Quantity, and + (transitively) the elements in their substitution groups. + + + + + gml:AbstractScalarValueList is an abstract element which acts as the head of a + substitution group which contains gml:BooleanList, gml:CategoryList, gml:CountList and + gml:QuantityList, and (transitively) the elements in their substitution + groups. + + + + + This is a convenience choice group which unifies generic values defined in this + Clause with spatial and temporal objects and the measures described above, so that any of + these may be used within aggregate values. + + + + + + + + + + + Property that refers to, or contains, a Value. Convenience element for general + use. + + + + + Property that refers to, or contains, a Value. + + + + + + + + + + + + Property that contains Values. + + + + + + + + + + + gml:CompositeValue is an aggregate value built from other values . It contains + zero or an arbitrary number of gml:valueComponent elements, and zero or one + gml:valueComponents property elements. It may be used for strongly coupled aggregates + (vectors, tensors) or for arbitrary collections of values. + + + + + + + + + + + + + + + + A Value Array is used for homogeneous arrays of primitive and aggregate values. + The member values may be scalars, composites, arrays or lists. ValueArray has the same + content model as CompositeValue, but the member values shall be homogeneous. The element + declaration contains a Schematron constraint which expresses this restriction precisely. + Since the members are homogeneous, the gml:referenceSystem (uom, codeSpace) may be specified + on the gml:ValueArray itself and inherited by all the members if desired. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The content model is a straightforward extension of gml:AbstractFeatureType; it + automatically has the gml:identifier, gml:description, gml:descriptionReference, gml:name, + and gml:boundedBy properties. The gml:validTime element describes the time of the + observation. Note that this may be a time instant or a time period. The gml:using property + contains or references a description of a sensor, instrument or procedure used for the + observation. The gml:target property contains or references the specimen, region or station + which is the object of the observation. This property is particularly useful for remote + observations, such as photographs, where a generic location property might apply to the + location of the camera or the location of the field of view, and thus may be ambiguous. The + gml:subject element is provided as a convenient synonym for gml:target. This is the term + commonly used in phtotography. The gml:resultOf property indicates the result of the + observation. The value may be inline, or a reference to a value elsewhere. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A gml:DirectedObservation is the same as an observation except that it adds an + additional gml:direction property. This is the direction in which the observation was + acquired. Clearly this applies only to certain types of observations such as visual + observations by people, or observations obtained from terrestrial cameras. + + + + + + + + + + + + + + gml:DirectedObservationAtDistance adds an additional distance property. This is + the distance from the observer to the subject of the observation. Clearly this applies only + to certain types of observations such as visual observations by people, or observations + obtained from terrestrial cameras. + + + + + + + + + + + + + + The basic gml:Definition element specifies a definition, which can be included + in or referenced by a dictionary. The content model for a generic definition is a derivation + from gml:AbstractGMLType. The gml:description property element shall hold the definition if + this can be captured in a simple text string, or the gml:descriptionReference property + element may carry a link to a description elsewhere. The gml:identifier element shall + provide one identifier identifying this definition. The identifier shall be unique within + the dictionaries using this definition. The gml:name elements shall provide zero or more + terms and synonyms for which this is the definition. The gml:remarks element shall be used + to hold additional textual information that is not conceptually part of the definition but + is useful in understanding the definition. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sets of definitions may be collected into dictionaries or collections. A + gml:Dictionary is a non-abstract collection of definitions. The gml:Dictionary content model + adds a list of gml:dictionaryEntry properties that contain or reference gml:Definition + objects. A database handle (gml:id attribute) is required, in order that this collection may + be referred to. The standard gml:identifier, gml:description, gml:descriptionReference and + gml:name properties are available to reference or contain more information about this + dictionary. The gml:description and gml:descriptionReference property elements may be used + for a description of this dictionary. The derived gml:name element may be used for the + name(s) of this dictionary. for remote definiton references gml:dictionaryEntry shall be + used. If a Definition object contained within a Dictionary uses the descriptionReference + property to refer to a remote definition, then this enables the inclusion of a remote + definition in a local dictionary, giving a handle and identifier in the context of the local + dictionary. + + + + + + + + + + + + + + + + This property element contains or refers to the definitions which are members + of a dictionary. The content model follows the standard GML property pattern, so a + gml:dictionaryEntry may either contain or refer to a single gml:Definition. Since + gml:Dictionary is substitutable for gml:Definition, the content of an entry may itself be a + lower level dictionary. Note that if the value is provided by reference, this definition + does not carry a handle (gml:id) in this context, so does not allow external references to + this specific definition in this context. When used in this way the referenced definition + will usually be in a dictionary in the same XML document. + + + + + + + + + + + + + + + gml:NilReasonType defines a content model that allows recording of an + explanation for a void value or other exception. gml:NilReasonType is a union of the + following enumerated values: - inapplicable there is no value - missing the correct value is + not readily available to the sender of this data. Furthermore, a correct value may not exist + - template the value will be available later - unknown the correct value is not known to, + and not computable by, the sender of this data. However, a correct value probably exists - + withheld the value is not divulged - other:text other brief explanation, where text is a + string of two or more characters with no included spaces and - anyURI which should refer to + a resource which describes the reason for the exception A particular community may choose to + assign more detailed semantics to the standard values provided. Alternatively, the URI + method enables a specific or more complete explanation for the absence of a value to be + provided elsewhere and indicated by-reference in an instance document. gml:NilReasonType is + used as a member of a union in a number of simple content types where it is necessary to + permit a value from the NilReasonType union as an alternative to the primary + type. + + + + + + + + + + + + + + + + + + + + + + + + gml:SignType is a convenience type with values "+" (plus) and "-" + (minus). + + + + + + + + + Extension to the respective XML Schema built-in simple type to allow a choice + of either a value of the built-in simple type or a reason for a nil value. + + + + + + Extension to the respective XML Schema built-in simple type to allow a choice + of either a value of the built-in simple type or a reason for a nil value. + + + + + + Extension to the respective XML Schema built-in simple type to allow a choice + of either a value of the built-in simple type or a reason for a nil value. + + + + + + Extension to the respective XML Schema built-in simple type to allow a choice + of either a value of the built-in simple type or a reason for a nil value. + + + + + + Extension to the respective XML Schema built-in simple type to allow a choice + of either a value of the built-in simple type or a reason for a nil value. + + + + + + gml:CodeType is a generalized type to be used for a term, keyword or name. It + adds a XML attribute codeSpace to a term, where the value of the codeSpace attribute (if + present) shall indicate a dictionary, thesaurus, classification scheme, authority, or + pattern for the term. + + + + + + + + + + gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in + an instance. + + + + + + + + + + gml:MeasureType supports recording an amount encoded as a value of XML Schema + double, together with a units of measure indicated by an attribute uom, short for "units Of + measure". The value of the uom attribute identifies a reference system for the amount, + usually a ratio or interval scale. + + + + + + + + + + The simple type gml:UomIdentifer defines the syntax and value space of the unit + of measure identifier. + + + + + + This type specifies a character string of length at least one, and restricted + such that it must not contain any of the following characters: ":" (colon), " " (space), + (newline), (carriage return), (tab). This allows values corresponding to familiar + abbreviations, such as "kg", "m/s", etc. It is recommended that the symbol be an identifier + for a unit of measure as specified in the "Unified Code of Units of Measure" (UCUM) + (http://aurora.regenstrief.org/UCUM). This provides a set of symbols and a grammar for + constructing identifiers for units of measure that are unique, and may be easily entered + with a keyboard supporting the limited character set known as 7-bit ASCII. ISO 2955 formerly + provided a specification with this scope, but was withdrawn in 2001. UCUM largely follows + ISO 2955 with modifications to remove ambiguities and other problems. + + + + + + + + This type specifies a URI, restricted such that it must start with one of the + following sequences: "#", "./", "../", or a string of characters followed by a ":". These + patterns ensure that the most common URI forms are supported, including absolute and + relative URIs and URIs that are simple fragment identifiers, but prohibits certain forms of + relative URI that could be mistaken for unit of measure symbol . NOTE It is possible to + re-write such a relative URI to conform to the restriction (e.g. "./m/s"). In an instance + document, on elements of type gml:MeasureType the mandatory uom attribute shall carry a + value corresponding to either - a conventional unit of measure symbol, - a link to a + definition of a unit of measure that does not have a conventional symbol, or when it is + desired to indicate a precise or variant definition. + + + + + + + + This type is deprecated for tuples with ordinate values that are numbers. + CoordinatesType is a text string, intended to be used to record an array of tuples or + coordinates. While it is not possible to enforce the internal structure of the string + through schema validation, some optional attributes have been provided in previous versions + of GML to support a description of the internal structure. These attributes are deprecated. + The attributes were intended to be used as follows: Decimal symbol used for a decimal point + (default="." a stop or period) cs symbol used to separate components within a tuple or + coordinate string (default="," a comma) ts symbol used to separate tuples or coordinate + strings (default=" " a space) Since it is based on the XML Schema string type, + CoordinatesType may be used in the construction of tables of tuples or arrays of tuples, + including ones that contain mixed text and numeric values. + + + + + + + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + gml:CodeListType provides for lists of terms. The values in an instance element + shall all be valid according to the rules of the dictionary, classification scheme, or + authority identified by the value of its codeSpace attribute. + + + + + + + + + + gml:CodeOrNilReasonListType provides for lists of terms. The values in an + instance element shall all be valid according to the rules of the dictionary, classification + scheme, or authority identified by the value of its codeSpace attribute. An instance element + may also include embedded values from NilReasonType. It is intended to be used in situations + where a term or classification is expected, but the value may be absent for some + reason. + + + + + + + + + + gml:MeasureListType provides for a list of quantities. + + + + + + + + + + gml:MeasureOrNilReasonListType provides for a list of quantities. An instance + element may also include embedded values from NilReasonType. It is intended to be used in + situations where a value is expected, but the value may be absent for some + reason. + + + + + + + + + + This element has no type defined, and is therefore implicitly (according to the + rules of W3C XML Schema) an XML Schema anyType. It is used as the head of an XML Schema + substitution group which unifies complex content and certain simple content elements used + for datatypes in GML, including the gml:AbstractGML substitution group. + + + + + The abstract element gml:AbstractGML is "any GML object having identity". It + acts as the head of an XML Schema substitution group, which may include any element which is + a GML feature, or other object, with identity. This is used as a variable in content models + in GML core and application schemas. It is effectively an abstract superclass for all GML + objects. + + + + + + + + + + + + + + + + + + + + XLink components are the standard method to support hypertext referencing in + XML. An XML Schema attribute group, gml:AssociationAttributeGroup, is provided to support + the use of Xlinks as the method for indicating the value of a property by reference in a + uniform manner in GML. + + + + + + deprecated + + + + + + Applying this pattern shall restrict the multiplicity of objects in a property + element using this content model to exactly one. An instance of this type shall contain an + element representing an object, or serve as a pointer to a remote object. Applying the + pattern to define an application schema specific property type allows to restrict - the + inline object to specified object types, - the encoding to "by-reference only" (see + 7.2.3.7), - the encoding to "inline only" (see 7.2.3.8). + + + + + + + + + + + + Encoding a GML property inline vs. by-reference shall not imply anything about + the "ownership" of the contained or referenced GML Object, i.e. the encoding style shall not + imply any "deep-copy" or "deep-delete" semantics. To express ownership over the contained or + referenced GML Object, the gml:OwnershipAttributeGroup attribute group may be added to + object-valued property elements. If the attribute group is not part of the content model of + such a property element, then the value may not be "owned". When the value of the owns + attribute is "true", the existence of inline or referenced object(s) depends upon the + existence of the parent object. + + + + + + This element shows how an element declaration may include a Schematron + constraint to limit the property to act in either inline or by-reference mode, but not + both. + + + + + gml:abstractReference may be used as the head of a subtitution group of more + specific elements providing a value by-reference. + + + + + gml:ReferenceType is intended to be used in application schemas directly, if a + property element shall use a "by-reference only" encoding. + + + + + + + + gml:abstractInlineProperty may be used as the head of a subtitution group of + more specific elements providing a value inline. + + + + + + + + + + + If the value of an object property is another object and that object contains + also a property for the association between the two objects, then this name of the reverse + property may be encoded in a gml:reversePropertyName element in an appinfo annotation of the + property element to document the constraint between the two properties. The value of the + element shall contain the qualified name of the property element. + + + + + The value of this property is a text description of the object. gml:description + uses gml:StringOrRefType as its content model, so it may contain a simple text string + content, or carry a reference to an external description. The use of gml:description to + reference an external description has been deprecated and replaced by the + gml:descriptionReference property. + + + + + The value of this property is a remote text description of the object. The + xlink:href attribute of the gml:descriptionReference property references the external + description. + + + + + The gml:name property provides a label or identifier for the object, commonly a + descriptive name. An object may have several names, typically assigned by different + authorities. gml:name uses the gml:CodeType content model. The authority for a name is + indicated by the value of its (optional) codeSpace attribute. The name may or may not be + unique, as determined by the rules of the organization responsible for the codeSpace. In + common usage there will be one name per authority, so a processing application may select + the name from its preferred codeSpace. + + + + + Often, a special identifier is assigned to an object by the maintaining + authority with the intention that it is used in references to the object For such cases, the + codeSpace shall be provided. That identifier is usually unique either globally or within an + application domain. gml:identifier is a pre-defined property for such + identifiers. + + + + + The attribute gml:id supports provision of a handle for the XML element + representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, + so is constrained to be unique in the XML document within which it occurs. + + + + + To create a collection of GML Objects that are not all features, a property + type shall be derived by extension from gml:AbstractMemberType. This abstract property type + is intended to be used only in object types where software shall be able to identify that an + instance of such an object type is to be interpreted as a collection of objects. By default, + this abstract property type does not imply any ownership of the objects in the collection. + The owns attribute of gml:OwnershipAttributeGroup may be used on a property element instance + to assert ownership of an object in the collection. A collection shall not own an object + already owned by another object. + + + + + + + A GML Object Collection is any GML Object with a property element in its + content model whose content model is derived by extension from gml:AbstractMemberType. In + addition, the complex type describing the content model of the GML Object Collection may + also include a reference to the attribute group gml:AggregationAttributeGroup to provide + additional information about the semantics of the object collection. This information may be + used by applications to group GML objects, and optionally to order and index them. The + allowed values for the aggregationType attribute are defined by gml:AggregationType. See 8.4 + of ISO/IEC 11404:1996 for the meaning of the values in the enumeration. + + + + + + + + + + + + + + + + To associate metadata described by any XML Schema with a GML object, a property + element shall be defined whose content model is derived by extension from + gml:AbstractMetadataPropertyType. The value of such a property shall be metadata. The + content model of such a property type, i.e. the metadata application schema shall be + specified by the GML Application Schema. By default, this abstract property type does not + imply any ownership of the metadata. The owns attribute of gml:OwnershipAttributeGroup may + be used on a metadata property element instance to assert ownership of the metadata. If + metadata following the conceptual model of ISO 19115 is to be encoded in a GML document, the + corresponding Implementation Specification specified in ISO/TS 19139 shall be used to encode + the metadata information. + + + + + + + + + + + gml:AbstractTimeObject acts as the head of a substitution group for all + temporal primitives and complexes. + + + + + + + + + + gml:AbstractTimePrimitive acts as the head of a substitution group for + geometric and topological temporal primitives. + + + + + + + + + + + + + + gml:TimePrimitivePropertyType provides a standard content model for + associations between an arbitrary member of the substitution group whose head is + gml:AbstractTimePrimitive and another object. + + + + + + + + + + gml:validTime is a convenience property element. + + + + + gml:RelatedTimeType provides a content model for indicating the relative + position of an arbitrary member of the substitution group whose head is + gml:AbstractTimePrimitive. It extends the generic gml:TimePrimitivePropertyType with an XML + attribute relativePosition, whose value is selected from the set of 13 temporal + relationships identified by Allen (1983) + + + + + + + + + + + + + + + + + + + + + + + + + + + + gml:AbstractTimeComplex is an aggregation of temporal primitives and acts as + the head of a substitution group for temporal complexes. + + + + + + + + + + gml:TimeGeometricPrimitive acts as the head of a substitution group for + geometric temporal primitives. A temporal geometry shall be associated with a temporal + reference system through the frame attribute that provides a URI reference that identifies a + description of the reference system. Following ISO 19108, the Gregorian calendar with UTC is + the default reference system, but others may also be used. The GPS calendar is an + alternative reference systems in common use. The two geometric primitives in the temporal + dimension are the instant and the period. GML components are defined to support these as + follows. + + + + + + + + + + + + gml:TimeInstant acts as a zero-dimensional geometric primitive that represents + an identifiable position in time. + + + + + + + + + + + + + + gml:TimeInstantPropertyType provides for associating a gml:TimeInstant with an + object. + + + + + + + + + + gml:TimePeriod acts as a one-dimensional geometric primitive that represents an + identifiable extent in time. The location in of a gml:TimePeriod is described by the + temporal positions of the instants at which it begins and ends. The length of the period is + equal to the temporal distance between the two bounding temporal positions. Both beginning + and end may be described in terms of their direct position using gml:TimePositionType which + is an XML Schema simple content type, or by reference to an indentifiable time instant using + gml:TimeInstantPropertyType. Alternatively a limit of a gml:TimePeriod may use the + conventional GML property model to make a reference to a time instant described elsewhere, + or a limit may be indicated as a direct position. + + + + + + + + + + + + + + + + + + + + + + gml:TimePeriodPropertyType provides for associating a gml:TimePeriod with an + object. + + + + + + + + + + The method for identifying a temporal position is specific to each temporal + reference system. gml:TimePositionType supports the description of temporal position + according to the subtypes described in ISO 19108. Values based on calendars and clocks use + lexical formats that are based on ISO 8601, as described in XML Schema Part 2:2001. A + decimal value may be used with coordinate systems such as GPS time or UNIX time. A URI may + be used to provide a reference to some era in an ordinal reference system . In common with + many of the components modelled as data types in the ISO 19100 series of International + Standards, the corresponding GML component has simple content. However, the content model + gml:TimePositionType is defined in several steps. Three XML attributes appear on + gml:TimePositionType: A time value shall be associated with a temporal reference system + through the frame attribute that provides a URI reference that identifies a description of + the reference system. Following ISO 19108, the Gregorian calendar with UTC is the default + reference system, but others may also be used. Components for describing temporal reference + systems are described in 14.4, but it is not required that the reference system be described + in this, as the reference may refer to anything that may be indentified with a URI. For time + values using a calendar containing more than one era, the (optional) calendarEraName + attribute provides the name of the calendar era. Inexact temporal positions may be expressed + using the optional indeterminatePosition attribute. This takes a value from an + enumeration. + + + + + + + + + + + + These values are interpreted as follows: - "unknown" indicates that no specific + value for temporal position is provided. - "now" indicates that the specified value shall be + replaced with the current temporal position whenever the value is accessed. - "before" + indicates that the actual temporal position is unknown, but it is known to be before the + specified value. - "after" indicates that the actual temporal position is unknown, but it is + known to be after the specified value. A value for indeterminatePosition may - be used + either alone, or - qualify a specific value for temporal position. + + + + + + + + + + + The simple type gml:TimePositionUnion is a union of XML Schema simple types + which instantiate the subtypes for temporal position described in ISO 19108. An ordinal era + may be referenced via URI. A decimal value may be used to indicate the distance from the + scale origin . time is used for a position that recurs daily (see ISO 19108:2002 5.4.4.2). + Finally, calendar and clock forms that support the representation of time in systems based + on years, months, days, hours, minutes and seconds, in a notation following ISO 8601, are + assembled by gml:CalDate + + + + + + + + + This element is used directly as a property of gml:TimeInstant (see 15.2.2.3), + and may also be used in application schemas. + + + + + The length of a time period. + + + + + + + + + gml:duration conforms to the ISO 8601 syntax for temporal length as implemented + by the XML Schema duration type. + + + + + gml:timeInterval conforms to ISO 11404 which is based on floating point values + for temporal length. ISO 11404 syntax specifies the use of a positiveInteger together with + appropriate values for radix and factor. The resolution of the time interval is to one radix + ^(-factor) of the specified time unit. The value of the unit is either selected from the + units for time intervals from ISO 31-1:1992, or is another suitable unit. The encoding is + defined for GML in gml:TimeUnitType. The second component of this union type provides a + method for indicating time units other than the six standard units given in the + enumeration. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gml:TimeTopologyPrimitive acts as the head of a substitution group for + topological temporal primitives. Temporal topology primitives shall imply the ordering + information between features or feature properties. The temporal connection of features can + be examined if they have temporal topology primitives as values of their properties. + Usually, an instantaneous feature associates with a time node, and a static feature + associates with a time edge. A feature with both modes associates with the temporal topology + primitive: a supertype of time nodes and time edges. A topological primitive is always + connected to one or more other topological primitives, and is, therefore, always a member of + a topological complex. In a GML instance, this will often be indicated by the primitives + being described by elements that are descendents of an element describing a complex. + However, in order to support the case where a temporal topological primitive is described in + another context, the optional complex property is provided, which carries a reference to the + parent temporal topological complex. + + + + + + + + + + + + + + gml:TimeTopologyPrimitivePropertyType provides for associating a + gml:AbstractTimeTopologyPrimitive with an object. + + + + + + + + + + A temporal topology complex shall be the connected acyclic directed graph + composed of temporal topological primitives, i.e. time nodes and time edges. Because a time + edge may not exist without two time nodes on its boundaries, static features have time edges + from a temporal topology complex as the values of their temporal properties, regardless of + explicit declarations. A temporal topology complex expresses a linear or a non-linear graph. + A temporal linear graph, composed of a sequence of time edges, provides a lineage described + only by "substitution" of feature instances or feature element values. A time node as the + start or the end of the graph connects with at least one time edge. A time node other than + the start and the end shall connect to at least two time edges: one of starting from the + node, and another ending at the node. A temporal topological complex is a set of connected + temporal topological primitives. The member primtives are indicated, either by reference or + by value, using the primitive property. + + + + + + + + + + + + + + gml:TimeTopologyComplexPropertyType provides for associating a + gml:TimeTopologyComplex with an object. + + + + + + + + + + A time node is a zero-dimensional topological primitive that represents an + identifiable node in time (it is equivalent to a point in space). A node may act as the + termination or initiation of any number of time edges. A time node may be realised as a + geometry, its position, whose value is a time instant. + + + + + + + + + + + + + + + + gml:TimeNodePropertyType provides for associating a gml:TimeNode with an + object + + + + + + + + + + A time edge is a one-dimensional topological primitive. It is an open interval + that starts and ends at a node. The edge may be realised as a geometry whose value is a time + period. + + + + + + + + + + + + + + + + gml:TimeEdgePropertyType provides for associating a gml:TimeEdge with an + object. + + + + + + + + + + A reference system is characterized in terms of its domain of validity: the + spatial and temporal extent over which it is applicable. The basic GML element for temporal + reference systems is gml:TimeReferenceSystem. Its content model extends gml:DefinitionType + with one additional property, gml:domainOfValidity. + + + + + + + + + + + + + + A temporal coordinate system shall be based on a continuous interval scale + defined in terms of a single time interval. The differences to ISO 19108 TM_CoordinateSystem + are: - the origin is specified either using the property gml:originPosition whose value is a + direct time position, or using the property gml:origin whose model is + gml:TimeInstantPropertyType; this permits more flexibility in representation and also + supports referring to a value fixed elsewhere; - the interval uses + gml:TimeIntervalLengthType. + + + + + + + + + + + + + + + + + + A calendar is a discrete temporal reference system that provides a basis for + defining temporal position to a resolution of one day. gml:TimeCalendar adds one property to + those inherited from gml:TimeReferenceSystem. A gml:referenceFrame provides a link to a + gml:TimeCalendarEra that it uses. A gml:TimeCalendar may reference more than one calendar + era. The referenceFrame element follows the standard GML property model, allowing the + association to be instantiated either using an inline description using the + gml:TimeCalendarEra element, or a link to a gml:TimeCalendarEra which is explicit + elsewhere. + + + + + + + + + + + + + + gml:TimeCalendarEra inherits basic properties from gml:DefinitionType and has + the following additional properties: - gml:referenceEvent is the name or description of a + mythical or historic event which fixes the position of the base scale of the calendar era. + This is given as text or using a link to description held elsewhere. - gml:referenceDate + specifies the date of the referenceEvent expressed as a date in the given calendar. In most + calendars, this date is the origin (i.e., the first day) of the scale, but this is not + always true. - gml:julianReference specifies the Julian date that corresponds to the + reference date. The Julian day number is an integer value; the Julian date is a decimal + value that allows greater resolution. Transforming calendar dates to and from Julian dates + provides a relatively simple basis for transforming dates from one calendar to another. - + gml:epochOfUse is the period for which the calendar era was used as a basis for + dating. + + + + + + + + + + + + + + + + + gml:TimeCalendarPropertyType provides for associating a gml:TimeCalendar with + an object. + + + + + + + + + + gml:TimeCalendarEraPropertyType provides for associating a gml:TimeCalendarEra + with an object. + + + + + + + + + + A clock provides a basis for defining temporal position within a day. A clock + shall be used with a calendar in order to provide a complete description of a temporal + position within a specific day. gml:TimeClock adds the following properties to those + inherited from gml:TimeReferenceSystemType: - gml:referenceEvent is the name or description + of an event, such as solar noon or sunrise, which fixes the position of the base scale of + the clock. - gml:referenceTime specifies the time of day associated with the reference event + expressed as a time of day in the given clock. The reference time is usually the origin of + the clock scale. - gml:utcReference specifies the 24 hour local or UTC time that corresponds + to the reference time. - gml:dateBasis contains or references the calendars that use this + clock. + + + + + + + + + + + + + + + + + gml:TimeClockPropertyType provides for associating a gml:TimeClock with an + object. + + + + + + + + + + In some applications of geographic information — such as geology and + archaeology — relative position in time is known more precisely than absolute time or + duration. The order of events in time can be well established, but the magnitude of the + intervals between them cannot be accurately determined; in such cases, the use of an ordinal + temporal reference system is appropriate. An ordinal temporal reference system is composed + of a sequence of named coterminous eras, which may in turn be composed of sequences of + member eras at a finer scale, giving the whole a hierarchical structure of eras of verying + resolution. An ordinal temporal reference system whose component eras are not further + subdivided is effectively a temporal topological complex constrained to be a linear graph. + An ordinal temporal reference system some or all of whose component eras are subdivided is + effectively a temporal topological complex with the constraint that parallel branches may + only be constructed in pairs where one is a single temporal ordinal era and the other is a + sequence of temporal ordinal eras that are called "members" of the "group". This constraint + means that within a single temporal ordinal reference system, the relative position of all + temporal ordinal eras is unambiguous. The positions of the beginning and end of a given era + may calibrate the relative time scale. gml:TimeOrdinalReferenceSystem adds one or more + gml:component properties to the generic temporal reference system model. + + + + + + + + + + + + + + Its content model follows the pattern of gml:TimeEdge, inheriting standard + properties from gml:DefinitionType, and adding gml:start, gml:end and gml:extent properties, + a set of gml:member properties which indicate ordered gml:TimeOrdinalEra elements, and a + gml:group property which points to the parent era. The recursive inclusion of + gml:TimeOrdinalEra elements allow the construction of an arbitrary depth hierarchical + ordinal reference schema, such that an ordinal era at a given level of the hierarchy + includes a sequence of shorter, coterminous ordinal eras. + + + + + + + + + + + + + + + + + + + gml:TimeOrdinalEraPropertyType provides for associating a gml:TimeOrdinalEra + with an object. + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + + + + + + + + deprecated + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + deprecated + + + + + + + + + + deprecated + + + + + deprecated + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + deprecated + + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/opengis/xlink/1.0/xlink-1.0.xsd b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/opengis/xlink/1.0/xlink-1.0.xsd new file mode 100644 index 0000000..8d557f8 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/opengis/xlink/1.0/xlink-1.0.xsd @@ -0,0 +1,98 @@ + + + + xlinks.xsd v3.0b2 + 2001-07 + GML 3.0 candidate xlinks schema. Copyright (c) 2001 OGC, All Rights + Reserved. + + + + + + + + The 'show' attribute is used to communicate the desired presentation of the + ending resource on traversal from the starting resource; it's value should be treated as + follows: new - load ending resource in a new window, frame, pane, or other presentation + context replace - load the resource in the same window, frame, pane, or other presentation + context embed - load ending resource in place of the presentation of the starting resource + other - behavior is unconstrained; examine other markup in the link for hints none - + behavior is unconstrained + + + + + + + + + + + + + + The 'actuate' attribute is used to communicate the desired timing of traversal + from the starting resource to the ending resource; it's value should be treated as follows: + onLoad - traverse to the ending resource immediately on loading the starting resource + onRequest - traverse from the starting resource to the ending resource only on a + post-loading event triggered for this purpose other - behavior is unconstrained; examine + other markup in link for hints none - behavior is unconstrained + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/w3c/2008/06/xlink.xsd b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/w3c/2008/06/xlink.xsd new file mode 100644 index 0000000..b07860a --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/w3c/2008/06/xlink.xsd @@ -0,0 +1,273 @@ + + + + + This schema document provides attribute declarations and +attribute group, complex type and simple type definitions which can be used in +the construction of user schemas to define the structure of particular linking +constructs, e.g. + + + + + + + ... + + ... + + + ... +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Intended for use as the type of user-declared elements to make them + simple links. + + + + + + + + + + + + + + + + + + + + + + + + + Intended for use as the type of user-declared elements to make them + extended links. + Note that the elements referenced in the content model are all abstract. + The intention is that by simply declaring elements with these as their + substitutionGroup, all the right things will happen. + + + + + + + + + + + + + + xml:lang is not required, but provides much of the + motivation for title elements in addition to attributes, and so + is provided here for convenience. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + label is not required, but locators have no particular + XLink function if they are not labeled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + from and to have default behavior when values are missing + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/w3c/2009/01/xml.xsd b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/w3c/2009/01/xml.xsd new file mode 100644 index 0000000..79427b7 --- /dev/null +++ b/src/main/resources/org/opengis/cite/ogcapiprocesses10/xsd/w3c/2009/01/xml.xsd @@ -0,0 +1,36 @@ + + + + This schema document describes the XML namespace, in a form suitable for + import by other schema documents. See http://www.w3.org/XML/1998/namespace.html and + http://www.w3.org/TR/REC-xml for information about this namespace. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/test-run-props.xml b/src/main/resources/test-run-props.xml new file mode 100644 index 0000000..a5fcf35 --- /dev/null +++ b/src/main/resources/test-run-props.xml @@ -0,0 +1,7 @@ + + + + Sample test run arguments + http://www.w3schools.com/xml/note.xml + class-A,class-B + diff --git a/src/main/scripts/ctl/ogcapi-processes10-suite.ctl b/src/main/scripts/ctl/ogcapi-processes10-suite.ctl new file mode 100644 index 0000000..4f58451 --- /dev/null +++ b/src/main/scripts/ctl/ogcapi-processes10-suite.ctl @@ -0,0 +1,142 @@ + + + + + A Document node containing test run arguments (as XML properties). + The directory in which the test results will be written. + The test results as a Source object (root node). + Runs the ogcapi-processes10 ${version} test suite. + + + + + + + + OGC API - Processes Standard 1.0 Conformance Test Suite + Describe scope of testing. + tns:Main + + + + The test subject satisfies all applicable constraints. + + + +

OGC API - Processes Standard 1.0 Conformance Test Suite

+
+

The implementation under test (IUT) is checked against the following specifications:

+ +

Two conformance levels are defined:

+
    +
  • Level 1
  • +
  • Level 2
  • +
+
+
+ Implementation under test +

+

Location of IUT (absolute http: or file: URI)

+ + +

+

+

Upload IUT

+ + +

+

+ + + + + +

+
+

+ | + +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +See detailed test report in the TE_BASE/users/ directory. + + + + +Test method : + + + + + + All tests were skipped. One or more preconditions were not satisfied. + + + : + + + + +
+
+ + + + + + + + + + + + + +
diff --git a/src/site/asciidoc/changelog.adoc b/src/site/asciidoc/changelog.adoc new file mode 100644 index 0000000..d5f7cf0 --- /dev/null +++ b/src/site/asciidoc/changelog.adoc @@ -0,0 +1,7 @@ += Release Notes + +== ${project.version} (YYYY-MM-DD) + +The initial release implements the following test requirements: + +- all mandatory conformance classes (Class A, Class B) \ No newline at end of file diff --git a/src/site/asciidoc/how-to-run-the-tests.adoc b/src/site/asciidoc/how-to-run-the-tests.adoc new file mode 100644 index 0000000..5a9c385 --- /dev/null +++ b/src/site/asciidoc/how-to-run-the-tests.adoc @@ -0,0 +1,50 @@ +== How to run the tests + +The options for running the test suite are summarized below. + +As entry point the Landing Page of the OGC API - Processes Standard 1.0 is expected. + +=== 1. Integrated development environment (IDE) + +Use a Java IDE such as Eclipse, NetBeans, or IntelliJ. Clone the repository and build the project. + +Set the main class to run: `org.opengis.cite.ogcapiprocesses10.TestNGController` + +Arguments: The first argument must refer to an XML properties file containing the +required test run arguments. If not specified, the default location at `$ +{user.home}/test-run-props.xml` will be used. + +You can modify the sample file in `src/main/config/test-run-props.xml` + +[source,xml] +---- + + + + Test run arguments + https://host/capabilities + +---- + +The TestNG results file (`testng-results.xml`) will be written to a subdirectory +in `${user.home}/testng/` having a UUID value as its name. + +=== 2. Command shell (console) + +One of the build artifacts is an "all-in-one" JAR file that includes the test +suite and all of its dependencies; this makes it very easy to execute the test +suite in a command shell: + +`java -jar ets-ogcapi-processes10-0.1-SNAPSHOT-aio.jar [-o|--outputDir $TMPDIR] [test-run-props.xml]` + +=== 3. Docker + +This test suite comes with a Dockerfile which can be used to easily setup the OGC test harness with +the test suite. Details can be found on https://github.com/opengeospatial/cite/wiki/How-to-create-Docker-Images-of-test-suites#create-docker-image-and-create-and-start-docker-container[Create Docker Image and create and start Docker Container]. + +=== 4. OGC test harness + +Use https://github.com/opengeospatial/teamengine[TEAM Engine], the official OGC test harness. +The latest test suite release are usually available at the http://cite.opengeospatial.org/te2/[beta testing facility]. +You can also https://github.com/opengeospatial/teamengine[build and deploy] the test +harness yourself and use a local installation. \ No newline at end of file diff --git a/src/site/asciidoc/index.adoc b/src/site/asciidoc/index.adoc new file mode 100644 index 0000000..b429304 --- /dev/null +++ b/src/site/asciidoc/index.adoc @@ -0,0 +1,89 @@ += OGC API - Processes Standard 1.0 Conformance Test Suite + +== Scope + +This executable test suite (ETS) verifies the conformance of the implementation +under test (IUT) with respect to the set of relevant specifications depicted in +Figure 1. Conformance testing is a kind of "black box" testing that examines the +externally visible characteristics or behaviors of the IUT while disregarding +any implementation details. + +.Relevant specifications +[caption="Figure 1: "] +image::img/specifications.png[] + + + +Several conformance classes are defined in the principal specifications; the ones +listed below are covered by this test suite: + +* Class A + - List capabilities of conformance class A +* Class B + - List capabilities of conformance class B + +== Test requirements + +The documents listed below stipulate requirements that must be satisfied by a +conforming implementation. + +1. http://www.w3.org/TR/WCAG20/[Web Content Accessibility Guidelines (WCAG) 2.0] +2. http://www.w3.org/TR/xml/[Extensible Markup Language (XML) 1.0, Fifth Edition] +3. https://tools.ietf.org/html/rfc7231)[RFC 7231] - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content + +If any of the following preconditions are not satisfied then all tests in the +suite will be marked as skipped. + +1. Precondition 1 +2. Precondition 2 + +== Test suite structure + +The test suite definition file (testng.xml) is located in the root package, +`org.opengis.cite.ogcapiprocesses10`. A conformance class corresponds to a <test> element, each +of which includes a set of test classes that contain the actual test methods. +The general structure of the test suite is shown in Table 1. + +.Test suite structure +[cols="2,6a",options=header] +|=== +|Conformance class +|Test classes + +|Conformance Level 1 +|org.opengis.cite.ogcapiprocesses10.level1.* + +|Conformance Level 2 +|org.opengis.cite.ogcapiprocesses10.level2.* + +|=== + +The Javadoc documentation provides more detailed information about the test +methods that constitute the suite. + +include::how-to-run-the-tests.adoc[] + +== Using the REST API + +Using the REST API of the TEAM Engine requires some run arguments. These ate summarized in Table 2. +The _Obligation_ descriptor can have the following values: M (mandatory), O (optional), or C (conditional). + +.Test run arguments +[cols="1,1,1,6",options=header] +|=== +|Name +|Value domain +|Obligation +|Description + +|iut +|URI +|M +|A URI that refers to the implementation under test or metadata about it. Ampersand ('&') characters must be percent-encoded as '%26'. + +|ics +|A comma-separated list of string values. +|O +|An implementation conformance statement that indicates which conformance classes or options are supported. + +|=== diff --git a/src/site/resources/css/site.css b/src/site/resources/css/site.css new file mode 100644 index 0000000..7094f12 --- /dev/null +++ b/src/site/resources/css/site.css @@ -0,0 +1,20 @@ +/* custom site styles */ +h1, h2, h3 {font-family: Verdana, sans-serif; color: #000099; text-align: left;} +h1 {font-size: 1.4em; margin-top: 2em;} +h2 {font-size: 1.2em;} +h3 {font-size: 1em; margin-bottom: 0.5em;} +pre { margin-top: 1em; margin-bottom: 1em; } +.figure {margin-top: 2em; margin-bottom: 2em; text-align:center;} +.tableblock { + padding: 10px; +} +th, td { + border-bottom: 1px solid #ddd; + padding: 5px; +} +tr:nth-child(even) { + background-color: #f2f2f2;} +th { + text-align: left; + background-color: LightCyan; +} \ No newline at end of file diff --git a/src/site/resources/img/ogc-logo.png b/src/site/resources/img/ogc-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..683dbdc87ea68a2f17976a500e5863b620e941be GIT binary patch literal 2812 zcmeH}do&Xc8^^IRY}8K^Nh+o$m&zrKR4(P#ESB4EMr_EIE>`aK!zi^RM!6Kinyg%! z6w0N!jpnw9Hl&3zLW{8M)j97!?_clV?>X;t&hvc#dCqe_=X;*#oF^59JfWnhp(rIK zrR3yj@4lhbjdYO*Y}BHgSWPJ@fE3CV?Eu_^!DTa;93B))rdG4;ujcc<34yl6I9h{2 zIHh|;P}0&3bdM7)i7+=yNDrB?U<&XM&h!eEHOR}a>lQAGfX*cHGZuG3z+`h>Q%az| zWMVc$GngWr6EWCah%Z^ZF2-aq;vO-9Mi^EGV_AtGx~kpHGzxU|6>$DI%| z**s!46ZeO$0ceC1d=r^oqB7dJ24Pg|EBQcV9B)$C(7%Dv?V4DENn?;6HBhQq=$j>) zffVu+7Q~ahVdnqif7*eY*xoaKX_hLP|>c?VprxKTpR= zNr6aC_Q%kn3A6X(V@HmwG$kppP7KK^3RUY*n!O&0HtFLJV`nHzAH0qBUn1^QfNkC{ zqe6cpQG4lk7B9lSa(ak)czp#B>s8$6_PjV}I9^I}eQ}%s0Cp%a>AW z!5@>WRL&Lq*z|BzhU58zYX_8jSF0?hmqA03_h{k}QS9fvzim(-f57(K!TE%LdioXa zN)XR%ZN8trb&L2-DCe|^&EIe`pN71`GN9Fx*B<(~(At%6=a$fZ+1Z^;5OtG`Yr%1jpry<(QWZ%9*0 zs?&W^GI4#P56qTxl03pG7{hSX*2-$mfCO`(r0v3rr(%&d)#^} zH^^S8b60HS7E72@eaXxzLXcg?bnn4pW*N-Mh<*@1u43!eRfec{!=ugzP^JuC$XzVV z_0EC;tOk9H<7lTzWrpx;BQ5dgchnc9<#gqE_Lnk|5aq1oDh66VsCIZWoHa`~vg&yW zf=opDb>w)w6ueqVL==tYxbA!UGD|};fy(l!IF&;Q9-RUmtGT;kx(qsD__-?;5t0!) z7-hzpybJmE@TpGbnXo%uEN+YH_u0ZsU8=*I*smUS z+8yG0bG=^*GKH=Mj`X>Qzhzw}WtLdpHB2M%vfY}It_T=?H2ZIq1Y?1IN21yv?(?dq z^(B~zLyetDN1ABs>=a`_!ZBI+Ea+s4t?o%RM^;{z!H~Kkfr-EEi0GjIK1@md>l?>? zT?=)#OGj=2+u>9Bi@b?(`7YY5ce?7A_8RxnpG40&aFq#C-bvaq3)s|#3tRTN%ac<2W7ua*}#WF;A>6UuPIt=wgQE%w*4 zJa5#G9yvTH2FCSswL}!TM!Wg5wFqL30z(>WX2k?G7JV!(p5EAC6P1Q1x?~Bm^){Ul zbVi|eI{4a;f;~RjK3{vKnnZQ^lA3kjd(tdYd7G8nZ1g$4nlo3wzRj@J$RxPcUv2tG z{bl8JeGin*aY1WBwGQ7a%um+Ru=nsf^kT?R)~%!0)>Ywm7b`>V1=Jcn>gt;HoqpXE z>oDW~V(yfV@8kO@)diB<6!ATzSQn8ylwEGE#|K>Yx_fx7Y0a)`|FHZG(MbU|b$K#s z84u&8Mm4{Z==lyGQIp1-ug#^rgZbSeJ{TOW`Y@a@+X(CruvQBp)W zeH-Q9248X(1edRN=*-1(eOGe8GO z*$#Ab7_?ljwXE~>-htV@dO9ue1x_*fgTBT-+U&bkk?tNcQaeXm`Cb2WKTjX0a)%E) za}^2egb?9AFT!6m$4muDvnIH48R|iXn>%LQoeeXEW?~oKnPxfvBzT?jE$v&SoGlF= z4m=L_=wISo!z1!;2aY2bv{3#oo~Vmo@)9&Eez@NA+3)M*wR66a-?%1XfU#u`&>FXY z5?A$uqp-h`)>e(pS8weUqoT*!m+C-(?+U^9DR$-lySP8+AVsk!%KGJw5M$W_-5&z_YCzqily8|fM0qE0enqLjQRTlm> zQ1MpH5!!qTW$_UY>an&D22MhB!z}o6pTC%FbAFGyCujQrP&XZZfWC+gYjzF`>{uGV zmc(*Nx5}wapBX!LZhgz8VeLf7G$8``HEhd>$t-#R|Euz!YEvJXmn(N0xEI*fqHobxztdb#D1N_%G!YyCP@a!2>aCn|9Sk$neLQ z=*yoylcCO%Lv_P_L-q!k#(1xcm?tuFY?(SD+Dum>P1(&QJP$#&e;>Um+yA51!6M3{ zqIt{WJQE!CV>LnM&g3qTsB<^UH#M@N)LFq)DYp==iZXQw(pmpLh(`()R^+=Y&loBX z1fOFm4Fv{GO4Ar0{3=_lC<{U3*Kevis0T(8fyVqJ(ON^FXzNp91+e9wY2DxR;0rGW nd3q-PejDq8msR!px2%Jrs`N?E;ri9D#uV0)rRy{pWU7SDij}PMUDFm*v1q%-HxC zAjYF+2xG0WfOagPB7yYA;GWZJX6MmSShyn!b`AlI;4t18aBBzYh@p*)VY4VaM|gll zBr%Z)oKvH=cOuRqF#EDM9GE4`Y3tIS(}3rg&h}2gP)l(qz$HziQL`q$anzpWl zlmwtBCnP2Tgdu>65P*aNtaLG96d(r;IK$=_=79km+5-))v5=RMA?f6h{SfIW;IgiS zf*jC=1vDg(ewdntd2|dGW`)4`VX!$Ao}YM#BqFt|6Yzrr3uIa`4JgKR?k|nxfEWaA zppTM6si~_W7Sj;UsLuVAol(Gksl|i<1qon{0*n(8R>=J;^dB>b6SnR9$)H1Qt?c&x z{ewe+=zDrU-j4xi9fCPHxCOpW&Yll3JNrPLu!Nf+BPd@!q__yVOEoYp?Cx>Ns4cvE z0<8@w9e|@WY&-fv9lb@V_gt}_pF)d_GBOLMFWY-LOkQz+mZ@4)rAkl9U*h&y@BX0E z-N`;6ocUpMp{r^AQ_|<*V?$5ZjkaH(%InZQVvxSbmAMJgih>iRAo&*H^fxiXjqa~b z9+hoY9Rz>=g4Zv@i=I{mLqp%3)}!rC~*<*f*pPLg!i{qwc;NPO}Z72%I zrOgKrH_izr&E_^Y;Kt_Wyelfa_?a7y)Tc?&M`aJ0iHon7I&r~a8a|+{^=BQ2D;H>n zCTf}e6I=KQ)X8Cw$l*4>ELy_gi!C5f^G3{RNJ@uT;6d@!j5BIpFVl&a?+Aj;{qMD* zQorhHKGKObLV$3L=P*CF3D}G8Du4XX^&{!0vWJ_f7yC0uz63q|bsYx}w&*$gMOYrL zCit=Kc<)J-Sd&|dVJBfxoQAcQvad$_5umr8X@QW{L76e7kyVklhacX_+6Ux}^uJSA zNlwmFT-`Q0s5~M-fK)#`j=HC7TP?#r{GcDSeT+E`A28ijE_mO~my6^JsCRyf|NP4N%oApGYy*ckmsd}B%MU$8 zooX{>qB;kbLin{XOKnNshaU*`@gE6Kn!YKP<;?RGniC<+2PcRc!j_x1&9r{eZBcVY zc)ii$zW|jgvzEi3(FnNRO5}*wO-eR60@35Kb~)k$yW?P%;u!V$#p_o4q-T_tmh5+% zUY+;>I?nVKJJ|SR7(_z5cv~ft4VcE7+bCBx+X-}V=RUl>CYOTO&%vVdkCKYo${t4e z4@|}PDsJKRJt10p#`~{}LnF7N7@LDNUo~^G<9AKKQQAL^i{uj<2Ch!V(q2 zvaaK6Y^9vVZq7DhrQ@>=?rn@@W2NJY4DLoSdoB%Qw`048LyzlyhSBp1ht)wol40ji zAed1i>>kO@NAfHCe0IJ)5F8Ztj20ZFoJh$wM}_=xM?7%A@uRNmjUY0!Q!cD83U-F@ z$`=kxg8nylx(z^`*?GqxlFaxPblf+#Mtrg2S(h>>E%}BRRGsAXx#deu9e?0q<^qH| zRazt~eSM_+hX6lplmTw&PMY!cs7UIi8%tsXMHdx4`AdF5;hij`Xd~qAmLUjOU!PdU zFMd=~xqZ%c9-yCzn8FCxhy6LWkXIMG?%1G?BSp}Jj zjTP57rx-KjkgJQ>rLCu%k+9`9e9>;7>~fsrypz$_*T6%rv~1jN=!n+xJwYvqr|8$? zST>8>v43@<`c|$SbU0*BWiv9JZP{9#4os94opXsbFPzt~E*}KI6di1>3)U81upG6}ZahB}VUWC2smZm|nJ>xn@fv4hLm!B9z#OKcgbD{cL zp7AS{Lpr%H_7pq<`=i;4+2ao2R&~r3pupoo!x+Q#xsOCh@L z-yF@Jd&ZkrD|FSKlJIfX>p?T&SYc1DK2O~xRno2p|DFSEa=m+@eooi5I$z}7|NI5t zFf~q7AW>u28I~^YKSzgKSnKlrR(QiS?@ja2r=YiCNdi3dFHrRkYKcZ>-3^oa0>`G! z&Uni$lk5rpv+M+>Wdc0+Z~^_e<+++OqY6WtA7+1knfc-hA9(| z0=T>Es>Q0zo|M|Ks4)}I{yecL8#?0`A8=dj72F;hz606c7rD85(s{hQ5+n3h?&J+O z85d>yy=w2l2hTt|Pge3G;r?$El@yngi?UrJ3!j`W2eTupp*cE=rN(Uj(m-J@a#6zX zjs?aCPb55HSgvxcS07~(1e6S9EUu(p`5?o1^9Q{6k-=}td^fLHawD+lIW@-4LJD@< zWpgGdX0NypYks;;QymFDtN%2io|^A3S6y|cb0v##XnXZop;3GC6Zg&Lk>|^xq?bpG{oLmLGkCas`;>uN57+Lxrm@b97p5AN5OlGA)eMq*;L}Pcm zPl>3K_+HQq;p2+#)b?7(`?P&y<3;gmIEr=u(@ugLW4uIU=t51SqULiMw3T(U;+T3K zm$z5D)>(_1;*JeUW=ork0spJq*I@}Y`W@j}f_>Jh9nI`t``>|XFi9rg#L|YE)mGNf z0p@JXsAs8#b40z;A^g(~IPpjIlZWywK{t`aJ6kuk4!>zQDrO-8&urnYOBWfOxSJG5 zxTfM8OS=>FDQ)*Jv*q5ckiF2mdJ$FU$wtSH6dw1+$S*0VP|1EgLN^9 zv1BmumJrTv$e=Kk!!!TrR(fRe`x{X|kw%$MRVDE=7mu?%h3@B_qU3B8ZqVt$W$$u^ zkZLfX*B<6Qi#a4QkzFMk8f4qOh-qUdzu6_$s8Q1e7;1 zb3;qh?2UeB8ru07Gsjsa3oor$*ZB7`+5K162<~fwQ%@bDNzjwu=+rj|{heg}zqR8C zg|50m-`C0hIjXO?!!A6|AtP(Qr;i@2W14cYm~I9+ll)6!NuiJ*Np1(kRZ zRj|cRJuVKW@@x#c_wa7%4-07(M^_e)OGP%~HcOt@=@X9_F z-9>|?yKtIA%*^}NyzXL7(PC2i1@o_=#cFR>sD9@R=Z}-{<<$z&$&Gz}8K=UoB=?!y zn1ad#o;}!gBs>1l#d*J<&AsyrAK>j$wg1I)deDmi;*;-<9A>^f2q~mm3`gN&kjn;Y^}JbDv&Kb;3vNe+w&K#ox!%jswYXbA z&?KuxdFDI@$II21(Il24bLoA4y0d{=vDSd=3+<%q>QerF$0r@d{}=XQ@`3btyrR-% z*21q=l}k#HXXPh%3#)kqqv4dVZO(UU`7gB|`lYg2@4=Ubie%Xz%lFNr!o|MV9R1ZY b)$Vak>mJsg4B@N%+B{pDS;31 + + + + org.apache.maven.skins + maven-fluido-skin + 1.5 + + + + true + + + + + ${project.name} + ./img/ogc-logo.png + http://cite.opengeospatial.org/ + + + + + + + + + + + + + + diff --git a/src/test/java/org/opengis/cite/ogcapiprocesses10/VerifyETSAssert.java b/src/test/java/org/opengis/cite/ogcapiprocesses10/VerifyETSAssert.java new file mode 100644 index 0000000..35cd790 --- /dev/null +++ b/src/test/java/org/opengis/cite/ogcapiprocesses10/VerifyETSAssert.java @@ -0,0 +1,73 @@ +package org.opengis.cite.ogcapiprocesses10; + +import java.io.IOException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import javax.xml.validation.Validator; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +public class VerifyETSAssert { + + private static final String WADL_NS = "http://wadl.dev.java.net/2009/02"; + private static DocumentBuilder docBuilder; + private static SchemaFactory factory; + @Rule + public ExpectedException thrown = ExpectedException.none(); + + public VerifyETSAssert() { + } + + @BeforeClass + public static void setUpClass() throws ParserConfigurationException { + factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + docBuilder = dbf.newDocumentBuilder(); + } + + @Test + public void validateUsingSchemaHints_expect2Errors() throws SAXException { + thrown.expect(AssertionError.class); + thrown.expectMessage("2 schema validation error(s) detected"); + URL url = this.getClass().getResource("/Gamma.xml"); + Schema schema = factory.newSchema(); + Validator validator = schema.newValidator(); + ETSAssert + .assertSchemaValid(validator, new StreamSource(url.toString())); + } + + @Test + public void assertXPathWithNamespaceBindings() throws SAXException, + IOException { + Document doc = docBuilder.parse(this.getClass().getResourceAsStream( + "/capabilities-simple.xml")); + Map nsBindings = new HashMap(); + nsBindings.put(WADL_NS, "ns1"); + String xpath = "//ns1:resources"; + ETSAssert.assertXPath(xpath, doc, nsBindings); + } + + @Test + public void assertXPath_expectFalse() throws SAXException, IOException { + thrown.expect(AssertionError.class); + thrown.expectMessage("Unexpected result evaluating XPath expression"); + Document doc = docBuilder.parse(this.getClass().getResourceAsStream( + "/capabilities-simple.xml")); + // using built-in namespace binding + String xpath = "//ows:OperationsMetadata/ows:Constraint[@name='XMLEncoding']/ows:DefaultValue = 'TRUE'"; + ETSAssert.assertXPath(xpath, doc, null); + } +} diff --git a/src/test/java/org/opengis/cite/ogcapiprocesses10/VerifySuiteFixtureListener.java b/src/test/java/org/opengis/cite/ogcapiprocesses10/VerifySuiteFixtureListener.java new file mode 100644 index 0000000..ca0e70c --- /dev/null +++ b/src/test/java/org/opengis/cite/ogcapiprocesses10/VerifySuiteFixtureListener.java @@ -0,0 +1,70 @@ +package org.opengis.cite.ogcapiprocesses10; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.mockito.Matchers; +import org.testng.ISuite; +import org.testng.xml.XmlSuite; + +public class VerifySuiteFixtureListener { + + private static XmlSuite xmlSuite; + private static ISuite suite; + + public VerifySuiteFixtureListener() { + } + + @BeforeClass + public static void setUpClass() { + xmlSuite = mock(XmlSuite.class); + suite = mock(ISuite.class); + when(suite.getXmlSuite()).thenReturn(xmlSuite); + } + + @AfterClass + public static void tearDownClass() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + @Test(expected = IllegalArgumentException.class) + public void noSuiteParameters() { + Map params = new HashMap(); + when(xmlSuite.getParameters()).thenReturn(params); + SuiteFixtureListener iut = new SuiteFixtureListener(); + iut.onStart(suite); + } + + @Test + public void processIUTParameter() throws URISyntaxException { + URL url = this.getClass().getResource("/atom-feed.xml"); + Map params = new HashMap(); + params.put(TestRunArg.IUT.toString(), url.toURI().toString()); + when(xmlSuite.getParameters()).thenReturn(params); + SuiteFixtureListener iut = new SuiteFixtureListener(); + iut.onStart(suite); + verify(suite).setAttribute( + Matchers.eq(SuiteAttribute.TEST_SUBJ_FILE.getName()), + Matchers.isA(File.class)); + } + +} diff --git a/src/test/java/org/opengis/cite/ogcapiprocesses10/VerifyTestNGController.java b/src/test/java/org/opengis/cite/ogcapiprocesses10/VerifyTestNGController.java new file mode 100644 index 0000000..4d3125b --- /dev/null +++ b/src/test/java/org/opengis/cite/ogcapiprocesses10/VerifyTestNGController.java @@ -0,0 +1,71 @@ +package org.opengis.cite.ogcapiprocesses10; + +import static org.junit.Assert.*; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.URL; +import java.util.InvalidPropertiesFormatException; +import java.util.Properties; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Source; + +import net.sf.saxon.s9api.XdmValue; + +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.opengis.cite.ogcapiprocesses10.util.XMLUtils; +import org.w3c.dom.Document; + +/** + * Verifies the results of executing a test run using the main controller + * (TestNGController). + * + */ +public class VerifyTestNGController { + + private static DocumentBuilder docBuilder; + private Properties testRunProps; + + @BeforeClass + public static void initParser() throws ParserConfigurationException { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + dbf.setValidating(false); + dbf.setFeature( + "http://apache.org/xml/features/nonvalidating/load-external-dtd", + false); + docBuilder = dbf.newDocumentBuilder(); + } + + @Before + public void loadDefaultTestRunProperties() + throws InvalidPropertiesFormatException, IOException { + this.testRunProps = new Properties(); + this.testRunProps.loadFromXML(getClass().getResourceAsStream( + "/test-run-props.xml")); + } + + @Test + public void doTestRun() throws Exception { + URL testSubject = getClass().getResource("/atom-feed-2.xml"); + this.testRunProps.setProperty(TestRunArg.IUT.toString(), testSubject + .toURI().toString()); + ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024); + this.testRunProps.storeToXML(outStream, "Integration test"); + Document testRunArgs = docBuilder.parse(new ByteArrayInputStream( + outStream.toByteArray())); + TestNGController controller = new TestNGController(); + Source results = controller.doTestRun(testRunArgs); + String xpath = "/testng-results/@failed"; + XdmValue failed = XMLUtils.evaluateXPath2(results, xpath, null); + int numFailed = Integer.parseInt(failed.getUnderlyingValue() + .getStringValue()); + assertEquals("Unexpected number of fail verdicts.", 2, numFailed); + } +} diff --git a/src/test/java/org/opengis/cite/ogcapiprocesses10/level1/VerifyCapability1Tests.java b/src/test/java/org/opengis/cite/ogcapiprocesses10/level1/VerifyCapability1Tests.java new file mode 100644 index 0000000..e6129cd --- /dev/null +++ b/src/test/java/org/opengis/cite/ogcapiprocesses10/level1/VerifyCapability1Tests.java @@ -0,0 +1,72 @@ +package org.opengis.cite.ogcapiprocesses10.level1; + +import java.io.IOException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import org.testng.ISuite; +import org.testng.ITestContext; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +/** + * Verifies the behavior of the Capability1Tests test class. Test stubs replace + * fixture constituents where appropriate. + */ +public class VerifyCapability1Tests { + + private static final String SUBJ = "testSubject"; + private static DocumentBuilder docBuilder; + private static ITestContext testContext; + private static ISuite suite; + + public VerifyCapability1Tests() { + } + + @BeforeClass + public static void setUpClass() throws Exception { + testContext = mock(ITestContext.class); + suite = mock(ISuite.class); + when(testContext.getSuite()).thenReturn(suite); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + docBuilder = dbf.newDocumentBuilder(); + } + + @AfterClass + public static void tearDownClass() throws Exception { + } + + @Test(expected = AssertionError.class) + public void testIsEmpty() { + Capability1Tests iut = new Capability1Tests(); + iut.isEmpty(); + } + + @Test + public void testTrim() { + Capability1Tests iut = new Capability1Tests(); + iut.trim(); + } + + @Test(expected = NullPointerException.class) + public void supplyNullTestSubject() throws SAXException, IOException { + Capability1Tests iut = new Capability1Tests(); + iut.docIsValidAtomFeed(); + } + + @Test + public void supplyValidAtomFeedViaTestContext() throws SAXException, + IOException { + Document doc = docBuilder.parse(this.getClass().getResourceAsStream( + "/atom-feed.xml")); + when(suite.getAttribute(SUBJ)).thenReturn(doc); + Capability1Tests iut = new Capability1Tests(); + iut.obtainTestSubject(testContext); + iut.docIsValidAtomFeed(); + } +} diff --git a/src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyURIUtils.java b/src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyURIUtils.java new file mode 100644 index 0000000..6326b24 --- /dev/null +++ b/src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyURIUtils.java @@ -0,0 +1,83 @@ +package org.opengis.cite.ogcapiprocesses10.util; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +/** + * Verifies the behavior of the URIUtils class. + */ +public class VerifyURIUtils { + + public VerifyURIUtils() { + } + + @BeforeClass + public static void setUpClass() { + } + + @Ignore + @Test + // comment out @Ignore to run test (requires network connection) + public void resolveHttpUriAsDocument() throws SAXException, IOException { + URI uriRef = URI.create("http://www.w3schools.com/xml/note.xml"); + Document doc = URIUtils.parseURI(uriRef); + Assert.assertNotNull(doc); + Assert.assertEquals("Document element has unexpected [local name].", + "note", doc.getDocumentElement().getLocalName()); + } + + @Ignore + @Test + // comment out @Ignore to run test (requires network connection) + public void resolveHttpUriAsFile() throws SAXException, IOException { + URI uriRef = URI.create("http://www.w3schools.com/xml/note.xml"); + File file = URIUtils.dereferenceURI(uriRef); + Assert.assertNotNull(file); + Assert.assertTrue("File should not be empty", file.length() > 0); + } + + @Test + public void resolveClasspathResource() throws SAXException, IOException, + URISyntaxException { + URL url = this.getClass().getResource("/atom-feed.xml"); + Document doc = URIUtils.parseURI(url.toURI()); + Assert.assertNotNull(doc); + Assert.assertEquals("Document element has unexpected [local name].", + "feed", doc.getDocumentElement().getLocalName()); + } + + @Test + public void resolveFileRefWithXInclude() throws SAXException, IOException, + URISyntaxException { + File file = new File("src/test/resources/Alpha-xinclude.xml"); + Document doc = URIUtils.parseURI(file.toURI()); + Assert.assertNotNull(doc); + Assert.assertEquals("Document element has unexpected [local name].", + "Alpha", doc.getDocumentElement().getLocalName()); + NodeList nodes = doc.getDocumentElement().getElementsByTagNameNS( + "http://www.example.net/gamma", "Gamma"); + Assert.assertEquals( + "Expected element {http://www.example.net/gamma}Gamma", 1, + nodes.getLength()); + } + + @Test(expected = IllegalArgumentException.class) + public void resolveMissingClasspathResource() throws SAXException, + URISyntaxException, IOException { + URL url = this.getClass().getResource("/alpha.xml"); + URI uri = (null != url) ? url.toURI() : null; + Document doc = URIUtils.parseURI(uri); + Assert.assertNull(doc); + } +} diff --git a/src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyValidationUtils.java b/src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyValidationUtils.java new file mode 100644 index 0000000..ab8e058 --- /dev/null +++ b/src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyValidationUtils.java @@ -0,0 +1,43 @@ +package org.opengis.cite.ogcapiprocesses10.util; + +import static org.junit.Assert.*; + +import java.io.File; +import java.io.FileNotFoundException; +import java.net.URI; +import java.util.Set; + +import javax.xml.stream.XMLStreamException; +import javax.xml.transform.stream.StreamSource; + +import org.junit.Test; +import org.opengis.cite.validation.SchematronValidator; + +/** + * Verifies the behavior of the ValidationUtils class. + */ +public class VerifyValidationUtils { + + public VerifyValidationUtils() { + } + + @Test + public void testBuildSchematronValidator() { + String schemaRef = "http://schemas.opengis.net/gml/3.2.1/SchematronConstraints.xml"; + String phase = ""; + SchematronValidator result = ValidationUtils.buildSchematronValidator( + schemaRef, phase); + assertNotNull(result); + } + + @Test + public void extractRelativeSchemaReference() throws FileNotFoundException, + XMLStreamException { + File xmlFile = new File("src/test/resources/Alpha-1.xml"); + Set xsdSet = ValidationUtils.extractSchemaReferences( + new StreamSource(xmlFile), null); + URI schemaURI = xsdSet.iterator().next(); + assertTrue("Expected schema reference */xsd/alpha.xsd", schemaURI + .toString().endsWith("/xsd/alpha.xsd")); + } +} diff --git a/src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyXMLUtils.java b/src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyXMLUtils.java new file mode 100644 index 0000000..5856e80 --- /dev/null +++ b/src/test/java/org/opengis/cite/ogcapiprocesses10/util/VerifyXMLUtils.java @@ -0,0 +1,147 @@ +package org.opengis.cite.ogcapiprocesses10.util; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.xpath.XPathExpressionException; +import net.sf.saxon.s9api.SaxonApiException; +import net.sf.saxon.s9api.XdmValue; +import net.sf.saxon.trans.XPathException; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +/** + * Verifies the behavior of the XMLUtils class. + */ +public class VerifyXMLUtils { + + private static final String ATOM_NS = "http://www.w3.org/2005/Atom"; + private static final String EX_NS = "http://example.org/ns1"; + private static DocumentBuilder docBuilder; + + public VerifyXMLUtils() { + } + + @BeforeClass + public static void setUpClass() throws Exception { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + docBuilder = dbf.newDocumentBuilder(); + } + + @Test + public void writeDocToString() throws SAXException, IOException { + Document doc = docBuilder.parse(this.getClass().getResourceAsStream( + "/atom-feed.xml")); + String content = XMLUtils.writeNodeToString(doc); + Assert.assertTrue("String should start with ' nsBindings = new HashMap(); + nsBindings.put(ATOM_NS, "tns"); + nsBindings.put(EX_NS, "ns1"); + NodeList results = XMLUtils.evaluateXPath(doc, expr, nsBindings); + Assert.assertTrue("Expected 1 node in results.", + results.getLength() == 1); + Assert.assertEquals("author", results.item(0).getLocalName()); + } + + @Test + public void evaluateXPathExpression_noMatch() + throws XPathExpressionException, SAXException, IOException { + Document doc = docBuilder.parse(this.getClass().getResourceAsStream( + "/atom-feed.xml")); + String expr = "/tns:feed/tns:author[ns1:blog]"; + Map nsBindings = new HashMap(); + nsBindings.put(ATOM_NS, "tns"); + nsBindings.put(EX_NS, "ns1"); + NodeList results = XMLUtils.evaluateXPath(doc, expr, nsBindings); + Assert.assertTrue("Expected empty results.", results.getLength() == 0); + } + + @Test(expected = XPathExpressionException.class) + public void evaluateXPathExpression_booleanResult() + throws XPathExpressionException, SAXException, IOException { + Document doc = docBuilder.parse(this.getClass().getResourceAsStream( + "/atom-feed.xml")); + String expr = "count(//tns:entry) > 0"; + Map nsBindings = new HashMap(); + nsBindings.put(ATOM_NS, "tns"); + NodeList results = XMLUtils.evaluateXPath(doc, expr, nsBindings); + Assert.assertNull(results); + } + + @Test + public void createElement_Alpha() { + QName qName = new QName("http://example.org", "Alpha"); + Element elem = XMLUtils.createElement(qName); + Assert.assertEquals("Alpha", elem.getLocalName()); + Assert.assertNull(elem.getParentNode()); + Assert.assertNotNull(elem.getOwnerDocument()); + } + + @Test + public void evaluateXPath2ExpressionAgainstDocument() throws SAXException, + IOException, SaxonApiException, XPathException { + Document doc = docBuilder.parse(this.getClass().getResourceAsStream( + "/atom-feed.xml")); + String expr = "matches(//tns:entry/tns:title, '.*Robots')"; + Map nsBindings = new HashMap(); + nsBindings.put(ATOM_NS, "tns"); + XdmValue result = XMLUtils.evaluateXPath2(new DOMSource(doc), expr, + nsBindings); + Assert.assertTrue("Expected non-empty result.", result.size() > 0); + Assert.assertEquals("Result has unexpected string value.", "true", + result.getUnderlyingValue().getStringValue()); + } + + @Test + public void evaluateXPath2ExpressionAgainstElement() throws SAXException, + IOException, SaxonApiException, XPathException { + Document doc = docBuilder.parse(this.getClass().getResourceAsStream( + "/atom-feed.xml")); + Node entry = doc.getElementsByTagNameNS(ATOM_NS, "entry").item(0); + String expr = "matches(tns:title, '.*Robots')"; + Map nsBindings = new HashMap(); + nsBindings.put(ATOM_NS, "tns"); + XdmValue result = XMLUtils.evaluateXPath2(new DOMSource(entry), expr, + nsBindings); + Assert.assertTrue("Expected non-empty result.", result.size() > 0); + Assert.assertEquals("Result has unexpected string value.", "true", + result.getUnderlyingValue().getStringValue()); + } + + @Test + public void expandCharacterEntity() { + String text = "Ce n'est pas"; + String result = XMLUtils.expandReferencesInText(text); + Assert.assertTrue("Expected result to contain an apostrophe (')", + result.contains("'")); + } + + @Test + public void expandNumericCharacterReference() { + String text = "Montréal"; + String result = XMLUtils.expandReferencesInText(text); + Assert.assertEquals("Expected result to contain character é (U+00E9)", + "Montréal", result); + } +} diff --git a/src/test/resources/Alpha-1.xml b/src/test/resources/Alpha-1.xml new file mode 100644 index 0000000..c004241 --- /dev/null +++ b/src/test/resources/Alpha-1.xml @@ -0,0 +1,17 @@ + + + urn:uuid:191985c0-098c-11e1-be50-0800200c9a66 + + + String value + + + 20111107 + FALSE + + + + + diff --git a/src/test/resources/Alpha-xinclude.xml b/src/test/resources/Alpha-xinclude.xml new file mode 100644 index 0000000..1979d77 --- /dev/null +++ b/src/test/resources/Alpha-xinclude.xml @@ -0,0 +1,14 @@ + + + urn:uuid:191985c0-098c-11e1-be50-0800200c9a66 + + + String value + + + + + + diff --git a/src/test/resources/Gamma.xml b/src/test/resources/Gamma.xml new file mode 100644 index 0000000..cd9586b --- /dev/null +++ b/src/test/resources/Gamma.xml @@ -0,0 +1,7 @@ + + + 20111107 + FALSE + diff --git a/src/test/resources/atom-feed-2.xml b/src/test/resources/atom-feed-2.xml new file mode 100644 index 0000000..356b3f9 --- /dev/null +++ b/src/test/resources/atom-feed-2.xml @@ -0,0 +1,23 @@ + + + + Example Feed + A subtitle. + + + urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6 + 2012-05-01T18:30:02Z + + John Doe + johndoe@example.com + + + Atom-Powered Robots Run Amok + + + + urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a + 2012-05-01T18:30:02Z + Summary text. + + \ No newline at end of file diff --git a/src/test/resources/atom-feed.xml b/src/test/resources/atom-feed.xml new file mode 100644 index 0000000..d253c38 --- /dev/null +++ b/src/test/resources/atom-feed.xml @@ -0,0 +1,24 @@ + + + Example Feed + A subtitle. + + + urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6 + 2012-05-01T18:30:02Z + + John Doe + johndoe@example.com + tel:+1-201-555-0123 + + + Atom-Powered Robots Run Amok + + + + urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a + 2012-05-01T18:30:02Z + Summary text. + + \ No newline at end of file diff --git a/src/test/resources/capabilities-simple.xml b/src/test/resources/capabilities-simple.xml new file mode 100644 index 0000000..8d9dda8 --- /dev/null +++ b/src/test/resources/capabilities-simple.xml @@ -0,0 +1,149 @@ + + + + + wfs + 2.0.0 + + + ACME Corp + + Phileas Fogg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TRUE + + + + FALSE + + + + FALSE + + + + FALSE + + + + TRUE + + + + FALSE + + + + FALSE + + + + FALSE + + + + FALSE + + + + FALSE + + + + FALSE + + + + FALSE + + + + FALSE + + + + FALSE + + + + FALSE + + + + + + + + + + + + + + + + + + tns:Alpha + urn:ogc:def:crs:EPSG::4326 + + -5.90 35.00 + 32.19 71.96 + + + + + + + + true + + + + + diff --git a/src/test/resources/xsd/gamma.xsd b/src/test/resources/xsd/gamma.xsd new file mode 100644 index 0000000..024f466 --- /dev/null +++ b/src/test/resources/xsd/gamma.xsd @@ -0,0 +1,13 @@ + + + + + + + + + + +