com.concursive.connect.web.controller.servlets.URLControllerServlet.java Source code

Java tutorial

Introduction

Here is the source code for com.concursive.connect.web.controller.servlets.URLControllerServlet.java

Source

/*
 * ConcourseConnect
 * Copyright 2009 Concursive Corporation
 * http://www.concursive.com
 *
 * This file is part of ConcourseConnect, an open source social business
 * software and community platform.
 *
 * Concursive ConcourseConnect is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License as published
 * by the Free Software Foundation, version 3 of the License.
 *
 * Under the terms of the GNU Affero General Public License you must release the
 * complete source code for any application that uses any part of ConcourseConnect
 * (system header files and libraries used by the operating system are excluded).
 * These terms must be included in any work that has ConcourseConnect components.
 * If you are developing and distributing open source applications under the
 * GNU Affero General Public License, then you are free to use ConcourseConnect
 * under the GNU Affero General Public License.
 *
 * If you are deploying a web site in which users interact with any portion of
 * ConcourseConnect over a network, the complete source code changes must be made
 * available.  For example, include a link to the source archive directly from
 * your web site.
 *
 * For OEMs, ISVs, SIs and VARs who distribute ConcourseConnect with their
 * products, and do not license and distribute their source code under the GNU
 * Affero General Public License, Concursive provides a flexible commercial
 * license.
 *
 * To anyone in doubt, we recommend the commercial license. Our commercial license
 * is competitively priced and will eliminate any confusion about how
 * ConcourseConnect can be used and distributed.
 *
 * ConcourseConnect 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 Affero General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with ConcourseConnect.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Attribution Notice: ConcourseConnect is an Original Work of software created
 * by Concursive Corporation
 */
package com.concursive.connect.web.controller.servlets;

import com.concursive.commons.db.ConnectionElement;
import com.concursive.commons.db.ConnectionPool;
import com.concursive.commons.text.StringUtils;
import com.concursive.commons.web.URLFactory;
import com.concursive.connect.cms.portal.beans.PortalBean;
import com.concursive.connect.config.ApplicationPrefs;
import com.concursive.connect.web.controller.beans.URLControllerBean;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.concursive.connect.Constants;
import java.io.IOException;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * This servlet receives requests as mapped in web.xml; it is used for executing
 * a RequestDispatcher based on simple URLs; since not all pages have been
 * implemented as portlets there are some legacy mappings done here
 *
 * @author matt rajkowski
 * @created Jun 12, 2008
 */
public class URLControllerServlet extends HttpServlet {

    private static Log LOG = LogFactory.getLog(URLControllerServlet.class);

    public void init() {
    }

    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
        LOG.debug("service called");
        LOG.debug("requestCharacterEncoding=" + request.getCharacterEncoding());
        try {
            request.setCharacterEncoding("UTF-8");
        } catch (Exception e) {
            LOG.warn("Unsupported encoding");
        }

        // Check the preferences to see if the correct domain name is being used, else do a redirect
        ApplicationPrefs prefs = (ApplicationPrefs) request.getSession().getServletContext()
                .getAttribute("applicationPrefs");
        boolean redirect = false;

        String contextPath = request.getContextPath();
        String uri = request.getRequestURI();
        String queryString = request.getQueryString();
        String path = uri.substring(contextPath.length()) + (queryString == null ? "" : "?" + queryString);
        LOG.debug("path: " + path);
        request.setAttribute("requestedURL", path);

        // It's important the user is using the correct URL for accessing content;
        // The portal has it's own redirect scheme, this is a another catch all
        // to see if an old domain name or context is used
        PortalBean bean = new PortalBean(request);
        String expectedDomainName = prefs.get(ApplicationPrefs.WEB_DOMAIN_NAME);
        LOG.debug("expectedDomainName: " + expectedDomainName);
        LOG.debug("domainName: " + bean.getServerName());
        String expectedContext = prefs.get(ApplicationPrefs.WEB_CONTEXT);
        LOG.debug("expectedContextPath: " + expectedContext);
        LOG.debug("contextPath: " + contextPath);
        if (StringUtils.hasText(expectedContext) && !expectedContext.equals(contextPath)
                || (expectedDomainName != null && path.length() > 0 && !"127.0.0.1".equals(bean.getServerName())
                        && !"127.0.0.1".equals(expectedDomainName) && !"localhost".equals(bean.getServerName())
                        && !"localhost".equals(expectedDomainName) && !bean.getServerName().startsWith("10.")
                        && !bean.getServerName().startsWith("172.") && !bean.getServerName().startsWith("192.")
                        && !bean.getServerName().equals(expectedDomainName))) {
            if (uri.length() > 0 && !uri.substring(1).equals(prefs.get("PORTAL.INDEX"))) {
                String newUrl = URLFactory.createURL(prefs.getPrefs()) + path;
                request.setAttribute("redirectTo", newUrl);
                LOG.debug("redirectTo: " + newUrl);
                request.removeAttribute(Constants.REQUEST_PAGE_LAYOUT);
                redirect = true;
            }
        }

