X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FActivator.java;h=ecd36476facdd5cbc7e187cb87dd0c01d84b840e;hb=b1dbb754c88b8609246b865a25bc946213370662;hp=4d166eaf63db619ed0b761034299a154f30cfd39;hpb=63446804f4954bfedd50d8c692bde0fab13aa1ec;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java index 4d166eaf6..ecd36476f 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java @@ -1,22 +1,148 @@ package org.argeo.cms.internal.kernel; +import java.io.IOException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Dictionary; +import java.util.List; +import java.util.Locale; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.cms.CmsException; +import org.argeo.node.ArgeoLogger; +import org.argeo.node.NodeConstants; +import org.argeo.node.NodeDeployment; +import org.argeo.node.NodeInstance; +import org.argeo.node.NodeState; +import org.argeo.util.LangUtils; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceReference; +import org.osgi.service.condpermadmin.ConditionalPermissionAdmin; +import org.osgi.service.log.LogReaderService; +/** + * Activates the {@link Kernel} from the provided {@link BundleContext}. Gives + * access to kernel information for the rest of the bundle (and only it) + */ public class Activator implements BundleActivator { - private Kernel kernel; + private final Log log = LogFactory.getLog(Activator.class); + + private static Activator instance; + + private BundleContext bc; + private ConditionalPermissionAdmin permissionAdmin; + private LogReaderService logReaderService; + // private ConfigurationAdmin configurationAdmin; + + private NodeLogger logger; + private CmsState nodeState; + private CmsDeployment nodeDeployment; + private CmsInstance nodeInstance; @Override - public void start(BundleContext context) throws Exception { - assert kernel == null; - kernel = new Kernel(context); - kernel.init(); + public void start(BundleContext bundleContext) throws Exception { + instance = this; + this.bc = bundleContext; + this.permissionAdmin = getService(ConditionalPermissionAdmin.class); + this.logReaderService = getService(LogReaderService.class); + // this.configurationAdmin = getService(ConfigurationAdmin.class); + + initSecurity();// must be first + initArgeoLogger(); + try { + initNode(); + } catch (Exception e) { + e.printStackTrace(); + throw new CmsException("Cannot initialize node", e); + } + } + + private void initSecurity() { + URL url = getClass().getClassLoader().getResource(KernelConstants.JAAS_CONFIG); + System.setProperty("java.security.auth.login.config", url.toExternalForm()); + } + + private void initArgeoLogger() { + logger = new NodeLogger(logReaderService); + bc.registerService(ArgeoLogger.class, logger, null); + } + + private void initNode() throws IOException { + // Node state + Path stateUuidPath = bc.getDataFile("stateUuid").toPath(); + String stateUuid; + if (Files.exists(stateUuidPath)) { + stateUuid = Files.readAllLines(stateUuidPath).get(0); + } else { + stateUuid = bc.getProperty(Constants.FRAMEWORK_UUID); + Files.write(stateUuidPath, stateUuid.getBytes()); + } + nodeState = new CmsState(stateUuid); + // Object cn; + // Configuration nodeConf = + // configurationAdmin.getConfiguration(NodeConstants.NODE_STATE_PID); + // Dictionary props = nodeConf.getProperties(); + // if (props == null) { + // if (log.isDebugEnabled()) + // log.debug("Clean node state"); + // Dictionary envProps = new Hashtable<>(); + // // Use the UUID of the first framework run as state UUID + // cn = bc.getProperty(Constants.FRAMEWORK_UUID); + // envProps.put(NodeConstants.CN, cn); + // nodeConf.update(envProps); + // } else { + // cn = props.get(NodeConstants.CN); + // if (cn == null) + // throw new CmsException("No state UUID available"); + // } + Dictionary regProps = LangUtils.init(Constants.SERVICE_PID, NodeConstants.NODE_STATE_PID); + regProps.put(NodeConstants.CN, stateUuid); + bc.registerService(NodeState.class, nodeState, regProps); + + // Node deployment + nodeDeployment = new CmsDeployment(); + bc.registerService(NodeDeployment.class, nodeDeployment, null); + + // Node instance + nodeInstance = new CmsInstance(); + bc.registerService(NodeInstance.class, nodeInstance, null); } @Override - public void stop(BundleContext context) throws Exception { - kernel.destroy(); - kernel = null; + public void stop(BundleContext bundleContext) throws Exception { + nodeInstance.shutdown(); + nodeDeployment.shutdown(); + nodeState.shutdown(); + + instance = null; + this.bc = null; + this.permissionAdmin = null; + this.logReaderService = null; + // this.configurationAdmin = null; + } + + private T getService(Class clazz) { + ServiceReference sr = bc.getServiceReference(clazz); + if (sr == null) + throw new CmsException("No service available for " + clazz); + return bc.getService(sr); + } + + public static NodeState getNodeState() { + return instance.nodeState; + } + + public String[] getLocales() { + // TODO optimize? + List locales = getNodeState().getLocales(); + String[] res = new String[locales.size()]; + for (int i = 0; i < locales.size(); i++) + res[i] = locales.get(i).toString(); + return res; } }