You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2018/08/14 13:36:20 UTC

[sis] branch geoapi-4.0 updated: Documentation fixes, addition of more metadata (to be used later by sis-earthobservation module), and first step toward a https://issues.apache.org/jira/browse/SIS-395 fix.

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


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new 7327706  Documentation fixes, addition of more metadata (to be used later by sis-earthobservation module), and first step toward a https://issues.apache.org/jira/browse/SIS-395 fix.
7327706 is described below

commit 7327706e6a18dbef59718e571dddb0747c9b9846
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Tue Aug 14 15:33:52 2018 +0200

    Documentation fixes, addition of more metadata (to be used later by sis-earthobservation module),
    and first step toward a https://issues.apache.org/jira/browse/SIS-395 fix.
---
 .../sis/internal/metadata/sql/Initializer.java     | 55 +++++++++++++++++++++-
 .../org/apache/sis/metadata/sql/Installer.java     | 13 ++++-
 .../org/apache/sis/metadata/sql/Contents.sql       | 32 +++++++++++++
 .../org/apache/sis/metadata/sql/Metadata.sql       | 15 ++++++
 .../org/apache/sis/metadata/sql/Referencing.sql    | 25 ++++++++++
 .../apache/sis/util/logging/MonolineFormatter.java |  2 +-
 .../sis/util/collection/WeakValueHashMapTest.java  |  2 +-
 7 files changed, 139 insertions(+), 5 deletions(-)

diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/sql/Initializer.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/sql/Initializer.java
index 0d23aae..625bbf3 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/sql/Initializer.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/sql/Initializer.java
@@ -17,13 +17,14 @@
 package org.apache.sis.internal.metadata.sql;
 
 import java.util.Locale;
+import java.util.function.Supplier;
+import java.util.concurrent.Callable;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.io.IOException;
-import java.util.concurrent.Callable;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import java.security.AccessController;
@@ -49,6 +50,7 @@ import org.apache.sis.internal.system.Shutdown;
 import org.apache.sis.internal.system.Loggers;
 import org.apache.sis.util.resources.Messages;
 import org.apache.sis.util.logging.Logging;
+import org.apache.sis.util.Configuration;
 
 
 /**
@@ -105,10 +107,20 @@ public abstract class Initializer {
      * a JAR file the JDK installation directory, and we presume that the JDK installation do not change.
      *
      * @see #forJavaDB(String)
+     *
+     * @deprecated to be removed after we migrate to Java 9, since Derby is no longer distributed with the JDK.
      */
