1 package jp.sourceforge.stigmata.filter;
3 import java.lang.reflect.InvocationTargetException;
4 import java.util.ArrayList;
5 import java.util.HashMap;
6 import java.util.Iterator;
10 import jp.sourceforge.stigmata.BirthmarkEnvironment;
11 import jp.sourceforge.stigmata.ComparisonPairFilter;
12 import jp.sourceforge.stigmata.ComparisonPairFilterSet;
13 import jp.sourceforge.stigmata.spi.ComparisonPairFilterService;
15 import org.apache.commons.beanutils.BeanUtils;
19 * @author Haruaki TAMADA
21 public class ComparisonPairFilterManager{
22 private Map<String, ComparisonPairFilterService> services = new HashMap<String, ComparisonPairFilterService>();
23 private Map<String, ComparisonPairFilterSet> filters = new HashMap<String, ComparisonPairFilterSet>();
24 private ComparisonPairFilterManager parent;
26 public ComparisonPairFilterManager(BirthmarkEnvironment env, ComparisonPairFilterManager parent){
28 for(Iterator<ComparisonPairFilterService> i = env.lookupProviders(ComparisonPairFilterService.class); i.hasNext(); ){
29 ComparisonPairFilterService service = i.next();
30 if(getService(service.getFilterName()) != null){
31 services.put(service.getFilterName(), service);
36 public ComparisonPairFilterManager(BirthmarkEnvironment env){
37 for(Iterator<ComparisonPairFilterService> i = env.lookupProviders(ComparisonPairFilterService.class); i.hasNext(); ){
38 ComparisonPairFilterService service = i.next();
39 services.put(service.getFilterName(), service);
43 public synchronized ComparisonPairFilterSet[] getFilterSets(){
44 List<ComparisonPairFilterSet> list = new ArrayList<ComparisonPairFilterSet>();
46 for(ComparisonPairFilterSet fs: parent.getFilterSets()){
47 if(filters.get(fs.getName()) == null){
52 list.addAll(filters.values());
53 return list.toArray(new ComparisonPairFilterSet[list.size()]);
56 public synchronized ComparisonPairFilterSet[] getFilterSets(String[] names){
57 List<ComparisonPairFilterSet> list = new ArrayList<ComparisonPairFilterSet>();
58 for(int i = 0; i < names.length; i++){
59 list.add(getFilterSet(names[i]));
61 return list.toArray(new ComparisonPairFilterSet[list.size()]);
64 public void addFilterSet(ComparisonPairFilterSet filterset){
65 filters.put(filterset.getName(), filterset);
68 public void removeFilterSet(String filterSetName){
69 if(filters.get(filterSetName) != null){
70 filters.remove(filterSetName);
73 if(parent != null && parent.getFilterSet(filterSetName) != null){
74 filters.remove(filterSetName);
79 public ComparisonPairFilterSet getFilterSet(String filterSetName){
80 ComparisonPairFilterSet filter = filters.get(filterSetName);
81 if(filter == null && parent != null){
82 filter = parent.getFilterSet(filterSetName);
87 public ComparisonPairFilter buildFilter(String filterName, String criterion, Map<String, String> values){
88 Criterion c = Criterion.valueOf(criterion);
90 return buildFilter(filterName, c, values);
92 throw new IllegalArgumentException("criterion not found: " + criterion);
95 public ComparisonPairFilter buildFilter(String filterName, Criterion criterion, Map<String, String> values){
96 ComparisonPairFilter filter = createFilter(filterName);
98 filter.setCriterion(criterion);
99 for(Map.Entry<String, String> entry: values.entrySet()){
101 Object value = entry.getValue();
102 if(entry.getKey().equals("target")){
103 value = FilterTarget.valueOf(String.valueOf(value));
105 BeanUtils.setProperty(filter, entry.getKey(), value);
106 }catch(IllegalAccessException e){
109 }catch(InvocationTargetException e){
118 public ComparisonPairFilter createFilter(String filterName){
119 if(hasService(filterName)){
120 return getService(filterName).getFilter();
125 public ComparisonPairFilterService removeService(String name){
126 if(parent != null && parent.hasService(name)){
127 parent.removeService(name);
129 return services.remove(name);
132 public void addService(ComparisonPairFilterService service){
133 if(parent == null || parent.getService(service.getFilterName()) == null){
134 services.put(service.getFilterName(), service);
138 public boolean hasService(String name){
139 return (parent != null && parent.hasService(name)) || services.get(name) != null;
142 public ComparisonPairFilterService getService(String name){
143 ComparisonPairFilterService service = null;
145 service = parent.getService(name);
148 service = services.get(name);