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