/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.servlet;
import com.liferay.portal.events.EventsProcessorUtil;
import com.liferay.portal.events.StartupAction;
import com.liferay.portal.events.StartupHelperUtil;
import com.liferay.portal.kernel.cache.thread.local.Lifecycle;
import com.liferay.portal.kernel.cache.thread.local.ThreadLocalCacheManager;
import com.liferay.portal.kernel.deploy.hot.HotDeployUtil;
import com.liferay.portal.kernel.exception.NoSuchLayoutException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.Company;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.GroupConstants;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.model.LayoutConstants;
import com.liferay.portal.kernel.model.LayoutTemplate;
import com.liferay.portal.kernel.model.Portlet;
import com.liferay.portal.kernel.model.PortletApp;
import com.liferay.portal.kernel.model.PortletFilter;
import com.liferay.portal.kernel.model.PortletURLListener;
import com.liferay.portal.kernel.model.Theme;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.module.framework.ModuleServiceLifecycle;
import com.liferay.portal.kernel.patcher.PatchInconsistencyException;
import com.liferay.portal.kernel.patcher.PatcherUtil;
import com.liferay.portal.kernel.plugin.PluginPackage;
import com.liferay.portal.kernel.portlet.PortletConfigFactoryUtil;
import com.liferay.portal.kernel.portlet.PortletInstanceFactoryUtil;
import com.liferay.portal.kernel.security.auth.CompanyThreadLocal;
import com.liferay.portal.kernel.security.auth.PrincipalException;
import com.liferay.portal.kernel.security.permission.ResourceActionsUtil;
import com.liferay.portal.kernel.service.CompanyLocalServiceUtil;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.service.LayoutLocalServiceUtil;
import com.liferay.portal.kernel.service.LayoutTemplateLocalServiceUtil;
import com.liferay.portal.kernel.service.PortletLocalServiceUtil;
import com.liferay.portal.kernel.service.ResourceActionLocalServiceUtil;
import com.liferay.portal.kernel.service.ThemeLocalServiceUtil;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.servlet.DynamicServletRequest;
import com.liferay.portal.kernel.servlet.InactiveRequestHandler;
import com.liferay.portal.kernel.servlet.PortalSessionThreadLocal;
import com.liferay.portal.kernel.template.TemplateConstants;
import com.liferay.portal.kernel.template.TemplateManager;
import com.liferay.portal.kernel.util.ClassLoaderUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.InstanceFactory;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalLifecycleUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.PropsKeys;
import com.liferay.portal.kernel.util.ReleaseInfo;
import com.liferay.portal.kernel.util.ServiceProxyFactory;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.kernel.xml.Document;
import com.liferay.portal.kernel.xml.DocumentException;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.kernel.xml.UnsecureSAXReaderUtil;
import com.liferay.portal.plugin.PluginPackageUtil;
import com.liferay.portal.servlet.filters.absoluteredirects.AbsoluteRedirectsResponse;
import com.liferay.portal.servlet.filters.i18n.I18nFilter;
import com.liferay.portal.setup.SetupWizardSampleDataUtil;
import com.liferay.portal.struts.PortletRequestProcessor;
import com.liferay.portal.struts.StrutsUtil;
import com.liferay.portal.util.ExtRegistry;
import com.liferay.portal.util.MaintenanceUtil;
import com.liferay.portal.util.PortalInstances;
import com.liferay.portal.util.PropsUtil;
import com.liferay.portal.util.PropsValues;
import com.liferay.portal.util.ShutdownUtil;
import com.liferay.portlet.PortletBagFactory;
import com.liferay.portlet.PortletFilterFactory;
import com.liferay.portlet.PortletURLListenerFactory;
import com.liferay.registry.Filter;
import com.liferay.registry.Registry;
import com.liferay.registry.RegistryUtil;
import com.liferay.registry.ServiceRegistration;
import com.liferay.registry.dependency.ServiceDependencyListener;
import com.liferay.registry.dependency.ServiceDependencyManager;
import com.liferay.social.kernel.util.SocialConfigurationUtil;
import com.liferay.util.servlet.EncryptedServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import javax.portlet.PortletConfig;
import javax.portlet.PortletContext;
import javax.portlet.PortletException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.PageContext;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.RequestProcessor;
import org.apache.struts.config.ControllerConfig;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.tiles.TilesUtilImpl;
/**
* @author Brian Wing Shun Chan
* @author Jorge Ferrer
* @author Brian Myunghun Kim
*/
public class MainServlet extends ActionServlet {
@Override
public void destroy() {
if (_log.isDebugEnabled()) {
_log.debug("Destroy plugins");
}
_moduleServiceLifecycleServiceRegistration.unregister();
_servletContextServiceRegistration.unregister();
PortalLifecycleUtil.flushDestroys();
List<Portlet> portlets = PortletLocalServiceUtil.getPortlets();
if (_log.isDebugEnabled()) {
_log.debug("Destroy portlets");
}
try {
destroyPortlets(portlets);
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Destroy companies");
}
try {
destroyCompanies();
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Process global shutdown events");
}
try {
processGlobalShutdownEvents();
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Destroy");
}
callParentDestroy();
}
@Override
public void init() throws ServletException {
if (_log.isDebugEnabled()) {
_log.debug("Initialize");
}
ServletContext servletContext = getServletContext();
servletContext.setAttribute(MainServlet.class.getName(), Boolean.TRUE);
callParentInit();
if (_log.isDebugEnabled()) {
_log.debug("Verify patch levels");
}
try {
PatcherUtil.verifyPatchLevels();
}
catch (PatchInconsistencyException pie) {
if (!PropsValues.VERIFY_PATCH_LEVELS_DISABLED) {
_log.error(
"Stopping the server due to the inconsistent patch levels");
if (_log.isWarnEnabled()) {
_log.warn(
"Set the property \"verify.patch.levels.disabled\" " +
"to override stopping the server due to the " +
"inconsistent patch levels",
pie);
}
System.exit(0);
}
}
if (_log.isDebugEnabled()) {
_log.debug("Verify JVM configuration");
}
if (_log.isWarnEnabled()) {
if (!StringPool.DEFAULT_CHARSET_NAME.startsWith("UTF-")) {
StringBundler sb = new StringBundler(4);
sb.append("The default JVM character set \"");
sb.append(StringPool.DEFAULT_CHARSET_NAME);
sb.append("\" is not UTF. Please review the JVM property ");
sb.append("\"file.encoding\".");
_log.warn(sb.toString());
}
String userTimeZone = System.getProperty("user.timezone");
if (!Objects.equals("UTC", userTimeZone) &&
!Objects.equals("GMT", userTimeZone)) {
StringBundler sb = new StringBundler(4);
sb.append("The default JVM time zone \"");
sb.append(userTimeZone);
sb.append("\" is not UTC or GMT. Please review the JVM ");
sb.append("property \"user.timezone\".");
_log.warn(sb.toString());
}
}
if (_log.isDebugEnabled()) {
_log.debug("Process startup events");
}
try {
processStartupEvents();
}
catch (Exception e) {
_log.error(e, e);
System.out.println(
"Stopping the server due to unexpected startup errors");
System.exit(0);
}
if (_log.isDebugEnabled()) {
_log.debug("Initialize server detector");
}
try {
initServerDetector();
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Initialize plugin package");
}
PluginPackage pluginPackage = null;
try {
pluginPackage = initPluginPackage();
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Initialize portlets");
}
List<Portlet> portlets = new ArrayList<>();
try {
portlets.addAll(initPortlets(pluginPackage));
}
catch (Exception e) {
_log.error(e, e);
}
try {
initLayoutTemplates(pluginPackage);
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Initialize social");
}
try {
initSocial(pluginPackage);
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Initialize themes");
}
try {
initThemes(pluginPackage, portlets);
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Initialize web settings");
}
try {
initWebSettings();
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Initialize extension environment");
}
try {
initExt();
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Process global startup events");
}
try {
processGlobalStartupEvents();
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Initialize resource actions");
}
try {
initResourceActions(portlets);
}
catch (Exception e) {
_log.error(e, e);
}
try {
initCompanies();
}
catch (Exception e) {
_log.error(e, e);
}
if (StartupHelperUtil.isDBNew() &&
PropsValues.SETUP_WIZARD_ADD_SAMPLE_DATA) {
try {
SetupWizardSampleDataUtil.addSampleData(
PortalInstances.getDefaultCompanyId());
}
catch (Exception e) {
_log.error(e, e);
}
}
if (_log.isDebugEnabled()) {
_log.debug("Initialize plugins");
}
try {
initPlugins();
}
catch (Exception e) {
_log.error(e, e);
}
servletContext.setAttribute(WebKeys.STARTUP_FINISHED, Boolean.TRUE);
StartupHelperUtil.setStartupFinished(true);
registerPortalInitialized();
ThreadLocalCacheManager.clearAll(Lifecycle.REQUEST);
}
@Override
public void service(
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
if (_log.isDebugEnabled()) {
_log.debug("Process service request");
}
if (processShutdownRequest(request, response)) {
if (_log.isDebugEnabled()) {
_log.debug("Processed shutdown request");
}
return;
}
if (processMaintenanceRequest(request, response)) {
if (_log.isDebugEnabled()) {
_log.debug("Processed maintenance request");
}
return;
}
if (_log.isDebugEnabled()) {
_log.debug("Get company id");
}
long companyId = getCompanyId(request);
if (processCompanyInactiveRequest(request, response, companyId)) {
if (_log.isDebugEnabled()) {
_log.debug("Processed company inactive request");
}
return;
}
try {
if (processGroupInactiveRequest(request, response)) {
if (_log.isDebugEnabled()) {
_log.debug("Processed site inactive request");
}
return;
}
}
catch (Exception e) {
if (e instanceof NoSuchLayoutException) {
if (_log.isDebugEnabled()) {
_log.debug(e, e);
}
}
else {
_log.error(e, e);
}
}
if (_log.isDebugEnabled()) {
_log.debug("Set portal port");
}
setPortalInetSocketAddresses(request);
if (_log.isDebugEnabled()) {
_log.debug("Check variables");
}
checkServletContext(request);
checkPortletRequestProcessor(request);
checkTilesDefinitionsFactory();
if (_log.isDebugEnabled()) {
_log.debug("Handle non-serializable request");
}
if (_log.isDebugEnabled()) {
_log.debug("Encrypt request");
}
request = encryptRequest(request, companyId);
long userId = getUserId(request);
String remoteUser = getRemoteUser(request, userId);
try {
if (_log.isDebugEnabled()) {
_log.debug(
"Authenticate user id " + userId + " and remote user " +
remoteUser);
}
userId = loginUser(
request, response, companyId, userId, remoteUser);
if (_log.isDebugEnabled()) {
_log.debug("Authenticated user id " + userId);
}
}
catch (Exception e) {
_log.error(e, e);
}
if (_log.isDebugEnabled()) {
_log.debug("Set session thread local");
}
PortalSessionThreadLocal.setHttpSession(request.getSession());
if (_log.isDebugEnabled()) {
_log.debug("Process service pre events");
}
if (processServicePre(request, response, userId)) {
if (_log.isDebugEnabled()) {
_log.debug("Processing service pre events has errors");
}
return;
}
if (hasAbsoluteRedirect(request)) {
if (_log.isDebugEnabled()) {
String currentURL = PortalUtil.getCurrentURL(request);
_log.debug(
"Current URL " + currentURL + " has absolute redirect");
}
return;
}
if (!hasThemeDisplay(request)) {
if (_log.isDebugEnabled()) {
String currentURL = PortalUtil.getCurrentURL(request);
_log.debug(
"Current URL " + currentURL +
" does not have a theme display");
}
return;
}
try {
if (_log.isDebugEnabled()) {
_log.debug("Call parent service");
}
callParentService(request, response);
}
finally {
if (_log.isDebugEnabled()) {
_log.debug("Process service post events");
}
processServicePost(request, response);
}
}
protected void callParentDestroy() {
super.destroy();
}
protected void callParentInit() throws ServletException {
super.init();
}
protected void callParentService(
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
super.service(request, response);
}
protected void checkPortletRequestProcessor(HttpServletRequest request)
throws ServletException {
ServletContext servletContext = getServletContext();
PortletRequestProcessor portletReqProcessor =
(PortletRequestProcessor)servletContext.getAttribute(
WebKeys.PORTLET_STRUTS_PROCESSOR);
if (portletReqProcessor == null) {
ModuleConfig moduleConfig = getModuleConfig(request);
portletReqProcessor = PortletRequestProcessor.getInstance(
this, moduleConfig);
servletContext.setAttribute(
WebKeys.PORTLET_STRUTS_PROCESSOR, portletReqProcessor);
}
}
protected void checkServletContext(HttpServletRequest request) {
ServletContext servletContext = getServletContext();
request.setAttribute(WebKeys.CTX, servletContext);
}
protected void checkTilesDefinitionsFactory() {
ServletContext servletContext = getServletContext();
if (servletContext.getAttribute(TilesUtilImpl.DEFINITIONS_FACTORY) !=
null) {
return;
}
servletContext.setAttribute(
TilesUtilImpl.DEFINITIONS_FACTORY,
servletContext.getAttribute(TilesUtilImpl.DEFINITIONS_FACTORY));
}
protected void checkWebSettings(String xml) throws DocumentException {
Document doc = UnsecureSAXReaderUtil.read(xml);
Element root = doc.getRootElement();
int timeout = PropsValues.SESSION_TIMEOUT;
Element sessionConfig = root.element("session-config");
if (sessionConfig != null) {
String sessionTimeout = sessionConfig.elementText(
"session-timeout");
timeout = GetterUtil.getInteger(sessionTimeout, timeout);
}
PropsUtil.set(PropsKeys.SESSION_TIMEOUT, String.valueOf(timeout));
PropsValues.SESSION_TIMEOUT = timeout;
I18nServlet.setLanguageIds(root);
I18nFilter.setLanguageIds(I18nServlet.getLanguageIds());
}
protected void destroyCompanies() throws Exception {
long[] companyIds = PortalInstances.getCompanyIds();
for (long companyId : companyIds) {
destroyCompany(companyId);
}
}
protected void destroyCompany(long companyId) {
if (_log.isDebugEnabled()) {
_log.debug("Process shutdown events");
}
try {
EventsProcessorUtil.process(
PropsKeys.APPLICATION_SHUTDOWN_EVENTS,
PropsValues.APPLICATION_SHUTDOWN_EVENTS,
new String[] {String.valueOf(companyId)});
}
catch (Exception e) {
_log.error(e, e);
}
}
protected void destroyPortlets(List<Portlet> portlets) throws Exception {
for (Portlet portlet : portlets) {
PortletInstanceFactoryUtil.destroy(portlet);
Map<String, PortletFilter> portletFilters =
portlet.getPortletFilters();
for (PortletFilter portletFilter : portletFilters.values()) {
PortletFilterFactory.destroy(portletFilter);
}
}
}
protected HttpServletRequest encryptRequest(
HttpServletRequest request, long companyId) {
boolean encryptRequest = ParamUtil.getBoolean(request, WebKeys.ENCRYPT);
if (!encryptRequest) {
return request;
}
try {
Company company = CompanyLocalServiceUtil.getCompanyById(companyId);
request = new EncryptedServletRequest(request, company.getKeyObj());
}
catch (Exception e) {
}
return request;
}
protected long getCompanyId(HttpServletRequest request) {
return PortalInstances.getCompanyId(request);
}
protected String getRemoteUser(HttpServletRequest request, long userId) {
String remoteUser = request.getRemoteUser();
if (!PropsValues.PORTAL_JAAS_ENABLE) {
HttpSession session = request.getSession();
String jRemoteUser = (String)session.getAttribute("j_remoteuser");
if (jRemoteUser != null) {
remoteUser = jRemoteUser;
}
}
if ((userId > 0) && (remoteUser == null)) {
remoteUser = String.valueOf(userId);
}
return remoteUser;
}
@Override
protected synchronized RequestProcessor getRequestProcessor(
ModuleConfig moduleConfig)
throws ServletException {
ServletContext servletContext = getServletContext();
String key = Globals.REQUEST_PROCESSOR_KEY + moduleConfig.getPrefix();
RequestProcessor requestProcessor =
(RequestProcessor)servletContext.getAttribute(key);
if (requestProcessor == null) {
ControllerConfig controllerConfig =
moduleConfig.getControllerConfig();
try {
requestProcessor =
(RequestProcessor)InstanceFactory.newInstance(
ClassLoaderUtil.getPortalClassLoader(),
controllerConfig.getProcessorClass());
}
catch (Exception e) {
throw new ServletException(e);
}
requestProcessor.init(this, moduleConfig);
servletContext.setAttribute(key, requestProcessor);
}
return requestProcessor;
}
protected long getUserId(HttpServletRequest request) {
return PortalUtil.getUserId(request);
}
protected boolean hasAbsoluteRedirect(HttpServletRequest request) {
if (request.getAttribute(AbsoluteRedirectsResponse.class.getName()) ==
null) {
return false;
}
else {
return true;
}
}
protected boolean hasThemeDisplay(HttpServletRequest request) {
if (request.getAttribute(WebKeys.THEME_DISPLAY) == null) {
return false;
}
else {
return true;
}
}
protected void initCompanies() throws Exception {
if (_log.isDebugEnabled()) {
_log.debug("Initialize companies");
}
ServletContext servletContext = getServletContext();
try {
String[] webIds = PortalInstances.getWebIds();
for (String webId : webIds) {
PortalInstances.initCompany(servletContext, webId);
}
}
finally {
CompanyThreadLocal.setCompanyId(
PortalInstances.getDefaultCompanyId());
}
}
protected void initExt() throws Exception {
ServletContext servletContext = getServletContext();
ExtRegistry.registerPortal(servletContext);
}
protected void initLayoutTemplates(final PluginPackage pluginPackage) {
ServiceDependencyManager serviceDependencyManager =
new ServiceDependencyManager();
serviceDependencyManager.addServiceDependencyListener(
new ServiceDependencyListener() {
@Override
public void dependenciesFulfilled() {
try {
if (_log.isDebugEnabled()) {
_log.debug("Initialize layout templates");
}
ServletContext servletContext = getServletContext();
String[] xmls = new String[] {
HttpUtil.URLtoString(
servletContext.getResource(
"/WEB-INF/liferay-layout-templates.xml")),
HttpUtil.URLtoString(
servletContext.getResource(
"/WEB-INF" +
"/liferay-layout-templates-ext.xml"))
};
List<LayoutTemplate> layoutTemplates =
LayoutTemplateLocalServiceUtil.init(
servletContext, xmls, pluginPackage);
servletContext.setAttribute(
WebKeys.PLUGIN_LAYOUT_TEMPLATES, layoutTemplates);
}
catch (Exception e) {
_log.error(e, e);
}
}
@Override
public void destroy() {
}
});
Registry registry = RegistryUtil.getRegistry();
Filter freeMarkerFilter = registry.getFilter(
"(&(language.type=" + TemplateConstants.LANG_TYPE_FTL +
")(objectClass=" + TemplateManager.class.getName() + "))");
Filter velocityFilter = registry.getFilter(
"(&(language.type=" + TemplateConstants.LANG_TYPE_VM +
")(objectClass=" + TemplateManager.class.getName() + "))");
serviceDependencyManager.registerDependencies(
freeMarkerFilter, velocityFilter);
}
protected PluginPackage initPluginPackage() throws Exception {
ServletContext servletContext = getServletContext();
return PluginPackageUtil.readPluginPackageServletContext(
servletContext);
}
protected void initPlugins() throws Exception {
HotDeployUtil.setCapturePrematureEvents(false);
PortalLifecycleUtil.flushInits();
}
protected void initPortletApp(
Portlet portlet, ServletContext servletContext)
throws PortletException {
PortletApp portletApp = portlet.getPortletApp();
PortletConfig portletConfig = PortletConfigFactoryUtil.create(
portlet, servletContext);
PortletContext portletContext = portletConfig.getPortletContext();
Set<PortletFilter> portletFilters = portletApp.getPortletFilters();
for (PortletFilter portletFilter : portletFilters) {
PortletFilterFactory.create(portletFilter, portletContext);
}
Set<PortletURLListener> portletURLListeners =
portletApp.getPortletURLListeners();
for (PortletURLListener portletURLListener : portletURLListeners) {
PortletURLListenerFactory.create(portletURLListener);
}
}
protected List<Portlet> initPortlets(PluginPackage pluginPackage)
throws Exception {
ServletContext servletContext = getServletContext();
String[] xmls = new String[PropsValues.PORTLET_CONFIGS.length];
for (int i = 0; i < PropsValues.PORTLET_CONFIGS.length; i++) {
xmls[i] = HttpUtil.URLtoString(
servletContext.getResource(PropsValues.PORTLET_CONFIGS[i]));
}
PortletLocalServiceUtil.initEAR(servletContext, xmls, pluginPackage);
PortletBagFactory portletBagFactory = new PortletBagFactory();
portletBagFactory.setClassLoader(
ClassLoaderUtil.getPortalClassLoader());
portletBagFactory.setServletContext(servletContext);
portletBagFactory.setWARFile(false);
List<Portlet> portlets = PortletLocalServiceUtil.getPortlets();
for (int i = 0; i < portlets.size(); i++) {
Portlet portlet = portlets.get(i);
portletBagFactory.create(portlet);
if (i == 0) {
initPortletApp(portlet, servletContext);
}
}
servletContext.setAttribute(WebKeys.PLUGIN_PORTLETS, portlets);
return portlets;
}
protected void initResourceActions(List<Portlet> portlets)
throws Exception {
for (Portlet portlet : portlets) {
List<String> portletActions =
ResourceActionsUtil.getPortletResourceActions(portlet);
ResourceActionLocalServiceUtil.checkResourceActions(
portlet.getPortletId(), portletActions);
List<String> modelNames =
ResourceActionsUtil.getPortletModelResources(
portlet.getPortletId());
for (String modelName : modelNames) {
List<String> modelActions =
ResourceActionsUtil.getModelResourceActions(modelName);
ResourceActionLocalServiceUtil.checkResourceActions(
modelName, modelActions);
}
}
}
/**
* @deprecated As of 7.0.0, with no direct replacement
*/
@Deprecated
protected void initServerDetector() throws Exception {
}
protected void initSocial(PluginPackage pluginPackage) throws Exception {
ClassLoader classLoader = ClassLoaderUtil.getPortalClassLoader();
ServletContext servletContext = getServletContext();
String[] xmls = new String[] {
HttpUtil.URLtoString(
servletContext.getResource("/WEB-INF/liferay-social.xml")),
HttpUtil.URLtoString(
servletContext.getResource("/WEB-INF/liferay-social-ext.xml"))
};
SocialConfigurationUtil.read(classLoader, xmls);
}
protected void initThemes(
PluginPackage pluginPackage, List<Portlet> portlets)
throws Exception {
ServletContext servletContext = getServletContext();
String[] xmls = new String[] {
HttpUtil.URLtoString(
servletContext.getResource(
"/WEB-INF/liferay-look-and-feel.xml")),
HttpUtil.URLtoString(
servletContext.getResource(
"/WEB-INF/liferay-look-and-feel-ext.xml"))
};
List<Theme> themes = ThemeLocalServiceUtil.init(
servletContext, null, true, xmls, pluginPackage);
servletContext.setAttribute(WebKeys.PLUGIN_THEMES, themes);
}
protected void initWebSettings() throws Exception {
ServletContext servletContext = getServletContext();
String xml = HttpUtil.URLtoString(
servletContext.getResource("/WEB-INF/web.xml"));
checkWebSettings(xml);
}
protected long loginUser(
HttpServletRequest request, HttpServletResponse response,
long companyId, long userId, String remoteUser)
throws PortalException {
if ((userId > 0) || (remoteUser == null)) {
return userId;
}
userId = GetterUtil.getLong(remoteUser);
User user = UserLocalServiceUtil.getUserById(userId);
if (!user.isDefaultUser()) {
EventsProcessorUtil.process(
PropsKeys.LOGIN_EVENTS_PRE, PropsValues.LOGIN_EVENTS_PRE,
request, response);
if (PropsValues.USERS_UPDATE_LAST_LOGIN ||
(user.getLastLoginDate() == null)) {
user = UserLocalServiceUtil.updateLastLogin(
userId, request.getRemoteAddr());
}
}
if (request.getAttribute(WebKeys.USER) != null) {
request.setAttribute(WebKeys.USER, user);
request.setAttribute(WebKeys.USER_ID, Long.valueOf(userId));
}
HttpSession session = request.getSession();
session.setAttribute(Globals.LOCALE_KEY, user.getLocale());
session.setAttribute(WebKeys.USER, user);
session.setAttribute(WebKeys.USER_ID, Long.valueOf(userId));
session.removeAttribute("j_remoteuser");
if (!user.isDefaultUser()) {
EventsProcessorUtil.process(
PropsKeys.LOGIN_EVENTS_POST, PropsValues.LOGIN_EVENTS_POST,
request, response);
}
return userId;
}
protected boolean processCompanyInactiveRequest(
HttpServletRequest request, HttpServletResponse response,
long companyId)
throws IOException {
if (PortalInstances.isCompanyActive(companyId)) {
return false;
}
_inactiveRequesthandler.processInactiveRequest(
request, response,
"this-instance-is-inactive-please-contact-the-administrator");
return true;
}
protected void processGlobalShutdownEvents() throws Exception {
EventsProcessorUtil.process(
PropsKeys.GLOBAL_SHUTDOWN_EVENTS,
PropsValues.GLOBAL_SHUTDOWN_EVENTS);
super.destroy();
}
protected void processGlobalStartupEvents() throws Exception {
EventsProcessorUtil.process(
PropsKeys.GLOBAL_STARTUP_EVENTS, PropsValues.GLOBAL_STARTUP_EVENTS);
}
protected boolean processGroupInactiveRequest(
HttpServletRequest request, HttpServletResponse response)
throws IOException, PortalException {
long plid = ParamUtil.getLong(request, "p_l_id");
if (plid <= 0) {
return false;
}
Layout layout = LayoutLocalServiceUtil.getLayout(plid);
Group group = layout.getGroup();
if (GroupLocalServiceUtil.isLiveGroupActive(group)) {
return false;
}
_inactiveRequesthandler.processInactiveRequest(
request, response,
"this-site-is-inactive-please-contact-the-administrator");
return true;
}
/**
* @deprecated As of 7.0.0, with no direct replacement
*/
@Deprecated
protected void processInactiveRequest(
HttpServletRequest request, HttpServletResponse response,
String messageKey)
throws IOException {
}
protected boolean processMaintenanceRequest(
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
if (!MaintenanceUtil.isMaintaining()) {
return false;
}
RequestDispatcher requestDispatcher = request.getRequestDispatcher(
"/html/portal/maintenance.jsp");
requestDispatcher.include(request, response);
return true;
}
protected void processServicePost(
HttpServletRequest request, HttpServletResponse response) {
try {
EventsProcessorUtil.process(
PropsKeys.SERVLET_SERVICE_EVENTS_POST,
PropsValues.SERVLET_SERVICE_EVENTS_POST, request, response);
}
catch (Exception e) {
_log.error(e, e);
}
}
protected boolean processServicePre(
HttpServletRequest request, HttpServletResponse response,
long userId)
throws IOException, ServletException {
try {
EventsProcessorUtil.process(
PropsKeys.SERVLET_SERVICE_EVENTS_PRE,
PropsValues.SERVLET_SERVICE_EVENTS_PRE, request, response);
}
catch (Exception e) {
Throwable cause = e.getCause();
if (cause instanceof NoSuchLayoutException) {
sendError(
HttpServletResponse.SC_NOT_FOUND, cause, request, response);
return true;
}
else if (cause instanceof PrincipalException) {
processServicePrePrincipalException(
cause, userId, request, response);
return true;
}
_log.error(e, e);
request.setAttribute(PageContext.EXCEPTION, e);
ServletContext servletContext = getServletContext();
StrutsUtil.forward(
PropsValues.SERVLET_SERVICE_EVENTS_PRE_ERROR_PAGE,
servletContext, request, response);
return true;
}
if (_HTTP_HEADER_VERSION_VERBOSITY_DEFAULT) {
}
else if (_HTTP_HEADER_VERSION_VERBOSITY_PARTIAL) {
response.addHeader(
_LIFERAY_PORTAL_REQUEST_HEADER, ReleaseInfo.getName());
}
else {
response.addHeader(
_LIFERAY_PORTAL_REQUEST_HEADER, ReleaseInfo.getReleaseInfo());
}
return false;
}
protected void processServicePrePrincipalException(
Throwable t, long userId, HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
if (userId > 0) {
sendError(
HttpServletResponse.SC_UNAUTHORIZED, t, request, response);
return;
}
String redirect = PortalUtil.getPathMain().concat("/portal/login");
String currentURL = PortalUtil.getCurrentURL(request);
redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
long plid = ParamUtil.getLong(request, "p_l_id");
if (plid > 0) {
try {
redirect = HttpUtil.addParameter(redirect, "refererPlid", plid);
Layout layout = LayoutLocalServiceUtil.getLayout(plid);
Group group = layout.getGroup();
plid = group.getDefaultPublicPlid();
if ((plid == LayoutConstants.DEFAULT_PLID) ||
group.isStagingGroup()) {
Group guestGroup = GroupLocalServiceUtil.getGroup(
layout.getCompanyId(), GroupConstants.GUEST);
plid = guestGroup.getDefaultPublicPlid();
}
redirect = HttpUtil.addParameter(redirect, "p_l_id", plid);
}
catch (Exception e) {
}
}
response.sendRedirect(redirect);
}
protected boolean processShutdownRequest(
HttpServletRequest request, HttpServletResponse response)
throws IOException {
if (!ShutdownUtil.isShutdown()) {
return false;
}
String messageKey = ShutdownUtil.getMessage();
if (Validator.isNull(messageKey)) {
messageKey = "the-system-is-shutdown-please-try-again-later";
}
_inactiveRequesthandler.processInactiveRequest(
request, response, messageKey);
return true;
}
protected void processStartupEvents() throws Exception {
StartupAction startupAction = new StartupAction();
startupAction.run(null);
}
protected void registerPortalInitialized() {
Registry registry = RegistryUtil.getRegistry();
Map<String, Object> properties = new HashMap<>();
properties.put("module.service.lifecycle", "portal.initialized");
properties.put("service.vendor", ReleaseInfo.getVendor());
properties.put("service.version", ReleaseInfo.getVersion());
_moduleServiceLifecycleServiceRegistration = registry.registerService(
ModuleServiceLifecycle.class, new ModuleServiceLifecycle() {},
properties);
ServletContext servletContext = getServletContext();
properties = new HashMap<>();
Object serverContainer = servletContext.getAttribute(
"javax.websocket.server.ServerContainer");
if (serverContainer != null) {
properties.put("websocket.active", Boolean.TRUE);
}
else {
if (_log.isInfoEnabled()) {
_log.info("A WebSocket server container is not registered");
}
}
properties.put("bean.id", ServletContext.class.getName());
properties.put("original.bean", Boolean.TRUE);
properties.put("service.vendor", ReleaseInfo.getVendor());
_servletContextServiceRegistration = registry.registerService(
ServletContext.class, servletContext, properties);
}
protected void sendError(
int status, Throwable t, HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
DynamicServletRequest dynamicRequest = new DynamicServletRequest(
request);
// Reset layout params or there will be an infinite loop
dynamicRequest.setParameter("p_l_id", StringPool.BLANK);
dynamicRequest.setParameter("groupId", StringPool.BLANK);
dynamicRequest.setParameter("layoutId", StringPool.BLANK);
dynamicRequest.setParameter("privateLayout", StringPool.BLANK);
PortalUtil.sendError(status, (Exception)t, dynamicRequest, response);
}
protected void setPortalInetSocketAddresses(HttpServletRequest request) {
PortalUtil.setPortalInetSocketAddresses(request);
}
private static final boolean _HTTP_HEADER_VERSION_VERBOSITY_DEFAULT =
StringUtil.equalsIgnoreCase(
PropsValues.HTTP_HEADER_VERSION_VERBOSITY, ReleaseInfo.getName());
private static final boolean _HTTP_HEADER_VERSION_VERBOSITY_PARTIAL =
StringUtil.equalsIgnoreCase(
PropsValues.HTTP_HEADER_VERSION_VERBOSITY, "partial");
private static final String _LIFERAY_PORTAL_REQUEST_HEADER =
"Liferay-Portal";
private static final Log _log = LogFactoryUtil.getLog(MainServlet.class);
private static volatile InactiveRequestHandler _inactiveRequesthandler =
ServiceProxyFactory.newServiceTrackedInstance(
InactiveRequestHandler.class, MainServlet.class,
"_inactiveRequesthandler", false);
private ServiceRegistration<ModuleServiceLifecycle>
_moduleServiceLifecycleServiceRegistration;
private ServiceRegistration<ServletContext>
_servletContextServiceRegistration;
}