1 package jp.sourceforge.stigmata.filter;
7 import java.lang.reflect.InvocationTargetException;
8 import java.util.ArrayList;
9 import java.util.HashMap;
10 import java.util.Iterator;
11 import java.util.List;
14 import jp.sourceforge.stigmata.BirthmarkEnvironment;
15 import jp.sourceforge.stigmata.ComparisonPairFilter;
16 import jp.sourceforge.stigmata.ComparisonPairFilterSet;
17 import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
19 import org.apache.commons.beanutils.BeanUtils;
23 * @author Haruaki TAMADA
25 public class ComparisonPairFilterManager{
26 private Map<String, ComparisonPairFilterSpi> services = new HashMap<String, ComparisonPairFilterSpi>();
27 private Map<String, ComparisonPairFilterSet> filters = new HashMap<String, ComparisonPairFilterSet>();
28 private ComparisonPairFilterManager parent;
30 public ComparisonPairFilterManager(BirthmarkEnvironment env, ComparisonPairFilterManager parent){
32 for(Iterator<ComparisonPairFilterSpi> i = env.lookupProviders(ComparisonPairFilterSpi.class); i.hasNext(); ){
33 ComparisonPairFilterSpi service = i.next();
34 if(getService(service.getFilterName()) != null){
35 services.put(service.getFilterName(), service);
40 public ComparisonPairFilterManager(BirthmarkEnvironment env){
41 for(Iterator<ComparisonPairFilterSpi> i = env.lookupProviders(ComparisonPairFilterSpi.class); i.hasNext(); ){
42 ComparisonPairFilterSpi service = i.next();
43 services.put(service.getFilterName(), service);
47 public synchronized ComparisonPairFilterSet[] getFilterSets(){
48 List<ComparisonPairFilterSet> list = new ArrayList<ComparisonPairFilterSet>();
50 for(ComparisonPairFilterSet fs: parent.getFilterSets()){
51 if(filters.get(fs.getName()) == null){
56 list.addAll(filters.values());
57 return list.toArray(new ComparisonPairFilterSet[list.size()]);
60 public synchronized ComparisonPairFilterSet[] getFilterSets(String[] names){
61 List<ComparisonPairFilterSet> list = new ArrayList<ComparisonPairFilterSet>();
62 for(int i = 0; i < names.length; i++){
63 list.add(getFilterSet(names[i]));
65 return list.toArray(new ComparisonPairFilterSet[list.size()]);
68 public void addFilterSet(ComparisonPairFilterSet filterset){
69 filters.put(filterset.getName(), filterset);
72 public void removeFilterSet(String filterSetName){
73 if(filters.get(filterSetName) != null){
74 filters.remove(filterSetName);
77 if(parent != null && parent.getFilterSet(filterSetName) != null){
78 filters.remove(filterSetName);
83 public ComparisonPairFilterSet getFilterSet(String filterSetName){
84 ComparisonPairFilterSet filter = filters.get(filterSetName);
85 if(filter == null && parent != null){
86 filter = parent.getFilterSet(filterSetName);
91 public ComparisonPairFilter buildFilter(String filterName, String criterion, Map<String, String> values){
92 Criterion c = Criterion.valueOf(criterion);
94 return buildFilter(filterName, c, values);
96 throw new IllegalArgumentException("criterion not found: " + criterion);
99 public ComparisonPairFilter buildFilter(String filterName, Criterion criterion, Map<String, String> values){
100 ComparisonPairFilter filter = createFilter(filterName);
102 filter.setCriterion(criterion);
103 for(Map.Entry<String, String> entry: values.entrySet()){
105 Object value = entry.getValue();
106 if(entry.getKey().equals("target")){
107 value = FilterTarget.valueOf(String.valueOf(value));
109 BeanUtils.setProperty(filter, entry.getKey(), value);
110 }catch(IllegalAccessException e){
113 }catch(InvocationTargetException e){
122 public ComparisonPairFilter createFilter(String filterName){
123 if(hasService(filterName)){
124 return getService(filterName).getFilter();
129 public ComparisonPairFilterSpi removeService(String name){
130 if(parent != null && parent.hasService(name)){
131 parent.removeService(name);
133 return services.remove(name);
136 public void addService(ComparisonPairFilterSpi service){
137 if(parent == null || parent.getService(service.getFilterName()) == null){
138 services.put(service.getFilterName(), service);
142 public boolean hasService(String name){
143 return (parent != null && parent.hasService(name)) || services.get(name) != null;
146 public ComparisonPairFilterSpi getService(String name){
147 ComparisonPairFilterSpi service = null;
149 service = parent.getService(name);
152 service = services.get(name);