OSDN Git Service

PMD出力機能及びXML入出力機能のソースをマージ
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / pmd / pmdloader / PmdLoader.java
1 /*\r
2  * PMD file loader\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2010 MikuToga Partners\r
6  */\r
7 \r
8 package jp.sourceforge.mikutoga.pmd.pmdloader;\r
9 \r
10 import java.io.IOException;\r
11 import java.util.ArrayList;\r
12 import java.util.List;\r
13 import jp.sourceforge.mikutoga.parser.MmdFormatException;\r
14 import jp.sourceforge.mikutoga.parser.MmdSource;\r
15 import jp.sourceforge.mikutoga.parser.pmd.PmdParser;\r
16 import jp.sourceforge.mikutoga.pmd.MorphPart;\r
17 import jp.sourceforge.mikutoga.pmd.PmdModel;\r
18 \r
19 /**\r
20  * PMDモデルファイルを読み込むためのローダ。\r
21  */\r
22 public class PmdLoader {\r
23 \r
24     private PmdModel model;\r
25     private PmdParser parser;\r
26     private TextBuilder textBuilder;\r
27 \r
28     private boolean loaded = false;\r
29     private boolean hasMoreData = false;\r
30 \r
31     /**\r
32      * コンストラクタ。\r
33      * @param source PMDファイル入力ソース\r
34      */\r
35     public PmdLoader(MmdSource source){\r
36         super();\r
37 \r
38         this.model = new PmdModel();\r
39         this.parser = new PmdParser(source);\r
40         this.textBuilder = new TextBuilder(this.model);\r
41 \r
42         setHandler();\r
43 \r
44         return;\r
45     }\r
46 \r
47     /**\r
48      * パーサに各種ハンドラの設定を行う。\r
49      */\r
50     private void setHandler(){\r
51         ShapeBuilder    shapeBuilder    = new ShapeBuilder(this.model);\r
52         MaterialBuilder materialBuilder = new MaterialBuilder(this.model);\r
53         BoneBuilder     boneBuilder     = new BoneBuilder(this.model);\r
54         MorphBuilder    morphBuilder    = new MorphBuilder(this.model);\r
55         ToonBuilder     toonBuilder     = new ToonBuilder(this.model);\r
56         RigidBuilder    rigidBuilder    = new RigidBuilder(this.model);\r
57         JointBuilder    jointBuilder    = new JointBuilder(this.model);\r
58 \r
59         this.parser.setBasicHandler(this.textBuilder);\r
60         this.parser.setShapeHandler(shapeBuilder);\r
61         this.parser.setMaterialHandler(materialBuilder);\r
62         this.parser.setBoneHandler(boneBuilder);\r
63         this.parser.setMorphHandler(morphBuilder);\r
64         this.parser.setEngHandler(this.textBuilder);\r
65         this.parser.setToonHandler(toonBuilder);\r
66         this.parser.setRigidHandler(rigidBuilder);\r
67         this.parser.setJointHandler(jointBuilder);\r
68 \r
69         List<MorphPart> morphPartList = new ArrayList<MorphPart>();\r
70         morphBuilder.setMorphPartList(morphPartList);\r
71         this.textBuilder.setMorphPartList(morphPartList);\r
72         morphPartList.clear();\r
73 \r
74         return;\r
75     }\r
76 \r
77     /**\r
78      * PMDファイルの読み込みを行いモデル情報を返す。\r
79      * 1インスタンスにつき一度しかロードできない。\r
80      * @return モデル情報\r
81      * @throws IOException 入力エラー\r
82      * @throws MmdFormatException PMDファイルフォーマットの異常を検出\r
83      * @throws IllegalStateException このインスタンスで再度のロードを試みた。\r
84      */\r
85     public PmdModel load()\r
86             throws IOException,\r
87                    MmdFormatException,\r
88                    IllegalStateException {\r
89         if(this.loaded) throw new IllegalStateException();\r
90 \r
91         PmdModel result;\r
92         try{\r
93             this.parser.parsePmd();\r
94         }finally{\r
95             this.loaded = true;\r
96 \r
97             result = this.model;\r
98             this.hasMoreData = this.textBuilder.hasMoreData();\r
99 \r
100             this.model = null;\r
101             this.parser = null;\r
102             this.textBuilder = null;\r
103         }\r
104 \r
105         return result;\r
106     }\r
107 \r
108     /**\r
109      * ロード処理が正常終了したのにまだ読み込んでいない部分が放置されているか判定する。\r
110      * MMDでの仕様拡張によるPMDファイルフォーマットの拡張が行われた場合を想定。\r
111      * @return 読み込んでいない部分があればtrue\r
112      */\r
113     public boolean hasMoreData(){\r
114         return this.hasMoreData;\r
115     }\r
116 \r
117 }\r