Move RAP and RCP cli from Argeo Commons to SLC
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 1 Nov 2022 07:11:09 +0000 (08:11 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 1 Nov 2022 07:11:09 +0000 (08:11 +0100)
21 files changed:
Makefile
Makefile-rcp.mk
swt/rap/org.argeo.tool.rap.cli/.classpath [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/.project [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/META-INF/native-image/jni-config.json [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/META-INF/native-image/predefined-classes-config.json [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/META-INF/native-image/proxy-config.json [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/META-INF/native-image/reflect-config.json [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/META-INF/native-image/resource-config.json [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/META-INF/native-image/serialization-config.json [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/bnd.bnd [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/build.properties [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/src/org/argeo/tool/rap/cli/CmsRapCli.java [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/src/org/argeo/tool/rap/cli/RapJettyServer.java [new file with mode: 0644]
swt/rap/org.argeo.tool.rap.cli/src/org/argeo/tool/rap/cli/RwtRunner.java [new file with mode: 0644]
swt/rap/org.argeo.tool.server/src/org/argeo/tool/server/ArgeoServer.java
swt/rcp/org.argeo.tool.rcp.cli/.classpath [new file with mode: 0644]
swt/rcp/org.argeo.tool.rcp.cli/.project [new file with mode: 0644]
swt/rcp/org.argeo.tool.rcp.cli/bnd.bnd [new file with mode: 0644]
swt/rcp/org.argeo.tool.rcp.cli/build.properties [new file with mode: 0644]
swt/rcp/org.argeo.tool.rcp.cli/src/org/argeo/cms/swt/rcp/cli/CmsCli.java [new file with mode: 0644]

index f3c2fcd6e8c68c00c5ca64fa5c54944ee17e5095..1aea6cc2ab4c76d1e294c4baf9258cd1477f7fba 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,6 +2,7 @@ include sdk.mk
 .PHONY: clean all osgi
 
 all: osgi
+       $(MAKE) -f Makefile-rcp.mk all
 
 A2_CATEGORY = org.argeo.slc
 
@@ -13,10 +14,12 @@ org.argeo.slc.cms \
 org.argeo.slc.repo \
 org.argeo.slc.rpmfactory \
 org.argeo.slc.jcr \
+swt/rap/org.argeo.tool.rap.cli \
 swt/rap/org.argeo.tool.server \
 
 clean:
        rm -rf $(BUILD_BASE)
+       $(MAKE) -f Makefile-rcp.mk clean
 
 DEP_CATEGORIES = \
 org.argeo.tp \
@@ -32,6 +35,7 @@ org.argeo.tp.formats \
 org.argeo.tp.gis \
 org.argeo.cms \
 org.argeo.cms.jcr \
+swt/org.argeo.cms \
 swt/rap/org.argeo.cms \
 
 GRAALVM_HOME = /opt/graalvm-ce
index 77c25317b56e6e4f7f8cd7a48ce22281eb3f836e..24203cc64c33fb6f3bb5d48d8102dbc9ce06cce4 100644 (file)
@@ -6,6 +6,7 @@ all: osgi
 A2_CATEGORY = org.argeo.slc
 
 BUNDLES = \
+swt/rcp/org.argeo.tool.rcp.cli \
 swt/rcp/org.argeo.tool.desktop \
 
 clean:
diff --git a/swt/rap/org.argeo.tool.rap.cli/.classpath b/swt/rap/org.argeo.tool.rap.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/swt/rap/org.argeo.tool.rap.cli/.project b/swt/rap/org.argeo.tool.rap.cli/.project
new file mode 100644 (file)
index 0000000..ea553de
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.tool.rap.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/swt/rap/org.argeo.tool.rap.cli/META-INF/native-image/jni-config.json b/swt/rap/org.argeo.tool.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.tool.rap.cli/META-INF/native-image/predefined-classes-config.json b/swt/rap/org.argeo.tool.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.tool.rap.cli/META-INF/native-image/proxy-config.json b/swt/rap/org.argeo.tool.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.tool.rap.cli/META-INF/native-image/reflect-config.json b/swt/rap/org.argeo.tool.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.tool.rap.cli/META-INF/native-image/resource-config.json b/swt/rap/org.argeo.tool.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.tool.rap.cli/META-INF/native-image/serialization-config.json b/swt/rap/org.argeo.tool.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":[
+  ]
+}
diff --git a/swt/rap/org.argeo.tool.rap.cli/bnd.bnd b/swt/rap/org.argeo.tool.rap.cli/bnd.bnd
new file mode 100644 (file)
index 0000000..4dce79b
--- /dev/null
@@ -0,0 +1,8 @@
+Import-Package: \
+org.eclipse.jetty.util.component;version="[9.4,12)";resolution:=optional,\
+org.eclipse.jetty.http;version="[9.4,12)";resolution:=optional,\
+org.eclipse.jetty.io;version="[9.4,12)";resolution:=optional,\
+org.eclipse.jetty.security;version="[9.4,12)";resolution:=optional,\
+org.eclipse.jetty.server.handler;version="[9.4,12)";resolution:=optional,\
+org.eclipse.jetty.*;version="[9.4,12)";resolution:=optional,\
+*
\ No newline at end of file
diff --git a/swt/rap/org.argeo.tool.rap.cli/build.properties b/swt/rap/org.argeo.tool.rap.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/swt/rap/org.argeo.tool.rap.cli/src/org/argeo/tool/rap/cli/CmsRapCli.java b/swt/rap/org.argeo.tool.rap.cli/src/org/argeo/tool/rap/cli/CmsRapCli.java
new file mode 100644 (file)
index 0000000..a1ddbd0
--- /dev/null
@@ -0,0 +1,128 @@
+package org.argeo.tool.rap.cli;
+
+import java.io.IOException;
+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.acr.spi.ProvidedRepository;
+import org.argeo.api.cli.CommandsCli;
+import org.argeo.api.cli.DescribedCommand;
+import org.argeo.api.cms.CmsApp;
+import org.argeo.api.cms.CmsContext;
+import org.argeo.api.cms.CmsState;
+import org.argeo.cms.jetty.CmsJettyServer;
+import org.argeo.cms.runtime.StaticCms;
+import org.argeo.cms.swt.app.CmsUserApp;
+import org.argeo.cms.web.CmsWebApp;
+import org.argeo.util.register.Component;
+import org.argeo.util.register.ComponentRegister;
+import org.eclipse.rap.rwt.application.ApplicationConfiguration;
+
+public class CmsRapCli extends CommandsCli {
+
+       public CmsRapCli(String commandName) {
+               super(commandName);
+               addCommand("user", new Launch());
+       }
+
+       @Override
+       public String getDescription() {
+               return "Argeo CMS utilities.";
+       }
+
+       public static void main(String[] args) {
+               mainImpl(new CmsRapCli("web"), args);
+       }
+
+       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 dataPath = cl.getOptionValue(dataOption);
+                       boolean ui = cl.hasOption(uiOption);
+
+                       Path instancePath = Paths.get(dataPath);
+                       System.setProperty("osgi.instance.area", instancePath.toUri().toString());
+                       System.setProperty("argeo.http.port", "0");
+
+                       StaticCms staticCms = new StaticCms() {
+                               @Override
+                               protected void addComponents(ComponentRegister register) {
+                                       if (ui) {
+                                               CmsUserApp cmsApp = new CmsUserApp();
+                                               Component<CmsUserApp> cmsAppC = new Component.Builder<>(cmsApp) //
+                                                               .addType(CmsApp.class) //
+                                                               .addType(CmsUserApp.class) //
+                                                               .addDependency(register.getSingleton(CmsContext.class), cmsApp::setCmsContext, null) //
+                                                               .addDependency(register.getSingleton(ProvidedRepository.class),
+                                                                               cmsApp::setContentRepository, null) //
+                                                               .build(register);
+
+                                               CmsWebApp cmsWebApp = new CmsWebApp();
+                                               Component<CmsWebApp> cmsWebAppC = new Component.Builder<>(cmsWebApp) //
+                                                               .addType(ApplicationConfiguration.class) //
+                                                               .addType(CmsWebApp.class) //
+                                                               .addDependency(cmsAppC.getType(CmsApp.class), cmsWebApp::setCmsApp, null) //
+                                                               .build(register);
+
+                                               RapJettyServer rwtRunner = new RapJettyServer();
+                                               Component<RapJettyServer> rwtRunnerC = new Component.Builder<>(rwtRunner) //
+                                                               .addActivation(rwtRunner::start) //
+                                                               .addDeactivation(rwtRunner::stop) //
+                                                               .addType(CmsJettyServer.class) //
+                                                               .addDependency(register.getSingleton(CmsState.class), rwtRunner::setCmsState, null) //
+                                                               .addDependency(cmsWebAppC.getType(CmsWebApp.class), rwtRunner::setCmsWebApp, null) //
+                                                               .build(register);
+                                       }
+                               }
+
+                       };
+                       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.");
+
+                       if (ui) {
+                               try {
+                                       // open browser in app mode
+                                       Thread.sleep(2000);// wait for RWT to be ready
+                                       String browserCommand = "google-chrome --app=http://localhost:"
+                                                       + staticCms.getComponentRegister().getObject(CmsJettyServer.class).getHttpPort() + "/data";
+                                       Runtime.getRuntime().exec(browserCommand);
+                               } catch (InterruptedException | IOException e) {
+                                       e.printStackTrace();
+                               }
+                       }
+
+                       staticCms.waitForStop();
+
+                       return null;
+               }
+
+               @Override
+               public String getDescription() {
+                       return "Launch a static CMS.";
+               }
+
+       }
+}
diff --git a/swt/rap/org.argeo.tool.rap.cli/src/org/argeo/tool/rap/cli/RapJettyServer.java b/swt/rap/org.argeo.tool.rap.cli/src/org/argeo/tool/rap/cli/RapJettyServer.java
new file mode 100644 (file)
index 0000000..6007fea
--- /dev/null
@@ -0,0 +1,59 @@
+package org.argeo.tool.rap.cli;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletException;
+
+import org.argeo.cms.jetty.CmsJettyServer;
+import org.argeo.cms.web.CmsWebApp;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.rap.rwt.application.ApplicationRunner;
+import org.eclipse.rap.rwt.engine.RWTServlet;
+
+public class RapJettyServer extends CmsJettyServer {
+       private CmsWebApp cmsWebApp;
+
+       @Override
+       protected void addServlets(ServletContextHandler servletContextHandler) throws ServletException {
+               // rwt-resources requires a file system
+               try {
+                       Path tempDir = Files.createTempDirectory("argeo-rwtRunner");
+                       servletContextHandler.setBaseResource(Resource.newResource(tempDir.resolve("www").toString()));
+               } catch (IOException e) {
+                       throw new IllegalStateException("Cannot create temporary directory", e);
+               }
+               servletContextHandler.addEventListener(new ServletContextListener() {
+                       ApplicationRunner applicationRunner;
+
+                       @Override
+                       public void contextInitialized(ServletContextEvent sce) {
+                               applicationRunner = new ApplicationRunner(cmsWebApp, sce.getServletContext());
+                               applicationRunner.start();
+                       }
+
+                       @Override
+                       public void contextDestroyed(ServletContextEvent sce) {
+                               applicationRunner.stop();
+                       }
+               });
+               for (String uiName : cmsWebApp.getCmsApp().getUiNames())
+                       servletContextHandler.addServlet(new ServletHolder(new RWTServlet()), "/" + uiName);
+
+               // Required to serve rwt-resources. It is important that this is last.
+               ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class);
+               servletContextHandler.addServlet(holderPwd, "/");
+
+       }
+
+       public void setCmsWebApp(CmsWebApp cmsWebApp) {
+               this.cmsWebApp = cmsWebApp;
+       }
+
+}
diff --git a/swt/rap/org.argeo.tool.rap.cli/src/org/argeo/tool/rap/cli/RwtRunner.java b/swt/rap/org.argeo.tool.rap.cli/src/org/argeo/tool/rap/cli/RwtRunner.java
new file mode 100644 (file)
index 0000000..0974a77
--- /dev/null
@@ -0,0 +1,146 @@
+package org.argeo.tool.rap.cli;
+
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Objects;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import org.argeo.minidesktop.MiniDesktopManager;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.eclipse.rap.rwt.application.ApplicationConfiguration;
+import org.eclipse.rap.rwt.application.ApplicationRunner;
+import org.eclipse.rap.rwt.application.EntryPoint;
+import org.eclipse.rap.rwt.application.Application.OperationMode;
+import org.eclipse.rap.rwt.engine.RWTServlet;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/** A minimal RWT runner based on embedded Jetty. */
+public class RwtRunner {
+
+       private final Server server;
+       private final ServerConnector serverConnector;
+       private Path tempDir;
+
+       private ApplicationConfiguration applicationConfiguration;
+
+       public RwtRunner() {
+               server = new Server(new QueuedThreadPool(10, 1));
+               serverConnector = new ServerConnector(server);
+               serverConnector.setPort(0);
+               server.setConnectors(new Connector[] { serverConnector });
+       }
+
+       protected Control createUi(Composite parent, Object context) {
+               return new Label(parent, 0);
+       }
+
+       public void init() {
+               Objects.requireNonNull(applicationConfiguration);
+
+               ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+               context.setContextPath("/");
+               server.setHandler(context);
+
+               String entryPoint = "app";
+
+               // rwt-resources requires a file system
+               try {
+                       tempDir = Files.createTempDirectory("argeo-rwtRunner");
+                       context.setBaseResource(Resource.newResource(tempDir.resolve("www").toString()));
+               } catch (IOException e) {
+                       throw new IllegalStateException("Cannot create temporary directory", e);
+               }
+               context.addEventListener(new ServletContextListener() {
+                       ApplicationRunner applicationRunner;
+
+                       @Override
+                       public void contextInitialized(ServletContextEvent sce) {
+                               applicationRunner = new ApplicationRunner(applicationConfiguration, sce.getServletContext());
+                               applicationRunner.start();
+                       }
+
+                       @Override
+                       public void contextDestroyed(ServletContextEvent sce) {
+                               applicationRunner.stop();
+                       }
+               });
+
+               context.addServlet(new ServletHolder(new RWTServlet()), "/" + entryPoint);
+
+               // Required to serve rwt-resources. It is important that this is last.
+               ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class);
+               context.addServlet(holderPwd, "/");
+
+               try {
+                       server.start();
+               } catch (Exception e) {
+                       throw new IllegalStateException("Cannot start Jetty server", e);
+               }
+               Runtime.getRuntime().addShutdownHook(new Thread(() -> destroy(), "Jetty shutdown"));
+
+               long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
+               System.out.println("RWT App available in " + jvmUptime + " ms, on port " + getEffectivePort());
+       }
+
+       public void destroy() {
+               try {
+                       serverConnector.close();
+                       server.stop();
+                       // TODO delete temp dir
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+       }
+
+       public Integer getEffectivePort() {
+               return serverConnector.getLocalPort();
+       }
+
+       public void waitFor() throws InterruptedException {
+               server.join();
+       }
+
+       public void setApplicationConfiguration(ApplicationConfiguration applicationConfiguration) {
+               this.applicationConfiguration = applicationConfiguration;
+       }
+
+       public static void main(String[] args) throws Exception {
+               RwtRunner rwtRunner = new RwtRunner();
+
+               String entryPoint = "app";
+               ApplicationConfiguration applicationConfiguration = (application) -> {
+                       application.setOperationMode(OperationMode.SWT_COMPATIBILITY);
+                       application.addEntryPoint("/" + entryPoint, () -> new EntryPoint() {
+                               @Override
+                               public int createUI() {
+                                       MiniDesktopManager miniDesktopManager = new MiniDesktopManager(false, false);
+                                       miniDesktopManager.init();
+                                       miniDesktopManager.run();
+                                       return 0;
+                               }
+                       }, null);
+               };
+
+               rwtRunner.setApplicationConfiguration(applicationConfiguration);
+               rwtRunner.init();
+
+               // open browser in app mode
+               Thread.sleep(2000);// wait for RWT to be ready
+               Runtime.getRuntime().exec("google-chrome --app=http://localhost:" + rwtRunner.getEffectivePort() + "/app");
+
+               rwtRunner.waitFor();
+       }
+}
index 53df03a0e695302064aa17999b746f90e115ba9f..4779d0501fbcae6a9fc8efe2ace35b8c095ab329 100644 (file)
@@ -1,7 +1,7 @@
 package org.argeo.tool.server;
 
 import org.argeo.cms.cli.ArgeoCli;
-import org.argeo.cms.swt.rap.cli.CmsRapCli;
+import org.argeo.tool.rap.cli.CmsRapCli;
 
 /** Argeo command line tools. */
 public class ArgeoServer extends ArgeoCli {
diff --git a/swt/rcp/org.argeo.tool.rcp.cli/.classpath b/swt/rcp/org.argeo.tool.rcp.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/swt/rcp/org.argeo.tool.rcp.cli/.project b/swt/rcp/org.argeo.tool.rcp.cli/.project
new file mode 100644 (file)
index 0000000..c0c5b6a
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.tool.rcp.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/swt/rcp/org.argeo.tool.rcp.cli/bnd.bnd b/swt/rcp/org.argeo.tool.rcp.cli/bnd.bnd
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/swt/rcp/org.argeo.tool.rcp.cli/build.properties b/swt/rcp/org.argeo.tool.rcp.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/swt/rcp/org.argeo.tool.rcp.cli/src/org/argeo/cms/swt/rcp/cli/CmsCli.java b/swt/rcp/org.argeo.tool.rcp.cli/src/org/argeo/cms/swt/rcp/cli/CmsCli.java
new file mode 100644 (file)
index 0000000..3fe2935
--- /dev/null
@@ -0,0 +1,110 @@
+package org.argeo.cms.swt.rcp.cli;
+
+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.cli.CommandsCli;
+import org.argeo.api.cli.DescribedCommand;
+import org.argeo.api.cms.CmsApp;
+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.ComponentRegister;
+
+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 dataPath = cl.getOptionValue(dataOption);
+                       boolean ui = cl.hasOption(uiOption);
+
+                       Path instancePath = Paths.get(dataPath);
+                       System.setProperty("osgi.instance.area", instancePath.toUri().toString());
+
+                       StaticCms staticCms = new StaticCms() {
+                               @Override
+                               protected void addComponents(ComponentRegister 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(ComponentRegister register) {
+                                       if (ui) {
+                                               Component<? extends CmsUserApp> cmsAppC = register.find(CmsUserApp.class, null).first();
+                                               CmsRcpDisplayFactory.openCmsApp(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.";
+               }
+
+       }
+}