/** * 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; } }