This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit 32936ed8d4bcec29f82d0c302b0a3bcf031127f0 Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Fri Sep 17 15:15:49 2021 +0200 Following removal of "sis-gdal" module in previous commit, remove (for now) the `SpecializedOperationFactory` interface. Remove also the code for loading a native library (not used anymore). --- .../referencing/SpecializedOperationFactory.java | 55 ------ .../operation/CoordinateOperationFinder.java | 19 -- .../operation/CoordinateOperationRegistry.java | 9 +- .../DefaultCoordinateOperationFactory.java | 28 --- .../java/org/apache/sis/internal/system/OS.java | 196 --------------------- .../apache/sis/util/logging/MonolineFormatter.java | 3 +- ide-project/NetBeans/build.xml | 7 - 7 files changed, 2 insertions(+), 315 deletions(-) diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/SpecializedOperationFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/SpecializedOperationFactory.java deleted file mode 100644 index a036ce9..0000000 --- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/SpecializedOperationFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.referencing; - -import java.util.Set; -import org.opengis.util.FactoryException; -import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.referencing.operation.CoordinateOperation; - - -/** - * Implemented by extension modules capable to provide coordinate operations for some particular pairs of CRS. - * Implementations of this interface are not general-purpose factories; - * they should not process any pair of CRS other than the one for which they are designed. - * - * <div class="note"><b>Example:</b> - * a module doing the bindings between Apache SIS and another map projection library may create wrappers - * around the transformation method of that other library when {@code findOperations(…)} recognizes the - * given CRS as wrappers around their data structures.</div> - * - * @author Martin Desruisseaux (Geomatys) - * @version 0.8 - * @since 0.8 - * @module - */ -public interface SpecializedOperationFactory { - /** - * Returns operations between the given pair of CRS, or an empty set if this factory does not recognize them. - * Non-empty sets have precedence over EPSG geodetic dataset or other mechanism used by Apache SIS, so should - * be used sparsely. - * - * @param sourceCRS the coordinate reference system of source points (before transformation). - * @param targetCRS the coordinate reference system of target points (after transformation). - * @return the coordinate operations from source to target CRS, or an empty set if this factory - * does not recognize the given pair of CRSs. - * @throws FactoryException if this factory recognizes the CRSs given in arguments, - * but an error occurred while creating the coordinate operation. - */ - Set<CoordinateOperation> findOperations(CoordinateReferenceSystem sourceCRS, CoordinateReferenceSystem targetCRS) - throws FactoryException; -} diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java index a3ab4b1..94f9495 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java @@ -48,7 +48,6 @@ import org.apache.sis.internal.referencing.provider.Geographic3Dto2D; import org.apache.sis.internal.referencing.provider.GeographicToGeocentric; import org.apache.sis.internal.referencing.provider.GeocentricToGeographic; import org.apache.sis.internal.referencing.provider.GeocentricAffine; -import org.apache.sis.internal.referencing.SpecializedOperationFactory; import org.apache.sis.internal.referencing.Resources; import org.apache.sis.internal.util.Constants; import org.apache.sis.measure.Units; @@ -266,24 +265,6 @@ public class CoordinateOperationFinder extends CoordinateOperationRegistry { areaOfInterest = CoordinateOperationContext.setGeographicBoundingBox(areaOfInterest, bbox); } /* - * Verify if some extension module handles this pair of CRS in a special way. For example it may - * be the "sis-gdal" module checking if the given CRS are wrappers around Proj.4 data structure. - */ - { // For keeping `operations` list locale. - final List<CoordinateOperation> operations = new ArrayList<>(); - for (final SpecializedOperationFactory sp : factorySIS.getSpecializedFactories()) { - for (final CoordinateOperation op : sp.findOperations(sourceCRS, targetCRS)) { - if (filter(op)) { - operations.add(op); - } - } - } - if (!operations.isEmpty()) { - CoordinateOperationSorter.sort(operations, bbox); - return operations; - } - } - /* * Verify in the EPSG dataset if the operation is explicitly defined by an authority. */ if (registry != null) { diff --git 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 index 299f63e..f81df93 100644 --- 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 @@ -626,7 +626,7 @@ class CoordinateOperationRegistry { * FactoryException propagate. */ operation = complete(operation, sourceCRS, targetCRS); - if (filter(operation)) { + if (filter == null || filter.test(operation)) { if (stopAtFirst) { operations.clear(); operations.add(operation); @@ -641,13 +641,6 @@ class CoordinateOperationRegistry { } /** - * Returns {@code true} if the given operation can be accepted. - */ - final boolean filter(final CoordinateOperation op) { - return filter == null || filter.test(op); - } - - /** * Creates the inverse of the given single operation. * If this operation succeed, then the returned coordinate operations has the following properties: * diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java index 45efa18..7b9484c 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java @@ -21,7 +21,6 @@ import java.util.HashMap; import java.util.Collections; import java.util.List; import java.util.Objects; -import java.util.ServiceLoader; import org.opengis.util.FactoryException; import org.opengis.util.NoSuchIdentifierException; import org.opengis.parameter.ParameterValueGroup; @@ -36,11 +35,9 @@ import org.opengis.referencing.crs.SingleCRS; import org.opengis.referencing.crs.CRSFactory; import org.opengis.referencing.cs.CSFactory; import org.opengis.referencing.datum.Datum; -import org.apache.sis.internal.referencing.LazySet; import org.apache.sis.internal.referencing.Resources; import org.apache.sis.internal.referencing.MergedProperties; import org.apache.sis.internal.referencing.CoordinateOperations; -import org.apache.sis.internal.referencing.SpecializedOperationFactory; import org.apache.sis.internal.referencing.ReferencingFactoryContainer; import org.apache.sis.internal.referencing.ReferencingUtilities; import org.apache.sis.internal.system.DefaultFactories; @@ -130,17 +127,6 @@ public class DefaultCoordinateOperationFactory extends AbstractFactory implement private volatile MathTransformFactory mtFactory; /** - * Factories specialized to some particular pair of CRS. For example a module doing the bindings between - * Apache SIS and another map projection library may create wrappers around the transformation method of - * that other library when {@code SpecializedOperationFactory.tryCreateOperation(…)} recognizes the given - * CRS as wrappers around their data structures. - * - * <p>This array is created when first needed. After creation, the array shall not be modified anymore.</p> - */ - @SuppressWarnings("VolatileArrayField") - private volatile SpecializedOperationFactory[] specializedFactories; - - /** * Weak references to existing objects. * This set is used in order to return a pre-existing object instead of creating a new one. * This applies to objects created explicitly, not to coordinate operations inferred by a @@ -277,20 +263,6 @@ public class DefaultCoordinateOperationFactory extends AbstractFactory implement } /** - * Returns all known factories specialized in the creation of coordinate operations between some particular - * pairs of CRS. - */ - final SpecializedOperationFactory[] getSpecializedFactories() { - SpecializedOperationFactory[] factories = specializedFactories; - if (factories == null) { - final LazySet<SpecializedOperationFactory> set = - new LazySet<>(ServiceLoader.load(SpecializedOperationFactory.class).iterator()); - specializedFactories = factories = set.toArray(new SpecializedOperationFactory[set.size()]); - } - return factories; - } - - /** * Returns the operation method of the given name. The given argument shall be either a method * {@linkplain DefaultOperationMethod#getName() name} (e.g. <cite>"Transverse Mercator"</cite>) * or one of its {@linkplain DefaultOperationMethod#getIdentifiers() identifiers} (e.g. {@code "EPSG:9807"}). diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/system/OS.java b/core/sis-utility/src/main/java/org/apache/sis/internal/system/OS.java deleted file mode 100644 index 2a53697..0000000 --- a/core/sis-utility/src/main/java/org/apache/sis/internal/system/OS.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * 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.system; - -import java.net.URL; -import java.net.URI; -import java.net.URISyntaxException; -import java.io.File; -import java.io.InputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import org.apache.sis.util.logging.Logging; -import org.apache.sis.util.resources.Errors; - - -/** - * The operation system on which SIS is running. - * - * @author Martin Desruisseaux (Geomatys) - * @version 0.8 - * @since 0.3 - * @module - */ -public enum OS { - /** - * Unknown system. - */ - UNKNOWN(null, false), - - /** - * Windows. - */ - WINDOWS("windows", false), - - /** - * Mac OS. - */ - MAC_OS("darwin", true), - - /** - * Linux. - */ - LINUX("linux", true); - - /** - * The sub-directory where to look for native files ({@code .so} or {@code .dll}). - * Those subdirectories are not standard (as far as we know) and could change in - * any future Apache SIS version. The directory is {@code null} for unknown OS. - */ - private final String libdir; - - /** - * {@code true} if this OS is a kind of Unix. - */ - public final boolean unix; - - /** - * Creates a new enumeration. - */ - private OS(final String libdir, final boolean unix) { - this.libdir = libdir; - this.unix = unix; - } - - /** - * Returns the name value of {@code "os.name"} property, or {@code null} if the security manager - * does not allow us to access this information. - * - * <div class="note"><b>Note:</b> {@code uname} is an Unix command providing the same information.</div> - * - * @return the operation system name, or {@code null} if this information is not available. - */ - public static String uname() { - try { - return System.getProperty("os.name"); - } catch (SecurityException e) { - Logging.recoverableException(Logging.getLogger(Loggers.SYSTEM), OS.class, "uname", e); - return null; - } - } - - /** - * Returns the operating system SIS is currently on. - * - * @return the operation system. - */ - public static OS current() { - final String name = uname(); - if (name != null) { - if (name.contains("Windows")) return WINDOWS; - if (name.contains("Mac OS")) return MAC_OS; - if (name.contains("Linux")) return LINUX; - } - return UNKNOWN; - } - - /** - * Loads the native library of the given name from the JAR file of the given class. - * This method searches for a resource in the {@code /native/<os>} directory where - * {@code <os>} is {@code windows}, {@code darwin} or {@code linux}. - * - * @param caller a class in the JAR file where to look for native resources. - * @param name the native library name without {@code ".so"} or {@code ".dll"} extension. - * @throws UnsatisfiedLinkError if the native library can not be loaded for the current OS. - * - * @see System#load(String) - */ - public static void load(final Class<?> caller, final String name) { - try { - System.load(current().nativeLibrary(caller, name)); - } catch (IOException | SecurityException e) { - throw (UnsatisfiedLinkError) new UnsatisfiedLinkError(e.getMessage()).initCause(e); - } - } - - /** - * Returns an absolute path to the library of the given name in the JAR file. - * If the resources can not be accessed by an absolute path, then this method - * copies the resource in a temporary file. - * - * @param caller a class in the JAR file where to look for native resources. - * @param name the native library name without {@code ".so"} or {@code ".dll"} extension. - * @return absolute path to the library (may be a temporary file). - * @throws IOException if an error occurred while copying the library to a temporary file. - * @throws SecurityException if the security manager denies loading resource, creating absolute path, <i>etc</i>. - * @throws UnsatisfiedLinkError if no native resource has been found for the current OS. - * - * @see System#load(String) - */ - private String nativeLibrary(final Class<?> caller, final String name) throws IOException { - if (libdir != null) { - final String ext = unix ? ".so" : ".dll"; - final String path = libdir + '/' + name + ext; - final ClassLoader loader = caller.getClassLoader(); - /* - * First, verify if the "linux", "darwin" or "windows" directory exists at the same level - * than the JAR file containing the caller class. If it exists, then we will use it. This - * check avoid the need to copy the ".so" or ".dll" file in a temporary location. If the - * directory does not exist, then we do NOT create it in order to reduce the risk to mess - * with user's installation. - * - * Example of URL for a JAR entry: jar:file:/home/…/sis-gdal.jar!/org/apache/…/PJ.class - */ - URL res = loader.getResource(caller.getName().replace('.', '/').concat(".class")); - if (res != null && "jar".equals(res.getProtocol())) { - String file = res.getPath(); - final int s = file.indexOf('!'); - if (s >= 0) try { - File location = new File(new URI(file.substring(0, s))); - location = new File(location.getParentFile(), path); - if (location.canExecute()) { - return location.getAbsolutePath(); - } - } catch (IllegalArgumentException | URISyntaxException e) { - Logging.recoverableException(Logging.getLogger(Loggers.SYSTEM), OS.class, "nativeLibrary", e); - } - } - /* - * If we didn't found an existing "linux", "darwin" or "windows" directory with native library, - * copy the library in a temporary file. That file will be deleted on JVM exists, so a new file - * will be copied each time the application is executed. - */ - res = loader.getResource("native/".concat(path)); - if (res != null) { - try { - return new File(res.toURI()).getAbsolutePath(); - } catch (IllegalArgumentException | URISyntaxException e) { - Logging.recoverableException(Logging.getLogger(Loggers.SYSTEM), OS.class, "nativeLibrary", e); - } - final Path tmp = Files.createTempFile(name, ext).toAbsolutePath(); - tmp.toFile().deleteOnExit(); - try (InputStream in = res.openStream()) { - Files.copy(in, tmp, StandardCopyOption.REPLACE_EXISTING); - } - return tmp.toString(); - } - } - throw new UnsatisfiedLinkError(Errors.format(Errors.Keys.NativeInterfacesNotFound_2, uname(), name)); - } -} diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/logging/MonolineFormatter.java b/core/sis-utility/src/main/java/org/apache/sis/util/logging/MonolineFormatter.java index ec6ffd4..c8b352d 100644 --- a/core/sis-utility/src/main/java/org/apache/sis/util/logging/MonolineFormatter.java +++ b/core/sis-utility/src/main/java/org/apache/sis/util/logging/MonolineFormatter.java @@ -33,7 +33,6 @@ import java.util.Comparator; import java.util.ResourceBundle; import java.util.logging.*; import org.apache.sis.internal.system.Modules; -import org.apache.sis.internal.system.OS; import org.apache.sis.internal.util.X364; import org.apache.sis.internal.util.Strings; import org.apache.sis.internal.util.AutoMessageFormat; @@ -345,7 +344,7 @@ public class MonolineFormatter extends Formatter { if (handler instanceof ConsoleHandler && X364.isAnsiSupported()) { resetLevelColors(); } - faintSupported = OS.current() != OS.MAC_OS; + faintSupported = System.getProperty("os.name", "").contains("Mac OS"); /* * Creates the buffer and the printer. We will expand the tabulations with 4 characters. * This apply to the stack trace formatted by Throwable.printStackTrace(PrintWriter); diff --git a/ide-project/NetBeans/build.xml b/ide-project/NetBeans/build.xml index 746e465..b76f00a 100644 --- a/ide-project/NetBeans/build.xml +++ b/ide-project/NetBeans/build.xml @@ -229,13 +229,6 @@ </fileset> </concat> - <!-- SpecializedOperationFactory implementations to be loaded by ServiceLoader. --> - <concat destfile="${build.classes.dir}/META-INF/services/org.apache.sis.internal.referencing.SpecializedOperationFactory" encoding="UTF-8" fixlastline="yes"> - <fileset dir="${project.root}"> - <include name="*/*/src/main/resources/META-INF/services/org.apache.sis.internal.referencing.SpecializedOperationFactory"/> - </fileset> - </concat> - <!-- DataStoreProvider implementations to be loaded by ServiceLoader. --> <concat destfile="${build.classes.dir}/META-INF/services/org.apache.sis.storage.DataStoreProvider" encoding="UTF-8" fixlastline="yes"> <fileset dir="${project.root}">