]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/runtime/StaticCms.java
Improve ACR.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / runtime / StaticCms.java
index 5ffff1d0e3a1757d2e6a36b5b28fe4aa8baedad4..e4087e13903ee00f707ea5ec159f9f5335c86b37 100644 (file)
@@ -1,21 +1,28 @@
 package org.argeo.cms.runtime;
 
+import java.nio.file.Path;
+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;
 import org.argeo.util.register.Component;
-import org.argeo.util.register.ComponentRegister;
-import org.argeo.util.register.StaticRegister;
+import org.argeo.util.register.SimpleRegister;
 import org.osgi.service.useradmin.UserAdmin;
 
 /**
@@ -23,9 +30,16 @@ import org.osgi.service.useradmin.UserAdmin;
  * deployment. Useful for testing or AOT compilation.
  */
 public class StaticCms {
+       private static SimpleRegister register = new SimpleRegister();
+
+       private CompletableFuture<Void> stopped = new CompletableFuture<Void>();
 
        public void start() {
-               ComponentRegister register = StaticRegister.getInstance();
+               // UID factory
+               CmsUuidFactory uuidFactory = new CmsUuidFactory();
+               Component<CmsUuidFactory> uuidFactoryC = new Component.Builder<>(uuidFactory) //
+                               .addType(UuidFactory.class) //
+                               .build(register);
 
                // CMS State
                CmsStateImpl cmsState = new CmsStateImpl();
@@ -33,6 +47,7 @@ public class StaticCms {
                                .addType(CmsState.class) //
                                .addActivation(cmsState::start) //
                                .addDeactivation(cmsState::stop) //
+                               .addDependency(uuidFactoryC.getType(UuidFactory.class), cmsState::setUuidFactory, null) //
                                .build(register);
 
                // Deployment Configuration
@@ -73,6 +88,17 @@ public class StaticCms {
                                }, null) //
                                .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);
+
                // CMS Context
                CmsContextImpl cmsContext = new CmsContextImpl();
                Component<CmsContextImpl> cmsContextC = new Component.Builder<>(cmsContext) //
@@ -82,22 +108,39 @@ public class StaticCms {
                                .addDependency(cmsStateC.getType(CmsState.class), cmsContext::setCmsState, null) //
                                .addDependency(cmsDeploymentC.getType(CmsDeployment.class), cmsContext::setCmsDeployment, null) //
                                .addDependency(userAdminC.getType(UserAdmin.class), cmsContext::setUserAdmin, null) //
+                               .addDependency(uuidFactoryC.getType(UuidFactory.class), cmsContext::setUuidFactory, null) //
+                               .addDependency(contentRepositoryC.getType(ProvidedRepository.class), cmsContext::setContentRepository,
+                                               null) //
                                .build(register);
-               assert cmsContextC.getInstance() == cmsContext;
+               assert cmsContextC.get() == cmsContext;
 
                register.activate();
        }
 
        public void stop() {
-               if (StaticRegister.getInstance().isActive())
-                       StaticRegister.getInstance().deactivate();
+               if (register.isActive()) {
+                       register.deactivate();
+               }
+               register.clear();
+               stopped.complete(null);
+       }
+
+       public void waitForStop() {
+               stopped.join();
        }
 
        public static void main(String[] args) {
+               if (args.length == 0) {
+                       System.err.println("Usage: <data path>");
+                       System.exit(1);
+               }
+               Path instancePath = Paths.get(args[0]);
+               System.setProperty("osgi.instance.area", instancePath.toUri().toString());
+
                StaticCms staticCms = new StaticCms();
                Runtime.getRuntime().addShutdownHook(new Thread(() -> staticCms.stop(), "Static CMS Shutdown"));
                staticCms.start();
-
+               staticCms.waitForStop();
        }
 
 }