]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java
Working FreeMarker/JCR integration
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / Activator.java
1 package org.argeo.cms.internal.kernel;
2
3 import java.io.IOException;
4 import java.net.URL;
5 import java.nio.file.Files;
6 import java.nio.file.Path;
7 import java.util.Dictionary;
8 import java.util.List;
9 import java.util.Locale;
10
11 import javax.security.auth.login.Configuration;
12
13 import org.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15 import org.argeo.cms.CmsException;
16 import org.argeo.node.ArgeoLogger;
17 import org.argeo.node.NodeConstants;
18 import org.argeo.node.NodeDeployment;
19 import org.argeo.node.NodeInstance;
20 import org.argeo.node.NodeState;
21 import org.argeo.util.LangUtils;
22 import org.ietf.jgss.GSSCredential;
23 import org.osgi.framework.BundleActivator;
24 import org.osgi.framework.BundleContext;
25 import org.osgi.framework.Constants;
26 import org.osgi.framework.ServiceReference;
27 import org.osgi.service.log.LogReaderService;
28 import org.osgi.service.useradmin.UserAdmin;
29 import org.osgi.util.tracker.ServiceTracker;
30
31 /**
32 * Activates the kernel. Gives access to kernel information for the rest of the
33 * bundle (and only it)
34 */
35 public class Activator implements BundleActivator {
36 private final static Log log = LogFactory.getLog(Activator.class);
37
38 private static Activator instance;
39
40 private BundleContext bc;
41
42 private LogReaderService logReaderService;
43
44 private NodeLogger logger;
45 private CmsState nodeState;
46 private CmsDeployment nodeDeployment;
47 private CmsInstance nodeInstance;
48
49 private ServiceTracker<UserAdmin, NodeUserAdmin> userAdminSt;
50
51 @Override
52 public void start(BundleContext bundleContext) throws Exception {
53 Runtime.getRuntime().addShutdownHook(new CmsShutdown());
54 instance = this;
55 this.bc = bundleContext;
56 this.logReaderService = getService(LogReaderService.class);
57
58 try {
59 initSecurity();
60 initArgeoLogger();
61 initNode();
62
63 userAdminSt = new ServiceTracker<>(instance.bc, UserAdmin.class, null);
64 userAdminSt.open();
65 if (log.isTraceEnabled())
66 log.trace("Kernel bundle started");
67 } catch (Throwable e) {
68 log.error("## FATAL: CMS activator failed", e);
69 }
70 }
71
72 private void initSecurity() {
73 if (System.getProperty(KernelConstants.JAAS_CONFIG_PROP) == null) {
74 String jaasConfig = KernelConstants.JAAS_CONFIG;
75 URL url = getClass().getClassLoader().getResource(jaasConfig);
76 // System.setProperty(KernelConstants.JAAS_CONFIG_PROP,
77 // url.toExternalForm());
78 KernelUtils.setJaasConfiguration(url);
79 }
80 // explicitly load JAAS configuration
81 Configuration.getConfiguration();
82
83 // ConditionalPermissionAdmin permissionAdmin = bc
84 // .getService(bc.getServiceReference(ConditionalPermissionAdmin.class));
85 // ConditionalPermissionUpdate update =
86 // permissionAdmin.newConditionalPermissionUpdate();
87 // // Self
88 // update.getConditionalPermissionInfos()
89 // .add(permissionAdmin.newConditionalPermissionInfo(null,
90 // new ConditionInfo[] {
91 // new ConditionInfo(BundleLocationCondition.class.getName(), new
92 // String[] { "*" }) },
93 // new PermissionInfo[] { new
94 // PermissionInfo(AllPermission.class.getName(), null, null) },
95 // ConditionalPermissionInfo.ALLOW));
96 //
97 }
98
99 private void initArgeoLogger() {
100 logger = new NodeLogger(logReaderService);
101 bc.registerService(ArgeoLogger.class, logger, null);
102 }
103
104 private void initNode() throws IOException {
105 // Node state
106 Path stateUuidPath = bc.getDataFile("stateUuid").toPath();
107 String stateUuid;
108 if (Files.exists(stateUuidPath)) {
109 stateUuid = Files.readAllLines(stateUuidPath).get(0);
110 } else {
111 stateUuid = bc.getProperty(Constants.FRAMEWORK_UUID);
112 Files.write(stateUuidPath, stateUuid.getBytes());
113 }
114 nodeState = new CmsState(stateUuid);
115 Dictionary<String, Object> regProps = LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_STATE_PID);
116 regProps.put(NodeConstants.CN, stateUuid);
117 bc.registerService(NodeState.class, nodeState, regProps);
118
119 // Node deployment
120 nodeDeployment = new CmsDeployment();
121 bc.registerService(NodeDeployment.class, nodeDeployment, null);
122
123 // Node instance
124 nodeInstance = new CmsInstance();
125 bc.registerService(NodeInstance.class, nodeInstance, null);
126 }
127
128 @Override
129 public void stop(BundleContext bundleContext) throws Exception {
130 try {
131 if (nodeInstance != null)
132 nodeInstance.shutdown();
133 if (nodeDeployment != null)
134 nodeDeployment.shutdown();
135 if (nodeState != null)
136 nodeState.shutdown();
137
138 if (userAdminSt != null)
139 userAdminSt.close();
140
141 instance = null;
142 this.bc = null;
143 this.logReaderService = null;
144 // this.configurationAdmin = null;
145 } catch (Exception e) {
146 log.error("CMS activator shutdown failed", e);
147 }
148 }
149
150 private <T> T getService(Class<T> clazz) {
151 ServiceReference<T> sr = bc.getServiceReference(clazz);
152 if (sr == null)
153 throw new CmsException("No service available for " + clazz);
154 return bc.getService(sr);
155 }
156
157 public static NodeState getNodeState() {
158 return instance.nodeState;
159 }
160
161 public static GSSCredential getAcceptorCredentials() {
162 return getNodeUserAdmin().getAcceptorCredentials();
163 }
164
165 public static boolean isSingleUser() {
166 return getNodeUserAdmin().isSingleUser();
167 }
168
169 public static UserAdmin getUserAdmin() {
170 return (UserAdmin) getNodeUserAdmin();
171 }
172
173 public static String getHttpProxySslHeader() {
174 return KernelUtils.getFrameworkProp(NodeConstants.HTTP_PROXY_SSL_DN);
175 }
176
177 private static NodeUserAdmin getNodeUserAdmin() {
178 NodeUserAdmin res;
179 try {
180 res = instance.userAdminSt.waitForService(60000);
181 } catch (InterruptedException e) {
182 throw new CmsException("Cannot retrieve Node user admin", e);
183 }
184 if (res == null)
185 throw new CmsException("No Node user admin found");
186
187 return res;
188 // ServiceReference<UserAdmin> sr =
189 // instance.bc.getServiceReference(UserAdmin.class);
190 // NodeUserAdmin userAdmin = (NodeUserAdmin) instance.bc.getService(sr);
191 // return userAdmin;
192
193 }
194
195 // static CmsSecurity getCmsSecurity() {
196 // return instance.nodeSecurity;
197 // }
198
199 public String[] getLocales() {
200 // TODO optimize?
201 List<Locale> locales = getNodeState().getLocales();
202 String[] res = new String[locales.size()];
203 for (int i = 0; i < locales.size(); i++)
204 res[i] = locales.get(i).toString();
205 return res;
206 }
207
208 }