OSDN Git Service

imported from subversion repository
[xerial/xerial-core.git] / src / main / java / org / xerial / util / xml / analyzer / XMLNodeRelationAnalyzer.java
1 /*--------------------------------------------------------------------------\r
2  *  Copyright 2004 Taro L. Saito\r
3  *\r
4  *  Licensed under the Apache License, Version 2.0 (the "License");\r
5  *  you may not use this file except in compliance with the License.\r
6  *  You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  *  Unless required by applicable law or agreed to in writing, software\r
11  *  distributed under the License is distributed on an "AS IS" BASIS,\r
12  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  *  See the License for the specific language governing permissions and\r
14  *  limitations under the License.\r
15  *--------------------------------------------------------------------------*/\r
16 //--------------------------------------\r
17 // XerialJ Project\r
18 //\r
19 // XMLNodeRelationAnalyzer.java\r
20 // Since: 2005/05/31\r
21 //\r
22 // $URL: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core/src/main/java/org/xerial/util/xml/analyzer/XMLNodeRelationAnalyzer.java $ \r
23 // $Author: leo $\r
24 //--------------------------------------\r
25 package org.xerial.util.xml.analyzer;\r
26 \r
27 import static org.xmlpull.v1.XmlPullParser.*;\r
28 \r
29 import java.io.FileReader;\r
30 import java.io.IOException;\r
31 import java.io.Reader;\r
32 import java.util.TreeMap;\r
33 import java.util.TreeSet;\r
34 \r
35 import org.xerial.core.XerialException;\r
36 import org.xerial.util.opt.Argument;\r
37 import org.xerial.util.opt.Option;\r
38 import org.xerial.util.opt.OptionParser;\r
39 import org.xerial.util.opt.OptionParserException;\r
40 import org.xerial.util.xml.SinglePathBuilder;\r
41 import org.xerial.util.xml.XMLErrorCode;\r
42 import org.xerial.util.xml.XMLException;\r
43 import org.xerial.util.xml.pullparser.PullParserUtil;\r
44 import org.xmlpull.v1.XmlPullParser;\r
45 import org.xmlpull.v1.XmlPullParserException;\r
46 \r
47 /**\r
48  * Analyzes ancestor-descendant and parent-child relationships of XML data\r
49  * \r
50  * @author leo\r
51  * \r
52  */\r
53 public class XMLNodeRelationAnalyzer {\r
54     private enum Opt {\r
55         help\r
56     }\r
57 \r
58     @Option(symbol = "h", longName = "help", description = "display help message")\r
59     private boolean displayHelp = false;\r
60 \r
61     @Argument(index = 0, name = "XMLFile")\r
62     private String xmlFile = null;\r
63 \r
64     private OptionParser _opt = new OptionParser(this);\r
65 \r
66     /**\r
67      * @throws OptionParserException\r
68      * \r
69      */\r
70     public XMLNodeRelationAnalyzer() throws OptionParserException {\r
71 \r
72     }\r
73 \r
74     public static void main(String[] args) {\r
75         try {\r
76             XMLNodeRelationAnalyzer instance = new XMLNodeRelationAnalyzer();\r
77             instance.perform(args);\r
78         }\r
79         catch (XerialException e) {\r
80             System.err.println(e.getMessage());\r
81         }\r
82         catch (IOException e) {\r
83             System.err.println(e.getMessage());\r
84         }\r
85     }\r
86 \r
87     public void perform(String[] args) throws OptionParserException, IOException, XerialException {\r
88         _opt.parse(args);\r
89 \r
90         if (displayHelp || xmlFile == null) {\r
91             printHelpMessage();\r
92             return;\r
93         }\r
94 \r
95         Reader xmlFileReader = new FileReader(xmlFile);\r
96         XmlPullParser parser = PullParserUtil.newParser(xmlFileReader);\r
97 \r
98         ParseProcess parseProcess = new ParseProcess(parser);\r
99         parseProcess.parse();\r
100 \r
101         for (String tag : parseProcess.tag2relatedTagNames.keySet()) {\r
102             System.out.print(tag + ":\t");\r
103             for (String related : parseProcess.tag2relatedTagNames.get(tag)) {\r
104                 System.out.print(related + " ");\r
105             }\r
106             System.out.println();\r
107         }\r
108 \r
109         xmlFileReader.close();\r
110     }\r
111 \r
112     class NodeRelation {\r
113 \r
114     }\r
115 \r
116     class ParseProcess {\r
117         XmlPullParser parser;\r
118         SinglePathBuilder currentPath = new SinglePathBuilder();\r
119         TreeMap<String, TreeSet<String>> tag2relatedTagNames = new TreeMap<String, TreeSet<String>>();\r
120         int pathCount = 0;\r
121 \r
122         ParseProcess(XmlPullParser parser) {\r
123             this.parser = parser;\r
124         }\r
125 \r
126         void parse() throws IOException, XMLException {\r
127 \r
128             int state;\r
129 \r
130             try {\r
131                 while ((state = parser.next()) != END_DOCUMENT) {\r
132                     switch (state) {\r
133                     case START_TAG:\r
134                         String currentTag = parser.getName();\r
135                         currentPath.addChild(currentTag);\r
136 \r
137                         TreeSet<String> relatedTagSet = getRelatedTagSet(currentTag);\r
138                         for (String t : currentPath) {\r
139                             if (!t.equals(currentTag)) {\r
140                                 relatedTagSet.add(t);\r
141                                 TreeSet<String> relatedTagSet2 = getRelatedTagSet(t);\r
142                                 relatedTagSet2.add(currentTag);\r
143                             }\r
144                         }\r
145                         // TODO attribute processing\r
146                         for (int i = 0; i < parser.getAttributeCount(); i++) {\r
147 \r
148                         }\r
149                         break;\r
150                     case END_TAG:\r
151                         currentPath.removeLeaf();\r
152                         break;\r
153                     case START_DOCUMENT:\r
154                         break;\r
155                     case TEXT:\r
156                         break;\r
157                     }\r
158                 }\r
159             }\r
160             catch (XmlPullParserException e) {\r
161                 throw new XMLException(XMLErrorCode.PARSE_ERROR, e);\r
162             }\r
163 \r
164         }\r
165 \r
166         private TreeSet<String> getRelatedTagSet(String tag) {\r
167             TreeSet<String> s = tag2relatedTagNames.get(tag);\r
168             if (s == null) {\r
169                 s = new TreeSet<String>();\r
170                 tag2relatedTagNames.put(tag, s);\r
171             }\r
172             return s;\r
173         }\r
174 \r
175     }\r
176 \r
177     private void printHelpMessage() {\r
178         System.out.println("usage: > java XMLNodeRelationAnalyzer.jar [option] xml_file");\r
179     }\r
180 \r
181 }\r