org.grible.servlets.ui.Home.java Source code

Java tutorial

Introduction

Here is the source code for org.grible.servlets.ui.Home.java

Source

/*******************************************************************************
 * Copyright (c) 2013 - 2014 Maksym Barvinskyi.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * 
 * Contributors:
 *     Maksym Barvinskyi - initial API and implementation
 ******************************************************************************/
package org.grible.servlets.ui;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.grible.dao.DataManager;
import org.grible.dao.JsonDao;
import org.grible.dao.PostgresDao;
import org.grible.model.Product;
import org.grible.model.User;
import org.grible.servlets.ServletHelper;
import org.grible.settings.AppTypes;
import org.grible.settings.GlobalSettings;
import org.grible.settings.Lang;
import org.grible.uimodel.Section;
import org.grible.uimodel.Sections;

import com.google.gson.Gson;

/**
 * Servlet implementation class GetStorageValues
 */
@WebServlet("/home")
public class Home extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Home() {
        super();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        try {
            if (!GlobalSettings.getInstance().init(getServletContext().getRealPath(""))) {
                response.sendRedirect("/firstlaunch");
                return;
            }

            StringBuilder responseHtml = new StringBuilder();
            responseHtml.append("<!DOCTYPE html>");
            responseHtml.append("<html>");
            responseHtml.append("<head>");
            responseHtml.append("<title>Grible</title>");
            responseHtml.append("<link rel=\"shortcut icon\" href=\"img/favicon.ico\" >");
            responseHtml.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"css/style.css\" />");
            responseHtml
                    .append("<link href=\"css/jquery.contextMenu.css\" rel=\"stylesheet\" type=\"text/css\" />");
            responseHtml.append("<script type=\"text/javascript\" src=\"js/jquery-1.11.0.min.js\"></script>");
            responseHtml.append("<script type=\"text/javascript\" src=\"js/jquery-ui.min.js\"></script>");
            responseHtml.append("<script type=\"text/javascript\" src=\"lang/current.json\"></script>");
            responseHtml.append("<script type=\"text/javascript\" src=\"js/home.js\"></script>");
            responseHtml.append("<script type=\"text/javascript\" src=\"js/jquery.contextMenu.js\"></script>");
            responseHtml.append("<script type=\"text/javascript\" src=\"js/noty/jquery.noty.js\"></script>");
            responseHtml.append("<script type=\"text/javascript\" src=\"js/noty/top.js\"></script>");
            responseHtml.append("<script type=\"text/javascript\" src=\"js/noty/defaultVarsHome.js\"></script>");
            responseHtml.append("<script type=\"text/javascript\" src=\"js/noty/default.js\"></script>");
            responseHtml.append("<script type=\"text/javascript\">");
            responseHtml.append("var appType = \"")
                    .append(GlobalSettings.getInstance().getAppType().toString().toLowerCase()).append("\";");
            if (!isMultipleUsers()) {
                responseHtml.append("var productsWhosePathsNotExist = ").append(getProductsWhosePathsNotExist())
                        .append(";");
            } else {
                responseHtml.append("var productsWhosePathsNotExist = [];");
            }
            responseHtml.append("</script>");
            responseHtml.append("</head>");
            responseHtml.append("<body>");

