OSDN Git Service

263a0b902858e2c6baefa9295b06937313aad08f
[stigmata/stigmata-core.git] / src / main / java / jp / sourceforge / stigmata / filter / ComparisonPairFilterManager.java
1 package jp.sourceforge.stigmata.filter;
2
3 import java.lang.reflect.InvocationTargetException;
4 import java.util.ArrayList;
5 import java.util.HashMap;
6 import java.util.Iterator;
7 import java.util.List;
8 import java.util.Map;
9
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;
14
15 import org.apache.commons.beanutils.BeanUtils;
16
17 /**
18  * 
19  * @author Haruaki TAMADA
20  */
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;
25
26     public ComparisonPairFilterManager(BirthmarkEnvironment env, ComparisonPairFilterManager parent){
27         this.parent = 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);
32             }
33         }
34     }
35
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);
40         }
41     }
42
43     public synchronized ComparisonPairFilterSet[] getFilterSets(){
44         List<ComparisonPairFilterSet> list = new ArrayList<ComparisonPairFilterSet>();
45         if(parent != null){
46             for(ComparisonPairFilterSet fs: parent.getFilterSets()){
47                 if(filters.get(fs.getName()) == null){
48                     list.add(fs);
49                 }
50             }
51         }
52         list.addAll(filters.values());
53         return list.toArray(new ComparisonPairFilterSet[list.size()]);
54     }
55
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]));
60         }
61         return list.toArray(new ComparisonPairFilterSet[list.size()]);
62     }
63
64     public void addFilterSet(ComparisonPairFilterSet filterset){
65         filters.put(filterset.getName(), filterset);
66     }
67
68     public void removeFilterSet(String filterSetName){
69         if(filters.get(filterSetName) != null){
70             filters.remove(filterSetName);
71         }
72         else{
73             if(parent != null && parent.getFilterSet(filterSetName) != null){
74                 filters.remove(filterSetName);
75             }
76         }
77     }
78
79     public ComparisonPairFilterSet getFilterSet(String filterSetName){
80         ComparisonPairFilterSet filter = filters.get(filterSetName);
81         if(filter == null && parent != null){
82             filter = parent.getFilterSet(filterSetName);
83         }
84         return filter;
85     }
86
87     public ComparisonPairFilter buildFilter(String filterName, String criterion, Map<String, String> values){
88         Criterion c = Criterion.valueOf(criterion);
89         if(c != null){
90             return buildFilter(filterName, c, values);
91         }
92         throw new IllegalArgumentException("criterion not found: " + criterion);
93     }
94
95     public ComparisonPairFilter buildFilter(String filterName, Criterion criterion, Map<String, String> values){
96         ComparisonPairFilter filter = createFilter(filterName);
97         if(filter != null){
98             filter.setCriterion(criterion);
99             for(Map.Entry<String, String> entry: values.entrySet()){
100                 try{
101                     Object value = entry.getValue();
102                     if(entry.getKey().equals("target")){
103                         value = FilterTarget.valueOf(String.valueOf(value));
104                     }
105                     BeanUtils.setProperty(filter, entry.getKey(), value);
106                 }catch(IllegalAccessException e){
107                     e.printStackTrace();
108                     filter = null;
109                 }catch(InvocationTargetException e){
110                     e.printStackTrace();
111                     filter = null;
112                 }
113             }
114         }
115         return filter;
116     }
117
118     public ComparisonPairFilter createFilter(String filterName){
119         if(hasService(filterName)){
120             return getService(filterName).getFilter();
121         }
122         return null;
123     }
124
125     public ComparisonPairFilterService removeService(String name){
126         if(parent != null && parent.hasService(name)){
127             parent.removeService(name);
128         }
129         return services.remove(name);
130     }
131
132     public void addService(ComparisonPairFilterService service){
133         if(parent == null || parent.getService(service.getFilterName()) == null){
134             services.put(service.getFilterName(), service);
135         }
136     }
137
138     public boolean hasService(String name){
139         return (parent != null && parent.hasService(name)) || services.get(name) != null;
140     }
141
142     public ComparisonPairFilterService getService(String name){
143         ComparisonPairFilterService service = null;
144         if(parent != null){
145             service = parent.getService(name);
146         }
147         if(service == null){
148             service = services.get(name);
149         }
150         return service;
151     }
152
153 }