]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java
Fix first init
[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.awt.image.Kernel;
4 import java.io.IOException;
5 import java.net.URL;
6 import java.nio.file.Files;
7 import java.nio.file.Path;
8 import java.util.Dictionary;
9 import java.util.List;
10 import java.util.Locale;
11
12 import javax.security.auth.login.Configuration;
13
14 import org.apache.commons.logging.Log;
15 import org.apache.commons.logging.LogFactory;
16 import org.argeo.cms.CmsException;
17 import org.argeo.node.ArgeoLogger;
18 import org.argeo.node.NodeConstants;
19 import org.argeo.node.NodeDeployment;
20 import org.argeo.node.NodeInstance;
21 import org.argeo.node.NodeState;
22 import org.argeo.util.LangUtils;
23 import org.ietf.jgss.GSSCredential;
24 import org.osgi.framework.BundleActivator;
25 import org.osgi.framework.BundleContext;
26 import org.osgi.framework.Constants;
27 import org.osgi.framework.ServiceReference;
28 import org.osgi.service.log.LogReaderService;
29 import org.osgi.service.useradmin.UserAdmin;
30
31 /**
32 * Activates the {@link Kernel} from the provided {@link BundleContext}. Gives
33 * access to kernel information for the rest of the 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 // private CmsSecurity nodeSecurity;
42 private LogReaderService logReaderService;
43 // private ConfigurationAdmin configurationAdmin;
44
45 private NodeLogger logger;
46 private CmsState nodeState;
47 private CmsDeployment nodeDeployment;
48 private CmsInstance nodeInstance;
49
50 @Override
51 public void start(BundleContext bundleContext) throws Exception {
52 instance = this;
53 this.bc = bundleContext;
54 this.logReaderService = getService(LogReaderService.class);
55 // this.configurationAdmin = getService(ConfigurationAdmin.class);
56
57 try {
58 // nodeSecurity = new CmsSecurity();
59 initSecurity();
60 initArgeoLogger();
61 initNode();
62 } catch (Exception e) {
63 log.error("## FATAL: CMS activator failed", e);
64 // throw new CmsException("Cannot initialize node", e);
65 }
66 }
67
68 private void initSecurity() {
69 if (System.getProperty(KernelConstants.JAAS_CONFIG_PROP) == null) {
70 String jaasConfig = KernelConstants.JAAS_CONFIG;
71 URL url = getClass().getClassLoader().getResource(jaasConfig);
72 System.setProperty(KernelConstants.JAAS_CONFIG_PROP, url.toExternalForm());
73 }
74 // explicitly load JAAS configuration
75 Configuration.getConfiguration();
76 }
77
78 private void initArgeoLogger() {
79 logger = new NodeLogger(logReaderService);
80 bc.registerService(ArgeoLogger.class, logger, null);
81 }
82
83 private void initNode() throws IOException {
84 // Node state
85 Path stateUuidPath = bc.getDataFile("stateUuid").toPath();
86 String stateUuid;
87 if (Files.exists(stateUuidPath)) {
88 stateUuid = Files.readAllLines(stateUuidPath).get(0);
89 } else {
90 stateUuid = bc.getProperty(Constants.FRAMEWORK_UUID);
91 Files.write(stateUuidPath, stateUuid.getBytes());
92 }
93 nodeState = new CmsState(stateUuid);
94 Dictionary<String, Object> regProps = LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_STATE_PID);
95 regProps.put(NodeConstants.CN, stateUuid);
96 bc.registerService(NodeState.class, nodeState, regProps);
97
98 // Node deployment
99 nodeDeployment = new CmsDeployment();
100 bc.registerService(NodeDeployment.class, nodeDeployment, null);
101
102 // Node instance
103 nodeInstance = new CmsInstance();
104 bc.registerService(NodeInstance.class, nodeInstance, null);
105 }
106
107 @Override
108 public void stop(BundleContext bundleContext) throws Exception {
109 nodeInstance.shutdown();
110 nodeDeployment.shutdown();
111 nodeState.shutdown();
112
113 instance = null;
114 this.bc = null;
115 this.logReaderService = null;
116 // this.configurationAdmin = null;
117 }
118
119 private <T> T getService(Class<T> clazz) {
120 ServiceReference<T> sr = bc.getServiceReference(clazz);
121 if (sr == null)
122 throw new CmsException("No service available for " + clazz);
123 return bc.getService(sr);
124 }
125
126 public static NodeState getNodeState() {
127 return instance.nodeState;
128 }
129
130 public static GSSCredential getAcceptorCredentials() {
131 ServiceReference<UserAdmin> sr = instance.bc.getServiceReference(UserAdmin.class);
132 NodeUserAdmin userAdmin = (NodeUserAdmin) instance.bc.getService(sr);
133 return userAdmin.getAcceptorCredentials();
134 }
135
136 // static CmsSecurity getCmsSecurity() {
137 // return instance.nodeSecurity;
138 // }
139
140 public String[] getLocales() {
141 // TODO optimize?
142 List<Locale> locales = getNodeState().getLocales();
143 String[] res = new String[locales.size()];
144 for (int i = 0; i < locales.size(); i++)
145 res[i] = locales.get(i).toString();
146 return res;
147 }
148
149 }