+    @Deprecated
     private static URLClassLoader javadbLoader;
 
     /**
+     * Data source specified by the user, to be used if no data source is specified by JNDI.
+     *
+     * @see #setDefault(Supplier)
+     */
+    private static Supplier<DataSource> supplier;
+
+    /**
      * The unique, SIS-wide, data source to the {@code $SIS_DATA/Databases/SpatialMetadata} database.
      * Created when first needed, and cleared on shutdown.
      *
@@ -145,7 +157,7 @@ public abstract class Initializer {
     /**
      * A JNDI listener for being informed of changes in the {@link DataSource} associated to {@code "jdbc/SpatialMetadata"}.
      * This listener clears the {@link Initializer#source} field, so the next call to {@link Initializer#getDataSource()}
-     * will fetch a new one.
+     * will fetch a new one. This listener is registered only if {@link Initializer#source} has been fetched from JNDI.
      */
     private static final class Listener implements ObjectChangeListener, Callable<Object> {
         /**
@@ -226,11 +238,36 @@ public abstract class Initializer {
     }
 
     /**
+     * Specifies the data source to use if there is no JNDI environment or if no data source is binded
+     * to {@code jdbc/SpatialMetadata}. Data source specified by JNDI has precedence over this supplier
+     * in order to let users control their data source. This method does nothing if the data source has
+     * already been initialized.
+     *
+     * @param  ds  supplier of data source to set, or {@code null} for removing previous supplier.
+     *             This supplier may return {@code null}, in which case it will be ignored.
+     * @return whether the given data source supplier has been successfully set.
+     *
+     * @since 1.0
+     */
+    @Configuration
+    public static synchronized boolean setDefault(final Supplier<DataSource> ds) {
+        if (source == null) {
+            supplier = ds;
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
      * Returns the data source for the SIS-wide "SpatialMetadata" database.
      * This method returns the first of the following steps that succeed:
      *
      * <ol>
      *   <li>If a JNDI context exists, the data source registered under the {@code jdbc/SpatialMetadata} name.</li>
+     *   <li>Otherwise if a default data source {@linkplain #setDefault has been supplied}, use that data source.</li>
+     *   <li>Otherwise if the {@code non-free:sis-embedded-data} module is present on the classpath and there is no
+     *       database already installed in the {@code SIS_DATA} directory, use the embedded database.</li>
      *   <li>If the {@code SIS_DATA} environment variable is defined, {@code jdbc:derby:$SIS_DATA/Databases/SpatialMetadata}.
      *       This database will be created if it does not exist. Note that this is the only case where we allow database
      *       creation since we are in the directory managed by SIS.</li>
@@ -262,6 +299,8 @@ public abstract class Initializer {
                 /*
                  * No Derby shutdown hook for DataSource fetched fron JNDI.
                  * We presume that shutdowns are handled by the container.
+                 * We do not clear the 'supplier' field in case 'source'
+                 * is cleaned by the listener.
                  */
             } catch (NameNotFoundException e) {
                 final LogRecord record = Messages.getResources(null).getLogRecord(
@@ -271,6 +310,17 @@ public abstract class Initializer {
             }
             /*
              * At this point we determined that there is no JNDI context or no object binded to "jdbc/SpatialMetadata".
+             * Check for programmatically supplied data source. We verify only after JNDI in order to let users control
+             * their data source if desired.
+             */
+            if (supplier != null) {
+                source = supplier.get();
+                if (source != null) {
+                    supplier = null;
+                    return source;
+                }
+            }
+            /*
              * As a fallback, try to open the Derby database located in $SIS_DATA/Databases/SpatialMetadata directory.
              * Only if the SIS_DATA environment variable is not set, verify first if the 'sis-embedded-data' module is
              * on the classpath. Note that if SIS_DATA is defined and valid, it has precedence.
@@ -327,6 +377,7 @@ public abstract class Initializer {
                     source = forJavaDB(dbURL);
                 }
             }
+            supplier = null;        // Not needed anymore.
             /*
              * Register the shutdown hook before to attempt any operation on the database in order to close
              * it properly if the schemas creation below fail.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/Installer.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/Installer.java
index 2f90497..2170cab 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/Installer.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/Installer.java
@@ -27,6 +27,12 @@ import org.apache.sis.util.StringBuilders;
 /**
  * Executes the installation scripts for the "metadata" schema in the "SpatialMetadata" database.
  *
+ * @todo We should replace the SQL {@code "CREATE TABLE"} statements in SQL scripts by something like
+ *       {@code "GENERATE TABLE"}, to be handled in a special way by this {@code Installer} class.
+ *       The {@code "GENERATE TABLE"} statement would enumerate only the columns, and this installer
+ *       would delegate to {@link MetadataWriter} for inferring the column types and the {@code ENUM}
+ *       dependencies.
+ *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 1.0
  * @since   0.8
@@ -36,6 +42,8 @@ final class Installer extends ScriptRunner {
     /**
      * List of enumeration types to replace by {@code VARCHAR}
      * on implementations that do not support {@code ENUM} type.
+     *
+     * @todo This field can be removed if we apply the "todo" documented in class javadoc.
      */
     private final String[] enumTypes;
 
@@ -51,7 +59,8 @@ final class Installer extends ScriptRunner {
             enumTypes = null;
         } else {
             enumTypes = new String[] {
-                "RoleCode", "DateTypeCode", "PresentationFormCode", "OnLineFunctionCode", "TransferFunctionTypeCode"
+                "RoleCode", "DateTypeCode", "PresentationFormCode", "OnLineFunctionCode", "TransferFunctionTypeCode",
+                "AxisDirection"
             };
             for (int i=0; i<enumTypes.length; i++) {
                 enumTypes[i] = "metadata.\"" + enumTypes[i] + '"';
@@ -65,6 +74,8 @@ final class Installer extends ScriptRunner {
     public void run() throws IOException, SQLException {
         run(Installer.class, "Citations.sql");
         run(Installer.class, "Contents.sql");
+        run(Installer.class, "Metadata.sql");
+        run(Installer.class, "Referencing.sql");
     }
 
     /**
diff --git a/core/sis-metadata/src/main/resources/org/apache/sis/metadata/sql/Contents.sql b/core/sis-metadata/src/main/resources/org/apache/sis/metadata/sql/Contents.sql
index 4b7125d..3d5fdcc 100644
--- a/core/sis-metadata/src/main/resources/org/apache/sis/metadata/sql/Contents.sql
+++ b/core/sis-metadata/src/main/resources/org/apache/sis/metadata/sql/Contents.sql
@@ -58,3 +58,35 @@ CREATE TABLE metadata."SampleDimension" (
   "offset"               DOUBLE PRECISION,
   "transferFunctionType" metadata."TransferFunctionTypeCode")
 INHERITS (metadata."RangeDimension");
+
+CREATE TABLE metadata."Band" (
+  "ID"                   VARCHAR(15) NOT NULL PRIMARY KEY,
+  "sequenceIdentifier"   VARCHAR(15),
+  "description"          VARCHAR(120),
+  "minValue"             DOUBLE PRECISION,
+  "maxValue"             DOUBLE PRECISION,
+  "meanValue"            DOUBLE PRECISION,
+  "numberOfValues"       INTEGER,
+  "standardDeviation"    DOUBLE PRECISION,
+  "units"                VARCHAR(15),
+  "scaleFactor"          DOUBLE PRECISION,
+  "offset"               DOUBLE PRECISION,
+  "transferFunctionType" metadata."TransferFunctionTypeCode",
+  "boundMin"             DOUBLE PRECISION,
+  "boundMax"             DOUBLE PRECISION,
+  "boundUnits"           VARCHAR(15),
+  "peakResponse"         DOUBLE PRECISION)
+INHERITS (metadata."SampleDimension");
+
+INSERT INTO metadata."Band" ("ID", "sequenceIdentifier", "description", "boundMin", "boundMax", "boundUnits", "peakResponse") VALUES
+  ('Landsat 8-01',  '1', 'Ultra Blue (coastal/aerosol)',         435.0,  451.0, 'nm',   443.0),
+  ('Landsat 8-02',  '2', 'Blue',                                 452.0,  512.1, 'nm',   482.0),
+  ('Landsat 8-03',  '3', 'Green',                                532.7,  590.1, 'nm',   561.4),
+  ('Landsat 8-04',  '4', 'Red',                                  635.9,  673.3, 'nm',   654.6),
+  ('Landsat 8-05',  '5', 'Near-Infrared',                        850.5,  878.8, 'nm',   864.7),
+  ('Landsat 8-06',  '6', 'Short Wavelength Infrared (SWIR) 1',  1566.5, 1651.2, 'nm',  1608.9),
+  ('Landsat 8-07',  '7', 'Short Wavelength Infrared (SWIR) 2',  2107.4, 2294.1, 'nm',  2200.7),
+  ('Landsat 8-08',  '8', 'Panchromatic',                         503.3,  675.7, 'nm',   589.5),
+  ('Landsat 8-09',  '9', 'Cirrus',                              1363.2, 1383.6, 'nm',  1373.4),
+  ('Landsat 8-10', '10', 'Thermal Infrared Sensor (TIRS) 1',     10.60,  11.19, 'µm',  10.800),
+  ('Landsat 8-11', '11', 'Thermal Infrared Sensor (TIRS) 2',     11.50,  12.51, 'µm',  12.000);
diff --git a/core/sis-metadata/src/main/resources/org/apache/sis/metadata/sql/Metadata.sql b/core/sis-metadata/src/main/resources/org/apache/sis/metadata/sql/Metadata.sql
new file mode 100644
index 0000000..9494ce1
--- /dev/null
+++ b/core/sis-metadata/src/main/resources/org/apache/sis/metadata/sql/Metadata.sql
@@ -0,0 +1,15 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+
+--
+-- Definition of main metadata table.
+-- This script requires "Citations.sql" and "Contents.sql" to be executed first.
+-- Current version contains very few columns. This will be expanded in future versions.
+--
+CREATE TABLE metadata."Metadata" (
+  "ID"                   VARCHAR(15) NOT NULL PRIMARY KEY,
+  "metadataIdentifier"   VARCHAR(15) REFERENCES metadata."Identifier"     ("ID") ON UPDATE RESTRICT ON DELETE RESTRICT,
+  "parentMetadata"       VARCHAR(15) REFERENCES metadata."Citation"       ("ID") ON UPDATE RESTRICT ON DELETE RESTRICT
+);
diff --git a/core/sis-metadata/src/main/resources/org/apache/sis/metadata/sql/Referencing.sql b/core/sis-metadata/src/main/resources/org/apache/sis/metadata/sql/Referencing.sql
new file mode 100644
index 0000000..6aa2300
--- /dev/null
+++ b/core/sis-metadata/src/main/resources/org/apache/sis/metadata/sql/Referencing.sql
@@ -0,0 +1,25 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+
+--
+-- Definition of a few types for referencing by coordinates (ISO 19111).
+-- A database schema is already defined by the EPSG geodetic dataset.
+-- This script adds only a few enumerations to be considered as a kind
+-- of metadata.
+--
+CREATE TYPE metadata."AxisDirection" AS ENUM (
+  'north', 'northNorthEast', 'northEast', 'eastNorthEast',
+  'east',  'eastSouthEast',  'southEast', 'southSouthEast',
+  'south', 'southSouthWest', 'southWest', 'westSouthWest',
+  'west',  'westNorthWest',  'northWest', 'northNorthWest',
+  'up',    'down',
+  'geocentricX',    'geocentricY',    'geocentricZ',
+  'columnPositive', 'columnNegative', 'rowPositive', 'rowNegative',
+  'displayRight',   'displayLeft',    'displayUp',   'displayDown',
+  'forward',        'aft',
+  'port',           'starboard',
+  'clockwise',      'counterClockwise',
+  'towards',        'awayFrom',
+  'future',         'past');
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 706ec2d..bc460e2 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
@@ -931,7 +931,7 @@ loop:   for (int i=0; ; i++) {
      * @throws SecurityException if this method does not have the permission to install the formatter.
      */
     @Configuration
-    public static MonolineFormatter install()  throws SecurityException {
+    public static MonolineFormatter install() throws SecurityException {
         return install(Logging.getLogger(""), null);
     }
 
diff --git a/core/sis-utility/src/test/java/org/apache/sis/util/collection/WeakValueHashMapTest.java b/core/sis-utility/src/test/java/org/apache/sis/util/collection/WeakValueHashMapTest.java
index f779ce3..92160d8 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/util/collection/WeakValueHashMapTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/util/collection/WeakValueHashMapTest.java
@@ -106,7 +106,7 @@ public final strictfp class WeakValueHashMapTest extends TestCase {
      * Implementation of the {@link #testWeakReferences()} method,
      * to be reused by {@link CacheTest}.
      *
-     * @param weakMap The map implementation to test.
+     * @param weakMap  the map implementation to test.
      */
     @SuppressWarnings("UnnecessaryBoxing")
     static void testWeakReferences(final Map<Integer,Integer> weakMap) throws InterruptedException {