org.ralasafe.servlet.QueryDesignAction.java Source code

Java tutorial

Introduction

Here is the source code for org.ralasafe.servlet.QueryDesignAction.java

Source

/**
 * Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com
 * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
 */
package org.ralasafe.servlet;

import java.io.IOException;
import java.io.StringReader;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.ralasafe.EntityExistException;
import org.ralasafe.RalasafeException;
import org.ralasafe.db.sql.xml.BinaryExpression;
import org.ralasafe.db.sql.xml.Column;
import org.ralasafe.db.sql.xml.ContextValue;
import org.ralasafe.db.sql.xml.ExpressionGroupTypeItem;
import org.ralasafe.db.sql.xml.InExpression;
import org.ralasafe.db.sql.xml.IsNotNullExpression;
import org.ralasafe.db.sql.xml.IsNullExpression;
import org.ralasafe.db.sql.xml.NotInExpression;
import org.ralasafe.db.sql.xml.Operand;
import org.ralasafe.db.sql.xml.Operand1;
import org.ralasafe.db.sql.xml.Operand2;
import org.ralasafe.db.sql.xml.Operator;
import org.ralasafe.db.sql.xml.QueryType;
import org.ralasafe.db.sql.xml.SimpleValue;
import org.ralasafe.db.sql.xml.Table;
import org.ralasafe.db.sql.xml.UserValue;
import org.ralasafe.db.sql.xml.Value;
import org.ralasafe.db.sql.xml.types.QueryTypeTypeType;
import org.ralasafe.db.sql.xml.types.SimpleOperatorType;
import org.ralasafe.db.sql.xml.types.SimpleValueTypeTypeType;
import org.ralasafe.entitle.Query;
import org.ralasafe.entitle.QueryManager;
import org.ralasafe.util.StringUtil;

import com.google.gson.Gson;

public class QueryDesignAction extends Action {
    private static final Log log = LogFactory.getLog(QueryDesignAction.class);

    public QueryDesignHandler createHandler(HttpServletRequest req) {
        int id = WebUtil.getIntParameter(req, "id", 0);
        QueryManager queryManager = WebUtil.getQueryManager(req);
        Query query = queryManager.getQuery(id);

        org.ralasafe.db.sql.xml.QueryType xmlQuery;
        try {
            xmlQuery = org.ralasafe.db.sql.xml.Query.unmarshal(new StringReader(query.getXmlContent()));
        } catch (Exception e) {
            throw new RalasafeException(e);
        }

        return new QueryDesignHandler(xmlQuery);
    }

    public String getHandlerAttributeKey(HttpServletRequest req) {
        int id = WebUtil.getIntParameter(req, "id", 0);
        return "_$ralasafeQuery_" + id;
    }