            if (isMultipleUsers() && request.getSession(false).getAttribute("userName") == null) {
                responseHtml.append("<div id=\"login-form\" class=\"table\">");
                responseHtml.append("<div class=\"table-row\">");
                responseHtml.append("<div id=\"login-grible-logo\" class=\"table-cell\">");
                responseHtml.append("<img id=\"login-logo\" src=\"img/grible_logo.png\">");
                responseHtml.append("</div>");
                responseHtml.append("<div id=\"outer-credentials\" class=\"table-cell\">");
                responseHtml.append("<form method=\"post\" action=\"Login\">");
                responseHtml.append("<div id=\"credentials\" class=\"table\">");
                responseHtml.append("<div class=\"table-row\">");
                responseHtml.append("<div class=\"table-cell dialog-cell dialog-label\">");
                responseHtml.append(Lang.get("username"));
                responseHtml.append(":</div>");
                responseHtml.append("<div class=\"table-cell dialog-cell dialog-edit\">");
                responseHtml.append("<input class=\"dialog-edit\" name=\"username\" style=\"width: 250px\"></div>");
                responseHtml.append("</div>");
                responseHtml.append("<div class=\"table-row\">");
                responseHtml.append("<div class=\"table-cell dialog-cell dialog-label\">");
                responseHtml.append(Lang.get("password"));
                responseHtml.append(":</div>");
                responseHtml.append("<div class=\"table-cell dialog-cell dialog-edit\">");
                responseHtml.append(
                        "<input type=\"password\" class=\"dialog-edit\" name=\"pass\" style=\"width: 250px\"></div>");
                responseHtml.append("</div>");
                responseHtml.append("</div>");
                if (request.getParameter("url") != null) {
                    responseHtml.append(
                            "<input type=\"hidden\" name=\"url\" value=\"" + request.getParameter("url") + "\">");
                }
                responseHtml.append("<div class=\"login-dialog-buttons table\">");
                responseHtml.append("<div class=\"table-row\">");
                responseHtml.append("<div id=\"outer-dialog-error-message\" class=\"table-cell\">");
                if (request.getSession(false).getAttribute("loginFailed") != null) {
                    String message = (String) request.getSession(false).getAttribute("loginFailed");
                    responseHtml.append("<span class=\"dialog-error-message\">" + message + "</span>");
                }
                responseHtml.append("</div>");
                responseHtml.append("<div class=\"table-cell\">");

                responseHtml.append("<script type=\"text/javascript\">document.write(");
                responseHtml.append("'<input type=\"submit\" value=\"'+ lang['login'] + '\" ");
                responseHtml.append("class=\"ui-button\">')</script>");

                responseHtml.append("</div>");
                responseHtml.append("</div>");
                responseHtml.append("</div>");
                responseHtml.append("</form>");
                responseHtml.append("</div>");
                responseHtml.append("</div>");
                responseHtml.append("</div>");
            } else {
                User user = null;
                if (isMultipleUsers()) {
                    String userName = (String) request.getSession(false).getAttribute("userName");
                    user = new PostgresDao().getUserByName(userName);
                    responseHtml.append(ServletHelper.getUserPanel(user));
                } else {
                    responseHtml.append(ServletHelper.getUserPanel());
                }

                responseHtml.append("<div id=\"breadcrumb\" class=\"header-text\">");
                responseHtml.append("<span id=\"home-image\"><img src=\"img/grible_logo_mini.png\"></span>");
                responseHtml.append("<a href=\".\"><span id=\"home\">");
                responseHtml.append(Lang.get("home"));
                responseHtml.append("</span></a>");

                if (request.getParameter("product") != null) {
                    if (StringUtils.isNumeric(request.getParameter("product"))) {

                        int id = Integer.parseInt(request.getParameter("product"));
                        Product product = DataManager.getInstance().getDao().getProduct(id);
                        if (product != null) {
                            responseHtml.replace(responseHtml.indexOf("id=\"home\">") + 9,
                                    responseHtml.indexOf("id=\"home\">") + 10, " class=\"link-infront\">");
                            responseHtml.append("<span class=\"extends-symbol\">&nbsp;&gt;&nbsp;</span>");
                            responseHtml.append("<a href=\"?product=" + id + "\"><span id=\"product-name\">");
                            responseHtml.append(product.getName());
                            responseHtml.append("</span></a></div>");

                            if (isMultipleUsers() && (!user.hasAccessToProduct(product.getId()))) {
                                responseHtml.append("<br/><br/>");
                                responseHtml.append("<div class=\"error-message\">");
                                responseHtml.append(Lang.get("nopermissions") + "</div>");
                            } else {
                                includeSections(responseHtml, product);
                            }

                        } else {
                            response.sendRedirect("/");
                        }
                    } else {
                        response.sendRedirect("/");
                    }
                } else {
                    responseHtml.append("</div>");
                    responseHtml.append("<div class=\"table\">");

                    List<Product> products = DataManager.getInstance().getDao().getProducts();
                    for (Product product : products) {
                        if ((isMultipleUsers() && user.hasAccessToProduct(product.getId()))
                                || (!isMultipleUsers())) {
                            responseHtml.append("<div class=\"table-row\">");
                            responseHtml.append("<div class=\"table-cell section-cell\">");
                            responseHtml.append("<a href=\"?product=" + product.getId() + "\"><span id=\""
                                    + product.getId() + "\" class=\"section product-item\">" + product.getName()
                                    + "</span></a>");
                            responseHtml.append("</div>");
                            responseHtml.append("</div>");
                        }
                    }
                    responseHtml.append("</div>");

                    if ((isMultipleUsers() && user.isAdmin()) || (!isMultipleUsers())) {
                        responseHtml.append("<div class=\"under-sections\">");
                        responseHtml.append("<div class=\"icon-button button-enabled\" id=\"btn-add-product\">");
                        responseHtml.append("<img src=\"img/add-icon.png\" class=\"icon-enabled\">");
                        responseHtml.append(
                                "<span class=\"icon-button-text\"> " + Lang.get("addproduct") + "</span></div>");
                        responseHtml.append("<p><img src=\"img/info-icon.png\"><span class=\"msg-text\">"
                                + "<a href=\"#\" id=\"lnk-product-info\">" + Lang.get("whatisproduct")
                                + "</a></span></p>");
                        responseHtml.append("</div>");
                    }

                    responseHtml.append("<div id=\"video-tutorial-msg\">");
                    responseHtml.append("<img src=\"img/info-icon.png\"> ");
                    responseHtml.append("<span class=\"msg-text\">" + Lang.get("newtogrible1"));
                    responseHtml.append("<a href=\"http://www.grible.org/docs.php#video\" ");
                    responseHtml.append("target=\"_blank\">" + Lang.get("video") + "</a>");
                    responseHtml.append(Lang.get("newtogrible2"));
                    responseHtml.append("</span>");
                    responseHtml.append("</div>");
                }
                responseHtml.append(ServletHelper.getFooter(getServletContext().getRealPath("")));
            }

