]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/runtime/StaticCms.java
d1a19bd63a1af6d395d53e6312b8048270b91361
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / runtime / 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.concurrent.CompletableFuture;
6
7 import org.argeo.api.acr.ContentRepository;
8 import org.argeo.api.acr.spi.ProvidedRepository;
9 import org.argeo.api.cms.CmsContext;
10 import org.argeo.api.cms.CmsDeployment;
11 import org.argeo.api.cms.CmsState;
12 import org.argeo.api.uuid.UuidFactory;
13 import org.argeo.cms.CmsUserManager;
14 import org.argeo.cms.acr.CmsUuidFactory;
15 import org.argeo.cms.internal.auth.CmsUserManagerImpl;
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.util.register.Component;
22 import org.argeo.util.register.ComponentRegister;
23 import org.argeo.util.register.SimpleRegister;
24 import org.argeo.util.transaction.SimpleTransactionManager;
25 import org.argeo.util.transaction.WorkControl;
26 import org.argeo.util.transaction.WorkTransaction;
27 import org.osgi.service.useradmin.UserAdmin;
28
29 /**
30 * A CMS assembly which is programmatically defined, as an alternative to OSGi
31 * deployment. Useful for testing or AOT compilation.
32 */
33 public class StaticCms {
34 private static SimpleRegister register = new SimpleRegister();
35
36 private CompletableFuture<Void> stopped = new CompletableFuture<Void>();
37
38 public void start() {
39 // UID factory
40 CmsUuidFactory uuidFactory = new CmsUuidFactory();
41 Component<CmsUuidFactory> uuidFactoryC = new Component.Builder<>(uuidFactory) //
42 .addType(UuidFactory.class) //
43 .build(register);
44
45 // CMS State
46 CmsStateImpl cmsState = new CmsStateImpl();
47 Component<CmsStateImpl> cmsStateC = new Component.Builder<>(cmsState) //
48 .addType(CmsState.class) //
49 .addActivation(cmsState::start) //
50 .addDeactivation(cmsState::stop) //
51 .addDependency(uuidFactoryC.getType(UuidFactory.class), cmsState::setUuidFactory, null) //
52 .build(register);
53
54 // Deployment Configuration
55 // DeployConfig deployConfig = new DeployConfig();
56 // Component<DeployConfig> deployConfigC = new Component.Builder<>(deployConfig) //
57 // .addType(DeployConfig.class) //
58 // .addActivation(deployConfig::start) //
59 // .addDeactivation(deployConfig::stop) //
60 // .build(register);
61
62 // Transaction manager
63 SimpleTransactionManager transactionManager = new SimpleTransactionManager();
64 Component<SimpleTransactionManager> transactionManagerC = new Component.Builder<>(transactionManager) //
65 .addType(WorkControl.class) //
66 .addType(WorkTransaction.class) //
67 .build(register);
68
69 // User Admin
70 CmsUserAdmin userAdmin = new CmsUserAdmin();
71 Component<CmsUserAdmin> userAdminC = new Component.Builder<>(userAdmin) //
72 .addType(UserAdmin.class) //
73 .addActivation(userAdmin::start) //
74 .addDeactivation(userAdmin::stop) //
75 .addDependency(cmsStateC.getType(CmsState.class), userAdmin::setCmsState, null) //
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 // User manager
85 CmsUserManagerImpl userManager = new CmsUserManagerImpl();
86 // for (UserDirectory userDirectory : userAdmin.getUserDirectories()) {
87 // // FIXME deal with properties
88 // userManager.addUserDirectory(userDirectory, new HashMap<>());
89 // }
90 Component<CmsUserManagerImpl> userManagerC = new Component.Builder<>(userManager) //
91 .addType(CmsUserManager.class) //
92 .addActivation(userManager::start) //
93 .addDeactivation(userManager::stop) //
94 .addDependency(userAdminC.getType(UserAdmin.class), userManager::setUserAdmin, null) //
95 .addDependency(transactionManagerC.getType(WorkTransaction.class), userManager::setUserTransaction,
96 null) //
97 .build(register);
98
99 // Content Repository
100 DeployedContentRepository contentRepository = new DeployedContentRepository();
101 Component<DeployedContentRepository> contentRepositoryC = new Component.Builder<>(contentRepository) //
102 .addType(ProvidedRepository.class) //
103 .addType(ContentRepository.class) //
104 .addActivation(contentRepository::start) //
105 .addDeactivation(contentRepository::stop) //
106 .addDependency(cmsStateC.getType(CmsState.class), contentRepository::setCmsState, null) //
107 .addDependency(uuidFactoryC.getType(UuidFactory.class), contentRepository::setUuidFactory, null) //
108 .addDependency(userManagerC.getType(CmsUserManager.class), contentRepository::setUserManager, null) //
109 .build(register);
110
111 // CMS Deployment
112 CmsDeploymentImpl cmsDeployment = new CmsDeploymentImpl();
113 Component<CmsDeploymentImpl> cmsDeploymentC = new Component.Builder<>(cmsDeployment) //
114 .addType(CmsDeployment.class) //
115 .addActivation(cmsDeployment::start) //
116 .addDeactivation(cmsDeployment::stop) //
117 .addDependency(cmsStateC.getType(CmsState.class), cmsDeployment::setCmsState, null) //
118 // .addDependency(deployConfigC.getType(DeployConfig.class), cmsDeployment::setDeployConfig, null) //
119 .build(register);
120
121 // CMS Context
122 CmsContextImpl cmsContext = new CmsContextImpl();
123 Component<CmsContextImpl> cmsContextC = new Component.Builder<>(cmsContext) //
124 .addType(CmsContext.class) //
125 .addActivation(cmsContext::start) //
126 .addDeactivation(cmsContext::stop) //
127 .addDependency(cmsStateC.getType(CmsState.class), cmsContext::setCmsState, null) //
128 .addDependency(cmsDeploymentC.getType(CmsDeployment.class), cmsContext::setCmsDeployment, null) //
129 .addDependency(userAdminC.getType(UserAdmin.class), cmsContext::setUserAdmin, null) //
130 .addDependency(uuidFactoryC.getType(UuidFactory.class), cmsContext::setUuidFactory, null) //
131 // .addDependency(contentRepositoryC.getType(ProvidedRepository.class), cmsContext::setContentRepository,
132 // null) //
133 .build(register);
134 assert cmsContextC.get() == cmsContext;
135
136 addComponents(register);
137
138 register.activate();
139
140 postActivation(register);
141 }
142
143 protected void addComponents(ComponentRegister register) {
144
145 }
146
147 protected void postActivation(ComponentRegister register) {
148
149 }
150
151 public ComponentRegister getComponentRegister() {
152 return register;
153 }
154
155 public void stop() {
156 if (register.isActive()) {
157 register.deactivate();
158 }
159 register.clear();
160 stopped.complete(null);
161 }
162
163 public void waitForStop() {
164 stopped.join();
165 }
166
167 public static void main(String[] args) {
168 if (args.length == 0) {
169 System.err.println("Usage: <data path>");
170 System.exit(1);
171 }
172 Path instancePath = Paths.get(args[0]);
173 System.setProperty("osgi.instance.area", instancePath.toUri().toString());
174
175 StaticCms staticCms = new StaticCms();
176 Runtime.getRuntime().addShutdownHook(new Thread(() -> staticCms.stop(), "Static CMS Shutdown"));
177 staticCms.start();
178 staticCms.waitForStop();
179 }
180
181 }