    private QueryDesignHandler getHandler(HttpServletRequest req) {
        String oper = req.getParameter("oper");
        String key = getHandlerAttributeKey(req);
        QueryDesignHandler handler = null;
        Object obj = req.getSession().getAttribute(key);

        if (obj == null || "loadFresh".equals(oper)) {
            handler = createHandler(req);

            // save into session, will be removed when policy is saved
            req.getSession().setAttribute(key, handler);
        } else if (obj instanceof QueryRawHandler) {
            QueryRawHandler rawHandler = (QueryRawHandler) obj;
            QueryType query = rawHandler.getQuery();
            handler = new QueryDesignHandler(query);
            req.getSession().setAttribute(key, handler);

            // set to design sql type
            query.setIsRawSQL(false);
            query.setType(QueryTypeTypeType.SQL);
        } else if (obj instanceof QueryTestHandler) {
            QueryTestHandler rawHandler = (QueryTestHandler) obj;
            QueryType query = rawHandler.getQuery();
            handler = new QueryDesignHandler(query);
            req.getSession().setAttribute(key, handler);
        } else {
            handler = (QueryDesignHandler) obj;
        }

        return handler;
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String oper = req.getParameter("oper");
        String tableAlias = req.getParameter("tableAlias");
        String columnName = req.getParameter("columnName");
        QueryDesignHandler handler = getHandler(req);
        req.setAttribute("handler", handler);

        if (log.isDebugEnabled()) {
            log.debug("oper=" + oper + ", query=" + handler.getQuery().getName() + ", tableAlias=" + tableAlias
                    + ", columnName=" + columnName);
        }

        if ("designTables".equals(oper)) {
            WebUtil.forward(req, resp, "/ralasafe/query/tables.jsp");
            return;
        } else if ("viewTable".equals(oper)) {
            Table[] tables = handler.getQuery().getQueryTypeSequence().getFrom().getTable();
            for (int i = 0; i < tables.length; i++) {
                Table table = tables[i];

                if (table.getAlias().equals(tableAlias)) {
                    req.setAttribute("table", table);
                    i = tables.length;
                }
            }
            WebUtil.forward(req, resp, "/ralasafe/query/table.jsp");
            return;
        } else if ("getColumn".equals(oper)) {
            Column column = handler.getColumn(tableAlias, columnName);
            String[][] mappingClassPropertyAndTypes = handler.getMappingClassPropertyAndTypes();

            req.setAttribute("column", column);
            req.setAttribute("mappingClassPropertyAndTypes", mappingClassPropertyAndTypes);

            WebUtil.forward(req, resp, "/ralasafe/query/editColumn.jsp");
            return;
        } else if ("getGroupColumn".equals(oper)) {
            Column column = handler.getGroupColumn(tableAlias, columnName);

            req.setAttribute("column", column);
            WebUtil.forward(req, resp, "/ralasafe/query/editGroupColumn.jsp");
            return;
        } else if ("getOrderColumn".equals(oper)) {
            Column column = handler.getOrderColumn(tableAlias, columnName);

            req.setAttribute("column", column);
            WebUtil.forward(req, resp, "/ralasafe/query/editOrderColumn.jsp");
            return;
        } else if ("designGroup".equals(oper)) {
            WebUtil.forward(req, resp, "/ralasafe/query/group.jsp");
            return;
        } else if ("designOrder".equals(oper)) {
            WebUtil.forward(req, resp, "/ralasafe/query/order.jsp");
            return;
        } else if ("designWhere".equals(oper)) {
            WebUtil.forward(req, resp, "/ralasafe/query/where.jsp");
            return;
        } else if ("whereExprContextMenu".equals(oper)) {
            String nodeId = req.getParameter("nodeId");
            Object item = handler.getWhereExprItem(nodeId);

            req.setAttribute("item", item);
            WebUtil.forward(req, resp, "/ralasafe/query/whereExprContextMenu.jsp");
            return;
        } else if ("loadWhereExprForm".equals(oper)) {
            String nodeId = req.getParameter("nodeId");
            //String pId=req.getParameter( "pId" );
            String exprType = req.getParameter("exprType");

            if (!StringUtil.isEmpty(nodeId)) {
                Object obj = handler.getWhereExprItem(nodeId);
                ExpressionGroupTypeItem item = (ExpressionGroupTypeItem) obj;
                req.setAttribute("item", item);

                Object choiceValue = item.getChoiceValue();
                if (choiceValue instanceof BinaryExpression) {
                    exprType = "binary";
                } else if (choiceValue instanceof InExpression || choiceValue instanceof NotInExpression) {
                    exprType = "in";
                } else if (choiceValue instanceof IsNullExpression || choiceValue instanceof IsNotNullExpression) {
                    exprType = "null";
                }
            }

            String[] userFields = WebUtil.getUserType(req).getUserMetadata().getUserFields();
            req.setAttribute("userFields", userFields);

            if ("binary".equals(exprType)) {
                WebUtil.forward(req, resp, "/ralasafe/query/editWhereBinaryExpr.jsp");
            } else if ("in".equals(exprType)) {
                WebUtil.forward(req, resp, "/ralasafe/query/editWhereInExpr.jsp");
            } else if ("null".equals(exprType)) {
                WebUtil.forward(req, resp, "/ralasafe/query/editWhereNullExpr.jsp");
            }

            return;
        } else if ("return".equals(oper)) {
            String gotoPage = handler.getManagePage();

            // remove handler from session
            req.getSession().removeAttribute(getHandlerAttributeKey(req));

            // goto manage page
            resp.sendRedirect(gotoPage);
            return;
        } else {
            WebUtil.forward(req, resp, "/ralasafe/query/design.jsp");
            return;
        }
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String oper = req.getParameter("oper");
        String tableAlias = req.getParameter("tableAlias");
        String columnName = req.getParameter("columnName");
        QueryDesignHandler handler = getHandler(req);
        req.setAttribute("handler", handler);

        if (log.isDebugEnabled()) {
            log.debug("oper=" + oper + ", query=" + handler.getQuery().getName() + ", tableAlias=" + tableAlias
                    + ", columnName=" + columnName);
        }

        if ("checkTableColumns".equals(oper)) {
            handler.addTableColumns(tableAlias);
            return;
        } else if ("unCheckTableColumns".equals(oper)) {
            handler.deleteTableColumns(tableAlias);
            return;
        } else if ("deleteTable".equals(oper)) {
            handler.deleteTable(tableAlias);
            return;
        } else if ("addTable".equals(oper)) {
            String schema = req.getParameter("schema");
            String tableName = req.getParameter("tableName");
            String alias = handler.addTable(schema.trim(), tableName.trim());

            Gson gson = new Gson();
            String json = gson.toJson(alias);
            resp.setContentType("application/json");
            resp.getWriter().print(json);
            return;
        } else if ("setMappingClass".equals(oper)) {
            String mappingClass = req.getParameter("mappingClass");
            handler.setMappingClass(mappingClass);
            return;
        } else if ("deleteColumn".equals(oper)) {
            handler.deleteColumn(tableAlias, columnName);
            return;
        } else if ("addColumn".equals(oper)) {
            handler.addColumn(tableAlias, columnName);
            return;
        } else if ("updateTableColumn".equals(oper)) {
            String function = req.getParameter("function");
            String property = req.getParameter("property");
            boolean readOnly = WebUtil.getBooleanParameter(req, "readOnly", false);

            int index = property.indexOf("<");
            String javaProp = property.substring(0, index - 1).trim();
            String javaType = property.substring(index + 1, property.length() - 1).trim();
            handler.changeColumnMapping(tableAlias, columnName, function, javaProp, javaType, readOnly);
            return;
        } else if ("moveGroupColumn".equals(oper)) {
            String direct = req.getParameter("direct");

            handler.moveGroupColumn(direct, tableAlias, columnName);
            return;
        } else if ("deleteGroupColumn".equals(oper)) {
            handler.deleteGroupColumn(tableAlias, columnName);
            return;
        } else if ("editGroupColumn".equals(oper)) {
            String aliasColumn = req.getParameter("aliasColumn");
            int firstIndex = aliasColumn.indexOf("[");
            int lastIndex = aliasColumn.indexOf("]");

            tableAlias = aliasColumn.substring(firstIndex + 1, lastIndex);
            columnName = aliasColumn.substring(lastIndex + 2);

            int index = WebUtil.getIntParameter(req, "index", 0);
            handler.editGroupColumn(index, tableAlias, columnName);
            return;
        } else if ("addGroupColumn".equals(oper)) {
            String aliasColumn = req.getParameter("aliasColumn");
            int firstIndex = aliasColumn.indexOf("[");
            int lastIndex = aliasColumn.indexOf("]");

            tableAlias = aliasColumn.substring(firstIndex + 1, lastIndex);
            columnName = aliasColumn.substring(lastIndex + 2);

            handler.addGroupColumn(tableAlias, columnName);
            return;
        } else if ("moveOrderColumn".equals(oper)) {
            String direct = req.getParameter("direct");

            handler.moveOrderColumn(direct, tableAlias, columnName);
            return;
        } else if ("deleteOrderColumn".equals(oper)) {
            handler.deleteOrderColumn(tableAlias, columnName);
            return;
        } else if ("editOrderColumn".equals(oper)) {
            String aliasColumn = req.getParameter("aliasColumn");
            String orderType = req.getParameter("orderType");
            int firstIndex = aliasColumn.indexOf("[");
            int lastIndex = aliasColumn.indexOf("]");

            tableAlias = aliasColumn.substring(firstIndex + 1, lastIndex);
            columnName = aliasColumn.substring(lastIndex + 2);

            int index = WebUtil.getIntParameter(req, "index", 0);
            handler.editOrderColumn(index, tableAlias, columnName, orderType);
            return;
        } else if ("addOrderColumn".equals(oper)) {
            String aliasColumn = req.getParameter("aliasColumn");
            String orderType = req.getParameter("orderType");
            int firstIndex = aliasColumn.indexOf("[");
            int lastIndex = aliasColumn.indexOf("]");

            tableAlias = aliasColumn.substring(firstIndex + 1, lastIndex);
            columnName = aliasColumn.substring(lastIndex + 2);

            handler.addOrderColumn(tableAlias, columnName, orderType);
            return;
        } else if ("loadWhereExprGroup".equals(oper)) {
            String xml = handler.getWhere();

            resp.setContentType("application/json;charset=UTF-8");
            ServletOutputStream out = resp.getOutputStream();
            out.print(xml);
            return;
        } else if ("addWhereChildExprGroup".equals(oper)) {
            String nodeId = req.getParameter("nodeId");
            String type = req.getParameter("type");

            handler.addWhereChildExprGroup(nodeId, type);
            return;
        } else if ("editWhereExprGroup".equals(oper)) {
            String nodeId = req.getParameter("nodeId");
            String type = req.getParameter("type");

            handler.editWhereExprGroup(nodeId, type);
            return;
        } else if ("deleteWhereExpr".equals(oper)) {
            String nodeId = req.getParameter("nodeId");

            handler.deleteWhereExpr(nodeId);
            return;
        } else if ("addWhereExpr".equals(oper)) {
            String pId = req.getParameter("pId");
            String exprType = req.getParameter("exprType");

            if ("binary".equals(exprType)) {
                BinaryExpression expr = getBinaryExpression(req);
                handler.addBinaryExpression(expr, pId);
            } else if ("null".equals(exprType)) {
                Column column = getWhereExprInColumn(req);

                String operator = req.getParameter("operator");
                handler.addNullExpression(column, operator, pId);
            }
            return;
        } else if ("editWhereExpr".equals(oper)) {
            String nodeId = req.getParameter("nodeId");
            String exprType = req.getParameter("exprType");

            if ("binary".equals(exprType)) {
                BinaryExpression expr = getBinaryExpression(req);
                handler.editBinaryExpression(expr, nodeId);
            } else if ("null".equals(exprType)) {
                Column column = getWhereExprInColumn(req);

                String operator = req.getParameter("operator");
                handler.editNullExpression(column, operator, nodeId);
            }
            return;
        } else if ("save".equals(oper)) {
            // remove handler from session
            req.getSession().removeAttribute(getHandlerAttributeKey(req));

            int id = WebUtil.getIntParameter(req, "id", -23);
            QueryManager queryManager = WebUtil.getQueryManager(req);
            try {
                handler.save(id, queryManager);
            } catch (EntityExistException e) {
                log.error("", e);
                throw new ServletException(e);
            }

            return;
        }
    }

