This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/sis.git

commit a2820288eeda7922d479b6529c1c7fc4bd9d2baa
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Fri Oct 6 20:47:43 2023 +0200

    Modify the structure of the binary bundle for avoiding to have undesired 
applications on the module-path.
---
 .../apache/sis/buildtools/gradle/Assembler.java    | 74 ++++++++++++++++------
 .../org.apache.sis.storage/main/module-info.java   |  1 +
 optional/src/org.apache.sis.gui/bundle/bin/sis     |  3 +-
 optional/src/org.apache.sis.gui/bundle/bin/sis.bat |  3 +-
 optional/src/org.apache.sis.gui/bundle/bin/sisfx   |  2 +-
 .../src/org.apache.sis.gui/bundle/bin/sisfx.bat    |  2 +-
 optional/src/org.apache.sis.gui/bundle/lib/README  | 10 ++-
 .../src/org.apache.sis.gui/bundle/lib/app/README   |  2 +
 8 files changed, 70 insertions(+), 27 deletions(-)

diff --git 
a/buildSrc/src/org.apache.sis.buildtools/main/org/apache/sis/buildtools/gradle/Assembler.java
 
b/buildSrc/src/org.apache.sis.buildtools/main/org/apache/sis/buildtools/gradle/Assembler.java
index 70966519fb..55f5f2af8f 100644
--- 
a/buildSrc/src/org.apache.sis.buildtools/main/org/apache/sis/buildtools/gradle/Assembler.java
+++ 
b/buildSrc/src/org.apache.sis.buildtools/main/org/apache/sis/buildtools/gradle/Assembler.java
@@ -16,8 +16,9 @@
  */
 package org.apache.sis.buildtools.gradle;
 
+import java.util.Set;
 import java.io.File;
-import java.io.FilenameFilter;
+import java.io.FileFilter;
 import java.io.FileNotFoundException;
 import java.io.UncheckedIOException;
 import java.io.IOException;
@@ -35,13 +36,13 @@ import 
org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
  *   <li>the content of the <code>endorsed/build/libs</code> and 
<code>optional/build/libs</code> directories.</li>
  * </ul>
  *
- * Assemblies are created only for module having an {@code bundle} 
sub-directory.
- * The module is hard-coded for now (a future version could perform a search 
if desired).
+ * Assemblies are created only for the module having a {@code bundle} 
sub-directory in source code.
+ * That module is hard-coded for now (a future version could perform a search 
if desired).
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Quentin Bialota (Geomatys)
  */
