OSDN Git Service

RCS風キーワード展開の抑止。
[jindolf/JinArchiver.git] / src / main / java / jp / sourceforge / jindolf / archiver / ValidateTask.java
1 /*\r
2  * XML-validation task\r
3  *\r
4  * Copyright(c) 2008 olyutorskii\r
5  */\r
6 \r
7 package jp.sourceforge.jindolf.archiver;\r
8 \r
9 import java.io.IOException;\r
10 import java.io.PipedReader;\r
11 import java.io.PipedWriter;\r
12 import java.io.Reader;\r
13 import java.io.Writer;\r
14 import javax.xml.XMLConstants;\r
15 import javax.xml.transform.Source;\r
16 import javax.xml.transform.stream.StreamSource;\r
17 import javax.xml.validation.Schema;\r
18 import javax.xml.validation.SchemaFactory;\r
19 import javax.xml.validation.Validator;\r
20 import org.xml.sax.SAXException;\r
21 \r
22 /**\r
23  * XML検証タスク。\r
24  */\r
25 public class ValidateTask implements Runnable{\r
26 \r
27     private static final SchemaFactory FACTORY =\r
28             SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);\r
29 \r
30     private final Validator validator;\r
31     private final Source source;\r
32 \r
33     /**\r
34      * コンストラクタ。\r
35      * @param reader 文字入力\r
36      * @throws SAXException 内部エラー\r
37      */\r
38     protected ValidateTask(Reader reader) throws SAXException{\r
39         super();\r
40         Schema schema = FACTORY.newSchema();\r
41         this.validator = schema.newValidator();\r
42         this.source = new StreamSource(reader);\r
43         return;\r
44     }\r
45 \r
46     /**\r
47      * 検証タスク。\r
48      * {@inheritDoc}\r
49      */\r
50     public void run(){\r
51         try{\r
52             this.validator.validate(this.source);\r
53         }catch(Throwable e){\r
54             e.printStackTrace(System.err);\r
55             System.err.println("XML検証に失敗しました。");\r
56             System.exit(1);\r
57         }\r
58         return;\r
59     }\r
60 \r
61     /**\r
62      * 文字出力を横取りしバックグラウンドで検証を行うWriterを生成する。\r
63      * @param writer 元出力\r
64      * @return 新しい出力\r
65      */\r
66     public static Writer wrapValidator(Writer writer){\r
67         PipedReader reader = new PipedReader();\r
68         Writer pipeWriter;\r
69         try{\r
70             pipeWriter = new PipedWriter(reader);\r
71         }catch(IOException e){\r
72             e.printStackTrace(System.err);\r
73             System.err.println("処理を続行できません。");\r
74             System.exit(1);\r
75             return null;\r
76         }\r
77 \r
78         MultiPlexer mtplx = new MultiPlexer();\r
79         mtplx.addWriter(writer);\r
80         mtplx.addWriter(pipeWriter);\r
81 \r
82         Runnable task;\r
83         try{\r
84             task = new ValidateTask(reader);\r
85         }catch(SAXException e){\r
86             e.printStackTrace(System.err);\r
87             System.err.println("処理を続行できません。");\r
88             System.exit(1);\r
89             return null;\r
90         }\r
91         Thread th = new Thread(task);\r
92         th.setDaemon(false);\r
93         th.start();\r
94 \r
95         return mtplx;\r
96     }\r
97 \r
98 }\r