/** * 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.script; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Map; import org.ralasafe.SystemConstant; import org.ralasafe.entitle.QueryManager; import org.ralasafe.entitle.UserCategoryTestResult; import org.ralasafe.user.User; import org.ralasafe.util.StringUtil; import bsh.EvalError; import bsh.Interpreter; public class UserCategory extends AbstractPolicy implements Script { public String getRule() { StringBuffer buff = new StringBuffer(); if (isRawScript()) { buff.append(getRawScript().toScript()).append("\n"); } else { buff.append("return ").append(getExprGroup().toScript()).append(";\n"); } return buff.toString(); } public String toScript() { if (getScript() == null) { StringBuffer buff = new StringBuffer(); buff.append("java.util.Map " + SystemConstant.VARIABLE_MAP + " = new java.util.HashMap();\n"); int count = getDefineVaribles().size(); for (int i = 0; i < count; i++) { DefineVariable defineVariable = (DefineVariable) getDefineVaribles() .get(i); if (defineVariable instanceof QueryRef) { QueryRef queryRef = (QueryRef) defineVariable; if (getExprGroup().isUsedByInExprOrNotInExpr(queryRef .getVariableName())) { buff.append(queryRef.toScript(true)); } else { buff.append(queryRef.toScript(false)); } } else { buff.append(defineVariable.toScript()); } buff.append(SystemConstant.VARIABLE_MAP + ".put( \"" + defineVariable.getVariableName() + "\", " + defineVariable.getVariableName() + ");\n"); } buff.append("\n"); // return values is "doesUserCategoryContain" String doesUserCategoryContain = SystemConstant.DOES_USER_CATEGORY_CONTAIN; if (isRawScript()) { buff.append(getRawScript().toScript() + ";\n"); int index = buff.indexOf("return"); if (index >= 0) { buff.replace(index, index + 6, " boolean " + doesUserCategoryContain + " = "); buff.append(";\n"); } /*else { buff.append(" boolean " + doesUserCategoryContain + " = false;"); }*/ } else { buff.append(" boolean ").append(doesUserCategoryContain) .append(" = ( ").append(getExprGroup().toScript()).append( " ); \n"); } setScript( buff.toString() ); } return getScript(); } public UserCategoryTestResult test(User user, Map context, QueryManager queryManager) { UserCategoryTestResult result = new UserCategoryTestResult(); Interpreter interpreter = new Interpreter(); String script = toScript(); try { eval(interpreter, user, context, queryManager); Boolean contain = (Boolean) interpreter .get(SystemConstant.DOES_USER_CATEGORY_CONTAIN); Map variableMap = (Map) interpreter .get(SystemConstant.VARIABLE_MAP); result.setValid(contain.booleanValue()); result.setFailed(false); result.setScript(script); result.setVariableMap(variableMap); } catch (EvalError e) { result.setFailed(true); StringWriter sw=new StringWriter(); PrintWriter pw=new PrintWriter( sw ); e.printStackTrace( pw ); result.setErrorMessage( sw.toString() ); //result.setErrorMessage(StringUtil.getEvalError(e.getMessage())); result.setScript(script); } return result; } private void eval(Interpreter interpreter, User user, Map context, QueryManager queryManager) throws EvalError { String script = toScript(); // Set variables interpreter.set(SystemConstant.USER_KEY, user); interpreter.set(SystemConstant.CONTEXT, context); interpreter.set(SystemConstant.QUERY_MANAGER, queryManager); java.text.SimpleDateFormat format = new java.text.SimpleDateFormat( "yyyy-MM-dd HH:mm"); interpreter.set(SystemConstant.SIMPLE_DATE_FORMAT, format); // eval the rule interpreter.eval(script); } }