This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-3.1 in repository https://gitbox.apache.org/repos/asf/sis.git
commit 86bb5bbf6b5b3c94e23e76b0c712818533d85fdd Merge: a143312778 0d58e3a7b4 Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Thu Nov 17 12:00:37 2022 +0100 Merge branch 'geoapi-4.0' into geoapi-3.1. This is the upgrade of metadata quality package from ISO 19115 to ISO 19157. https://issues.apache.org/jira/browse/SIS-394 .../org/apache/sis/feature/AbstractAttribute.java | 3 +- .../apache/sis/feature/DefaultAttributeType.java | 3 +- .../main/java/org/apache/sis/feature/Features.java | 6 +- .../apache/sis/internal/jaxb/FilterByVersion.java | 4 +- .../apache/sis/internal/jaxb/cat/CodeListUID.java | 10 +- .../sis/internal/jaxb/code/DQM_ValueStructure.java | 89 ++++ .../sis/internal/jaxb/code/package-info.java | 3 +- .../apache/sis/internal/jaxb/gco/GO_DateTime.java | 26 +- .../apache/sis/internal/jaxb/gco/package-info.java | 2 +- .../internal/jaxb/metadata/DQM_BasicMeasure.java | 92 ++++ .../internal/jaxb/metadata/DQM_Description.java | 92 ++++ .../sis/internal/jaxb/metadata/DQM_Measure.java | 92 ++++ .../sis/internal/jaxb/metadata/DQM_Parameter.java | 93 ++++ .../jaxb/metadata/DQM_SourceReference.java | 92 ++++ .../jaxb/metadata/DQ_EvaluationMethod.java | 97 ++++ .../jaxb/metadata/DQ_MeasureReference.java | 97 ++++ .../DQ_StandaloneQualityReportInformation.java | 99 ++++ .../sis/internal/jaxb/metadata/package-info.java | 3 +- .../internal/jaxb/metadata/replace/Parameter.java | 173 ++++++ .../jaxb/metadata/replace/QualityParameter.java | 246 +++++++++ .../jaxb/metadata/replace/ServiceParameter.java | 234 ++++---- .../jaxb/metadata/replace/package-info.java | 21 +- .../sis/internal/metadata/ReferencingServices.java | 5 +- .../org/apache/sis/metadata/MetadataStandard.java | 63 ++- .../org/apache/sis/metadata/PropertyAccessor.java | 4 +- .../java/org/apache/sis/metadata/SpecialCases.java | 19 +- .../sis/metadata/StandardImplementation.java | 6 +- .../sis/metadata/iso/acquisition/package-info.java | 2 +- .../sis/metadata/iso/citation/package-info.java | 2 +- .../sis/metadata/iso/constraint/package-info.java | 2 +- .../sis/metadata/iso/content/package-info.java | 2 +- .../metadata/iso/distribution/package-info.java | 2 +- .../sis/metadata/iso/extent/package-info.java | 2 +- .../metadata/iso/identification/package-info.java | 2 +- .../sis/metadata/iso/lineage/package-info.java | 2 +- .../sis/metadata/iso/maintenance/package-info.java | 2 +- .../org/apache/sis/metadata/iso/package-info.java | 2 +- .../metadata/iso/quality/AbstractCompleteness.java | 2 +- ...ractResult.java => AbstractDataEvaluation.java} | 77 ++- .../sis/metadata/iso/quality/AbstractElement.java | 589 +++++++++++---------- .../iso/quality/AbstractLogicalConsistency.java | 2 +- ...bstractResult.java => AbstractMetaquality.java} | 82 +-- .../iso/quality/AbstractPositionalAccuracy.java | 12 +- .../sis/metadata/iso/quality/AbstractResult.java | 105 +++- .../iso/quality/AbstractTemporalAccuracy.java | 42 +- ...lAccuracy.java => AbstractTemporalQuality.java} | 52 +- .../iso/quality/AbstractThematicAccuracy.java | 17 +- .../DefaultAbsoluteExternalPositionalAccuracy.java | 5 +- .../quality/DefaultAccuracyOfATimeMeasurement.java | 10 +- ...lity.java => DefaultAggregationDerivation.java} | 49 +- .../metadata/iso/quality/DefaultBasicMeasure.java | 225 ++++++++ .../iso/quality/DefaultCompletenessCommission.java | 3 +- .../iso/quality/DefaultCompletenessOmission.java | 3 +- .../iso/quality/DefaultConceptualConsistency.java | 7 +- ...efaultUsability.java => DefaultConfidence.java} | 53 +- .../iso/quality/DefaultConformanceResult.java | 7 +- .../iso/quality/DefaultCoverageResult.java | 67 ++- .../metadata/iso/quality/DefaultDataQuality.java | 84 ++- .../metadata/iso/quality/DefaultDescription.java | 172 ++++++ .../iso/quality/DefaultDescriptiveResult.java | 142 +++++ .../iso/quality/DefaultDomainConsistency.java | 3 +- ...ctElement.java => DefaultEvaluationMethod.java} | 311 +++-------- .../iso/quality/DefaultFormatConsistency.java | 5 +- ...ltUsability.java => DefaultFullInspection.java} | 51 +- .../DefaultGriddedDataPositionalAccuracy.java | 3 +- ...faultUsability.java => DefaultHomogeneity.java} | 53 +- .../iso/quality/DefaultIndirectEvaluation.java | 142 +++++ .../sis/metadata/iso/quality/DefaultMeasure.java | 469 ++++++++++++++++ .../iso/quality/DefaultMeasureReference.java | 201 +++++++ .../DefaultNonQuantitativeAttributeAccuracy.java | 22 +- ...efaultNonQuantitativeAttributeCorrectness.java} | 56 +- .../DefaultQuantitativeAttributeAccuracy.java | 3 +- .../iso/quality/DefaultQuantitativeResult.java | 31 +- .../DefaultRelativeInternalPositionalAccuracy.java | 3 +- ...lValidity.java => DefaultRepresentativity.java} | 51 +- .../iso/quality/DefaultSampleBasedInspection.java | 191 +++++++ ...alAccuracy.java => DefaultSourceReference.java} | 86 ++- .../DefaultStandaloneQualityReportInformation.java | 163 ++++++ .../iso/quality/DefaultTemporalConsistency.java | 8 +- .../iso/quality/DefaultTemporalValidity.java | 8 +- .../DefaultThematicClassificationCorrectness.java | 3 +- .../iso/quality/DefaultTopologicalConsistency.java | 9 +- .../sis/metadata/iso/quality/DefaultUsability.java | 19 +- ...lAccuracy.java => DefaultUsabilityElement.java} | 54 +- .../sis/metadata/iso/quality/ISOMetadata.java | 60 +++ .../sis/metadata/iso/quality/package-info.java | 95 +--- .../sis/metadata/iso/spatial/package-info.java | 2 +- .../java/org/apache/sis/metadata/package-info.java | 2 +- .../apache/sis/util/iso/DefaultNameFactory.java | 80 ++- .../org/apache/sis/util/iso/DefaultTypeName.java | 232 ++++---- .../main/java/org/apache/sis/util/iso/Names.java | 97 ++-- .../java/org/apache/sis/util/iso/TypeNames.java | 41 +- .../main/java/org/apache/sis/xml/Namespaces.java | 80 +-- .../src/main/java/org/apache/sis/xml/readme.html | 16 +- .../org/apache/sis/xml/RenameOnImport.lst | 14 +- .../internal/jaxb/cat/CodeListMarshallingTest.java | 2 +- .../metadata/replace/QualityParameterTest.java | 117 ++++ .../metadata/replace/ServiceParameterTest.java | 14 +- .../sis/metadata/PropertyConsistencyCheck.java | 3 +- .../apache/sis/metadata/iso/AllMetadataTest.java | 51 +- .../DefaultServiceIdentificationTest.java | 8 +- .../quality/AbstractPositionalAccuracyTest.java | 13 +- .../iso/quality/DefaultDomainConsistencyTest.java | 47 ++ .../iso/quality/DefaultQuantitativeResultTest.java | 50 ++ .../sis/metadata/xml/SchemaComplianceTest.java | 4 +- .../apache/sis/test/suite/MetadataTestSuite.java | 3 + .../sis/test/xml/AnnotationConsistencyCheck.java | 62 ++- .../org/apache/sis/test/xml/PackageVerifier.java | 10 +- .../org/apache/sis/test/xml/SchemaCompliance.java | 7 +- .../java/org/apache/sis/util/iso/NamesTest.java | 35 +- .../org/apache/sis/util/iso/TypeNamesTest.java | 10 +- .../java/org/apache/sis/util/iso/TypesTest.java | 2 +- .../org/apache/sis/xml/RenameListGenerator.java | 24 +- .../sis/metadata/xml/2007/PositionalAccuracy.xml | 11 +- .../apache/sis/metadata/xml/2007/ProcessStep.xml | 2 +- .../metadata/xml/2007/ServiceIdentification.xml | 2 +- .../org/apache/sis/metadata/xml/2016/Citation.xml | 4 +- .../org/apache/sis/metadata/xml/2016/Extent.xml | 2 +- .../org/apache/sis/metadata/xml/2016/Locales.xml | 2 +- .../org/apache/sis/metadata/xml/2016/Metadata.xml | 20 +- .../apache/sis/metadata/xml/2016/Multiplicity.xml | 2 +- .../sis/metadata/xml/2016/PositionalAccuracy.xml | 33 +- .../apache/sis/metadata/xml/2016/ProcessStep.xml | 2 +- .../metadata/xml/2016/ServiceIdentification.xml | 6 +- .../internal/referencing/ServicesForMetadata.java | 5 +- .../sis/parameter/DefaultParameterDescriptor.java | 40 +- .../parameter/DefaultParameterDescriptorTest.java | 50 +- .../org/apache/sis/parameter/ParametersTest.java | 8 +- .../apache/sis/internal/system/DataDirectory.java | 2 +- .../org/apache/sis/internal/util/Constants.java | 7 +- .../src/main/java/org/apache/sis/util/Classes.java | 190 +++++-- .../src/main/java/org/apache/sis/util/Numbers.java | 9 +- .../org/apache/sis/util/UnknownNameException.java | 7 +- .../test/java/org/apache/sis/util/ClassesTest.java | 86 ++- pom.xml | 2 +- 135 files changed, 5369 insertions(+), 1750 deletions(-) diff --cc core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/QualityParameter.java index 0000000000,fc7dcb875b..b902327e87 mode 000000,100644..100644 --- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/QualityParameter.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/QualityParameter.java @@@ -1,0 -1,245 +1,246 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.apache.sis.internal.jaxb.metadata.replace; + + import java.util.Map; + import javax.xml.bind.annotation.XmlType; + import javax.xml.bind.annotation.XmlElement; + import javax.xml.bind.annotation.XmlRootElement; + import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + import org.opengis.util.TypeName; + import org.opengis.util.InternationalString; + import org.opengis.metadata.Identifier; + import org.opengis.metadata.quality.Description; + import org.opengis.metadata.quality.ValueStructure; + import org.opengis.parameter.ParameterDescriptor; + import org.opengis.referencing.operation.Matrix; + import org.apache.sis.metadata.iso.DefaultIdentifier; + import org.apache.sis.metadata.iso.quality.DefaultDescription; + import org.apache.sis.internal.jaxb.gco.GO_GenericName; + import org.apache.sis.util.Classes; + import org.apache.sis.util.iso.Names; + import org.apache.sis.xml.Namespaces; + + // Branch-dependent imports + import org.opengis.coverage.Coverage; ++import org.opengis.referencing.ReferenceIdentifier; + + + /** + * Parameter information conform to the ISO 19157:2013 specification. + * GeoAPI tries to provides a single API for the parameter classes defined in various specifications + * (ISO 19111, ISO 19115, ISO 19157, Web Processing Service). + * But we still need separated representations at XML (un)marshalling time. + * This class is for the ISO 19157:2013 case. + * + * <p>Note that this implementation is simple and serves no other purpose than being a container for XML + * parsing and formatting. For real parameter framework, consider using {@link org.apache.sis.parameter} + * package instead.</p> + * + * <h2>Note about raw-type usage</h2> + * We use raw type (i.e. we implement {@code ParameterDescriptor} instead of {@code ParameterDescriptor<T>}) + * because there is no way we can know {@code <T>} for sure at unmarshalling time. This is not a recommended + * practice, so <strong>this class shall not be in public API</strong>. However it should be okay to create + * {@code QualityParameter} instances in Apache SIS internal code if all methods creating such instances + * declare {@code ParameterDescriptor<?>} as their return type. + * + * @author Martin Desruisseaux (Geomatys) + * @version 1.3 + * @since 1.3 + * @module + */ + @SuppressWarnings("rawtypes") // For the omission of <T> in Parameter<T> - see javadoc. + @XmlType(name = "DQM_Parameter_Type", namespace = Namespaces.DQM, propOrder = { + "code", + "definition", + "description", + "valueType", + "valueStructure" + }) + @XmlRootElement(name = "DQM_Parameter", namespace = Namespaces.DQM) + public final class QualityParameter extends Parameter { + /** + * Name of the data quality parameter, to be represented as identifier code. + * + * @see #getName() + */ + @XmlElement(name="name", required=true) + String code; + + /** + * Definition of the data quality parameter. + * Stored in {@link Identifier#getDescription()}. + * + * @see #getName() + */ + @XmlElement(required = true) + InternationalString definition; + + /** + * Description of the data quality parameter. + * + * @see #getDescription() + */ + @XmlElement + Description description; + + /** + * Value type of the data quality parameter (shall be one of the data types defined in ISO/TS 19103:2005). + * + * @see #getValueType() + * @see #getValueClass() + */ + @XmlElement(required = true) + @XmlJavaTypeAdapter(GO_GenericName.class) // Not in package-info because shall not be applied to getLegacyName(). + TypeName valueType; + + /** + * Structure of the data quality parameter. + * + * @see #getValueClass() + */ + @XmlElement + ValueStructure valueStructure; + + /** + * Creates an initially empty parameter. + * This constructor is needed by JAXB at unmarshalling time. + * + * <p><strong>Consider this constructor as private</strong> except for testing purpose. + * See <cite>Note about raw-type usage</cite> in class javadoc.</p> + */ + QualityParameter() { + } + + /** + * Creates a parameter initialized to the values of the given one. + * This is used for marshalling an arbitrary parameter as an ISO 19157 parameter. + */ + @SuppressWarnings("unchecked") + private QualityParameter(final ParameterDescriptor<?> parameter) { + super(parameter); + final Identifier id = parameter.getName(); + if (id != null) { + code = id.getCode(); + definition = id.getDescription(); + } + InternationalString text = parameter.getDescription(); + if (text != null) { + description = new DefaultDescription(text); + } + valueType = parameter.getValueType(); + valueStructure = ValueStructure.valueOf(parameter.getValueClass()).orElse(null); + } + + /** + * Returns the given parameter as an instance of {@code QualityParameter}. + * + * @param parameter the parameter (may be {@code null}). + * @return the service parameter, or {@code null} if the given argument was null. + */ + public static QualityParameter castOrCopy(final ParameterDescriptor<?> parameter) { + if (parameter == null || parameter instanceof QualityParameter) { + return (QualityParameter) parameter; + } + return new QualityParameter(parameter); + } + + /** + * Returns the name as an {@code Identifier}, which is the type requested by ISO 19111. + * Note that this is different than the type requested by ISO 19157, which is {@link String}. + * + * @return the parameter name as an identifier (the type specified by ISO 19111). + */ + @Override - public synchronized Identifier getName() { ++ public synchronized ReferenceIdentifier getName() { + if (name == null && code != null) { - final DefaultIdentifier id = new DefaultIdentifier(code); ++ final RS_Identifier id = new RS_Identifier(null, code, null); + id.setDescription(definition); + id.transitionTo(DefaultIdentifier.State.FINAL); + name = id; + } + return name; + } + + /** + * Returns a narrative explanation of the role of the parameter. + * + * @return a narrative explanation of the role of the parameter, or {@code null} if none. + */ + @Override + public InternationalString getDescription() { + final Description description = this.description; + return (description != null) ? description.getTextDescription() : null; + } + + /** + * Infers the value class from the type name. + * This method is the reason why we can not parameterize this {@code QualityParameter} class + * (see <cite>Note about raw-type usage</cite> in class javadoc), because there is no way we + * can ensure that the class inferred from {@link #valueType} is really for type {@code <T>}. + * + * @return the value class inferred from the attribute type, or {@code null} if unknown. + */ + @Override + public Class<?> getValueClass() { + Class<?> type = super.getValueClass(); + if (type == null) { + final ValueStructure s = valueStructure; + type = (s != null) ? s.toJavaType().orElse(null) : Names.toClass(valueType); + } + return type; + } + + /** + * Returns the name that describes the type of parameter values. + * + * @return the type name of value component(s) in this parameter. + */ + @Override + public TypeName getValueType() { + return valueType; + } + + /** + * Suggests a type name for the components of given collection or array class. + * The component type is fetched on a <cite>best effort</cite> basis only. + * This method does the following checks: + * <ul> + * <li>If the given class is a class, then its {@linkplain Class#getComponentType() component type} is used.</li> + * <li>Otherwise if the class is an {@link Iterable}, then the upper bound of elements is fetched.</li> + * <li>Otherwise if the class is a {@link Map}, then the upper bound of keys is fetched.</li> + * <li>Otherwise if the class is a {@link Matrix} or {@link Coverage}, then {@link Double} components is assumed.</li> + * <li>Otherwise the given class is used as if it was already a component type (i.e. a singleton item).</li> + * </ul> + * + * This method is used for mapping {@link Class} to ({@link ValueStructure}, {@link TypeName}) pair. + * The other member of the pair is given by {@link ValueStructure#valueOf(Class)}. + * + * @param valueClass the type of values for which to infer a {@link TypeName} instance. + * @return a type name for components of the given type. + */ + public static TypeName getValueType(Class<?> valueClass) { + if (valueClass.isArray()) { + valueClass = valueClass.getComponentType(); + } else if (Iterable.class.isAssignableFrom(valueClass) || Map.class.isAssignableFrom(valueClass)) { + valueClass = Classes.boundOfParameterizedDeclaration(valueClass); + } else if (Matrix.class.isAssignableFrom(valueClass) || Coverage.class.isAssignableFrom(valueClass)) { + valueClass = Double.class; + } + return Names.createTypeName(valueClass); + } + } diff --cc core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java index 8b190ed7f7,350daf8bb5..c0a46ff19a --- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java @@@ -39,12 -34,9 +34,12 @@@ import org.apache.sis.internal.metadata import org.apache.sis.util.iso.DefaultMemberName; import org.apache.sis.util.iso.Names; import org.apache.sis.xml.Namespaces; - import org.apache.sis.util.ComparisonMode; - import org.apache.sis.util.resources.Errors; - import static org.apache.sis.util.Utilities.deepEquals; import static org.apache.sis.internal.util.CollectionsExt.nonNull; ++// Branch-dependent imports ++import org.opengis.referencing.ReferenceIdentifier; ++ /** * Parameter information conform to the ISO 19115:2014 specification. @@@ -214,6 -227,26 +230,26 @@@ public final class ServiceParameter ext return null; } + /** + * Returns the name as an {@code Identifier}, which is the type requested by ISO 19111. + * Note that this is different than the type requested by ISO 19115, which is {@link MemberName}. + * + * This method is the converse of {@link #getMemberName(ParameterDescriptor)}. + * + * @return the parameter name as an identifier (the type specified by ISO 19111). + */ + @Override - public synchronized Identifier getName() { ++ public synchronized ReferenceIdentifier getName() { + if (name == null && memberName != null) { - if (memberName instanceof Identifier) { - name = (Identifier) memberName; ++ if (memberName instanceof ReferenceIdentifier) { ++ name = (ReferenceIdentifier) memberName; + } else { + name = new NameToIdentifier(memberName); + } + } + return name; + } + /** * Returns the name to be marshalled in the ISO 19139:2007 way. Example: * diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultDataQuality.java index f4b1a92af8,b60c360ec5..10be7cc10e --- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultDataQuality.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultDataQuality.java @@@ -23,12 -23,13 +23,14 @@@ import javax.xml.bind.annotation.XmlRoo import org.opengis.metadata.lineage.Lineage; import org.opengis.metadata.quality.DataQuality; import org.opengis.metadata.quality.Element; - import org.opengis.metadata.quality.Scope; + import org.opengis.metadata.quality.StandaloneQualityReportInformation; -import org.opengis.metadata.maintenance.Scope; import org.opengis.metadata.maintenance.ScopeCode; - import org.apache.sis.metadata.iso.ISOMetadata; -import org.apache.sis.metadata.iso.maintenance.DefaultScope; import org.apache.sis.internal.jaxb.FilterByVersion; import org.apache.sis.internal.xml.LegacyNamespaces; ++// Branch-dependent imports ++import org.opengis.metadata.quality.Scope; ++ /** * Quality information for the data specified by a data quality scope. diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/package-info.java index f68c3e3d20,0650db257b..e0a8813103 --- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/package-info.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/package-info.java @@@ -141,7 -79,8 +79,8 @@@ @XmlJavaTypeAdapter(MD_ContentInformation.class), @XmlJavaTypeAdapter(MD_Format.class), @XmlJavaTypeAdapter(MD_Identifier.class), + // @XmlJavaTypeAdapter(MD_RangeDimension.class), // Pending new ISO 19157 revision. - @XmlJavaTypeAdapter(MD_Scope.class), + @XmlJavaTypeAdapter(MD_Scope.Legacy.class), @XmlJavaTypeAdapter(MD_SpatialRepresentation.class), @XmlJavaTypeAdapter(MD_SpatialRepresentationTypeCode.class), @XmlJavaTypeAdapter(MX_DataFile.class), diff --cc core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java index 31aacc3d3e,fdb16740a8..908b73d1e2 --- a/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java @@@ -23,8 -23,9 +23,8 @@@ import javax.measure.Unit import org.opengis.parameter.ParameterDescriptor; import org.opengis.parameter.ParameterDirection; import org.opengis.parameter.ParameterValue; - import org.opengis.referencing.ReferenceIdentifier; import org.opengis.parameter.ParameterValueGroup; -import org.opengis.metadata.Identifier; + import org.opengis.util.TypeName; import org.opengis.util.GenericName; import org.opengis.util.InternationalString; import org.apache.sis.measure.Range; @@@ -38,6 -39,6 +38,9 @@@ import org.junit.Test import static org.junit.Assert.*; ++// Branch-dependent imports ++import org.opengis.referencing.ReferenceIdentifier; ++ /** * Tests the static methods in the {@link Parameters} class.