com.liferay.portal.servlet.MainServlet.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portal.servlet.MainServlet.java

Source

/**
 * Copyright (c) 2000-2005 Liferay, LLC. All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.liferay.portal.servlet;

import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.PageContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.tiles.TilesUtilImpl;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.dotcms.enterprise.ClusterThreadProxy;
import com.dotmarketing.business.APILocator;
import com.dotmarketing.common.reindex.ReindexThread;
import com.dotmarketing.exception.DotDataException;
import com.dotmarketing.exception.DotRuntimeException;
import com.dotmarketing.servlets.InitServlet;
import com.dotmarketing.startup.StartupTasksExecutor;
import com.dotmarketing.util.Config;
import com.dotmarketing.util.Logger;
import com.httpbridge.webproxy.http.TaskController;
import com.liferay.portal.auth.PrincipalFinder;
import com.liferay.portal.auth.PrincipalThreadLocal;
import com.liferay.portal.ejb.CompanyLocalManagerUtil;
import com.liferay.portal.ejb.PortletManagerUtil;
import com.liferay.portal.ejb.UserManagerUtil;
import com.liferay.portal.events.EventsProcessor;
import com.liferay.portal.events.StartupAction;
import com.liferay.portal.job.JobScheduler;
import com.liferay.portal.model.Company;
import com.liferay.portal.model.Portlet;
import com.liferay.portal.model.User;
import com.liferay.portal.struts.MultiMessageResources;
import com.liferay.portal.struts.PortletRequestProcessor;
import com.liferay.portal.struts.StrutsUtil;
import com.liferay.portal.util.ContentUtil;
import com.liferay.portal.util.CookieKeys;
import com.liferay.portal.util.PortalInstances;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portal.util.PropsUtil;
import com.liferay.portal.util.ShutdownUtil;
import com.liferay.portal.util.WebAppPool;
import com.liferay.portal.util.WebKeys;
import com.liferay.util.CookieUtil;
import com.liferay.util.GetterUtil;
import com.liferay.util.Http;
import com.liferay.util.InstancePool;
import com.liferay.util.ParamUtil;
import com.liferay.util.PwdGenerator;
import com.liferay.util.StringUtil;
import com.liferay.util.servlet.EncryptedServletRequest;
import com.liferay.util.servlet.UploadServletRequest;

/**
 * <a href="MainServlet.java.html"><b><i>View Source</i></b></a>
 * 
 * @author Brian Wing Shun Chan
 * @author Jorge Ferrer
 * @version $Revision: 1.41 $
 * 
 */
public class MainServlet extends ActionServlet {

