001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.events;
016    
017    import com.liferay.portal.fabric.server.FabricServerUtil;
018    import com.liferay.portal.jericho.CachedLoggerProvider;
019    import com.liferay.portal.kernel.backgroundtask.BackgroundTaskManager;
020    import com.liferay.portal.kernel.backgroundtask.BackgroundTaskManagerUtil;
021    import com.liferay.portal.kernel.cluster.ClusterExecutor;
022    import com.liferay.portal.kernel.cluster.ClusterMasterExecutor;
023    import com.liferay.portal.kernel.dao.db.DB;
024    import com.liferay.portal.kernel.dao.db.DBManagerUtil;
025    import com.liferay.portal.kernel.dao.db.DBType;
026    import com.liferay.portal.kernel.events.ActionException;
027    import com.liferay.portal.kernel.events.SimpleAction;
028    import com.liferay.portal.kernel.executor.PortalExecutorManager;
029    import com.liferay.portal.kernel.log.Log;
030    import com.liferay.portal.kernel.log.LogFactoryUtil;
031    import com.liferay.portal.kernel.messaging.MessageBus;
032    import com.liferay.portal.kernel.nio.intraband.Intraband;
033    import com.liferay.portal.kernel.nio.intraband.SystemDataType;
034    import com.liferay.portal.kernel.nio.intraband.mailbox.MailboxDatagramReceiveHandler;
035    import com.liferay.portal.kernel.nio.intraband.messaging.MessageDatagramReceiveHandler;
036    import com.liferay.portal.kernel.nio.intraband.proxy.IntrabandProxyDatagramReceiveHandler;
037    import com.liferay.portal.kernel.nio.intraband.rpc.RPCDatagramReceiveHandler;
038    import com.liferay.portal.kernel.patcher.PatcherUtil;
039    import com.liferay.portal.kernel.resiliency.mpi.MPIHelperUtil;
040    import com.liferay.portal.kernel.resiliency.spi.agent.annotation.Direction;
041    import com.liferay.portal.kernel.resiliency.spi.agent.annotation.DistributedRegistry;
042    import com.liferay.portal.kernel.resiliency.spi.agent.annotation.MatchType;
043    import com.liferay.portal.kernel.search.IndexerRegistry;
044    import com.liferay.portal.kernel.search.IndexerRegistryUtil;
045    import com.liferay.portal.kernel.util.GetterUtil;
046    import com.liferay.portal.kernel.util.ReleaseInfo;
047    import com.liferay.portal.kernel.util.StringPool;
048    import com.liferay.portal.kernel.util.StringUtil;
049    import com.liferay.portal.kernel.util.Validator;
050    import com.liferay.portal.kernel.util.WebKeys;
051    import com.liferay.portal.plugin.PluginPackageIndexer;
052    import com.liferay.portal.tools.DBUpgrader;
053    import com.liferay.portal.util.PropsValues;
054    import com.liferay.portlet.messageboards.util.MBMessageIndexer;
055    import com.liferay.registry.Registry;
056    import com.liferay.registry.RegistryUtil;
057    import com.liferay.registry.dependency.ServiceDependencyListener;
058    import com.liferay.registry.dependency.ServiceDependencyManager;
059    import com.liferay.taglib.servlet.JspFactorySwapper;
060    
061    import javax.portlet.MimeResponse;
062    import javax.portlet.PortletRequest;
063    
064    import org.apache.struts.tiles.taglib.ComponentConstants;
065    
066    /**
067     * @author Brian Wing Shun Chan
068     * @author Alexander Chow
069     * @author Raymond Aug??
070     */
071    public class StartupAction extends SimpleAction {
072    
073            @Override
074            public void run(String[] ids) throws ActionException {
075                    try {
076                            doRun(ids);
077                    }
078                    catch (RuntimeException re) {
079                            throw re;
080                    }
081                    catch (Exception e) {
082                            throw new ActionException(e);
083                    }
084            }
085    
086            protected void doRun(String[] ids) throws Exception {
087    
088                    // Print release information
089    
090                    System.out.println("Starting " + ReleaseInfo.getReleaseInfo());
091    
092                    // Installed patches
093    
094                    if (_log.isInfoEnabled() && !PatcherUtil.hasInconsistentPatchLevels()) {
095                            String installedPatches = StringUtil.merge(
096                                    PatcherUtil.getInstalledPatches(), StringPool.COMMA_AND_SPACE);
097    
098                            if (Validator.isNull(installedPatches)) {
099                                    _log.info("There are no patches installed");
100                            }
101                            else {
102                                    _log.info(
103                                            "The following patches are installed: " + installedPatches);
104                            }
105                    }
106    
107                    // Portal resiliency
108    
109                    ServiceDependencyManager portalResiliencyServiceDependencyManager =
110                            new ServiceDependencyManager();
111    
112                    portalResiliencyServiceDependencyManager.addServiceDependencyListener(
113                            new PortalResiliencyServiceDependencyLister());
114    
115                    portalResiliencyServiceDependencyManager.registerDependencies(
116                            MessageBus.class, PortalExecutorManager.class);
117    
118                    // Shutdown hook
119    
120                    if (_log.isDebugEnabled()) {
121                            _log.debug("Add shutdown hook");
122                    }
123    
124                    Runtime runtime = Runtime.getRuntime();
125    
126                    runtime.addShutdownHook(new Thread(new ShutdownHook()));
127    
128                    // Indexers
129    
130                    ServiceDependencyManager indexerRegistryServiceDependencyManager =
131                            new ServiceDependencyManager();
132    
133                    indexerRegistryServiceDependencyManager.addServiceDependencyListener(
134                            new ServiceDependencyListener() {
135    
136                                    @Override
137                                    public void dependenciesFulfilled() {
138                                            IndexerRegistryUtil.register(new MBMessageIndexer());
139                                            IndexerRegistryUtil.register(new PluginPackageIndexer());
140                                    }
141    
142                                    @Override
143                                    public void destroy() {
144                                    }
145    
146                            });
147    
148                    indexerRegistryServiceDependencyManager.registerDependencies(
149                            IndexerRegistry.class);
150    
151                    // MySQL version
152    
153                    DB db = DBManagerUtil.getDB();
154    
155                    if ((db.getDBType() == DBType.MYSQL) &&
156                            GetterUtil.getFloat(db.getVersionString()) < 5.6F) {
157    
158                            _log.error(
159                                    "Please upgrade to at least MySQL 5.6.4. The portal no " +
160                                            "longer supports older versions of MySQL.");
161    
162                            System.exit(1);
163                    }
164    
165                    // Upgrade
166    
167                    if (_log.isDebugEnabled()) {
168                            _log.debug("Upgrade database");
169                    }
170    
171                    DBUpgrader.upgrade();
172    
173                    // Verify
174    
175                    if (_log.isDebugEnabled()) {
176                            _log.debug("Verify database");
177                    }
178    
179                    DBUpgrader.verify();
180    
181                    // Cluster master token listener
182    
183                    final Registry registry = RegistryUtil.getRegistry();
184    
185                    ServiceDependencyManager clusterMasterExecutorServiceDependencyManager =
186                            new ServiceDependencyManager();
187    
188                    clusterMasterExecutorServiceDependencyManager.
189                            addServiceDependencyListener(
190                                    new ServiceDependencyListener() {
191    
192                                            @Override
193                                            public void dependenciesFulfilled() {
194                                                    ClusterMasterExecutor clusterMasterExecutor =
195                                                            registry.getService(ClusterMasterExecutor.class);
196    
197                                                    if (!clusterMasterExecutor.isEnabled()) {
198                                                            BackgroundTaskManagerUtil.cleanUpBackgroundTasks();
199                                                    }
200                                            }
201    
202                                            @Override
203                                            public void destroy() {
204                                            }
205    
206                                    });
207    
208                    clusterMasterExecutorServiceDependencyManager.registerDependencies(
209                            BackgroundTaskManager.class, ClusterExecutor.class,
210                            ClusterMasterExecutor.class);
211    
212                    // Liferay JspFactory
213    
214                    JspFactorySwapper.swap();
215    
216                    // Jericho
217    
218                    CachedLoggerProvider.install();
219            }
220    
221            private static final Log _log = LogFactoryUtil.getLog(StartupAction.class);
222    
223            private class PortalResiliencyServiceDependencyLister
224                    implements ServiceDependencyListener {
225    
226                    @Override
227                    public void dependenciesFulfilled() {
228                            Registry registry = RegistryUtil.getRegistry();
229    
230                            MessageBus messageBus = registry.getService(MessageBus.class);
231    
232                            try {
233                                    DistributedRegistry.registerDistributed(
234                                            ComponentConstants.COMPONENT_CONTEXT, Direction.DUPLEX,
235                                            MatchType.POSTFIX);
236                                    DistributedRegistry.registerDistributed(
237                                            MimeResponse.MARKUP_HEAD_ELEMENT, Direction.DUPLEX,
238                                            MatchType.EXACT);
239                                    DistributedRegistry.registerDistributed(
240                                            PortletRequest.LIFECYCLE_PHASE, Direction.DUPLEX,
241                                            MatchType.EXACT);
242                                    DistributedRegistry.registerDistributed(WebKeys.class);
243    
244                                    Intraband intraband = MPIHelperUtil.getIntraband();
245    
246                                    intraband.registerDatagramReceiveHandler(
247                                            SystemDataType.MAILBOX.getValue(),
248                                            new MailboxDatagramReceiveHandler());
249    
250                                    intraband.registerDatagramReceiveHandler(
251                                            SystemDataType.MESSAGE.getValue(),
252                                            new MessageDatagramReceiveHandler(messageBus));
253    
254                                    intraband.registerDatagramReceiveHandler(
255                                            SystemDataType.PROXY.getValue(),
256                                            new IntrabandProxyDatagramReceiveHandler());
257    
258                                    intraband.registerDatagramReceiveHandler(
259                                            SystemDataType.RPC.getValue(),
260                                            new RPCDatagramReceiveHandler());
261    
262                                    if (PropsValues.PORTAL_FABRIC_ENABLED) {
263                                            FabricServerUtil.start();
264                                    }
265                            }
266                            catch (Exception e) {
267                                    throw new IllegalStateException(
268                                            "Unable to initialize portal resiliency", e);
269                            }
270                    }
271    
272                    @Override
273                    public void destroy() {
274                    }
275    
276            }
277    
278    }