            responseHtml.append("</body>");
            responseHtml.append("</html>");
            out.print(responseHtml.toString());

        } catch (Exception e) {
            e.printStackTrace(out);
        } finally {
            out.flush();
            out.close();
        }
    }

    private String getProductsWhosePathsNotExist() throws Exception {
        List<Product> products = new JsonDao().getProducts();
        List<String> productList = new ArrayList<>();
        for (Product product : products) {
            File dir = new File(product.getPath());
            if (!dir.canWrite()) {
                productList.add(product.getName());
            }
        }
        String[] productArray = new String[productList.size()];
        for (int i = 0; i < productArray.length; i++) {
            productArray[i] = productList.get(i);
        }
        return new Gson().toJson(productArray, String[].class);
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    private boolean isMultipleUsers() throws Exception {
        return GlobalSettings.getInstance().getAppType() == AppTypes.POSTGRESQL;
    }

    private void includeSections(StringBuilder responseHtml, Product product) {
        responseHtml.append("<div class=\"table\">");
        List<Section> sections = Sections.getSections();
        for (Section section : sections) {
            responseHtml.append("<div class=\"table-row\">");
            responseHtml.append("<div class=\"table-cell section-cell\">");
            responseHtml.append("<a href=\"" + section.getKey() + "/?product=" + product.getId()
                    + "\"><span class=\"section\">" + section.getName() + "</span></a>");
            responseHtml.append("</div>");
            responseHtml.append("<div class=\"table-cell gap\">");
            responseHtml.append("</div>");
            responseHtml.append("<div class=\"table-cell\">");
            responseHtml.append("<div class=\"section-desription\">" + section.getDescription() + "</div>");
            responseHtml.append("</div>");
            responseHtml.append("</div>");
        }
        responseHtml.append("</div>");
    }
}