Static CMS working as native image
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 8 Jun 2022 11:16:34 +0000 (13:16 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 8 Jun 2022 11:16:34 +0000 (13:16 +0200)
org.argeo.cms/META-INF/native-image/reflect-config.json
org.argeo.cms/META-INF/native-image/resource-config.json
org.argeo.cms/OSGI-INF/acrContentRepository.xml
org.argeo.cms/OSGI-INF/uuidFactory.xml [new file with mode: 0644]
org.argeo.cms/bnd.bnd
org.argeo.cms/build.properties
org.argeo.cms/src/org/argeo/cms/acr/AbstractContentRepository.java
org.argeo.cms/src/org/argeo/cms/acr/SingleUserContentRepository.java
org.argeo.cms/src/org/argeo/cms/runtime/StaticCms.java

index 681b87327673aa1c99bffac40b19313d05fb021e..5278b9ab2f5fef8e69e51c1d0cd75413315b9521 100644 (file)
@@ -1,13 +1,82 @@
 [
+{
+  "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":"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.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"
 }
 ]
index b28e758e1f94f979bf2d19eb845ba0cc30f8bd86..00d15595a961454693bf729d01b66f6ba7a2844f 100644 (file)
@@ -1,6 +1,45 @@
 {
   "resources":{
   "includes":[
+    {
+      "pattern":"\\QMETA-INF/services/javax.xml.validation.SchemaFactory\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/DSMLv2.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/SVG.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/XForms-11-Schema.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/XMLSchema.dtd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/XMLSchema.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/cr.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/datatypes.dtd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/docbook.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/schema-for-xslt20.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/xlink.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/xml-events-attribs-1.xsd\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/argeo/cms/acr/schemas/xml.xsd\\E"
+    }, 
     {
       "pattern":"\\Qorg/argeo/cms/internal/runtime/dc=example,dc=com.ldif\\E"
     }, 
       "pattern":"\\Qorg/argeo/cms/internal/runtime/ou=tokens,ou=node.ldif\\E"
     }
   ]},
-  "bundles":[]
+  "bundles":[
+    {
+      "name":"org.apache.xerces.impl.msg.XMLSchemaMessages",
+      "locales":[
+        "en", 
+        "und"
+      ]
+    }, 
+    {
+      "name":"org.apache.xerces.impl.xpath.regex.message",
+      "locales":[
+        "", 
+        "en", 
+        "und"
+      ]
+    }, 
+    {
+      "name":"sun.security.util.Resources",
+      "classNames":["sun.security.util.Resources"]
+    }
+  ]
 }
index 281005dd3233c8a2c7ebcfc164b7cf7add063521..d0d31db9ce4f69d27f313a470362ec2c28388142 100644 (file)
@@ -7,4 +7,5 @@
       <provide interface="org.argeo.api.acr.spi.ProvidedRepository"/>
    </service>
    <reference bind="setCmsState" cardinality="1..1" interface="org.argeo.api.cms.CmsState" name="CmsState" policy="static"/>
+   <reference bind="setUuidFactory" cardinality="1..1" interface="org.argeo.api.uuid.UuidFactory" name="UuidFactory" policy="static"/>
 </scr:component>
diff --git a/org.argeo.cms/OSGI-INF/uuidFactory.xml b/org.argeo.cms/OSGI-INF/uuidFactory.xml
new file mode 100644 (file)
index 0000000..c1ad6f8
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="UUID Factory">
+   <implementation class="org.argeo.cms.acr.CmsUuidFactory"/>
+   <service>
+      <provide interface="org.argeo.api.uuid.UuidFactory"/>
+   </service>
+</scr:component>
index 2ca0f4722c294e7e579545891e7c93221a1c4fc8..0d85a873ffe060b87883478968646ccc3d9743aa 100644 (file)
@@ -14,6 +14,7 @@ OSGI-INF/simpleTransactionManager.xml,\
 OSGI-INF/nodeUserAdmin.xml,\
 OSGI-INF/cmsUserManager.xml,\
 OSGI-INF/deployConfig.xml,\
+OSGI-INF/uuidFactory.xml,\
 OSGI-INF/acrContentRepository.xml,\
 OSGI-INF/cmsDeployment.xml,\
 OSGI-INF/cmsContext.xml,\
index d1480bf5dd14078736cd4bd96ba1ac76fabfc520..317c9cbb87f7bc98a77f26db34707d2b8fadb68b 100644 (file)
@@ -9,5 +9,6 @@ bin.includes = META-INF/,\
                OSGI-INF/deployConfig.xml,\
                OSGI-INF/cmsDeployment.xml,\
                OSGI-INF/cmsContext.xml,\
-               OSGI-INF/acrContentRepository.xml
+               OSGI-INF/acrContentRepository.xml,\
+               OSGI-INF/uuidFactory.xml
 source.. = src/
index 382c432b564f4fe1c46bd17fa49ed3166c756f31..6ca7b3591a8cae1d27f42755833dded275687ba3 100644 (file)
@@ -22,6 +22,7 @@ import org.argeo.api.acr.spi.ContentProvider;
 import org.argeo.api.acr.spi.ProvidedContent;
 import org.argeo.api.acr.spi.ProvidedRepository;
 import org.argeo.api.cms.CmsLog;
+import org.argeo.api.uuid.UuidFactory;
 import org.argeo.cms.acr.xml.DomContentProvider;
 import org.argeo.cms.acr.xml.DomUtils;
 import org.w3c.dom.DOMException;
