OSDN Git Service

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