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
26 public class ComparisonPairFilterManager{
27 private Map<String, ComparisonPairFilterSpi> services = new HashMap<String, ComparisonPairFilterSpi>();
28 private Map<String, ComparisonPairFilterSet> filters = new HashMap<String, ComparisonPairFilterSet>();
29 private ComparisonPairFilterManager parent;
31 public ComparisonPairFilterManager(BirthmarkEnvironment env, ComparisonPairFilterManager parent){
33 for(Iterator<ComparisonPairFilterSpi> i = env.lookupProviders(ComparisonPairFilterSpi.class); i.hasNext(); ){
34 ComparisonPairFilterSpi service = i.next();
35 if(getService(service.getFilterName()) != null){
36 services.put(service.getFilterName(), service);
41 public ComparisonPairFilterManager(BirthmarkEnvironment env){
42 for(Iterator<ComparisonPairFilterSpi> i = env.lookupProviders(ComparisonPairFilterSpi.class); i.hasNext(); ){
43 ComparisonPairFilterSpi service = i.next();
44 services.put(service.getFilterName(), service);
48 public synchronized ComparisonPairFilterSet[] getFilterSets(){
49 List<ComparisonPairFilterSet> list = new ArrayList<ComparisonPairFilterSet>();
51 for(ComparisonPairFilterSet fs: parent.getFilterSets()){
52 if(filters.get(fs.getName()) == null){
57 list.addAll(filters.values());
58 return list.toArray(new ComparisonPairFilterSet[list.size()]);
61 public synchronized ComparisonPairFilterSet[] getFilterSets(String[] names){
62 List<ComparisonPairFilterSet> list = new ArrayList<ComparisonPairFilterSet>();
63 for(int i = 0; i < names.length; i++){
64 list.add(getFilterSet(names[i]));
66 return list.toArray(new ComparisonPairFilterSet[list.size()]);
69 public void addFilterSet(ComparisonPairFilterSet filterset){
70 filters.put(filterset.getName(), filterset);
73 public void removeFilterSet(String filterSetName){
74 if(filters.get(filterSetName) != null){
75 filters.remove(filterSetName);
78 if(parent != null && parent.getFilterSet(filterSetName) != null){
79 filters.remove(filterSetName);
84 public ComparisonPairFilterSet getFilterSet(String filterSetName){
85 ComparisonPairFilterSet filter = filters.get(filterSetName);
86 if(filter == null && parent != null){
87 filter = parent.getFilterSet(filterSetName);
92 public ComparisonPairFilter buildFilter(String filterName, String criterion, Map<String, String> values){
93 Criterion c = Criterion.valueOf(criterion);
95 return buildFilter(filterName, c, values);
97 throw new IllegalArgumentException("criterion not found: " + criterion);
100 public ComparisonPairFilter buildFilter(String filterName, Criterion criterion, Map<String, String> values){
101 ComparisonPairFilter filter = createFilter(filterName);
103 filter.setCriterion(criterion);
104 for(Map.Entry<String, String> entry: values.entrySet()){
106 Object value = entry.getValue();
107 if(entry.getKey().equals("target")){
108 value = FilterTarget.valueOf(String.valueOf(value));
110 BeanUtils.setProperty(filter, entry.getKey(), value);
111 }catch(IllegalAccessException e){
114 }catch(InvocationTargetException e){
123 public ComparisonPairFilter createFilter(String filterName){
124 if(hasService(filterName)){
125 return getService(filterName).getFilter();
130 public ComparisonPairFilterSpi removeService(String name){
131 if(parent != null && parent.hasService(name)){
132 parent.removeService(name);
134 return services.remove(name);
137 public void addService(ComparisonPairFilterSpi service){
138 if(parent == null || parent.getService(service.getFilterName()) == null){
139 services.put(service.getFilterName(), service);
143 public boolean hasService(String name){
144 return (parent != null && parent.hasService(name)) || services.get(name) != null;
147 public ComparisonPairFilterSpi getService(String name){
148 ComparisonPairFilterSpi service = null;
150 service = parent.getService(name);
153 service = services.get(name);