Vmd2XML 変更履歴
+2.103.2 (2019-07-04)
+ * Prevent XXE vulnerabilities from external resources.
+
2.102.2 (2019-06-06)
・必須環境をJavaSE8に引き上げ。
・Mercurial(2.101.4)からGit(2.101.104-SNAPSHOT)へSCMを移行。
<!--
Checkstyle suppressions
- for Checkstyle 8.20 or later
+ for Checkstyle 8.22 or later
[ https://checkstyle.org/ ]
<suppress files="" checks="ImportControl" />
<!-- Javadoc Comments -->
- <suppress files="" checks="JavadocParagraph" />
- <suppress files="" checks="JavadocTagContinuationIndentation" />
<suppress files="" checks="SummaryJavadocCheck" />
<!-- Miscellaneous -->
<suppress files="" checks="FinalParameters" />
+ <suppress files="" checks="OrderedProperties" />
<suppress files="" checks="TrailingComment" />
<!-- Modifier -->
- <suppress files="" checks="InterfaceMemberImpliedModifier" />
+ <suppress files="" checks="RedundantModifier" />
<!-- Whitespace -->
+ <suppress files="" checks="MethodParam" />
+ <suppress files="" checks="ParenPad" />
<suppress files="" checks="SingleSpaceSeparator" />
</suppressions>
<!--
Checkstyle modules
- for Checkstyle 8.21 or later
+ for Checkstyle 8.22 or later
[ https://checkstyle.org/ ]
<property name="fileExtensions" value="xml" />
</module>
<module name="RegexpHeader">
+ <!-- /* ... */ -->
<property name="header" value="^/\*$\n^ \*( .*)?$\n^ \*/$\n" />
<property name="multiLines" value="2" />
<property name="fileExtensions" value="java" />
<module name="NewlineAtEndOfFile">
<property name="fileExtensions" value="java, properties, xml, xsd, md, txt" />
</module>
+ <module name="OrderedProperties" />
<module name="Translation" />
<module name="UniqueProperties" />
<module name="RequireThis">
<property name="checkMethods" value="false" />
</module>
- <module name="ReturnCount" />
+ <module name="ReturnCount">
+ <property name="max" value="5" />
+ <property name="maxForVoid" value="5" />
+ </module>
<module name="SimplifyBooleanExpression" />
<module name="SimplifyBooleanReturn" />
<module name="StringLiteralEquality" />
<module name="SuperClone" />
<module name="SuperFinalize" />
<module name="UnnecessaryParentheses" />
+ <module name="UnnecessarySemicolonInEnumeration" />
+ <module name="UnnecessarySemicolonInTryWithResources" />
<module name="VariableDeclarationUsageDistance">
<property name="allowedDistance" value="5"/>
</module>
<property name="scope" value="protected" />
</module>
<module name="MissingJavadocMethod" />
+ <module name="MissingJavadocPackage" />
<module name="MissingJavadocType" />
<module name="NonEmptyAtclauseDescription" />
<module name="SingleLineJavadoc" />
<module name="GenericWhitespace" />
<module name="MethodParamPad" />
<module name="NoLineWrap" />
- <module name="NoWhitespaceAfter" />
- <module name="NoWhitespaceBefore" />
- <module name="OperatorWrap" />
- <module name="ParenPad">
- <property name="option" value="nospace" />
+ <module name="NoWhitespaceAfter">
<property
name="tokens"
- value="CTOR_CALL, METHOD_CALL, SUPER_CTOR_CALL"
+ value="AT, INC, DEC, UNARY_MINUS, UNARY_PLUS, DOT"
/>
</module>
+ <module name="NoWhitespaceBefore">
+ <property name="allowLineBreaks" value="true" />
+ </module>
+ <module name="OperatorWrap" />
+ <module name="ParenPad" />
<module name="SeparatorWrap">
<property name="tokens" value="DOT"/>
<property name="option" value="nl"/>
</module>
- </module>
+</module>
<!-- EOF -->
<property name="checkSingleIfStmt" value="false"/>
</properties>
</rule>
+ <rule ref="category/java/codestyle.xml/LongVariable" >
+ <properties>
+ <property name="minimum" value="25"/>
+ </properties>
+ </rule>
<rule ref="category/java/design.xml" >
<exclude name="LawOfDemeter" />
<groupId>jp.sourceforge.mikutoga</groupId>
<artifactId>vmd2xml</artifactId>
- <version>2.102.2</version>
+ <version>2.103.2</version>
<packaging>jar</packaging>
<name>Vmd2XML</name>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <locale>en</locale>
- <site.locales>${locale}</site.locales>
- <javadoc.locale>${locale}</javadoc.locale>
- <spotbugs.jvmArgs>-Duser.language=${locale}</spotbugs.jvmArgs>
-
- <!-- Walk around: JDK 11 javadoc + Maven -->
- <detectJavaApiLink>false</detectJavaApiLink>
+ <!-- DO NOT USE ${locale} with site-plugin -->
+ <site.locales>en</site.locales>
+ <javadoc.locale>en</javadoc.locale>
+ <spotbugs.jvmArgs>-Duser.language=en</spotbugs.jvmArgs>
<surefire-plugin.version>3.0.0-M3</surefire-plugin.version>
<jacoco-plugin.version>0.8.4</jacoco-plugin.version>
<checkstyle-plugin.version>3.1.0</checkstyle-plugin.version>
- <checkstyleruntime.version>8.21</checkstyleruntime.version>
- <checkstyle.config.location>${project.basedir}/config/checkstyle/checkstyle.xml</checkstyle.config.location>
- <checkstyle.suppressions.location>${project.basedir}/config/checkstyle/checkstyle-suppressions.xml</checkstyle.suppressions.location>
+ <checkstyleruntime.version>8.22</checkstyleruntime.version>
+ <checkstyle.config.location>config/checkstyle/checkstyle.xml</checkstyle.config.location>
+ <checkstyle.suppressions.location>config/checkstyle/checkstyle-suppressions.xml</checkstyle.suppressions.location>
<checkstyle.enable.rss>false</checkstyle.enable.rss>
<pmd-plugin.version>3.12.0</pmd-plugin.version>
- <spotbugs-plugin.version>3.1.11</spotbugs-plugin.version>
+ <spotbugs-plugin.version>3.1.12</spotbugs-plugin.version>
<spotbugs.effort>Max</spotbugs.effort>
<spotbugs.threshold>Low</spotbugs.threshold>
<!-- for Jenkins -->
<dependency>
<groupId>jp.sourceforge.mikutoga</groupId>
<artifactId>togagem</artifactId>
- <version>3.120.2</version>
+ <version>3.122.2</version>
<scope>compile</scope>
</dependency>
<execution>
<phase>package</phase>
<goals>
- <goal>shade</goal>
+ <goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
- <goal>jar-no-fork</goal>
+ <goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.0</version>
<configuration>
+ <locale>${javadoc.locale}</locale>
+ <source>${maven.compiler.source}</source>
<author>false</author>
<notimestamp>true</notimestamp>
<quiet>true</quiet>
<show>protected</show>
<header>${project.name} ${project.version} API</header>
<version>true</version>
- <locale>${javadoc.locale}</locale>
<!-- for JDK11 javadoc -->
<additionalJOption>-J-Duser.language=${javadoc.locale}</additionalJOption>
</configuration>
<version>${pmd-plugin.version}</version>
<configuration>
<rulesets>
- <ruleset>${project.basedir}/config/pmd/pmdrules.xml</ruleset>
+ <ruleset>config/pmd/pmdrules.xml</ruleset>
</rulesets>
</configuration>
<reportSets>
/**
* 三次ベジェ曲線による補間カーブを記述する。
+ *
* <p>制御点P0,P1,P2,P3の座標により記述される。
+ *
* <p>P0は(0,0)で固定。P3は(127,127)で固定。
* 残りのP1,P2は、P0,P3を対角線とする正方形の内部に位置しなければならない。
*/
/**
* コンストラクタ。
+ *
* <p>デフォルトの直線補間が設定される。
*/
public BezierParam(){
/**
* 制御点P1のX座標を返す。
+ *
* @return 制御点P1のX座標
*/
public byte getP1x() {
/**
* 制御点P1のY座標を返す。
+ *
* @return 制御点P1のY座標
*/
public byte getP1y() {
/**
* 制御点P2のX座標を返す。
+ *
* @return 制御点P2のX座標
*/
public byte getP2x() {
/**
* 制御点P2のY座標を返す。
+ *
* @return 制御点P2のY座標
*/
public byte getP2y() {
/**
* 制御点P1のX座標を設定する。
+ *
* @param p1x 制御点P1のX座標
*/
public void setP1x(byte p1x) {
/**
* 制御点P1のY座標を設定する。
+ *
* @param p1y 制御点P1のY座標
*/
public void setP1y(byte p1y) {
/**
* 制御点P2のX座標を設定する。
+ *
* @param p2x 制御点P2のX座標
*/
public void setP2x(byte p2x) {
/**
* 制御点P2のY座標を設定する。
+ *
* @param p2y 制御点P2のY座標
*/
public void setP2y(byte p2y) {
/**
* 制御点P1の座標を設定する。
+ *
* @param p1xArg 制御点P1のX座標
* @param p1yArg 制御点P1のY座標
*/
/**
* 制御点P2の座標を設定する。
+ *
* @param p2xArg 制御点P2のX座標
* @param p2yArg 制御点P2のY座標
*/
/**
* 直線補間か判定する。
+ *
* <p>P1,P2双方がP0-P3対角線上に存在する場合を直線補間とする。
+ *
* @return 直線補間ならtrue
*/
public boolean isLinear(){
/**
* MMDデフォルトの直線補間か判定する。
+ *
* @return MMDデフォルトの直線補間ならtrue
*/
public boolean isDefaultLinear(){
/**
* MMDデフォルトのEaseInOutカーブか判定する。
+ *
* @return MMDデフォルトのEaseInOutカーブならtrue
*/
public boolean isDefaultEaseInOut(){
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* ボーンのモーション情報。
+ *
* <p>ボーン名、ボーン位置、ボーン回転量、及び補間カーブ情報を持つ。
*/
public class BoneMotion extends AbstractNumbered {
/**
* ボーン名を返す。
+ *
* @return ボーン名
*/
public String getBoneName(){
/**
* ボーン名を設定する。
+ *
* @param boneName ボーン名
*/
public void setBoneName(String boneName){
/**
* ボーン回転量を返す。
+ *
* @return ボーン回転量
*/
public MkQuat getRotation(){
/**
* ボーン回転の補間曲線情報を返す。
+ *
* @return ボーン回転の補間曲線情報
*/
public BezierParam getIntpltRotation(){
/**
* ボーン位置を返す。
+ *
* @return ボーン位置
*/
public MkPos3D getPosition(){
/**
* ボーン位置移動の補間情報を返す。
+ *
* @return ボーン位置移動の補間情報
*/
public PosCurve getPosCurve(){
/**
* このモーションが暗黙の位置情報を持つか判定する。
+ *
* <p>ボーン位置が原点(0,0,0)にあり、
* XYZ3軸の移動補間カーブがデフォルト直線補間の場合、
* 暗黙の位置情報と見なされる。
+ *
* <p>MMDは、位置情報を持たないボーンのモーションに対し
* 便宜的にこの暗黙の位置情報を割り当てる。
+ *
* <p>通常の位置モーションが暗黙の位置情報と一致する場合もありうる。
+ *
* @return 暗黙の位置情報であるならtrue
*/
public boolean hasImplicitPosition(){
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* カメラモーション情報。
+ *
* <p>カメラの回転は極座標で表される。
+ *
* <p>カメラ-ターゲット間の距離は球座標(極座標)の動径に相当する。
* 通常はターゲットより手前に位置するカメラまでの距離が負の値で表される。
* カメラ位置がターゲットを突き抜けた場合は正の値もとりうる。
* ※MMDのUIと符号が逆なので注意。
+ *
* <p>パースペクティブモードがOFFの場合、
* 画角は無視され遠近感処理が行われなくなる。(平行投影?)
*/
/**
* ターゲット位置情報を返す。
+ *
* @return ターゲット位置情報
*/
public MkPos3D getCameraTarget(){
/**
* ターゲット位置移動の補間情報を返す。
+ *
* @return ターゲット位置移動の補間情報
*/
public PosCurve getTargetPosCurve(){
/**
* カメラ回転情報を返す。
+ *
* @return カメラ回転情報
*/
public CameraRotation getCameraRotation(){
/**
* カメラ回転の補間曲線情報を返す。
+ *
* @return カメラ回転の補間曲線情報
*/
public BezierParam getIntpltRotation(){
/**
* カメラ-ターゲット間の距離を返す。
+ *
* @return カメラ-ターゲット間の距離
*/
public double getRange(){
/**
* カメラ-ターゲット間の距離を設定する。
+ *
* @param range カメラ-ターゲット間の距離
*/
public void setRange(double range){
/**
* カメラ-ターゲット間距離の補間曲線情報を返す。
+ *
* @return カメラ-ターゲット間距離の補間曲線情報
*/
public BezierParam getIntpltRange(){
/**
* パースペクティブが有効か判定する。
+ *
* @return パースペクティブが有効ならtrue
*/
public boolean hasPerspective(){
/**
* パースペクティブモードを設定する。
+ *
* @param mode trueを渡すとパースペクティブが有効になる。
*/
public void setPerspectiveMode(boolean mode){
/**
* 投影角度(スクリーン縦画角)を返す。
+ *
* @return 投影角度(度数法)
*/
public int getProjectionAngle(){
/**
* 投影角度(スクリーン縦画角)を設定する。
+ *
* @param angle 投影角度(度数法)
*/
public void setProjectionAngle(int angle){
/**
* スクリーン投射の補間曲線情報を返す。
+ *
* @return スクリーン投射の補間曲線情報
*/
public BezierParam getIntpltProjection(){
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
* 左手系空間でターゲットの周りを回るカメラの回転情報。
* いずれもカメラ姿勢ではなくカメラ運動量を示すため、
* 回転量0と2Πの区別には意味がある。
+ *
* <p>latitudeはターゲットから見たカメラの仰俯角(≒緯度)。
* 単位はラジアン。
* Y軸回転量が0の時のZ正軸がY正軸へ倒れる方向が正回転。
* (MMDのUIとは符号が逆になるので注意)
* 仰俯角が0の場合、
* カメラはターゲットに対しXZ平面(水平)と平行な箇所に位置する。
+ *
* <p>longitudeはY軸周りの回転量(≒経度)。
* 単位はラジアン。
* X正軸がZ正軸へ倒れる方向が正回転。(ボーン回転と逆)
* 仰俯角およびY軸回転量が0の場合、
* カメラレンズはZ軸-∞方向からZ軸+∞方向を向く。
+ *
* <p>rollはレンズをターゲットを向けたカメラのロール回転量。
* 単位はラジアン。
* 仰俯角とY軸回転量が0の時にY正軸がX正軸に倒れる方向が正回転。
/**
* ターゲットから見たカメラの仰俯角(≒緯度)を返す。
+ *
* @return ターゲットから見たカメラの仰俯角(≒緯度)
*/
public double getLatitude(){
/**
* ターゲットから見たカメラの仰俯角(≒緯度)を設定する。
+ *
* @param latitude ターゲットから見たカメラの仰俯角(≒緯度)
*/
public void setLatitude(double latitude){
/**
* Y軸周りの回転量(≒経度)を返す。
+ *
* @return Y軸周りの回転量(≒経度)
*/
public double getLongitude(){
/**
* Y軸周りの回転量(≒経度)を設定する。
+ *
* @param longitude Y軸周りの回転量(≒経度)
*/
public void setLongitude(double longitude){
/**
* レンズをターゲットを向けたカメラのロール回転量を返す。
+ *
* @return レンズをターゲットを向けたカメラのロール回転量
*/
public double getRoll(){
/**
* レンズをターゲットを向けたカメラのロール回転量を設定する。
+ *
* @param roll レンズをターゲットを向けたカメラのロール回転量
*/
public void setRoll(double roll){
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* 光源の色設定。
+ *
* <p>色情報はRGB色空間で記述される。
+ *
* <p>MMDのUI上の各色成分指定0~255定義域に便宜上256を追加したものが、
* 0.0以上1.0以下にマップされる。
+ *
* <ul>
* <li>0は正しく0.0にマップされる。
* <li>128は正しく0.5にマップされる。
/**
* コンストラクタ。
+ *
* <p>MMDデフォルトの光源色(154,154,154)が設定される。
*/
public LuminousColor(){
/**
* 光源の赤成分を設定する。
+ *
* @param colR 赤成分
*/
public void setColR(float colR) {
/**
* 光源の緑成分を設定する。
+ *
* @param colG 緑成分
*/
public void setColG(float colG) {
/**
* 光源の青成分を設定する。
+ *
* @param colB 青成分
*/
public void setColB(float colB) {
/**
* 光源の赤成分を返す。
+ *
* @return 赤成分
*/
public float getColR(){
/**
* 光源の緑成分を返す。
+ *
* @return 緑成分
*/
public float getColG(){
/**
* 光源の青成分を返す。
+ *
* @return 青成分
*/
public float getColB(){
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* 光源演出情報。
+ *
* <p>照明方向は、
* ワールド座標原点から伸びる方向ベクトルとして記述される。
* この方向ベクトルに向けて、無限遠の光源から照明が当たる。
+ *
* <p>MMDのスライダUI上では
* 方向ベクトル各軸成分の定義域は-1.0以上+1.0以下だが、
* さらに絶対値の大きな値を指定することも可能。
+ *
* <p>方向ベクトルの長さは演出上の意味を持たないが、
* キーフレーム間の照明方向の補間に影響を及ぼすかもしれない。
+ *
* <p>方向ベクトルが零ベクトル(0,0,0)の場合、MMDでは全ポリゴンに影が落ちる。
+ *
*/
public class LuminousMotion extends AbstractNumbered {
/**
* 光源の色情報を返す。
+ *
* @return 光源の色情報
*/
public LuminousColor getColor(){
/**
* 光源からの照射方向情報を返す。
+ *
* @return 光源からの照射方向情報
*/
public MkVec3D getDirection(){
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* モーフ情報。
+ *
* <p>通常、モーフ量は0.0以上1.0以下の値をとる。
*/
public class MorphMotion extends AbstractNumbered {
/**
* モーフ名を設定する。
+ *
* @param morphName モーフ名
*/
public void setMorphName(String morphName) {
/**
* モーフ名を返す。
+ *
* @return モーフ名
*/
public String getMorphName() {
/**
* モーフ変量を設定する。
+ *
* @param flex 変量
*/
public void setFlex(float flex) {
/**
* モーフ変量を返す。
+ *
* @return 変量
*/
public float getFlex() {
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
private boolean shown = true;
- private final List<IkSwitch> ikSwList = new LinkedList<IkSwitch>();
+ private final List<IkSwitch> ikSwList = new LinkedList<>();
/**
* コンストラクタ。
+ *
* <p>モデル表示ありの状態で初期化される。
*/
public NumberedVmdFlag(){
/**
* モデルを表示するか否か返す。
+ *
* @return 表示するならtrue
*/
public boolean isModelShown(){
/**
* モデルを表示するか否か設定する。
+ *
* @param shownArg 表示するならtrue
*/
public void setModelShown(boolean shownArg){
/**
* 個別IKボーンフラグのリストを返す。
+ *
* @return 個別IKボーンフラグのリスト
*/
public List<IkSwitch> getIkSwitchList(){
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* 3次元位置移動のモーション補間曲線情報。
+ *
* <p>XYZ3軸それぞれに対応するベジェ曲線を3本持つ。
*/
public class PosCurve implements Iterable<BezierParam> {
/**
* {@inheritDoc}
- * X軸、Y軸、Z軸の順で補間曲線情報を列挙する。
+ *
+ * <p>X軸、Y軸、Z軸の順で補間曲線情報を列挙する。
+ *
* @return {@inheritDoc} 3要素を返す列挙子
*/
@Override
public Iterator<BezierParam> iterator(){
List<BezierParam> list;
- list = new ArrayList<BezierParam>(IT_SZ);
+ list = new ArrayList<>(IT_SZ);
list.add(this.intpltXpos);
list.add(this.intpltYpos);
list.add(this.intpltZpos);
/**
* ボーンX軸移動の補間曲線情報を返す。
+ *
* @return ボーンX軸移動の補間曲線情報
*/
public BezierParam getIntpltXpos(){
/**
* ボーンY軸移動の補間曲線情報を返す。
+ *
* @return ボーンY軸移動の補間曲線情報
*/
public BezierParam getIntpltYpos(){
/**
* ボーンZ軸移動の補間曲線情報を返す。
+ *
* @return ボーンZ軸移動の補間曲線情報
*/
public BezierParam getIntpltZpos(){
/**
* 3軸ともMMDデフォルトの直線補間か判定する。
+ *
* @return 3軸ともMMDデフォルトの直線補間ならtrue
*/
public boolean isDefaultLinear(){
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* シャドウ描画の質がカメラからの距離の影響をあまり受けないモード。
+ *
* <p>※MMDのUIにおけるデフォルト。
*/
MODE_1(0x01),
/**
* コンストラクタ。
+ *
* @param code 割り当て番号(byte)
*/
- private ShadowMode(byte code){
+ ShadowMode(byte code){
this.code = code;
return;
}
/**
* コンストラクタ。
+ *
* @param iVal 割り当て番号(int)
- * ※上位24bitは捨てられる。
+ * ※上位24bitは捨てられる。
*/
- private ShadowMode(int iVal){
+ ShadowMode(int iVal){
this((byte)(iVal & MASK_8));
return;
}
/**
* byte型値に符号化された時の値を返す。
+ *
* @return byte型値に符号化された時の値
*/
public byte getEncodedByte(){
/**
* byte型値から描画モードを復号する。
+ *
* @param bVal byte型値
* @return 描画モード。未定義の値が与えられた場合はnull。
*/
/**
* int型値から描画モードを復号する。
+ *
* <p>上位24bitは無視される。
+ *
* @param iVal int型値
* @return 描画モード。未定義の値が与えられた場合はnull。
*/
/**
* 影(セルフシャドウ)演出情報。
+ *
* <p>カメラからの距離情報(幾何距離の100倍?)による影演出対象の範囲指定は、
* MMDのスライダUI上では0から9999までが指定可能。
+ *
* <p>MMDのスライダUI値SからVMDファイル上の生パラメターへの変換式は、
* 「 0.1 - (S / 1.0E+5) 」
* となる。
/**
* デフォルトの範囲指定生パラメータ。
+ *
* <p>MMDのスライダUI値「8875」にほぼ相当。
*/
public static final double DEF_SCOPE = 0.01125;
/**
* VMDファイル上の生パラメータ数値による演出対象範囲指定を、
* MMDのUI上の距離情報(カメラからの幾何距離×100倍?)に変換する。
+ *
* @param param 生パラメータ
* @return MMDのスライダUI上の距離情報
*/
/**
* MMDのUI上の距離情報(カメラからの幾何距離×100倍?)を、
* VMDファイル上の生パラメータ数値に変換する。
+ *
* @param scope MMDのスライダUI上の距離情報
* @return 生パラメータ
*/
/**
* 影演出の範囲指定の生パラメータを設定する。
+ *
* @param rawScopeParam 生パラメータ
*/
public void setRawScopeParam(double rawScopeParam) {
/**
* 影演出の範囲指定の生パラメータを返す。
+ *
* @return 生パラメータ
*/
public double getRawScopeParam() {
/**
* 影演出の範囲指定のスライダUI値を設定する。
+ *
* @param scope スライダUI値
*/
public void setScope(double scope){
/**
* 影演出の範囲指定のスライダUI値を返す。
+ *
* @return スライダUI値
*/
public double getScope(){
/**
* 影描画モードを設定する。
+ *
* @param shadowMode 影描画モード
* @throws NullPointerException 引数がnull
*/
/**
* 影描画モードを返す。
+ *
* @return 影描画モード
*/
public ShadowMode getShadowMode(){
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
public VmdMotion(){
super();
- this.bonePartMap = new LinkedHashMap<String, List<BoneMotion>>();
- this.morphPartMap = new LinkedHashMap<String, List<MorphMotion>>();
+ this.bonePartMap = new LinkedHashMap<>();
+ this.morphPartMap = new LinkedHashMap<>();
- this.cameraMotionList = new LinkedList<CameraMotion>();
- this.luminousMotionList = new LinkedList<LuminousMotion>();
- this.shadowMotionList = new LinkedList<ShadowMotion>();
- this.flagList = new LinkedList<NumberedVmdFlag>();
+ this.cameraMotionList = new LinkedList<>();
+ this.luminousMotionList = new LinkedList<>();
+ this.shadowMotionList = new LinkedList<>();
+ this.flagList = new LinkedList<>();
return;
}
/**
* モデル名を返す。
+ *
* @return モデル名
*/
public String getModelName(){
/**
* モデル名を設定する。
+ *
* <p>このモーションがモデルモーションかステージ演出情報かは、
* このモデル名で判別される。
+ *
* @param modelName モデル名
* @throws NullPointerException 引数がnull
* @see jp.sfjp.mikutoga.vmd.VmdUniq#MODELNAME_STAGEACT
/**
* モデルモーションか否か判別する。
+ *
* <p>判別は特殊なモデル名を持つか否かで決定される。
* @return モデルモーションならtrue
+ *
* @see jp.sfjp.mikutoga.vmd.VmdUniq#MODELNAME_STAGEACT
*/
public boolean isModelMotion(){
/**
* フラグモーションが存在するか否か判定する。
+ *
* <p>フラグモーションは、
* MMD Ver7.40以降のVMDフォーマットでなければ記録できない。
+ *
* @return 存在するならtrue
*/
public boolean hasFlagMotion(){
/**
* 順序保証されたボーンモーションマップを返す。
+ *
* @return ボーンモーションマップ
* @see java.util.LinkedHashMap
*/
/**
* 順序保証されたモーフモーションマップを返す。
+ *
* @return モーフモーションマップ
* @see java.util.LinkedHashMap
*/
/**
* カメラモーションのリストを返す。
+ *
* @return カメラモーションのリスト
*/
public List<CameraMotion> getCameraMotionList(){
/**
* 照明モーションのリストを返す。
+ *
* @return 照明モーションのリスト
*/
public List<LuminousMotion> getLuminousMotionList(){
/**
* シャドウモーションのリストを返す。
+ *
* @return シャドウモーションのリスト
*/
public List<ShadowMotion> getShadowMotionList(){
/**
* 各種フレーム番号付きフラグのリストを返す。
+ *
* @return フレーム番号付きフラグのリスト
*/
public List<NumberedVmdFlag> getNumberedFlagList(){
/**
* ボーンモーションを追加する。
* 追加順は保持される。
+ *
* @param motion ボーンモーション
* @see java.util.LinkedHashMap
*/
List<BoneMotion> list = this.bonePartMap.get(name);
if(list == null){
- list = new LinkedList<BoneMotion>();
+ list = new LinkedList<>();
this.bonePartMap.put(name, list);
}
/**
* モーフモーションを追加する。
* 追加順は保持される。
+ *
* @param motion モーフモーション
* @see java.util.LinkedHashMap
*/
List<MorphMotion> list = this.morphPartMap.get(name);
if(list == null){
- list = new LinkedList<MorphMotion>();
+ list = new LinkedList<>();
this.morphPartMap.put(name, list);
}
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* コンストラクタ。
+ *
* @param stream 出力ストリーム
*/
BasicExporter(OutputStream stream){
/**
* ヘッダ情報を出力する。
+ *
* @param motion モーションデータ
* @throws IOException 出力エラー
*/
/**
* モデル名を出力する。
+ *
* <p>演出データのモデル名には
* 便宜的に
* {@link jp.sfjp.mikutoga.vmd.VmdUniq#MODELNAME_STAGEACT}
* が使われる。
+ *
* @param motion モーションデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException 不正なモデル名の出現
/**
* ボーンモーション情報を出力する。
+ *
* @param motion モーションデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException 不正なボーン名の出現
Map<String, List<BoneMotion>> map = motion.getBonePartMap();
- List<BoneMotion> bmotionList = new LinkedList<BoneMotion>();
+ List<BoneMotion> bmotionList = new LinkedList<>();
for(List<BoneMotion> eachList : map.values()){
bmotionList.addAll(eachList);
}
/**
* ボーン位置情報を出力する。
+ *
* @param position ボーン位置情報
* @throws IOException 出力エラー
*/
/**
* ボーン回転情報を出力する。
+ *
* @param rotation ボーン回転情報
* @throws IOException 出力エラー
*/
/**
* ボーンモーションの補間情報を出力する。
+ *
* @param boneMotion ボーンモーション
* @throws IOException 出力エラー
*/
/**
* 補間情報冗長部の組み立て。
+ *
* <p>※ MMDの版によって若干出力内容が異なる。
*/
private void redundantCopy(){
/**
* モーフ情報を出力する。
+ *
* @param motion モーションデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException 不正なモーフ名の出現
throws IOException, IllegalTextExportException{
Map<String, List<MorphMotion>> map = motion.getMorphPartMap();
- List<MorphMotion> morphList = new LinkedList<MorphMotion>();
+ List<MorphMotion> morphList = new LinkedList<>();
for(List<MorphMotion> eachList : map.values()){
morphList.addAll(eachList);
}
/**
* フラグ情報のエクスポーター。
+ *
* <p>MikuMikuDance Ver7.40以降でサポート
*/
class BoolExporter extends BinaryExporter{
/**
* コンストラクタ。
+ *
* @param stream 出力ストリーム
*/
BoolExporter(OutputStream stream){
/**
* フラグ情報を出力する。
+ *
* @param motion モーションデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException 不正な文字列が指定された。
/**
* IK有効フラグを出力する。
+ *
* @param flag フラグ情報
* @throws IOException 出力エラー
* @throws IllegalTextExportException 不正な文字列が指定された。
/**
* フラグ情報のビルダ。
+ *
* <p>MikuMikuDance Ver7.40以降でサポート
*/
class BoolLoader implements VmdBoolHandler{
/**
* コンストラクタ。
+ *
* @param vmdMotion モーションデータの格納先。
*/
BoolLoader(VmdMotion vmdMotion){
/**
* {@inheritDoc}
+ *
* @param stage {@inheritDoc}
* @param loops {@inheritDoc}
* @throws MmdFormatException {@inheritDoc}
/**
* {@inheritDoc}
+ *
* @param stage {@inheritDoc}
* @throws MmdFormatException {@inheritDoc}
*/
/**
* {@inheritDoc}
+ *
* @param stage {@inheritDoc}
* @throws MmdFormatException {@inheritDoc}
*/
/**
* {@inheritDoc}
+ *
* @param show {@inheritDoc}
* @param keyFrameNo {@inheritDoc}
* @throws MmdFormatException {@inheritDoc}
/**
* {@inheritDoc}
+ *
* @param boneName {@inheritDoc}
* @param validIk {@inheritDoc}
* @param keyFrameNo {@inheritDoc}
/**
* モーションデータをVMDファイル形式で出力する。
+ *
* <p>異常時には出力データのフラッシュが試みられる。
+ *
* @param motion モーションデータ
* @param ostream 出力先ストリーム
* @throws IOException 出力エラー
/**
* モーションデータをVMDファイル形式で出力する。
+ *
* @param motion モーションデータ
* @throws IOException 出力エラー
* @throws IllegalVmdDataException モーションデータに不備が発見された
/**
* 正常パース時に読み残したデータがあったか判定する。
+ *
* @return 読み残したデータがあればtrue
* @throws IllegalStateException まだパースを試みていない。
*/
/**
* ボーンモーション補間情報冗長部のチェックを行うか否か設定する。
* デフォルトではチェックを行わない。
+ *
* <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
* オフにするとパースに成功する場合がある。
+ *
* <p>※MMD Ver7.39x64以降はチェック回避必須。
+ *
* @param mode チェックさせたければtrue
*/
public void setRedundantCheck(boolean mode){
/**
* VMDファイルの読み込みを行いモーション情報を返す。
* 1インスタンスにつき一度しかロードできない。
+ *
* @param source VMDファイル入力ソース
* @return モーション情報
* @throws IOException 入力エラー
/**
* XML出力機構の共通部。
+ *
* <p>主にベジェ補間パラメータ出力部。
*/
class ExtraXmlExporter extends ProxyXmlExporter {
/**
* コンストラクタ。
+ *
* @param delegate 委譲先
*/
ExtraXmlExporter(XmlExporter delegate){
/**
* 位置移動補間カーブを出力する。
+ *
* @param posCurve 移動補間情報
* @throws IOException 出力エラー
*/
/**
* ベジェ曲線による補間曲線情報を出力する。
+ *
* @param bezier ベジェ曲線
* @throws IOException 出力エラー
*/
import java.net.URI;
import java.net.URISyntaxException;
-import jp.sfjp.mikutoga.xml.LocalXmlResource;
/**
* 110820形式XML各種リソースの定義。
*/
-public final class Schema110820 implements LocalXmlResource{
-
- /** 唯一のシングルトン。 */
- public static final Schema110820 SINGLETON;
+public final class Schema110820{
/** XML名前空間識別子。 */
public static final String NS_VMDXML =
public static final String LOCAL_SCHEMA_VMDXML =
"resources/vmdxml-110820.xsd";
- private static final URI URI_SCHEMA_VMDXML = URI.create(SCHEMA_VMDXML);
- private static final URI RES_SCHEMA_VMDXML;
+ /** schema URI. */
+ public static final URI URI_SCHEMA_VMDXML = URI.create(SCHEMA_VMDXML);
+ /** local resource URI. */
+ public static final URI RES_SCHEMA_VMDXML;
private static final Class<?> THISCLASS = Schema110820.class;
}catch(URISyntaxException e){
throw new ExceptionInInitializerError(e);
}
-
- SINGLETON = new Schema110820();
}
* コンストラクタ。
*/
private Schema110820(){
- 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;
+ assert false;
}
}
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;
+public final class Schema130609{
/** XML名前空間識別子。 */
public static final String NS_VMDXML =
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;
+ /** schema URI. */
+ public static final URI URI_SCHEMA_VMDXML = URI.create(SCHEMA_VMDXML);
+ /** local resource URI. */
+ public static final URI RES_SCHEMA_VMDXML;
private static final Class<?> THISCLASS = Schema130609.class;
}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;
+ assert false;
}
}
private static final Map<String, VmdTag> NAME_MAP =
- new HashMap<String, VmdTag>();
+ new HashMap<>();
static{
for(VmdTag tag : values()){
* コンストラクタ。
* @param tagName 要素名
*/
- private VmdTag(String tagName){
+ VmdTag(String tagName){
this.tagName = tagName.intern();
return;
}
import jp.sfjp.mikutoga.vmd.model.PosCurve;
import jp.sfjp.mikutoga.vmd.model.VmdMotion;
import jp.sfjp.mikutoga.xml.BasicXmlExporter;
-import jp.sfjp.mikutoga.xml.XmlResourceResolver;
+import jp.sfjp.mikutoga.xml.SchemaUtil;
/**
* VMDモーションデータをXMLへエクスポートする。
/**
* 出力XMLファイル種別を設定する。
+ *
* @param type ファイル種別
*/
public void setXmlFileType(XmlMotionFileType type){
/**
* 出力XMLファイル種別を返す。
+ *
* @return ファイル種別
*/
public XmlMotionFileType getXmlFileType(){
/**
* ボーン回転量をクォータニオンで出力するか否か設定する。
+ *
* <p>デフォルトではtrue
+ *
* @param mode trueだとクォータニオン、falseだとオイラー角で出力される。
*/
public void setQuaternionMode(boolean mode){
/**
* ボーン回転量をクォータニオンで出力するか否か返す。
+ *
* @return クォータニオンで出力するならtrue
*/
public boolean isQuaternionMode(){
/**
* Generatorメタ情報を設定する。
+ *
* @param generatorArg Generatorメタ情報。nullならXML出力しない。
*/
public void setGenerator(String generatorArg){
/**
* Generatorメタ情報を取得する。
+ *
* @return Generatorメタ情報。XML出力しないならnullを返す。
*/
public String getGenerator(){
/**
* VMDモーションデータをXML形式で出力する。
+ *
* @param vmdMotion VMDモーションデータ
* @param xmlOut 出力先
* @throws IOException 出力エラー
/**
* VMDモーションデータをXML形式で出力する。
+ *
* @param vmdMotion VMDモーションデータ
* @throws IOException 出力エラー
* @throws IllegalVmdDataException 不正なモーションデータを検出
/**
* ルート要素がオープンするまでの各種宣言を出力する。
+ *
* @throws IOException 出力エラー
*/
private void putVmdRootOpen() throws IOException{
ind().putOpenSTag(VmdTag.VMD_MOTION.tag()).ln();
pushNest();
ind().putAttr("xmlns", namespace).ln();
- ind().putAttr("xmlns:" + XSINS, XmlResourceResolver.NS_XSD).ln();
+ ind().putAttr("xmlns:" + XSINS, SchemaUtil.NS_XSD).ln();
ind().putRawText(XSINS).putRawText(":schemaLocation=")
.putRawCh('"');
/**
* ジェネレータ名を出力する。
+ *
* @throws IOException 出力エラー
*/
private void putGenerator() throws IOException{
/**
* モデル名を出力する。
+ *
* @param vmdMotion モーションデータ
* @throws IOException 出力エラー
*/
/**
* ボーンモーションデータを出力する。
+ *
* @param vmdMotion モーションデータ
* @throws IOException 出力エラー
*/
/**
* ボーン別モーションデータを出力する。
+ *
* @param boneName ボーン名
* @param list ボーンモーションのリスト
* @throws IOException 出力エラー
/**
* ボーンモーションを出力する。
+ *
* @param boneMotion ボーンモーション
* @throws IOException 出力エラー
*/
/**
* ボーン位置を出力する。
+ *
* @param boneMotion ボーンモーション
* @throws IOException 出力エラー
*/
/**
* ボーン回転を出力する。
+ *
* @param boneMotion ボーンモーション
* @throws IOException 出力エラー
*/
/**
* ボーン回転を出力する。
+ *
* @param boneMotion ボーンモーション
* @throws IOException 出力エラー
*/
/**
* モーフデータを出力する。
+ *
* @param vmdMotion モーションデータ
* @throws IOException 出力エラー
*/
/**
* 箇所別モーフデータを出力する。
+ *
* @param listMap モーフデータの名前付きリストマップ
* @throws IOException 出力エラー
*/
/**
* 個別のモーフモーションを出力する。
+ *
* @param morphMotion モーフモーション
* @throws IOException 出力エラー
*/
/**
* XMLモーションファイルパース用SAXハンドラ。
+ *
* <p>下位リスナに各種通知が振り分けられる。
*/
class XmlHandler implements ContentHandler{
/**
* ビルド対象のモーションを返す。
+ *
* @return ビルド対象のモーション
*/
VmdMotion getVmdMotion(){
/**
* {@inheritDoc}
+ *
* @throws SAXException {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @throws SAXException {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param prefix {@inheritDoc}
* @param uri {@inheritDoc}
* @throws SAXException {@inheritDoc}
@Override
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
- if( Schema110820.NS_VMDXML.equals(uri)
- || Schema130609.NS_VMDXML.equals(uri) ){
+ if( Schema110820.NS_VMDXML.equals(uri)
+ || Schema130609.NS_VMDXML.equals(uri) ){
this.nspfx = prefix;
this.nsuri = uri;
}
/**
* {@inheritDoc}
+ *
* @param prefix {@inheritDoc}
* @throws SAXException {@inheritDoc}
*/
/**
* {@inheritDoc}
+ *
* @param uri {@inheritDoc}
* @param localName {@inheritDoc}
* @param qName {@inheritDoc}
/**
* タグ出現に従い通知リスナを切り替える。
+ *
* @param tag タグ種別
*/
private void switchListener(VmdTag tag){
/**
* {@inheritDoc}
+ *
* @param uri {@inheritDoc}
* @param localName {@inheritDoc}
* @param qName {@inheritDoc}
/**
* {@inheritDoc}
+ *
* @param locator {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param target {@inheritDoc}
* @param data {@inheritDoc}
* @throws SAXException {@inheritDoc}
/**
* {@inheritDoc}
+ *
* @param ch {@inheritDoc}
* @param start {@inheritDoc}
* @param length {@inheritDoc}
/**
* {@inheritDoc}
+ *
* @param ch {@inheritDoc}
* @param start {@inheritDoc}
* @param length {@inheritDoc}
/**
* {@inheritDoc}
+ *
* @param name {@inheritDoc}
* @throws SAXException {@inheritDoc}
*/
/**
* XMLファイル(自動判別)。
+ *
* <p>読み込み時のスキーマ判別は自動。
+ *
* <p>書き込み時のスキーマは最新。
*/
XML_AUTO,
*/
XML_130609,
- ;
-
}
/**
* コンストラクタ。
+ *
* <p>XMLリーダは名前空間をサポートしていなければならない。
+ *
* @param reader XMLリーダ
* @throws NullPointerException 引数がnull
*/
/**
* XMLのパースを開始する。
+ *
* @param source XML入力
* @return モーションデータ
* @throws SAXException 構文エラー
/**
* コマンドライン解析を行う。
+ *
* @param args コマンドライン
* @return 解析されたコマンドライン並び
*/
/**
* コマンドライン解析を行う。
+ *
* @param argList コマンドライン
* @return 解析されたコマンドライン並び
*/
static List<CmdLine> parse(List<String> argList){
- List<CmdLine> result = new LinkedList<CmdLine>();
+ List<CmdLine> result = new LinkedList<>();
Iterator<String> it = argList.iterator();
while (it.hasNext()) {
if (info.opt != null) {
exArgNum = info.opt.getExArgNum();
}
- info.optArgs = new ArrayList<String>(exArgNum + 1);
+ info.optArgs = new ArrayList<>(exArgNum + 1);
info.optArgs.add(arg);
/**
* オプション識別子を返す。
+ *
* @return オプション識別子。
- * オプションを伴わない単純なコマンドライン引数の場合はnullを返す。
+ * オプションを伴わない単純なコマンドライン引数の場合はnullを返す。
*/
OptSwitch getOptSwitch() {
return this.opt;
/**
* オプションに付随する引数群を返す。
+ *
* @return オプションに付随する引数群。
- * 先頭要素はオプション識別子。
- * 単純なコマンドライン引数の場合は自身が1要素のみを占める。
+ * 先頭要素はオプション識別子。
+ * 単純なコマンドライン引数の場合は自身が1要素のみを占める。
*/
List<String> getOptArgs() {
return this.optArgs;
/**
* XMLファイル(自動判別)。
+ *
* <p>読み込み時のスキーマ判別は自動。
+ *
* <p>書き込み時のスキーマは最新。
*/
XML_AUTO,
/**
* コンストラクタ。
*/
- private MotionFileType(){
+ MotionFileType(){
return;
}
/**
* ファイル種別をXMLファイル種別に変換する。
+ *
* <p>未定義の場合はXML_AUTOを返す。
+ *
* @return XMLファイル種別
*/
public XmlMotionFileType toXmlType(){
/**
* ファイル種別がXMLか判定する。
+ *
* @return XMLならtrue
*/
public boolean isXml(){
/**
* ファイル種別がVMDか判定する。
+ *
* @return VMDならtrue
*/
public boolean isVmd(){
/**
* フォーマット種別指定子をデコードする。
+ *
* @param arg 文字列
* @return デコード結果。
* @throws CmdLineException 不正なフォーマット種別
/**
* 改行文字指定子をデコードする。
+ *
* @param arg 文字列
* @return デコード結果。
* @throws CmdLineException 不正なフォーマット種別
/**
* ブール指定子をデコードする。
+ *
* @param arg 文字列
* @return デコード結果。
* @throws CmdLineException 不正なフォーマット種別
throws CmdLineException{
boolean result;
- if( "on" .equals(arg)
- || "true".equals(arg)
- || "yes" .equals(arg) ){
+ if( "on" .equals(arg)
+ || "true".equals(arg)
+ || "yes" .equals(arg) ){
result = true;
- }else if( "off" .equals(arg)
- || "false".equals(arg)
- || "no" .equals(arg) ){
+ }else if( "off" .equals(arg)
+ || "false".equals(arg)
+ || "no" .equals(arg) ){
result = false;
}else{
String errMsg = MessageFormat.format(ERRMSG_INVBOOL, arg);
/**
* ファイル名からファイル種別を類推する。
+ *
* <p>拡張子が「.vmd」ならVMDファイル、「.xml」ならXMLファイル。
+ *
* @param fileName ファイル名
* @return ファイル種別。識別不可ならNONE。
*/
/**
* ヘルプ要求があるかコマンドライン列を調べる。
+ *
* @param cmds コマンドライン列
* @return ヘルプ要求があればtrue
*/
/**
* 個別のオプション情報を格納する。
+ *
* @param opt オプション識別子
* @param exArg 引数。なければnull
* @param result オプション情報格納先
/**
* コマンドラインを解析する。
+ *
* @param args コマンドライン
* @return オプション情報
* @throws CmdLineException 不正なコマンドライン
/**
* 単純なコマンドラインエラーを検出する。
+ *
* <p>検出項目は未知のオプションおよび不正な引数の個数
+ *
* @param cmdLines コマンドライン
* @throws CmdLineException 異常系
*/
/**
* ファイルフォーマット情報の推測を行う。
+ *
* @param result オプション情報
*/
private static void fixFormat(OptInfo result){
/**
* オプション整合性の事後検査。
+ *
* @param result オプション情報
* @throws CmdLineException 不正なオプション設定
*/
/**
* ヘルプ表示が必要か否か判定する。
+ *
* @return 必要ならtrue
*/
boolean needHelp(){
/**
* 入力ファイル種別を返す。
+ *
* @return 入力ファイル種別
*/
MotionFileType getInFileType(){
/**
* 出力ファイル種別を返す。
+ *
* @return 出力ファイル種別
*/
MotionFileType getOutFileType(){
/**
* 入力ファイル名を返す。
+ *
* @return 入力ファイル名
*/
String getInFilename(){
/**
* 出力ファイル名を返す。
+ *
* @return 出力ファイル名
*/
String getOutFilename(){
/**
* 上書きモードか否か返す。
+ *
* @return 上書きモードならtrue
*/
boolean overwriteMode(){
/**
* XML改行文字を返す。
+ *
* @return 改行文字
*/
String getNewline(){
/**
* ジェネレータ名を返す。
+ *
* @return ジェネレータ名。表示したくない時はnull
*/
String getGenerator(){
/**
* 回転情報のXML出力形式を得る。
+ *
* @return クォータニオン形式ならtrue、YXZオイラー角形式ならfalse。
*/
boolean isQuaterniomMode(){
private static final Map<String, OptSwitch> MAP_OPT;
static{
- Map<String, OptSwitch> map = new HashMap<String, OptSwitch>();
+ Map<String, OptSwitch> map = new HashMap<>();
for(OptSwitch opt : values()){
for(String cmdarg : opt.cmdopts){
/**
* コンストラクタ。
+ *
* @param argnum 必要な引数の数
* @param cmdopts オプションスイッチパターン群
*/
- private OptSwitch(int argnum, String... cmdopts) {
+ OptSwitch(int argnum, String... cmdopts) {
this.exArgNum = argnum;
List<String> optlist;
/**
* コンソール提示用ヘルプ出力文字列を返す。
+ *
* @return オプションヘルプ文字列
*/
static String getConsoleHelp(){
/**
* 文字列に合致するオプションを返す。
+ *
* <p>一つのオプションが複数の表記に合致する場合がある。
+ *
* @param cmd 文字列
* @return オプション種別。合致する物が見つからなければnull
*/
/**
* 各オプションに後続する引数の数を返す。
+ *
* <p>引数をとらないオプションは0を返す。
+ *
* @return 引数の数
*/
int getExArgNum(){
+ "If you want to overwrite, use -f.";
private static final String MSG_OLDJRE = "You need JRE {0} or later.";
- private static final String REQUIRED_JRE = "1.6";
+ private static final String REQUIRED_JRE = "1.8";
static{
THISCLASS = Vmd2Xml.class;
/**
* VMを終了させる。
+ *
* @param code 終了コード
* @see java.lang.System#exit(int)
*/
/**
* 共通エラーメッセージを出力する。
+ *
* @param text 個別メッセージ
*/
private static void errMsg(String text){
/**
* 標準エラー出力へ例外情報出力。
+ *
* @param ex 例外
* @param dumpStack スタックトレースを出力するならtrue
*/
/**
* 標準エラー出力へ例外情報出力。
+ *
* @param ex 例外
*/
private static void thPrintln(Throwable ex){
/**
* 入出力エラー処理。
* 例外を出力してVM終了する。
+ *
* @param ex 例外
*/
private static void ioError(IOException ex){
/**
* XML構文エラー処理。
* 例外を出力してVM終了する。
+ *
* @param ex 例外
*/
private static void xmlError(Throwable ex){
/**
* VMDファイルフォーマットエラー処理。
* 例外を出力してVM終了する。
+ *
* @param ex 例外
*/
private static void vmdError(MmdFormatException ex){
/**
* 内部エラー処理。
* 例外を出力してVM終了する。
+ *
* @param ex 例外
*/
private static void internalError(Throwable ex){
/**
* ファイルサイズを0に切り詰める。
+ *
* <p>ファイルが存在しなければなにもしない。
+ *
* <p>通常ファイルでなければなにもしない。
+ *
* @param file ファイル
* @throws IOException 入出力エラー
*/
/**
* 入力ソースを準備する。
+ *
* <p>入力ファイルが通常ファイルとして存在しなければエラー終了。
+ *
* @param optInfo オプション情報
* @return 入力ソース
*/
/**
* 出力ストリームを準備する。
+ *
* <p>出力ファイルが通常ファイルでない場合はエラー終了。
+ *
* <p>既存の出力ファイルに上書き指示が伴っていなければエラー終了。
+ *
* @param optInfo オプション情報
* @return 出力ストリーム
*/
/**
* オプション情報に従いコンバータを生成する。
+ *
* @param optInfo オプション情報
* @return コンバータ
*/
/**
* 実際のコンバート作業と異常系処理を行う。
+ *
* <p>異常系が起きた場合、このメソッドは制御を戻さない。
+ *
* @param converter コンバータ
* @param source 入力ソース
* @param ostream 出力ストリーム
internalError(e);
}catch(MmdFormatException e){
vmdError(e);
- }catch(TogaXmlException e){
- xmlError(e);
- }catch(SAXException e){
+ }catch(TogaXmlException | SAXException e){
xmlError(e);
}
/**
* コマンドライン文字列をオプション情報としてパースする。
+ *
* <p>異常系が起きた場合、このメソッドは制御を戻さない。
+ *
* @param args コマンドライン文字列群
* @return オプション情報
*/
- private static OptInfo parseOption(String[] args){
+ private static OptInfo parseOption(String... args){
OptInfo optInfo;
try{
/**
* Mainエントリ。
+ *
* @param args コマンドパラメータ
*/
public static void main(String[] args){
/**
* 入力ファイル種別を設定する。
+ *
* @param type ファイル種別
* @throws IllegalArgumentException 具体的な種別を渡さなかった
*/
/**
* 入力ファイル種別を返す。
+ *
* @return ファイル種別
*/
public MotionFileType getInTypes(){
/**
* 出力ファイル種別を設定する。
+ *
* @param type ファイル種別
* @throws IllegalArgumentException 具体的な種別を渡さなかった
*/
/**
* 出力ファイル種別を返す。
+ *
* @return ファイル種別
*/
public MotionFileType getOutTypes(){
/**
* XML出力用改行文字列を設定する。
+ *
* @param newline 改行文字
*/
public void setNewline(String newline){
/**
* XML出力用改行文字列を返す。
+ *
* @return 改行文字
*/
public String getNewline(){
/**
* ジェネレータ名を設定する。
+ *
* @param generator ジェネレータ名。表示したくない場合はnull
*/
public void setGenerator(String generator){
/**
* ジェネレータ名を返す。
+ *
* @return ジェネレータ名。非表示の場合はnullを返す。
*/
public String getGenerator(){
/**
* 回転情報をクォータニオン形式でXML出力するか設定する。
+ *
* @param sw クォータニオン形式ならtrue、
- * YXZオイラー角で出力したければfalse。
+ * YXZオイラー角で出力したければfalse。
*/
public void setQuaterniomMode(boolean sw){
this.isQuaternionMode = sw;
/**
* 回転情報のXML出力形式を得る。
+ *
* @return クォータニオン形式ならtrue、YXZオイラー角形式ならfalse。
*/
public boolean isQuaterniomMode(){
/**
* ファイル変換を行う。
+ *
* <p>XML入力の場合は{@link #convert(InputSource, OutputStream)}を
* 推奨する。
+ *
* @param is 入力ストリーム
* @param os 出力ストリーム
* @throws IOException 入力エラー
/**
* ファイル変換を行う。
+ *
* <p>VMD入力の場合は{@link InputStream}に
* バイトストリームが直接設定されていなければならない。
+ *
* <p>XML入力の場合は{@link InputStream}に
* URL(systemId)のみの設定を推奨する。
+ *
* @param source 入力ソース
* @param os 出力ストリーム
* @throws IOException 入力エラー
/**
* モーションファイルを読み込む。
+ *
* <p>XML読み込みの場合は、
* こちらより{@link #readMotion(InputSource)}版を推奨する。
+ *
* @param is 入力ストリーム
* @return モーションデータ
* @throws IOException 入力エラー
/**
* モーションファイルを読み込む。
+ *
* <p>VMD入力の場合は、{@link InputStream}に
* 納められたバイトストリームかSystemId-URLから読み込む。
+ *
* @param source 入力ソース
* @return モーションデータ
* @throws IOException 入力エラー
/**
* モーションファイルを出力する。
+ *
* @param motion モーションデータ
* @param os 出力ストリーム
* @throws IOException 出力エラー
/**
* VMDファイルからモーションデータを読み込む。
+ *
* <p>入力ストリームは最後に閉じられる。
+ *
* @param is 入力ストリーム
* @return モーションデータ
* @throws IOException 入力エラー
/**
* XMLファイルからモーションデータを読み込む。
+ *
* @param source 入力ソース
* @return モーションデータ
* @throws IOException 入力エラー
/**
* モーションデータをVMDファイルに出力する。
+ *
* @param motion モーションデータ
* @param ostream 出力ストリーム
* @throws IOException 出力エラー
/**
* モーションデータをXMLファイルに出力する。
+ *
* @param motion モーションデータ
* @param ostream 出力ストリーム
* @throws IOException 出力エラー
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
+import javax.xml.XMLConstants;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
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.NoopEntityResolver;
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.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.XMLReader;
/**
*/
final class XmlInputUtil {
+ private static final String F_DISALLOW_DOCTYPE_DECL =
+ "http://apache.org/xml/features/disallow-doctype-decl";
+ private static final String F_EXTERNAL_GENERAL_ENTITIES =
+ "http://xml.org/sax/features/external-general-entities";
+ private static final String F_EXTERNAL_PARAMETER_ENTITIES =
+ "http://xml.org/sax/features/external-parameter-entities";
+ private static final String F_LOAD_EXTERNAL_DTD =
+ "http://apache.org/xml/features/nonvalidating/load-external-dtd";
+
+
/**
* 隠しコンストラクタ。
*/
/**
* 実在ファイルからXML入力ソースを得る。
+ *
* @param file 実在ファイル
* @return XML入力ソース
*/
/**
* InputSourceからInputStreamを得る。
+ *
* <p>入力ソースには、少なくともバイトストリームか
* URL文字列(SystemId)のいずれかが設定されていなければならない。
+ *
* @param source 入力ソース
* @return 入力バイトストリーム
* @throws IllegalArgumentException 入力ソースの設定が足りない。
/**
* SAXパーサファクトリを生成する。
+ *
* <ul>
* <li>XML名前空間機能は有効になる。
* <li>DTDによる形式検証は無効となる。
* <li>XIncludeによる差し込み機能は無効となる。
* </ul>
+ *
* @param schema スキーマ
* @return ファクトリ
*/
factory.setNamespaceAware(true);
factory.setValidating(false);
factory.setXIncludeAware(false);
-// factory.setFeature(name, value);
+
+ try{
+ factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ factory.setFeature(F_DISALLOW_DOCTYPE_DECL, true);
+ factory.setFeature(F_EXTERNAL_GENERAL_ENTITIES, false);
+ factory.setFeature(F_EXTERNAL_PARAMETER_ENTITIES, false);
+ factory.setFeature(F_LOAD_EXTERNAL_DTD, false);
+ }catch( ParserConfigurationException
+ | SAXNotRecognizedException
+ | SAXNotSupportedException e ){
+ assert false;
+ throw new AssertionError(e);
+ }
factory.setSchema(schema);
/**
* SAXパーサを生成する。
+ *
* @param schema スキーマ
* @return SAXパーサ
*/
SAXParser parser;
try{
parser = factory.newSAXParser();
- }catch(ParserConfigurationException e){
+ }catch(ParserConfigurationException | SAXException e){
assert false;
throw new AssertionError(e);
- }catch(SAXException e){
+ }
+
+ try{
+ parser.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
+ parser.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
+ }catch(SAXNotRecognizedException | SAXNotSupportedException 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;
+ private static Schema buildSchema(MotionFileType xmlInType ){
+ URI[] schemaUris;
switch(xmlInType){
case XML_110820:
- schemaArray = new LocalXmlResource[]{
- Schema110820.SINGLETON,
+ schemaUris = new URI[]{
+ Schema110820.RES_SCHEMA_VMDXML,
};
break;
case XML_130609:
- schemaArray = new LocalXmlResource[]{
- Schema130609.SINGLETON,
+ schemaUris = new URI[]{
+ Schema130609.RES_SCHEMA_VMDXML,
};
break;
case XML_AUTO:
- schemaArray = new LocalXmlResource[]{
- Schema110820.SINGLETON,
- Schema130609.SINGLETON,
+ schemaUris = new URI[]{
+ Schema110820.RES_SCHEMA_VMDXML,
+ Schema130609.RES_SCHEMA_VMDXML,
};
break;
default:
throw new IllegalStateException();
}
- Schema schema = SchemaUtil.newSchema(resolver, schemaArray);
+ Schema schema;
+ try{
+ schema = SchemaUtil.newSchema(schemaUris);
+ }catch(IOException | SAXException e){
+ assert false;
+ throw new AssertionError(e);
+ }
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);
+ Schema schema = buildSchema(xmlInType);
SAXParser parser = buildParser(schema);
throw new AssertionError(e);
}
- reader.setEntityResolver(resolver);
+ reader.setEntityResolver(NoopEntityResolver.NOOP_RESOLVER);
reader.setErrorHandler(BotherHandler.HANDLER);
return reader;