@@ -35,8 +36,10 @@ import org.xml.sax.SAXException;
 public abstract class AbstractContentRepository implements ProvidedRepository {
        private final static CmsLog log = CmsLog.getLog(AbstractContentRepository.class);
 
-       private final MountManager mountManager;
-       private final TypesManager typesManager;
+       private UuidFactory uuidFactory;
+
+       private MountManager mountManager;
+       private TypesManager typesManager;
 
        private CmsContentSession systemSession;
 
@@ -56,20 +59,19 @@ public abstract class AbstractContentRepository implements ProvidedRepository {
                                log.trace(type + " - " + typesManager.getAttributeTypes(type));
                        }
 
-               systemSession = newSystemSession();
-
-               // mounts
-               mountManager = new MountManager(systemSession);
-
        }
 
        protected abstract CmsContentSession newSystemSession();
 
        public void start() {
+               systemSession = newSystemSession();
+               // mounts
+               mountManager = new MountManager(systemSession);
        }
 
        public void stop() {
-
+               systemSession.close();
+               systemSession = null;
        }
 
        /*
@@ -198,4 +200,8 @@ public abstract class AbstractContentRepository implements ProvidedRepository {
                return typesManager;
        }
 
+       public void setUuidFactory(UuidFactory uuidFactory) {
+               this.uuidFactory = uuidFactory;
+       }
+
 }
index 0e3d1ad3fbf701b87b82f760548e2057de0342d4..09efa72740c2118f0d6251301badcf316e577407 100644 (file)
@@ -26,8 +26,6 @@ public class SingleUserContentRepository extends AbstractContentRepository {
 
        public SingleUserContentRepository(Subject subject) {
                this(subject, Locale.getDefault());
-
-               initRootContentProvider(null);
        }
 
        public SingleUserContentRepository(Subject subject, Locale locale) {
@@ -44,6 +42,7 @@ public class SingleUserContentRepository extends AbstractContentRepository {
                Objects.requireNonNull(locale);
 
                super.start();
+               initRootContentProvider(null);
                if (contentSession != null)
                        throw new IllegalStateException("Repository is already started, stop it first.");
                contentSession = new CmsContentSession(this, subject, locale);
@@ -82,10 +81,10 @@ public class SingleUserContentRepository extends AbstractContentRepository {
                subject.getPrincipals().add(principal);
 
                SingleUserContentRepository contentRepository = new SingleUserContentRepository(subject);
+               contentRepository.start();
                FsContentProvider homeContentProvider = new FsContentProvider("/home", homePath);
                contentRepository.addProvider(homeContentProvider);
                Runtime.getRuntime().addShutdownHook(new Thread(() -> contentRepository.stop(), "Shutdown content repository"));
-               contentRepository.start();
 
                ContentSession contentSession = contentRepository.get();
                ContentUtils.traverse(contentSession.get("/"), (c, depth) -> ContentUtils.print(c, System.out, depth, false),
index 5df9e31dd9297a785217f6cf226773f258abb1a3..27b23233f3f982a3052bebfac8fa61e9fb5bdb14 100644 (file)
@@ -5,14 +5,19 @@ import java.nio.file.Paths;
 import java.util.Dictionary;
 import java.util.concurrent.CompletableFuture;
 
+import org.argeo.api.acr.ContentRepository;
+import org.argeo.api.acr.spi.ProvidedRepository;
 import org.argeo.api.cms.CmsContext;
 import org.argeo.api.cms.CmsDeployment;
 import org.argeo.api.cms.CmsState;
+import org.argeo.api.uuid.UuidFactory;
+import org.argeo.cms.acr.CmsUuidFactory;
 import org.argeo.cms.internal.osgi.DeployConfig;
 import org.argeo.cms.internal.runtime.CmsContextImpl;
 import org.argeo.cms.internal.runtime.CmsDeploymentImpl;
 import org.argeo.cms.internal.runtime.CmsStateImpl;
 import org.argeo.cms.internal.runtime.CmsUserAdmin;
+import org.argeo.cms.internal.runtime.DeployedContentRepository;
 import org.argeo.osgi.transaction.SimpleTransactionManager;
 import org.argeo.osgi.transaction.WorkControl;
 import org.argeo.osgi.transaction.WorkTransaction;
@@ -88,6 +93,23 @@ public class StaticCms {
                                .build(register);
                assert cmsContextC.get() == cmsContext;
 
+               // UID factory
+               CmsUuidFactory uuidFactory = new CmsUuidFactory();
+               Component<CmsUuidFactory> uuidFactoryC = new Component.Builder<>(uuidFactory) //
+                               .addType(UuidFactory.class) //
+                               .build(register);
+
+               // Content Repository
+               DeployedContentRepository contentRepository = new DeployedContentRepository();
+               Component<DeployedContentRepository> contentRepositoryC = new Component.Builder<>(contentRepository) //
+                               .addType(ProvidedRepository.class) //
+                               .addType(ContentRepository.class) //
+                               .addActivation(contentRepository::start) //
+                               .addDeactivation(contentRepository::stop) //
+                               .addDependency(cmsStateC.getType(CmsState.class), contentRepository::setCmsState, null) //
+                               .addDependency(uuidFactoryC.getType(UuidFactory.class), contentRepository::setUuidFactory, null) //
+                               .build(register);
+
                register.activate();
        }