This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sis.git
commit f1ea2363008539e55a199db0529b053c98b3f850 Merge: 2f048bc7a0 4afa8fd56a Author: Martin Desruisseaux <[email protected]> AuthorDate: Mon Jul 3 15:20:20 2023 +0200 Merge branch 'geoapi-3.1'. This merge prepares Apache SIS to JPMS (Jigsaw) modularisation. https://github.com/apache/sis/pull/34 https://issues.apache.org/jira/browse/SIS-584 https://issues.apache.org/jira/browse/SIS-585 .../org/apache/sis/internal/gui/Resources.java | 39 ++- .../org/apache/sis/internal/gui/Resources_en.java | 18 +- .../org/apache/sis/internal/gui/Resources_fr.java | 18 +- .../apache/sis/cloud/aws/internal/Resources.java | 35 ++- .../sis/cloud/aws/internal/Resources_en.java | 18 +- .../sis/cloud/aws/internal/Resources_fr.java | 18 +- .../sis/coverage/grid/DimensionalityReduction.java | 10 +- .../apache/sis/coverage/grid/GridCoverage2D.java | 6 +- .../sis/coverage/grid/GridCoverageProcessor.java | 13 +- .../org/apache/sis/coverage/grid/GridExtent.java | 2 +- .../apache/sis/coverage/grid/GridExtentCRS.java | 8 +- .../apache/sis/feature/AbstractIdentifiedType.java | 4 +- .../org/apache/sis/feature/CharacteristicMap.java | 5 +- .../java/org/apache/sis/feature/DenseFeature.java | 5 +- .../apache/sis/feature/ExpressionOperation.java | 2 +- .../apache/sis/feature/MultiValuedAttribute.java | 5 +- .../org/apache/sis/feature/SingletonAttribute.java | 5 +- .../java/org/apache/sis/feature/SparseFeature.java | 5 +- .../sis/feature/builder/FeatureTypeBuilder.java | 6 +- .../org/apache/sis/filter/ConvertFunction.java | 2 +- .../java/org/apache/sis/image/ImageProcessor.java | 4 +- .../sis/internal/coverage/j2d/ObservableImage.java | 2 +- .../org/apache/sis/internal/feature/Resources.java | 35 ++- .../apache/sis/internal/feature/Resources_en.java} | 18 +- .../apache/sis/internal/feature/Resources_fr.java} | 18 +- .../sis/feature/DefaultAssociationRoleTest.java | 8 +- .../apache/sis/feature/DefaultFeatureTypeTest.java | 8 +- .../sis/internal/jaxb/SpecializedIdentifier.java | 5 +- .../apache/sis/internal/jaxb/TypeRegistration.java | 59 +++-- .../apache/sis/internal/jaxb/cat/CodeListUID.java | 6 +- .../apache/sis/internal/jaxb/cat/package-info.java | 2 +- .../apache/sis/internal/jaxb/gml/TM_Primitive.java | 2 +- .../sis/internal/jaxb/gts/TM_PeriodDuration.java | 2 +- .../sis/internal/metadata/ReferencingServices.java | 10 +- .../apache/sis/internal/metadata/Resources.java | 35 ++- .../Resources_en.java} | 18 +- .../Resources_fr.java} | 18 +- .../sis/internal/metadata}/TemporalUtilities.java | 49 ++-- .../apache/sis/internal/metadata/package-info.java | 2 +- .../sis/internal/metadata/sql/Initializer.java | 18 +- .../sis/internal/metadata/sql/LocalDataSource.java | 6 +- .../org/apache/sis/metadata/MetadataStandard.java | 25 +- .../sis/metadata/StandardImplementation.java | 6 +- .../metadata/iso/extent/DefaultTemporalExtent.java | 2 +- .../metadata/iso/lineage/DefaultProcessStep.java | 2 +- .../iso/quality/DefaultEvaluationMethod.java | 3 +- .../java/org/apache/sis/util/iso/AbstractName.java | 7 +- .../apache/sis/util/iso/DefaultNameFactory.java | 25 +- .../apache/sis/util/iso/DefaultRecordSchema.java | 5 +- .../main/java/org/apache/sis/util/iso/Names.java | 19 +- .../main/java/org/apache/sis/util/iso/Types.java | 23 +- .../java/org/apache/sis/xml/MarshalContext.java | 2 +- .../java/org/apache/sis/xml/MarshallerPool.java | 4 +- .../main/java/org/apache/sis/xml/Transformer.java | 16 +- .../apache/sis/metadata/iso/CodeLists.properties | 18 ++ .../sis/metadata/iso/CodeLists_en.properties | 1 + .../sis/metadata/iso/CodeLists_fr.properties | 18 ++ .../sis/internal/jaxb/gml/TimePeriodTest.java | 2 +- .../sis/metadata/iso/CustomMetadataTest.java | 4 +- .../identification/DefaultCoupledResourceTest.java | 6 +- .../DefaultServiceIdentificationTest.java | 4 +- .../apache/sis/util/iso/NameMarshallingTest.java | 11 +- .../java/org/apache/sis/util/iso/NamesTest.java | 8 +- .../org/apache/sis/util/iso/TypeNamesTest.java | 7 +- .../java/org/apache/sis/util/iso/TypesTest.java | 8 +- .../sis/internal/map/coverage/RenderingData.java | 3 +- .../main/java/org/apache/sis/portrayal/Canvas.java | 3 +- .../main/java/org/apache/sis/style/se1/Rule.java | 4 +- .../org/apache/sis/style/se1/StyleElement.java | 2 +- .../org/apache/sis/style/se1/StyleTestCase.java | 2 +- .../apache/sis/internal/gazetteer/Resources.java | 35 ++- .../sis/internal/gazetteer/Resources_en.java} | 18 +- .../sis/internal/gazetteer/Resources_fr.java} | 18 +- .../java/org/apache/sis/geometry/Envelopes.java | 5 +- .../jaxb/referencing/CC_OperationMethod.java | 4 +- .../sis/internal/referencing/AnnotatedMatrix.java | 5 +- .../internal/referencing/CoordinateOperations.java | 87 +++---- .../apache/sis/internal/referencing/LazySet.java | 93 +++----- .../internal/referencing/PositionTransformer.java | 6 +- .../referencing/ReferencingFactoryContainer.java | 231 +++++++++++------- .../apache/sis/internal/referencing/Resources.java | 35 ++- .../sis/internal/referencing/Resources_en.java} | 18 +- .../sis/internal/referencing/Resources_fr.java} | 18 +- .../internal/referencing/ServicesForMetadata.java | 13 +- .../sis/internal/referencing/j2d/AffineMatrix.java | 3 +- .../referencing/j2d/AffineTransform2D.java | 2 +- .../referencing/provider/AbridgedMolodensky.java | 36 ++- .../referencing/provider/AbstractProvider.java | 80 ++++++- .../sis/internal/referencing/provider/Affine.java | 130 ++++++---- .../referencing/provider/AxisOrderReversal.java | 23 +- .../referencing/provider/AxisOrderReversal3D.java | 2 +- .../provider/CoordinateFrameRotation.java | 2 +- .../provider/CoordinateFrameRotation2D.java | 23 +- .../provider/CoordinateFrameRotation3D.java | 38 ++- .../referencing/provider/Equirectangular.java | 4 +- .../provider/FranceGeocentricInterpolation.java | 62 +++-- .../referencing/provider/GeocentricAffine.java | 42 ++-- .../GeocentricAffineBetweenGeographic.java | 31 ++- .../provider/GeocentricToGeographic.java | 39 ++- .../provider/GeocentricToTopocentric.java | 24 +- .../provider/GeocentricTranslation.java | 2 +- .../provider/GeocentricTranslation2D.java | 23 +- .../provider/GeocentricTranslation3D.java | 38 ++- .../referencing/provider/GeodeticOperation.java | 122 +++++++--- .../referencing/provider/Geographic2Dto3D.java | 25 +- .../referencing/provider/Geographic3Dto2D.java | 50 ++-- .../provider/GeographicAndVerticalOffsets.java | 32 ++- .../referencing/provider/GeographicOffsets.java | 64 ++++- .../referencing/provider/GeographicOffsets2D.java | 19 +- .../provider/GeographicRedimension.java | 35 ++- .../provider/GeographicToGeocentric.java | 39 ++- .../provider/GeographicToTopocentric.java | 24 +- .../referencing/provider/Interpolation1D.java | 24 +- .../referencing/provider/LongitudeRotation.java | 36 ++- .../referencing/provider/MapProjection.java | 34 ++- .../referencing/provider/MapProjection3D.java | 38 +-- .../internal/referencing/provider/Molodensky.java | 38 ++- .../provider/MolodenskyInterpolation.java | 45 ++-- .../sis/internal/referencing/provider/NADCON.java | 4 +- .../sis/internal/referencing/provider/NTv1.java | 4 +- .../sis/internal/referencing/provider/NTv2.java | 4 +- .../referencing/provider/NorthPoleRotation.java | 4 +- .../referencing/provider/PositionVector7Param.java | 2 +- .../provider/PositionVector7Param2D.java | 23 +- .../provider/PositionVector7Param3D.java | 38 ++- .../internal/referencing/provider/Providers.java | 72 ------ .../referencing/provider/PseudoPlateCarree.java | 4 +- .../referencing/provider/SouthPoleRotation.java | 4 +- .../referencing/provider/VerticalOffset.java | 6 +- .../internal/referencing/provider/Wraparound.java | 4 +- .../provider/ZonedTransverseMercator.java | 4 +- .../apache/sis/io/wkt/GeodeticObjectParser.java | 2 +- .../org/apache/sis/parameter/TensorParameters.java | 14 +- .../org/apache/sis/parameter/TensorValues.java | 3 +- .../sis/referencing/AbstractIdentifiedObject.java | 9 +- .../apache/sis/referencing/AuthorityFactories.java | 16 +- .../java/org/apache/sis/referencing/Builder.java | 6 +- .../main/java/org/apache/sis/referencing/CRS.java | 18 +- .../sis/referencing/EPSGFactoryFallback.java | 7 +- .../referencing/EllipsoidalHeightSeparator.java | 4 +- .../apache/sis/referencing/GeodeticCalculator.java | 3 +- .../apache/sis/referencing/NamedIdentifier.java | 6 +- .../sis/referencing/StandardDefinitions.java | 6 +- .../sis/referencing/datum/BursaWolfParameters.java | 2 +- .../sis/referencing/datum/TimeDependentBWP.java | 2 +- .../referencing/factory/GeodeticObjectFactory.java | 39 +-- .../factory/MultiAuthoritiesFactory.java | 10 +- .../referencing/factory/sql/EPSGDataAccess.java | 119 +-------- .../sis/referencing/factory/sql/EPSGFactory.java | 26 +- .../sis/referencing/factory/sql/EPSGInstaller.java | 5 +- .../operation/AbstractSingleOperation.java | 5 +- .../operation/CoordinateOperationFinder.java | 13 +- .../operation/CoordinateOperationRegistry.java | 33 +-- .../operation/DefaultConcatenatedOperation.java | 4 +- .../referencing/operation/DefaultConversion.java | 3 +- .../DefaultCoordinateOperationFactory.java | 106 +++++---- .../operation/DefaultOperationMethod.java | 255 +------------------- .../operation/InverseOperationMethod.java | 2 +- .../operation/builder/TransformBuilder.java | 5 +- .../transform/AbstractLinearTransform.java | 2 +- .../transform/CoordinateSystemTransform.java | 8 +- .../transform/DefaultMathTransformFactory.java | 60 ++--- .../operation/transform/LinearTransform1D.java | 2 +- .../referencing/EllipsoidalHeightCombinerTest.java | 6 +- .../sis/internal/referencing/LazySetTest.java | 8 +- .../internal/referencing/provider/AffineTest.java | 4 +- .../provider/GeocentricTranslationTest.java | 8 +- .../provider/GeographicOffsetsTest.java | 5 +- .../provider/PositionVector7ParamTest.java | 7 +- .../referencing/provider/ProviderMock.java | 15 +- .../referencing/provider/ProvidersTest.java | 73 +++--- .../referencing/provider/SeismicBinGridMock.java | 4 +- .../apache/sis/io/wkt/MathTransformParserTest.java | 6 +- .../org/apache/sis/referencing/BuilderTest.java | 8 +- .../sis/referencing/IdentifiedObjectsTest.java | 6 +- .../sis/referencing/NamedIdentifierTest.java | 6 +- .../sis/referencing/factory/TestFactorySource.java | 2 +- .../DefaultConcatenatedOperationTest.java | 8 +- .../operation/DefaultConversionTest.java | 20 +- .../operation/DefaultOperationMethodTest.java | 59 +---- .../operation/DefaultTransformationTest.java | 4 +- .../operation/SingleOperationMarshallingTest.java | 6 +- .../sis/referencing/operation/projection/NoOp.java | 3 +- .../projection/ObliqueStereographicTest.java | 7 +- .../transform/AbridgedMolodenskyTransformTest.java | 6 +- .../operation/transform/CopyTransformTest.java | 2 +- .../transform/DefaultMathTransformFactoryTest.java | 38 ++- .../transform/EllipsoidToCentricTransformTest.java | 11 +- .../InterpolatedGeocentricTransformTest.java | 6 +- .../transform/InterpolatedTransformTest.java | 6 +- .../transform/MolodenskyTransformTest.java | 9 +- .../transform/OperationMethodSetTest.java | 4 +- .../operation/transform/PolarToCartesianTest.java | 5 +- .../transform/ProjectiveTransformTest.java | 2 +- .../transform/SphericalToCartesianTest.java | 3 +- .../operation/transform/TransferFunctionTest.java | 5 +- .../transform/TransformSeparatorTest.java | 5 +- .../report/CoordinateOperationMethods.java | 6 +- .../test/integration/CoordinateOperationTest.java | 6 +- .../org/apache/sis/referencing/crs/DerivedCRS.xml | 2 - .../apache/sis/referencing/crs/ProjectedCRS.xml | 2 - .../operation/ConcatenatedOperation.xml | 2 - .../referencing/operation/PassThroughOperation.xml | 2 - .../sis/internal/converter/SystemRegistry.java | 7 +- .../sis/internal/system/DefaultFactories.java | 265 --------------------- .../org/apache/sis/internal/system/Reflect.java | 106 +++++++++ .../internal/temporal/DefaultTemporalFactory.java | 9 +- .../apache/sis/internal/temporal/package-info.java | 2 +- .../org/apache/sis/internal/util/CloneAccess.java | 48 ++++ .../java/org/apache/sis/internal/util/Cloner.java | 155 ++++++------ .../org/apache/sis/internal/util/CodeLists.java | 7 +- .../apache/sis/internal/util/FinalFieldSetter.java | 128 ---------- .../apache/sis/internal/util/MetadataServices.java | 21 +- .../java/org/apache/sis/measure/FormatField.java | 4 +- .../org/apache/sis/measure/QuantityFormat.java | 21 +- .../java/org/apache/sis/measure/RangeFormat.java | 19 +- .../java/org/apache/sis/measure/UnitFormat.java | 24 +- .../apache/sis/setup/InstallationResources.java | 15 +- .../sis/util/collection/DefaultTreeTable.java | 4 +- .../java/org/apache/sis/util/resources/Errors.java | 35 ++- .../org/apache/sis/util/resources/Errors_en.java} | 18 +- .../org/apache/sis/util/resources/Errors_fr.java} | 18 +- .../sis/util/resources/IndexedResourceBundle.java | 83 +++---- .../java/org/apache/sis/util/resources/Loader.java | 120 ---------- .../org/apache/sis/util/resources/Messages.java | 35 ++- .../apache/sis/util/resources/Messages_en.java} | 18 +- .../apache/sis/util/resources/Messages_fr.java} | 18 +- .../org/apache/sis/util/resources/Vocabulary.java | 35 ++- .../apache/sis/util/resources/Vocabulary_en.java} | 18 +- .../apache/sis/util/resources/Vocabulary_fr.java} | 18 +- .../util/resources/IndexedResourceBundleTest.java | 13 +- .../org/apache/sis/util/resources/LoaderTest.java | 48 ---- .../sis/internal/profile/fra/ProfileTypes.java | 20 +- .../apache/sis/storage/landsat/LandsatStore.java | 4 +- .../org/apache/sis/internal/geotiff/Resources.java | 35 ++- .../apache/sis/internal/geotiff/Resources_en.java | 18 +- .../apache/sis/internal/geotiff/Resources_fr.java | 18 +- .../sis/storage/geotiff/GridGeometryBuilder.java | 4 +- .../sis/storage/geotiff/ImageMetadataBuilder.java | 2 +- .../org/apache/sis/storage/geotiff/Reader.java | 6 +- .../apache/sis/storage/geotiff/XMLMetadata.java | 2 +- .../apache/sis/storage/geotiff/GeoCodesTest.java | 6 +- .../apache/sis/storage/geotiff/GeoKeysTest.java | 8 +- .../org/apache/sis/internal/netcdf/CRSBuilder.java | 7 +- .../org/apache/sis/internal/netcdf/Convention.java | 8 +- .../org/apache/sis/internal/netcdf/Decoder.java | 8 +- .../org/apache/sis/internal/netcdf/Resources.java | 35 ++- .../apache/sis/internal/netcdf/Resources_en.java | 18 +- .../apache/sis/internal/netcdf/Resources_fr.java | 18 +- .../apache/sis/internal/sql/feature/Analyzer.java | 6 +- .../apache/sis/internal/sql/feature/Resources.java | 35 ++- .../sis/internal/sql/feature/Resources_en.java | 18 +- .../sis/internal/sql/feature/Resources_fr.java | 18 +- .../apache/sis/storage/sql/ResourceDefinition.java | 10 +- .../org/apache/sis/internal/storage/Resources.java | 35 ++- .../apache/sis/internal/storage/Resources_en.java | 18 +- .../apache/sis/internal/storage/Resources_fr.java | 18 +- .../apache/sis/internal/storage/folder/Store.java | 6 +- .../org/apache/sis/storage/DataStoreRegistry.java | 64 ++--- .../java/org/apache/sis/storage/DataStores.java | 54 +---- .../org/apache/sis/storage/DataStoresTest.java | 6 +- .../org/apache/sis/internal/storage/gpx/Store.java | 6 +- .../org/apache/sis/internal/storage/gpx/Types.java | 3 +- 263 files changed, 2851 insertions(+), 2934 deletions(-) diff --cc core/sis-feature/src/main/java/org/apache/sis/feature/CharacteristicMap.java index 188bfc749c,c5b19ed0ee..30be513879 --- a/core/sis-feature/src/main/java/org/apache/sis/feature/CharacteristicMap.java +++ b/core/sis-feature/src/main/java/org/apache/sis/feature/CharacteristicMap.java @@@ -30,10 -37,10 +31,10 @@@ import org.apache.sis.internal.feature. * This map holds only the attribute characteristics which have been explicitly set or requested. * * @author Martin Desruisseaux (Geomatys) - * @version 0.6 + * @version 1.4 * @since 0.5 */ - final class CharacteristicMap extends AbstractMap<String,AbstractAttribute<?>> implements Cloneable { -final class CharacteristicMap extends AbstractMap<String,Attribute<?>> implements CloneAccess { ++final class CharacteristicMap extends AbstractMap<String,AbstractAttribute<?>> implements CloneAccess { /** * The attribute source for which to provide characteristics. */ diff --cc core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAttribute.java index f96cbea44f,0750738d1c..7a0a22d26c --- a/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAttribute.java +++ b/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAttribute.java @@@ -17,8 -17,10 +17,9 @@@ package org.apache.sis.feature; import java.util.Objects; + import org.apache.sis.internal.util.CloneAccess; // Branch-dependent imports -import org.opengis.feature.AttributeType; /** diff --cc core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java index 19ba9432b2,8b52d9b209..108dc421dd --- a/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java +++ b/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java @@@ -19,7 -19,8 +19,7 @@@ package org.apache.sis.feature import java.util.Map; import org.opengis.util.GenericName; import org.opengis.util.NameFactory; - import org.apache.sis.internal.system.DefaultFactories; -import org.opengis.feature.FeatureAssociationRole; + import org.apache.sis.util.iso.DefaultNameFactory; import org.apache.sis.test.DependsOnMethod; import org.apache.sis.test.DependsOn; import org.apache.sis.test.TestCase; diff --cc core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/SpecializedIdentifier.java index 7513919cc4,b783a3188f..90865a015e --- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/SpecializedIdentifier.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/SpecializedIdentifier.java @@@ -46,7 -47,7 +47,7 @@@ import org.opengis.referencing.Referenc * * @since 0.3 */ - public final class SpecializedIdentifier<T> implements ReferenceIdentifier, Cloneable, Serializable { -public final class SpecializedIdentifier<T> implements Identifier, CloneAccess, Serializable { ++public final class SpecializedIdentifier<T> implements ReferenceIdentifier, CloneAccess, Serializable { /** * For cross-version compatibility. */ diff --cc core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/cat/CodeListUID.java index 3b1204135f,01ba3becd3..def2c56cab --- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/cat/CodeListUID.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/cat/CodeListUID.java @@@ -23,8 -22,10 +23,9 @@@ import jakarta.xml.bind.annotation.XmlA import jakarta.xml.bind.annotation.XmlType; import jakarta.xml.bind.annotation.XmlValue; import org.opengis.util.CodeList; -import org.opengis.util.ControlledVocabulary; -import org.opengis.annotation.ResourceBundles; import org.apache.sis.util.iso.Types; import org.apache.sis.internal.jaxb.Context; ++import org.apache.sis.internal.util.CodeLists; import static org.apache.sis.internal.metadata.ImplementationHelper.ISO_NAMESPACE; @@@ -242,11 -243,7 +243,8 @@@ public final class CodeListUID if (locale != null) { final String key = classID + '.' + fieldID; try { - value = ResourceBundle.getBundle("org.opengis.metadata.CodeLists", - value = ResourceBundles.codeLists(locale).getString(key); ++ value = ResourceBundle.getBundle(CodeLists.RESOURCES, + locale, CodeList.class.getClassLoader()).getString(key); - if ("Off line access".equals(value)) { - value = "Offline access"; // For having the same value than GeoAPI 3.1. - } } catch (MissingResourceException e) { Context.warningOccured(context, CodeListAdapter.class, "marshal", e, false); } diff --cc core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/TM_Primitive.java index fb82a3b4a6,236d7bdf09..936c2281b1 --- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/TM_Primitive.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/TM_Primitive.java @@@ -22,13 -24,9 +22,13 @@@ import org.opengis.temporal.TemporalPri import org.apache.sis.internal.xml.XmlUtilities; import org.apache.sis.internal.jaxb.Context; import org.apache.sis.internal.jaxb.gco.PropertyType; - import org.apache.sis.internal.util.TemporalUtilities; + import org.apache.sis.internal.metadata.TemporalUtilities; import org.apache.sis.util.resources.Errors; +// Branch-dependent imports +import org.apache.sis.internal.geoapi.temporal.Period; +import org.apache.sis.internal.geoapi.temporal.Instant; + /** * JAXB adapter for {@link TemporalPrimitive}, in order to integrate the value in an element complying diff --cc core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/TemporalUtilities.java index e89868db28,48c23bb4dd..582980cc50 --- a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/TemporalUtilities.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/TemporalUtilities.java @@@ -14,15 -14,17 +14,17 @@@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.sis.internal.util; + package org.apache.sis.internal.metadata; import java.util.Date; + import java.util.ServiceLoader; -import org.opengis.temporal.Instant; -import org.opengis.temporal.Period; -import org.opengis.temporal.TemporalFactory; + import org.opengis.temporal.TemporalPrimitive; +import org.apache.sis.internal.geoapi.temporal.Instant; +import org.apache.sis.internal.geoapi.temporal.Period; +import org.apache.sis.internal.geoapi.temporal.TemporalFactory; - import org.opengis.temporal.TemporalPrimitive; - import org.apache.sis.util.Static; - import org.apache.sis.internal.system.DefaultFactories; + import org.apache.sis.internal.system.Modules; + import org.apache.sis.internal.system.Reflect; + import org.apache.sis.internal.system.SystemListener; import org.apache.sis.internal.temporal.DefaultTemporalFactory; diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/StandardImplementation.java index 6f8124ecae,14196dcfee..12b30f5025 --- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/StandardImplementation.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/StandardImplementation.java @@@ -20,7 -20,10 +20,8 @@@ import java.util.Map import java.util.IdentityHashMap; import java.util.logging.Logger; import java.io.ObjectStreamException; + import java.util.concurrent.ConcurrentHashMap; import org.opengis.annotation.UML; -import org.opengis.annotation.Classifier; -import org.opengis.annotation.Stereotype; import org.apache.sis.util.CharSequences; import org.apache.sis.util.logging.Logging; import org.apache.sis.internal.system.Modules; diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/DefaultProcessStep.java index 40650b42ee,22df7fce8a..b965330163 --- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/DefaultProcessStep.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/DefaultProcessStep.java @@@ -39,13 -39,8 +39,13 @@@ import org.apache.sis.internal.jaxb.Fil import org.apache.sis.internal.xml.LegacyNamespaces; import org.apache.sis.internal.jaxb.gml.TM_Primitive; import org.apache.sis.internal.jaxb.metadata.MD_Scope; - import org.apache.sis.internal.util.TemporalUtilities; + import org.apache.sis.internal.metadata.TemporalUtilities; +// Branch-specific imports +import org.opengis.annotation.UML; +import static org.opengis.annotation.Obligation.OPTIONAL; +import static org.opengis.annotation.Specification.ISO_19115; + /** * Information about an event or transformation in the life of a resource. diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultEvaluationMethod.java index 3eb0f7d26a,98b8c69e3c..bda1fdd6bf --- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultEvaluationMethod.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultEvaluationMethod.java @@@ -27,8 -27,12 +27,9 @@@ import jakarta.xml.bind.annotation.XmlR import jakarta.xml.bind.annotation.XmlSeeAlso; import org.opengis.util.InternationalString; import org.opengis.metadata.citation.Citation; -import org.opengis.metadata.quality.EvaluationMethod; import org.opengis.metadata.quality.EvaluationMethodType; -import org.opengis.metadata.quality.DataEvaluation; -import org.opengis.metadata.quality.AggregationDerivation; import org.apache.sis.internal.system.Semaphores; + import org.apache.sis.internal.util.CloneAccess; import org.apache.sis.util.collection.CheckedContainer; import org.apache.sis.util.resources.Errors; import org.apache.sis.util.ArgumentChecks; diff --cc core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecordSchema.java index 9829d6ec7d,7eb478f92b..8b3cfbfcf0 --- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecordSchema.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecordSchema.java @@@ -128,12 -124,13 +127,12 @@@ public class DefaultRecordSchema implem * @param parent the parent namespace, or {@code null} if none. * @param schemaName the name of the new schema. */ - public DefaultRecordSchema(NameFactory nameFactory, final NameSpace parent, final CharSequence schemaName) { + public DefaultRecordSchema(DefaultNameFactory nameFactory, final NameSpace parent, final CharSequence schemaName) { ArgumentChecks.ensureNonNull("schemaName", schemaName); if (nameFactory == null) { - nameFactory = DefaultFactories.forBuildin(NameFactory.class, DefaultNameFactory.class); + nameFactory = DefaultNameFactory.provider(); } this.nameFactory = nameFactory; - this.typeFactory = (nameFactory instanceof DefaultNameFactory) ? null : new TypeNames(nameFactory); this.namespace = nameFactory.createNameSpace(nameFactory.createLocalName(parent, schemaName), null); this.description = new WeakValueHashMap<>(TypeName.class); this.attributeTypes = new ConcurrentHashMap<>(); diff --cc core/sis-metadata/src/main/java/org/apache/sis/util/iso/Names.java index 84e6d4afbf,082413384d..40b8112f92 --- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Names.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Names.java @@@ -333,7 -332,7 +332,7 @@@ public final class Names extends Stati { ensureNonNull("localPart", localPart); ensureNonNull("attributeType", attributeType); - final DefaultNameFactory factory = DefaultFactories.forBuildin(NameFactory.class, DefaultNameFactory.class); - final NameFactory factory = DefaultNameFactory.provider(); ++ final DefaultNameFactory factory = DefaultNameFactory.provider(); return factory.createMemberName(createNameSpace(factory, namespace, separator), localPart, attributeType); } diff --cc core/sis-metadata/src/main/java/org/apache/sis/util/iso/Types.java index 9362211772,7fc10558b4..6ec6d7cf87 --- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Types.java +++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Types.java @@@ -292,9 -293,9 +292,9 @@@ public final class Types extends Stati * @see #getDescription(Class) */ @OptionalCandidate - public static InternationalString getDescription(final ControlledVocabulary code) { + public static InternationalString getDescription(final CodeList<?> code) { if (code != null) { - final String resources = getResources(code.getClass().getName()); + final String resources = toResourceName(code.getClass().getName()); if (resources != null) { return new Description(resources, Description.resourceKey(code)); } @@@ -359,15 -360,10 +359,13 @@@ */ private static final long serialVersionUID = -6202647167398898834L; + /** + * The class loader to use for fetching GeoAPI resources. - * Since the resources are bundled in the GeoAPI JAR file, - * we use the instance that loaded GeoAPI for more determinist behavior. + */ - private static final ClassLoader CLASSLOADER = UML.class.getClassLoader(); ++ private static final ClassLoader CLASSLOADER = Types.class.getClassLoader(); + /** * Creates a new international string from the specified resource bundle and key. - * The {@code resources} argument is only informative since this class overrides - * the {@link #getBundle(Locale)} method. * * @param resources the name of the resource bundle, as a fully qualified class name. * @param key the key for the resource to fetch. @@@ -377,11 -373,12 +375,11 @@@ } /** - * Loads the resources using the class loader used for loading GeoAPI interfaces. + * Loads the GeoAPI resources. A cache is managed by {@link ResourceBundle}. - * Note that the {@link #resources} field value is ignored. */ @Override - protected final ResourceBundle getBundle(final Locale locale) { + protected ResourceBundle getBundle(final Locale locale) { - return ResourceBundles.descriptions(locale); + return ResourceBundle.getBundle(resources, locale, CLASSLOADER); } /** @@@ -460,6 -467,9 +458,9 @@@ /** * Returns the resource name for the given GeoAPI type, or {@code null} if none. + * The non-null resource name is only informative in this implementation. - * However we need {@code null} value is still necessary for telling that - * no resource is expected to exist for the given class. ++ * We need to allow {@code null} return value for telling that no resource ++ * is expected to exist for the given class. * * @param classname the fully qualified name of the GeoAPI type. * @return the resource bundle to load, or {@code null} if none. @@@ -525,16 -539,10 +526,16 @@@ return null; } if (typeForNames == null) { - final Properties props; + final Class<Types> c = Types.class; + final InputStream in = c.getResourceAsStream("class-index.properties"); + if (in == null) { + throw new MissingResourceException("class-index.properties", c.getName(), identifier); + } + final Properties props = new Properties(); try { - props = ResourceBundles.classIndex(); + props.load(in); + in.close(); - } catch (IOException | IllegalArgumentException e) { + } catch (IOException e) { throw new BackingStoreException(e); } /* diff --cc core/sis-metadata/src/main/resources/org/apache/sis/metadata/iso/CodeLists.properties index 0000000000,0000000000..cb51675dc4 new file mode 100644 --- /dev/null +++ b/core/sis-metadata/src/main/resources/org/apache/sis/metadata/iso/CodeLists.properties @@@ -1,0 -1,0 +1,18 @@@ ++# Copy from GeoAPI 3.0 (BSD-like license) ++CI_DateTypeCode.creation=Creation ++CI_DateTypeCode.publication=Publication ++CI_DateTypeCode.revision=Revision ++CI_OnLineFunctionCode.download=Download ++CI_OnLineFunctionCode.information=Information ++CI_OnLineFunctionCode.offlineAccess=Offline access ++CI_OnLineFunctionCode.order=Order ++CI_OnLineFunctionCode.search=Search ++MD_ScopeCode.attribute=Attribute ++MD_ScopeCode.attributeType=Attribute type ++MD_ScopeCode.dataset=Dataset ++MD_ScopeCode.series=Series ++MD_ScopeCode.nonGeographicDataset=Non geographic dataset ++MD_ScopeCode.feature=Feature ++MD_ScopeCode.featureType=Feature type ++MD_ScopeCode.propertyType=Property type ++MD_ScopeCode.tile=Tile diff --cc core/sis-metadata/src/main/resources/org/apache/sis/metadata/iso/CodeLists_en.properties index 0000000000,0000000000..d70945d8ec new file mode 100644 --- /dev/null +++ b/core/sis-metadata/src/main/resources/org/apache/sis/metadata/iso/CodeLists_en.properties @@@ -1,0 -1,0 +1,1 @@@ ++# Inherit all resources from CodeLists.properties diff --cc core/sis-metadata/src/main/resources/org/apache/sis/metadata/iso/CodeLists_fr.properties index 0000000000,0000000000..f8afb6f9ed new file mode 100644 --- /dev/null +++ b/core/sis-metadata/src/main/resources/org/apache/sis/metadata/iso/CodeLists_fr.properties @@@ -1,0 -1,0 +1,18 @@@ ++# Copy from GeoAPI 3.0 (BSD-like license) ++CI_DateTypeCode.creation=Cr�ation ++CI_DateTypeCode.publication=Publication ++CI_DateTypeCode.revision=R�vision ++CI_OnLineFunctionCode.download=T�l�chargement ++CI_OnLineFunctionCode.information=Information ++CI_OnLineFunctionCode.offlineAccess=Acc�s hors ligne ++CI_OnLineFunctionCode.order=Commande en ligne ++CI_OnLineFunctionCode.search=Moteur de recherche ++MD_ScopeCode.attribute=Attribut ++MD_ScopeCode.attributeType=Type d\u2019attribut ++MD_ScopeCode.dataset=Jeu de donn�es ++MD_ScopeCode.series=S�rie ++MD_ScopeCode.nonGeographicDataset=Jeu de donn�es non g�ographiques ++MD_ScopeCode.feature=�l�ment ++MD_ScopeCode.featureType=Type d\u2019�l�ment ++MD_ScopeCode.propertyType=Type de propri�t� ++MD_ScopeCode.tile=Tuile diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultCoupledResourceTest.java index b32f592e0d,484eb40ef5..88d90a1963 --- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultCoupledResourceTest.java +++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultCoupledResourceTest.java @@@ -21,9 -21,10 +21,9 @@@ import org.opengis.util.ScopedName import org.opengis.util.NameFactory; import org.opengis.parameter.ParameterDescriptor; import org.opengis.metadata.citation.OnlineResource; -import org.opengis.metadata.identification.OperationMetadata; -import org.opengis.metadata.identification.DistributedComputingPlatform; +import org.apache.sis.internal.geoapi.evolution.UnsupportedCodeList; import org.apache.sis.internal.jaxb.metadata.replace.ServiceParameterTest; - import org.apache.sis.internal.system.DefaultFactories; + import org.apache.sis.util.iso.DefaultNameFactory; import org.apache.sis.xml.NilReason; import org.apache.sis.test.DependsOn; import org.apache.sis.test.TestCase; @@@ -62,8 -62,8 +62,8 @@@ public final class DefaultCoupledResour */ @Test public void testOperationNameResolve() { - final DefaultCoupledResource resource = create(DefaultFactories.forBuildin(NameFactory.class)); + final DefaultCoupledResource resource = create(DefaultNameFactory.provider()); - final OperationMetadata operation = resource.getOperation(); + final DefaultOperationMetadata operation = resource.getOperation(); /* * Test OperationName replacement when the name matches. */ diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java index 9e7c37c5c4,98c87b2420..8abc32c730 --- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java +++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java @@@ -19,12 -19,17 +19,12 @@@ package org.apache.sis.metadata.iso.ide import java.util.Set; import jakarta.xml.bind.JAXBException; import org.opengis.util.NameFactory; -import org.opengis.parameter.ParameterDirection; import org.opengis.parameter.ParameterDescriptor; import org.opengis.metadata.citation.Citation; -import org.opengis.metadata.identification.CouplingType; -import org.opengis.metadata.identification.CoupledResource; -import org.opengis.metadata.identification.OperationMetadata; -import org.opengis.metadata.identification.ServiceIdentification; -import org.opengis.metadata.identification.DistributedComputingPlatform; +import org.apache.sis.internal.geoapi.evolution.UnsupportedCodeList; import org.apache.sis.metadata.iso.citation.DefaultCitation; - import org.apache.sis.internal.system.DefaultFactories; import org.apache.sis.metadata.xml.TestUsingFile; + import org.apache.sis.util.iso.DefaultNameFactory; import org.apache.sis.xml.NilReason; import org.apache.sis.test.DependsOn; import org.junit.Test; diff --cc core/sis-metadata/src/test/java/org/apache/sis/util/iso/TypeNamesTest.java index 92f43b50c0,f3a5174413..5f129b4609 --- a/core/sis-metadata/src/test/java/org/apache/sis/util/iso/TypeNamesTest.java +++ b/core/sis-metadata/src/test/java/org/apache/sis/util/iso/TypeNamesTest.java @@@ -53,10 -52,10 +52,10 @@@ public final class TypeNamesTest extend private static void verifyLookup(final String namespace, final String name, final Class<?> valueClass) throws ClassNotFoundException { - final DefaultNameFactory factory = DefaultFactories.forBuildin(NameFactory.class, DefaultNameFactory.class); + final DefaultNameFactory factory = DefaultNameFactory.provider(); final TypeName type = factory.toTypeName(valueClass); assertNotNull(name, type); - assertSame (name, valueClass, type.toJavaType().get()); + assertSame (name, valueClass, ((DefaultTypeName) type).toJavaType().get()); assertEquals (name, namespace, type.scope().name().toString()); assertEquals (name, name, type.toString()); assertEquals (name, valueClass, TypeNames.toClass(namespace, name)); diff --cc core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingFactoryContainer.java index c7085dcbfc,d1b9933bc6..fa2600eb43 --- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingFactoryContainer.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingFactoryContainer.java @@@ -17,8 -17,9 +17,8 @@@ package org.apache.sis.internal.referencing; import java.util.Map; --import org.opengis.util.Factory; import org.opengis.util.FactoryException; + import org.opengis.util.NameFactory; import org.opengis.referencing.cs.CartesianCS; import org.opengis.referencing.cs.CSFactory; import org.opengis.referencing.cs.CSAuthorityFactory; @@@ -29,15 -30,14 +29,17 @@@ import org.opengis.referencing.datum.Da import org.opengis.referencing.operation.MathTransformFactory; import org.opengis.referencing.operation.CoordinateOperationFactory; import org.opengis.referencing.operation.CoordinateOperationAuthorityFactory; + import org.apache.sis.referencing.operation.transform.DefaultMathTransformFactory; import org.apache.sis.referencing.factory.NoSuchAuthorityFactoryException; + import org.apache.sis.referencing.factory.GeodeticObjectFactory; import org.apache.sis.referencing.CRS; - import org.apache.sis.internal.system.DefaultFactories; import org.apache.sis.internal.util.Constants; + import org.apache.sis.util.iso.DefaultNameFactory; import org.apache.sis.util.resources.Errors; +// Branch-dependent imports +import org.apache.sis.referencing.operation.DefaultCoordinateOperationFactory; + /** * A container of factories frequently used together. @@@ -126,6 -142,23 +144,23 @@@ public class ReferencingFactoryContaine public ReferencingFactoryContainer() { } + /** + * Creates a new instance with factories fetched from the given map of properties. + * Factories that are not present in the map will be left to their default value. + * This method recognizes the keys declared as static {@link String} constants in this class. + * Other entries are ignored. + * + * @param properties the factories. + */ + public ReferencingFactoryContainer(final Map<String,?> properties) { + nameFactory = (NameFactory) properties.get(NAME_FACTORY); + datumFactory = (DatumFactory) properties.get(DATUM_FACTORY); + csFactory = (CSFactory) properties.get(CS_FACTORY); + crsFactory = (CRSFactory) properties.get(CRS_FACTORY); - operationFactory = (CoordinateOperationFactory) properties.get(OPERATION_FACTORY); ++ operationFactory = (DefaultCoordinateOperationFactory) properties.get(OPERATION_FACTORY); + mtFactory = (MathTransformFactory) properties.get(MT_FACTORY); + } + /** * Creates a new instance which will use the given factories. * Any factory given in argument may be {@code null} if lazy instantiation is desired. @@@ -173,11 -207,12 +209,12 @@@ * @return {@code true} if the factory changed as a result of this method call. * @throws IllegalArgumentException if the {@code type} argument is not one of the valid values. */ -- public final <T extends Factory> boolean setFactory(final Class<T> type, final T factory) { - if (type == CRSFactory.class) return crsFactory != (crsFactory = (CRSFactory) factory); - if (type == CSFactory.class) return csFactory != (csFactory = (CSFactory) factory); ++ public final <T> boolean setFactory(final Class<T> type, final T factory) { + if (type == NameFactory.class) return nameFactory != (nameFactory = (NameFactory) factory); if (type == DatumFactory.class) return datumFactory != (datumFactory = (DatumFactory) factory); + if (type == CSFactory.class) return csFactory != (csFactory = (CSFactory) factory); + if (type == CRSFactory.class) return crsFactory != (crsFactory = (CRSFactory) factory); - if (type == CoordinateOperationFactory.class) return operationFactory != (operationFactory = (CoordinateOperationFactory) factory); + if (type == CoordinateOperationFactory.class) return operationFactory != (operationFactory = (DefaultCoordinateOperationFactory) factory); if (type == MathTransformFactory.class) return mtFactory != (mtFactory = (MathTransformFactory) factory); throw new IllegalArgumentException(Errors.format(Errors.Keys.IllegalArgumentValue_2, "type", type)); } @@@ -202,11 -238,12 +240,12 @@@ * @return the factory for the given type. * @throws IllegalArgumentException if the {@code type} argument is not one of the valid values. */ -- public final <T extends Factory> T getFactory(final Class<T> type) { -- final Factory f; - if (type == CRSFactory.class) f = getCRSFactory(); - else if (type == CSFactory.class) f = getCSFactory(); ++ public final <T> T getFactory(final Class<T> type) { ++ final Object f; + if (type == NameFactory.class) f = getNameFactory(); else if (type == DatumFactory.class) f = getDatumFactory(); + else if (type == CSFactory.class) f = getCSFactory(); + else if (type == CRSFactory.class) f = getCRSFactory(); else if (type == CoordinateOperationFactory.class) f = getCoordinateOperationFactory(); else if (type == MathTransformFactory.class) f = getMathTransformFactory(); else { @@@ -317,15 -307,10 +309,15 @@@ * * @return the Coordinate Operation factory (never {@code null}). */ - public final CoordinateOperationFactory getCoordinateOperationFactory() { + public final DefaultCoordinateOperationFactory getCoordinateOperationFactory() { if (operationFactory == null) { - operationFactory = CoordinateOperations.getCoordinateOperationFactory(defaultProperties, mtFactory, crsFactory, csFactory); + CoordinateOperationFactory op = CoordinateOperations.getCoordinateOperationFactory(defaultProperties, mtFactory, crsFactory, csFactory); defaultProperties = null; // Not needed anymore. + if (op instanceof DefaultCoordinateOperationFactory) { + operationFactory = (DefaultCoordinateOperationFactory) op; + } else { - operationFactory = CoordinateOperations.factory(); ++ operationFactory = DefaultCoordinateOperationFactory.provider(); + } } return operationFactory; } diff --cc core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java index af0ace2389,748613cc6d..3eb2ba5006 --- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java @@@ -500,86 -470,6 +499,86 @@@ public final class ServicesForMetadata return DefaultParameterDescriptor.castOrCopy(parameter); } + /** + * Creates a parametric CS. This method requires the SIS factory + * since parametric CRS were not available in GeoAPI 3.0. + * + * <p>This method is actually not needed anymore for {@code sis-metadata} module, + * but is still defined here for historical reason. This method is removed on SIS + * branches using a GeoAPI versions more recent than 3.0.</p> + * + * @param properties the coordinate system name, and optionally other properties. + * @param axis the axis of the parametric coordinate system. + * @param factory the factory to use for creating the coordinate system. + * @return a parametric coordinate system using the given axes. + * @throws FactoryException if the parametric object creation failed. + * + * @since 0.7 + */ + public static CoordinateSystem createParametricCS(final Map<String,?> properties, final CoordinateSystemAxis axis, + CSFactory factory) throws FactoryException + { + if (!(factory instanceof GeodeticObjectFactory)) { - factory = DefaultFactories.forBuildin(CSFactory.class, GeodeticObjectFactory.class); ++ factory = GeodeticObjectFactory.provider(); + } + return ((GeodeticObjectFactory) factory).createParametricCS(properties, axis); + } + + /** + * Creates a parametric datum. This method requires the SIS factory + * since parametric CRS were not available in GeoAPI 3.0. + * + * <p>This method is actually not needed anymore for {@code sis-metadata} module, + * but is still defined here for historical reason. This method is removed on SIS + * branches using a GeoAPI versions more recent than 3.0.</p> + * + * @param properties the datum name, and optionally other properties. + * @param factory the factory to use for creating the datum. + * @return a parametric datum using the given name. + * @throws FactoryException if the parametric object creation failed. + * + * @since 0.7 + */ + public static Datum createParametricDatum(final Map<String,?> properties, DatumFactory factory) + throws FactoryException + { + if (!(factory instanceof GeodeticObjectFactory)) { - factory = DefaultFactories.forBuildin(DatumFactory.class, GeodeticObjectFactory.class); ++ factory = GeodeticObjectFactory.provider(); + } + return ((GeodeticObjectFactory) factory).createParametricDatum(properties); + } + + /** + * Creates a parametric CRS. This method requires the SIS factory + * since parametric CRS were not available in GeoAPI 3.0. + * + * <p>This method is actually not needed anymore for {@code sis-metadata} module, + * but is still defined here for historical reason. This method is removed on SIS + * branches using a GeoAPI versions more recent than 3.0.</p> + * + * @param properties the coordinate reference system name, and optionally other properties. + * @param datum the parametric datum. + * @param cs the parametric coordinate system. + * @param factory the factory to use for creating the coordinate reference system. + * @return a parametric coordinate system using the given axes. + * @throws FactoryException if the parametric object creation failed. + * + * @since 0.7 + */ + public static SingleCRS createParametricCRS(final Map<String,?> properties, final Datum datum, + final CoordinateSystem cs, CRSFactory factory) throws FactoryException + { + if (!(factory instanceof GeodeticObjectFactory)) { - factory = DefaultFactories.forBuildin(CRSFactory.class, GeodeticObjectFactory.class); ++ factory = GeodeticObjectFactory.provider(); + } + try { + return ((GeodeticObjectFactory) factory).createParametricCRS(properties, + (DefaultParametricDatum) datum, (DefaultParametricCS) cs); + } catch (ClassCastException e) { + throw new InvalidGeodeticParameterException(e.toString(), e); + } + } + /** * Creates a format for {@link DirectPosition} instances. * @@@ -601,73 -491,9 +600,73 @@@ */ @Override public CoordinateOperationFactory getCoordinateOperationFactory() { - return CoordinateOperations.factory(); + return DefaultCoordinateOperationFactory.provider(); } + /** + * Returns the coordinate operation method for the given classification. + * This method checks if the given {@code opFactory} is a SIS implementation + * before to fallback on a slower fallback. + * + * <p>This method is actually not needed anymore for {@code sis-metadata} module, + * but is still defined here for historical reason. This method is removed on SIS + * branches using a GeoAPI versions more recent than 3.0.</p> + * + * @param opFactory The coordinate operation factory to use if it is a SIS implementation. + * @param mtFactory The math transform factory to use as a fallback. + * @param identifier The name or identifier of the operation method to search. + * @return The coordinate operation method for the given name or identifier. + * @throws FactoryException if an error occurred which searching for the given method. + * + * @since 0.6 + */ + public static OperationMethod getOperationMethod(final CoordinateOperationFactory opFactory, + final MathTransformFactory mtFactory, final String identifier) throws FactoryException + { + if (opFactory instanceof DefaultCoordinateOperationFactory) { + ((DefaultCoordinateOperationFactory) opFactory).getOperationMethod(identifier); + } + final OperationMethod method = getOperationMethod(mtFactory.getAvailableMethods(SingleOperation.class), identifier); + if (method != null) { + return method; + } + throw new NoSuchIdentifierException("No such operation method: " + identifier, identifier); + } + + /** + * Returns the operation method for the specified name or identifier. The given argument shall be either a + * method name (e.g. <cite>"Transverse Mercator"</cite>) or one of its identifiers (e.g. {@code "EPSG:9807"}). + * + * @param methods the method candidates. + * @param identifier the name or identifier of the operation method to search. + * @return the coordinate operation method for the given name or identifier, or {@code null} if none. + * + * @see org.apache.sis.referencing.operation.DefaultCoordinateOperationFactory#getOperationMethod(String) + * @see org.apache.sis.referencing.operation.transform.DefaultMathTransformFactory#getOperationMethod(String) + * + * @since 0.6 + */ + private static OperationMethod getOperationMethod(final Iterable<? extends OperationMethod> methods, final String identifier) { + OperationMethod fallback = null; + for (final OperationMethod method : methods) { + if (IdentifiedObjects.isHeuristicMatchForName(method, identifier) || + NameToIdentifier.isHeuristicMatchForIdentifier(method.getIdentifiers(), identifier)) + { + /* + * Stop the iteration at the first non-deprecated method. + * If we find only deprecated methods, take the first one. + */ + if (!(method instanceof Deprecable) || !((Deprecable) method).isDeprecated()) { + return method; + } + if (fallback == null) { + fallback = method; + } + } + } + return fallback; + } + /** * Returns information about the Apache SIS configuration. * See super-class for a list of keys. diff --cc core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationRegistry.java index 27a1ca7f1b,b6d8da1e7f..6d38a42191 --- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationRegistry.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationRegistry.java @@@ -1290,13 -1280,13 +1280,10 @@@ class CoordinateOperationRegistry if (descriptor != null) { final Identifier name = descriptor.getName(); if (name != null) { - method = factory.getOperationMethod(name.getCode()); + method = factorySIS.getOperationMethod(name.getCode()); } if (method == null) { - method = factorySIS.createOperationMethod(properties, - method = factory.createOperationMethod(properties, -- sourceCRS.getCoordinateSystem().getDimension(), -- targetCRS.getCoordinateSystem().getDimension(), -- descriptor); ++ method = factorySIS.createOperationMethod(properties, descriptor); } } } diff --cc core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/GeocentricTranslationTest.java index b9339c56e2,c22d216e3d..70a0ff4b2b --- a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/GeocentricTranslationTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/GeocentricTranslationTest.java @@@ -23,7 -24,7 +23,6 @@@ import org.opengis.referencing.operatio import org.opengis.referencing.operation.MathTransformFactory; import org.opengis.referencing.operation.NoninvertibleTransformException; import org.opengis.referencing.operation.TransformException; - import org.apache.sis.internal.system.DefaultFactories; -import org.opengis.test.ToleranceModifier; import org.apache.sis.internal.referencing.Formulas; import org.apache.sis.parameter.Parameters; import org.apache.sis.referencing.CommonCRS; diff --cc core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/ProvidersTest.java index 83ebfba9d9,14cac2b1b5..8e2fd0865a --- a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/ProvidersTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/ProvidersTest.java @@@ -24,8 -25,6 +25,7 @@@ import org.opengis.metadata.Identifier import org.opengis.parameter.GeneralParameterDescriptor; import org.opengis.parameter.ParameterDescriptorGroup; import org.opengis.referencing.operation.OperationMethod; - import org.apache.sis.referencing.operation.DefaultOperationMethod; +import org.apache.sis.parameter.DefaultParameterDescriptor; import org.apache.sis.test.DependsOn; import org.apache.sis.test.TestCase; import org.junit.Test; diff --cc core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java index 46fa7ad0c2,0c257e34fb..814c8b103c --- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java @@@ -24,11 -24,10 +24,11 @@@ import org.opengis.util.GenericName import org.opengis.util.NameFactory; import org.opengis.metadata.citation.Citation; import org.opengis.metadata.Identifier; +import org.opengis.referencing.ReferenceIdentifier; import org.apache.sis.internal.simple.SimpleCitation; import org.apache.sis.internal.simple.SimpleIdentifier; - import org.apache.sis.internal.system.DefaultFactories; import org.apache.sis.metadata.iso.citation.Citations; + import org.apache.sis.util.iso.DefaultNameFactory; import org.apache.sis.test.DependsOnMethod; import org.apache.sis.test.DependsOn; import org.apache.sis.test.TestCase; diff --cc core/sis-referencing/src/test/java/org/apache/sis/referencing/NamedIdentifierTest.java index a84c54f616,9118984e9c..c4bd875e58 --- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/NamedIdentifierTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/NamedIdentifierTest.java @@@ -22,10 -21,11 +22,10 @@@ import org.opengis.util.InternationalSt import org.opengis.util.NameSpace; import org.opengis.util.GenericName; import org.opengis.util.NameFactory; -import org.opengis.metadata.Identifier; import org.opengis.test.Validators; import org.apache.sis.metadata.iso.citation.Citations; - import org.apache.sis.internal.system.DefaultFactories; import org.apache.sis.util.DefaultInternationalString; + import org.apache.sis.util.iso.DefaultNameFactory; import org.apache.sis.test.DependsOnMethod; import org.apache.sis.test.TestCase; import org.junit.Test; @@@ -72,10 -72,10 +72,10 @@@ public final class NamedIdentifierTest */ @Test public void testCreateFromName() { - final NameFactory factory = DefaultFactories.forBuildin(NameFactory.class); + final NameFactory factory = DefaultNameFactory.provider(); final NameSpace scope = factory.createNameSpace(factory.createLocalName(null, "IOGP"), null); final NamedIdentifier identifier = new NamedIdentifier(factory.createGenericName(scope, "EPSG", "4326")); - Validators.validate((Identifier) identifier); + Validators.validate((ReferenceIdentifier) identifier); Validators.validate((GenericName) identifier); // ImmutableIdentifier properties diff --cc core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/ObliqueStereographicTest.java index c8ca9b95a5,3090beb435..1e52e5a265 --- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/ObliqueStereographicTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/ObliqueStereographicTest.java @@@ -20,12 -20,12 +20,11 @@@ import org.opengis.parameter.ParameterV import org.opengis.referencing.operation.Matrix; import org.opengis.referencing.operation.OperationMethod; import org.opengis.referencing.operation.TransformException; - import org.opengis.referencing.operation.MathTransformFactory; import org.opengis.util.FactoryException; import org.apache.sis.parameter.Parameters; + import org.apache.sis.referencing.operation.transform.DefaultMathTransformFactory; import org.apache.sis.referencing.operation.transform.ContextualParameters; -import org.apache.sis.referencing.operation.matrix.Matrix2; import org.apache.sis.internal.referencing.Formulas; - import org.apache.sis.internal.system.DefaultFactories; import org.apache.sis.measure.Units; import org.apache.sis.test.DependsOnMethod; import org.apache.sis.test.DependsOn; diff --cc core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/AbridgedMolodenskyTransformTest.java index 57bc1e94da,98e0060247..94b7e2a679 --- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/AbridgedMolodenskyTransformTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/AbridgedMolodenskyTransformTest.java @@@ -16,12 -16,11 +16,10 @@@ */ package org.apache.sis.referencing.operation.transform; -import org.opengis.test.CalculationType; import org.opengis.util.FactoryException; import org.opengis.referencing.operation.MathTransform; - import org.opengis.referencing.operation.MathTransformFactory; import org.opengis.referencing.operation.TransformException; import org.apache.sis.referencing.datum.HardCodedDatum; - import org.apache.sis.internal.system.DefaultFactories; import org.apache.sis.internal.referencing.Formulas; import org.apache.sis.test.DependsOnMethod; import org.apache.sis.test.DependsOn; diff --cc core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MolodenskyTransformTest.java index 6712429d88,68357ece80..021659da02 --- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MolodenskyTransformTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MolodenskyTransformTest.java @@@ -23,12 -25,15 +23,11 @@@ import org.opengis.referencing.operatio import org.opengis.referencing.operation.TransformException; import org.opengis.parameter.ParameterValueGroup; import org.apache.sis.internal.referencing.provider.FranceGeocentricInterpolation; -import org.apache.sis.internal.referencing.provider.AbridgedMolodensky; import org.apache.sis.internal.referencing.provider.Molodensky; - import org.apache.sis.internal.system.DefaultFactories; import org.apache.sis.internal.referencing.Formulas; import org.apache.sis.referencing.CommonCRS; -import org.apache.sis.math.StatisticsFormat; -import org.apache.sis.math.Statistics; import static java.lang.StrictMath.*; -import static org.apache.sis.internal.metadata.ReferencingServices.NAUTICAL_MILE; // Test dependencies import org.apache.sis.internal.referencing.provider.FranceGeocentricInterpolationTest; diff --cc core/sis-utility/src/main/java/org/apache/sis/internal/util/CodeLists.java index 618b2803bf,d46f79a4c1..6a5c9919c9 --- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/CodeLists.java +++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/CodeLists.java @@@ -26,21 -27,16 +26,20 @@@ import org.apache.sis.util.Characters.F /** * Implementation of some {@link org.apache.sis.util.iso.Types} methods needed by {@code sis-utility} module. - * This class opportunistically implements {@link Predicate} interface, but this is an implementation details. + * This class opportunistically implements {@link CodeList.Filter} interface, but this should be considered + * an implementation details. * * @author Martin Desruisseaux (Geomatys) - * @version 1.0 + * @version 1.4 * @since 1.0 */ -public final class CodeLists implements Predicate<CodeList<?>> { +public final class CodeLists implements CodeList.Filter { + /** - * The name of bundle resources for code list titles. The resources should be loaded with - * the same class loader than {@code org.opengis.annotation.UML.class.getClassLoader()}. ++ * The name of bundle resources for code list titles. + * Keys are {@link CodeList#identifier()}. + */ - public static final String RESOURCES = "org.opengis.metadata.CodeLists"; ++ public static final String RESOURCES = "org.apache.sis.metadata.iso.CodeLists"; + /** * The name to compare during filtering operation. */ diff --cc core/sis-utility/src/main/java/org/apache/sis/internal/util/MetadataServices.java index 1dbc36fcdd,ff6a7f1f12..6a51e000bc --- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/MetadataServices.java +++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/MetadataServices.java @@@ -19,12 -19,12 +19,9 @@@ package org.apache.sis.internal.util import java.text.Format; import java.util.Locale; import java.util.TimeZone; - import java.util.ResourceBundle; --import java.util.MissingResourceException; import java.util.function.Supplier; import javax.sql.DataSource; import java.sql.SQLException; --import org.opengis.annotation.UML; -import org.opengis.annotation.ResourceBundles; import org.opengis.metadata.citation.Citation; import org.apache.sis.internal.system.Modules; import org.apache.sis.internal.system.OptionalDependency; @@@ -121,25 -121,24 +118,9 @@@ public class MetadataServices extends O * @param locale desired locale for the title. * @return the title. * - * @see org.apache.sis.util.iso.Types#getCodeTitle(ControlledVocabulary) + * @see org.apache.sis.util.iso.Types#getCodeTitle(CodeList) */ - public String getCodeTitle(final ControlledVocabulary code, final Locale locale) { - /* - * Following code reproduces the work done by org.apache.sis.util.iso.Types.getCodeList(…) - * with less handling of special cases. It is executed only if the sis-metadata module is - * not on the classpath, otherwise the sis-metadata implementation will be used. - */ - final UML uml = code.getClass().getAnnotation(UML.class); - if (uml != null) try { - return ResourceBundles.codeLists(locale).getString(uml.identifier() + '.' + code.identifier()); - } catch (MissingResourceException e) { - /* - * Ignore. The reason for not finding the resource may because of above code not covering enough cases. - * Usually the sis-metadata module will be present on the classpath, in which case this implementation - * will not be used. We need just enough code for allowing sis-utility tests to pass. - */ - } + public String getCodeTitle(final CodeList<?> code, final Locale locale) { - /* - * Following code reproduces the work done by org.apache.sis.util.iso.Types.getCodeList(…) - * with less handling of special cases. It is executed only if the sis-metadata module is - * not on the classpath, otherwise the sis-metadata implementation will be used. - */ - final UML uml = code.getClass().getAnnotation(UML.class); - if (uml != null) try { - return ResourceBundle.getBundle(CodeLists.RESOURCES, locale, UML.class.getClassLoader()) - .getString(uml.identifier() + '.' + code.identifier()); - } catch (MissingResourceException e) { - /* - * Ignore. The reason for not finding the resource may because of above code not covering enough cases. - * Usually the sis-metadata module will be present on the classpath, in which case this implementation - * will not be used. We need just enough code for allowing sis-utility tests to pass. - */ - } return CharSequences.camelCaseToSentence(code.identifier()).toString(); } diff --cc core/sis-utility/src/test/java/org/apache/sis/util/resources/IndexedResourceBundleTest.java index c1f1c34312,2851ee6382..c3c549f484 --- a/core/sis-utility/src/test/java/org/apache/sis/util/resources/IndexedResourceBundleTest.java +++ b/core/sis-utility/src/test/java/org/apache/sis/util/resources/IndexedResourceBundleTest.java @@@ -161,7 -159,7 +159,6 @@@ public final class IndexedResourceBundl /** * Tests the {@link IndexedResourceBundle#getString(short, Object)} method with a {@code CodeList} argument. -- * The intent is to test the code list localization. */ @Test @DependsOnMethod("testGetStringWithParameter") @@@ -169,7 -167,7 +166,7 @@@ testing = Errors.getResources(Locale.ENGLISH); assertEquals("Argument ‘Series’ shall not be null.", testing.getString(Errors.Keys.NullArgument_1, ScopeCode.SERIES)); testing = Errors.getResources(Locale.FRENCH); -- assertEquals("L’argument ‘Série’ ne doit pas être nul.", testing.getString(Errors.Keys.NullArgument_1, ScopeCode.SERIES)); ++ assertEquals("L’argument ‘Series’ ne doit pas être nul.", testing.getString(Errors.Keys.NullArgument_1, ScopeCode.SERIES)); testing = null; } diff --cc storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/CRSBuilder.java index 43ba5eaa80,6ef4948732..14c79675c7 --- a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/CRSBuilder.java +++ b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/CRSBuilder.java @@@ -37,7 -37,7 +37,6 @@@ import org.opengis.referencing.crs.Geog import org.opengis.referencing.crs.GeocentricCRS; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.NoSuchAuthorityCodeException; --import org.opengis.referencing.operation.CoordinateOperationFactory; import org.opengis.referencing.operation.OperationMethod; import org.opengis.referencing.operation.Conversion; import org.opengis.referencing.operation.Matrix; @@@ -50,9 -50,9 +49,8 @@@ import org.apache.sis.referencing.crs.A import org.apache.sis.referencing.crs.DefaultGeographicCRS; import org.apache.sis.referencing.crs.DefaultGeocentricCRS; import org.apache.sis.referencing.factory.InvalidGeodeticParameterException; -import org.apache.sis.referencing.operation.DefaultCoordinateOperationFactory; import org.apache.sis.internal.referencing.provider.Equirectangular; - import org.apache.sis.internal.system.DefaultFactories; - import org.apache.sis.internal.util.TemporalUtilities; + import org.apache.sis.internal.metadata.TemporalUtilities; import org.apache.sis.storage.DataStoreContentException; import org.apache.sis.storage.DataStoreException; import org.apache.sis.util.resources.Errors; @@@ -794,8 -788,7 +792,7 @@@ previous: for (int i=components.size( */ private static final Conversion UNKNOWN_PROJECTION; static { - final DefaultCoordinateOperationFactory factory = DefaultFactories.forBuildin( - CoordinateOperationFactory.class, DefaultCoordinateOperationFactory.class); - final CoordinateOperationFactory factory = DefaultCoordinateOperationFactory.provider(); ++ final DefaultCoordinateOperationFactory factory = DefaultCoordinateOperationFactory.provider(); try { final OperationMethod method = factory.getOperationMethod(Equirectangular.NAME); UNKNOWN_PROJECTION = factory.createDefiningConversion( diff --cc storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Decoder.java index 1805fdd7aa,c9578e6ffe..257a82fd74 --- a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Decoder.java +++ b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Decoder.java @@@ -31,7 -31,7 +31,6 @@@ import java.util.logging.Level import java.io.IOException; import java.nio.file.Path; import org.opengis.util.NameSpace; --import org.opengis.util.NameFactory; import org.opengis.referencing.datum.Datum; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.apache.sis.setup.GeometryLibrary;