    public void init(ServletConfig config) throws ServletException {
        synchronized (MainServlet.class) {
            super.init(config);
            Config.initializeConfig();
            com.dotmarketing.util.Config.setMyApp(config.getServletContext());
            // Need the plugin root dir before Hibernate comes up
            try {
                APILocator.getPluginAPI()
                        .setPluginJarDir(new File(config.getServletContext().getRealPath("WEB-INF/lib")));
            } catch (IOException e1) {
                Logger.debug(InitServlet.class, "IOException: " + e1.getMessage(), e1);
            }

            // Checking for execute upgrades
            try {
                StartupTasksExecutor.getInstance().executeUpgrades(config.getServletContext().getRealPath("."));
            } catch (DotRuntimeException e1) {
                throw new ServletException(e1);
            } catch (DotDataException e1) {
                throw new ServletException(e1);
            }

            // Starting the reindexation threads
            ClusterThreadProxy.createThread();
            if (Config.getBooleanProperty("DIST_INDEXATION_ENABLED")) {
                ClusterThreadProxy.startThread(Config.getIntProperty("DIST_INDEXATION_SLEEP", 500),
                        Config.getIntProperty("DIST_INDEXATION_INIT_DELAY", 5000));
            }

            ReindexThread.startThread(Config.getIntProperty("REINDEX_THREAD_SLEEP", 500),
                    Config.getIntProperty("REINDEX_THREAD_INIT_DELAY", 5000));

            try {
                EventsProcessor.process(new String[] { StartupAction.class.getName() }, true);
            } catch (Exception e) {
                Logger.error(this, e.getMessage(), e);
            }

            // Context path

            ServletConfig sc = getServletConfig();
            ServletContext ctx = getServletContext();

            String ctxPath = GetterUtil.get(sc.getInitParameter("ctx_path"), "/");

            ctx.setAttribute(WebKeys.CTX_PATH, StringUtil.replace(ctxPath + "/c", "//", "/"));

            ctx.setAttribute(WebKeys.CAPTCHA_PATH, StringUtil.replace(ctxPath + "/captcha", "//", "/"));

            ctx.setAttribute(WebKeys.IMAGE_PATH, StringUtil.replace(ctxPath + "/image", "//", "/"));

            // Company id

            _companyId = ctx.getInitParameter("company_id");

            ctx.setAttribute(WebKeys.COMPANY_ID, _companyId);

            // Initialize portlets

            try {
                String[] xmls = new String[] { Http.URLtoString(ctx.getResource("/WEB-INF/portlet.xml")),
                        Http.URLtoString(ctx.getResource("/WEB-INF/portlet-ext.xml")),
                        Http.URLtoString(ctx.getResource("/WEB-INF/liferay-portlet.xml")),
                        Http.URLtoString(ctx.getResource("/WEB-INF/liferay-portlet-ext.xml")) };

                PortletManagerUtil.initEAR(xmls);
            } catch (Exception e) {
                Logger.error(this, e.getMessage(), e);
            }

            // Initialize portlets display

            try {
                String xml = Http.URLtoString(ctx.getResource("/WEB-INF/liferay-display.xml"));

                Map oldCategories = (Map) WebAppPool.get(_companyId, WebKeys.PORTLET_DISPLAY);

                Map newCategories = PortletManagerUtil.getEARDisplay(xml);

                Map mergedCategories = PortalUtil.mergeCategories(oldCategories, newCategories);

                WebAppPool.put(_companyId, WebKeys.PORTLET_DISPLAY, mergedCategories);
            } catch (Exception e) {
                Logger.error(this, e.getMessage(), e);
            }

            // Initialize skins
            //
            //         try {
            //            String[] xmls = new String[] { Http.URLtoString(ctx.getResource("/WEB-INF/liferay-skin.xml")),
            //                  Http.URLtoString(ctx.getResource("/WEB-INF/liferay-skin-ext.xml")) };
            //
            //            SkinManagerUtil.init(xmls);
            //         } catch (Exception e) {
            //            Logger.error(this, e.getMessage(), e);
            //         }

            // Check company

            try {
                CompanyLocalManagerUtil.checkCompany(_companyId);
            } catch (Exception e) {
                Logger.error(this, e.getMessage(), e);
            }

            // Check web settings

            try {
                String xml = Http.URLtoString(ctx.getResource("/WEB-INF/web.xml"));

                _checkWebSettings(xml);
            } catch (Exception e) {
                Logger.error(this, e.getMessage(), e);
            }

            // Scheduler

            // try {
            // Iterator itr =
            // PortletManagerUtil.getPortlets(_companyId).iterator();
            //
            // while (itr.hasNext()) {
            // Portlet portlet = (Portlet)itr.next();
            //
            // String className = portlet.getSchedulerClass();
            //
            // if (portlet.isActive() && className != null) {
            // Scheduler scheduler =
            // (Scheduler)InstancePool.get(className);
            //
            // scheduler.schedule();
            // }
            // }
            // }
            // catch (ObjectAlreadyExistsException oaee) {
            // }
            // catch (Exception e) {
            // Logger.error(this,e.getMessage(),e);
            // }

            // Message Resources

            MultiMessageResources messageResources = (MultiMessageResources) ctx.getAttribute(Globals.MESSAGES_KEY);

            messageResources.setServletContext(ctx);

            WebAppPool.put(_companyId, Globals.MESSAGES_KEY, messageResources);

            // Current users

            WebAppPool.put(_companyId, WebKeys.CURRENT_USERS, new TreeMap());

            // HttpBridge

            TaskController.bridgeUserServicePath = "/httpbridge/home";
            TaskController.bridgeHttpServicePath = "/httpbridge/http";
            TaskController.bridgeGotoTag = "(goto)";
            TaskController.bridgeThenTag = "(then)";
            TaskController.bridgePostTag = "(post)";

            // Process startup events

            try {
                EventsProcessor.process(PropsUtil.getArray(PropsUtil.GLOBAL_STARTUP_EVENTS), true);

                EventsProcessor.process(PropsUtil.getArray(PropsUtil.APPLICATION_STARTUP_EVENTS),
                        new String[] { _companyId });
            } catch (Exception e) {
                Logger.error(this, e.getMessage(), e);
            }

            PortalInstances.init(_companyId);
        }
    }

    public void callParentService(HttpServletRequest req, HttpServletResponse res)
            throws IOException, ServletException {

        super.service(req, res);
    }

