/** * 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 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.SystemConstant; import org.ralasafe.db.sql.xml.BinaryExpr; import org.ralasafe.db.sql.xml.ContextValue; import org.ralasafe.db.sql.xml.DefineVariable; import org.ralasafe.db.sql.xml.ExprGroup; import org.ralasafe.db.sql.xml.ExprGroupTypeItem; import org.ralasafe.db.sql.xml.Formula; import org.ralasafe.db.sql.xml.HintValue; import org.ralasafe.db.sql.xml.InExpr; import org.ralasafe.db.sql.xml.IsNotNullExpr; import org.ralasafe.db.sql.xml.IsNullExpr; import org.ralasafe.db.sql.xml.NotInExpr; import org.ralasafe.db.sql.xml.Operator; import org.ralasafe.db.sql.xml.QueryRef; import org.ralasafe.db.sql.xml.SimpleValue; import org.ralasafe.db.sql.xml.UserValue; import org.ralasafe.db.sql.xml.Variable; import org.ralasafe.db.sql.xml.Variable1; import org.ralasafe.db.sql.xml.Variable2; import org.ralasafe.db.sql.xml.types.FormulaTypeOperatorType; import org.ralasafe.db.sql.xml.types.FormulaTypeTypeType; import org.ralasafe.db.sql.xml.types.SimpleOperatorType; import org.ralasafe.db.sql.xml.types.SimpleValueTypeTypeType; import org.ralasafe.entitle.QueryManager; import org.ralasafe.util.StringUtil; public abstract class AbstractPolicyDesignAction extends Action { private static final Log log=LogFactory.getLog( AbstractPolicyDesignAction.class ); public abstract AbstractPolicyDesignHandler createPolicyHandler( HttpServletRequest req ); public abstract String getPolicyHandlerAttributeKey( HttpServletRequest req ); private AbstractPolicyDesignHandler getPolicyHandler( HttpServletRequest req ) { String oper=req.getParameter( "oper" ); String key=getPolicyHandlerAttributeKey( req ); AbstractPolicyDesignHandler handler=(AbstractPolicyDesignHandler) req.getSession().getAttribute( key ); if( handler==null||"loadFresh".equals(oper) ) { handler=createPolicyHandler( req ); // save into session, will be removed when policy is saved req.getSession().setAttribute( key, handler ); } handler.setDesignMode(); return handler; } protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { String oper=req.getParameter( "oper" ); if( log.isDebugEnabled() ) { log.debug( "oper=" + oper ); } AbstractPolicyDesignHandler handler=getPolicyHandler( req ); req.setAttribute( "handler", handler ); if( "designVariables".equals( oper ) ) { DefineVariable[] variables=handler.getVariables(); req.setAttribute( "variables", variables ); WebUtil.forward( req, resp, handler.getVariablesPage() ); } else if( "designExpr".equals( oper ) ) { WebUtil.forward( req, resp, handler.getExprTreePage() ); } else if( "getVariable".equals( oper ) ) { DefineVariable[] variables=handler.getVariables(); int index=WebUtil.getIntParameter( req, "index", 0 ); DefineVariable var=variables[index]; String gotoPage=getVariableDefinePage( var ); String[] userFields=WebUtil.getUserType( req ).getUserMetadata().getUserFields(); req.setAttribute( "userFields", userFields ); req.setAttribute( "variable", var ); WebUtil.forward( req, resp, gotoPage ); } else if( "newVariable".equals( oper ) ) { String gotoPage=getVariableDefinePage( req ); String[] userFields=WebUtil.getUserType( req ).getUserMetadata().getUserFields(); req.setAttribute( "userFields", userFields ); WebUtil.forward( req, resp, gotoPage ); } else if( "return".equals( oper ) ) { String gotoPage=handler.getManagePage(); // remove handler from session req.getSession().removeAttribute( getPolicyHandlerAttributeKey( req ) ); // goto manage page resp.sendRedirect( gotoPage ); return; } else if( "exprContextMenu".equals( oper ) ) { String nodeId=req.getParameter( "nodeId" ); Object obj=handler.getExprItem( nodeId ); req.setAttribute( "item", obj ); WebUtil.forward( req, resp, handler.getExprContextMenuPage() ); } else if( "loadExprForm".equals( oper ) ) { String nodeId=req.getParameter( "nodeId" ); //String pId=req.getParameter( "pId" ); String exprType=req.getParameter( "exprType" ); if( !StringUtil.isEmpty( nodeId ) ) { Object obj=handler.getExprItem( nodeId ); ExprGroupTypeItem item=(ExprGroupTypeItem) obj; req.setAttribute( "item", item ); Object choiceValue=item.getChoiceValue(); if( choiceValue instanceof BinaryExpr ) { exprType="binary"; } else if( choiceValue instanceof InExpr || choiceValue instanceof NotInExpr ) { exprType="in"; } else if( choiceValue instanceof IsNullExpr || choiceValue instanceof IsNotNullExpr ) { exprType="null"; } } if( "binary".equals( exprType ) ) { WebUtil.forward( req, resp, handler.getBinaryExprPage() ); } else if( "in".equals( exprType ) ) { WebUtil.forward( req, resp, handler.getInExprPage() ); } else if( "null".equals( exprType ) ) { WebUtil.forward( req, resp, handler.getNullExprPage() ); } return; } else { // default: goto design page WebUtil.forward( req, resp, handler.getDesignMainPage() ); } } private String getVariableDefinePage( HttpServletRequest req ) { String varType=req.getParameter( "type" ); if( "contextValue".equals( varType ) ) { return "/ralasafe/common/contextValue.jsp"; } else if( "formula".equals( varType ) ) { return "/ralasafe/common/formula.jsp"; } else if( "hintValue".equals( varType ) ) { return "/ralasafe/common/businessData.jsp"; } else if( "query".equals( varType ) ) { return "/ralasafe/common/queryRef.jsp"; } else if( "simpleValue".equals( varType ) ) { return "/ralasafe/common/simpleValue.jsp"; } else if( "userValue".equals( varType ) ) { return "/ralasafe/common/userValue.jsp"; } else if( "hintValue".equals( varType ) ) { return "/ralasafe/common/businessData.jsp"; } else { throw new RalasafeException( "Unknown variable type" ); } } private String getVariableDefinePage( DefineVariable var ) { if( var.getContextValue()!=null ) { return "/ralasafe/common/contextValue.jsp"; } else if( var.getFormula()!=null ) { return "/ralasafe/common/formula.jsp"; } else if( var.getHintValue()!=null ) { return "/ralasafe/common/businessData.jsp"; } else if( var.getQueryRef()!=null ) { return "/ralasafe/common/queryRef.jsp"; } else if( var.getSimpleValue()!=null ) { return "/ralasafe/common/simpleValue.jsp"; } else if( var.getUserValue()!=null ) { return "/ralasafe/common/userValue.jsp"; } else { throw new RalasafeException( "Unknown variable type" ); } } protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { String oper=req.getParameter( "oper" ); if( log.isDebugEnabled() ) { log.debug( "oper=" + oper ); } AbstractPolicyDesignHandler handler=getPolicyHandler( req ); req.setAttribute( "handler", handler ); if( "deleteVariable".equals( oper ) ) { int id=WebUtil.getIntParameter( req, "index", 0 ); handler.deleteVariable( id ); } else if( "addVariable".equals( oper ) ) { DefineVariable var=getDefineVariable( req ); handler.addVariable( var ); } else if( "updateVariable".equals( oper ) ) { DefineVariable var=getDefineVariable( req ); int varIndex=WebUtil.getIntParameter( req, "index", -1 ); handler.updateVariable( varIndex, var ); } else if( "loadExprTree".equals( oper ) ) { ExprGroup exprGroup=handler.getExprGroup(); resp.setContentType("application/json;charset=UTF-8"); ServletOutputStream out=resp.getOutputStream(); String xml=handler.getExpressionTree( exprGroup ); if( log.isDebugEnabled() ) { log.debug( "Expression tree json: " + xml ); } out.println( xml ); out.flush(); } else if( "addExprChildExprGroup".equals( oper ) ) { String nodeId=req.getParameter( "nodeId" ); String type=req.getParameter( "type" ); handler.addExprChildExprGroup( nodeId, type ); return; } else if( "editExprGroup".equals( oper ) ) { String nodeId=req.getParameter( "nodeId" ); String type=req.getParameter( "type" ); handler.editExprGroup( nodeId, type ); return; } else if( "deleteExpr".equals( oper ) ) { String nodeId=req.getParameter( "nodeId" ); handler.deleteExpr( nodeId ); return; } else if( "addExprChild".equals( oper ) ) { String pId=req.getParameter( "pId" ); String exprType=req.getParameter( "exprType" ); if( "binary".equals( exprType ) ) { BinaryExpr expr=getBinaryExpr( req ); handler.addBinaryExpr( expr, pId ); } else if( "null".equals( exprType ) ) { Variable var=getVariable( req ); String operator=req.getParameter( "operator" ); handler.addNullExpr( var, operator, pId ); } else if( "in".equals( exprType ) ) { Variable var1=getVariable( req, 1 ); Variable var2=getVariable( req, 2 ); String operator=req.getParameter( "operator" ); handler.addInExpr( var1, var2, operator, pId ); } return; } else if( "editExpr".equals( oper ) ) { String nodeId=req.getParameter( "nodeId" ); String exprType=req.getParameter( "exprType" ); if( "binary".equals( exprType ) ) { BinaryExpr expr=getBinaryExpr( req ); handler.editBinaryExpr( expr, nodeId ); } else if( "null".equals( exprType ) ) { Variable var=getVariable( req ); String operator=req.getParameter( "operator" ); handler.editNullExpr( var, operator, nodeId ); } else if( "in".equals( exprType ) ) { Variable var1=getVariable( req, 1 ); Variable var2=getVariable( req, 2 ); String operator=req.getParameter( "operator" ); handler.editInExpr( var1, var2, operator, nodeId ); } return; } else if( "save".equals( oper ) ) { // remove handler from session req.getSession().removeAttribute( getPolicyHandlerAttributeKey( req ) ); int id=WebUtil.getIntParameter( req, "id", -23 ); try { handler.save( id ); } catch( EntityExistException e ) { log.error( "", e ); throw new ServletException( e ); } return; } } private Variable getVariable( HttpServletRequest req ) { String varName=req.getParameter( "varName" ); Variable var=new Variable(); var.setName( varName ); return var; } private Variable getVariable( HttpServletRequest req, int index ) { String varName=req.getParameter( "varName"+index ); Variable var=new Variable(); var.setName( varName ); return var; } private BinaryExpr getBinaryExpr( HttpServletRequest req ) { String varName1=req.getParameter( "varName1" ); String varName2=req.getParameter( "varName2" ); String operator=req.getParameter( "operator" ); Variable1 v1=new Variable1(); v1.setName( varName1 ); Variable2 v2=new Variable2(); v2.setName( varName2 ); Operator oper=new Operator(); oper.setSimpleOperator( SimpleOperatorType.valueOf( operator ) ); BinaryExpr expr=new BinaryExpr(); expr.setVariable1( v1 ); expr.setVariable2( v2 ); expr.setOperator( oper ); return expr; } private DefineVariable getDefineVariable( HttpServletRequest req ) { String type=req.getParameter( "type" ); String name=req.getParameter( "name" ); DefineVariable var=new DefineVariable(); var.setName( name ); if( "userValue".equals( type ) ) { String key=req.getParameter( "key" ); UserValue userValue=new UserValue(); userValue.setKey( key ); var.setUserValue( userValue ); } else if( "simpleValue".equals( type ) ) { String content=req.getParameter( "content" ); String stype=req.getParameter( "stype" ); SimpleValue value=new SimpleValue(); value.setContent( content ); value.setType( SimpleValueTypeTypeType.valueOf( stype ) ); var.setSimpleValue( value ); } else if( "contextValue".equals( type ) ) { String key=req.getParameter( "key" ); ContextValue value=new ContextValue(); value.setKey( key ); var.setContextValue( value ); } else if( "hintValue".equals( type ) ) { String key=req.getParameter( "key" ); HintValue value=new HintValue(); value.setKey( key ); value.setHint( SystemConstant.BUSINESS_DATA ); var.setHintValue( value ); } else if( "formula".equals( type ) ) { String operName1=req.getParameter( "operName1" ); String operName2=req.getParameter( "operName2" ); String operator=req.getParameter( "operator" ); String returnType=req.getParameter( "returnType" ); Variable var0=new Variable(); var0.setName( operName1 ); Variable var1=new Variable(); var1.setName( operName2 ); Formula value=new Formula(); value.addVariable( var0 ); value.addVariable( var1 ); value.setOperator( FormulaTypeOperatorType.valueOf( operator ) ); value.setType( FormulaTypeTypeType.valueOf( returnType ) ); var.setFormula( value ); } else if( "queryRef".equals( type ) ) { int id=WebUtil.getIntParameter( req, "queryId", -999 ); QueryManager mng=WebUtil.getQueryManager( req ); String queryName=mng.getQuery( id ).getName(); QueryRef value=new QueryRef(); value.setId( id ); value.setName( queryName ); var.setQueryRef( value ); } return var; } }