/** * 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.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.ralasafe.EntityExistException; import org.ralasafe.db.sql.Value; 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.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.LinkerType; import org.ralasafe.entitle.Query; import org.ralasafe.entitle.QueryManager; import org.ralasafe.entitle.ScriptTestResult; import org.ralasafe.script.AbstractPolicy; import org.ralasafe.user.User; import org.ralasafe.util.StringUtil; import org.ralasafe.util.Util; public abstract class AbstractPolicyDesignHandler { private String designMainPage="/ralasafe/common/policyDesignTemplate.jsp"; private String rawMainPage="/ralasafe/common/policyRawTemplate.jsp"; private String variablesPage="/ralasafe/common/variables.jsp"; private String exprTreePage="/ralasafe/common/exprTree.jsp"; private String exprContextMenuPage="/ralasafe/common/exprContextMenu.jsp"; private String binaryExprPage="/ralasafe/common/editBinaryExpr.jsp"; private String inExprPage="/ralasafe/common/editInExpr.jsp"; private String nullExprPage="/ralasafe/common/editNullExpr.jsp"; private String testMainPage="/ralasafe/common/policyTest.jsp"; private String showTestResultPage="/ralasafe/common/showTestResult.jsp"; private String businessDataClass; private AbstractPolicy policy; private QueryManager queryManager; public String getTestMainPage() { return testMainPage; } public void setTestMainPage( String testMainPage ) { this.testMainPage=testMainPage; } public String getShowTestResultPage() { return showTestResultPage; } public void setShowTestResultPage( String showTestResultPage ) { this.showTestResultPage=showTestResultPage; } public String getBinaryExprPage() { return binaryExprPage; } public void setBinaryExprPage( String binaryExprPage ) { this.binaryExprPage=binaryExprPage; } public String getInExprPage() { return inExprPage; } public void setInExprPage( String inExprPage ) { this.inExprPage=inExprPage; } public String getNullExprPage() { return nullExprPage; } public void setNullExprPage( String nullExprPage ) { this.nullExprPage=nullExprPage; } public abstract String getPolicyType(); public String getDesignMainPage() { return designMainPage; } public void setDesignMainPage( String designMainPage ) { this.designMainPage=designMainPage; } public String getRawMainPage() { return rawMainPage; } public void setRawMainPage( String rawMainPage ) { this.rawMainPage=rawMainPage; } public String getVariablesPage() { return variablesPage; } public void setVariablesPage( String variablesPage ) { this.variablesPage=variablesPage; } public abstract String getDesignPageTitle(); public abstract String getRawPageTitle(); public abstract String getManagePage(); public String getExprContextMenuPage() { return exprContextMenuPage; } public void setExprContextMenuPage( String exprContextMenuPage ) { this.exprContextMenuPage=exprContextMenuPage; } public abstract DefineVariable[] getVariables(); public abstract void deleteVariable( int id ); public abstract void addVariable( DefineVariable var ); public abstract void updateVariable( int varIndex, DefineVariable var ); public abstract ExprGroup getExprGroup(); public String getExprTreePage() { return exprTreePage; } public void setExprTreePage( String exprTreePage ) { this.exprTreePage=exprTreePage; } public String getExpressionTree( ExprGroup exprGroup ) { StringBuffer buff=new StringBuffer(); buff.append( "[" ); buff.append( "{id:'0',pId:'-1', iconSkin: 'exprGroup', name:'Root Expr group (" ) .append( exprGroup.getLinker() ) .append( ")', open:true}" ); ExprGroupTypeItem[] items=exprGroup.getExprGroupTypeItem(); if( items!=null ) { for( int i=0; i<items.length; i++ ) { ExprGroupTypeItem item=items[i]; Object value=item.getChoiceValue(); if( value instanceof BinaryExpr ) { print( (BinaryExpr) value, buff, "0", i ); } else if( value instanceof ExprGroup ) { print( (ExprGroup) value, buff, "0", i ); } else if( value instanceof InExpr ) { print( (InExpr) value, buff, "0", i ); } else if( value instanceof IsNullExpr ) { print( (IsNullExpr) value, buff, "0", i ); } else if( value instanceof IsNotNullExpr ) { print( (IsNotNullExpr) value, buff, "0", i ); } else if( value instanceof NotInExpr ) { print( (NotInExpr) value, buff, "0", i ); } } } buff.append( "]" ); return buff.toString(); } private void print( NotInExpr value, StringBuffer buff, String pid, int i ) { String nodeId=pid+"-"+i; buff.append( ",{id:'"+nodeId+"',iconSkin: 'expr',pId:'"+pid+"', name:'" ) .append( format( value.getVariable1() ) ) .append( " NOT IN " ) .append( format( value.getVariable2() ) ) .append( "'}" ); } private Object format( Variable1 variable1 ) { return variable1.getName(); } private String format( Variable2 variable2 ) { return variable2.getName(); } private void print( IsNotNullExpr value, StringBuffer buff, String pid, int i ) { String nodeId=pid+"-"+i; buff.append( ",{id:'"+nodeId+"',iconSkin: 'expr',pId:'"+pid+"', name:'" ) .append( format( value.getVariable() ) ) .append( " NOT NULL" ) .append( "'}" ); } private Object format( Variable variable ) { return variable.getName(); } private void print( IsNullExpr value, StringBuffer buff, String pid, int i ) { String nodeId=pid+"-"+i; buff.append( ",{id:'"+nodeId+"',iconSkin: 'expr',pId:'"+pid+"', name:'" ) .append( format( value.getVariable() ) ) .append( " NULL" ) .append( "'}" ); } private void print( InExpr value, StringBuffer buff, String pid, int i ) { String nodeId=pid+"-"+i; buff.append( ",{id:'"+nodeId+"',iconSkin: 'expr',pId:'"+pid+"', name:'" ) .append( format( value.getVariable1() ) ) .append( " IN " ) .append( format( value.getVariable2() ) ) .append( "'}" ); } private void print( BinaryExpr value, StringBuffer buff, String pid, int i ) { String nodeId=pid+"-"+i; buff.append( ",{id:'"+nodeId+"',iconSkin: 'expr',pId:'"+pid+"', name:'" ) .append( format(value.getVariable1() ) ) .append( value.getOperator().getSimpleOperator() ) .append( format(value.getVariable2() ) ) .append( "'}" ); } private void print( ExprGroup exprGroup, StringBuffer buff, String pid, int xPosition ) { String nodeId=pid+"-"+xPosition; // print this node buff.append( ",{id:'"+nodeId+"',iconSkin: 'exprGroup',pId:'"+pid+"', name:'Expr group (" ) .append( exprGroup.getLinker() ) .append( ")', open:true}" ); // print children items ExprGroupTypeItem[] items=exprGroup.getExprGroupTypeItem(); if( items!=null ) { for( int i=0; i<items.length; i++ ) { ExprGroupTypeItem item=items[i]; Object value=item.getChoiceValue(); if( value instanceof BinaryExpr ) { print( (BinaryExpr) value, buff, nodeId, i ); } else if( value instanceof ExprGroup ) { print( (ExprGroup) value, buff, nodeId, i ); } else if( value instanceof InExpr ) { print( (InExpr) value, buff, nodeId, i ); } else if( value instanceof IsNullExpr ) { print( (IsNullExpr) value, buff, nodeId, i ); } else if( value instanceof IsNotNullExpr ) { print( (IsNotNullExpr) value, buff, nodeId, i ); } else if( value instanceof NotInExpr ) { print( (NotInExpr) value, buff, nodeId, i ); } } } } public String[] format( DefineVariable var ) { Object value=var.getChoiceValue(); if( value instanceof ContextValue ) { ContextValue c=(ContextValue) value; return new String[]{ "Context_value", var.getName(), c.getKey()}; } else if( value instanceof Formula ) { Formula f=(Formula) value; return new String[] { "Formula", var.getName(), f.getVariable( 0 ).getName()+f.getOperator()+f.getVariable( 1 ).getName() }; } else if( value instanceof HintValue ) { return new String[] { "Business_data_attribute", var.getName(), ( (HintValue) value ).getKey() }; } else if( value instanceof QueryRef ) { return new String[] { "Query", var.getName(), ( (QueryRef) value ).getName() }; } else if( value instanceof SimpleValue ) { return new String[] { "Simple_value", var.getName(), ( (SimpleValue) value ).getContent() }; } else if( value instanceof UserValue ) { return new String[] { "User_value", var.getName(), ( (UserValue) value ).getKey()}; } else { return new String[] { "Unknown_type", var.getName(), ""}; } } public Object getExprItem( String nodeId ) { ExprGroup group=getExprGroup(); if( "0".equals( nodeId ) ) { return group; } else { return getExprItem( group, nodeId ); } } private Object getExprItem( ExprGroup group, String nodeId ) { int indexOf=nodeId.indexOf( "-" ); String childNodeId=nodeId.substring( indexOf+1 ); indexOf=childNodeId.indexOf( "-" ); if( indexOf>0 ) { int xPosition=Integer.parseInt( childNodeId.substring( 0, indexOf ) ); ExprGroupTypeItem item=group.getExprGroupTypeItem( xPosition ); return getExprItem( item.getExprGroup(), childNodeId ); } else { int xPosition=Integer.parseInt( childNodeId ); return group.getExprGroupTypeItem( xPosition ); } } public void addExprChildExprGroup( String nodeId, String type ) { Object obj=getExprItem( nodeId ); ExprGroup parent=toGroup( obj ); ExprGroup newGrp=new ExprGroup(); newGrp.setLinker( LinkerType.valueOf( type ) ); ExprGroupTypeItem newItem=new ExprGroupTypeItem(); newItem.setExprGroup( newGrp ); parent.addExprGroupTypeItem( newItem ); } public void editExprGroup( String nodeId, String type ) { Object obj=getExprItem( nodeId ); ExprGroup group=toGroup( obj ); group.setLinker( LinkerType.valueOf( type ) ); } private ExprGroup toGroup( Object obj ) { if( obj instanceof ExprGroup ) { ExprGroup grp=(ExprGroup) obj; return grp; } else { ExprGroupTypeItem item=(ExprGroupTypeItem) obj; return item.getExprGroup(); } } public void deleteExpr( String nodeId ) { int index=nodeId.lastIndexOf( "-" ); String pId=nodeId.substring( 0,index ); int xPosition=Integer.parseInt( nodeId.substring( index+1 ) ); Object obj=getExprItem( pId ); ExprGroup parent=toGroup( obj ); parent.removeExprGroupTypeItemAt( xPosition ); } public void addBinaryExpr( BinaryExpr expr, String pId ) { Object item=getExprItem( pId ); ExprGroup group=toGroup( item ); ExprGroupTypeItem newItem=new ExprGroupTypeItem(); newItem.setBinaryExpr( expr ); group.addExprGroupTypeItem( newItem ); } public void editBinaryExpr( BinaryExpr expr, String nodeId ) { Object obj=getExprItem( nodeId ); ExprGroupTypeItem item=(ExprGroupTypeItem) obj; item.setBinaryExpr( expr ); } public void editNullExpr( Variable variable, String operator, String nodeId ) { Object obj=getExprItem( nodeId ); ExprGroupTypeItem item=(ExprGroupTypeItem) obj; if( "NULL".equals( operator ) ) { IsNullExpr expr=new IsNullExpr(); expr.setVariable( variable ); item.setIsNotNullExpr( null ); item.setIsNullExpr( expr ); } else { IsNotNullExpr expr=new IsNotNullExpr(); expr.setVariable( variable ); item.setIsNullExpr( null ); item.setIsNotNullExpr( expr ); } } public void addNullExpr( Variable variable, String operator, String pId ) { Object item=getExprItem( pId ); ExprGroup group=toGroup( item ); ExprGroupTypeItem newItem=new ExprGroupTypeItem(); if( "NULL".equals( operator ) ) { IsNullExpr expr=new IsNullExpr(); expr.setVariable( variable ); newItem.setIsNullExpr( expr ); } else { IsNotNullExpr expr=new IsNotNullExpr(); expr.setVariable( variable ); newItem.setIsNotNullExpr( expr ); } group.addExprGroupTypeItem( newItem ); } public abstract void save( int id ) throws EntityExistException; public abstract void setDesignMode(); public abstract void setRawMode(); public abstract void setRawScript( String script ); public abstract String getRawScript(); public abstract AbstractPolicy transferXml2Policy(); public void prepareTest( QueryManager queryMng ) { this.policy=transferXml2Policy(); this.queryManager=queryMng; } public QueryManager getQueryManager() { return queryManager; } public AbstractPolicy getPolicy() { return policy; } public String getScript() { if( policy.isRawScript() ) { return policy.getRawScript().toScript(); } else { return policy.getExprGroup().toScript(); } } public abstract ScriptTestResult run( User user, Object businessData, Map context ); public String[] getTestContextFields() { DefineVariable[] variables=getVariables(); List fields=new ArrayList(variables.length); Util.extractContextValueFields( variables, queryManager, fields ); return (String[]) fields.toArray( new String[0] ); } public String[] getTestBusinessDataFields() { DefineVariable[] variables=getVariables(); List fields=new ArrayList(variables.length); Util.extractBusinessDataFields( variables, fields ); return (String[]) fields.toArray( new String[0] ); } public boolean isTestUserNeeded() { DefineVariable[] variables=getVariables(); for( int i=0; i<variables.length; i++ ) { DefineVariable var=variables[i]; if( var.getUserValue()!=null ) { return true; } else if( var.getQueryRef()!=null ) { int refId=var.getQueryRef().getId(); Query query=queryManager.getQuery( refId ); ArrayList values=query.getSqlQuery().getValues(); for( Iterator iter=values.iterator(); iter.hasNext(); ) { Value v=(Value) iter.next(); if( v instanceof org.ralasafe.db.sql.UserValue ) { return true; } } } } return false; } public boolean isTestContextNeeded() { return getTestContextFields().length>0; } public boolean isTestBusinessDataNeeded() { return getTestBusinessDataFields().length>0; } public void setBusinessDataClass( String bdClass ) { this.businessDataClass=bdClass; } public String getBusinessDataClass() { return businessDataClass; } public String[] getTestBusinessDataFieldTypes() { String[] fields=getTestBusinessDataFields(); String[] types=new String[fields.length]; if( !StringUtil.isEmpty( businessDataClass ) ) { String[][] reflectJavaBean=Util.reflectJavaBean( businessDataClass ); for( int i=0; i<fields.length; i++ ) { String field=fields[i]; for( int j=0; j<reflectJavaBean.length; j++ ) { String[] strings=reflectJavaBean[j]; if( strings[0].equals( field ) ) { types[i]=strings[1]; j=reflectJavaBean.length; } } } } return types; } public void addInExpr( Variable var1, Variable var2, String operator, String pId ) { Object item=getExprItem( pId ); ExprGroup group=toGroup( item ); Variable1 var_1=new Variable1(); var_1.setName( var1.getName() ); Variable2 var_2=new Variable2(); var_2.setName( var2.getName() ); ExprGroupTypeItem newItem=new ExprGroupTypeItem(); if( "IN".equals( operator ) ) { InExpr expr=new InExpr(); expr.setVariable1( var_1 ); expr.setVariable2( var_2 ); newItem.setInExpr( expr ); } else { NotInExpr expr=new NotInExpr(); expr.setVariable1( var_1 ); expr.setVariable2( var_2 ); newItem.setNotInExpr( expr ); } group.addExprGroupTypeItem( newItem ); } public void editInExpr( Variable var1, Variable var2, String operator, String nodeId ) { Object obj=getExprItem( nodeId ); ExprGroupTypeItem item=(ExprGroupTypeItem) obj; Variable1 var_1=new Variable1(); var_1.setName( var1.getName() ); Variable2 var_2=new Variable2(); var_2.setName( var2.getName() ); if( "IN".equals( operator ) ) { InExpr expr=new InExpr(); expr.setVariable1( var_1 ); expr.setVariable2( var_2 ); item.setNotInExpr( null ); item.setInExpr( expr ); } else { NotInExpr expr=new NotInExpr(); expr.setVariable1( var_1 ); expr.setVariable2( var_2 ); item.setInExpr( null ); item.setNotInExpr( expr ); } } }