    public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {

        if (!PortalInstances.matches()) {
            String html = ContentUtil.get("messages/en_US/init.html");

            res.getOutputStream().print(html);

            return;
        }

        if (ShutdownUtil.isShutdown()) {
            String html = ContentUtil.get("messages/en_US/shutdown.html");

            res.getOutputStream().print(html);

            return;
        }
        req.setAttribute("dotcache", "no");
        // Shared session

        HttpSession ses = req.getSession();

        if (!GetterUtil.getBoolean(PropsUtil.get(PropsUtil.TCK_URL))) {
            String sharedSessionId = CookieUtil.get(req.getCookies(), CookieKeys.SHARED_SESSION_ID);

            _log.debug("Shared session id is " + sharedSessionId);

            if (sharedSessionId == null) {
                sharedSessionId = PwdGenerator.getPassword(PwdGenerator.KEY1 + PwdGenerator.KEY2, 12);

                Cookie sharedSessionIdCookie = new Cookie(CookieKeys.SHARED_SESSION_ID, sharedSessionId);
                sharedSessionIdCookie.setPath("/");
                sharedSessionIdCookie.setMaxAge(86400);

                res.addCookie(sharedSessionIdCookie);

                _log.debug("Shared session id is " + sharedSessionId);
            }

            // if (ses.getAttribute(WebKeys.SHARED_SESSION_ID) == null) {
            ses.setAttribute(WebKeys.SHARED_SESSION_ID, sharedSessionId);
            // }

            HttpSession portalSes = (HttpSession) SharedSessionPool.get(sharedSessionId);

            if ((portalSes == null) || (ses != portalSes)) {
                if (portalSes == null) {
                    _log.debug("No session exists in pool");
                } else {
                    _log.debug("Session " + portalSes.getId() + " in pool is old");
                }

                _log.debug("Inserting current session " + ses.getId() + " in pool");

                SharedSessionPool.put(sharedSessionId, ses);
            }
        }

        // Test CAS auto login

        /*
         * ses.setAttribute(
         * com.liferay.portal.auth.CASAutoLogin.CAS_FILTER_USER,
         * "liferay.com.1");
         */

        // CTX

        ServletContext ctx = getServletContext();
        ServletContext portalCtx = ctx.getContext(PropsUtil.get(PropsUtil.PORTAL_CTX));
        if (portalCtx == null) {
            portalCtx = ctx;
        }

        req.setAttribute(WebKeys.CTX, portalCtx);

        // CTX_PATH variable

        String ctxPath = (String) ctx.getAttribute(WebKeys.CTX_PATH);

        if (portalCtx.getAttribute(WebKeys.CTX_PATH) == null) {
            portalCtx.setAttribute(WebKeys.CTX_PATH, ctxPath);
        }

        if (ses.getAttribute(WebKeys.CTX_PATH) == null) {
            ses.setAttribute(WebKeys.CTX_PATH, ctxPath);
        }

        req.setAttribute(WebKeys.CTX_PATH, ctxPath);

        // CAPTCHA_PATH variable

        String captchaPath = (String) ctx.getAttribute(WebKeys.CAPTCHA_PATH);

        if (portalCtx.getAttribute(WebKeys.CAPTCHA_PATH) == null) {
            portalCtx.setAttribute(WebKeys.CAPTCHA_PATH, captchaPath);
        }

        if (ses.getAttribute(WebKeys.CAPTCHA_PATH) == null) {
            ses.setAttribute(WebKeys.CAPTCHA_PATH, captchaPath);
        }

        req.setAttribute(WebKeys.CAPTCHA_PATH, captchaPath);

        // IMAGE_PATH variable

        String imagePath = (String) ctx.getAttribute(WebKeys.IMAGE_PATH);

        if (portalCtx.getAttribute(WebKeys.IMAGE_PATH) == null) {
            portalCtx.setAttribute(WebKeys.IMAGE_PATH, imagePath);
        }

        if (ses.getAttribute(WebKeys.IMAGE_PATH) == null) {
            ses.setAttribute(WebKeys.IMAGE_PATH, imagePath);
        }

        req.setAttribute(WebKeys.IMAGE_PATH, imagePath);

        // WebKeys.COMPANY_ID variable

        String companyId = (String) ctx.getAttribute(WebKeys.COMPANY_ID);

        if (portalCtx.getAttribute(WebKeys.COMPANY_ID) == null) {
            portalCtx.setAttribute(WebKeys.COMPANY_ID, companyId);
        }

        if (ses.getAttribute(WebKeys.COMPANY_ID) == null) {
            ses.setAttribute(WebKeys.COMPANY_ID, companyId);
        }

        req.setAttribute(WebKeys.COMPANY_ID, companyId);

        // Portlet Request Processor

        PortletRequestProcessor portletReqProcessor = (PortletRequestProcessor) portalCtx
                .getAttribute(WebKeys.PORTLET_STRUTS_PROCESSOR);

        if (portletReqProcessor == null) {
            portletReqProcessor = new PortletRequestProcessor(this, getModuleConfig(req));

            portalCtx.setAttribute(WebKeys.PORTLET_STRUTS_PROCESSOR, portletReqProcessor);
        }

        // Tiles definitions factory

        if (portalCtx.getAttribute(TilesUtilImpl.DEFINITIONS_FACTORY) == null) {
            portalCtx.setAttribute(TilesUtilImpl.DEFINITIONS_FACTORY,
                    ctx.getAttribute(TilesUtilImpl.DEFINITIONS_FACTORY));
        }

        // Set character encoding

        String strutsCharEncoding = PropsUtil.get(PropsUtil.STRUTS_CHAR_ENCODING);

        req.setCharacterEncoding(strutsCharEncoding);

        /*
         * if (!BrowserSniffer.is_wml(req)) { res.setContentType(
         * Constants.TEXT_HTML + "; charset=" + strutsCharEncoding); }
         */

        // Determine content type

        String contentType = req.getHeader("Content-Type");

        if ((contentType != null) && (contentType.startsWith("multipart/form-data"))) {

            req = new UploadServletRequest(req);
        } else if (ParamUtil.get(req, WebKeys.ENCRYPT, false)) {
            try {
                Company company = CompanyLocalManagerUtil.getCompany(companyId);

                req = new EncryptedServletRequest(req, company.getKeyObj());
            } catch (Exception e) {
            }
        }

        // Current URL

        String completeURL = Http.getCompleteURL(req);
        if (completeURL.indexOf("j_security_check") != -1) {
            completeURL = ctxPath;
        } else {
            completeURL = completeURL.substring(completeURL.indexOf("://") + 3, completeURL.length());

            completeURL = completeURL.substring(completeURL.indexOf("/"), completeURL.length());
        }

        req.setAttribute(WebKeys.CURRENT_URL, completeURL);

        // Chat server

        // Login

        String userId = PortalUtil.getUserId(req);

        if ((userId != null)) {
            PrincipalThreadLocal.setName(userId);
        }

        if (userId == null) {
            try {
                User user = UserManagerUtil.getDefaultUser(companyId);
                if (ses.getAttribute(Globals.LOCALE_KEY) == null)
                    ses.setAttribute(Globals.LOCALE_KEY, user.getLocale());

            } catch (Exception e) {
                Logger.error(this, e.getMessage(), e);
            }
        }

        // Process pre service events

        try {
            EventsProcessor.process(PropsUtil.getArray(PropsUtil.SERVLET_SERVICE_EVENTS_PRE), req, res);
        } catch (Exception e) {
            Logger.error(this, e.getMessage(), e);

            req.setAttribute(PageContext.EXCEPTION, e);

            StrutsUtil.forward(PropsUtil.get(PropsUtil.SERVLET_SERVICE_EVENTS_PRE_ERROR_PAGE), portalCtx, req, res);
        }

        // Struts service

        callParentService(req, res);

        // Process post service events

        try {
            EventsProcessor.process(PropsUtil.getArray(PropsUtil.SERVLET_SERVICE_EVENTS_POST), req, res);
        } catch (Exception e) {
            Logger.error(this, e.getMessage(), e);
        }

        // Clear the principal associated with this thread

        PrincipalThreadLocal.setName(null);
    }

