1 package org
.argeo
.cms
.internal
.kernel
;
3 import static java
.util
.Locale
.ENGLISH
;
5 import java
.net
.InetAddress
;
6 import java
.net
.UnknownHostException
;
7 import java
.util
.ArrayList
;
9 import java
.util
.Locale
;
11 import org
.apache
.commons
.logging
.Log
;
12 import org
.apache
.commons
.logging
.LogFactory
;
13 import org
.argeo
.api
.NodeConstants
;
14 import org
.argeo
.api
.NodeState
;
15 import org
.argeo
.cms
.LocaleUtils
;
16 import org
.argeo
.osgi
.transaction
.SimpleTransactionManager
;
17 import org
.argeo
.osgi
.transaction
.WorkControl
;
18 import org
.argeo
.osgi
.transaction
.WorkTransaction
;
19 import org
.argeo
.util
.LangUtils
;
20 import org
.osgi
.framework
.Constants
;
21 import org
.osgi
.service
.cm
.ManagedServiceFactory
;
24 * Implementation of a {@link NodeState}, initialising the required services.
26 public class CmsState
implements NodeState
{
27 private final static Log log
= LogFactory
.getLog(CmsState
.class);
28 // private final BundleContext bc = FrameworkUtil.getBundle(CmsState.class).getBundleContext();
31 private Long availableSince
;
34 private Locale defaultLocale
;
35 private List
<Locale
> locales
= null;
37 private ThreadGroup threadGroup
= new ThreadGroup("CMS");
38 private List
<Runnable
> stopHooks
= new ArrayList
<>();
40 private final String stateUuid
;
41 // private final boolean cleanState;
42 private String hostname
;
45 // this.stateUuid = stateUuid;
46 this.stateUuid
= KernelUtils
.getFrameworkProp(Constants
.FRAMEWORK_UUID
);
47 // this.cleanState = stateUuid.equals(frameworkUuid);
49 this.hostname
= InetAddress
.getLocalHost().getHostName();
50 } catch (UnknownHostException e
) {
51 log
.error("Cannot set hostname: " + e
);
54 availableSince
= System
.currentTimeMillis();
55 if (log
.isDebugEnabled())
56 // log.debug("## CMS starting... stateUuid=" + this.stateUuid + (cleanState ? "
57 // (clean state) " : " "));
58 log
.debug("## CMS starting... (" + stateUuid
+ ")");
65 private void initI18n() {
66 Object defaultLocaleValue
= KernelUtils
.getFrameworkProp(NodeConstants
.I18N_DEFAULT_LOCALE
);
67 defaultLocale
= defaultLocaleValue
!= null ?
new Locale(defaultLocaleValue
.toString())
68 : new Locale(ENGLISH
.getLanguage());
69 locales
= LocaleUtils
.asLocaleList(KernelUtils
.getFrameworkProp(NodeConstants
.I18N_LOCALES
));
72 private void initServices() {
74 String tmType
= KernelUtils
.getFrameworkProp(NodeConstants
.TRANSACTION_MANAGER
,
75 NodeConstants
.TRANSACTION_MANAGER_SIMPLE
);
76 if (NodeConstants
.TRANSACTION_MANAGER_SIMPLE
.equals(tmType
)) {
77 initSimpleTransactionManager();
78 } else if (NodeConstants
.TRANSACTION_MANAGER_BITRONIX
.equals(tmType
)) {
79 // initBitronixTransactionManager();
80 throw new UnsupportedOperationException(
81 "Bitronix is not supported anymore, but could be again if there is enough interest.");
83 throw new IllegalArgumentException("Usupported transaction manager type " + tmType
);
87 // POIXMLTypeLoader.setClassLoader(CTConnection.class.getClassLoader());
90 // OpenDocumentParser odfParser = new OpenDocumentParser();
91 // bc.registerService(Parser.class, odfParser, new Hashtable());
92 // PDFParser pdfParser = new PDFParser();
93 // bc.registerService(Parser.class, pdfParser, new Hashtable());
94 // OOXMLParser ooxmlParser = new OOXMLParser();
95 // bc.registerService(Parser.class, ooxmlParser, new Hashtable());
96 // TesseractOCRParser ocrParser = new TesseractOCRParser();
97 // ocrParser.setLanguage("ara");
98 // bc.registerService(Parser.class, ocrParser, new Hashtable());
101 // RepositoryServiceFactory repositoryServiceFactory = new RepositoryServiceFactory();
102 // stopHooks.add(() -> repositoryServiceFactory.shutdown());
103 // Activator.registerService(ManagedServiceFactory.class, repositoryServiceFactory,
104 // LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_REPOS_FACTORY_PID));
106 // NodeRepositoryFactory repositoryFactory = new NodeRepositoryFactory();
107 // Activator.registerService(RepositoryFactory.class, repositoryFactory, null);
110 NodeUserAdmin userAdmin
= new NodeUserAdmin(NodeConstants
.ROLES_BASEDN
, NodeConstants
.TOKENS_BASEDN
);
111 stopHooks
.add(() -> userAdmin
.destroy());
112 Activator
.registerService(ManagedServiceFactory
.class, userAdmin
,
113 LangUtils
.dict(Constants
.SERVICE_PID
, NodeConstants
.NODE_USER_ADMIN_PID
));
117 private void initSimpleTransactionManager() {
118 SimpleTransactionManager transactionManager
= new SimpleTransactionManager();
119 Activator
.registerService(WorkControl
.class, transactionManager
, null);
120 Activator
.registerService(WorkTransaction
.class, transactionManager
, null);
121 // Activator.registerService(TransactionManager.class, transactionManager, null);
122 // Activator.registerService(UserTransaction.class, transactionManager, null);
123 // TODO TransactionSynchronizationRegistry
126 // private void initBitronixTransactionManager() {
127 // // TODO manage it in a managed service, as startup could be long
128 // ServiceReference<TransactionManager> existingTm = bc.getServiceReference(TransactionManager.class);
129 // if (existingTm != null) {
130 // if (log.isDebugEnabled())
131 // log.debug("Using provided transaction manager " + existingTm);
135 // if (!TransactionManagerServices.isTransactionManagerRunning()) {
136 // bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration();
137 // tmConf.setServerId(UUID.randomUUID().toString());
139 // Bundle bitronixBundle = FrameworkUtil.getBundle(bitronix.tm.Configuration.class);
140 // File tmBaseDir = bitronixBundle.getDataFile(KernelConstants.DIR_TRANSACTIONS);
141 // File tmDir1 = new File(tmBaseDir, "btm1");
143 // tmConf.setLogPart1Filename(new File(tmDir1, tmDir1.getName() + ".tlog").getAbsolutePath());
144 // File tmDir2 = new File(tmBaseDir, "btm2");
146 // tmConf.setLogPart2Filename(new File(tmDir2, tmDir2.getName() + ".tlog").getAbsolutePath());
148 // BitronixTransactionManager transactionManager = getTransactionManager();
149 // stopHooks.add(() -> transactionManager.shutdown());
150 // BitronixTransactionSynchronizationRegistry transactionSynchronizationRegistry = getTransactionSynchronizationRegistry();
152 // bc.registerService(TransactionManager.class, transactionManager, null);
153 // bc.registerService(UserTransaction.class, transactionManager, null);
154 // bc.registerService(TransactionSynchronizationRegistry.class, transactionSynchronizationRegistry, null);
155 // if (log.isDebugEnabled())
156 // log.debug("Initialised default Bitronix transaction manager");
160 if (log
.isDebugEnabled())
161 log
.debug("CMS stopping... (" + this.stateUuid
+ ")");
163 // In a different thread in order to avoid interruptions
164 Thread stopHookThread
= new Thread(() -> applyStopHooks(), "Apply Argeo Stop Hooks");
165 stopHookThread
.start();
167 stopHookThread
.join(10 * 60 * 1000);
168 } catch (InterruptedException e
) {
172 long duration
= ((System
.currentTimeMillis() - availableSince
) / 1000) / 60;
173 log
.info("## ARGEO CMS STOPPED after " + (duration
/ 60) + "h " + (duration
% 60) + "min uptime ##");
176 /** Apply shutdown hoos in reverse order. */
177 private void applyStopHooks() {
178 for (int i
= stopHooks
.size() - 1; i
>= 0; i
--) {
180 stopHooks
.get(i
).run();
181 } catch (Exception e
) {
182 log
.error("Could not run shutdown hook #" + i
);
185 // Clean hanging Gogo shell thread
186 new GogoShellKiller().start();
190 // public boolean isClean() {
191 // return cleanState;
195 public Long
getAvailableSince() {
196 return availableSince
;
202 public Locale
getDefaultLocale() {
203 return defaultLocale
;
206 public List
<Locale
> getLocales() {
210 public String
getHostname() {