/**
* 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.DefineVariable;
import org.ralasafe.db.sql.xml.UserCategory;
import org.ralasafe.db.sql.xml.UserCategoryType;
import org.ralasafe.entitle.EntitleManager;
import org.ralasafe.entitle.Query;
import org.ralasafe.entitle.QueryEntitlement;
import org.ralasafe.entitle.QueryEntitlementTestResult;
import org.ralasafe.entitle.QueryManager;
import org.ralasafe.privilege.Privilege;
import org.ralasafe.user.User;
import org.ralasafe.util.Util;
public class QueryEntitlementHandler {
private Privilege privilege;
private List queryEntitlements=new ArrayList();
private QueryManager queryManager;
private EntitleManager entitleManager;
public QueryEntitlementHandler( Privilege privilege,
Collection entitlements, QueryManager queryManager,
EntitleManager entitleManager ) {
this.privilege=privilege;
this.queryEntitlements.addAll( entitlements );
this.queryManager=queryManager;
this.entitleManager=entitleManager;
}
public Privilege getPrivilege() {
return privilege;
}
public List getQueryEntitlements() {
return queryEntitlements;
}
public void addEntitle( QueryEntitlement entitle ) {
queryEntitlements.add( entitle );
}
public void updateEntitle( int index, QueryEntitlement entitle ) {
queryEntitlements.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!=(queryEntitlements.size()-1) ) {
changeIndex=moveIndex+1;
}
} else if( "bottom".equals( direct ) ) {
if( moveIndex!=(queryEntitlements.size()-1) ) {
changeIndex=queryEntitlements.size()-1;
}
}
if( changeIndex!=-1 ) {
Object moveOne=queryEntitlements.get( moveIndex );
if( "top".equals( direct ) ) {
queryEntitlements.remove( moveIndex );
queryEntitlements.add( 0, moveOne );
} else if( "bottom".equals( direct ) ) {
queryEntitlements.remove( moveIndex );
queryEntitlements.add( queryEntitlements.size(), moveOne );
} else if( "up".equals( direct ) || "down".equals( direct ) ) {
Object changeOne=queryEntitlements.get( changeIndex );
queryEntitlements.set( changeIndex, moveOne );
queryEntitlements.set( moveIndex, changeOne );
}
}
}
public void deleteEntitle( int index ) {
queryEntitlements.remove( index );
}
public void save() throws EntityExistException {
Collection oldEntitles=entitleManager.getQueryEntitlements( privilege.getId() );
// delete old entries
for( Iterator iter=oldEntitles.iterator(); iter.hasNext(); ) {
QueryEntitlement entitle=(QueryEntitlement) iter.next();
entitleManager.deleteQueryEntitlement( entitle.getId() );
}
// add new entries
for( Iterator iter=queryEntitlements.iterator(); iter.hasNext(); ) {
QueryEntitlement entitle=(QueryEntitlement) iter.next();
entitleManager.addQueryEntitlement( entitle );
}
}
public String[] getTestContextFields() throws MarshalException, ValidationException {
Set fields=new HashSet();
for( Iterator iter=queryEntitlements.iterator(); iter.hasNext(); ) {
QueryEntitlement entitle=(QueryEntitlement) iter.next();
Query query=entitle.getQuery();
org.ralasafe.db.sql.Query sqlQuery=query.getSqlQuery();
Util.extractContextValueFields( sqlQuery, fields );
String 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 QueryEntitlementTestResult run( Locale locale, User testUser, Map testCtx, int first,
int max ) {
QueryEntitlementTestResult testQueryEntitlement=entitleManager.testQueryEntitlement( locale, privilege.getId(), queryEntitlements,
testUser, testCtx, first, max );
return testQueryEntitlement;
}
}