    private Column getWhereExprInColumn(HttpServletRequest req) {
        String columnWithAlias = req.getParameter("column");
        int index1 = columnWithAlias.indexOf("[");
        int index2 = columnWithAlias.indexOf("]");
        int index3 = columnWithAlias.lastIndexOf(".");

        String exprTableAlias = columnWithAlias.substring(index1 + 1, index2).trim();
        String exprColumnName = columnWithAlias.substring(index3 + 1).trim();

        Column column = new Column();
        column.setName(exprColumnName);
        column.setTableAlias(exprTableAlias);

        return column;
    }

    private BinaryExpression getBinaryExpression(HttpServletRequest req) {
        Operand innerOperand1 = getOperand(req, 1);
        Operand innerOperand2 = getOperand(req, 2);
        String strOperator = req.getParameter("operator");

        BinaryExpression expr = new BinaryExpression();
        Operand1 operand1 = new Operand1();
        operand1.setOperand(innerOperand1);
        Operand2 operand2 = new Operand2();
        operand2.setOperand(innerOperand2);
        Operator operator = new Operator();
        operator.setSimpleOperator(SimpleOperatorType.valueOf(strOperator));

        expr.setOperand1(operand1);
        expr.setOperand2(operand2);
        expr.setOperator(operator);
        return expr;
    }

