OSDN Git Service

5bd1e7296b5e70ae40fe7e27a7f593c001519987
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / vmd / model / xml / Xml.java
1 /*
2  * xml common
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.util.Iterator;
11 import jp.sourceforge.mikutoga.vmd.model.BezierParam;
12 import jp.sourceforge.mikutoga.vmd.model.PosCurve;
13 import jp.sourceforge.mikutoga.xml.DomNsUtils;
14 import jp.sourceforge.mikutoga.xml.SiblingElemIterator;
15 import jp.sourceforge.mikutoga.xml.TogaXmlException;
16 import org.w3c.dom.Element;
17
18 /**
19  * XMLユーティリティ集。
20  * <p>VMDに特化したDomNsUtilsのWrapper群や共通要素の共通処理を含む。
21  * <p>要素に関する名前空間は{@link VmdXmlResources.NS_VMDXML}が暗黙で用いられる。
22  * <p>非グローバル属性に関する名前空間は{@NS_NULL}が暗黙で用いられる。
23  * @see jp.sourceforge.mikutoga.xml.DomNsUtils
24  */
25 final class Xml {
26
27     /** 非グローバル属性用名前空間。 */
28     static final String NS_NULL = null;
29
30
31     /**
32      * 隠しコンストラクタ。
33      */
34     private Xml(){
35         assert false;
36         throw new AssertionError();
37     }
38
39
40     /**
41      * ローカル名が一致する要素か判定する。
42      * @param elem 要素
43      * @param localName ローカル名。
44      * @return ローカル名が一致する要素であればtrue
45      */
46     static boolean hasNsLocalNameElem(Element elem,
47                                       String localName ){
48         return DomNsUtils.hasNsLocalNameElem(elem,
49                                              VmdXmlResources.NS_VMDXML,
50                                              localName );
51     }
52
53     /**
54      * ローカル名に合致する最初の直下子要素を返す。
55      * @param parent 親要素
56      * @param localName 子要素名
57      * @return 最初の直下子要素。見つからなければnull。
58      */
59     static Element pickChild(Element parent, String localName){
60         return DomNsUtils.pickFirstChild(parent,
61                                          VmdXmlResources.NS_VMDXML,
62                                          localName );
63     }
64
65     /**
66      * ローカル名に合致する最初の直下子要素を返す。
67      * <p>見つからなければ例外を投げる。
68      * @param parent 親要素
69      * @param localName 子要素名
70      * @return 最初の直下子要素
71      * @throws TogaXmlException 1つも見つからなかった
72      */
73     static Element getChild(Element parent, String localName)
74             throws TogaXmlException{
75         return DomNsUtils.getFirstChild(parent,
76                                         VmdXmlResources.NS_VMDXML,
77                                         localName );
78     }
79
80     /**
81      * 指定された名前の子要素のforeachを返す。
82      * @param parent 親要素
83      * @param localName 子要素名
84      * @return 子要素のforeach
85      */
86     static Iterable<Element> eachChild(Element parent, String localName){
87         return DomNsUtils.getEachChild(parent,
88                                        VmdXmlResources.NS_VMDXML,
89                                        localName );
90     }
91
92     /**
93      * 要素からxsd:string型属性値を読み取る。
94      * @param elem 要素
95      * @param attrName 属性名
96      * @return 文字列
97      * @throws TogaXmlException 属性値が見つからなかった。
98      */
99     static String getStringAttr(Element elem, String attrName)
100             throws TogaXmlException{
101         return DomNsUtils.getStringAttrNS(elem, NS_NULL, attrName);
102     }
103
104     /**
105      * 要素からxsd:boolean型属性値を読み取る。
106      * @param elem 要素
107      * @param attrName 属性名
108      * @return 真ならtrue
109      * @throws TogaXmlException 属性値が見つからなかった。
110      */
111     static boolean getBooleanAttr(Element elem, String attrName)
112             throws TogaXmlException{
113         return DomNsUtils.getBooleanAttrNS(elem, NS_NULL, attrName);
114     }
115
116     /**
117      * 要素からxsd:integer型属性値を読み取る。
118      * @param elem 要素
119      * @param attrName 属性名
120      * @return int値
121      * @throws TogaXmlException 属性値が見つからなかった。
122      */
123     static int getIntegerAttr(Element elem, String attrName)
124             throws TogaXmlException{
125         return DomNsUtils.getIntegerAttrNS(elem, NS_NULL, attrName);
126     }
127
128     /**
129      * 要素から符号付きbyte型整数属性値を読み取る。
130      * @param elem 要素
131      * @param attrName 属性名
132      * @return byte値
133      * @throws TogaXmlException 属性値が見つからなかった。
134      */
135     static byte getByteAttr(Element elem, String attrName)
136             throws TogaXmlException{
137         int iVal = getIntegerAttr(elem, attrName);
138         byte result = (byte) iVal;
139         return result;
140     }
141
142     /**
143      * 要素からxsd:float型属性値を読み取る。
144      * @param elem 要素
145      * @param attrName 属性名
146      * @return float値
147      * @throws TogaXmlException 属性値が見つからなかった。
148      */
149     static float getFloatAttr(Element elem, String attrName)
150             throws TogaXmlException{
151         return DomNsUtils.getFloatAttrNS(elem, NS_NULL, attrName);
152     }
153
154     /**
155      * ベジェ曲線による補間カーブ記述を読み込む。
156      * @param elem defLinear,defEaseInOut,bezier要素のいずれか
157      * @param bezier ベジェ曲線
158      * @throws TogaXmlException 構文エラー
159      */
160     static void setBezier(Element elem, BezierParam bezier)
161             throws TogaXmlException{
162         byte p1x;
163         byte p1y;
164         byte p2x;
165         byte p2y;
166
167         if(hasNsLocalNameElem(elem, "defLinear")){
168             p1x = BezierParam.DEF_P1X;
169             p1y = BezierParam.DEF_P1Y;
170             p2x = BezierParam.DEF_P2X;
171             p2y = BezierParam.DEF_P2Y;
172         }else if(hasNsLocalNameElem(elem, "defEaseInOut")){
173             p1x = BezierParam.EIO_P1X;
174             p1y = BezierParam.EIO_P1Y;
175             p2x = BezierParam.EIO_P2X;
176             p2y = BezierParam.EIO_P2Y;
177         }else if(hasNsLocalNameElem(elem, "bezier")){
178             p1x = getByteAttr(elem, "p1x");
179             p1y = getByteAttr(elem, "p1y");
180             p2x = getByteAttr(elem, "p2x");
181             p2y = getByteAttr(elem, "p2y");
182         }else{
183             assert false;
184             throw new AssertionError();
185         }
186
187         bezier.setP1(p1x, p1y);
188         bezier.setP2(p2x, p2y);
189
190         return;
191     }
192
193     /**
194      * 補間カーブ情報を読み込む。
195      * @param parentElem 親要素
196      * @param bezier 補間カーブ
197      * @throws TogaXmlException 構文エラー
198      */
199     static void buildCurve(Element parentElem, BezierParam bezier)
200             throws TogaXmlException{
201         Element bezierElem = pickChild(parentElem, null);
202         if(bezierElem == null) return;
203
204         setBezier(bezierElem, bezier);
205
206         return;
207     }
208
209     /**
210      * 位置補間情報を読み込む。
211      * @param positionElem 親要素
212      * @param curve 位置補間カーブ
213      * @throws TogaXmlException 構文エラー
214      */
215     static void buildPosCurve(Element positionElem, PosCurve curve)
216             throws TogaXmlException{
217         Iterator<Element> it =
218                 new SiblingElemIterator(positionElem,
219                                         VmdXmlResources.NS_VMDXML, null);
220
221         int ct = 0;
222         while(it.hasNext()){
223             Element curveElem = it.next();
224             BezierParam bz = curve.item(ct);
225             setBezier(curveElem, bz);
226             ct++;
227         }
228
229         assert ct == 0 || ct == 3;
230
231         return;
232     }
233
234 }