Introduce SLC Tool
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 8 Jul 2022 18:21:51 +0000 (20:21 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 8 Jul 2022 18:21:51 +0000 (20:21 +0200)
17 files changed:
Makefile
cms/org.argeo.slc.cms/bnd.bnd
cms/org.argeo.slc.cms/src/org/argeo/slc/cli/ArgeoCli.java [deleted file]
org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java
suite/org.argeo.slc.tool/.classpath [new file with mode: 0644]
suite/org.argeo.slc.tool/.project [new file with mode: 0644]
suite/org.argeo.slc.tool/META-INF/native-image/jni-config.json [new file with mode: 0644]
suite/org.argeo.slc.tool/META-INF/native-image/predefined-classes-config.json [new file with mode: 0644]
suite/org.argeo.slc.tool/META-INF/native-image/proxy-config.json [new file with mode: 0644]
suite/org.argeo.slc.tool/META-INF/native-image/reflect-config.json [new file with mode: 0644]
suite/org.argeo.slc.tool/META-INF/native-image/resource-config.json [new file with mode: 0644]
suite/org.argeo.slc.tool/META-INF/native-image/serialization-config.json [new file with mode: 0644]
suite/org.argeo.slc.tool/bnd.bnd [new file with mode: 0644]
suite/org.argeo.slc.tool/build.properties [new file with mode: 0644]
suite/org.argeo.slc.tool/src/org/argeo/slc/tool/CmsCli.java [new file with mode: 0644]
suite/org.argeo.slc.tool/src/org/argeo/slc/tool/Main.java [new file with mode: 0644]
suite/org.argeo.slc.tool/src/org/argeo/slc/tool/swt/MiniDesktopCli.java [new file with mode: 0644]

index fd7e29145081abc0e8c4d2728141c2446d68e51f..04638f6aa752f662d76cbcac99581fdd75553ec5 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -10,8 +10,9 @@ org.argeo.slc.api \
 org.argeo.slc.factory \
 org.argeo.slc.runtime \
 cms/org.argeo.slc.cms \
+suite/org.argeo.slc.tool \
 
-VPATH = .:cms
+VPATH = .:cms:suite
 
 clean:
        rm -rf $(BUILD_BASE)
@@ -24,11 +25,26 @@ org.argeo.tp \
 org.argeo.tp.sdk \
 org.argeo.tp.apache \
 org.argeo.tp.jetty \
-org.argeo.tp.eclipse.equinox \
-org.argeo.tp.eclipse.rap \
+org.argeo.tp.eclipse \
+osgi/api/org.argeo.tp.osgi \
+swt/rcp/org.argeo.tp.swt \
+lib/linux/x86_64/swt/rcp/org.argeo.tp.swt \
+swt/rcp/org.argeo.tp.swt.workbench \
 org.argeo.tp.jcr \
 org.argeo.tp.formats \
 org.argeo.tp.gis \
 org.argeo.cms \
+org.argeo.cms.eclipse.rcp \
+
+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 \
+               -cp $(A2_CLASSPATH):$(A2_BUNDLES_CLASSPATH) org.argeo.slc.tool.Main \
+               --enable-url-protocols=http,https -H:AdditionalSecurityProviders=sun.security.jgss.SunProvider \
+               --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
index a93353396e0d9807971b823894d5b398a14a1c43..144bd1afd1219bc97ab26a957da093d6191084d5 100644 (file)
@@ -1,4 +1,4 @@
 Import-Package: \
 org.apache.commons.logging,\
-org.osgi.*;version=0.0.0§,\
+org.osgi.*;version="0.0.0",\
 *
\ No newline at end of file
diff --git a/cms/org.argeo.slc.cms/src/org/argeo/slc/cli/ArgeoCli.java b/cms/org.argeo.slc.cms/src/org/argeo/slc/cli/ArgeoCli.java
deleted file mode 100644 (file)
index 4e23837..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.argeo.slc.cli;
-
-import org.apache.commons.cli.Option;
-import org.argeo.cms.cli.CommandsCli;
-import org.argeo.slc.cli.posix.PosixCommands;
-
-/** 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());
-
-               addCommandsCli(new PosixCommands("posix"));
-//             addCommandsCli(new FsCommands("fs"));
-//             addCommandsCli(new JcrCommands("jcr"));
-       }
-
-       @Override
-       public String getDescription() {
-               return "Argeo command line utilities";
-       }
-
-       public static void main(String[] args) {
-               mainImpl(new ArgeoCli("argeo"), args);
-       }
-
-}
index 6b61493bcc15675177b947f6cec8f91b6d396c77..9792e71cc6c65240d800143df41dbed54c82a1f8 100644 (file)
@@ -784,6 +784,9 @@ public class A2Factory {
                                        continue entries;
                                if (entry.getName().startsWith("META-INF/versions/")) // skip multi-version
                                        continue entries;
+                               // skip file system providers as they cause issues with native image
+                               if (entry.getName().startsWith("META-INF/services/java.nio.file.spi.FileSystemProvider")) 
+                                       continue entries;
                                if (entry.getName().startsWith("OSGI-OPT/src/")) // skip embedded sources
                                        continue entries;
                                Path target = targetBundleDir.resolve(entry.getName());
diff --git a/suite/org.argeo.slc.tool/.classpath b/suite/org.argeo.slc.tool/.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/suite/org.argeo.slc.tool/.project b/suite/org.argeo.slc.tool/.project
new file mode 100644 (file)
index 0000000..7044578
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.slc.tool</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/suite/org.argeo.slc.tool/META-INF/native-image/jni-config.json b/suite/org.argeo.slc.tool/META-INF/native-image/jni-config.json
new file mode 100644 (file)
index 0000000..265efae
--- /dev/null
@@ -0,0 +1,275 @@
+[
+{
+  "name":"com.sun.security.auth.module.UnixSystem",
+  "fields":[
+    {"name":"gid"}, 
+    {"name":"groups"}, 
+    {"name":"uid"}, 
+    {"name":"username"}
+  ]
+},
+{
+  "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":"java.lang.Throwable",
+  "methods":[{"name":"addSuppressed","parameterTypes":["java.lang.Throwable"] }]
+},
+{
+  "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader"
+},
+{
+  "name":"org.eclipse.swt.browser.WebKit",
+  "methods":[
+    {"name":"JSDOMEventProc","parameterTypes":["long","long","long"] }, 
+    {"name":"Proc","parameterTypes":["long","long"] }, 
+    {"name":"Proc","parameterTypes":["long","long","long"] }, 
+    {"name":"Proc","parameterTypes":["long","long","long","long"] }, 
+    {"name":"Proc","parameterTypes":["long","long","long","long","long"] }
+  ]
+},
+{
+  "name":"org.eclipse.swt.browser.WebKit$WebKitExtension",
+  "methods":[{"name":"initializeWebExtensions_callback","parameterTypes":["long","long"] }]
+},
+{
+  "name":"org.eclipse.swt.browser.WebKit$Webkit2AsyncToSync",
+  "methods":[
+    {"name":"getCookie_callback","parameterTypes":["long","long","long"] }, 
+    {"name":"getText_callback","parameterTypes":["long","long","long"] }, 
+    {"name":"runjavascript_callback","parameterTypes":["long","long","long"] }, 
+    {"name":"setCookie_callback","parameterTypes":["long","long","long"] }
+  ]
+},
+{
+  "name":"org.eclipse.swt.browser.WebkitGDBus",
+  "methods":[
+    {"name":"authenticatePeerCB","parameterTypes":["long","long","long","long"] }, 
+    {"name":"callExtensionAsyncCB","parameterTypes":["long","long","long"] }, 
+    {"name":"handleMethodCB","parameterTypes":["long","long","long","long","long","long","long","long"] }, 
+    {"name":"newConnectionCB","parameterTypes":["long","long","long"] }, 
+    {"name":"newConnectionToExtensionCB","parameterTypes":["long","long","long"] }
+  ]
+},
+{
+  "name":"org.eclipse.swt.graphics.Device",
+  "methods":[{"name":"logProc","parameterTypes":["long","long","long","long"] }]
+},
+{
+  "name":"org.eclipse.swt.internal.SessionManagerDBus",
+  "methods":[{"name":"g_signal_handler","parameterTypes":["long","long","long","long","long"] }]
+},
+{
+  "name":"org.eclipse.swt.internal.cairo.cairo_rectangle_int_t",
+  "fields":[
+    {"name":"height"}, 
+    {"name":"width"}, 
+    {"name":"x"}, 
+    {"name":"y"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk.GTypeInfo",
+  "fields":[
+    {"name":"base_finalize"}, 
+    {"name":"base_init"}, 
+    {"name":"class_data"}, 
+    {"name":"class_finalize"}, 
+    {"name":"class_init"}, 
+    {"name":"class_size"}, 
+    {"name":"instance_init"}, 
+    {"name":"instance_size"}, 
+    {"name":"n_preallocs"}, 
+    {"name":"value_table"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk.GdkKeymapKey",
+  "fields":[
+    {"name":"group"}, 
+    {"name":"keycode"}, 
+    {"name":"level"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk.GdkRGBA",
+  "fields":[
+    {"name":"alpha"}, 
+    {"name":"blue"}, 
+    {"name":"green"}, 
+    {"name":"red"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk.GdkRectangle",
+  "fields":[
+    {"name":"height"}, 
+    {"name":"width"}, 
+    {"name":"x"}, 
+    {"name":"y"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk.GtkAllocation",
+  "fields":[
+    {"name":"height"}, 
+    {"name":"width"}, 
+    {"name":"x"}, 
+    {"name":"y"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk.GtkBorder",
+  "fields":[
+    {"name":"bottom"}, 
+    {"name":"left"}, 
+    {"name":"right"}, 
+    {"name":"top"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk.GtkRequisition",
+  "fields":[
+    {"name":"height"}, 
+    {"name":"width"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk3.GdkEvent",
+  "fields":[{"name":"type"}]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk3.GdkEventCrossing",
+  "fields":[
+    {"name":"detail"}, 
+    {"name":"focus"}, 
+    {"name":"mode"}, 
+    {"name":"send_event"}, 
+    {"name":"state"}, 
+    {"name":"subwindow"}, 
+    {"name":"time"}, 
+    {"name":"window"}, 
+    {"name":"x"}, 
+    {"name":"x_root"}, 
+    {"name":"y"}, 
+    {"name":"y_root"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk3.GdkEventFocus",
+  "fields":[
+    {"name":"in"}, 
+    {"name":"send_event"}, 
+    {"name":"window"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk3.GdkEventKey",
+  "fields":[
+    {"name":"window"},
+    {"name":"send_event"},
+    {"name":"time"},
+    {"name":"state"},
+    {"name":"keyval"},
+    {"name":"length"},
+    {"name":"string"},
+    {"name":"is_modifier"},
+    {"name":"hardware_keycode"},
+    {"name":"group"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk3.GdkEventMotion",
+  "fields":[
+    {"name":"axes"}, 
+    {"name":"device"}, 
+    {"name":"is_hint"}, 
+    {"name":"send_event"}, 
+    {"name":"state"}, 
+    {"name":"time"}, 
+    {"name":"window"}, 
+    {"name":"x"}, 
+    {"name":"x_root"}, 
+    {"name":"y"}, 
+    {"name":"y_root"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.internal.gtk3.GdkEventWindowState",
+  "fields":[
+    {"name":"changed_mask"}, 
+    {"name":"new_window_state"}, 
+    {"name":"send_event"}, 
+    {"name":"window"}
+  ]
+},
+{
+  "name":"org.eclipse.swt.widgets.Control",
+  "methods":[
+    {"name":"gestureBeginProc","parameterTypes":["long","long","long"] }, 
+    {"name":"gestureEndProc","parameterTypes":["long","long","long"] }, 
+    {"name":"magnifyProc","parameterTypes":["long","double","long"] }, 
+    {"name":"rotateProc","parameterTypes":["long","double","double","long"] }, 
+    {"name":"swipeProc","parameterTypes":["long","double","double","long"] }
+  ]
+},
+{
+  "name":"org.eclipse.swt.widgets.Display",
+  "methods":[
+    {"name":"allChildrenProc","parameterTypes":["long","long"] }, 
+    {"name":"caretProc","parameterTypes":["long"] }, 
+    {"name":"cellDataProc","parameterTypes":["long","long","long","long","long"] }, 
+    {"name":"changeValue","parameterTypes":["long","int","double","long"] }, 
+    {"name":"checkIfEventProc","parameterTypes":["long","long","long"] }, 
+    {"name":"emissionProc","parameterTypes":["long","long","long","long"] }, 
+    {"name":"eventProc","parameterTypes":["long","long"] }, 
+    {"name":"idleProc","parameterTypes":["long"] }, 
+    {"name":"keysChangedProc","parameterTypes":["long","long"] }, 
+    {"name":"mouseHoverProc","parameterTypes":["long"] }, 
+    {"name":"notifyProc","parameterTypes":["long","long","long"] }, 
+    {"name":"rendererClassInitProc","parameterTypes":["long","long"] }, 
+    {"name":"rendererGetPreferredWidthProc","parameterTypes":["long","long","long","long"] }, 
+    {"name":"rendererRenderProc","parameterTypes":["long","long","long","long","long","long"] }, 
+    {"name":"setDirectionProc","parameterTypes":["long","long"] }, 
+    {"name":"shellMapProc","parameterTypes":["long","long","long"] }, 
+    {"name":"signalProc","parameterTypes":["long","long","long"] }, 
+    {"name":"sizeAllocateProc","parameterTypes":["long","long","long"] }, 
+    {"name":"sizeRequestProc","parameterTypes":["long","long","long"] }, 
+    {"name":"timerProc","parameterTypes":["long"] }, 
+    {"name":"windowProc","parameterTypes":["long","long"] }, 
+    {"name":"windowProc","parameterTypes":["long","long","long"] }, 
+    {"name":"windowProc","parameterTypes":["long","long","long","long"] }, 
+    {"name":"windowProc","parameterTypes":["long","long","long","long","long"] }, 
+    {"name":"windowTimerProc","parameterTypes":["long"] }
+  ]
+},
+{
+  "name":"org.eclipse.swt.widgets.ToolBar",
+  "methods":[{"name":"MenuItemSelectedProc","parameterTypes":["long","long"] }]
+},
+{
+  "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/suite/org.argeo.slc.tool/META-INF/native-image/predefined-classes-config.json b/suite/org.argeo.slc.tool/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/suite/org.argeo.slc.tool/META-INF/native-image/proxy-config.json b/suite/org.argeo.slc.tool/META-INF/native-image/proxy-config.json
new file mode 100644 (file)
index 0000000..0d4f101
--- /dev/null
@@ -0,0 +1,2 @@
+[
+]
diff --git a/suite/org.argeo.slc.tool/META-INF/native-image/reflect-config.json b/suite/org.argeo.slc.tool/META-INF/native-image/reflect-config.json
new file mode 100644 (file)
index 0000000..ca26715
--- /dev/null
@@ -0,0 +1,93 @@
+[
+{
+  "name":"[B"
+},
+{
+  "name":"[Ljava.lang.String;"
+},
+{
+  "name":"[Lsun.security.pkcs.SignerInfo;"
+},
+{
+  "name":"com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.String"
+},
+{
+  "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":"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":"org.argeo.cms.auth.SingleUserLoginModule",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.eclipse.swt.widgets.Display"
+},
+{
+  "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":[] }]
+},
+{
+  "name":"sun.security.util.ObjectIdentifier"
+},
+{
+  "name":"sun.security.x509.CertificateExtensions"
+}
+]
diff --git a/suite/org.argeo.slc.tool/META-INF/native-image/resource-config.json b/suite/org.argeo.slc.tool/META-INF/native-image/resource-config.json
new file mode 100644 (file)
index 0000000..4afab34
--- /dev/null
@@ -0,0 +1,107 @@
+{
+  "resources":{
+  "includes":[
+    {
+      "pattern":"\\QMETA-INF/services/java.lang.System$LoggerFinder\\E"
+    }, 
+    {
+      "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"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/minidesktop/cheatsheet_obj@2x.png\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/minidesktop/console_view@2x.png\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/minidesktop/delete@2x.png\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/minidesktop/external_browser@2x.png\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/minidesktop/file_obj@2x.png\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/minidesktop/fldr_obj@2x.png\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/minidesktop/nav_home@2x.png\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/osgi/useradmin/jaas-os.cfg\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/gtk/swt_functional_gtk_3_20.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/gtk/swt_theming_fixes_gtk_3_20.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/eclipse/swt/internal/gtk/swt_theming_fixes_gtk_3_24_5.css\\E"
+    }
+  ]},
+  "bundles":[
+    {
+      "name":"org.apache.xerces.impl.msg.XMLSchemaMessages",
+      "locales":[
+        "en", 
+        "und"
+      ]
+    }, 
+    {
+      "name":"org.apache.xerces.impl.xpath.regex.message",
+      "locales":[
+        "en", 
+        "und"
+      ]
+    }, 
+    {
+      "name":"org.eclipse.swt.internal.SWTMessages",
+      "locales":[""]
+    }, 
+    {
+      "name":"sun.security.util.Resources",
+      "classNames":["sun.security.util.Resources"]
+    }
+  ]
+}
diff --git a/suite/org.argeo.slc.tool/META-INF/native-image/serialization-config.json b/suite/org.argeo.slc.tool/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/suite/org.argeo.slc.tool/bnd.bnd b/suite/org.argeo.slc.tool/bnd.bnd
new file mode 100644 (file)
index 0000000..8bec065
--- /dev/null
@@ -0,0 +1 @@
+Main-Class: org.argeo.slc.tool.Main
diff --git a/suite/org.argeo.slc.tool/build.properties b/suite/org.argeo.slc.tool/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/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/CmsCli.java b/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/CmsCli.java
new file mode 100644 (file)
index 0000000..3b7b080
--- /dev/null
@@ -0,0 +1,110 @@
+package org.argeo.slc.tool;
+
+import java.lang.management.ManagementFactory;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.concurrent.ForkJoinPool;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.argeo.api.acr.spi.ProvidedRepository;
+import org.argeo.api.cms.CmsApp;
+import org.argeo.cms.cli.CommandsCli;
+import org.argeo.cms.cli.DescribedCommand;
+import org.argeo.cms.runtime.StaticCms;
+import org.argeo.cms.swt.app.CmsUserApp;
+import org.argeo.cms.ui.rcp.CmsRcpDisplayFactory;
+import org.argeo.util.register.Component;
+import org.argeo.util.register.SimpleRegister;
+
+public class CmsCli extends CommandsCli {
+
+       public CmsCli(String commandName) {
+               super(commandName);
+               addCommand("static", new Launch());
+       }
+
+       @Override
+       public String getDescription() {
+               return "Argeo CMS utilities.";
+       }
+
+       static class Launch implements DescribedCommand<String> {
+               private Option dataOption;
+               private Option uiOption;
+
+               @Override
+               public Options getOptions() {
+                       Options options = new Options();
+                       dataOption = Option.builder().longOpt("data").hasArg().required()
+                                       .desc("path to the writable data area (mandatory)").build();
+                       uiOption = Option.builder().longOpt("ui").desc("open a user interface").build();
+                       options.addOption(dataOption);
+                       options.addOption(uiOption);
+                       return options;
+               }
+
+               @Override
+               public String apply(List<String> args) {
+                       CommandLine cl = toCommandLine(args);
+                       String dataÜath = cl.getOptionValue(dataOption);
+                       boolean ui = cl.hasOption(uiOption);
+
+                       Path instancePath = Paths.get(dataÜath);
+                       System.setProperty("osgi.instance.area", instancePath.toUri().toString());
+
+                       StaticCms staticCms = new StaticCms() {
+                               @Override
+                               protected void addComponents(SimpleRegister register) {
+                                       if (ui) {
+                                               Component<? extends ProvidedRepository> contentRepositoryC = register
+                                                               .find(ProvidedRepository.class, null).first();
+                                               CmsUserApp cmsApp = new CmsUserApp();
+                                               Component<CmsUserApp> cmsAppC = new Component.Builder<>(cmsApp) //
+                                                               .addType(CmsApp.class) //
+                                                               .addType(CmsUserApp.class) //
+                                                               .addDependency(contentRepositoryC.getType(ProvidedRepository.class),
+                                                                               cmsApp::setContentRepository, null) //
+                                                               .build(register);
+
+                                               CmsRcpDisplayFactory displayFactory = new CmsRcpDisplayFactory();
+                                               Component<CmsRcpDisplayFactory> displayFactoryC = new Component.Builder<>(displayFactory) //
+                                                               .addActivation(displayFactory::init) //
+                                                               .addDeactivation(displayFactory::destroy) //
+                                                               .build(register);
+
+                                       }
+                               }
+
+                               @Override
+                               protected void postActivation(SimpleRegister register) {
+                                       if (ui) {
+                                               Component<? extends CmsUserApp> cmsAppC = register.find(CmsUserApp.class, null).first();
+                                               CmsRcpDisplayFactory.openCmsApp(null, cmsAppC.get(), "data", (e) -> {
+                                                       // asynchronous in order to avoid deadlock in UI thread
+                                                       ForkJoinPool.commonPool().execute(() -> stop());
+                                               });
+                                       }
+                               }
+
+                       };
+                       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.";
+               }
+
+       }
+}
diff --git a/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/Main.java b/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/Main.java
new file mode 100644 (file)
index 0000000..089e5b3
--- /dev/null
@@ -0,0 +1,34 @@
+package org.argeo.slc.tool;
+
+import org.apache.commons.cli.Option;
+import org.argeo.cms.cli.CommandsCli;
+import org.argeo.slc.cli.posix.PosixCommands;
+import org.argeo.slc.tool.swt.MiniDesktopCli;
+
+/** Argeo command line tools. */
+public class Main extends CommandsCli {
+
+       public Main(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());
+
+               addCommandsCli(new PosixCommands("posix"));
+               addCommandsCli(new CmsCli("cms"));
+               addCommandsCli(new MiniDesktopCli("minidesktop"));
+//             addCommandsCli(new FsCommands("fs"));
+//             addCommandsCli(new JcrCommands("jcr"));
+       }
+
+       @Override
+       public String getDescription() {
+               return "Argeo command line utilities";
+       }
+
+       public static void main(String[] args) {
+               mainImpl(new Main("argeo"), args);
+       }
+
+}
diff --git a/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/swt/MiniDesktopCli.java b/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/swt/MiniDesktopCli.java
new file mode 100644 (file)
index 0000000..748ee8f
--- /dev/null
@@ -0,0 +1,58 @@
+package org.argeo.slc.tool.swt;
+
+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.cms.cli.CommandsCli;
+import org.argeo.cms.cli.DescribedCommand;
+import org.argeo.minidesktop.MiniDesktopManager;
+
+public class MiniDesktopCli extends CommandsCli {
+
+       public MiniDesktopCli(String commandName) {
+               super(commandName);
+               addCommand("launch", new Launch());
+       }
+
+       @Override
+       public String getDescription() {
+               return "A minimalistic desktop manager based on Java and Eclipse SWT.";
+       }
+
+       public static void main(String[] args) {
+               mainImpl(new MiniDesktopCli("minidesktop"), args);
+       }
+
+       static class Launch implements DescribedCommand<String> {
+               @Override
+               public Options getOptions() {
+                       Options options = new Options();
+                       options.addOption(Option.builder().longOpt("fullscreen")
+                                       .desc("take control of the whole screen (default is to run in a window)").build());
+                       options.addOption(Option.builder().longOpt("stacking")
+                                       .desc("open apps as tabs (default is to create new windows)").build());
+                       return options;
+               }
+
+               @Override
+               public String apply(List<String> args) {
+                       CommandLine cl = toCommandLine(args);
+                       boolean fullscreen = cl.hasOption("fullscreen");
+                       boolean stacking = cl.hasOption("stacking");
+
+                       MiniDesktopManager desktopManager = new MiniDesktopManager(fullscreen, stacking);
+                       desktopManager.init();
+                       desktopManager.run();
+                       desktopManager.dispose();
+                       return null;
+               }
+
+               @Override
+               public String getDescription() {
+                       return "Launch a minidesktop manager.";
+               }
+
+       }
+}