OSDN Git Service

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