Rename packages in order to make future stable documentation clearer.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / CmsState.java
index 0b5bd0d483440a13bed946e06d944a850af1e098..ca469f0f5b08116c78658fdc8d15154a282aa7b4 100644 (file)
@@ -1,43 +1,33 @@
 package org.argeo.cms.internal.kernel;
 
-import static bitronix.tm.TransactionManagerServices.getTransactionManager;
-import static bitronix.tm.TransactionManagerServices.getTransactionSynchronizationRegistry;
 import static java.util.Locale.ENGLISH;
 
-import java.io.File;
-import java.lang.management.ManagementFactory;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.nio.file.spi.FileSystemProvider;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
-import java.util.UUID;
 
 import javax.jcr.RepositoryFactory;
 import javax.transaction.TransactionManager;
-import javax.transaction.TransactionSynchronizationRegistry;
 import javax.transaction.UserTransaction;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.i18n.LocaleUtils;
-import org.argeo.node.NodeConstants;
-import org.argeo.node.NodeState;
+import org.argeo.api.NodeConstants;
+import org.argeo.api.NodeState;
+import org.argeo.cms.CmsException;
+import org.argeo.cms.LocaleUtils;
+import org.argeo.transaction.simple.SimpleTransactionManager;
 import org.argeo.util.LangUtils;
-import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.ServiceReference;
 import org.osgi.service.cm.ManagedServiceFactory;
 
