package com.venky.swf.pm;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.venky.cache.Cache;
import com.venky.core.collections.SequenceSet;
import com.venky.swf.db.annotations.column.pm.PARTICIPANT;
import com.venky.swf.db.model.Model;
import com.venky.swf.db.model.User;
import com.venky.swf.db.model._Identifiable;
import com.venky.swf.db.model.reflection.ModelReflector;
import com.venky.swf.sql.Conjunction;
import com.venky.swf.sql.Expression;
import com.venky.swf.sql.Select;
public class DataSecurityFilter {
public static boolean anyFieldIsVirtual(Set<String> fieldSet, ModelReflector<? extends Model> ref){
for (String field:fieldSet){
if (ref.isFieldVirtual(field)){
return true;
}
}
return false;
}
public static Set<String> getRedundantParticipationFields(Set<String> fieldSet, ModelReflector<? extends Model> ref){
SequenceSet<String> redundant = new SequenceSet<String>();
for (String field:fieldSet){
PARTICIPANT p = ref.getAnnotation(ref.getFieldGetter(field), PARTICIPANT.class);
if (p.redundant()){
redundant.add(field);
}
}
return redundant;
}
public static <M extends Model> List<M> getRecordsAccessible(Class<M> modelClass, User by){
return getRecordsAccessible(modelClass, by, null);
}
public static <M extends Model> List<M> getRecordsAccessible(Class<M> modelClass, User by, Expression condition){
return getRecordsAccessible(modelClass, by, condition, Select.MAX_RECORDS_ALL_RECORDS);
}
public static <M extends Model> List<M> getRecordsAccessible(Class<M> modelClass, User by, Expression condition,int maxRecords){
ModelReflector<? extends Model> ref = ModelReflector.instance(modelClass);
Cache<String,Map<String,List<Integer>>> pOptions = by.getParticipationOptions(modelClass);
Expression where = new Expression(ref.getPool(),Conjunction.AND);
if (condition != null){
where.add(condition);
}
Select s = new Select().from(modelClass);
Set<String> fields = new HashSet<String>();
for (String g : pOptions.keySet()){
fields.addAll(pOptions.get(g).keySet());
}
fields.removeAll(getRedundantParticipationFields(fields, ref));
if (!anyFieldIsVirtual(fields,ref)){
where.add(by.getDataSecurityWhereClause(ref, pOptions));
}
s.where(where);
return s.execute(modelClass,maxRecords,new Select.AccessibilityFilter<M>(by));
}
public static SequenceSet<Integer> getIds(List<? extends _Identifiable> idables){
SequenceSet<Integer> ret = new SequenceSet<Integer>();
for (_Identifiable idable: idables){
ret.add(idable.getId());
}
return ret;
}
}