-final class Assembler extends ZipWriter.Apache implements FilenameFilter {
+final class Assembler extends ZipWriter.Apache implements FileFilter {
     /**
      * The module on which to apply this task.
      */
@@ -54,6 +55,40 @@ final class Assembler extends ZipWriter.Apache implements 
FilenameFilter {
      */
     private static final String LIB_DIRECTORY = "lib/";
 
+    /**
+     * Subdirectory of {@link #LIB_DIRECTORY} where to put applications.
+     * We keep them in a separated directory because we need to put only
+     * one of them in the module-path.
+     */
+    private static final String APP_DIRECTORY = "app/";
+
+    /**
+     * Modules to put in the {@link #APP_DIRECTORY} directory.
+     */
+    private static final Set<String> APPLICATIONS = Set.of(MODULE, 
"org.apache.sis.console");
+
+    /**
+     * Modules to exclude from the {@link #LIB_DIRECTORY}, not counting 
applications.
+     */
+    private static final Set<String> EXCLUDES = Set.of(
+            "org.apache.sis.profile.japan",             // For avoiding UCAR 
dependencies.
+            "org.apache.sis.cloud.aws");                // For avoiding UCAR 
dependencies.
+
+    /**
+     * Suffix of JAR files. This is the part to remove from filenames for 
getting the module names.
+     */
+    private static final String JAR_SUFFIX = ".jar";
+
+    /**
+     * Whether this task is in the process of copying the application JAR 
files.
+     */
+    private boolean isCopyingApplication;
+
+    /**
+     * Whether the copy operation shall include dependencies.
+     */
+    private boolean includeDependencies;
+
     /**
      * Creates an helper object for creating the assembly.
      *
@@ -78,10 +113,14 @@ final class Assembler extends ZipWriter.Apache implements 
FilenameFilter {
             String filename = FINALNAME_PREFIX + project.getVersion();
             target = new File(target, filename + ".zip");
             filename += '/';
+            final String libDir = filename + LIB_DIRECTORY;
             try (ZipArchiveOutputStream out = new 
ZipArchiveOutputStream(target)) {
                 final var c = new Assembler(project, out);
                 c.writeDirectory(sourceDirectory, null, filename);
-                c.copyCompiledJARs(filename + LIB_DIRECTORY);
+                c.isCopyingApplication = false;
+                c.copyCompiledJARs(libDir);
+                c.isCopyingApplication = true;
+                c.copyCompiledJARs(libDir + APP_DIRECTORY);
             }
         } catch (IOException e) {
             throw new UncheckedIOException(e);
@@ -95,7 +134,9 @@ final class Assembler extends ZipWriter.Apache implements 
FilenameFilter {
      * @throws IOException if an error occurred while copying a file.
      */
     private void copyCompiledJARs(final String libDir) throws IOException {
-        writeDirectory(fileRelativeToBuild(LIBS_DIRECTORY), null, libDir);
+        includeDependencies = true;
+        writeDirectory(fileRelativeToBuild(LIBS_DIRECTORY), this, libDir);
+        includeDependencies = false;
         final File endorsed = new File(new File(new File(project.getRootDir(), 
ENDORSED_SUBPROJECT), BUILD_DIRECTORY), LIBS_DIRECTORY);
         final File[] deps = endorsed.listFiles(this);
         if (deps == null) {
@@ -109,21 +150,18 @@ final class Assembler extends ZipWriter.Apache implements 
FilenameFilter {
     /**
      * Whether to include the given file in the ZIP file.
      *
-     * @param  dir   directory of the file.
-     * @param  name  name of the file.
+     * @param  path  the file or directory to test.
      * @return whether to include the file.
      */
     @Override
-    public boolean accept(final File dir, final String name) {
-        if (!name.endsWith(".jar")) {
-            return false;
-        }
-        if (name.startsWith("org.apache.sis.cloud.aws")) {
-            return false;       // Excluded for avoiding AWS dependencies.
-        }
-        if (name.startsWith("org.apache.sis.profile.japan")) {
-            return false;       // Excluded for avoiding UCAR dependencies.
+    public boolean accept(final File path) {
+        String name = path.getName();
+        if (name.endsWith(JAR_SUFFIX) && (includeDependencies || 
name.startsWith("org.apache.sis."))) {
+            name = name.substring(0, name.length() - JAR_SUFFIX.length());
+            if (!EXCLUDES.contains(name)) {
+                return APPLICATIONS.contains(name) == isCopyingApplication;
+            }
         }
-        return name.startsWith("org.apache.sis.");
+        return false;
     }
 }
diff --git a/endorsed/src/org.apache.sis.storage/main/module-info.java 
b/endorsed/src/org.apache.sis.storage/main/module-info.java
index ecfc4329a5..cc057573be 100644
--- a/endorsed/src/org.apache.sis.storage/main/module-info.java
+++ b/endorsed/src/org.apache.sis.storage/main/module-info.java
@@ -53,6 +53,7 @@ module org.apache.sis.storage {
             org.apache.sis.storage.netcdf,
             org.apache.sis.storage.geotiff,
             org.apache.sis.storage.earthobservation,
+            org.apache.sis.util,                        // For the "About" 
command.
             org.apache.sis.console,
             org.apache.sis.openoffice,
             org.apache.sis.gui;                         // In the "optional" 
sub-project.
diff --git a/optional/src/org.apache.sis.gui/bundle/bin/sis 
b/optional/src/org.apache.sis.gui/bundle/bin/sis
index 9e5dcc44fd..3843ebf533 100755
--- a/optional/src/org.apache.sis.gui/bundle/bin/sis
+++ b/optional/src/org.apache.sis.gui/bundle/bin/sis
@@ -23,8 +23,7 @@ SIS_DATA="${SIS_DATA:-$BASE_DIR/data}"
 export SIS_DATA
 
 # Execute SIS with any optional JAR that the user may put in the 'lib' 
directory.
-java --module-path "$BASE_DIR/lib" \
-     --limit-modules org.apache.sis.console \
+java --module-path 
"$BASE_DIR/lib:$BASE_DIR/lib/app/org.apache.sis.console.jar" \
      
-Djava.util.logging.config.class="org.apache.sis.util.logging.Initializer" \
      -Djava.util.logging.config.file="$BASE_DIR/conf/logging.properties" \
      -Dderby.stream.error.file="$BASE_DIR/log/derby.log" \
diff --git a/optional/src/org.apache.sis.gui/bundle/bin/sis.bat 
b/optional/src/org.apache.sis.gui/bundle/bin/sis.bat
index 07694b82a4..2e8bb0af9e 100644
--- a/optional/src/org.apache.sis.gui/bundle/bin/sis.bat
+++ b/optional/src/org.apache.sis.gui/bundle/bin/sis.bat
@@ -20,8 +20,7 @@ SET BASE_DIR=%~dp0\..
 SET SIS_DATA=%BASE_DIR%\data
 
 REM Execute SIS with any optional JAR that the user may put in the 'lib' 
directory.
-java --module-path "%BASE_DIR%\lib"^
-     --limit-modules org.apache.sis.console^
+java --module-path 
"%BASE_DIR%\lib;%BASE_DIR%\lib\app\org.apache.sis.console.jar"^
      -Djava.util.logging.config.class=org.apache.sis.util.logging.Initializer^
      -Djava.util.logging.config.file="%BASE_DIR%\conf\logging.properties"^
      -Dderby.stream.error.file="%BASE_DIR%\log\derby.log"^
diff --git a/optional/src/org.apache.sis.gui/bundle/bin/sisfx 
b/optional/src/org.apache.sis.gui/bundle/bin/sisfx
index 6729e5f211..8286d0505c 100755
--- a/optional/src/org.apache.sis.gui/bundle/bin/sisfx
+++ b/optional/src/org.apache.sis.gui/bundle/bin/sisfx
@@ -36,7 +36,7 @@ fi
 
 # Execute SIS with any optional JAR that the user may put in the `lib` 
directory.
 java -splash:"$BASE_DIR/lib/logo.jpg" \
-     --module-path "$PATH_TO_FX:$BASE_DIR/lib" \
+     --module-path 
"$PATH_TO_FX:$BASE_DIR/lib:$BASE_DIR/lib/app/org.apache.sis.gui.jar" \
      
-Djava.util.logging.config.class="org.apache.sis.util.logging.Initializer" \
      -Djava.util.logging.config.file="$BASE_DIR/conf/logging.properties" \
      -Dderby.stream.error.file="$BASE_DIR/log/derby.log" \
diff --git a/optional/src/org.apache.sis.gui/bundle/bin/sisfx.bat 
b/optional/src/org.apache.sis.gui/bundle/bin/sisfx.bat
index 999bc5ed4a..5dc74c24e2 100644
--- a/optional/src/org.apache.sis.gui/bundle/bin/sisfx.bat
+++ b/optional/src/org.apache.sis.gui/bundle/bin/sisfx.bat
@@ -27,7 +27,7 @@ IF "%PATH_TO_FX%"=="" (
 )
 
 java -splash:"%BASE_DIR%\lib\logo.jpg"^
- --module-path "%PATH_TO_FX%;%BASE_DIR%\lib"^
+ --module-path 
"%PATH_TO_FX%;%BASE_DIR%\lib;%BASE_DIR%\lib\app\org.apache.sis.gui.jar"^
  -Djava.util.logging.config.class=org.apache.sis.util.logging.Initializer^
  -Djava.util.logging.config.file="%BASE_DIR%\conf\logging.properties"^
  -Dderby.stream.error.file="%BASE_DIR%\log\derby.log"^
diff --git a/optional/src/org.apache.sis.gui/bundle/lib/README 
b/optional/src/org.apache.sis.gui/bundle/lib/README
index 06f10db15d..5eec4daeb4 100644
--- a/optional/src/org.apache.sis.gui/bundle/lib/README
+++ b/optional/src/org.apache.sis.gui/bundle/lib/README
@@ -1,9 +1,13 @@
-This directory contains Apache SIS files together with dependencies.
-Some optional dependencies need to be added by users if desired.
+This directory contains Apache SIS modules
+together with the following dependencies:
 
-  - Derby database
   - JAXB API
   - JAXB implementation  (optional)
+  - Derby database       (optional)
+
+The following dependencies are not included
+but will be used if they are added by users:
+
   - UCAR netCDF library  (optional)
   - ESRI Geometry API    (optional)
   - Java Topology Suite  (optional)
diff --git a/optional/src/org.apache.sis.gui/bundle/lib/app/README 
b/optional/src/org.apache.sis.gui/bundle/lib/app/README
new file mode 100644
index 0000000000..6cadd3b881
--- /dev/null
+++ b/optional/src/org.apache.sis.gui/bundle/lib/app/README
@@ -0,0 +1,2 @@
+This directory contains Apache SIS modules for interactive applications.
+They should generally not be on the module-path for other applications.

Reply via email to