OSDN Git Service

本番スキーマ移行
authorOlyutorskii <olyutorskii@users.osdn.me>
Sun, 9 Jun 2013 16:06:06 +0000 (01:06 +0900)
committerOlyutorskii <olyutorskii@users.osdn.me>
Sun, 9 Jun 2013 16:06:06 +0000 (01:06 +0900)
52 files changed:
pom.xml
src/main/java/jp/sfjp/mikutoga/vmd/model/NumberedVmdFlag.java
src/main/java/jp/sfjp/mikutoga/vmd/model/VmdMotion.java
src/main/java/jp/sfjp/mikutoga/vmd/model/binio/BasicExporter.java
src/main/java/jp/sfjp/mikutoga/vmd/model/binio/BoolLoader.java
src/main/java/jp/sfjp/mikutoga/vmd/model/binio/VmdExporter.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/CameraXmlExporter.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/ExtraXmlExporter.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/FlagXmlExporter.java [new file with mode: 0644]
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/LightingXmlExpoter.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/SaxAttr.java [deleted file]
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/SaxCameraListener.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/SaxFlagListener.java [new file with mode: 0644]
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/SaxLightingListener.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/SaxMotionListener.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/SaxVmdListener.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/Schema110820.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/Schema130609.java [new file with mode: 0644]
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/VmdTag.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/VmdXmlExporter.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/XmlAttr.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/XmlHandler.java
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/XmlMotionFileType.java [new file with mode: 0644]
src/main/java/jp/sfjp/mikutoga/vmd/model/xml/XmlVmdLoader.java
src/main/java/jp/sfjp/mikutoga/vmd2xml/MotionFileType.java
src/main/java/jp/sfjp/mikutoga/vmd2xml/OptInfo.java
src/main/java/jp/sfjp/mikutoga/vmd2xml/OptSwitch.java
src/main/java/jp/sfjp/mikutoga/vmd2xml/Vmd2Xml.java
src/main/java/jp/sfjp/mikutoga/vmd2xml/Vmd2XmlConv.java
src/main/java/jp/sfjp/mikutoga/vmd2xml/XmlInputUtil.java [new file with mode: 0644]
src/main/resources/jp/sfjp/mikutoga/vmd/model/xml/resources/vmdxml-130609.xsd [moved from src/main/resources/jp/sfjp/mikutoga/vmd/model/xml/resources/vmdxml-130609A.xsd with 99% similarity]
src/test/java/jp/sfjp/mikutoga/vmd2xml/MotionFileTypeTest.java
src/test/java/jp/sfjp/mikutoga/vmd2xml/OptInfoTest.java
src/test/java/testdata/CnvAssert.java
src/test/java/testdata/vmd110820/camera/CameraTest.java
src/test/java/testdata/vmd110820/euler/EulerTest.java
src/test/java/testdata/vmd110820/luminous/LuminousTest.java
src/test/java/testdata/vmd110820/minimum/MinimumTest.java
src/test/java/testdata/vmd110820/morph/MorphTest.java
src/test/java/testdata/vmd110820/motion/MotionTest.java
src/test/java/testdata/vmd110820/newvmd/NewVmdTest.java
src/test/java/testdata/vmd110820/shadow/ShadowTest.java
src/test/java/testdata/vmd110820/small/SmallTest.java
src/test/java/testdata/vmd130609/flag/FlagTest.java [new file with mode: 0644]
src/test/java/testdata/vmd130609/minimum/MinimumTest.java [new file with mode: 0644]
src/test/java/testdata/vmd130609/small/SmallTest.java [new file with mode: 0644]
src/test/resources/testdata/vmd130609/flag/flag.vmd [new file with mode: 0644]
src/test/resources/testdata/vmd130609/flag/flag.xml [new file with mode: 0644]
src/test/resources/testdata/vmd130609/minimum/minimum.vmd [new file with mode: 0644]
src/test/resources/testdata/vmd130609/minimum/minimum.xml [moved from src/test/resources/testdata/vmd130609/minimum/minmotion.xml with 72% similarity]
src/test/resources/testdata/vmd130609/small/onlyFlag.vmd [new file with mode: 0644]
src/test/resources/testdata/vmd130609/small/onlyFlag.xml

diff --git a/pom.xml b/pom.xml
index 5d30fcb..c386d12 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -16,7 +16,7 @@
     <groupId>jp.sourceforge.mikutoga</groupId>
     <artifactId>vmd2xml</artifactId>
 
-    <version>1.101.5-SNAPSHOT</version>
+    <version>1.101.7-SNAPSHOT</version>
 
     <packaging>jar</packaging>
     <name>Vmd2XML</name>
index 3e1a33b..b9564eb 100644 (file)
@@ -25,7 +25,7 @@ public class NumberedVmdFlag
 
 
     private boolean shown = true;
-    private List<IkSwitch> ikSwList = new LinkedList<IkSwitch>();
+    private final List<IkSwitch> ikSwList = new LinkedList<IkSwitch>();
 
 
     /**
@@ -83,7 +83,7 @@ public class NumberedVmdFlag
 
         StringBuilder submsg = new StringBuilder(msg);
         for(IkSwitch sw : this.ikSwList){
-            submsg.append('\n').append("\u0020").append(sw.toString());
+            submsg.append("\n\u0020").append(sw.toString());
         }
 
         return submsg.toString();
index c06561c..eb63806 100644 (file)
@@ -92,6 +92,17 @@ public class VmdMotion {
     }
 
     /**
+     * フラグモーションが存在するか否か判定する。
+     * <p>フラグモーションは、
+     * MMD Ver7.40以降のVMDフォーマットでなければ記録できない。
+     * @return 存在するならtrue
+     */
+    public boolean hasFlagMotion(){
+        if(this.flagList.isEmpty()) return false;
+        return true;
+    }
+
+    /**
      * 順序保証されたボーンモーションマップを返す。
      * @return ボーンモーションマップ
      * @see java.util.LinkedHashMap
index 284eb66..bb67bb0 100644 (file)
@@ -38,22 +38,36 @@ class BasicExporter extends BinaryExporter {
 
     private static final Charset CS_ASCII = Charset.forName("US-ASCII");
 
-    // '\0' * 5byte の版もあり
-    private static final String HEADFILLER = "\u0000" + "JKLM";
+    private static final String HEADFILLER_OLD =
+            "\u0000" + "JKLM";
+    private static final String HEADFILLER =
+            "\u0000\u0000\u0000\u0000\u0000";
 
     private static final byte[] FDFILLER =
         { (byte)0x00, (byte)0xfd };
-    private static final  byte[] INTPLT_FILLER = {
-        (byte) 0x01,  // 0x00の版もあり。
+    private static final byte[] FILLER_00 = {   // MMD Ver7.39x64仕様
+        (byte) 0x00,
+        (byte) 0x00,
+        (byte) 0x00,
+    };
+    private static final byte[] FILLER_01 = {
+        (byte) 0x01,
         (byte) 0x00,
         (byte) 0x00,
     };
 
+    static{
+        assert HEADFILLER.length() == HEADFILLER_OLD.length();
+        assert FILLER_00.length == FILLER_01.length;
+    }
+
 
     private final byte[] motionIntplt = new byte[BZTOTAL_SIZE];
     private final ByteBuffer intpltBuf;
     private final ByteBuffer rdBuf;
 
+    private byte[] intpltFiller = FILLER_01;
+
 
     /**
      * コンストラクタ。
@@ -72,10 +86,15 @@ class BasicExporter extends BinaryExporter {
 
     /**
      * ヘッダ情報を出力する。
+     * @param motion モーションデータ
      * @throws IOException 出力エラー
      */