-import bitronix.tm.BitronixTransactionManager;
-import bitronix.tm.BitronixTransactionSynchronizationRegistry;
-import bitronix.tm.TransactionManagerServices;
-
 public class CmsState implements NodeState {
-       private final Log log = LogFactory.getLog(CmsState.class);
+       private final static Log log = LogFactory.getLog(CmsState.class);
        private final BundleContext bc = FrameworkUtil.getBundle(CmsState.class).getBundleContext();
 
        // REFERENCES
@@ -87,7 +77,31 @@ public class CmsState implements NodeState {
 
        private void initServices() {
                // JTA
-               initTransactionManager();
+               String tmType = KernelUtils.getFrameworkProp(NodeConstants.TRANSACTION_MANAGER,
+                               NodeConstants.TRANSACTION_MANAGER_SIMPLE);
+               if (NodeConstants.TRANSACTION_MANAGER_SIMPLE.equals(tmType)) {
+                       initSimpleTransactionManager();
+               } else if (NodeConstants.TRANSACTION_MANAGER_BITRONIX.equals(tmType)) {
+//                     initBitronixTransactionManager();
+                       throw new UnsupportedOperationException(
+                                       "Bitronix is not supported anymore, but could be again if there is enough interest.");
+               } else {
+                       throw new CmsException("Usupported transaction manager type " + tmType);
+               }
+
+               // POI
+//             POIXMLTypeLoader.setClassLoader(CTConnection.class.getClassLoader());
+
+               // Tika
+//             OpenDocumentParser odfParser = new OpenDocumentParser();
+//             bc.registerService(Parser.class, odfParser, new Hashtable());
+//             PDFParser pdfParser = new PDFParser();
+//             bc.registerService(Parser.class, pdfParser, new Hashtable());
+//             OOXMLParser ooxmlParser = new OOXMLParser();
+//             bc.registerService(Parser.class, ooxmlParser, new Hashtable());
+//             TesseractOCRParser ocrParser = new TesseractOCRParser();
+//             ocrParser.setLanguage("ara");
+//             bc.registerService(Parser.class, ocrParser, new Hashtable());
 
                // JCR
                RepositoryServiceFactory repositoryServiceFactory = new RepositoryServiceFactory();
@@ -99,57 +113,76 @@ public class CmsState implements NodeState {
                bc.registerService(RepositoryFactory.class, repositoryFactory, null);
 
                // Security
-               NodeUserAdmin userAdmin = new NodeUserAdmin(NodeConstants.ROLES_BASEDN);
+               NodeUserAdmin userAdmin = new NodeUserAdmin(NodeConstants.ROLES_BASEDN, NodeConstants.TOKENS_BASEDN);
                stopHooks.add(() -> userAdmin.destroy());
                bc.registerService(ManagedServiceFactory.class, userAdmin,
                                LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_USER_ADMIN_PID));
 
                // File System
                CmsFsProvider cmsFsProvider = new CmsFsProvider();
+//             ServiceLoader<FileSystemProvider> fspSl = ServiceLoader.load(FileSystemProvider.class);
+//             for (FileSystemProvider fsp : fspSl) {
+//                     log.debug("FileSystemProvider " + fsp);
+//                     if (fsp instanceof CmsFsProvider) {
+//                             cmsFsProvider = (CmsFsProvider) fsp;
+//                     }
+//             }
+//             for (FileSystemProvider fsp : FileSystemProvider.installedProviders()) {
+//                     log.debug("Installed FileSystemProvider " + fsp);
+//             }
                bc.registerService(FileSystemProvider.class, cmsFsProvider,
                                LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_FS_PROVIDER_PID));
        }
 
-       private void initTransactionManager() {
-               // TODO manage it in a managed service, as startup could be long
-               ServiceReference<TransactionManager> existingTm = bc.getServiceReference(TransactionManager.class);
-               if (existingTm != null) {
-                       if (log.isDebugEnabled())
-                               log.debug("Using provided transaction manager " + existingTm);
-                       return;
-               }
-
-               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();
-               stopHooks.add(() -> transactionManager.shutdown());
-               BitronixTransactionSynchronizationRegistry transactionSynchronizationRegistry = getTransactionSynchronizationRegistry();
-               // register
+       private void initSimpleTransactionManager() {
+               SimpleTransactionManager transactionManager = new SimpleTransactionManager();
                bc.registerService(TransactionManager.class, transactionManager, null);
                bc.registerService(UserTransaction.class, transactionManager, null);
-               bc.registerService(TransactionSynchronizationRegistry.class, transactionSynchronizationRegistry, null);
-               if (log.isDebugEnabled())
-                       log.debug("Initialised default Bitronix transaction manager");
+               // TODO TransactionSynchronizationRegistry
        }
 
+//     private void initBitronixTransactionManager() {
+//             // TODO manage it in a managed service, as startup could be long
+//             ServiceReference<TransactionManager> existingTm = bc.getServiceReference(TransactionManager.class);
+//             if (existingTm != null) {
+//                     if (log.isDebugEnabled())
+//                             log.debug("Using provided transaction manager " + existingTm);
+//                     return;
+//             }
+//
+//             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();
+//             stopHooks.add(() -> transactionManager.shutdown());
+//             BitronixTransactionSynchronizationRegistry transactionSynchronizationRegistry = getTransactionSynchronizationRegistry();
+//             // register
+//             bc.registerService(TransactionManager.class, transactionManager, null);
+//             bc.registerService(UserTransaction.class, transactionManager, null);
+//             bc.registerService(TransactionSynchronizationRegistry.class, transactionSynchronizationRegistry, null);
+//             if (log.isDebugEnabled())
+//                     log.debug("Initialised default Bitronix transaction manager");
+//     }
+
        void shutdown() {
                if (log.isDebugEnabled())
                        log.debug("CMS stopping...  stateUuid=" + this.stateUuid + (cleanState ? " (clean state) " : " "));
 
                if (kernelThread != null)
                        kernelThread.destroyAndJoin();
-               applyStopHooks();
+               // In a different state in order to avois interruptions
+               new Thread(() -> applyStopHooks(), "Apply Argeo Stop Hooks").start();
+               // applyStopHooks();
 
                long duration = ((System.currentTimeMillis() - availableSince) / 1000) / 60;
                log.info("## ARGEO CMS STOPPED after " + (duration / 60) + "h " + (duration % 60) + "min uptime ##");