OSDN Git Service

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