/** * 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.StringReader; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.ValidationException; import org.ralasafe.EntityExistException; import org.ralasafe.db.sql.xml.BusinessDataType; import org.ralasafe.db.sql.xml.DefineVariable; import org.ralasafe.db.sql.xml.UserCategory; import org.ralasafe.db.sql.xml.UserCategoryType; import org.ralasafe.entitle.DecisionEntitlement; import org.ralasafe.entitle.DecisionEntitlementTestResult; import org.ralasafe.entitle.EntitleManager; import org.ralasafe.entitle.QueryManager; import org.ralasafe.privilege.Privilege; import org.ralasafe.user.User; import org.ralasafe.util.StringUtil; import org.ralasafe.util.Util; public class DecisionEntitlementHandler { private Privilege privilege; private List decisionEntitlements=new ArrayList(); private QueryManager queryManager; private EntitleManager entitleManager; private String businessDataClass; public DecisionEntitlementHandler( Privilege privilege, Collection entitlements, QueryManager queryManager, EntitleManager entitleManager ) { this.privilege=privilege; this.decisionEntitlements.addAll( entitlements ); this.queryManager=queryManager; this.entitleManager=entitleManager; } public String getBusinessDataClass() { return businessDataClass; } public void setBusinessDataClass( String businessDataClass ) { this.businessDataClass=businessDataClass; } public Privilege getPrivilege() { return privilege; } public List getDecisionEntitlements() { return decisionEntitlements; } public void addEntitle( DecisionEntitlement entitle ) { decisionEntitlements.add( entitle ); } public void updateEntitle( int index, DecisionEntitlement entitle ) { decisionEntitlements.set( index, entitle ); } public void moveEntitle( int index, String direct ) { int moveIndex=index; // change column with it int changeIndex=-1; if( "top".equals( direct ) ) { if( moveIndex!=0 ) { changeIndex=0; } } else if( "up".equals( direct ) ) { if( moveIndex!=0 ) { changeIndex=moveIndex-1; } } else if( "down".equals( direct ) ) { if( moveIndex!=(decisionEntitlements.size()-1) ) { changeIndex=moveIndex+1; } } else if( "bottom".equals( direct ) ) { if( moveIndex!=(decisionEntitlements.size()-1) ) { changeIndex=decisionEntitlements.size()-1; } } if( changeIndex!=-1 ) { Object moveOne=decisionEntitlements.get( moveIndex ); if( "top".equals( direct ) ) { decisionEntitlements.remove( moveIndex ); decisionEntitlements.add( 0, moveOne ); } else if( "bottom".equals( direct ) ) { decisionEntitlements.remove( moveIndex ); decisionEntitlements.add( decisionEntitlements.size(), moveOne ); } else if( "up".equals( direct ) || "down".equals( direct ) ) { Object changeOne=decisionEntitlements.get( changeIndex ); decisionEntitlements.set( changeIndex, moveOne ); decisionEntitlements.set( moveIndex, changeOne ); } } } public void deleteEntitle( int index ) { decisionEntitlements.remove( index ); } public void save() throws EntityExistException { Collection oldEntitles=entitleManager.getDecisionEntitlements( privilege.getId() ); // delete old entries for( Iterator iter=oldEntitles.iterator(); iter.hasNext(); ) { DecisionEntitlement entitle=(DecisionEntitlement) iter.next(); entitleManager.deleteDecisionEntitlement( entitle.getId() ); } // add new entries for( Iterator iter=decisionEntitlements.iterator(); iter.hasNext(); ) { DecisionEntitlement entitle=(DecisionEntitlement) iter.next(); entitleManager.addDecisionEntitlement( entitle ); } } public String[] getTestContextFields() throws MarshalException, ValidationException { Set fields=new HashSet(); for( Iterator iter=decisionEntitlements.iterator(); iter.hasNext(); ) { DecisionEntitlement entitle=(DecisionEntitlement) iter.next(); String xmlContent=entitle.getBusinessData().getXmlContent(); BusinessDataType bdt=BusinessDataType.unmarshal( new StringReader( xmlContent ) ); DefineVariable[] defineVariables=bdt.getDefineVariable(); Util.extractContextValueFields( defineVariables, queryManager, fields ); xmlContent=entitle.getUserCategory().getXmlContent(); UserCategoryType unmarshal; unmarshal=UserCategory.unmarshal( new StringReader( xmlContent ) ); DefineVariable[] variables=unmarshal.getDefineVariable(); Util.extractContextValueFields( variables, queryManager, fields ); } return (String[]) fields.toArray( new String[0] ); } public DecisionEntitlementTestResult run( Locale locale, User testUser, Map testCtx ) { DecisionEntitlementTestResult testDecisionEntitlement=entitleManager.testDecisionEntitlement( locale, privilege.getId(), decisionEntitlements, testUser, testCtx ); return testDecisionEntitlement; } public String[] getTestBusinessDataFieldTypes() throws MarshalException, ValidationException { 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 String[] getTestBusinessDataFields() throws MarshalException, ValidationException { Set fields=new HashSet(); for( Iterator iter=decisionEntitlements.iterator(); iter.hasNext(); ) { DecisionEntitlement entitle=(DecisionEntitlement) iter.next(); String xmlContent=entitle.getBusinessData().getXmlContent(); BusinessDataType bdt=BusinessDataType.unmarshal( new StringReader( xmlContent ) ); DefineVariable[] defineVariables=bdt.getDefineVariable(); Util.extractBusinessDataFields( defineVariables, fields ); } return (String[]) fields.toArray( new String[0] ); } }