    private Operand getOperand(HttpServletRequest req, int i) {
        String type = req.getParameter("operand" + i + "Type");

        Operand operand = new Operand();
        if ("column".equals(type)) {
            String columnWithAlias = req.getParameter("column" + i);
            int index1 = columnWithAlias.indexOf("[");
            int index2 = columnWithAlias.indexOf("]");
            int index3 = columnWithAlias.lastIndexOf(".");

            String tableAlias = columnWithAlias.substring(index1 + 1, index2).trim();
            String columnName = columnWithAlias.substring(index3 + 1).trim();

            Column column = new Column();
            column.setName(columnName);
            column.setTableAlias(tableAlias);
            operand.setColumn(column);
        } else if ("contextValue".equals(type)) {
            String str = req.getParameter("contextValue" + i);

            ContextValue ctxValue = new ContextValue();
            ctxValue.setKey(str);
            Value value = new Value();
            value.setContextValue(ctxValue);
            operand.setValue(value);
        } else if ("userValue".equals(type)) {
            String str = req.getParameter("userValue" + i);

            UserValue uValue = new UserValue();
            uValue.setKey(str);
            Value value = new Value();
            value.setUserValue(uValue);
            operand.setValue(value);
        } else if ("simpleValue".equals(type)) {
            String str = req.getParameter("simpleValue" + i);
            String simpleValueType = req.getParameter("simpleValueType" + i);
            SimpleValue sValue = new SimpleValue();
            sValue.setContent(str);
            sValue.setType(SimpleValueTypeTypeType.valueOf(simpleValueType));

            Value value = new Value();
            value.setSimpleValue(sValue);
            operand.setValue(value);
        }

        return operand;
    }
}