//$Id: RestrictionEntityQueryApply.java 2008-6-9 下午09:38:33 chaostone Exp $
/*
*
* Copyright c 2005-2009
* Licensed under the Apache License, Version 2.0 (the "License")
* http://www.apache.org/licenses/LICENSE-2.0
*
*
*/
/********************************************************************************
* @author chaostone
*
* MODIFICATION DESCRIPTION
*
* Name Date Description
* ============ ============ ============
* chaostone 2008-6-9 Created
*
********************************************************************************/
package org.beanfuse.security.restriction.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.beanfuse.query.Condition;
import org.beanfuse.query.EntityQuery;
import org.beanfuse.security.AuthorityException;
import org.beanfuse.security.restriction.Param;
import org.beanfuse.security.restriction.Restriction;
import org.beanfuse.security.restriction.Pattern;
public class RestrictionEntityQueryApply implements RestrictionApply {
public void apply(EntityQuery query, Collection patterns, Collection restrictions) {
String prefix = "(";
StringBuilder conBuffer = new StringBuilder();
List paramValues = new ArrayList();
int index = 0;
Map patternMap = new HashMap();
for (Iterator iterator = patterns.iterator(); iterator.hasNext();) {
Pattern pattern = (Pattern) iterator.next();
patternMap.put(pattern.getParamGroup(), pattern);
}
for (Iterator iterator = restrictions.iterator(); iterator.hasNext();) {
Restriction restriction = (Restriction) iterator.next();
// 处理限制对应的模式
Pattern pattern = (Pattern) patternMap.get(restriction
.getParamGroup());
if (null == pattern || StringUtils.isEmpty(pattern.getContent())) {
continue;
}
String patternContent = pattern.getContent();
patternContent = StringUtils.replace(patternContent, "{alias}", query.getAlias());
String[] contents = StringUtils.split(
StringUtils.replace(patternContent, " and ", "$"), "$");
StringBuilder singleConBuf = new StringBuilder(prefix);
for (int i = 0; i < contents.length; i++) {
String content = contents[i];
Condition c = new Condition(content);
List params = c.getNamedParams();
for (Iterator iter = params.iterator(); iter.hasNext();) {
String paramName = (String) iter.next();
Param param = pattern.getParamGroup().getParam(paramName);
String value = restriction.getItem(param);
if (StringUtils.isNotEmpty(value)) {
if (value.equals(Restriction.ALL)) {
content = "";
} else {
content = StringUtils.replace(content, ":" + param.getName(), ":"
+ param.getName() + index);
paramValues.add(restriction.getValue(param));
}
} else {
throw new AuthorityException(paramName + " had not been initialized");
}
}
if (singleConBuf.length() > 1 && content.length() > 0) {
singleConBuf.append(" and ");
}
singleConBuf.append(content);
}
if (singleConBuf.length() > 1) {
singleConBuf.append(')');
if (conBuffer.length() > 0) {
conBuffer.append(" or ");
}
conBuffer.append(singleConBuf.toString());
}
index++;
}
if (conBuffer.length() > 0) {
Condition con = new Condition(conBuffer.toString());
con.setValues(paramValues);
query.add(con);
}
}
public void apply(EntityQuery query, Pattern pattern, Restriction restriction) {
apply(query, Collections.singletonList(pattern), Collections.singletonList(restriction));
}
}