KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > h2 > tools > doc > XMLChecker


1 /*
2  * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
3  * Initial Developer: H2 Group
4  */

5 package org.h2.tools.doc;
6
7 import java.io.File JavaDoc;
8 import java.io.FileReader JavaDoc;
9 import java.io.IOException JavaDoc;
10 import java.io.Reader JavaDoc;
11 import java.io.StringWriter JavaDoc;
12 import java.util.Stack JavaDoc;
13
14 public class XMLChecker {
15     
16     public static void main(String JavaDoc[] args) throws Exception JavaDoc {
17         new XMLChecker().run(args);
18     }
19     
20     private void run(String JavaDoc[] args) throws Exception JavaDoc {
21         String JavaDoc dir = ".";
22         for(int i=0; i<args.length; i++) {
23             if("-dir".equals(args[i])) {
24                 dir = args[++i];
25             }
26         }
27         process(dir+"/src");
28         process(dir+"/docs");
29     }
30     
31     void process(String JavaDoc path) throws Exception JavaDoc {
32         if(path.endsWith("/CVS") || path.endsWith("/.svn")) {
33             return;
34         }
35         File JavaDoc file = new File JavaDoc(path);
36         if(file.isDirectory()) {
37             String JavaDoc[] list = file.list();
38             for(int i=0; i<list.length; i++) {
39                 process(path + "/" + list[i]);
40             }
41         } else {
42             processFile(path);
43         }
44     }
45     
46     void processFile(String JavaDoc fileName) throws Exception JavaDoc {
47         int idx = fileName.lastIndexOf('.');
48         if(idx < 0) {
49             return;
50         }
51         String JavaDoc suffix = fileName.substring(idx + 1);
52         if(!suffix.equals("html") && !suffix.equals("xml") && !suffix.equals("jsp")) {
53             return;
54         }
55         System.out.println("Checking file:" + fileName);
56         FileReader JavaDoc reader = new FileReader JavaDoc(fileName);
57         String JavaDoc s = readStringAndClose(reader, -1);
58         Exception JavaDoc last = null;
59         try {
60             checkXML(s, !suffix.equals("xml"));
61         } catch(Exception JavaDoc e) {
62             last = e;
63             System.out.println("ERROR: " + e.toString());
64         }
65         if(last != null) {
66             last.printStackTrace();
67         }
68     }
69     
70     public static String JavaDoc readStringAndClose(Reader JavaDoc in, int length) throws IOException JavaDoc {
71         if(length <= 0) {
72             length = Integer.MAX_VALUE;
73         }
74         int block = Math.min(4096, length);
75         StringWriter JavaDoc out=new StringWriter JavaDoc(length == Integer.MAX_VALUE ? block : length);
76         char[] buff=new char[block];
77         while(length > 0) {
78             int len = Math.min(block, length);
79             len = in.read(buff, 0, len);
80             if(len < 0) {
81                 break;
82             }
83             out.write(buff, 0, len);
84             length -= len;
85         }
86         in.close();
87         return out.toString();
88     }
89
90     private static void checkXML(String JavaDoc xml, boolean html) throws Exception JavaDoc {
91         String JavaDoc lastElement = null;
92         String JavaDoc[] noclose = new String JavaDoc[]{
93                 "li", "link", "meta", "br", "img", "input", "hr", "frame"
94         };
95         XMLParser parser = new XMLParser(xml);
96         Stack JavaDoc stack = new Stack JavaDoc();
97         boolean rootElement = false;
98         while(true) {
99             int event = parser.next();
100             if(event == XMLParser.END_DOCUMENT) {
101                 break;
102             } else if(event == XMLParser.START_ELEMENT) {
103                 if(stack.size() == 0) {
104                     if(rootElement) {
105                         throw new Exception JavaDoc("Second root element at " + parser.getRemaining());
106                     }
107                     rootElement = true;
108                 }
109                 String JavaDoc name = parser.getName();
110                 if(html && name.equals("table") && lastElement.trim().length() > 0) {
111                     throw new Exception JavaDoc("Test before table: " + lastElement);
112                 }
113                 for(int i=0; html && i<noclose.length; i++) {
114                     if(name.equals(noclose[i])) {
115                         name = null;
116                         break;
117                     }
118                 }
119                 if(name != null) {
120                     stack.add(name);
121                 }
122             } else if(event == XMLParser.END_ELEMENT) {
123                 String JavaDoc name = parser.getName();
124                 for(int i=0; html && i<noclose.length; i++) {
125                     if(name.equals(noclose[i])) {
126                         throw new Exception JavaDoc("Unnecessary closing element " + name + " at " + parser.getRemaining());
127                     }
128                 }
129                 while(true) {
130                     String JavaDoc pop = (String JavaDoc) stack.pop();
131                     if(pop.equals(name)) {
132                         break;
133                     }
134                     throw new Exception JavaDoc("Unclosed element " + pop + " at " + parser.getRemaining());
135                 }
136             } else if(event == XMLParser.CHARACTERS) {
137                 lastElement = parser.getText();
138             } else if(event == XMLParser.DTD) {
139             } else if(event == XMLParser.COMMENT) {
140             } else {
141                 int eventType = parser.getEventType();
142                 throw new Exception JavaDoc("Unexpected event " + eventType + " at " + parser.getRemaining());
143             }
144         }
145         if(stack.size() != 0) {
146             throw new Exception JavaDoc("Unclosed root element");
147         }
148     }
149     
150 }
151
Popular Tags