-    void dumpHeader() throws IOException{
-        byte[] header = (VmdConst.MAGIC_TXT + HEADFILLER).getBytes(CS_ASCII);
+    void dumpHeader(VmdMotion motion) throws IOException{
+        String headerTxt = VmdConst.MAGIC_TXT;
+        if(motion.hasFlagMotion()) headerTxt += HEADFILLER;
+        else                       headerTxt += HEADFILLER_OLD;
+
+        byte[] header = headerTxt.getBytes(CS_ASCII);
         assert header.length == VmdConst.HEADER_LENGTH;
 
         dumpByteArray(header);
@@ -111,6 +130,12 @@ class BasicExporter extends BinaryExporter {
      */
     void dumpBoneMotion(VmdMotion motion)
             throws IOException, IllegalTextExportException{
+        if(motion.hasFlagMotion()){                  // MMD Ver7.40仕様
+            this.intpltFiller = FILLER_00;
+        }else{
+            this.intpltFiller = FILLER_01;
+        }
+
         Map<String, List<BoneMotion>> map = motion.getBonePartMap();
 
         List<BoneMotion> bmotionList = new LinkedList<BoneMotion>();
@@ -230,7 +255,7 @@ class BasicExporter extends BinaryExporter {
         for(int lack = 1; lack < BZ_REDUNDANT; lack++){
             this.rdBuf.position(lack);
             this.intpltBuf.put(this.rdBuf);
-            this.intpltBuf.put(INTPLT_FILLER, 0, lack);
+            this.intpltBuf.put(this.intpltFiller, 0, lack);
         }
 
         assert this.intpltBuf.position() == BZTOTAL_SIZE;
index 208dd8f..b27fe65 100644 (file)
@@ -19,12 +19,12 @@ import jp.sfjp.mikutoga.vmd.parser.VmdBoolHandler;
  * フラグ情報のビルダ。
  * <p>MikuMikuDance Ver7.40以降でサポート
  */
-public class BoolLoader implements VmdBoolHandler{
+class BoolLoader implements VmdBoolHandler{
 
     private final List<NumberedVmdFlag> flagList;
 
-    private NumberedVmdFlag currentFlag;
-    private IkSwitch currentSwitch;
+    private NumberedVmdFlag currentFlag = null;
+    private IkSwitch currentSwitch = null;
 
     /**
      * コンストラクタ。
index 1d372e0..7ec9ba7 100644 (file)
@@ -64,7 +64,7 @@ public class VmdExporter {
      */
     private void dumpVmdMotionImpl(VmdMotion motion)
             throws IOException, IllegalVmdDataException{
-        this.basicExporter.dumpHeader();
+        this.basicExporter.dumpHeader(motion);
 
         try{
             this.basicExporter.dumpModelName(motion);
index bc5434c..9d7005b 100644 (file)
@@ -15,7 +15,7 @@ import jp.sfjp.mikutoga.vmd.model.CameraMotion;
 import jp.sfjp.mikutoga.vmd.model.CameraRotation;
 import jp.sfjp.mikutoga.vmd.model.PosCurve;
 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
-import jp.sourceforge.mikutoga.xml.ProxyXmlExporter;
+import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
 
 /**
  *カメラ情報のXMLエクスポーター。
index 9779232..075c3bd 100644 (file)
@@ -10,8 +10,8 @@ package jp.sfjp.mikutoga.vmd.model.xml;
 import java.io.IOException;
 import jp.sfjp.mikutoga.vmd.model.BezierParam;
 import jp.sfjp.mikutoga.vmd.model.PosCurve;
-import jp.sourceforge.mikutoga.xml.ProxyXmlExporter;
-import jp.sourceforge.mikutoga.xml.XmlExporter;
+import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
+import jp.sfjp.mikutoga.xml.XmlExporter;
 
 /**
  * XML出力機構の共通部。
diff --git a/src/main/java/jp/sfjp/mikutoga/vmd/model/xml/FlagXmlExporter.java b/src/main/java/jp/sfjp/mikutoga/vmd/model/xml/FlagXmlExporter.java
new file mode 100644 (file)
index 0000000..af1e4ba
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * flag xml exporter
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.vmd.model.xml;
+
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.List;
+import jp.sfjp.mikutoga.typical.TypicalBone;
+import jp.sfjp.mikutoga.vmd.model.IkSwitch;
+import jp.sfjp.mikutoga.vmd.model.NumberedVmdFlag;
+import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
+
+/**
+ * フラグ情報のXMLエクスポーター。
+ */
+class FlagXmlExporter extends ProxyXmlExporter {
+
+    private static final String MSG_MAYBE = "Perhaps : [{0}]";
+
+
+    /**
+     * コンストラクタ。
+     * @param delegate 委譲先
+     */
+    FlagXmlExporter(VmdXmlExporter delegate) {
+        super(delegate);
+        return;
+    }
+
+
+    /**
+     * boolean値をXSD:booleanに準拠した文字列に変換する。
+     * @param bool boolean値
+     * @return XSD:boolean文字列
+     */
+    private static String toXsdBoolean(boolean bool){
+        String result;
+        if(bool) result = "true";
+        else     result = "false";
+        return result;
+    }
+
+
+    /**
+     * 各種モーションフラグを出力する。
+     * @param vmdMotion モーションデータ
+     * @throws IOException 出力エラー
+     */
+    void putFlagSequence(VmdMotion vmdMotion)
+            throws IOException{
+        ind().putSimpleSTag(VmdTag.FLAG_SEQUENCE.tag()).ln();
+
+        pushNest();
+        List<NumberedVmdFlag> list = vmdMotion.getNumberedFlagList();
+        if( ! list.isEmpty() ) ln();
+        for(NumberedVmdFlag flag : list){
+            putFlagMotion(flag);
+        }
+        popNest();
+
+        ind().putETag(VmdTag.FLAG_SEQUENCE.tag()).ln(2);
+
+        return;
+    }
+
+    /**
+     * フラグリストを出力する。
+     * @param flag フラグモーション
+     * @throws IOException 出力エラー
+     */
+    private void putFlagMotion(NumberedVmdFlag flag)
+            throws IOException{
+        int frameNo = flag.getFrameNumber();
+        String showTxt = toXsdBoolean(flag.isModelShown());
+
+        ind().putOpenSTag(VmdTag.FLAG_MOTION.tag()).sp();
+        putIntAttr(XmlAttr.ATTR_FRAME, frameNo).sp();
+        putAttr(XmlAttr.ATTR_SHOWMODEL, showTxt).sp();
+
+        List<IkSwitch> ikList = flag.getIkSwitchList();
+        if(ikList.isEmpty()){
+            putCloseEmpty().ln(2);
+        }else{
+            putCloseSTag().ln(2);
+            pushNest();
+            for(IkSwitch ikSw : ikList){
+                putIkSwitch(ikSw);
+            }
+            popNest();
+            ind().putETag(VmdTag.FLAG_MOTION.tag()).ln(2);
+        }
+
+        return;
+    }
+
+    /**
+     * IK ON/OFFリストを出力する。
+     * @param ikSw IK ON/OFF スイッチ
+     * @throws IOException 出力エラー
+     */
+    private void putIkSwitch(IkSwitch ikSw)
+            throws IOException{
+        String boneName = ikSw.getBoneName();
+        String validTxt = toXsdBoolean(ikSw.isValid());
+
+        ind().putLineComment(boneName);
+        String globalName = TypicalBone.primary2global(boneName);
+        if(globalName != null){
+            String gname =
+                    MessageFormat.format(MSG_MAYBE, globalName);
+            sp(2).putLineComment(gname);
+        }
+        ln();
+
+        ind().putOpenSTag(VmdTag.IK_SWITCH.tag()).sp();
+
+        putAttr(XmlAttr.ATTR_NAME, boneName).sp();
+        putAttr(XmlAttr.ATTR_VALID, validTxt).sp();
+
+        putCloseEmpty().ln(2);
+
+        return;
+    }
+
+}
index 68acccb..152dc45 100644 (file)
@@ -15,8 +15,8 @@ import jp.sfjp.mikutoga.vmd.model.LuminousMotion;
 import jp.sfjp.mikutoga.vmd.model.ShadowMode;
 import jp.sfjp.mikutoga.vmd.model.ShadowMotion;
 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
-import jp.sourceforge.mikutoga.xml.ProxyXmlExporter;
-import jp.sourceforge.mikutoga.xml.XmlExporter;
+import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
+import jp.sfjp.mikutoga.xml.XmlExporter;
 
 /**
  * ライティング情報のXMLエクスポーター。
diff --git a/src/main/java/jp/sfjp/mikutoga/vmd/model/xml/SaxAttr.java b/src/main/java/jp/sfjp/mikutoga/vmd/model/xml/SaxAttr.java
deleted file mode 100644 (file)
index 283d4f8..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Sax 2 Xsd-types converter
- *
- * License : The MIT License
- * Copyright(c) 2013 MikuToga Partners
- */
-
-package jp.sfjp.mikutoga.vmd.model.xml;
-
-import javax.xml.bind.DatatypeConverter;
-import org.xml.sax.Attributes;
-
-/**
- * XSD各種型のSAX属性値をJavaプリミティブ型へ変換する。
- */
-public final class SaxAttr {
-
-    /**
-     * 隠しコンストラクタ。
-     */
-    private SaxAttr(){
-        assert false;
-        throw new AssertionError();
-    }
-
-
-    /**
-     * 属性名に対応する属性値があるか否か判定する。
-     * @param attr 属性群
-     * @param name 属性名
-     * @return 属性名に対応する属性値がある場合はtrue
-     */
-    public static boolean hasAttr(Attributes attr, String name){
-        if(attr.getValue(name) == null) return false;
-        return true;
-    }
-
-    /**
-     * xsd:string型属性値の読み込み。
-     * @param attr 属性群
-     * @param name 属性名
-     * @return 属性値。該当する属性が無ければnull。
-     */
-    public static String getStringAttr(Attributes attr, String name){
-        String attrVal = attr.getValue(name);
-        return attrVal;
-    }
-
-    /**
-     * xsd:boolean型属性値の読み込み。
-     * @param attr 属性群
-     * @param name 属性名
-     * @return 属性値。
-     * @throws IllegalArgumentException boolean型表記ではない
-     */
-    public static boolean getBooleanAttr(Attributes attr, String name)
-            throws IllegalArgumentException{
-        String attrVal = attr.getValue(name);
-        boolean bVal;
-        bVal = DatatypeConverter.parseBoolean(attrVal);
-        return bVal;
-    }
-
-    /**
-     * xsd:boolean型属性値の読み込み。
-     * @param attr 属性群
-     * @param name 属性名
-     * @param def 属性が無い場合のデフォルト値
-     * @return 属性値。
-     * @throws IllegalArgumentException boolean型表記ではない
-     */
-    public static boolean getBooleanAttr(Attributes attr,
-                                           String name,
-                                           boolean def )
-            throws IllegalArgumentException{
-        String attrVal = attr.getValue(name);
-        if(attrVal == null) return def;
-
-        boolean bVal;
-        bVal = DatatypeConverter.parseBoolean(attrVal);
-
-        return bVal;
-    }
-
-    /**
-     * xsd:byte型属性の読み込み。
-     * @param attr 属性群
-     * @param name 属性名
-     * @return 属性値。
-     * @throws NumberFormatException byte型表記ではない
-     */
-    public static byte getByteAttr(Attributes attr, String name)
-            throws NumberFormatException{
-        String attrVal = attr.getValue(name);
-        byte bVal;
-        bVal = DatatypeConverter.parseByte(attrVal);
-        return bVal;
-    }
-
-    /**
-     * xsd:float型属性値の読み込み。
-     * @param attr 属性群
-     * @param name 属性名
-     * @return 属性値。
-     * @throws NumberFormatException float型表記ではない
-     */
-    public static float getFloatAttr(Attributes attr, String name)
-            throws NumberFormatException {
-        String attrVal = attr.getValue(name);
-        float fVal;
-        fVal = DatatypeConverter.parseFloat(attrVal);
-        return fVal;
-    }
-
-    /**
-     * xsd:int型属性値の読み込み。
-     * @param attr 属性群
-     * @param name 属性名
-     * @return 属性値。
-     * @throws NumberFormatException int型表記ではない
-     */
-    public static int getIntAttr(Attributes attr, String name)
-            throws NumberFormatException {
-        String attrVal = attr.getValue(name);
-        int iVal;
-        iVal = DatatypeConverter.parseInt(attrVal);
-        return iVal;
-    }
-
-}
index e29a620..c27920e 100644 (file)
@@ -14,6 +14,7 @@ import jp.sfjp.mikutoga.vmd.model.CameraMotion;
 import jp.sfjp.mikutoga.vmd.model.CameraRotation;
 import jp.sfjp.mikutoga.vmd.model.PosCurve;
 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
 import org.xml.sax.Attributes;
 
 /**
diff --git a/src/main/java/jp/sfjp/mikutoga/vmd/model/xml/SaxFlagListener.java b/src/main/java/jp/sfjp/mikutoga/vmd/model/xml/SaxFlagListener.java
new file mode 100644 (file)
index 0000000..e9b99af
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * motion flag listener from XML
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.vmd.model.xml;
+
+import java.util.List;
+import jp.sfjp.mikutoga.vmd.model.IkSwitch;
+import jp.sfjp.mikutoga.vmd.model.NumberedVmdFlag;
+import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
+import org.xml.sax.Attributes;
+
+/**
+ * モーションフラグ関連のXML要素出現イベントを受信する。
+ */
+class SaxFlagListener extends SaxVmdListener {
+
+    private NumberedVmdFlag currentFlagMotion = null;
+
+
+    /**
+     * コンストラクタ。
+     */
+    SaxFlagListener(){
+        super();
+        return;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     * @param tag {@inheritDoc}
+     * @param attr {@inheritDoc}
+     */
+    @Override
+    void openTag(VmdTag tag, Attributes attr){
+        switch(tag){
+        case FLAG_MOTION:
+            openFlagMotion(attr);
+            break;
+        case IK_SWITCH:
+            openIkSwitch(attr);
+            break;
+        default:
+            break;
+        }
+
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param tag {@inheritDoc}
+     */
+    @Override
+    void closeTag(VmdTag tag){
+        if(tag == VmdTag.FLAG_MOTION){
+            closeFlagMotion();
+        }
+        return;
+    }
+
+    /**
+     * flagMotion要素開始の通知。
+     * @param attr 属性群
+     */
+    private void openFlagMotion(Attributes attr){
+        this.currentFlagMotion = new NumberedVmdFlag();
+
+        int frameNo = SaxAttr.getIntAttr(attr, XmlAttr.ATTR_FRAME);
+        boolean showModel =
+                SaxAttr.getBooleanAttr(attr, XmlAttr.ATTR_SHOWMODEL);
+
+        this.currentFlagMotion.setFrameNumber(frameNo);
+        this.currentFlagMotion.setModelShown(showModel);
+
+        return;
+    }
+
+    /**
+     * flagMotion要素終了の通知。
+     */
+    private void closeFlagMotion(){
+        VmdMotion motion = getVmdMotion();
+        List<NumberedVmdFlag> flagList = motion.getNumberedFlagList();
+        flagList.add(this.currentFlagMotion);
+
+        this.currentFlagMotion = null;
+
+        return;
+    }
+
+    /**
+     * ikSwitch要素開始の通知。
+     * @param attr 属性群
+     */
+    private void openIkSwitch(Attributes attr){
+        String boneName = SaxAttr.getStringAttr(attr, XmlAttr.ATTR_NAME);
+        boolean valid =
+                SaxAttr.getBooleanAttr(attr, XmlAttr.ATTR_VALID);
+
+        IkSwitch ikSw = new IkSwitch();
+        ikSw.setBoneName(boneName);
+        ikSw.setValid(valid);
+
+        List<IkSwitch> ikList = this.currentFlagMotion.getIkSwitchList();
+        ikList.add(ikSw);
+
+        return;
+    }
+
+}
index 9cfe45a..8c7830c 100644 (file)
@@ -14,6 +14,7 @@ import jp.sfjp.mikutoga.vmd.model.LuminousMotion;
 import jp.sfjp.mikutoga.vmd.model.ShadowMode;
 import jp.sfjp.mikutoga.vmd.model.ShadowMotion;
 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
 import org.xml.sax.Attributes;
 
 /**
index 3cd616b..3e96143 100644 (file)
@@ -14,6 +14,7 @@ import jp.sfjp.mikutoga.vmd.model.BoneMotion;
 import jp.sfjp.mikutoga.vmd.model.MorphMotion;
 import jp.sfjp.mikutoga.vmd.model.PosCurve;
 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
 import org.xml.sax.Attributes;
 
 /**
index dfc1aa5..6740f19 100644 (file)
@@ -10,6 +10,7 @@ package jp.sfjp.mikutoga.vmd.model.xml;
 import jp.sfjp.mikutoga.vmd.model.BezierParam;
 import jp.sfjp.mikutoga.vmd.model.PosCurve;
 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
 import org.xml.sax.Attributes;
 
 /**
index 8805d7e..b5f450f 100644 (file)
@@ -9,7 +9,7 @@ package jp.sfjp.mikutoga.vmd.model.xml;
 
 import java.net.URI;
 import java.net.URISyntaxException;
-import jp.sourceforge.mikutoga.xml.LocalXmlResource;
+import jp.sfjp.mikutoga.xml.LocalXmlResource;
 
 /**
  * 110820形式XML各種リソースの定義。
diff --git a/src/main/java/jp/sfjp/mikutoga/vmd/model/xml/Schema130609.java b/src/main/java/jp/sfjp/mikutoga/vmd/model/xml/Schema130609.java
new file mode 100644 (file)
index 0000000..987437e
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * xml resources for VMD-XML
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.vmd.model.xml;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import jp.sfjp.mikutoga.xml.LocalXmlResource;
+
+/**
+ * 130609形式XML各種リソースの定義。
+ * <p>MikuMikuDance Ver7.40 の新VMDファイルフォーマット対応。
+ */
+public final class Schema130609 implements LocalXmlResource{
+
+    /** 唯一のシングルトン。 */
+    public static final Schema130609 SINGLETON;
+
+    /** XML名前空間識別子。 */
+    public static final String NS_VMDXML =
+            "http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609";
+    /** XMLスキーマURI名。 */
+    public static final String SCHEMA_VMDXML =
+            "http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd";
+    /** 定義の版数。 */
+    public static final String VER_VMDXML =
+            "130609";
+    /** ローカルなスキーマファイル名。 */
+    public static final String LOCAL_SCHEMA_VMDXML =
+            "resources/vmdxml-130609.xsd";
+
+    private static final URI URI_SCHEMA_VMDXML = URI.create(SCHEMA_VMDXML);
+    private static final URI RES_SCHEMA_VMDXML;
+
+    private static final Class<?> THISCLASS = Schema130609.class;
+
+    static{
+        try{
+            RES_SCHEMA_VMDXML =
+                    THISCLASS.getResource(LOCAL_SCHEMA_VMDXML).toURI();
+        }catch(URISyntaxException e){
+            throw new ExceptionInInitializerError(e);
+        }
+
+        SINGLETON = new Schema130609();
+    }
+
+
+    /**
+     * コンストラクタ。
+     */
+    private Schema130609(){
+        super();
+        assert this.getClass() == THISCLASS;
+        return;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     * @return {@inheritDoc}
+     */
+    @Override
+    public URI getOriginalResource(){
+        return URI_SCHEMA_VMDXML;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @return {@inheritDoc}
+     */
+    @Override
+    public URI getLocalResource(){
+        return RES_SCHEMA_VMDXML;
+    }
+
+}
index e0cbc4d..b67e8b8 100644 (file)
@@ -30,6 +30,10 @@ enum VmdTag {
     MORPH_PART     ("morphPart"),
     MORPH_MOTION   ("morphMotion"),
 
+    FLAG_SEQUENCE  ("flagSequence"),
+    FLAG_MOTION    ("flagMotion"),
+    IK_SWITCH      ("ikSwitch"),
+
     CAMERA_SEQUENCE("cameraSequence"),
     CAMERA_MOTION  ("cameraMotion"),
     CAMERA_TARGET  ("cameraTarget"),
index 175a827..165e209 100644 (file)
@@ -23,8 +23,8 @@ import jp.sfjp.mikutoga.vmd.model.BoneMotion;
 import jp.sfjp.mikutoga.vmd.model.MorphMotion;
 import jp.sfjp.mikutoga.vmd.model.PosCurve;
 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
-import jp.sourceforge.mikutoga.xml.BasicXmlExporter;
-import jp.sourceforge.mikutoga.xml.XmlResourceResolver;
+import jp.sfjp.mikutoga.xml.BasicXmlExporter;
+import jp.sfjp.mikutoga.xml.XmlResourceResolver;
 
 /**
  * VMDモーションデータをXMLへエクスポートする。
@@ -43,12 +43,15 @@ public class VmdXmlExporter extends BasicXmlExporter {
     private static final String MSG_MAYBE = "Perhaps : [{0}]";
 
 
+    private XmlMotionFileType xmlType = XmlMotionFileType.XML_110820;
+
     private boolean isQuaternionMode = true;
     private String generator = "";
 
     private final CameraXmlExporter cameraXmlExporter;
     private final LightingXmlExpoter lightingExporter;
     private final ExtraXmlExporter extraExporter;
+    private final FlagXmlExporter flagXmlExporter;
 
 
     /**
@@ -60,10 +63,43 @@ public class VmdXmlExporter extends BasicXmlExporter {
         this.cameraXmlExporter = new CameraXmlExporter(this);
         this.lightingExporter  = new LightingXmlExpoter(this);
         this.extraExporter     = new ExtraXmlExporter(this);
+        this.flagXmlExporter   = new FlagXmlExporter(this);
+
+        return;
+    }
+
+
+    /**
+     * 出力XMLファイル種別を設定する。
+     * @param type ファイル種別
+     */
+    public void setXmlFileType(XmlMotionFileType type){
+        switch(type){
+        case XML_110820:
+        case XML_130609:
+            this.xmlType = type;
+            break;
+        case XML_AUTO:
+            this.xmlType = XmlMotionFileType.XML_130609;
+            break;
+        default:
+            assert false;
+            throw new AssertionError();
+        }
+
+        assert this.xmlType == XmlMotionFileType.XML_110820
+            || this.xmlType == XmlMotionFileType.XML_130609;
 
         return;
     }
 
+    /**
+     * 出力XMLファイル種別を返す。
+     * @return ファイル種別
+     */
+    public XmlMotionFileType getXmlFileType(){
+        return this.xmlType;
+    }
 
     /**
      * ボーン回転量をクォータニオンで出力するか否か設定する。
@@ -126,25 +162,7 @@ public class VmdXmlExporter extends BasicXmlExporter {
      */
     private void putVmdXmlImpl(VmdMotion vmdMotion)
             throws IOException, IllegalVmdDataException{
-        ind().putRawText(XML_DECL).ln(2);
-
-        ind().putBlockComment(XmlComment.TOP_COMMENT).ln(2);
-
-        ind().putOpenSTag(VmdTag.VMD_MOTION.tag()).ln();
-        pushNest();
-        ind().putAttr("xmlns", Schema110820.NS_VMDXML).ln();
-        ind().putAttr("xmlns:" + XSINS, XmlResourceResolver.NS_XSD).ln();
-
-        ind().putRawText(XSINS).putRawText(":schemaLocation=")
-             .putRawCh('"');
-        putRawText(Schema110820.NS_VMDXML).ln();
-        ind().sp(2).putRawText(Schema110820.SCHEMA_VMDXML)
-             .putRawCh('"')
-             .ln();
-
-        ind().putAttr(XmlAttr.ATTR_VERSION, Schema110820.VER_VMDXML).ln();
-        popNest();
-        putCloseSTag().ln(2);
+        putVmdRootOpen();
 
         putGenerator();
 
@@ -152,6 +170,9 @@ public class VmdXmlExporter extends BasicXmlExporter {
             putModelName(vmdMotion);
             putBoneMotionSequence(vmdMotion);
             putMorphSequence(vmdMotion);
+            if(this.xmlType == XmlMotionFileType.XML_130609){
+                this.flagXmlExporter.putFlagSequence(vmdMotion);
+            }
         }else{
             this.cameraXmlExporter.putCameraSequence(vmdMotion);
             this.lightingExporter.putLuminousSequence(vmdMotion);
@@ -165,6 +186,54 @@ public class VmdXmlExporter extends BasicXmlExporter {
     }
 
     /**
+     * ルート要素がオープンするまでの各種宣言を出力する。
+     * @throws IOException 出力エラー
+     */
+    private void putVmdRootOpen() throws IOException{
+        ind().putRawText(XML_DECL).ln(2);
+
+        ind().putBlockComment(XmlComment.TOP_COMMENT).ln(2);
+
+        String namespace;
+        String schemaUrl;
+        String schemaVer;
+
+        switch(this.xmlType){
+        case XML_110820:
+            namespace = Schema110820.NS_VMDXML;
+            schemaUrl = Schema110820.SCHEMA_VMDXML;
+            schemaVer = Schema110820.VER_VMDXML;
+            break;
+        case XML_130609:
+            namespace = Schema130609.NS_VMDXML;
+            schemaUrl = Schema130609.SCHEMA_VMDXML;
+            schemaVer = Schema130609.VER_VMDXML;
+            break;
+        default:
+            assert false;
+            throw new AssertionError();
+        }
+
+        ind().putOpenSTag(VmdTag.VMD_MOTION.tag()).ln();
+        pushNest();
+        ind().putAttr("xmlns", namespace).ln();
+        ind().putAttr("xmlns:" + XSINS, XmlResourceResolver.NS_XSD).ln();
+
+        ind().putRawText(XSINS).putRawText(":schemaLocation=")
+             .putRawCh('"');
+        putRawText(namespace).ln();
+        ind().sp(2).putRawText(schemaUrl)
+             .putRawCh('"')
+             .ln();
+
+        ind().putAttr(XmlAttr.ATTR_VERSION, schemaVer).ln();
+        popNest();
+        putCloseSTag().ln(2);
+
+        return;
+    }
+
+    /**
      * ジェネレータ名を出力する。
      * @throws IOException 出力エラー
      */
index 8e6848d..ab09caf 100644 (file)
@@ -58,6 +58,9 @@ final class XmlAttr {
     static final String ATTR_MODE            = "mode";
     static final String ATTR_RAW_PARAM       = "rawParam";
 
+    static final String ATTR_SHOWMODEL       = "showModel";
+    static final String ATTR_VALID           = "valid";
+
 
     /**
      * 隠しコンストラクタ。
index 88a7317..420c1ab 100644 (file)
@@ -8,6 +8,7 @@
 package jp.sfjp.mikutoga.vmd.model.xml;
 
 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.Locator;
@@ -27,6 +28,7 @@ class XmlHandler implements ContentHandler{
     private final SaxVmdListener motionListener;
     private final SaxVmdListener cameraListener;
     private final SaxVmdListener lightListener;
+    private final SaxVmdListener flagListener;
 
     private SaxVmdListener currentListener = null;
 
@@ -40,6 +42,7 @@ class XmlHandler implements ContentHandler{
         this.motionListener = new SaxMotionListener();
         this.cameraListener = new SaxCameraListener();
         this.lightListener  = new SaxLightingListener();
+        this.flagListener   = new SaxFlagListener();
 
         return;
     }
@@ -64,6 +67,7 @@ class XmlHandler implements ContentHandler{
         this.motionListener.setVmdMotion(this.vmdMotion);
         this.cameraListener.setVmdMotion(this.vmdMotion);
         this.lightListener .setVmdMotion(this.vmdMotion);
+        this.flagListener  .setVmdMotion(this.vmdMotion);
 
         return;
     }
@@ -87,7 +91,8 @@ class XmlHandler implements ContentHandler{
     @Override
     public void startPrefixMapping(String prefix, String uri)
             throws SAXException {
-        if(Schema110820.NS_VMDXML.equals(uri)){
+        if(   Schema110820.NS_VMDXML.equals(uri)
+           || Schema130609.NS_VMDXML.equals(uri) ){
             this.nspfx = prefix;
             this.nsuri = uri;
         }
@@ -159,6 +164,9 @@ class XmlHandler implements ContentHandler{
         case SHADOW_SEQUENCE:
             this.currentListener = this.lightListener;
             break;
+        case FLAG_SEQUENCE:
+            this.currentListener = this.flagListener;
+            break;
         default:
             break;
         }
diff --git a/src/main/java/jp/sfjp/mikutoga/vmd/model/xml/XmlMotionFileType.java b/src/main/java/jp/sfjp/mikutoga/vmd/model/xml/XmlMotionFileType.java
new file mode 100644 (file)
index 0000000..1b30b9f
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * MMD motion xml file types.
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.vmd.model.xml;
+
+/**
+ * XMLファイルスキーマ種別。
+ */
+public enum XmlMotionFileType {
+
+    /**
+     * XMLファイル(自動判別)。
+     * <p>読み込み時のスキーマ判別は自動。
+     * <p>書き込み時のスキーマは最新。
+     */
+    XML_AUTO,
+
+    /**
+     * スキーマ
+     * http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd
+     * で定義されたXMLファイル。
+     */
+    XML_110820,
+
+    /**
+     * スキーマ
+     * http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd
+     * で定義されたXMLファイル。
+     * MikuMikuDance Ver7.40対応。
+     */
+    XML_130609,
+
+    ;
+
+}
index c068ce5..80c2051 100644 (file)
@@ -9,7 +9,7 @@ package jp.sfjp.mikutoga.vmd.model.xml;
 
 import java.io.IOException;
 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
-import jp.sourceforge.mikutoga.xml.TogaXmlException;
+import jp.sfjp.mikutoga.xml.TogaXmlException;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.XMLReader;
index 672ff74..d065436 100644 (file)
@@ -7,6 +7,8 @@
 
 package jp.sfjp.mikutoga.vmd2xml;
 
+import jp.sfjp.mikutoga.vmd.model.xml.XmlMotionFileType;
+
 /**
  * モーションファイル種別。
  */
@@ -23,12 +25,27 @@ public enum MotionFileType {
     VMD,
 
     /**
+     * XMLファイル(自動判別)。
+     * <p>読み込み時のスキーマ判別は自動。
+     * <p>書き込み時のスキーマは最新。
+     */
+    XML_AUTO,
+
+    /**
      * スキーマ
      * http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd
      * で定義されたXMLファイル。
      */
     XML_110820,
 
+    /**
+     * スキーマ
+     * http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd
+     * で定義されたXMLファイル。
+     * MikuMikuDance Ver7.40対応。
+     */
+    XML_130609,
+
     ;
 
 
@@ -39,12 +56,47 @@ public enum MotionFileType {
         return;
     }
 
+
+    /**
+     * ファイル種別をXMLファイル種別に変換する。
+     * <p>未定義の場合はXML_AUTOを返す。
+     * @return XMLファイル種別
+     */
+    public XmlMotionFileType toXmlType(){
+        XmlMotionFileType result;
+
+        switch(this){
+        case XML_110820:
+            result = XmlMotionFileType.XML_110820;
+            break;
+        case XML_130609:
+            result = XmlMotionFileType.XML_130609;
+            break;
+        case XML_AUTO:
+            result = XmlMotionFileType.XML_AUTO;
+            break;
+        default:
+            result = XmlMotionFileType.XML_AUTO;
+            break;
+        }
+
+        return result;
+    }
+
     /**
      * ファイル種別がXMLか判定する。
      * @return XMLならtrue
      */
     public boolean isXml(){
-        if(this == XML_110820) return true;
+        switch(this){
+        case XML_AUTO:
+        case XML_110820:
+        case XML_130609:
+            return true;
+        default:
+            break;
+        }
+
         return false;
     }
 
index 91eba48..1f13770 100644 (file)
@@ -23,6 +23,7 @@ final class OptInfo {
     private static final String FORMAT_VMD       = "vmd";
     private static final String FORMAT_XML       = "xml";
     private static final String FORMAT_XML110820 = "xml110820";
+    private static final String FORMAT_XML130609 = "xml130609";
 
     private static final String SFX_VMD = ".vmd";
     private static final String SFX_XML = ".xml";
@@ -84,9 +85,11 @@ final class OptInfo {
         if      (FORMAT_VMD.equals(arg)){
             result = MotionFileType.VMD;
         }else if(FORMAT_XML.equals(arg)){
-            result = MotionFileType.XML_110820;
+            result = MotionFileType.XML_AUTO;
         }else if(FORMAT_XML110820.equals(arg)){
             result = MotionFileType.XML_110820;
+        }else if(FORMAT_XML130609.equals(arg)){
+            result = MotionFileType.XML_130609;
         }else{
             String errMsg = MessageFormat.format(ERRMSG_INVFORM, arg);
             throw new CmdLineException(errMsg);
@@ -155,7 +158,7 @@ final class OptInfo {
 
         String lower = fileName.toLowerCase(Locale.ROOT);
         if     (lower.endsWith(SFX_VMD)) result = MotionFileType.VMD;
-        else if(lower.endsWith(SFX_XML)) result = MotionFileType.XML_110820;
+        else if(lower.endsWith(SFX_XML)) result = MotionFileType.XML_AUTO;
 
         return result;
     }
index de39e1d..ea4c087 100644 (file)
@@ -47,7 +47,7 @@ enum OptSwitch {
             +     " or \"true\" or \"false\""
             +      " or \"yes\" or \"no\"\n"
             + "   format : \"vmd\" or \"xml\" or"
-            +            " \"xml110820\"\n"
+            +            " \"xml110820\" or \"xml130609\"\n"
             + "   newline : \"lf\" or \"crlf\"\n"
             ;
 
index ffde5ef..f534020 100644 (file)
@@ -15,15 +15,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
 import java.nio.channels.FileChannel;
 import java.text.MessageFormat;
 import java.util.Properties;
 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
 import jp.sfjp.mikutoga.vmd.IllegalVmdDataException;
-import jp.sourceforge.mikutoga.xml.TogaXmlException;
+import jp.sfjp.mikutoga.xml.TogaXmlException;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
@@ -68,7 +65,7 @@ public final class Vmd2Xml {
               "{0} {1}\n"
             + "\u0020\u0020License\u0020:\u0020{2}\n"
             + "\u0020\u0020{3}\n";
-    private static final String MSG_NOINFILE = "Can't find input file:{0}";
+    private static final String MSG_NOINFILE = "Can''t find input file: {0}";
     private static final String MSG_ABNFILE = "{0} is not file.";
     private static final String MSG_OWOUTFILE =
               "{0} already exists.\n"
@@ -269,18 +266,7 @@ public final class Vmd2Xml {
             exit(EXIT_IOERR);
         }
 
-        URI uri = inFile.toURI();
-        URL url;
-        try{
-            url = uri.toURL();
-        }catch(MalformedURLException e){
-            // File由来のURLでは起こりえない
-            assert false;
-            throw new AssertionError(e);
-        }
-        String systemId = url.toString();
-
-        InputSource source = new InputSource(systemId);
+        InputSource source = XmlInputUtil.fileToSource(inFile);
 
         return source;
     }
index 1b0135e..2c0684c 100644 (file)
@@ -7,31 +7,22 @@
 
 package jp.sfjp.mikutoga.vmd2xml;
 
-import java.io.BufferedInputStream;
 import java.io.BufferedWriter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
-import java.net.URL;
 import java.nio.charset.Charset;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.validation.Schema;
 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
 import jp.sfjp.mikutoga.vmd.IllegalVmdDataException;
 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
 import jp.sfjp.mikutoga.vmd.model.binio.VmdExporter;
 import jp.sfjp.mikutoga.vmd.model.binio.VmdLoader;
-import jp.sfjp.mikutoga.vmd.model.xml.Schema110820;
 import jp.sfjp.mikutoga.vmd.model.xml.VmdXmlExporter;
+import jp.sfjp.mikutoga.vmd.model.xml.XmlMotionFileType;
 import jp.sfjp.mikutoga.vmd.model.xml.XmlVmdLoader;
-import jp.sourceforge.mikutoga.xml.BotherHandler;
-import jp.sourceforge.mikutoga.xml.SchemaUtil;
-import jp.sourceforge.mikutoga.xml.TogaXmlException;
-import jp.sourceforge.mikutoga.xml.XmlResourceResolver;
+import jp.sfjp.mikutoga.xml.TogaXmlException;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.XMLReader;
@@ -62,107 +53,6 @@ public class Vmd2XmlConv {
 
 
     /**
-     * InputSourceからInputStreamを得る。
-     * <p>入力ソースには、少なくともバイトストリームか
-     * URL文字列(SystemId)のいずれかが設定されていなければならない。
-     * @param source 入力ソース
-     * @return 入力バイトストリーム
-     * @throws IllegalArgumentException 入力ソースの設定が足りない。
-     * @throws IOException 入力ソースにアクセス不能。
-     */
-    private static InputStream openInputSource(InputSource source)
-            throws IllegalArgumentException, IOException{
-        InputStream is;
-
-        is = source.getByteStream();
-
-        if(is == null){
-            String systemId = source.getSystemId();
-            if(systemId == null) throw new IllegalArgumentException();
-
-            URL url = new URL(systemId);
-            is = url.openStream();
-        }
-
-        is = new BufferedInputStream(is);
-
-        return is;
-    }
-
-    /**
-     * SAXパーサファクトリを生成する。
-     * <ul>
-     * <li>XML名前空間機能は有効になる。
-     * <li>DTDによる形式検証は無効となる。
-     * <li>XIncludeによる差し込み機能は無効となる。
-     * </ul>
-     * @param schema スキーマ
-     * @return ファクトリ
-     */
-    private static SAXParserFactory buildFactory(Schema schema){
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        factory.setXIncludeAware(false);
-//      factory.setFeature(name, value);
-
-        factory.setSchema(schema);
-
-        return factory;
-    }
-
-    /**
-     * SAXパーサを生成する。
-     * @param schema スキーマ
-     * @return SAXパーサ
-     */
-    private static SAXParser buildParser(Schema schema){
-        SAXParserFactory factory = buildFactory(schema);
-
-        SAXParser parser;
-        try{
-            parser = factory.newSAXParser();
-        }catch(ParserConfigurationException e){
-            assert false;
-            throw new AssertionError(e);
-        }catch(SAXException e){
-            assert false;
-            throw new AssertionError(e);
-        }
-
-//      parser.setProperty(name, value);
-
-        return parser;
-    }
-
-    /**
-     * XMLリーダを生成する。
-     * <p>エラーハンドラには{@link BotherHandler}が指定される。
-     * @param resolver リゾルバ
-     * @return XMLリーダ
-     */
-    private static XMLReader buildReader(XmlResourceResolver resolver){
-        Schema schema;
-        schema = SchemaUtil.newSchema(resolver, Schema110820.SINGLETON);
-
-        SAXParser parser = buildParser(schema);
-
-        XMLReader reader;
-        try{
-            reader = parser.getXMLReader();
-        }catch(SAXException e){
-            assert false;
-            throw new AssertionError(e);
-        }
-
-        reader.setEntityResolver(resolver);
-        reader.setErrorHandler(BotherHandler.HANDLER);
-
-        return reader;
-    }
-
-    /**
      * 入力ファイル種別を設定する。
      * @param type ファイル種別
      * @throws IllegalArgumentException 具体的な種別を渡さなかった
@@ -353,7 +243,7 @@ public class Vmd2XmlConv {
         VmdMotion motion = null;
 
         if(this.inTypes.isVmd()){
-            InputStream is = openInputSource(source);
+            InputStream is = XmlInputUtil.openInputSource(source);
             try{
                 motion = vmdRead(is);
             }finally{
@@ -420,8 +310,7 @@ public class Vmd2XmlConv {
             throws IOException,
                    SAXException,
                    TogaXmlException {
-        XmlResourceResolver resolver = new XmlResourceResolver();
-        XMLReader reader = buildReader(resolver);
+        XMLReader reader = XmlInputUtil.buildReader(this.inTypes);
         XmlVmdLoader loader = new XmlVmdLoader(reader);
 
         VmdMotion motion = loader.parse(source);
@@ -455,6 +344,8 @@ public class Vmd2XmlConv {
             throws IOException, IllegalVmdDataException{
         VmdXmlExporter exporter = new VmdXmlExporter();
 
+        XmlMotionFileType xmlType = this.outTypes.toXmlType();
+        exporter.setXmlFileType(xmlType);
         exporter.setNewLine(this.newLine);
         exporter.setGenerator(this.generator);
         exporter.setQuaternionMode(this.isQuaternionMode);
diff --git a/src/main/java/jp/sfjp/mikutoga/vmd2xml/XmlInputUtil.java b/src/main/java/jp/sfjp/mikutoga/vmd2xml/XmlInputUtil.java
new file mode 100644 (file)
index 0000000..1d4303e
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+ * xml input utility
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.vmd2xml;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.validation.Schema;
+import jp.sfjp.mikutoga.vmd.model.xml.Schema110820;
+import jp.sfjp.mikutoga.vmd.model.xml.Schema130609;
+import jp.sfjp.mikutoga.xml.BotherHandler;
+import jp.sfjp.mikutoga.xml.LocalXmlResource;
+import jp.sfjp.mikutoga.xml.SchemaUtil;
+import jp.sfjp.mikutoga.xml.XmlResourceResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ * XML入力に関する各種ユーティリティ。
+ */
+final class XmlInputUtil {
+
+    /**
+     * 隠しコンストラクタ。
+     */
+    private XmlInputUtil(){
+        assert false;
+        throw new AssertionError();
+    }
+
+
+    /**
+     * 実在ファイルからXML入力ソースを得る。
+     * @param file 実在ファイル
+     * @return XML入力ソース
+     */
+    static InputSource fileToSource(File file){
+        assert file.exists();
+
+        URI uri = file.toURI();
+
+        URL url;
+        try{
+            url = uri.toURL();
+        }catch(MalformedURLException e){
+            // 実在File由来のURLでは起こりえない
+            assert false;
+            throw new AssertionError(e);
+        }
+
+        String systemId = url.toString();
+
+        InputSource source = new InputSource(systemId);
+
+        return source;
+    }
+
+    /**
+     * InputSourceからInputStreamを得る。
+     * <p>入力ソースには、少なくともバイトストリームか
+     * URL文字列(SystemId)のいずれかが設定されていなければならない。
+     * @param source 入力ソース
+     * @return 入力バイトストリーム
+     * @throws IllegalArgumentException 入力ソースの設定が足りない。
+     * @throws IOException 入力ソースにアクセス不能。
+     */
+    static InputStream openInputSource(InputSource source)
+            throws IllegalArgumentException, IOException{
+        InputStream is;
+
+        is = source.getByteStream();
+
+        if(is == null){
+            String systemId = source.getSystemId();
+            if(systemId == null) throw new IllegalArgumentException();
+
+            URL url = new URL(systemId);
+            is = url.openStream();
+        }
+
+        is = new BufferedInputStream(is);
+
+        return is;
+    }
+
+    /**
+     * SAXパーサファクトリを生成する。
+     * <ul>
+     * <li>XML名前空間機能は有効になる。
+     * <li>DTDによる形式検証は無効となる。
+     * <li>XIncludeによる差し込み機能は無効となる。
+     * </ul>
+     * @param schema スキーマ
+     * @return ファクトリ
+     */
+    private static SAXParserFactory buildFactory(Schema schema){
+        SAXParserFactory factory = SAXParserFactory.newInstance();
+
+        factory.setNamespaceAware(true);
+        factory.setValidating(false);
+        factory.setXIncludeAware(false);
+//      factory.setFeature(name, value);
+
+        factory.setSchema(schema);
+
+        return factory;
+    }
+
+    /**
+     * SAXパーサを生成する。
+     * @param schema スキーマ
+     * @return SAXパーサ
+     */
+    private static SAXParser buildParser(Schema schema){
+        SAXParserFactory factory = buildFactory(schema);
+
+        SAXParser parser;
+        try{
+            parser = factory.newSAXParser();
+        }catch(ParserConfigurationException e){
+            assert false;
+            throw new AssertionError(e);
+        }catch(SAXException e){
+            assert false;
+            throw new AssertionError(e);
+        }
+
+//      parser.setProperty(name, value);
+
+        return parser;
+    }
+
+    /**
+     * スキーマを生成する。
+     * @param resolver リゾルバ
+     * @param xmlInType 入力XML種別
+     * @return スキーマ
+     */
+    private static Schema builsSchema(XmlResourceResolver resolver,
+                                        MotionFileType xmlInType ){
+        LocalXmlResource[] schemaArray;
+        switch(xmlInType){
+        case XML_110820:
+            schemaArray = new LocalXmlResource[]{
+                Schema110820.SINGLETON,
+            };
+            break;
+        case XML_130609:
+            schemaArray = new LocalXmlResource[]{
+                Schema130609.SINGLETON,
+            };
+            break;
+        case XML_AUTO:
+            schemaArray = new LocalXmlResource[]{
+                Schema110820.SINGLETON,
+                Schema130609.SINGLETON,
+            };
+            break;
+        default:
+            throw new IllegalStateException();
+        }
+
+        Schema schema = SchemaUtil.newSchema(resolver, schemaArray);
+
+        return schema;
+    }
+
+    /**
+     * XMLリーダを生成する。
+     * <p>エラーハンドラには{@link BotherHandler}が指定される。
+     * @param xmlInType 入力XML種別
+     * @return XMLリーダ
+     */
+    static XMLReader buildReader(MotionFileType xmlInType){
+        XmlResourceResolver resolver = new XmlResourceResolver();
+
+        Schema schema = builsSchema(resolver, xmlInType);
+
+        SAXParser parser = buildParser(schema);
+
+        XMLReader reader;
+        try{
+            reader = parser.getXMLReader();
+        }catch(SAXException e){
+            assert false;
+            throw new AssertionError(e);
+        }
+
+        reader.setEntityResolver(resolver);
+        reader.setErrorHandler(BotherHandler.HANDLER);
+
+        return reader;
+    }
+
+}
@@ -11,8 +11,8 @@
 
 
 <!DOCTYPE xsd:schema [
-    <!ENTITY schemaVer "130609A" >
-    <!ENTITY schemaNS "http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609A" >
+    <!ENTITY schemaVer "130609" >
+    <!ENTITY schemaNS "http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609" >
 ]>
 
 
index d95193f..d8d850f 100644 (file)
@@ -3,6 +3,7 @@
 
 package jp.sfjp.mikutoga.vmd2xml;
 
+import jp.sfjp.mikutoga.vmd.model.xml.XmlMotionFileType;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -40,7 +41,7 @@ public class MotionFileTypeTest {
     @Test
     public void testValues() {
         System.out.println("values");
-        assertEquals(3, MotionFileType.values().length);
+        assertEquals(5, MotionFileType.values().length);
         return;
     }
 
@@ -63,7 +64,9 @@ public class MotionFileTypeTest {
 
         assertFalse(MotionFileType.NONE.isXml());
         assertFalse(MotionFileType.VMD.isXml());
+        assertTrue(MotionFileType.XML_AUTO.isXml());
         assertTrue(MotionFileType.XML_110820.isXml());
+        assertTrue(MotionFileType.XML_130609.isXml());
 
         return;
     }
@@ -77,7 +80,25 @@ public class MotionFileTypeTest {
 
         assertFalse(MotionFileType.NONE.isVmd());
         assertTrue(MotionFileType.VMD.isVmd());
+        assertFalse(MotionFileType.XML_AUTO.isVmd());
         assertFalse(MotionFileType.XML_110820.isVmd());
+        assertFalse(MotionFileType.XML_130609.isVmd());
+
+        return;
+    }
+
+    /**
+     * Test of toXmlType method, of class MotionFileType.
+     */
+    @Test
+    public void testToXmlType() {
+        System.out.println("toXmlType");
+
+        assertSame(XmlMotionFileType.XML_AUTO, MotionFileType.NONE.toXmlType());
+        assertSame(XmlMotionFileType.XML_AUTO, MotionFileType.VMD.toXmlType());
+        assertSame(XmlMotionFileType.XML_AUTO, MotionFileType.XML_AUTO.toXmlType());
+        assertSame(XmlMotionFileType.XML_110820, MotionFileType.XML_110820.toXmlType());
+        assertSame(XmlMotionFileType.XML_130609, MotionFileType.XML_130609.toXmlType());
 
         return;
     }
index b51f71b..9082a73 100644 (file)
@@ -86,7 +86,7 @@ public class OptInfoTest {
         assertFalse(result.needHelp());
         assertSame(MotionFileType.VMD, result.getInFileType());
         assertEquals("test.vmd", result.getInFilename());
-        assertSame(MotionFileType.XML_110820, result.getOutFileType());
+        assertSame(MotionFileType.XML_AUTO, result.getOutFileType());
         assertEquals("test.xml", result.getOutFilename());
         assertEquals(Vmd2Xml.GENERATOR, result.getGenerator());
         assertEquals("\n", result.getNewline());
@@ -116,11 +116,14 @@ public class OptInfoTest {
         assertEquals("input", result.getInFilename());
 
         result = OptInfo.parseOption("-i", "input", "-o", "test.xml", "-iform", "xml");
-        assertSame(MotionFileType.XML_110820, result.getInFileType());
+        assertSame(MotionFileType.XML_AUTO, result.getInFileType());
 
         result = OptInfo.parseOption("-i", "input", "-o", "test.xml", "-iform", "xml110820");
         assertSame(MotionFileType.XML_110820, result.getInFileType());
 
+        result = OptInfo.parseOption("-i", "input", "-o", "test.xml", "-iform", "xml130609");
+        assertSame(MotionFileType.XML_130609, result.getInFileType());
+
         try{
             OptInfo.parseOption("-i", "test.vmd", "-o", "output");
             fail();
index cfc9a5f..853dfc9 100644 (file)
@@ -48,41 +48,26 @@ public class CnvAssert {
             String xmlResource,
             String expVmdResource )
             throws Exception{
-        InputStream xmlis =
-                klass.getResourceAsStream(xmlResource);
-        assertNotNull(xmlis);
-        xmlis = new BufferedInputStream(xmlis);
-
-        File destFile = openTempFile();
-        OutputStream destOut;
-        destOut = new FileOutputStream(destFile);
-        destOut = new BufferedOutputStream(destOut);
-
         Vmd2XmlConv converter = new Vmd2XmlConv();
-        converter.setInType(MotionFileType.XML_110820);
+        converter.setInType(MotionFileType.XML_AUTO);
         converter.setOutType(MotionFileType.VMD);
         converter.setNewline("\n");
 
-        converter.convert(xmlis, destOut);
-
-        xmlis.close();
-        destOut.close();
-
-        assertSameFile(klass, expVmdResource, destFile);
+        assertConvert(klass, xmlResource, expVmdResource, converter);
 
         return;
     }
 
     /**
-     * PMDリソースをXMLに変換した結果がXMLリソースに等しいと表明する。
+     * VMDリソースを110820版XMLに変換した結果がXMLリソースに等しいと表明する。
      * @param klass リソース元クラス
-     * @param pmdResource PMDリソース名
+     * @param vmdResource VMDリソース名
      * @param expXmlResource XMLリソース名
      * @throws Exception エラー
      */
-    public static void assertVmd2Xml(
+    public static void assertVmd2OldXml(
             Class<?> klass,
-            String pmdResource,
+            String vmdResource,
             String expXmlResource )
             throws Exception{
         Vmd2XmlConv converter = new Vmd2XmlConv();
@@ -91,27 +76,50 @@ public class CnvAssert {
         converter.setNewline("\n");
         converter.setGenerator(null);
 
-        assertVmd2Xml(klass, pmdResource, expXmlResource, converter);
+        assertConvert(klass, vmdResource, expXmlResource, converter);
 
         return;
     }
 
     /**
-     * VMDリソースをXMLに変換した結果がXMLリソースに等しいと表明する。
+     * VMDリソースを130609版XMLに変換した結果がXMLリソースに等しいと表明する。
      * @param klass リソース元クラス
-     * @param vmdResource PMDリソース名
+     * @param vmdResource VMDリソース名
      * @param expXmlResource XMLリソース名
-     * @param converter コンバータ
      * @throws Exception エラー
      */
-    public static void assertVmd2Xml(
+    public static void assertVmd2Xml13(
             Class<?> klass,
             String vmdResource,
-            String expXmlResource,
+            String expXmlResource )
+            throws Exception{
+        Vmd2XmlConv converter = new Vmd2XmlConv();
+        converter.setInType(MotionFileType.VMD);
+        converter.setOutType(MotionFileType.XML_130609);
+        converter.setNewline("\n");
+        converter.setGenerator(null);
+
+        assertConvert(klass, vmdResource, expXmlResource, converter);
+
+        return;
+    }
+
+    /**
+     * コンバータの変換結果がリソースファイルに等しいと表明する。
+     * @param klass リソース元クラス
+     * @param fromResource リソース名
+     * @param toResource 結果リソース名
+     * @param converter コンバータ
+     * @throws Exception エラー
+     */
+    public static void assertConvert(
+            Class<?> klass,
+            String fromResource,
+            String toResource,
             Vmd2XmlConv converter )
             throws Exception{
         InputStream vmdis =
-                klass.getResourceAsStream(vmdResource);
+                klass.getResourceAsStream(fromResource);
         assertNotNull(vmdis);
         vmdis = new BufferedInputStream(vmdis);
 
@@ -125,7 +133,7 @@ public class CnvAssert {
         vmdis.close();
         destOut.close();
 
-        assertSameFile(klass, expXmlResource, destFile);
+        assertSameFile(klass, toResource, destFile);
 
         return;
     }
index 32be144..e61d1ec 100644 (file)
@@ -42,7 +42,7 @@ public class CameraTest {
     @Test
     public void vmd2xml() throws Exception{
         System.out.println("vmd2xml");
-        assertVmd2Xml(THISCLASS, "camera.vmd", "camera.xml");
+        assertVmd2OldXml(THISCLASS, "camera.vmd", "camera.xml");
         return;
     }
 
index e66f261..8e053a8 100644 (file)
@@ -59,7 +59,7 @@ public class EulerTest {
         assertNull(converter.getGenerator());
         assertFalse(converter.isQuaterniomMode());
 
-        assertVmd2Xml(THISCLASS, "euler.vmd", "euler.xml", converter);
+        assertConvert(THISCLASS, "euler.vmd", "euler.xml", converter);
 
         return;
     }
index 2a1e664..13bc6e9 100644 (file)
@@ -42,7 +42,7 @@ public class LuminousTest {
     @Test
     public void vmd2xml() throws Exception{
         System.out.println("vmd2xml");
-        assertVmd2Xml(THISCLASS, "luminous.vmd", "luminous.xml");
+        assertVmd2OldXml(THISCLASS, "luminous.vmd", "luminous.xml");
         return;
     }
 
index 7cd2dd5..81089e6 100644 (file)
@@ -42,8 +42,8 @@ public class MinimumTest {
     @Test
     public void vmd2xml() throws Exception{
         System.out.println("vmd2xml");
-        assertVmd2Xml(THISCLASS, "minmotion.vmd", "minmotion.xml");
-        assertVmd2Xml(THISCLASS, "mincam.vmd", "mincam.xml");
+        assertVmd2OldXml(THISCLASS, "minmotion.vmd", "minmotion.xml");
+        assertVmd2OldXml(THISCLASS, "mincam.vmd", "mincam.xml");
         return;
     }
 
index 3ced6b7..34bf739 100644 (file)
@@ -42,7 +42,7 @@ public class MorphTest {
     @Test
     public void vmd2xml() throws Exception{
         System.out.println("vmd2xml");
-        assertVmd2Xml(THISCLASS, "morph.vmd", "morph.xml");
+        assertVmd2OldXml(THISCLASS, "morph.vmd", "morph.xml");
         return;
     }
 
index 5c5ed9b..7fe9138 100644 (file)
@@ -42,7 +42,7 @@ public class MotionTest {
     @Test
     public void vmd2xml() throws Exception{
         System.out.println("vmd2xml");
-        assertVmd2Xml(THISCLASS, "motion.vmd", "motion.xml");
+        assertVmd2OldXml(THISCLASS, "motion.vmd", "motion.xml");
         return;
     }
 
index 8c12cb7..684961e 100644 (file)
@@ -42,7 +42,7 @@ public class NewVmdTest {
     @Test
     public void vmd2xml() throws Exception{
         System.out.println("vmd2xml");
-        assertVmd2Xml(THISCLASS, "newvmd.vmd", "newvmd.xml");
+        assertVmd2OldXml(THISCLASS, "newvmd.vmd", "newvmd.xml");
         return;
     }
 
index e5b4ae0..e635d25 100644 (file)
@@ -42,7 +42,7 @@ public class ShadowTest {
     @Test
     public void vmd2xml() throws Exception{
         System.out.println("vmd2xml");
-        assertVmd2Xml(THISCLASS, "allShadow.vmd", "allShadow.xml");
+        assertVmd2OldXml(THISCLASS, "allShadow.vmd", "allShadow.xml");
         return;
     }
 
index 2ff8da7..8127621 100644 (file)
@@ -42,11 +42,11 @@ public class SmallTest {
     @Test
     public void vmd2xml() throws Exception{
         System.out.println("vmd2xml");
-        assertVmd2Xml(THISCLASS, "onlyBone.vmd", "onlyBone.xml");
-        assertVmd2Xml(THISCLASS, "onlyMorph.vmd", "onlyMorph.xml");
-        assertVmd2Xml(THISCLASS, "onlyCamera.vmd", "onlyCamera.xml");
-        assertVmd2Xml(THISCLASS, "onlyLuminous.vmd", "onlyLuminous.xml");
-        assertVmd2Xml(THISCLASS, "onlyShadow.vmd", "onlyShadow.xml");
+        assertVmd2OldXml(THISCLASS, "onlyBone.vmd", "onlyBone.xml");
+        assertVmd2OldXml(THISCLASS, "onlyMorph.vmd", "onlyMorph.xml");
+        assertVmd2OldXml(THISCLASS, "onlyCamera.vmd", "onlyCamera.xml");
+        assertVmd2OldXml(THISCLASS, "onlyLuminous.vmd", "onlyLuminous.xml");
+        assertVmd2OldXml(THISCLASS, "onlyShadow.vmd", "onlyShadow.xml");
         return;
     }
 
diff --git a/src/test/java/testdata/vmd130609/flag/FlagTest.java b/src/test/java/testdata/vmd130609/flag/FlagTest.java
new file mode 100644 (file)
index 0000000..58e9042
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ */
+
+package testdata.vmd130609.flag;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static testdata.CnvAssert.*;
+
+/**
+ *
+ */
+public class FlagTest {
+
+    static Class<?> THISCLASS = FlagTest.class;
+
+    public FlagTest() {
+        assert this.getClass() == THISCLASS;
+        return;
+    }
+
+    @BeforeClass
+    public static void setUpClass() {
+    }
+
+    @AfterClass
+    public static void tearDownClass() {
+    }
+
+    @Before
+    public void setUp() {
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+    @Test
+    public void vmd2xml() throws Exception{
+        System.out.println("vmd2xml");
+        assertVmd2Xml13(THISCLASS, "flag.vmd", "flag.xml");
+        return;
+    }
+
+    @Test
+    public void xml2vmd() throws Exception{
+        System.out.println("xml2vmd");
+        assertXml2Vmd(THISCLASS, "flag.xml", "flag.vmd");
+        return;
+    }
+
+}
diff --git a/src/test/java/testdata/vmd130609/minimum/MinimumTest.java b/src/test/java/testdata/vmd130609/minimum/MinimumTest.java
new file mode 100644 (file)
index 0000000..ec40c55
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ */
+
+package testdata.vmd130609.minimum;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static testdata.CnvAssert.*;
+
+/**
+ *
+ */
+public class MinimumTest {
+
+    static Class<?> THISCLASS = MinimumTest.class;
+
+    public MinimumTest() {
+        assert this.getClass() == THISCLASS;
+        return;
+    }
+
+    @BeforeClass
+    public static void setUpClass() {
+    }
+
+    @AfterClass
+    public static void tearDownClass() {
+    }
+
+    @Before
+    public void setUp() {
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+    @Test
+    public void vmd2xml() throws Exception{
+        System.out.println("vmd2xml");
+        assertVmd2Xml13(THISCLASS, "minimum.vmd", "minimum.xml");
+        return;
+    }
+
+    @Test
+    public void xml2vmd() throws Exception{
+        System.out.println("xml2vmd");
+        assertXml2Vmd(THISCLASS, "minimum.xml", "minimum.vmd");
+        return;
+    }
+
+}
diff --git a/src/test/java/testdata/vmd130609/small/SmallTest.java b/src/test/java/testdata/vmd130609/small/SmallTest.java
new file mode 100644 (file)
index 0000000..a669e01
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ */
+
+package testdata.vmd130609.small;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static testdata.CnvAssert.*;
+
+/**
+ *
+ */
+public class SmallTest {
+
+    static Class<?> THISCLASS = SmallTest.class;
+
+    public SmallTest() {
+        assert this.getClass() == THISCLASS;
+        return;
+    }
+
+    @BeforeClass
+    public static void setUpClass() {
+    }
+
+    @AfterClass
+    public static void tearDownClass() {
+    }
+
+    @Before
+    public void setUp() {
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+    @Test
+    public void vmd2xml() throws Exception{
+        System.out.println("vmd2xml");
+        assertVmd2Xml13(THISCLASS, "onlyFlag.vmd", "onlyFlag.xml");
+        return;
+    }
+
+    @Test
+    public void xml2vmd() throws Exception{
+        System.out.println("xml2vmd");
+        assertXml2Vmd(THISCLASS, "onlyFlag.xml", "onlyFlag.vmd");
+        return;
+    }
+
+}
diff --git a/src/test/resources/testdata/vmd130609/flag/flag.vmd b/src/test/resources/testdata/vmd130609/flag/flag.vmd
new file mode 100644 (file)
index 0000000..be8fee7
Binary files /dev/null and b/src/test/resources/testdata/vmd130609/flag/flag.vmd differ
diff --git a/src/test/resources/testdata/vmd130609/flag/flag.xml b/src/test/resources/testdata/vmd130609/flag/flag.xml
new file mode 100644 (file)
index 0000000..70a923b
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+  MikuMikuDance
+    motion-data(*.vmd) on XML
+-->
+
+
+<vmdMotion
+  xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609
+    http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd"
+  version="130609"
+>
+
+<!-- 初音ミク -->
+<modelName name="&#x521D;&#x97F3;&#x30DF;&#x30AF;" />
+
+<boneMotionSequence>
+</boneMotionSequence>
+
+<morphSequence>
+</morphSequence>
+
+<flagSequence>
+
+  <flagMotion frame="0" showModel="true" >
+
+    <!-- ネクタイIK -->
+    <ikSwitch name="&#xFF88;&#xFF78;&#xFF80;&#xFF72;&#xFF29;&#xFF2B;" valid="true" />
+
+    <!-- 左髪IK -->
+    <ikSwitch name="&#x5DE6;&#x9AEA;&#xFF29;&#xFF2B;" valid="true" />
+
+    <!-- 右髪IK -->
+    <ikSwitch name="&#x53F3;&#x9AEA;&#xFF29;&#xFF2B;" valid="true" />
+
+    <!-- 左足IK -->  <!-- Perhaps : [leg IK_L] -->
+    <ikSwitch name="&#x5DE6;&#x8DB3;&#xFF29;&#xFF2B;" valid="true" />
+
+    <!-- 右足IK -->  <!-- Perhaps : [leg IK_R] -->
+    <ikSwitch name="&#x53F3;&#x8DB3;&#xFF29;&#xFF2B;" valid="true" />
+
+    <!-- 左つま先IK -->  <!-- Perhaps : [toe IK_L] -->
+    <ikSwitch name="&#x5DE6;&#x3064;&#x307E;&#x5148;&#xFF29;&#xFF2B;" valid="true" />
+
+    <!-- 右つま先IK -->  <!-- Perhaps : [toe IK_R] -->
+    <ikSwitch name="&#x53F3;&#x3064;&#x307E;&#x5148;&#xFF29;&#xFF2B;" valid="true" />
+
+  </flagMotion>
+
+  <flagMotion frame="5" showModel="false" >
+
+    <!-- ネクタイIK -->
+    <ikSwitch name="&#xFF88;&#xFF78;&#xFF80;&#xFF72;&#xFF29;&#xFF2B;" valid="true" />
+
+    <!-- 左髪IK -->
+    <ikSwitch name="&#x5DE6;&#x9AEA;&#xFF29;&#xFF2B;" valid="true" />
+
+    <!-- 右髪IK -->
+    <ikSwitch name="&#x53F3;&#x9AEA;&#xFF29;&#xFF2B;" valid="true" />
+
+    <!-- 左足IK -->  <!-- Perhaps : [leg IK_L] -->
+    <ikSwitch name="&#x5DE6;&#x8DB3;&#xFF29;&#xFF2B;" valid="false" />
+
+    <!-- 右足IK -->  <!-- Perhaps : [leg IK_R] -->
+    <ikSwitch name="&#x53F3;&#x8DB3;&#xFF29;&#xFF2B;" valid="false" />
+
+    <!-- 左つま先IK -->  <!-- Perhaps : [toe IK_L] -->
+    <ikSwitch name="&#x5DE6;&#x3064;&#x307E;&#x5148;&#xFF29;&#xFF2B;" valid="true" />
+
+    <!-- 右つま先IK -->  <!-- Perhaps : [toe IK_R] -->
+    <ikSwitch name="&#x53F3;&#x3064;&#x307E;&#x5148;&#xFF29;&#xFF2B;" valid="true" />
+
+  </flagMotion>
+
+</flagSequence>
+
+</vmdMotion>
+
+<!-- EOF -->
diff --git a/src/test/resources/testdata/vmd130609/minimum/minimum.vmd b/src/test/resources/testdata/vmd130609/minimum/minimum.vmd
new file mode 100644 (file)
index 0000000..18dea4c
Binary files /dev/null and b/src/test/resources/testdata/vmd130609/minimum/minimum.vmd differ
@@ -7,11 +7,11 @@
 
 
 <vmdMotion
-  xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609A"
+  xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609A
-    http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609A.xsd"
-  version="130609A"
+  xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609
+    http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd"
+  version="130609"
 >
 
 <!-- [NAMELESS] -->
diff --git a/src/test/resources/testdata/vmd130609/small/onlyFlag.vmd b/src/test/resources/testdata/vmd130609/small/onlyFlag.vmd
new file mode 100644 (file)
index 0000000..06ecf13
Binary files /dev/null and b/src/test/resources/testdata/vmd130609/small/onlyFlag.vmd differ
index f880cee..7ec030f 100644 (file)
@@ -7,11 +7,11 @@
 
 
 <vmdMotion
-  xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609A"
+  xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609A
-    http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609A.xsd"
-  version="130609A"
+  xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609
+    http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd"
+  version="130609"
 >
 
 <!-- [NAMELESS] -->
 </morphSequence>
 
 <flagSequence>
-    <flagMotion frame="9" showModel="true" />
-    <flagMotion frame="99" showModel="false">
-        <ikSwitch name="IKBONE1" valid="true" />
-        <ikSwitch name="IKBONE2" valid="false" />
-    </flagMotion>
+
+  <flagMotion frame="9" showModel="true" />
+
+  <flagMotion frame="99" showModel="false" >
+
+    <!-- IKBONE1 -->
+    <ikSwitch name="IKBONE1" valid="false" />
+
+  </flagMotion>
+
 </flagSequence>
 
 </vmdMotion>