    public void destroy() {

        // Destroy portlets

        try {
            Iterator itr = PortletManagerUtil.getPortlets(_companyId).iterator();

            while (itr.hasNext()) {
                Portlet portlet = (Portlet) itr.next();

                PortalUtil.destroyPortletInstance(portlet);
            }
        } catch (Exception e) {
            Logger.error(this, e.getMessage(), e);
        }

        // Scheduler

        JobScheduler.shutdown();

        // Parent

        super.destroy();
    }

    private void _checkWebSettings(String xml) throws DocumentException {
        SAXReader reader = new SAXReader();
        reader.setEntityResolver(null);

        Document doc = reader.read(new StringReader(xml));

        Element root = doc.getRootElement();

        int timeout = GetterUtil.getInteger(PropsUtil.get(PropsUtil.SESSION_TIMEOUT));

        Element sessionConfig = root.element("session-config");

        if (sessionConfig != null) {
            String sessionTimeout = sessionConfig.elementText("session-timeout");

            timeout = GetterUtil.get(sessionConfig.elementText("session-timeout"), timeout);
        }

        PropsUtil.set(PropsUtil.SESSION_TIMEOUT, Integer.toString(timeout));
    }

    private static final Log _log = LogFactory.getLog(MainServlet.class);

    private String _companyId;

}