OSDN Git Service

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