        if (redirect) {
            try {
                RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/redirect301.jsp");
                dispatcher.forward(request, response);
            } catch (Exception e) {

            }
        } else {
            mapToMVCAction(request, response);
        }
    }

    private void mapToMVCAction(HttpServletRequest request, HttpServletResponse response) throws IOException {

        // Translate the URI into its parts
        // URLControllerServlet-> contextPath: /context
        // URLControllerServlet-> path: /show/something
        String uri = request.getRequestURI();
        String contextPath = request.getContextPath();

        LOG.debug("Using uri: " + uri);
        URLControllerBean bean = new URLControllerBean(uri, contextPath);
        String queryString = request.getQueryString();
        String path = uri.substring(contextPath.length()) + (queryString == null ? "" : "?" + queryString);
        request.setAttribute("requestedURL", path);
        LOG.debug("Requested path: " + path);

        // Map to the MVC Action
        String mappedPath = null;
        try {
            if (bean.getAction().equals(URLControllerBean.EDITOR)) {
                mappedPath = "ProjectPortal.do?command=Builder";
            } else if (bean.getAction().equals(URLControllerBean.REGISTER)) {
                mappedPath = "page/register";
            } else if (bean.getAction().equals(URLControllerBean.LOGIN)) {
                if (bean.getDomainObject() == null) {
                    mappedPath = "Login.do?command=Default";
                } else {
                    mappedPath = "Login.do?command=Login";
                }
            } else if (bean.getAction().equals(URLControllerBean.LOGOUT)) {
                mappedPath = "Login.do?command=Logout";
            } else if (bean.getAction().equals(URLControllerBean.RSS)) {
                mappedPath = "ProjectManagement.do?command=RSS";
            } else if (bean.getAction().equals(URLControllerBean.RSVP)) {
                mappedPath = "";
            } else if (bean.getAction().equals(URLControllerBean.INVITATIONS)) {
                mappedPath = "ProjectManagement.do?command=RSVP";
            } else if (bean.getAction().equals(URLControllerBean.SETUP)) {
                mappedPath = "Setup.do";
            } else if (bean.getAction().equals(URLControllerBean.ADMIN)) {
                mappedPath = LinkGenerator.getAdminPortalLink(bean);
            } else if (bean.getAction().equals(URLControllerBean.CATALOG)) {
                mappedPath = "Order.do";
            } else if (bean.getAction().equals(URLControllerBean.CONTACT_US)) {
                mappedPath = "ContactUs.do";
            } else if (bean.getAction().equals(URLControllerBean.PAGE)) {
                mappedPath = "Portal.do?command=ShowPortalPage&name="
                        + URLEncoder.encode(bean.getDomainObject(), "UTF-8")
                        + (StringUtils.hasText(bean.getObjectValue())
                                ? "&view=" + URLEncoder.encode(bean.getObjectValue(), "UTF-8")
                                : "")
                        + (StringUtils.hasText(bean.getParams()) ? "&params=" + bean.getParams() : "");
            } else if (bean.getAction().equals(URLControllerBean.IMAGE)) {
                mappedPath = "Portal.do?command=Img&url=" + bean.getDomainObject();
            } else if (bean.getAction().equals(URLControllerBean.SETTINGS)) {
                mappedPath = "Profile.do";
            } else if (bean.getAction().equals(URLControllerBean.PROFILE)) {
                mappedPath = "ProjectManagement.do?command=Dashboard";
            } else if (bean.getAction().equals(URLControllerBean.BROWSE)) {
                mappedPath = "ProjectManagement.do?command=ProjectList";
            } else if (bean.getAction().equals(URLControllerBean.SEARCH)) {
                mappedPath = "Search.do?command=Default";
            } else if (bean.getAction().equals(URLControllerBean.SUPPORT)) {
                mappedPath = "ContactUs.do";
            } else if (bean.getAction().equals(URLControllerBean.REPORTS)) {
                mappedPath = "Reports.do?command=List";
            } else if (bean.getAction().equals(URLControllerBean.BADGE)) {
                mappedPath = "Badges.do?command=Details&id=" + bean.getObjectValue();
            } else if (bean.getAction().equals(URLControllerBean.MANAGEMENT_CRM)) {
                mappedPath = LinkGenerator.getCRMLink();
            } else if (bean.getAction().equals(URLControllerBean.SHOW)) {
                if (bean.getDomainObject() == null) {
                    mappedPath = LinkGenerator.getProjectPortalLink(bean);
                } else if ("image".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getProfileImageLink(bean.getProjectId(), bean.getObjectValue());
                } else if ("dashboard".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getDashboardLink(bean.getProjectId(), bean.getObjectValue());
                } else if ("blog-image".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getBlogImageLink(bean.getProjectId(), bean.getObjectValue());
                } else if ("wiki-image".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getWikiImageLink(bean.getProjectId(), bean.getObjectValue());
                } else if ("lists".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getListsLink(bean.getProjectId());
                } else if ("list".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getListDetailsLink(bean.getProjectId(), bean.getObjectValueAsInt());
                } else if ("plans".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getPlanLink(bean.getProjectId());
                } else if ("plan".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getPlanLink(bean.getProjectId(), bean.getObjectValueAsInt());
                } else if ("issues".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getTicketsLink(bean.getProjectId());
                } else if ("issue".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getTicketDetailsLink(bean.getProjectId(),
                            bean.getObjectValueAsInt());
                } else if ("details".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getDetailsLink(bean.getProjectId());
                } else if ("setup".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getSetupLink(bean.getProjectId());
                } else if ("customize".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getCustomizeLink(bean.getProjectId());
                } else if ("permissions".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getPermissionsLink(bean.getProjectId());
                } else if ("customize-style".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getCustomizeStyleLink(bean.getProjectId());
                } else if ("style-image".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getStyleImageLink(bean.getProjectId(), bean.getObjectValue());
                } else if ("app".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getPageLink(bean.getProjectId(), bean.getObjectValue());
                } else if ("tools".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getToolsLink(bean.getProjectId(), bean.getObjectValue());
                } else if ("crm-account".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getCRMAccountLink(bean.getProjectId(), bean.getObjectValue());
                } else {
                    mappedPath = LinkGenerator.getProjectPortalLink(bean);
                }
            } else if (bean.getAction().equals(URLControllerBean.CREATE)) {
                if (bean.getDomainObject() == null) {
                    mappedPath = "ProjectManagement.do?command=ModifyProject&pid=" + bean.getProjectId()
                            + "&return=ProjectCenter";
                } else {
                    mappedPath = LinkGenerator.getProjectPortalLink(bean);
                }
            } else if (bean.getAction().equals(URLControllerBean.MODIFY)) {
                if (bean.getDomainObject() == null) {
                    mappedPath = "ProjectManagement.do?command=ModifyProject&pid=" + bean.getProjectId()
                            + "&return=ProjectCenter";
                } else {
                    mappedPath = LinkGenerator.getProjectPortalLink(bean);
                }
            } else if (bean.getAction().equals(URLControllerBean.REMOVE)) {
                if ("image".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getRemoveProfileImageLink(bean.getProjectId(),
                            bean.getObjectValue());
                }
            } else if (bean.getAction().equals(URLControllerBean.SET)) {
                if ("image".equals(bean.getDomainObject())) {
                    mappedPath = LinkGenerator.getSetProfileImageLink(bean.getProjectId(), bean.getObjectValue());
                } else {
                    mappedPath = LinkGenerator.getProjectPortalLink(bean);
                }
            } else if (bean.getAction().equals(URLControllerBean.ACCEPT)) {
                mappedPath = "ProjectManagement.do?command=AcceptProject&pid=" + bean.getProjectId();
            } else if (bean.getAction().equals(URLControllerBean.REJECT)) {
                mappedPath = "ProjectManagement.do?command=RejectProject&pid=" + bean.getProjectId();
            } else if (bean.getAction().equals(URLControllerBean.DOWNLOAD)
                    || bean.getAction().equals(URLControllerBean.STREAM)) {
                if ("file".equals(bean.getDomainObject())) {
                    mappedPath = "ProjectManagementFiles.do?command=Download" + "&pid=" + bean.getProjectId()
                            + "&fid=" + bean.getObjectValue()
                            + (bean.getParams() != null ? "&ver=" + bean.getParams() : "")
                            + (bean.getAction().equals(URLControllerBean.STREAM) ? "&view=true" : "");
                } else {
                    mappedPath = LinkGenerator.getProjectActionLink(bean);
                }
            } else {
                if (bean.getProjectId() > -1) {
                    mappedPath = LinkGenerator.getProjectPortalLink(bean);
                }
            }
        } catch (Exception ex) {
            String msg = "URLControllerServletError1";
            LOG.error(msg, ex);
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, msg);
        }

        try {
            String forwardPath = null;
            if (mappedPath == null) {
                forwardPath = "/redirect404.jsp";
                LOG.error("A mapped path was not found for action: " + path);
            } else {
                forwardPath = "/" + mappedPath;
                LOG.debug("Forwarding request to: " + forwardPath);
            }
            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(forwardPath);
            dispatcher.forward(request, response);
        } catch (Exception ex) {
            String msg = "URLControllerServletError2";
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, msg);
        }

    }

    protected static ConnectionElement getConnectionElement(ServletContext context) {
        ApplicationPrefs prefs = (ApplicationPrefs) context.getAttribute("applicationPrefs");
        ConnectionElement ce = new ConnectionElement();
        ce.setDriver(prefs.get("SITE.DRIVER"));
        ce.setUrl(prefs.get("SITE.URL"));
        ce.setUsername(prefs.get("SITE.USER"));
        ce.setPassword(prefs.get("SITE.PASSWORD"));
        return ce;
    }

    protected static Connection getConnection(ServletContext context) throws SQLException {
        ConnectionElement ce = getConnectionElement(context);
        ConnectionPool sqlDriver = (ConnectionPool) context.getAttribute("ConnectionPool");
        return sqlDriver.getConnection(ce, false);
    }

    protected static void freeConnection(Connection db, ServletContext context) {
        if (db != null) {
            ConnectionPool sqlDriver = (ConnectionPool) context.getAttribute("ConnectionPool");
            sqlDriver.free(db);
        }
        db = null;
    }
}