Improve CLI and GraalVM architecture.
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 13 Jul 2022 07:12:44 +0000 (09:12 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 13 Jul 2022 07:12:44 +0000 (09:12 +0200)
30 files changed:
Makefile
org.argeo.cms.cli/.classpath [new file with mode: 0644]
org.argeo.cms.cli/.project [new file with mode: 0644]
org.argeo.cms.cli/bnd.bnd [new file with mode: 0644]
org.argeo.cms.cli/build.properties [new file with mode: 0644]
org.argeo.cms.cli/src/org/argeo/cms/cli/ArgeoCli.java [new file with mode: 0644]
org.argeo.cms.cli/src/org/argeo/cms/cli/FileSync.java [new file with mode: 0644]
org.argeo.cms.cli/src/org/argeo/cms/cli/FsCommands.java [new file with mode: 0644]
org.argeo.cms.cli/src/org/argeo/cms/cli/posix/Echo.java [new file with mode: 0644]
org.argeo.cms.cli/src/org/argeo/cms/cli/posix/PosixCommands.java [new file with mode: 0644]
org.argeo.cms.cli/src/org/argeo/cms/cli/posix/package-info.java [new file with mode: 0644]
org.argeo.cms.ux/src/org/argeo/cms/ux/cli/FileSync.java [deleted file]
org.argeo.cms.ux/src/org/argeo/cms/ux/cli/FsCommands.java [deleted file]
org.argeo.cms/META-INF/native-image/jni-config.json [new file with mode: 0644]
org.argeo.cms/META-INF/native-image/predefined-classes-config.json [new file with mode: 0644]
org.argeo.cms/META-INF/native-image/proxy-config.json [new file with mode: 0644]
org.argeo.cms/META-INF/native-image/reflect-config.json [new file with mode: 0644]
org.argeo.cms/META-INF/native-image/resource-config.json [new file with mode: 0644]
org.argeo.cms/META-INF/native-image/serialization-config.json [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/runtime/CmsCli.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/runtime/StaticCmsLaunch.java [new file with mode: 0644]
swt/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniBrowser.java
swt/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniDesktopManager.java
swt/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniDesktopSpecific.java [new file with mode: 0644]
swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/jni-config.json [new file with mode: 0644]
swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/predefined-classes-config.json [new file with mode: 0644]
swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/proxy-config.json [new file with mode: 0644]
swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/reflect-config.json [new file with mode: 0644]
swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/resource-config.json [new file with mode: 0644]
swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/serialization-config.json [new file with mode: 0644]

index ab2d6254847778013a1bd794e359197107cc4b1a..7129324bef247949a6fe97f5310dfb50838516b7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -25,6 +25,7 @@ org.argeo.cms.lib.jetty \
 org.argeo.cms.lib.equinox \
 org.argeo.cms.lib.sshd \
 org.argeo.cms.lib.pgsql \
+org.argeo.cms.cli \
 swt/org.argeo.swt.minidesktop \
 swt/org.argeo.cms.swt \
 swt/org.argeo.cms.e4 \
@@ -72,12 +73,16 @@ A2_BUNDLES_CLASSPATH = $(subst $(space),$(pathsep),$(strip $(A2_BUNDLES)))
 
 native-image:
        mkdir -p $(A2_OUTPUT)/libexec/$(A2_CATEGORY)
-       cd $(A2_OUTPUT)/libexec/$(A2_CATEGORY) && /opt/graalvm-ce/bin/native-image \
+#      cd $(A2_OUTPUT)/libexec/$(A2_CATEGORY) && /opt/graalvm-ce/bin/native-image \
                -cp $(A2_CLASSPATH):$(A2_BUNDLES_CLASSPATH) org.argeo.eclipse.ui.jetty.CmsRapCli \
                --enable-url-protocols=http,https \
                -H:AdditionalSecurityProviders=sun.security.jgss.SunProvider,org.bouncycastle.jce.provider.BouncyCastleProvider,net.i2p.crypto.eddsa.EdDSASecurityProvider \
                --initialize-at-build-time=org.argeo.init.logging.ThinLogging,org.slf4j.LoggerFactory \
                --no-fallback 
+       cd $(A2_OUTPUT)/libexec/$(A2_CATEGORY) && /opt/graalvm-ce/bin/native-image \
+               -cp $(A2_CLASSPATH):$(A2_BUNDLES_CLASSPATH) org.argeo.cms.ux.cli.FileSync \
+               --initialize-at-build-time=org.argeo.init.logging.ThinLogging,org.slf4j.LoggerFactory \
+               --no-fallback 
 
 
 include  $(SDK_SRC_BASE)/sdk/argeo-build/osgi.mk
\ No newline at end of file
diff --git a/org.argeo.cms.cli/.classpath b/org.argeo.cms.cli/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.cms.cli/.project b/org.argeo.cms.cli/.project
new file mode 100644 (file)
index 0000000..1514c53
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.cms.cli</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.cms.cli/bnd.bnd b/org.argeo.cms.cli/bnd.bnd
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/org.argeo.cms.cli/build.properties b/org.argeo.cms.cli/build.properties
new file mode 100644 (file)
index 0000000..34d2e4d
--- /dev/null
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.argeo.cms.cli/src/org/argeo/cms/cli/ArgeoCli.java b/org.argeo.cms.cli/src/org/argeo/cms/cli/ArgeoCli.java
new file mode 100644 (file)
index 0000000..8c7bedd
--- /dev/null
@@ -0,0 +1,32 @@
+package org.argeo.cms.cli;
+
+import org.apache.commons.cli.Option;
+import org.argeo.api.cli.CommandsCli;
+import org.argeo.cms.cli.posix.PosixCommands;
+import org.argeo.cms.ssh.cli.SshCli;
+
+/** Argeo command line tools. */
+public class ArgeoCli extends CommandsCli {
+       public ArgeoCli(String commandName) {
+               super(commandName);
+               // Common options
+               options.addOption(Option.builder("v").hasArg().argName("verbose").desc("verbosity").build());
+               options.addOption(
+                               Option.builder("D").hasArgs().argName("property=value").desc("use value for given property").build());
+
+               // common
+               addCommandsCli(new SshCli("ssh"));
+               addCommandsCli(new PosixCommands("posix"));
+               addCommandsCli(new FsCommands("fs"));
+       }
+
+       @Override
+       public String getDescription() {
+               return "Argeo utilities";
+       }
+
+       public static void main(String[] args) {
+               mainImpl(new ArgeoCli("argeo"), args);
+       }
+
+}
diff --git a/org.argeo.cms.cli/src/org/argeo/cms/cli/FileSync.java b/org.argeo.cms.cli/src/org/argeo/cms/cli/FileSync.java
new file mode 100644 (file)
index 0000000..ccd0924
--- /dev/null
@@ -0,0 +1,103 @@
+package org.argeo.cms.cli;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.argeo.api.cli.CommandArgsException;
+import org.argeo.api.cli.DescribedCommand;
+import org.argeo.cms.acr.fs.PathSync;
+import org.argeo.cms.acr.fs.SyncResult;
+
+public class FileSync implements DescribedCommand<SyncResult<Path>> {
+       final static Option deleteOption = Option.builder().longOpt("delete").desc("delete from target").build();
+       final static Option recursiveOption = Option.builder("r").longOpt("recursive").desc("recurse into directories")
+                       .build();
+       final static Option progressOption = Option.builder().longOpt("progress").hasArg(false).desc("show progress")
+                       .build();
+
+       @Override
+       public SyncResult<Path> apply(List<String> t) {
+               try {
+                       CommandLine line = toCommandLine(t);
+                       List<String> remaining = line.getArgList();
+                       if (remaining.size() == 0) {
+                               throw new CommandArgsException("There must be at least one argument");
+                       }
+                       URI sourceUri = new URI(remaining.get(0));
+                       URI targetUri;
+                       if (remaining.size() == 1) {
+                               targetUri = Paths.get(System.getProperty("user.dir")).toUri();
+                       } else {
+                               targetUri = new URI(remaining.get(1));
+                       }
+                       boolean delete = line.hasOption(deleteOption.getLongOpt());
+                       boolean recursive = line.hasOption(recursiveOption.getLongOpt());
+                       PathSync pathSync = new PathSync(sourceUri, targetUri, delete, recursive);
+                       return pathSync.call();
+               } catch (URISyntaxException e) {
+                       throw new CommandArgsException(e);
+               }
+       }
+
+       @Override
+       public Options getOptions() {
+               Options options = new Options();
+               options.addOption(recursiveOption);
+               options.addOption(deleteOption);
+               options.addOption(progressOption);
+               return options;
+       }
+
+       @Override
+       public String getUsage() {
+               return "[source URI] [target URI]";
+       }
+
+       public static void main(String[] args) {
+               DescribedCommand.mainImpl(new FileSync(), args);
+//             Options options = new Options();
+//             options.addOption("r", "recursive", false, "recurse into directories");
+//             options.addOption(Option.builder().longOpt("progress").hasArg(false).desc("show progress").build());
+//
+//             CommandLineParser parser = new DefaultParser();
+//             try {
+//                     CommandLine line = parser.parse(options, args);
+//                     List<String> remaining = line.getArgList();
+//                     if (remaining.size() == 0) {
+//                             System.err.println("There must be at least one argument");
+//                             printHelp(options);
+//                             System.exit(1);
+//                     }
+//                     URI sourceUri = new URI(remaining.get(0));
+//                     URI targetUri;
+//                     if (remaining.size() == 1) {
+//                             targetUri = Paths.get(System.getProperty("user.dir")).toUri();
+//                     } else {
+//                             targetUri = new URI(remaining.get(1));
+//                     }
+//                     PathSync pathSync = new PathSync(sourceUri, targetUri);
+//                     pathSync.run();
+//             } catch (Exception exp) {
+//                     exp.printStackTrace();
+//                     printHelp(options);
+//                     System.exit(1);
+//             }
+       }
+
+//     public static void printHelp(Options options) {
+//             HelpFormatter formatter = new HelpFormatter();
+//             formatter.printHelp("sync SRC [DEST]", options, true);
+//     }
+
+       @Override
+       public String getDescription() {
+               return "Synchronises files";
+       }
+
+}
diff --git a/org.argeo.cms.cli/src/org/argeo/cms/cli/FsCommands.java b/org.argeo.cms.cli/src/org/argeo/cms/cli/FsCommands.java
new file mode 100644 (file)
index 0000000..46ec142
--- /dev/null
@@ -0,0 +1,18 @@
+package org.argeo.cms.cli;
+
+import org.argeo.api.cli.CommandsCli;
+
+/** File utilities. */
+public class FsCommands extends CommandsCli {
+
+       public FsCommands(String commandName) {
+               super(commandName);
+               addCommand("sync", new FileSync());
+       }
+
+       @Override
+       public String getDescription() {
+               return "Utilities around files and file systems";
+       }
+
+}
diff --git a/org.argeo.cms.cli/src/org/argeo/cms/cli/posix/Echo.java b/org.argeo.cms.cli/src/org/argeo/cms/cli/posix/Echo.java
new file mode 100644 (file)
index 0000000..28e6446
--- /dev/null
@@ -0,0 +1,46 @@
+package org.argeo.cms.cli.posix;
+
+import java.util.List;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.argeo.api.cli.DescribedCommand;
+
+public class Echo implements DescribedCommand<String> {
+
+       @Override
+       public Options getOptions() {
+               Options options = new Options();
+               options.addOption(Option.builder("n").desc("do not output the trailing newline").build());
+               return options;
+       }
+
+       @Override
+       public String getDescription() {
+               return "Display a line of text";
+       }
+
+       @Override
+       public String getUsage() {
+               return "[STRING]...";
+       }
+
+       @Override
+       public String apply(List<String> args) {
+               CommandLine cl = toCommandLine(args);
+
+               StringBuffer sb = new StringBuffer();
+               for (String s : cl.getArgList()) {
+                       sb.append(s).append(' ');
+               }
+
+               if (cl.hasOption('n')) {
+                       sb.deleteCharAt(sb.length() - 1);
+               } else {
+                       sb.setCharAt(sb.length() - 1, '\n');
+               }
+               return sb.toString();
+       }
+
+}
diff --git a/org.argeo.cms.cli/src/org/argeo/cms/cli/posix/PosixCommands.java b/org.argeo.cms.cli/src/org/argeo/cms/cli/posix/PosixCommands.java
new file mode 100644 (file)
index 0000000..9782429
--- /dev/null
@@ -0,0 +1,21 @@
+package org.argeo.cms.cli.posix;
+
+import org.argeo.api.cli.CommandsCli;
+
+/** POSIX commands. */
+public class PosixCommands extends CommandsCli {
+
+       public PosixCommands(String commandName) {
+               super(commandName);
+               addCommand("echo", new Echo());
+       }
+
+       @Override
+       public String getDescription() {
+               return "Reimplementation of some POSIX commands in plain Java";
+       }
+
+       public static void main(String[] args) {
+               mainImpl(new PosixCommands("argeo-posix"), args);
+       }
+}
diff --git a/org.argeo.cms.cli/src/org/argeo/cms/cli/posix/package-info.java b/org.argeo.cms.cli/src/org/argeo/cms/cli/posix/package-info.java
new file mode 100644 (file)
index 0000000..8a6785c
--- /dev/null
@@ -0,0 +1,2 @@
+/** Posix CLI commands. */
+package org.argeo.cms.cli.posix;
\ No newline at end of file
diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/cli/FileSync.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/cli/FileSync.java
deleted file mode 100644 (file)
index 91279c5..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.argeo.cms.ux.cli;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
-import org.argeo.api.cli.CommandArgsException;
-import org.argeo.api.cli.DescribedCommand;
-import org.argeo.cms.acr.fs.PathSync;
-import org.argeo.cms.acr.fs.SyncResult;
-
-public class FileSync implements DescribedCommand<SyncResult<Path>> {
-       final static Option deleteOption = Option.builder().longOpt("delete").desc("delete from target").build();
-       final static Option recursiveOption = Option.builder("r").longOpt("recursive").desc("recurse into directories")
-                       .build();
-       final static Option progressOption = Option.builder().longOpt("progress").hasArg(false).desc("show progress")
-                       .build();
-
-       @Override
-       public SyncResult<Path> apply(List<String> t) {
-               try {
-                       CommandLine line = toCommandLine(t);
-                       List<String> remaining = line.getArgList();
-                       if (remaining.size() == 0) {
-                               throw new CommandArgsException("There must be at least one argument");
-                       }
-                       URI sourceUri = new URI(remaining.get(0));
-                       URI targetUri;
-                       if (remaining.size() == 1) {
-                               targetUri = Paths.get(System.getProperty("user.dir")).toUri();
-                       } else {
-                               targetUri = new URI(remaining.get(1));
-                       }
-                       boolean delete = line.hasOption(deleteOption.getLongOpt());
-                       boolean recursive = line.hasOption(recursiveOption.getLongOpt());
-                       PathSync pathSync = new PathSync(sourceUri, targetUri, delete, recursive);
-                       return pathSync.call();
-               } catch (URISyntaxException e) {
-                       throw new CommandArgsException(e);
-               }
-       }
-
-       @Override
-       public Options getOptions() {
-               Options options = new Options();
-               options.addOption(recursiveOption);
-               options.addOption(deleteOption);
-               options.addOption(progressOption);
-               return options;
-       }
-
-       @Override
-       public String getUsage() {
-               return "[source URI] [target URI]";
-       }
-
-       public static void main(String[] args) {
-               DescribedCommand.mainImpl(new FileSync(), args);
-//             Options options = new Options();
-//             options.addOption("r", "recursive", false, "recurse into directories");
-//             options.addOption(Option.builder().longOpt("progress").hasArg(false).desc("show progress").build());
-//
-//             CommandLineParser parser = new DefaultParser();
-//             try {
-//                     CommandLine line = parser.parse(options, args);
-//                     List<String> remaining = line.getArgList();
-//                     if (remaining.size() == 0) {
-//                             System.err.println("There must be at least one argument");
-//                             printHelp(options);
-//                             System.exit(1);
-//                     }
-//                     URI sourceUri = new URI(remaining.get(0));
-//                     URI targetUri;
-//                     if (remaining.size() == 1) {
-//                             targetUri = Paths.get(System.getProperty("user.dir")).toUri();
-//                     } else {
-//                             targetUri = new URI(remaining.get(1));
-//                     }
-//                     PathSync pathSync = new PathSync(sourceUri, targetUri);
-//                     pathSync.run();
-//             } catch (Exception exp) {
-//                     exp.printStackTrace();
-//                     printHelp(options);
-//                     System.exit(1);
-//             }
-       }
-
-//     public static void printHelp(Options options) {
-//             HelpFormatter formatter = new HelpFormatter();
-//             formatter.printHelp("sync SRC [DEST]", options, true);
-//     }
-
-       @Override
-       public String getDescription() {
-               return "Synchronises files";
-       }
-
-}
diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/cli/FsCommands.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/cli/FsCommands.java
deleted file mode 100644 (file)
index 97d8c85..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.argeo.cms.ux.cli;
-
-import org.argeo.api.cli.CommandsCli;
-
-/** File utilities. */
-public class FsCommands extends CommandsCli {
-
-       public FsCommands(String commandName) {
-               super(commandName);
-               addCommand("sync", new FileSync());
-       }
-
-       @Override
-       public String getDescription() {
-               return "Utilities around files and file systems";
-       }
-
-}
diff --git a/org.argeo.cms/META-INF/native-image/jni-config.json b/org.argeo.cms/META-INF/native-image/jni-config.json
new file mode 100644 (file)
index 0000000..25530bb
--- /dev/null
@@ -0,0 +1,33 @@
+[
+{
+  "name":"java.lang.Boolean",
+  "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.lang.ClassLoader",
+  "methods":[
+    {"name":"getPlatformClassLoader","parameterTypes":[] }, 
+    {"name":"loadClass","parameterTypes":["java.lang.String"] }
+  ]
+},
+{
+  "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader"
+},
+{
+  "name":"org.graalvm.jniutils.JNIExceptionWrapperEntryPoints",
+  "methods":[{"name":"getClassName","parameterTypes":["java.lang.Class"] }]
+},
+{
+  "name":"sun.management.VMManagementImpl",
+  "fields":[
+    {"name":"compTimeMonitoringSupport"}, 
+    {"name":"currentThreadCpuTimeSupport"}, 
+    {"name":"objectMonitorUsageSupport"}, 
+    {"name":"otherThreadCpuTimeSupport"}, 
+    {"name":"remoteDiagnosticCommandsSupport"}, 
+    {"name":"synchronizerUsageSupport"}, 
+    {"name":"threadAllocatedMemorySupport"}, 
+    {"name":"threadContentionMonitoringSupport"}
+  ]
+}
+]
diff --git a/org.argeo.cms/META-INF/native-image/predefined-classes-config.json b/org.argeo.cms/META-INF/native-image/predefined-classes-config.json
new file mode 100644 (file)
index 0000000..0e79b2c
--- /dev/null
@@ -0,0 +1,8 @@
+[
+  {
+    "type":"agent-extracted",
+    "classes":[
+    ]
+  }
+]
+
diff --git a/org.argeo.cms/META-INF/native-image/proxy-config.json b/org.argeo.cms/META-INF/native-image/proxy-config.json
new file mode 100644 (file)
index 0000000..0d4f101
--- /dev/null
@@ -0,0 +1,2 @@
+[
+]
diff --git a/org.argeo.cms/META-INF/native-image/reflect-config.json b/org.argeo.cms/META-INF/native-image/reflect-config.json
new file mode 100644 (file)
index 0000000..2c9df69
--- /dev/null
@@ -0,0 +1,60 @@
+[
+{
+  "name":"com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"java.security.SecureRandomParameters"
+},
+{
+  "name":"javax.security.auth.login.Configuration$Parameters"
+},
+{
+  "name":"org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.xerces.impl.dv.dtd.XML11DTDDVFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.xerces.impl.dv.xs.ExtendedSchemaDVFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.xerces.impl.xs.XSMessageFormatter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.xerces.parsers.XIncludeAwareParserConfiguration",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.argeo.cms.auth.DataAdminLoginModule",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.ConfigFile$Spi",
+  "methods":[{"name":"<init>","parameterTypes":["javax.security.auth.login.Configuration$Parameters"] }]
+},
+{
+  "name":"sun.security.provider.DRBG",
+  "methods":[{"name":"<init>","parameterTypes":["java.security.SecureRandomParameters"] }]
+},
+{
+  "name":"sun.security.provider.NativePRNG",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.SHA",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.SHA2$SHA256",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+}
+]
diff --git a/org.argeo.cms/META-INF/native-image/resource-config.json b/org.argeo.cms/META-INF/native-image/resource-config.json
new file mode 100644 (file)
index 0000000..d5f778e
--- /dev/null
@@ -0,0 +1,68 @@
+{
+  "resources":{
+  "includes":[
+    {
+      "pattern":"\\QMETA-INF/services/javax.xml.validation.SchemaFactory\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/DSMLv2.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/SVG.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/XForms-11-Schema.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/XMLSchema.dtd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/XMLSchema.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/cr.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/datatypes.dtd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/docbook.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/schema-for-xslt20.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/xlink.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/xml-events-attribs-1.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/xml.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/internal/runtime/jaas.cfg\\E"
+    }
+  ]},
+  "bundles":[
+    {
+      "name":"org.apache.xerces.impl.msg.XMLSchemaMessages",
+      "locales":[
+        "en", 
+        "und"
+      ]
+    }, 
+    {
+      "name":"org.apache.xerces.impl.xpath.regex.message",
+      "locales":[
+        "", 
+        "en", 
+        "und"
+      ]
+    }, 
+    {
+      "name":"sun.security.util.Resources",
+      "classNames":["sun.security.util.Resources"]
+    }
+  ]
+}
diff --git a/org.argeo.cms/META-INF/native-image/serialization-config.json b/org.argeo.cms/META-INF/native-image/serialization-config.json
new file mode 100644 (file)
index 0000000..bf554e0
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  "types":[
+  ],
+  "lambdaCapturingTypes":[
+  ]
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/runtime/CmsCli.java b/org.argeo.cms/src/org/argeo/cms/runtime/CmsCli.java
new file mode 100644 (file)
index 0000000..425bc30
--- /dev/null
@@ -0,0 +1,21 @@
+package org.argeo.cms.runtime;
+
+import org.argeo.api.cli.CommandsCli;
+
+public class CmsCli extends CommandsCli {
+
+       public CmsCli(String commandName) {
+               super(commandName);
+               addCommand("launch", new StaticCmsLaunch());
+       }
+
+       @Override
+       public String getDescription() {
+               return "Static CMS utilities.";
+       }
+
+       public static void main(String[] args) {
+               mainImpl(new CmsCli("cms"), args);
+       }
+
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/runtime/StaticCmsLaunch.java b/org.argeo.cms/src/org/argeo/cms/runtime/StaticCmsLaunch.java
new file mode 100644 (file)
index 0000000..b4cfb90
--- /dev/null
@@ -0,0 +1,51 @@
+package org.argeo.cms.runtime;
+
+import java.lang.management.ManagementFactory;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.argeo.api.cli.DescribedCommand;
+
+public class StaticCmsLaunch implements DescribedCommand<String> {
+       private Option dataOption;
+
+       @Override
+       public Options getOptions() {
+               Options options = new Options();
+               dataOption = Option.builder().longOpt("data").hasArg().required()
+                               .desc("path to the writable data area (mandatory)").build();
+               options.addOption(dataOption);
+               return options;
+       }
+
+       @Override
+       public String apply(List<String> args) {
+               CommandLine cl = toCommandLine(args);
+               String dataPath = cl.getOptionValue(dataOption);
+
+               Path instancePath = Paths.get(dataPath);
+               System.setProperty("osgi.instance.area", instancePath.toUri().toString());
+               System.setProperty("argeo.http.port", "0");
+
+               StaticCms staticCms = new StaticCms();
+               Runtime.getRuntime().addShutdownHook(new Thread(() -> staticCms.stop(), "Static CMS Shutdown"));
+               staticCms.start();
+
+               long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
+               System.out.println("Static CMS available in " + jvmUptime + " ms.");
+
+               staticCms.waitForStop();
+
+               return null;
+       }
+
+       @Override
+       public String getDescription() {
+               return "Launch a static CMS";
+       }
+
+}
index d4da349ceca4e6c4cbb153ea879525680ce63882..e7bb9e856d284e0cb6a8778ebc8ed016c4dabd4b 100644 (file)
@@ -84,16 +84,13 @@ public class MiniBrowser {
                        }
 
                });
-               
-               // FIXME make it portable
-//             browser.addTitleListener(e -> titleChanged(e.title));
-//             browser.addOpenWindowListener((e) -> {
-//                     e.browser = openNewBrowserWindow();
-//             });
+
+               MiniDesktopSpecific.getMiniDesktopSpecific().addBrowserTitleListener(this, browser);
+               MiniDesktopSpecific.getMiniDesktopSpecific().addBrowserOpenWindowListener(this, browser);
                return browser;
        }
 
