package org.genedb.web.tags.db;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import org.apache.log4j.Logger;
import org.gmod.schema.mapped.CvTerm;
import org.gmod.schema.utils.propinterface.PropertyI;
public class PropertyFilterTag extends SimpleTagSupport {
private static final Logger logger = Logger.getLogger(PropertyFilterTag.class);
private Collection<PropertyI> items;
private String cvName, cvTermName, var;
private Pattern cvNamePattern;
public void setVar(String var) {
this.var = var;
}
public void setItems(Collection<PropertyI> items) {
this.items = items;
}
public void setCv(String name) {
if (cvNamePattern != null)
throw new IllegalStateException("Cannot set CV name if CV pattern has been set");
this.cvName = name;
}
public void setCvTerm(String name) {
this.cvTermName = name;
}
public void setCvPattern(String pattern) {
if (cvName != null)
throw new IllegalStateException("Cannot set CV pattern if CV name has been set");
this.cvNamePattern = Pattern.compile(pattern);
}
private boolean filterMatches(CvTerm cvTerm) {
if (cvName != null && !cvTerm.getCv().getName().equals(cvName))
return false; // The wrong CV
if (cvNamePattern != null) {
Matcher matcher = cvNamePattern.matcher(cvTerm.getCv().getName());
if (!matcher.matches())
return false;
}
return (cvTermName == null || cvTerm.getName().equals(cvTermName));
}
@Override
public void doTag() throws JspException, IOException {
if (items == null) {
logger.error("Items is null");
getJspContext().setAttribute(var, null);
return;
}
List<PropertyI> filteredItems = new ArrayList<PropertyI>();
for (PropertyI propertyI : items)
if (filterMatches(propertyI.getType()))
filteredItems.add(propertyI);
getJspContext().setAttribute(var, filteredItems);
JspFragment body = getJspBody();
if (body != null) {
JspContext context = getJspContext();
body.invoke(context.getOut());
context.removeAttribute(var);
}
}
}