architecture.ee.web.community.spring.controller.DisplayController.java Source code

Java tutorial

Introduction

Here is the source code for architecture.ee.web.community.spring.controller.DisplayController.java

Source

/*
 * Copyright 2012, 2013 Donghyuck, Son
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package architecture.ee.web.community.spring.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig;

import architecture.common.model.factory.ModelTypeFactory;
import architecture.common.user.Company;
import architecture.common.user.SecurityHelper;
import architecture.common.user.User;
import architecture.ee.exception.NotFoundException;
import architecture.ee.web.community.page.BodyType;
import architecture.ee.web.community.page.Page;
import architecture.ee.web.community.page.PageAdaptor;
import architecture.ee.web.community.page.PageMaker;
import architecture.ee.web.community.page.PageManager;
import architecture.ee.web.community.page.PageNotFoundException;
import architecture.ee.web.navigator.MenuComponent;
import architecture.ee.web.navigator.MenuNotFoundException;
import architecture.ee.web.site.WebSite;
import architecture.ee.web.site.WebSiteManager;
import architecture.ee.web.site.WebSiteNotFoundException;
import architecture.ee.web.site.page.WebPage;
import architecture.ee.web.util.WebSiteUtils;

@Controller("community-display-controller")
@RequestMapping("/display")
public class DisplayController {

    private static final Log log = LogFactory.getLog(DisplayController.class);

    private static final String DEFAULT_PAGE_TEMPLATE = "/html/community/page.ftl";

    private static final String DEFAULT_CONTENT_TYPE = "text/html;charset=UTF-8";

    @Inject
    @Qualifier("pageManager")
    private PageManager pageManager;

    @Inject
    @Qualifier("freemarkerConfig")
    private FreeMarkerConfig freeMarkerConfig;

    @Inject
    @Qualifier("webSiteManager")
    private WebSiteManager webSiteManager;

    @Autowired
    private ServletContext servletContext;

    public DisplayController() {
    }

    /**
     * display/{objectType}/{objectId}/{filename}
     * 
     * 
     * @param objectType
     * @param objectId
     * @param filename
     * @param request
     * @param response
     * @param model
     * @return
     * @throws IOException
     * @throws PageNotFoundException
     * @throws WebSiteNotFoundException
     */
    @RequestMapping(value = "/{objectType}/{objectId}/{filename:.+}", method = { RequestMethod.POST,
            RequestMethod.GET })
    public String page(@PathVariable Integer objectType, @PathVariable Long objectId, @PathVariable String filename,
            @RequestParam(value = "siteId", defaultValue = "0", required = false) int siteId,
            @RequestParam(value = "version", defaultValue = "0", required = false) int version,
            HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {
        User user = SecurityHelper.getUser();
        String restOfTheUrl = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
        log.debug(filename + ":" + restOfTheUrl);
        Page page = null;
        WebSite website = null;
        try {
            page = getPage(filename, version);
            website = getWebSite(siteId, request);

            setPageActionAdaptor(page, website, user, model, request, response);
        } catch (NotFoundException e) {
            response.sendError(404);
        }
        setContentType(response);
        String template = page.getProperty("template", DEFAULT_PAGE_TEMPLATE);
        return getFreemarkerView(template);
    }

    /**
     * 
     * /display/aa.html
     * 
     * 
     * @todo   ?   ?  ? ?
     * 
     * @param filename
     * @param request
     * @param response
     * @param model
     * @return
     * @throws NotFoundException
     * @throws IOException
     */
    @RequestMapping(value = "/{filename:.+}", method = { RequestMethod.POST, RequestMethod.GET })
    public String page(@PathVariable String filename,
            @RequestParam(value = "siteId", defaultValue = "0", required = false) int siteId,
            @RequestParam(value = "version", defaultValue = "0", required = false) int version,
            HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {

        boolean notFound = false;
        User user = SecurityHelper.getUser();
        Page page = null;
        WebSite website = null;
        String template = null;
        try {
            website = getWebSite(siteId, request);
            page = getPage(filename, version);
            setPageActionAdaptor(page, website, user, model, request, response);
            template = page.getProperty("template", DEFAULT_PAGE_TEMPLATE);
            setContentType(response);
        } catch (NotFoundException e) {
            notFound = true;
        }

        if (page == null && website != null) {
            try {
                WebPage webpage = webSiteManager.getWebPageByName(website, filename);
                setPageActionAdaptor(new PageAdaptor(webpage), website, user, model, request, response);
                setContentType(webpage.getContentType(), response);
                template = webpage.getTemplate();
            } catch (NotFoundException e) {
                response.sendError(404);
            }
        }
        return getFreemarkerView(template);
    }

    protected void setPageActionAdaptor(Page page, WebSite site, User user, Model model, HttpServletRequest request,
            HttpServletResponse response) {
        PageMaker.Builder builder = PageMaker.newBuilder().configuration(freeMarkerConfig.getConfiguration())
                .servletContext(servletContext).page(page).model(model).request(request);
        model.addAttribute("action",
                PageActionAdaptor.newBuilder().webSite(site).builder(builder).user(user).build());
    }

    protected Page getPage(String filename, int version) throws PageNotFoundException {
        Page page;
        if (version != 0) {
            page = pageManager.getPage(filename, version);
        } else {
            page = pageManager.getPage(filename);
        }
        return page;
    }

    protected WebSite getWebSite(long webSiteId, HttpServletRequest request) throws WebSiteNotFoundException {
        WebSite website;
        if (webSiteId < 1)
            website = WebSiteUtils.getWebSite(request);
        else
            website = webSiteManager.getWebSiteById(webSiteId);

        log.debug(website);
        return website;
    }

    /**
     * display/{siteId}/{filename}
     * 
     * @param siteId
     *            ? 0 ?   ????  ? ?
     * @param filename
     * @param request
     * @param response
     * @param model
     * @return
     * @throws IOException
     */
    @RequestMapping(value = "/{siteId:[\\p{Digit}]+}/{filename:.+}", method = { RequestMethod.POST,
            RequestMethod.GET })
    public String webpage(@PathVariable Long siteId, @PathVariable String filename, HttpServletRequest request,
            HttpServletResponse response, Model model) throws IOException {

        User user = SecurityHelper.getUser();
        String restOfTheUrl = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
        log.debug(filename + ":" + restOfTheUrl);
        WebSite website = null;
        WebPage page = null;
        try {
            website = getWebSite(siteId, request);
            page = webSiteManager.getWebPageByName(website, filename);
            setPageActionAdaptor(new PageAdaptor(page), website, user, model, request, response);
        } catch (NotFoundException e) {
            response.sendError(404);
        }

        setContentType(page.getContentType(), response);
        return getFreemarkerView(page.getTemplate(), DEFAULT_PAGE_TEMPLATE);
    }

    @RequestMapping(value = "/{catelogy:[a-zA-Z][a-zA-Z_0-9]+}/{filename:.+}", method = { RequestMethod.POST,
            RequestMethod.GET })
    public String webpage(@PathVariable String catelogy, @PathVariable String filename, HttpServletRequest request,
            HttpServletResponse response, Model model) throws IOException {

        User user = SecurityHelper.getUser();
        String restOfTheUrl = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
        log.debug(filename + ":" + restOfTheUrl);
        WebSite website = null;
        WebPage page = null;
        try {
            website = getWebSite(0L, request);
            page = webSiteManager.getWebPageByName(website, filename);
            setPageActionAdaptor(new PageAdaptor(page), website, user, model, request, response);
        } catch (NotFoundException e) {
            response.sendError(404);
        }
        setContentType(page.getContentType(), response);
        return getFreemarkerView(page.getTemplate(), DEFAULT_PAGE_TEMPLATE);
    }

    @RequestMapping(value = "/", method = RequestMethod.GET, params = { "source" })
    public String page(@RequestParam(value = "source") String source,
            @RequestParam(value = "siteId", defaultValue = "0", required = false) int siteId,
            HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {

        User user = SecurityHelper.getUser();
        WebSite website = null;
        try {
            website = getWebSite(siteId, request);
            setPageActionAdaptor(null, website, user, model, request, response);
        } catch (NotFoundException e) {
            response.sendError(404);
        }
        setContentType(response);
        return getFreemarkerView(source);
    }

    protected String getFreemarkerView(String view) {
        return getFreemarkerView(view, DEFAULT_PAGE_TEMPLATE);
    }

    protected String getFreemarkerView(String view, String defaultView) {
        String viewToUse = StringUtils.defaultString(view, defaultView);
        if (StringUtils.endsWithAny(viewToUse, "ftl")) {
            viewToUse = StringUtils.removeEndIgnoreCase(viewToUse, ".ftl");
        }
        return viewToUse;
    }

    private void setContentType(String contentType, HttpServletResponse response) {
        String contentTypeToUse = StringUtils.defaultString(contentType, DEFAULT_CONTENT_TYPE);
        response.setContentType(contentTypeToUse);
    }

    private void setContentType(HttpServletResponse response) {
        response.setContentType(DEFAULT_CONTENT_TYPE);
    }

    private boolean hasPermissions(Page page, User user) {
        if (page.getObjectType() == ModelTypeFactory.getTypeIdFromCode("COMPANY")
                && page.getObjectId() != user.getCompanyId()) {
            return false;
        } else if (page.getObjectType() == ModelTypeFactory.getTypeIdFromCode("USER")
                && page.getObjectId() != user.getUserId()) {
            return false;
        } else if (page.getObjectType() == ModelTypeFactory.getTypeIdFromCode("WEBSITE")) {
            return true;
        }
        return true;
    }

    public static class PageActionAdaptor {

        public static final String DEFAULT_PAGE_CONTENT_TYPE = "text/html;charset=UTF-8";
        public static final String DEFAULT_PAGE_MENU_NAME = "USER_MENU";
        public static final String NAVIGATOR_SELECTED_NAME_KEY = "navigator.selected.name";
        public static final String PAGE_MENU_NAME_KEY = "page.menu.name";
        public static final String PAGE_TEMPLATE_KEY = "page.template";

        private Company targetCompany;

        private User user;

        private WebSite webSite;

        private PageMaker.Builder builder;

        public Page getPage() {
            return builder.getPage();
        }

        public String getPageTitle() {
            return getPage().getTitle();
        }

        public String getPageSummary() {
            return getPage().getSummary();
        }

        public String getPlainBodyText() {
            return getPage().getBodyText();
        }

        public String getBodyText() {
            Page pageToUse = getPage();
            if (pageToUse.getBodyContent().getBodyType() == BodyType.FREEMARKER) {
                if (StringUtils.isNotEmpty(pageToUse.getBodyText()))
                    try {
                        return builder.buildPageBody();
                    } catch (Exception e) {
                        log.error(e);
                    }
            }
            return getPlainBodyText();
        }

        public MenuComponent getWebSiteMenu(String name) throws MenuNotFoundException {
            if (webSite != null) {
                return WebSiteUtils.getMenuComponent(webSite.getMenu(), name);
            } else {
                throw new MenuNotFoundException();
            }
        }

        public boolean hasWebSiteMenu(String name) {
            if (webSite != null) {
                try {
                    WebSiteUtils.getMenuComponent(webSite.getMenu(), name);
                    return true;
                } catch (MenuNotFoundException e) {
                    return false;
                }
            }
            return false;
        }

        public List<String> getMenuNames() throws MenuNotFoundException {
            if (webSite != null) {
                Set<String> names = WebSiteUtils.getMenuNames(webSite);
                log.debug(names);
                List<String> list = new ArrayList<String>(names);
                log.debug(list);
                return list;
            }
            return Collections.EMPTY_LIST;
        }

        public String getContentType() {
            return DEFAULT_PAGE_CONTENT_TYPE;
        }

        public boolean isSetPage() {
            return this.builder != null;
        }

        public boolean isSetTemplate() {
            Page pageToUse = getPage();
            if (pageToUse != null && pageToUse.getPageId() > 0) {
                return StringUtils.isNotEmpty(pageToUse.getProperty(PAGE_TEMPLATE_KEY, null));
            }
            return false;
        }

        public String getView() {
            if (isSetTemplate()) {
                Page pageToUse = getPage();
                pageToUse.getProperty(PAGE_TEMPLATE_KEY, null);
            }
            return DisplayController.DEFAULT_PAGE_TEMPLATE;
        }

        public boolean isSetNavigator() {
            Page pageToUse = getPage();
            if (pageToUse != null && pageToUse.getPageId() > 0) {
                return StringUtils.isNotEmpty(pageToUse.getProperty(NAVIGATOR_SELECTED_NAME_KEY, null));
            }
            return false;
        }

        public MenuComponent getNavigator() throws MenuNotFoundException {
            if (isSetNavigator()) {
                Page pageToUse = getPage();
                String name = pageToUse.getProperty(PAGE_MENU_NAME_KEY, DEFAULT_PAGE_MENU_NAME);
                String selected = pageToUse.getProperty(NAVIGATOR_SELECTED_NAME_KEY, null);
                return WebSiteUtils.getMenuComponent(getWebSiteMenu(name), selected);
            }
            throw new MenuNotFoundException();
        }

        /**
         * @return user
         */
        public User getUser() {
            return user;
        }

        /**
         * @param user
         *             user
         */
        public void setUser(User user) {
            this.user = user;
        }

        /**
         * @return targetCompany
         */
        public Company getTargetCompany() {
            if (targetCompany == null && user != null)
                return user.getCompany();
            return targetCompany;
        }

        /**
         * @param targetCompany
         *             targetCompany
         */
        public void setTargetCompany(Company company) {
            this.targetCompany = company;
        }

        /**
         * @return webSite
         */
        public WebSite getWebSite() {
            return webSite;
        }

        /**
         * @param webSite
         *             webSite
         */
        public void setWebSite(WebSite webSite) {
            this.webSite = webSite;
        }

        /**
         * @return builder
         */
        public PageMaker.Builder getBuilder() {
            return builder;
        }

        /**
         * @param builder
         *             builder
         */
        public void setBuilder(PageMaker.Builder builder) {
            this.builder = builder;
        }

        public static class Builder {

            PageActionAdaptor pageActionAdaptor = new PageActionAdaptor();

            public Builder webSite(WebSite webSite) {
                this.pageActionAdaptor.webSite = webSite;
                return this;
            }

            public Builder user(User user) {
                this.pageActionAdaptor.user = user;
                return this;
            }

            public Builder company(Company company) {
                this.pageActionAdaptor.targetCompany = company;
                return this;
            }

            public Builder builder(PageMaker.Builder builder) {
                this.pageActionAdaptor.builder = builder;
                return this;
            }

            public PageActionAdaptor build() {
                return pageActionAdaptor;
            }
        }

        public static Builder newBuilder() {
            return new Builder();
        }
    }

}