]> git.argeo.org Git - lgpl/argeo-commons.git/blob - StaticCms.java
27b23233f3f982a3052bebfac8fa61e9fb5bdb14
[lgpl/argeo-commons.git] / StaticCms.java
1 package org.argeo.cms.runtime;
2
3 import java.nio.file.Path;
4 import java.nio.file.Paths;
5 import java.util.Dictionary;
6 import java.util.concurrent.CompletableFuture;
7
8 import org.argeo.api.acr.ContentRepository;
9 import org.argeo.api.acr.spi.ProvidedRepository;
10 import org.argeo.api.cms.CmsContext;
11 import org.argeo.api.cms.CmsDeployment;
12 import org.argeo.api.cms.CmsState;
13 import org.argeo.api.uuid.UuidFactory;
14 import org.argeo.cms.acr.CmsUuidFactory;
15 import org.argeo.cms.internal.osgi.DeployConfig;
16 import org.argeo.cms.internal.runtime.CmsContextImpl;
17 import org.argeo.cms.internal.runtime.CmsDeploymentImpl;
18 import org.argeo.cms.internal.runtime.CmsStateImpl;
19 import org.argeo.cms.internal.runtime.CmsUserAdmin;
20 import org.argeo.cms.internal.runtime.DeployedContentRepository;
21 import org.argeo.osgi.transaction.SimpleTransactionManager;
22 import org.argeo.osgi.transaction.WorkControl;
23 import org.argeo.osgi.transaction.WorkTransaction;
24 import org.argeo.util.register.Component;
25 import org.argeo.util.register.SimpleRegister;
26 import org.osgi.service.useradmin.UserAdmin;
27
28 /**
29 * A CMS assembly which is programatically defined, as an alternative to OSGi
30 * deployment. Useful for testing or AOT compilation.
31 */
32 public class StaticCms {
33 private static SimpleRegister register = new SimpleRegister();
34
35 private CompletableFuture<Void> stopped = new CompletableFuture<Void>();
36
37 public void start() {
38 // CMS State
39 CmsStateImpl cmsState = new CmsStateImpl();
40 Component<CmsStateImpl> cmsStateC = new Component.Builder<>(cmsState) //
41 .addType(CmsState.class) //
42 .addActivation(cmsState::start) //
43 .addDeactivation(cmsState::stop) //
44 .build(register);
45
46 // Deployment Configuration
47 DeployConfig deployConfig = new DeployConfig();
48 Component<DeployConfig> deployConfigC = new Component.Builder<>(deployConfig) //
49 .addType(DeployConfig.class) //
50 .addActivation(deployConfig::start) //
51 .addDeactivation(deployConfig::stop) //
52 .build(register);
53
54 // CMS Deployment
55 CmsDeploymentImpl cmsDeployment = new CmsDeploymentImpl();
56 Component<CmsDeploymentImpl> cmsDeploymentC = new Component.Builder<>(cmsDeployment) //
57 .addType(CmsDeployment.class) //
58 .addActivation(cmsDeployment::start) //
59 .addDeactivation(cmsDeployment::stop) //
60 .addDependency(cmsStateC.getType(CmsState.class), cmsDeployment::setCmsState, null) //
61 .addDependency(deployConfigC.getType(DeployConfig.class), cmsDeployment::setDeployConfig, null) //
62 .build(register);
63
64 // Transaction manager
65 SimpleTransactionManager transactionManager = new SimpleTransactionManager();
66 Component<SimpleTransactionManager> transactionManagerC = new Component.Builder<>(transactionManager) //
67 .addType(WorkControl.class) //
68 .addType(WorkTransaction.class) //
69 .build(register);
70
71 // User Admin
72 CmsUserAdmin userAdmin = new CmsUserAdmin();
73
74 Component<CmsUserAdmin> userAdminC = new Component.Builder<>(userAdmin) //
75 .addType(UserAdmin.class) //
76 .addDependency(transactionManagerC.getType(WorkControl.class), userAdmin::setTransactionManager, null) //
77 .addDependency(transactionManagerC.getType(WorkTransaction.class), userAdmin::setUserTransaction, null) //
78 .addDependency(deployConfigC.getType(DeployConfig.class), (d) -> {
79 for (Dictionary<String, Object> userDirectoryConfig : d.getUserDirectoryConfigs())
80 userAdmin.enableUserDirectory(userDirectoryConfig);
81 }, null) //
82 .build(register);
83
84 // CMS Context
85 CmsContextImpl cmsContext = new CmsContextImpl();
86 Component<CmsContextImpl> cmsContextC = new Component.Builder<>(cmsContext) //
87 .addType(CmsContext.class) //
88 .addActivation(cmsContext::start) //
89 .addDeactivation(cmsContext::stop) //
90 .addDependency(cmsStateC.getType(CmsState.class), cmsContext::setCmsState, null) //
91 .addDependency(cmsDeploymentC.getType(CmsDeployment.class), cmsContext::setCmsDeployment, null) //
92 .addDependency(userAdminC.getType(UserAdmin.class), cmsContext::setUserAdmin, null) //
93 .build(register);
94 assert cmsContextC.get() == cmsContext;
95
96 // UID factory
97 CmsUuidFactory uuidFactory = new CmsUuidFactory();
98 Component<CmsUuidFactory> uuidFactoryC = new Component.Builder<>(uuidFactory) //
99 .addType(UuidFactory.class) //
100 .build(register);
101
102 // Content Repository
103 DeployedContentRepository contentRepository = new DeployedContentRepository();
104 Component<DeployedContentRepository> contentRepositoryC = new Component.Builder<>(contentRepository) //
105 .addType(ProvidedRepository.class) //
106 .addType(ContentRepository.class) //
107 .addActivation(contentRepository::start) //
108 .addDeactivation(contentRepository::stop) //
109 .addDependency(cmsStateC.getType(CmsState.class), contentRepository::setCmsState, null) //
110 .addDependency(uuidFactoryC.getType(UuidFactory.class), contentRepository::setUuidFactory, null) //
111 .build(register);
112
113 register.activate();
114 }
115
116 public void stop() {
117 if (register.isActive()) {
118 register.deactivate();
119 }
120 register.clear();
121 stopped.complete(null);
122 }
123
124 public void waitForStop() {
125 stopped.join();
126 }
127
128 public static void main(String[] args) {
129 if (args.length == 0) {
130 System.err.println("Usage: <data path>");
131 System.exit(1);
132 }
133 Path instancePath = Paths.get(args[0]);
134 System.setProperty("osgi.instance.area", instancePath.toUri().toString());
135
136 StaticCms staticCms = new StaticCms();
137 Runtime.getRuntime().addShutdownHook(new Thread(() -> staticCms.stop(), "Static CMS Shutdown"));
138 staticCms.start();
139 staticCms.waitForStop();
140 }
141
142 }