1 package org
.argeo
.cms
.internal
.kernel
;
3 import java
.io
.IOException
;
5 import java
.nio
.file
.Files
;
6 import java
.nio
.file
.Path
;
7 import java
.util
.Dictionary
;
9 import java
.util
.Locale
;
11 import javax
.security
.auth
.login
.Configuration
;
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
;
32 * Activates the kernel. Gives access to kernel information for the rest of the
33 * bundle (and only it)
35 public class Activator
implements BundleActivator
{
36 private final static Log log
= LogFactory
.getLog(Activator
.class);
38 private static Activator instance
;
40 private BundleContext bc
;
42 private LogReaderService logReaderService
;
44 private NodeLogger logger
;
45 private CmsState nodeState
;
46 private CmsDeployment nodeDeployment
;
47 private CmsInstance nodeInstance
;
49 private ServiceTracker
<UserAdmin
, NodeUserAdmin
> userAdminSt
;
52 public void start(BundleContext bundleContext
) throws Exception
{
53 Runtime
.getRuntime().addShutdownHook(new CmsShutdown());
55 this.bc
= bundleContext
;
56 this.logReaderService
= getService(LogReaderService
.class);
63 userAdminSt
= new ServiceTracker
<>(instance
.bc
, UserAdmin
.class, null);
65 if (log
.isTraceEnabled())
66 log
.trace("Kernel bundle started");
67 } catch (Throwable e
) {
68 log
.error("## FATAL: CMS activator failed", e
);
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
);
80 // explicitly load JAAS configuration
81 Configuration
.getConfiguration();
83 // ConditionalPermissionAdmin permissionAdmin = bc
84 // .getService(bc.getServiceReference(ConditionalPermissionAdmin.class));
85 // ConditionalPermissionUpdate update =
86 // permissionAdmin.newConditionalPermissionUpdate();
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));
99 private void initArgeoLogger() {
100 logger
= new NodeLogger(logReaderService
);
101 bc
.registerService(ArgeoLogger
.class, logger
, null);
104 private void initNode() throws IOException
{
106 Path stateUuidPath
= bc
.getDataFile("stateUuid").toPath();
108 if (Files
.exists(stateUuidPath
)) {
109 stateUuid
= Files
.readAllLines(stateUuidPath
).get(0);
111 stateUuid
= bc
.getProperty(Constants
.FRAMEWORK_UUID
);
112 Files
.write(stateUuidPath
, stateUuid
.getBytes());
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
);
120 nodeDeployment
= new CmsDeployment();
121 bc
.registerService(NodeDeployment
.class, nodeDeployment
, null);
124 nodeInstance
= new CmsInstance();
125 bc
.registerService(NodeInstance
.class, nodeInstance
, null);
129 public void stop(BundleContext bundleContext
) throws Exception
{
131 if (nodeInstance
!= null)
132 nodeInstance
.shutdown();
133 if (nodeDeployment
!= null)
134 nodeDeployment
.shutdown();
135 if (nodeState
!= null)
136 nodeState
.shutdown();
138 if (userAdminSt
!= null)
143 this.logReaderService
= null;
144 // this.configurationAdmin = null;
145 } catch (Exception e
) {
146 log
.error("CMS activator shutdown failed", e
);
150 private <T
> T
getService(Class
<T
> clazz
) {
151 ServiceReference
<T
> sr
= bc
.getServiceReference(clazz
);
153 throw new CmsException("No service available for " + clazz
);
154 return bc
.getService(sr
);
157 public static NodeState
getNodeState() {
158 return instance
.nodeState
;
161 public static GSSCredential
getAcceptorCredentials() {
162 return getNodeUserAdmin().getAcceptorCredentials();
165 public static boolean isSingleUser() {
166 return getNodeUserAdmin().isSingleUser();
169 public static UserAdmin
getUserAdmin() {
170 return (UserAdmin
) getNodeUserAdmin();
173 public static String
getHttpProxySslHeader() {
174 return KernelUtils
.getFrameworkProp(NodeConstants
.HTTP_PROXY_SSL_DN
);
177 private static NodeUserAdmin
getNodeUserAdmin() {
180 res
= instance
.userAdminSt
.waitForService(60000);
181 } catch (InterruptedException e
) {
182 throw new CmsException("Cannot retrieve Node user admin", e
);
185 throw new CmsException("No Node user admin found");
188 // ServiceReference<UserAdmin> sr =
189 // instance.bc.getServiceReference(UserAdmin.class);
190 // NodeUserAdmin userAdmin = (NodeUserAdmin) instance.bc.getService(sr);
195 // static CmsSecurity getCmsSecurity() {
196 // return instance.nodeSecurity;
199 public String
[] getLocales() {
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();