From 7bffd729114825a915700bad58be5bd54a3b866a Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 8 Jun 2022 13:16:34 +0200 Subject: [PATCH] Static CMS working as native image --- .../META-INF/native-image/reflect-config.json | 69 +++++++++++++++++++ .../native-image/resource-config.json | 61 +++++++++++++++- .../OSGI-INF/acrContentRepository.xml | 1 + org.argeo.cms/OSGI-INF/uuidFactory.xml | 7 ++ org.argeo.cms/bnd.bnd | 1 + org.argeo.cms/build.properties | 3 +- .../cms/acr/AbstractContentRepository.java | 22 +++--- .../cms/acr/SingleUserContentRepository.java | 5 +- .../src/org/argeo/cms/runtime/StaticCms.java | 22 ++++++ 9 files changed, 178 insertions(+), 13 deletions(-) create mode 100644 org.argeo.cms/OSGI-INF/uuidFactory.xml diff --git a/org.argeo.cms/META-INF/native-image/reflect-config.json b/org.argeo.cms/META-INF/native-image/reflect-config.json index 681b87327..5278b9ab2 100644 --- a/org.argeo.cms/META-INF/native-image/reflect-config.json +++ b/org.argeo.cms/META-INF/native-image/reflect-config.json @@ -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":"","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":"","parameterTypes":["sun.security.x509.X500Name"] }] +}, +{ + "name":"org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.xerces.impl.dv.dtd.XML11DTDDVFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.xerces.impl.dv.xs.ExtendedSchemaDVFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.xerces.impl.xs.XSMessageFormatter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.xerces.parsers.XIncludeAwareParserConfiguration", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.argeo.cms.auth.DataAdminLoginModule", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"sun.security.provider.ConfigFile$Spi", "methods":[{"name":"","parameterTypes":["javax.security.auth.login.Configuration$Parameters"] }] }, +{ + "name":"sun.security.provider.DRBG", + "methods":[{"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] +}, { "name":"sun.security.provider.SHA", "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.SHA2$SHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.util.ObjectIdentifier" +}, +{ + "name":"sun.security.x509.CertificateExtensions" } ] diff --git a/org.argeo.cms/META-INF/native-image/resource-config.json b/org.argeo.cms/META-INF/native-image/resource-config.json index b28e758e1..00d15595a 100644 --- a/org.argeo.cms/META-INF/native-image/resource-config.json +++ b/org.argeo.cms/META-INF/native-image/resource-config.json @@ -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" }, @@ -14,5 +53,25 @@ "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"] + } + ] } diff --git a/org.argeo.cms/OSGI-INF/acrContentRepository.xml b/org.argeo.cms/OSGI-INF/acrContentRepository.xml index 281005dd3..d0d31db9c 100644 --- a/org.argeo.cms/OSGI-INF/acrContentRepository.xml +++ b/org.argeo.cms/OSGI-INF/acrContentRepository.xml @@ -7,4 +7,5 @@ + diff --git a/org.argeo.cms/OSGI-INF/uuidFactory.xml b/org.argeo.cms/OSGI-INF/uuidFactory.xml new file mode 100644 index 000000000..c1ad6f8a9 --- /dev/null +++ b/org.argeo.cms/OSGI-INF/uuidFactory.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.cms/bnd.bnd b/org.argeo.cms/bnd.bnd index 2ca0f4722..0d85a873f 100644 --- a/org.argeo.cms/bnd.bnd +++ b/org.argeo.cms/bnd.bnd @@ -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,\ diff --git a/org.argeo.cms/build.properties b/org.argeo.cms/build.properties index d1480bf5d..317c9cbb8 100644 --- a/org.argeo.cms/build.properties +++ b/org.argeo.cms/build.properties @@ -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/ diff --git a/org.argeo.cms/src/org/argeo/cms/acr/AbstractContentRepository.java b/org.argeo.cms/src/org/argeo/cms/acr/AbstractContentRepository.java index 382c432b5..6ca7b3591 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/AbstractContentRepository.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/AbstractContentRepository.java @@ -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; + } + } diff --git a/org.argeo.cms/src/org/argeo/cms/acr/SingleUserContentRepository.java b/org.argeo.cms/src/org/argeo/cms/acr/SingleUserContentRepository.java index 0e3d1ad3f..09efa7274 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/SingleUserContentRepository.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/SingleUserContentRepository.java @@ -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), diff --git a/org.argeo.cms/src/org/argeo/cms/runtime/StaticCms.java b/org.argeo.cms/src/org/argeo/cms/runtime/StaticCms.java index 5df9e31dd..27b23233f 100644 --- a/org.argeo.cms/src/org/argeo/cms/runtime/StaticCms.java +++ b/org.argeo.cms/src/org/argeo/cms/runtime/StaticCms.java @@ -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 uuidFactoryC = new Component.Builder<>(uuidFactory) // + .addType(UuidFactory.class) // + .build(register); + + // Content Repository + DeployedContentRepository contentRepository = new DeployedContentRepository(); + Component 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(); } -- 2.30.2