-       protected Browser openNewBrowserWindow() {
+       public Browser openNewBrowserWindow() {
 
                if (isFullScreen()) {
                        // TODO manage multiple tabs?
@@ -121,7 +118,7 @@ public class MiniBrowser {
        }
 
        /** Called when title changed; to be overridden, does nothing by default. */
-       protected void titleChanged(String title) {
+       public void titleChanged(String title) {
        }
 
        protected Browser getBrowser() {
@@ -174,7 +171,7 @@ public class MiniBrowser {
                new MiniBrowser(shell, url, fullscreen, appMode) {
 
                        @Override
-                       protected void titleChanged(String title) {
+                       public void titleChanged(String title) {
                                shell.setText(title);
                        }
                };
index 6af59d9d69fec93c6c760fef48526a5718be3cd4..adb2a55ba95f6393857c8a45877981204bed1642 100644 (file)
@@ -158,7 +158,7 @@ public class MiniDesktopManager {
                        AppContext appContext = createAppParent(images.browserIcon);
                        new MiniBrowser(appContext.getAppParent(), url, false, false) {
                                @Override
-                               protected void titleChanged(String title) {
+                               public void titleChanged(String title) {
                                        if (appContext.shell != null)
                                                appContext.shell.setText(title);
                                        if (appContext.tabItem != null) {
@@ -285,7 +285,7 @@ public class MiniDesktopManager {
        protected Image getIconForExt(String ext) {
 //             Program program = Program.findProgram(ext);
 //             if (program == null)
-                       return display.getSystemImage(SWT.ICON_INFORMATION);
+               return display.getSystemImage(SWT.ICON_INFORMATION);
 
 //             ImageData iconData = program.getImageData();
 //             if (iconData == null) {
diff --git a/swt/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniDesktopSpecific.java b/swt/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniDesktopSpecific.java
new file mode 100644 (file)
index 0000000..c748822
--- /dev/null
@@ -0,0 +1,29 @@
+package org.argeo.minidesktop;
+
+import java.util.Objects;
+
+import org.eclipse.swt.browser.Browser;
+
+/**
+ * This customiser is available to all components, in order to be extended with
+ * low-level specific capabilities, which depend on the context (typically
+ * differences between RAP and RCP). It does nothing by default.
+ */
+public class MiniDesktopSpecific {
+       protected void addBrowserTitleListener(MiniBrowser miniBrowser, Browser browser) {
+       }
+
+       protected void addBrowserOpenWindowListener(MiniBrowser miniBrowser, Browser browser) {
+       }
+
+       private static MiniDesktopSpecific SINGLETON = new MiniDesktopSpecific();
+
+       public static void setMiniDesktopSpecific(MiniDesktopSpecific miniDesktopSpecific) {
+               Objects.requireNonNull(miniDesktopSpecific);
+               SINGLETON = miniDesktopSpecific;
+       }
+
+       static MiniDesktopSpecific getMiniDesktopSpecific() {
+               return SINGLETON;
+       }
+}
diff --git a/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/jni-config.json b/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/jni-config.json
new file mode 100644 (file)
index 0000000..25530bb
--- /dev/null
@@ -0,0 +1,33 @@
+[
+{
+  "name":"java.lang.Boolean",
+  "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.lang.ClassLoader",
+  "methods":[
+    {"name":"getPlatformClassLoader","parameterTypes":[] }, 
+    {"name":"loadClass","parameterTypes":["java.lang.String"] }
+  ]
+},
+{
+  "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader"
+},
+{
+  "name":"org.graalvm.jniutils.JNIExceptionWrapperEntryPoints",
+  "methods":[{"name":"getClassName","parameterTypes":["java.lang.Class"] }]
+},
+{
+  "name":"sun.management.VMManagementImpl",
+  "fields":[
+    {"name":"compTimeMonitoringSupport"}, 
+    {"name":"currentThreadCpuTimeSupport"}, 
+    {"name":"objectMonitorUsageSupport"}, 
+    {"name":"otherThreadCpuTimeSupport"}, 
+    {"name":"remoteDiagnosticCommandsSupport"}, 
+    {"name":"synchronizerUsageSupport"}, 
+    {"name":"threadAllocatedMemorySupport"}, 
+    {"name":"threadContentionMonitoringSupport"}
+  ]
+}
+]
diff --git a/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/predefined-classes-config.json b/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/predefined-classes-config.json
new file mode 100644 (file)
index 0000000..0e79b2c
--- /dev/null
@@ -0,0 +1,8 @@
+[
+  {
+    "type":"agent-extracted",
+    "classes":[
+    ]
+  }
+]
+
diff --git a/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/proxy-config.json b/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/proxy-config.json
new file mode 100644 (file)
index 0000000..5d1d13d
--- /dev/null
@@ -0,0 +1,8 @@
+[
+  {
+    "interfaces":["javax.servlet.http.HttpServletRequest"]}
+  ,
+  {
+    "interfaces":["javax.servlet.http.HttpServletResponse"]}
+  
+]
diff --git a/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/reflect-config.json b/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/reflect-config.json
new file mode 100644 (file)
index 0000000..e9910e1
--- /dev/null
@@ -0,0 +1,393 @@
+[
+{
+  "name":"[B"
+},
+{
+  "name":"[Ljava.lang.String;"
+},
+{
+  "name":"[Lorg.eclipse.swt.widgets.TableColumn;"
+},
+{
+  "name":"[Lorg.eclipse.swt.widgets.TreeColumn;"
+},
+{
+  "name":"[Lsun.security.pkcs.SignerInfo;"
+},
+{
+  "name":"com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.Boolean",
+  "queriedMethods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.lang.Byte",
+  "queriedMethods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.lang.Class"
+},
+{
+  "name":"java.lang.Double",
+  "queriedMethods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.lang.Float",
+  "queriedMethods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.lang.Integer",
+  "queriedMethods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.lang.Long",
+  "queriedMethods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.lang.Object",
+  "queriedMethods":[
+    {"name":"equals","parameterTypes":["java.lang.Object"] }, 
+    {"name":"hashCode","parameterTypes":[] }, 
+    {"name":"toString","parameterTypes":[] }
+  ]
+},
+{
+  "name":"java.lang.Short",
+  "queriedMethods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.lang.String"
+},
+{
+  "name":"java.lang.management.ManagementFactory",
+  "methods":[{"name":"getRuntimeMXBean","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.management.RuntimeMXBean",
+  "methods":[{"name":"getUptime","parameterTypes":[] }]
+},
+{
+  "name":"java.security.AlgorithmParametersSpi"
+},
+{
+  "name":"java.security.SecureRandomParameters"
+},
+{
+  "name":"java.util.Date"
+},
+{
+  "name":"javax.security.auth.login.Configuration$Parameters"
+},
+{
+  "name":"javax.security.auth.x500.X500Principal",
+  "fields":[{"name":"thisX500Name"}],
+  "queriedMethods":[{"name":"<init>","parameterTypes":["sun.security.x509.X500Name"] }]
+},
+{
+  "name":"javax.servlet.ServletRequest",
+  "queriedMethods":[
+    {"name":"getAsyncContext","parameterTypes":[] }, 
+    {"name":"getAttribute","parameterTypes":["java.lang.String"] }, 
+    {"name":"getAttributeNames","parameterTypes":[] }, 
+    {"name":"getCharacterEncoding","parameterTypes":[] }, 
+    {"name":"getContentLength","parameterTypes":[] }, 
+    {"name":"getContentLengthLong","parameterTypes":[] }, 
+    {"name":"getContentType","parameterTypes":[] }, 
+    {"name":"getDispatcherType","parameterTypes":[] }, 
+    {"name":"getInputStream","parameterTypes":[] }, 
+    {"name":"getLocalAddr","parameterTypes":[] }, 
+    {"name":"getLocalName","parameterTypes":[] }, 
+    {"name":"getLocalPort","parameterTypes":[] }, 
+    {"name":"getLocale","parameterTypes":[] }, 
+    {"name":"getLocales","parameterTypes":[] }, 
+    {"name":"getParameter","parameterTypes":["java.lang.String"] }, 
+    {"name":"getParameterMap","parameterTypes":[] }, 
+    {"name":"getParameterNames","parameterTypes":[] }, 
+    {"name":"getParameterValues","parameterTypes":["java.lang.String"] }, 
+    {"name":"getProtocol","parameterTypes":[] }, 
+    {"name":"getReader","parameterTypes":[] }, 
+    {"name":"getRealPath","parameterTypes":["java.lang.String"] }, 
+    {"name":"getRemoteAddr","parameterTypes":[] }, 
+    {"name":"getRemoteHost","parameterTypes":[] }, 
+    {"name":"getRemotePort","parameterTypes":[] }, 
+    {"name":"getRequestDispatcher","parameterTypes":["java.lang.String"] }, 
+    {"name":"getScheme","parameterTypes":[] }, 
+    {"name":"getServerName","parameterTypes":[] }, 
+    {"name":"getServerPort","parameterTypes":[] }, 
+    {"name":"getServletContext","parameterTypes":[] }, 
+    {"name":"isAsyncStarted","parameterTypes":[] }, 
+    {"name":"isAsyncSupported","parameterTypes":[] }, 
+    {"name":"isSecure","parameterTypes":[] }, 
+    {"name":"removeAttribute","parameterTypes":["java.lang.String"] }, 
+    {"name":"setAttribute","parameterTypes":["java.lang.String","java.lang.Object"] }, 
+    {"name":"setCharacterEncoding","parameterTypes":["java.lang.String"] }, 
+    {"name":"startAsync","parameterTypes":[] }, 
+    {"name":"startAsync","parameterTypes":["javax.servlet.ServletRequest","javax.servlet.ServletResponse"] }
+  ]
+},
+{
+  "name":"javax.servlet.ServletResponse"
+},
+{
+  "name":"javax.servlet.http.HttpServletRequest",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.reflect.InvocationHandler"] }],
+  "queriedMethods":[
+    {"name":"authenticate","parameterTypes":["javax.servlet.http.HttpServletResponse"] }, 
+    {"name":"changeSessionId","parameterTypes":[] }, 
+    {"name":"getAuthType","parameterTypes":[] }, 
+    {"name":"getContextPath","parameterTypes":[] }, 
+    {"name":"getCookies","parameterTypes":[] }, 
+    {"name":"getDateHeader","parameterTypes":["java.lang.String"] }, 
+    {"name":"getHeader","parameterTypes":["java.lang.String"] }, 
+    {"name":"getHeaderNames","parameterTypes":[] }, 
+    {"name":"getHeaders","parameterTypes":["java.lang.String"] }, 
+    {"name":"getHttpServletMapping","parameterTypes":[] }, 
+    {"name":"getIntHeader","parameterTypes":["java.lang.String"] }, 
+    {"name":"getMethod","parameterTypes":[] }, 
+    {"name":"getPart","parameterTypes":["java.lang.String"] }, 
+    {"name":"getParts","parameterTypes":[] }, 
+    {"name":"getPathInfo","parameterTypes":[] }, 
+    {"name":"getPathTranslated","parameterTypes":[] }, 
+    {"name":"getQueryString","parameterTypes":[] }, 
+    {"name":"getRemoteUser","parameterTypes":[] }, 
+    {"name":"getRequestURI","parameterTypes":[] }, 
+    {"name":"getRequestURL","parameterTypes":[] }, 
+    {"name":"getRequestedSessionId","parameterTypes":[] }, 
+    {"name":"getServletPath","parameterTypes":[] }, 
+    {"name":"getSession","parameterTypes":[] }, 
+    {"name":"getSession","parameterTypes":["boolean"] }, 
+    {"name":"getTrailerFields","parameterTypes":[] }, 
+    {"name":"getUserPrincipal","parameterTypes":[] }, 
+    {"name":"isRequestedSessionIdFromCookie","parameterTypes":[] }, 
+    {"name":"isRequestedSessionIdFromURL","parameterTypes":[] }, 
+    {"name":"isRequestedSessionIdFromUrl","parameterTypes":[] }, 
+    {"name":"isRequestedSessionIdValid","parameterTypes":[] }, 
+    {"name":"isTrailerFieldsReady","parameterTypes":[] }, 
+    {"name":"isUserInRole","parameterTypes":["java.lang.String"] }, 
+    {"name":"login","parameterTypes":["java.lang.String","java.lang.String"] }, 
+    {"name":"logout","parameterTypes":[] }, 
+    {"name":"newPushBuilder","parameterTypes":[] }, 
+    {"name":"upgrade","parameterTypes":["java.lang.Class"] }
+  ]
+},
+{
+  "name":"javax.servlet.http.HttpServletResponse"
+},
+{
+  "name":"org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.xerces.impl.dv.dtd.XML11DTDDVFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.xerces.impl.dv.xs.ExtendedSchemaDVFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.xerces.impl.xs.XSMessageFormatter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.xerces.parsers.XIncludeAwareParserConfiguration",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.argeo.cms.auth.AnonymousLoginModule",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.argeo.cms.auth.DataAdminLoginModule",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.argeo.cms.auth.IdentLoginModule",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.argeo.cms.auth.RemoteSessionLoginModule",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.argeo.cms.auth.UserAdminLoginModule",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.jetty.servlet.DefaultServlet",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.jetty.util.TypeUtil",
+  "methods":[
+    {"name":"getClassLoaderLocation","parameterTypes":["java.lang.Class"] }, 
+    {"name":"getCodeSourceLocation","parameterTypes":["java.lang.Class"] }, 
+    {"name":"getModuleLocation","parameterTypes":["java.lang.Class"] }, 
+    {"name":"getSystemClassLoaderLocation","parameterTypes":["java.lang.Class"] }
+  ]
+},
+{
+  "name":"org.eclipse.rap.rwt.internal.client.BrowserNavigationImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.rap.rwt.internal.client.ClientInfoImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.rap.rwt.internal.client.ExitConfirmationImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.rap.rwt.internal.client.StartupParametersImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.rap.rwt.internal.client.WebClientMessages",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle",
+  "methods":[{"name":"<init>","parameterTypes":["org.eclipse.rap.rwt.internal.application.ApplicationContextImpl"] }]
+},
+{
+  "name":"org.eclipse.rap.rwt.internal.lifecycle.RequestCounter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.rap.rwt.internal.remote.RemoteObjectRegistry",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.rap.rwt.internal.serverpush.ServerPushManager",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.rap.rwt.internal.textsize.ProbeResultStore",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.SWT",
+  "allDeclaredFields":true
+},
+{
+  "name":"org.eclipse.swt.graphics.Color",
+  "methods":[{"name":"<init>","parameterTypes":["int"] }]
+},
+{
+  "name":"org.eclipse.swt.graphics.Font",
+  "methods":[{"name":"<init>","parameterTypes":["org.eclipse.swt.graphics.FontData"] }]
+},
+{
+  "name":"org.eclipse.swt.internal.image.GIFFileFormat",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.internal.image.JPEGFileFormat",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.internal.image.PNGFileFormat",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.internal.image.WinBMPFileFormat",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.internal.image.WinICOFileFormat",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.internal.widgets.IdGenerator",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.internal.widgets.displaykit.DisplayLCA",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.internal.widgets.scrollbarkit.ScrollBarThemeAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.internal.widgets.shellkit.ShellThemeAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.internal.widgets.tablekit.TableThemeAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.internal.widgets.treekit.TreeThemeAdapter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.ConfigFile$Spi",
+  "methods":[{"name":"<init>","parameterTypes":["javax.security.auth.login.Configuration$Parameters"] }]
+},
+{
+  "name":"sun.security.provider.DRBG",
+  "methods":[{"name":"<init>","parameterTypes":["java.security.SecureRandomParameters"] }]
+},
+{
+  "name":"sun.security.provider.DSAKeyFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.DSAParameters",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.NativePRNG",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.SHA",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.SHA2$SHA256",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.X509Factory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.rsa.RSAKeyFactory$Legacy",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.util.ObjectIdentifier"
+},
+{
+  "name":"sun.security.x509.AuthorityKeyIdentifierExtension",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+  "name":"sun.security.x509.BasicConstraintsExtension",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+  "name":"sun.security.x509.CertificateExtensions"
+},
+{
+  "name":"sun.security.x509.ExtendedKeyUsageExtension",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+  "name":"sun.security.x509.KeyUsageExtension",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+  "name":"sun.security.x509.SubjectKeyIdentifierExtension",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+}
+]
diff --git a/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/resource-config.json b/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/resource-config.json
new file mode 100644 (file)
index 0000000..0f3300a
--- /dev/null
@@ -0,0 +1,735 @@
+{
+  "resources":{
+  "includes":[
+    {
+      "pattern":"\\QMETA-INF/MANIFEST.MF\\E"
+    }, 
+    {
+      "pattern":"\\QMETA-INF/services/javax.xml.parsers.DocumentBuilderFactory\\E"
+    }, 
+    {
+      "pattern":"\\QMETA-INF/services/javax.xml.validation.SchemaFactory\\E"
+    }, 
+    {
+      "pattern":"\\QMETA-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder\\E"
+    }, 
+    {
+      "pattern":"\\Qclient.files\\E"
+    }, 
+    {
+      "pattern":"\\Qclient.js\\E"
+    }, 
+    {
+      "pattern":"\\Qjetty-dir.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/DSMLv2.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/SVG.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/XForms-11-Schema.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/XMLSchema.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/cr.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/docbook.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/schema-for-xslt20.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/xlink.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/xml-events-attribs-1.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/xml.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/internal/runtime/jaas.cfg\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/jetty/http/encoding.properties\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/jetty/http/mime.properties\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/jetty/version/build.properties\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/nebula/widgets/grid/internal/gridkit/Grid.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/nebula/widgets/grid/internal/gridkit/Grid.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/nebula/widgets/grid/internal/gridkit/Grid.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/rap/rwt/internal/service/rwt-index.html\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/rap/rwt/internal/widgets/dropdownkit/DropDown.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/rap/rwt/internal/widgets/dropdownkit/DropDown.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/rap/rwt/internal/widgets/dropdownkit/DropDown.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/rap/rwt/internal/widgets/fileuploadkit/FileUpload.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/rap/rwt/internal/widgets/fileuploadkit/FileUpload.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/rap/rwt/internal/widgets/fileuploadkit/FileUpload.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/browser/browserkit/Browser.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/browser/browserkit/Browser.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/browser/browserkit/Browser.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/custom/ccombokit/CCombo.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/custom/ccombokit/CCombo.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/custom/ccombokit/CCombo.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/custom/clabelkit/CLabel.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/custom/clabelkit/CLabel.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/custom/clabelkit/CLabel.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/custom/ctabfolderkit/CTabFolder.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/custom/ctabfolderkit/CTabFolder.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/custom/ctabfolderkit/CTabFolder.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/custom/scrolledcompositekit/ScrolledComposite.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/buttonkit/Button.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/buttonkit/Button.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/buttonkit/Button.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/combokit/Combo.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/combokit/Combo.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/combokit/Combo.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/compositekit/Composite.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/compositekit/Composite.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/compositekit/Composite.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/controlkit/Control.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/controlkit/Control.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/coolbarkit/CoolBar.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/coolbarkit/CoolBar.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/coolbarkit/CoolBar.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/datetimekit/DateTime.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/datetimekit/DateTime.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/datetimekit/DateTime.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/expandbarkit/ExpandBar.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/expandbarkit/ExpandBar.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/expandbarkit/ExpandBar.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/groupkit/Group.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/groupkit/Group.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/groupkit/Group.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/labelkit/Label.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/labelkit/Label.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/labelkit/Label.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/linkkit/Link.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/linkkit/Link.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/linkkit/Link.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/listkit/List.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/listkit/List.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/listkit/List.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/menukit/Menu.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/menukit/Menu.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/menukit/Menu.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/progressbarkit/ProgressBar.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/progressbarkit/ProgressBar.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/progressbarkit/ProgressBar.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/sashkit/Sash.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/sashkit/Sash.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/sashkit/Sash.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/scalekit/Scale.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/scalekit/Scale.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/scalekit/Scale.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/scrollbarkit/ScrollBar.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/scrollbarkit/ScrollBar.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/scrollbarkit/ScrollBar.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/shellkit/Shell.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/shellkit/Shell.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/shellkit/Shell.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/sliderkit/Slider.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/sliderkit/Slider.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/sliderkit/Slider.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/spinnerkit/Spinner.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/spinnerkit/Spinner.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/spinnerkit/Spinner.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/tabfolderkit/TabFolder.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/tabfolderkit/TabFolder.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/tabfolderkit/TabFolder.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/tablekit/Table.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/tablekit/Table.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/tablekit/Table.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/textkit/Text.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/textkit/Text.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/textkit/Text.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/toolbarkit/ToolBar.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/toolbarkit/ToolBar.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/toolbarkit/ToolBar.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/tooltipkit/ToolTip.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/tooltipkit/ToolTip.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/tooltipkit/ToolTip.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/treekit/Tree.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/treekit/Tree.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/treekit/Tree.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/widgetkit/Widget.appearances.js\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/widgetkit/Widget.default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/widgets/widgetkit/Widget.theme.xml\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/slf4j/impl/StaticLoggerBinder.class\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/static/html/blank.html\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/static/image/blank.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/theme/default.css\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/arrows/chevron-left-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/arrows/chevron-left.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/arrows/chevron-right-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/arrows/chevron-right.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/arrows/tooltip-down.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/arrows/tooltip-left.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/arrows/tooltip-right.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/arrows/tooltip-up.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/arrow-down.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/arrow-left.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/arrow-right.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/arrow-up.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/check-grayed-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/check-grayed.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/check-selected-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/check-selected.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/check-unselected-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/check-unselected.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/radio-selected-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/radio-selected.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/radio-unselected-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/button/radio-unselected.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/calendar/lastMonth-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/calendar/lastMonth.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/calendar/lastYear-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/calendar/lastYear.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/calendar/nextMonth-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/calendar/nextMonth.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/calendar/nextYear-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/calendar/nextYear.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/ccombo/down-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/ccombo/down.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/column/sort-indicator-down.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/column/sort-indicator-up.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/combo/down-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/combo/down.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/ctabfolder/close.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/ctabfolder/close_hover.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/ctabfolder/ctabfolder-dropdown-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/ctabfolder/ctabfolder-dropdown-left-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/ctabfolder/ctabfolder-dropdown-left.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/ctabfolder/ctabfolder-dropdown.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/ctabfolder/maximize.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/ctabfolder/minimize.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/ctabfolder/restore.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/cursors/alias.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/cursors/copy.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/cursors/move.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/cursors/nodrop.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/cursors/up_arrow.cur\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/datetime/down-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/datetime/down.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/datetime/up-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/datetime/up.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/dialog/error.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/dialog/information.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/dialog/question.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/dialog/warning.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/display/browser_bg.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/display/loading.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/expanditem/expanditem-collapse-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/expanditem/expanditem-collapse.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/expanditem/expanditem-expand-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/expanditem/expanditem-expand.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/menu/arrow-left.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/menu/arrow-right.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/menu/checkbox.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/menu/radiobutton.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/progressbar/progressbar-background.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/sash/sash-handle-horizontal.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/sash/sash-handle-vertical.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/scale/h_line.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/scale/v_line.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/scrollbar/down.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/scrollbar/left.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/scrollbar/right.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/scrollbar/scrollbar-background.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/scrollbar/up.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/slider/down.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/slider/left.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/slider/right.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/slider/slider-background.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/slider/up.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/spinner/down-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/spinner/down.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/spinner/up-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/spinner/up.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/text/clear.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/text/find.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/toolbar/down.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tooltip/error.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tooltip/information.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tooltip/warning.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tree/loading.gif\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tree/tree-collapsed-hover-left.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tree/tree-collapsed-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tree/tree-collapsed-left.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tree/tree-collapsed.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tree/tree-expanded-hover-left.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tree/tree-expanded-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tree/tree-expanded-left.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/tree/tree-expanded.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/window/shell-close-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/window/shell-close.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/window/shell-max-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/window/shell-max.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/window/shell-min-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/window/shell-min.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/window/shell-restore-hover.png\\E"
+    }, 
+    {
+      "pattern":"\\Qresource/widget/rap/window/shell-restore.png\\E"
+    }
+  ]},
+  "bundles":[
+    {
+      "name":"javax.servlet.LocalStrings",
+      "locales":[""]
+    }, 
+    {
+      "name":"javax.servlet.http.LocalStrings",
+      "locales":[""]
+    }, 
+    {
+      "name":"org.apache.xerces.impl.xpath.regex.message",
+      "locales":[
+        "", 
+        "en"
+      ]
+    }, 
+    {
+      "name":"org.eclipse.rap.rwt.internal.RWTMessages",
+      "locales":[""]
+    }, 
+    {
+      "name":"sun.security.util.Resources",
+      "classNames":["sun.security.util.Resources"]
+    }
+  ]
+}
diff --git a/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/serialization-config.json b/swt/rap/org.argeo.cms.swt.rap.cli/META-INF/native-image/serialization-config.json
new file mode 100644 (file)
index 0000000..bf554e0
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  "types":[
+  ],
+  "lambdaCapturingTypes":[
+  ]
+}