From 10f208389989c53a3533459d50d4e77e02cee0f4 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 14 Apr 2017 13:16:09 +0200 Subject: [PATCH] Make CMS kernel more robust. Rectivate node logger. --- .../org/argeo/cms/internal/http/NodeHttp.java | 3 +- .../argeo/cms/internal/kernel/Activator.java | 73 +++++++++++-------- .../argeo/cms/internal/kernel/CmsState.java | 29 ++++---- 3 files changed, 61 insertions(+), 44 deletions(-) diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/NodeHttp.java b/org.argeo.cms/src/org/argeo/cms/internal/http/NodeHttp.java index b74b3815a..4cc0b5538 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/NodeHttp.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/NodeHttp.java @@ -47,7 +47,8 @@ public class NodeHttp implements KernelConstants { } public void destroy() { - repositories.close(); + if (repositories != null) + repositories.close(); } void registerRepositoryServlets(HttpService httpService, String alias, Repository repository) { 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 f6a9b1469..a70235976 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 @@ -5,7 +5,6 @@ import java.io.IOException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; -import java.security.AllPermission; import java.util.Dictionary; import java.util.List; import java.util.Locale; @@ -15,6 +14,7 @@ import javax.security.auth.login.Configuration; 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; @@ -25,13 +25,7 @@ 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.BundleLocationCondition; -import org.osgi.service.condpermadmin.ConditionInfo; -import org.osgi.service.condpermadmin.ConditionalPermissionAdmin; -import org.osgi.service.condpermadmin.ConditionalPermissionInfo; -import org.osgi.service.condpermadmin.ConditionalPermissionUpdate; import org.osgi.service.log.LogReaderService; -import org.osgi.service.permissionadmin.PermissionInfo; import org.osgi.service.useradmin.UserAdmin; /** @@ -48,7 +42,7 @@ public class Activator implements BundleActivator { private LogReaderService logReaderService; // private ConfigurationAdmin configurationAdmin; - // private NodeLogger logger; + private NodeLogger logger; private CmsState nodeState; private CmsDeployment nodeDeployment; private CmsInstance nodeInstance; @@ -67,7 +61,6 @@ public class Activator implements BundleActivator { initNode(); } catch (Exception e) { log.error("## FATAL: CMS activator failed", e); - // throw new CmsException("Cannot initialize node", e); } } @@ -82,22 +75,35 @@ public class Activator implements BundleActivator { // explicitly load JAAS configuration Configuration.getConfiguration(); - ConditionalPermissionAdmin permissionAdmin = bc - .getService(bc.getServiceReference(ConditionalPermissionAdmin.class)); - ConditionalPermissionUpdate update = permissionAdmin.newConditionalPermissionUpdate(); - // Self - update.getConditionalPermissionInfos() - .add(permissionAdmin.newConditionalPermissionInfo(null, - new ConditionInfo[] { - new ConditionInfo(BundleLocationCondition.class.getName(), new String[] { "*" }) }, - new PermissionInfo[] { new PermissionInfo(AllPermission.class.getName(), null, null) }, - ConditionalPermissionInfo.ALLOW)); - + // ConditionalPermissionAdmin permissionAdmin = bc + // .getService(bc.getServiceReference(ConditionalPermissionAdmin.class)); + // ConditionalPermissionUpdate update = + // permissionAdmin.newConditionalPermissionUpdate(); + // // Self + // update.getConditionalPermissionInfos() + // .add(permissionAdmin.newConditionalPermissionInfo(null, + // new ConditionInfo[] { + // new ConditionInfo(BundleLocationCondition.class.getName(), new + // String[] { "*" }) }, + // new PermissionInfo[] { new + // PermissionInfo(AllPermission.class.getName(), null, null) }, + // ConditionalPermissionInfo.ALLOW)); + // } private void initArgeoLogger() { - // logger = new NodeLogger(logReaderService); - // bc.registerService(ArgeoLogger.class, logger, null); + // Jetty + // disable integration of Jetty logging with SLF4J + // in order to avoid chicken and egg problems + // org.eclipse.jetty.util.log.Log.setLog(new StdErrLog()); + // org.eclipse.jetty.util.log.Logger jettyLog = + // org.eclipse.jetty.util.log.Log.getLog(); + // if (jettyLog != null) { + // jettyLog.warn("TEST JETTY LOG", new Object[0]); + // } + + logger = new NodeLogger(logReaderService); + bc.registerService(ArgeoLogger.class, logger, null); } private void initNode() throws IOException { @@ -126,14 +132,21 @@ public class Activator implements BundleActivator { @Override public void stop(BundleContext bundleContext) throws Exception { - nodeInstance.shutdown(); - nodeDeployment.shutdown(); - nodeState.shutdown(); - - instance = null; - this.bc = null; - this.logReaderService = null; - // this.configurationAdmin = null; + try { + if (nodeInstance != null) + nodeInstance.shutdown(); + if (nodeDeployment != null) + nodeDeployment.shutdown(); + if (nodeState != null) + nodeState.shutdown(); + + instance = null; + this.bc = null; + this.logReaderService = null; + // this.configurationAdmin = null; + } catch (Exception e) { + log.error("CMS activator shutdown failed", e); + } } private T getService(Class clazz) { diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java index a5cc0b746..eebf71ccb 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java @@ -115,19 +115,22 @@ public class CmsState implements NodeState { if (existingTm != null) { if (log.isDebugEnabled()) log.debug("Using provided transaction manager " + existingTm); + return; } - bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration(); - tmConf.setServerId(UUID.randomUUID().toString()); - - Bundle bitronixBundle = FrameworkUtil.getBundle(bitronix.tm.Configuration.class); - File tmBaseDir = bitronixBundle.getDataFile(KernelConstants.DIR_TRANSACTIONS); - File tmDir1 = new File(tmBaseDir, "btm1"); - tmDir1.mkdirs(); - tmConf.setLogPart1Filename(new File(tmDir1, tmDir1.getName() + ".tlog").getAbsolutePath()); - File tmDir2 = new File(tmBaseDir, "btm2"); - tmDir2.mkdirs(); - tmConf.setLogPart2Filename(new File(tmDir2, tmDir2.getName() + ".tlog").getAbsolutePath()); + if (!TransactionManagerServices.isTransactionManagerRunning()) { + bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration(); + tmConf.setServerId(UUID.randomUUID().toString()); + + Bundle bitronixBundle = FrameworkUtil.getBundle(bitronix.tm.Configuration.class); + File tmBaseDir = bitronixBundle.getDataFile(KernelConstants.DIR_TRANSACTIONS); + File tmDir1 = new File(tmBaseDir, "btm1"); + tmDir1.mkdirs(); + tmConf.setLogPart1Filename(new File(tmDir1, tmDir1.getName() + ".tlog").getAbsolutePath()); + File tmDir2 = new File(tmBaseDir, "btm2"); + tmDir2.mkdirs(); + tmConf.setLogPart2Filename(new File(tmDir2, tmDir2.getName() + ".tlog").getAbsolutePath()); + } BitronixTransactionManager transactionManager = getTransactionManager(); shutdownHooks.add(() -> transactionManager.shutdown()); BitronixTransactionSynchronizationRegistry transactionSynchronizationRegistry = getTransactionSynchronizationRegistry(); @@ -140,11 +143,11 @@ public class CmsState implements NodeState { } void shutdown() { - applyShutdownHooks(); - if (kernelThread != null) kernelThread.destroyAndJoin(); + applyShutdownHooks(); + if (log.isDebugEnabled()) log.debug("## CMS STOPPED"); } -- 2.30.2