OSDN Git Service

vmdパッケージ導入
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / vmd / model / xml / VmdXmlResources.java
1 /*
2  * xml resources for VMD-XML
3  *
4  * License : The MIT License
5  * Copyright(c) 2011 MikuToga Partners
6  */
7
8 package jp.sourceforge.mikutoga.vmd.model.xml;
9
10 import java.net.MalformedURLException;
11 import java.net.URI;
12 import java.net.URISyntaxException;
13 import java.net.URL;
14 import javax.xml.XMLConstants;
15 import javax.xml.parsers.DocumentBuilder;
16 import javax.xml.parsers.DocumentBuilderFactory;
17 import javax.xml.parsers.ParserConfigurationException;
18 import javax.xml.validation.Schema;
19 import javax.xml.validation.SchemaFactory;
20 import jp.sourceforge.mikutoga.xml.XmlResourceResolver;
21 import org.w3c.dom.ls.LSResourceResolver;
22 import org.xml.sax.ErrorHandler;
23 import org.xml.sax.SAXException;
24
25 /**
26  * モーションデータ用各種XMLリソースの定義。
27  */
28 public final class VmdXmlResources {
29
30     /** 定義の版数。 */
31     public static final String VER_VMDXML =
32             "110820";
33     /** XML名前空間識別子。 */
34     public static final String NS_VMDXML =
35             "http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820";
36     /** XMLスキーマURI名。 */
37     public static final String SCHEMAURI_VMDXML =
38             "http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd";
39     /** ローカルなスキーマファイル名。 */
40     public static final String LOCAL_SCHEMA_VMDXML =
41             "resources/vmdxml-110820.xsd";
42
43     /** XMLスキーマURI。 */
44     public static final URI URI_SCHEMA_VMDXML;
45     /** XMLスキーマのローカルリソース。 */
46     public static final URI RES_SCHEMA_VMDXML;
47
48
49     private static final Class<?> THISCLASS = VmdXmlResources.class;
50
51
52     static{
53         try{
54             URI_SCHEMA_VMDXML = URI.create(SCHEMAURI_VMDXML);
55             RES_SCHEMA_VMDXML =
56                     THISCLASS.getResource(LOCAL_SCHEMA_VMDXML).toURI();
57         }catch(URISyntaxException e){
58             throw new ExceptionInInitializerError(e);
59         }
60
61         new VmdXmlResources().hashCode();
62     }
63
64
65     /**
66      * 隠しコンストラクタ。
67      */
68     private VmdXmlResources(){
69         super();
70         assert this.getClass().equals(THISCLASS);
71         return;
72     }
73
74
75     /**
76      * ビルダの生成。
77      * @param handler エラーハンドラ
78      * @return ビルダ
79      */
80     public static DocumentBuilder newBuilder(ErrorHandler handler){
81         XmlResourceResolver resolver = createResolver();
82
83         Schema schema = createSchema(resolver);
84
85         DocumentBuilderFactory builderFactory = createBuilderFactory();
86         builderFactory.setSchema(schema);
87
88         DocumentBuilder builder;
89         try{
90             builder = builderFactory.newDocumentBuilder();
91         }catch(ParserConfigurationException e){
92             assert false;
93             throw new AssertionError(e);
94         }
95         builder.setEntityResolver(resolver);
96         builder.setErrorHandler(handler);
97
98         return builder;
99     }
100
101     /**
102      * URI参照をローカルなリソースアクセスへとリダイレクトするリゾルバを生成する。
103      * @return リゾルバ
104      */
105     private static XmlResourceResolver createResolver(){
106         XmlResourceResolver resolver = new XmlResourceResolver();
107         resolver.putURIMap(URI_SCHEMA_VMDXML, RES_SCHEMA_VMDXML);
108 //        resolver.putURIMap(URI_DTD_VMDXML, RES_DTD_VMDXML);
109
110         return resolver;
111     }
112
113     /**
114      * 検証用スキーマ(XML schema)を生成する。
115      * @param resolver リゾルバ
116      * @return スキーマ
117      */
118     private static Schema createSchema(LSResourceResolver resolver){
119         SchemaFactory schemaFactory =
120                 SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
121         schemaFactory.setResourceResolver(resolver);
122
123         URL localXsd;
124         try{
125             localXsd = RES_SCHEMA_VMDXML.toURL();
126         }catch(MalformedURLException e){
127             assert false;
128             throw new AssertionError(e);
129         }
130
131         Schema schema;
132         try{
133             schema = schemaFactory.newSchema(localXsd);
134         }catch(SAXException e){
135             assert false;
136             throw new AssertionError(e);
137         }
138
139         return schema;
140     }
141
142     /**
143      * DocumentBuilderFavtoryを生成する。
144      * @return ファクトリ
145      */
146     private static DocumentBuilderFactory createBuilderFactory(){
147         DocumentBuilderFactory builderFactory =
148                 DocumentBuilderFactory.newInstance();
149
150         builderFactory.setNamespaceAware(true);
151         builderFactory.setValidating(false);    // DTD validation off
152         builderFactory.setIgnoringComments(true);
153         try{
154             builderFactory.setXIncludeAware(true);
155         }catch(UnsupportedOperationException e){
156             // NOTHING
157             assert true;
158         }
159
160         return builderFactory;
161     }
162
163 }