OSDN Git Service

Delete Subversion Tags (Revision, Id)
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / utils / ConfigFileImporter.java
1 package jp.sourceforge.stigmata.utils;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.net.MalformedURLException;
6 import java.net.URL;
7 import java.util.HashMap;
8 import java.util.Map;
9
10 import javax.xml.parsers.ParserConfigurationException;
11 import javax.xml.parsers.SAXParser;
12 import javax.xml.parsers.SAXParserFactory;
13
14 import jp.sourceforge.stigmata.BirthmarkEnvironment;
15 import jp.sourceforge.stigmata.ComparisonPairFilter;
16 import jp.sourceforge.stigmata.ComparisonPairFilterSet;
17 import jp.sourceforge.stigmata.Stigmata;
18 import jp.sourceforge.stigmata.birthmarks.BirthmarkService;
19
20 import org.xml.sax.Attributes;
21 import org.xml.sax.SAXException;
22 import org.xml.sax.helpers.DefaultHandler;
23
24 /**
25  * configuration file parser.
26  * 
27  * @author Haruaki TAMADA
28  */
29 public class ConfigFileImporter{
30     private BirthmarkEnvironment environment;
31
32     public ConfigFileImporter(BirthmarkEnvironment environment){
33         this.environment = environment;
34     }
35
36     public BirthmarkEnvironment parse(InputStream in) throws IOException{
37         try{
38             SAXParserFactory factory = SAXParserFactory.newInstance();
39             SAXParser parser = factory.newSAXParser();
40             Handler handler = new Handler(getEnvironment());
41             parser.parse(in, handler);
42             this.environment = handler.getEnvironment();
43
44             return environment;
45         }catch(ParserConfigurationException e){
46             throw new IOException(e.getMessage());
47         }catch(SAXException e){
48             throw new IOException(e.getMessage());
49         }
50     }
51
52     public BirthmarkEnvironment getEnvironment(){
53         return environment;
54     }
55
56     private static enum Part{
57         WELLKNOWN_CLASSES, PROPERTIES, CLASSPATH, SERVICES, FILTER_SET, FILTER_DEFINITION,
58     }
59
60     private static class Handler extends DefaultHandler{
61         private BirthmarkEnvironment environment;
62         private WellknownClassManager manager;
63         private BirthmarkService service;
64         private ComparisonPairFilterSet filter;
65         private Part part;
66         private boolean exclude;
67         private WellknownClassJudgeRule.MatchType matchType;
68         private WellknownClassJudgeRule.MatchPartType partType;
69         private String qname;
70         private String key;
71         private String filterType, filterCriterion, attributeName;
72         private Map<String, String> filterAttributes = new HashMap<String, String>();
73
74         public Handler(BirthmarkEnvironment environment){
75             if(environment == null){
76                 environment = Stigmata.getInstance().createEnvironment();
77             }
78             this.environment = environment;
79             this.manager = environment.getWellknownClassManager();
80         }
81
82         public BirthmarkEnvironment getEnvironment(){
83             return environment;
84         }
85
86         @Override
87         public void startElement(String uri, String localName, String qname,
88                                  Attributes attributes) throws SAXException{
89             this.qname = qname;
90
91             if(qname.equals("wellknown-classes")){
92                 part = Part.WELLKNOWN_CLASSES;
93             }
94             else if(qname.equals("property")){
95                 part = Part.PROPERTIES;
96             }
97             else if(qname.equals("classpath-list")){
98                 part = Part.CLASSPATH;
99             }
100             else if(qname.equals("birthmark-service")){
101                 part = Part.SERVICES;
102                 service = new BirthmarkService();
103                 service.setUserDefined(false);
104             }
105             else if(qname.equals("filterset-list")){
106                 part = Part.FILTER_SET;
107             }
108
109             if(part == Part.FILTER_SET){
110                 if(qname.equals("filterset")){
111                     filter = new ComparisonPairFilterSet();
112                 }
113                 else if(qname.equals("filter")){
114                     part = Part.FILTER_DEFINITION;
115                     filterAttributes.clear();
116                 }
117             }
118             else if(part == Part.WELLKNOWN_CLASSES){
119                 if(qname.equals("exclude")){
120                     exclude = true;
121                 }
122                 else if(qname.equals("package-name")){
123                     partType = WellknownClassJudgeRule.MatchPartType.PACKAGE_NAME;
124                 }
125                 else if(qname.equals("class-name")){
126                     partType = WellknownClassJudgeRule.MatchPartType.CLASS_NAME;
127                 }
128                 else if(qname.equals("fully-name")){
129                     partType = WellknownClassJudgeRule.MatchPartType.FULLY_NAME;
130                 }
131                 else if(qname.equals("suffix")){
132                     matchType = WellknownClassJudgeRule.MatchType.SUFFIX;
133                 }
134                 else if(qname.equals("prefix")){
135                     matchType = WellknownClassJudgeRule.MatchType.PREFIX;
136                 }
137                 else if(qname.equals("match")){
138                     matchType = WellknownClassJudgeRule.MatchType.EXACT;
139                 }
140                 else if(qname.equals("not-match")){
141                     matchType = WellknownClassJudgeRule.MatchType.NOT_MATCH;
142                 }
143             }
144         }
145
146         @Override
147         public void characters(char[] data, int offset, int length) throws SAXException{
148             String value = new String(data, offset, length).trim();
149
150             if(value.length() > 0){
151                 if(part == Part.PROPERTIES){
152                     if(qname.equals("name")){
153                         key = value;
154                     }
155                     else if(qname.equals("value")){
156                         environment.addProperty(key, value);
157                     }
158                 }
159                 else if(part == Part.WELLKNOWN_CLASSES
160                         && (qname.equals("suffix") || qname.equals("prefix") || qname.equals("match"))){
161                     manager.add(new WellknownClassJudgeRule(value, matchType, partType, exclude));
162                     exclude = false;
163                 }
164                 else if(part == Part.CLASSPATH && qname.equals("classpath")){
165                     try{
166                         environment.getClasspathContext().addClasspath(
167                                 new URL(value));
168                     }catch(MalformedURLException e){
169                         throw new SAXException(e);
170                     }
171                 }
172                 else if(part == Part.SERVICES){
173                     if(qname.equals("type"))
174                         service.setType(value);
175                     else if(qname.equals("display-name"))
176                         service.setDisplayType(value);
177                     else if(qname.equals("description"))
178                         service.setDescription(value);
179                     else if(qname.equals("extractor"))
180                         service.setExtractorClassName(value);
181                     else if(qname.equals("comparator"))
182                         service.setComparatorClassName(value);
183                 }
184                 else if(part == Part.FILTER_SET){
185                     if(qname.equals("name")){
186                         filter.setName(value);
187                     }
188                     else if(qname.equals("match")){
189                         if(value.equals("all")){
190                             filter.setMatchAll();
191                         }
192                         else{
193                             filter.setMatchAny();
194                         }
195                     }
196                 }
197                 else if(part == Part.FILTER_DEFINITION){
198                     if(qname.equals("filter-type")){
199                         filterType = value;
200                     }
201                     else if(qname.equals("criterion")){
202                         filterCriterion = value;
203                     }
204                     else if(qname.equals("name")){
205                         attributeName = value;
206                     }
207                     else{
208                         filterAttributes.put(attributeName, value);
209                     }
210                 }
211             }
212         }
213
214         @Override
215         public void endElement(String uri, String localname, String qname){
216             if(part == Part.SERVICES && qname.equals("birthmark-service")){
217                 environment.addService(service);
218                 service = null;
219             }
220             else if(part == Part.FILTER_DEFINITION && qname.equals("filter")){
221                 ComparisonPairFilter f = environment.getFilterManager().buildFilter(
222                     filterType, filterCriterion, filterAttributes
223                 );
224                 filter.addFilter(f);
225                 part = Part.FILTER_SET;
226             }
227             else if(part == Part.FILTER_SET && qname.equals("filterset")){
228                 environment.getFilterManager().addFilterSet(filter);
229             }
230         }
231     }
232 }