From 5d935a092a06a102c7b445ef85a0045dd18907fc Mon Sep 17 00:00:00 2001 From: Olyutorskii Date: Sun, 19 May 2013 23:01:04 +0900 Subject: [PATCH] =?utf8?q?Vmd2XML=E3=81=A8=E5=85=B1=E9=80=9A=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- CHANGELOG.txt | 1 + pom.xml | 4 +- .../jp/sfjp/mikutoga/pmd/binio/BoneBuilder.java | 6 +- .../sfjp/mikutoga/pmd/binio/PmdExporterBase.java | 18 +-- .../sfjp/mikutoga/pmd/binio/PmdExporterExt1.java | 12 +- .../sfjp/mikutoga/pmd/binio/PmdExporterExt2.java | 6 +- .../sfjp/mikutoga/pmd/binio/PmdExporterExt3.java | 6 +- .../java/jp/sfjp/mikutoga/pmd/binio/PmdLoader.java | 108 +++++++------- .../jp/sfjp/mikutoga/pmd/binio/RigidBuilder.java | 6 +- .../jp/sfjp/mikutoga/pmd/binio/ToonBuilder.java | 4 +- .../jp/sfjp/mikutoga/pmd/xml/Schema101009.java | 17 ++- .../jp/sfjp/mikutoga/pmd/xml/Schema130128.java | 17 ++- .../java/jp/sfjp/mikutoga/pmd2xml/CmdLine.java | 2 +- .../java/jp/sfjp/mikutoga/pmd2xml/OptInfo.java | 5 +- .../java/jp/sfjp/mikutoga/pmd2xml/OptSwitch.java | 2 +- .../java/jp/sfjp/mikutoga/pmd2xml/Pmd2Xml.java | 157 +++++++++++---------- .../java/jp/sfjp/mikutoga/pmd2xml/Pmd2XmlConv.java | 38 +++-- .../mikutoga/pmd2xml/resources/version.properties | 1 + 18 files changed, 218 insertions(+), 192 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index f2099e4..79a8ffd 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -6,6 +6,7 @@ Pmd2XML 変更履歴 X.XXX.X (20XX-XX-XX) ・デフォルトロケールによる出力揺らぎを解消。 + ・プロセス終了コードの変更。 1.201.2 (2013-03-17) ・Maven3対応。 diff --git a/pom.xml b/pom.xml index d78ba07..afa2a37 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ jp.sourceforge.mikutoga pmd2xml - 1.201.3-SNAPSHOT + 1.201.5-SNAPSHOT jar Pmd2XML @@ -112,7 +112,7 @@ jp.sourceforge.mikutoga togagem - 2.102.3-SNAPSHOT + 2.102.5-SNAPSHOT compile diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/binio/BoneBuilder.java b/src/main/java/jp/sfjp/mikutoga/pmd/binio/BoneBuilder.java index 343d4c3..c3b1b65 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/binio/BoneBuilder.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/binio/BoneBuilder.java @@ -13,7 +13,7 @@ import java.util.List; import jp.sfjp.mikutoga.bin.parser.ParseStage; import jp.sfjp.mikutoga.math.MkPos3D; import jp.sfjp.mikutoga.pmd.BoneType; -import jp.sfjp.mikutoga.pmd.PmdLimits; +import jp.sfjp.mikutoga.pmd.PmdConst; import jp.sfjp.mikutoga.pmd.model.BoneGroup; import jp.sfjp.mikutoga.pmd.model.BoneInfo; import jp.sfjp.mikutoga.pmd.model.IKChain; @@ -192,7 +192,7 @@ class BoneBuilder implements PmdBoneHandler { @Override public void pmdBoneLink(int parentId, int tailId, int srcId){ BoneInfo prevBone = null; - if(0 <= parentId && parentId < PmdLimits.MAX_BONE){ + if(0 <= parentId && parentId < PmdConst.MAX_BONE){ prevBone = this.boneList.get(parentId); } @@ -206,7 +206,7 @@ class BoneBuilder implements PmdBoneHandler { srcBone = null; int ratio = srcId; this.currentBone.setRotationRatio(ratio); - }else if(0 < srcId && srcId < PmdLimits.MAX_BONE){ + }else if(0 < srcId && srcId < PmdConst.MAX_BONE){ srcBone = this.boneList.get(srcId); } diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterBase.java b/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterBase.java index 8b8f8ff..f8ae602 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterBase.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterBase.java @@ -23,7 +23,7 @@ import jp.sfjp.mikutoga.math.MkVec3D; import jp.sfjp.mikutoga.pmd.BoneType; import jp.sfjp.mikutoga.pmd.IllegalPmdDataException; import jp.sfjp.mikutoga.pmd.MorphType; -import jp.sfjp.mikutoga.pmd.PmdLimits; +import jp.sfjp.mikutoga.pmd.PmdConst; import jp.sfjp.mikutoga.pmd.model.BoneGroup; import jp.sfjp.mikutoga.pmd.model.BoneInfo; import jp.sfjp.mikutoga.pmd.model.IKChain; @@ -71,7 +71,7 @@ public class PmdExporterBase extends BinaryExporter{ private static final String CRLF = CR + LF; // 0x0d, 0x0a static{ - assert NOPREVBONE_ID > PmdLimits.MAX_BONE - 1; + assert NOPREVBONE_ID > PmdConst.MAX_BONE - 1; } /** @@ -157,8 +157,8 @@ public class PmdExporterBase extends BinaryExporter{ String modelName = model.getModelName() .getPrimaryText(); String description = model.getDescription().getPrimaryText(); - dumpText(modelName, PmdLimits.MAXBYTES_MODELNAME); - dumpText(description, PmdLimits.MAXBYTES_MODELDESC); + dumpText(modelName, PmdConst.MAXBYTES_MODELNAME); + dumpText(description, PmdConst.MAXBYTES_MODELDESC); flush(); @@ -330,7 +330,7 @@ public class PmdExporterBase extends BinaryExporter{ else filler = FDFILLER; dumpFixedW31j(text.toString(), - PmdLimits.MAXBYTES_TEXTUREFILENAME, + PmdConst.MAXBYTES_TEXTUREFILENAME, filler ); return; @@ -367,7 +367,7 @@ public class PmdExporterBase extends BinaryExporter{ private void dumpBone(BoneInfo bone) throws IOException, IllegalTextExportException{ String boneName = bone.getBoneName().getPrimaryText(); - dumpText(boneName, PmdLimits.MAXBYTES_BONENAME); + dumpText(boneName, PmdConst.MAXBYTES_BONENAME); BoneInfo prev = bone.getPrevBone(); if(prev != null) dumpSerialIdAsShort(prev); @@ -476,7 +476,7 @@ public class PmdExporterBase extends BinaryExporter{ dumpLeShort(totalMorphPart); } - dumpText("base", PmdLimits.MAXBYTES_MORPHNAME); + dumpText("base", PmdConst.MAXBYTES_MORPHNAME); int totalVertex = mergedMorphVertexList.size(); dumpLeInt(totalVertex); dumpByte(MorphType.BASE.encode()); @@ -491,7 +491,7 @@ public class PmdExporterBase extends BinaryExporter{ if(partList == null) continue; for(MorphPart part : partList){ dumpText(part.getMorphName().getPrimaryText(), - PmdLimits.MAXBYTES_MORPHNAME ); + PmdConst.MAXBYTES_MORPHNAME ); List morphVertexList = part.getMorphVertexList(); dumpLeInt(morphVertexList.size()); dumpByte(part.getMorphType().encode()); @@ -563,7 +563,7 @@ public class PmdExporterBase extends BinaryExporter{ for(BoneGroup group : groupList){ if(group.isDefaultBoneGroup()) continue; dumpFixedW31j(group.getGroupName().getPrimaryText(), - PmdLimits.MAXBYTES_BONEGROUPNAME, LFFILLER ); + PmdConst.MAXBYTES_BONEGROUPNAME, LFFILLER ); dispBoneNum += group.getBoneList().size(); } dumpLeInt(dispBoneNum); diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt1.java b/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt1.java index 41ea9a0..5de6fb6 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt1.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt1.java @@ -14,7 +14,7 @@ import java.util.Map; import jp.sfjp.mikutoga.bin.export.IllegalTextExportException; import jp.sfjp.mikutoga.pmd.IllegalPmdDataException; import jp.sfjp.mikutoga.pmd.MorphType; -import jp.sfjp.mikutoga.pmd.PmdLimits; +import jp.sfjp.mikutoga.pmd.PmdConst; import jp.sfjp.mikutoga.pmd.model.BoneGroup; import jp.sfjp.mikutoga.pmd.model.BoneInfo; import jp.sfjp.mikutoga.pmd.model.MorphPart; @@ -95,11 +95,11 @@ public class PmdExporterExt1 extends PmdExporterBase{ throws IOException, IllegalTextExportException{ String modelName = model.getModelName().getGlobalText(); if(modelName == null) modelName = ""; - dumpText(modelName, PmdLimits.MAXBYTES_MODELNAME); + dumpText(modelName, PmdConst.MAXBYTES_MODELNAME); String description = model.getDescription().getGlobalText(); if(description == null) description = ""; - dumpText(description, PmdLimits.MAXBYTES_MODELDESC); + dumpText(description, PmdConst.MAXBYTES_MODELDESC); flush(); } @@ -115,7 +115,7 @@ public class PmdExporterExt1 extends PmdExporterBase{ for(BoneInfo bone : model.getBoneList()){ String boneName = bone.getBoneName().getGlobalText(); if(boneName == null) boneName = ""; - dumpText(boneName, PmdLimits.MAXBYTES_BONENAME); + dumpText(boneName, PmdConst.MAXBYTES_BONENAME); } flush(); @@ -138,7 +138,7 @@ public class PmdExporterExt1 extends PmdExporterBase{ for(MorphPart part : partList){ String morphName = part.getMorphName().getGlobalText(); if(morphName == null) morphName = ""; - dumpText(morphName, PmdLimits.MAXBYTES_MORPHNAME); + dumpText(morphName, PmdConst.MAXBYTES_MORPHNAME); } } @@ -157,7 +157,7 @@ public class PmdExporterExt1 extends PmdExporterBase{ if(group.isDefaultBoneGroup()) continue; String groupName = group.getGroupName().getGlobalText(); if(groupName == null) groupName = ""; - dumpText(groupName, PmdLimits.MAXBYTES_BONEGROUPNAME); + dumpText(groupName, PmdConst.MAXBYTES_BONEGROUPNAME); } flush(); diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt2.java b/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt2.java index 0664522..e40fd4a 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt2.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt2.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.io.OutputStream; import jp.sfjp.mikutoga.bin.export.IllegalTextExportException; import jp.sfjp.mikutoga.pmd.IllegalPmdDataException; -import jp.sfjp.mikutoga.pmd.PmdLimits; +import jp.sfjp.mikutoga.pmd.PmdConst; import jp.sfjp.mikutoga.pmd.model.PmdModel; import jp.sfjp.mikutoga.pmd.model.ToonMap; @@ -64,10 +64,10 @@ public class PmdExporterExt2 extends PmdExporterExt1{ throws IOException, IllegalTextExportException{ ToonMap map = model.getToonMap(); - for(int idx = 0; idx < PmdLimits.TOON_FIXEDNUM; idx++){ + for(int idx = 0; idx < PmdConst.TOON_FIXEDNUM; idx++){ String toonName = map.getIndexedToon(idx); if(toonName == null) toonName = ""; - dumpText(toonName, PmdLimits.MAXBYTES_TOONFILENAME); + dumpText(toonName, PmdConst.MAXBYTES_TOONFILENAME); } flush(); diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt3.java b/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt3.java index e4740a2..20ae6fb 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt3.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdExporterExt3.java @@ -13,7 +13,7 @@ import java.util.List; import jp.sfjp.mikutoga.bin.export.IllegalTextExportException; import jp.sfjp.mikutoga.pmd.Deg3d; import jp.sfjp.mikutoga.pmd.IllegalPmdDataException; -import jp.sfjp.mikutoga.pmd.PmdLimits; +import jp.sfjp.mikutoga.pmd.PmdConst; import jp.sfjp.mikutoga.pmd.Rad3d; import jp.sfjp.mikutoga.pmd.RigidShapeType; import jp.sfjp.mikutoga.pmd.TripletRange; @@ -97,7 +97,7 @@ public class PmdExporterExt3 extends PmdExporterExt2{ private void dumpRigid(RigidInfo rigid) throws IOException, IllegalTextExportException{ String rigidName = rigid.getRigidName().getPrimaryText(); - dumpText(rigidName, PmdLimits.MAXBYTES_RIGIDNAME); + dumpText(rigidName, PmdConst.MAXBYTES_RIGIDNAME); BoneInfo linkedBone = rigid.getLinkedBone(); if(linkedBone == null){ @@ -201,7 +201,7 @@ public class PmdExporterExt3 extends PmdExporterExt2{ private void dumpJoint(JointInfo joint) throws IOException, IllegalTextExportException{ String jointName = joint.getJointName().getPrimaryText(); - dumpText(jointName, PmdLimits.MAXBYTES_JOINTNAME); + dumpText(jointName, PmdConst.MAXBYTES_JOINTNAME); RigidInfo rigidA = joint.getRigidA(); RigidInfo rigidB = joint.getRigidB(); diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdLoader.java b/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdLoader.java index 63cd1f3..9b25ff4 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdLoader.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/binio/PmdLoader.java @@ -21,97 +21,85 @@ import jp.sfjp.mikutoga.pmd.parser.PmdParser; */ public class PmdLoader { - private PmdModel model; - private PmdParser parser; - private TextBuilder textBuilder; + private static final String ERR_TRYLOAD = "try loading first."; + private static final String ERR_LOADED = "has been loaded."; + private boolean loaded = false; - private boolean hasMoreData = false; + private boolean hasMoreData = true; + /** * コンストラクタ。 - * @param source PMDファイル入力ソース */ - public PmdLoader(InputStream source){ + public PmdLoader(){ super(); - - this.model = new PmdModel(); - this.parser = new PmdParser(source); - this.textBuilder = new TextBuilder(this.model); - - setHandler(); - return; } + /** - * パーサに各種ハンドラの設定を行う。 + * 正常パース時に読み残したデータがあったか判定する。 + *

MMDでの仕様拡張による + * PMDファイルフォーマットの拡張が行われた場合を想定。 + * @return 読み残したデータがあればtrue + * @throws IllegalStateException まだパースを試みていない。 */ - private void setHandler(){ - ShapeBuilder shapeBuilder = new ShapeBuilder(this.model); - MaterialBuilder materialBuilder = new MaterialBuilder(this.model); - BoneBuilder boneBuilder = new BoneBuilder(this.model); - MorphBuilder morphBuilder = new MorphBuilder(this.model); - ToonBuilder toonBuilder = new ToonBuilder(this.model); - RigidBuilder rigidBuilder = new RigidBuilder(this.model); - JointBuilder jointBuilder = new JointBuilder(this.model); - - this.parser.setBasicHandler(this.textBuilder); - this.parser.setShapeHandler(shapeBuilder); - this.parser.setMaterialHandler(materialBuilder); - this.parser.setBoneHandler(boneBuilder); - this.parser.setMorphHandler(morphBuilder); - this.parser.setEngHandler(this.textBuilder); - this.parser.setToonHandler(toonBuilder); - this.parser.setRigidHandler(rigidBuilder); - this.parser.setJointHandler(jointBuilder); - - List morphPartList = new ArrayList(); - morphBuilder.setMorphPartList(morphPartList); - this.textBuilder.setMorphPartList(morphPartList); - morphPartList.clear(); - - return; + public boolean hasMoreData() throws IllegalStateException{ + if( ! this.loaded ) throw new IllegalStateException(ERR_TRYLOAD); + return this.hasMoreData; } /** * PMDファイルの読み込みを行いモデル情報を返す。 * 1インスタンスにつき一度しかロードできない。 + * @param source PMDファイル入力ソース * @return モデル情報 * @throws IOException 入力エラー * @throws MmdFormatException PMDファイルフォーマットの異常を検出 * @throws IllegalStateException このインスタンスで再度のロードを試みた。 */ - public PmdModel load() + public PmdModel load(InputStream source) throws IOException, MmdFormatException, IllegalStateException { - if(this.loaded) throw new IllegalStateException(); + if(this.loaded) throw new IllegalStateException(ERR_LOADED); + + PmdModel model = new PmdModel(); + + PmdParser parser = new PmdParser(source); + + TextBuilder textBuilder = new TextBuilder(model); + ShapeBuilder shapeBuilder = new ShapeBuilder(model); + MaterialBuilder materialBuilder = new MaterialBuilder(model); + BoneBuilder boneBuilder = new BoneBuilder(model); + MorphBuilder morphBuilder = new MorphBuilder(model); + ToonBuilder toonBuilder = new ToonBuilder(model); + RigidBuilder rigidBuilder = new RigidBuilder(model); + JointBuilder jointBuilder = new JointBuilder(model); + + List morphPartList = new ArrayList(); + morphBuilder.setMorphPartList(morphPartList); + textBuilder.setMorphPartList(morphPartList); + + parser.setBasicHandler(textBuilder); + parser.setShapeHandler(shapeBuilder); + parser.setMaterialHandler(materialBuilder); + parser.setBoneHandler(boneBuilder); + parser.setMorphHandler(morphBuilder); + parser.setEngHandler(textBuilder); + parser.setToonHandler(toonBuilder); + parser.setRigidHandler(rigidBuilder); + parser.setJointHandler(jointBuilder); - PmdModel result; try{ - this.parser.parsePmd(); + parser.parsePmd(); + this.hasMoreData = textBuilder.hasMoreData(); }finally{ this.loaded = true; - - result = this.model; - this.hasMoreData = this.textBuilder.hasMoreData(); - - this.model = null; - this.parser = null; - this.textBuilder = null; } - return result; - } - - /** - * ロード処理が正常終了したのにまだ読み込んでいない部分が放置されているか判定する。 - * MMDでの仕様拡張によるPMDファイルフォーマットの拡張が行われた場合を想定。 - * @return 読み込んでいない部分があればtrue - */ - public boolean hasMoreData(){ - return this.hasMoreData; + return model; } } diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/binio/RigidBuilder.java b/src/main/java/jp/sfjp/mikutoga/pmd/binio/RigidBuilder.java index f75866a..7f1e9da 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/binio/RigidBuilder.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/binio/RigidBuilder.java @@ -11,7 +11,7 @@ import java.util.Iterator; import java.util.List; import jp.sfjp.mikutoga.bin.parser.ParseStage; import jp.sfjp.mikutoga.math.MkPos3D; -import jp.sfjp.mikutoga.pmd.PmdLimits; +import jp.sfjp.mikutoga.pmd.PmdConst; import jp.sfjp.mikutoga.pmd.Rad3d; import jp.sfjp.mikutoga.pmd.RigidBehaviorType; import jp.sfjp.mikutoga.pmd.RigidShapeType; @@ -66,7 +66,7 @@ class RigidBuilder implements PmdRigidHandler { ListUtil.prepareDefConsList(this.rigidGroupList, RigidGroup.class, - PmdLimits.RIGIDGROUP_FIXEDNUM ); + PmdConst.RIGIDGROUP_FIXEDNUM ); ListUtil.assignIndexedSerial(this.rigidGroupList); return; @@ -212,7 +212,7 @@ class RigidBuilder implements PmdRigidHandler { RigidBehaviorType type = RigidBehaviorType.decode(behaveType); this.currentRigid.setBehaviorType(type); - for(int bitPos = 0; bitPos < PmdLimits.RIGIDGROUP_FIXEDNUM; bitPos++){ + for(int bitPos = 0; bitPos < PmdConst.RIGIDGROUP_FIXEDNUM; bitPos++){ short mask = 0x0001; mask <<= bitPos; if((collisionMap & mask) == 0){ diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/binio/ToonBuilder.java b/src/main/java/jp/sfjp/mikutoga/pmd/binio/ToonBuilder.java index 30dc3e2..51d4b65 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/binio/ToonBuilder.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/binio/ToonBuilder.java @@ -8,7 +8,7 @@ package jp.sfjp.mikutoga.pmd.binio; import jp.sfjp.mikutoga.bin.parser.ParseStage; -import jp.sfjp.mikutoga.pmd.PmdLimits; +import jp.sfjp.mikutoga.pmd.PmdConst; import jp.sfjp.mikutoga.pmd.model.PmdModel; import jp.sfjp.mikutoga.pmd.model.ToonMap; import jp.sfjp.mikutoga.pmd.parser.PmdToonHandler; @@ -40,7 +40,7 @@ class ToonBuilder implements PmdToonHandler { @Override public void loopStart(ParseStage stage, int loops){ assert stage == PmdToonHandler.TOON_LIST; - assert loops == PmdLimits.TOON_FIXEDNUM; + assert loops == PmdConst.TOON_FIXEDNUM; this.toonMap = new ToonMap(); this.index = 0; diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/xml/Schema101009.java b/src/main/java/jp/sfjp/mikutoga/pmd/xml/Schema101009.java index 502cd96..137ba02 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/xml/Schema101009.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/xml/Schema101009.java @@ -9,12 +9,15 @@ package jp.sfjp.mikutoga.pmd.xml; import java.net.URI; import java.net.URISyntaxException; -import jp.sourceforge.mikutoga.xml.LocalSchema; +import jp.sourceforge.mikutoga.xml.LocalXmlResource; /** * 101009形式XML各種リソースの定義。 */ -public class Schema101009 extends LocalSchema{ +public final class Schema101009 implements LocalXmlResource{ + + /** 唯一のシングルトン。 */ + public static final Schema101009 SINGLETON; /** 名前空間。 */ public static final String NS_PMDXML = @@ -41,13 +44,15 @@ public class Schema101009 extends LocalSchema{ }catch(URISyntaxException e){ throw new ExceptionInInitializerError(e); } + + SINGLETON = new Schema101009(); } /** - * 隠しコンストラクタ。 + * コンストラクタ。 */ - public Schema101009(){ + private Schema101009(){ super(); assert this.getClass() == THISCLASS; return; @@ -59,7 +64,7 @@ public class Schema101009 extends LocalSchema{ * @return {@inheritDoc} */ @Override - public URI getOriginalSchema(){ + public URI getOriginalResource(){ return URI_SCHEMA_PMDXML; } @@ -68,7 +73,7 @@ public class Schema101009 extends LocalSchema{ * @return {@inheritDoc} */ @Override - public URI getLocalSchema(){ + public URI getLocalResource(){ return RES_SCHEMA_PMDXML; } diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/xml/Schema130128.java b/src/main/java/jp/sfjp/mikutoga/pmd/xml/Schema130128.java index ae7ec62..c27f542 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/xml/Schema130128.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/xml/Schema130128.java @@ -9,12 +9,15 @@ package jp.sfjp.mikutoga.pmd.xml; import java.net.URI; import java.net.URISyntaxException; -import jp.sourceforge.mikutoga.xml.LocalSchema; +import jp.sourceforge.mikutoga.xml.LocalXmlResource; /** * 130128形式XML各種リソースの定義。 */ -public class Schema130128 extends LocalSchema{ +public final class Schema130128 implements LocalXmlResource{ + + /** 唯一のシングルトン。 */ + public static final Schema130128 SINGLETON; /** 名前空間。 */ public static final String NS_PMDXML = @@ -41,13 +44,15 @@ public class Schema130128 extends LocalSchema{ }catch(URISyntaxException e){ throw new ExceptionInInitializerError(e); } + + SINGLETON = new Schema130128(); } /** - * 隠しコンストラクタ。 + * コンストラクタ。 */ - public Schema130128(){ + private Schema130128(){ super(); assert this.getClass() == THISCLASS; return; @@ -59,7 +64,7 @@ public class Schema130128 extends LocalSchema{ * @return {@inheritDoc} */ @Override - public URI getOriginalSchema(){ + public URI getOriginalResource(){ return URI_SCHEMA_PMDXML; } @@ -68,7 +73,7 @@ public class Schema130128 extends LocalSchema{ * @return {@inheritDoc} */ @Override - public URI getLocalSchema(){ + public URI getLocalResource(){ return RES_SCHEMA_PMDXML; } diff --git a/src/main/java/jp/sfjp/mikutoga/pmd2xml/CmdLine.java b/src/main/java/jp/sfjp/mikutoga/pmd2xml/CmdLine.java index 584f177..900a7f2 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd2xml/CmdLine.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd2xml/CmdLine.java @@ -16,7 +16,7 @@ import java.util.List; /** * コマンドラインの1オプションとその引数群に相当。 */ -class CmdLine { +final class CmdLine { private OptSwitch opt; private List optArgs; diff --git a/src/main/java/jp/sfjp/mikutoga/pmd2xml/OptInfo.java b/src/main/java/jp/sfjp/mikutoga/pmd2xml/OptInfo.java index f9c4bc8..64a6ea7 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd2xml/OptInfo.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd2xml/OptInfo.java @@ -9,6 +9,7 @@ package jp.sfjp.mikutoga.pmd2xml; import java.text.MessageFormat; import java.util.List; +import java.util.Locale; /** * コマンドラインオプション情報。 @@ -157,7 +158,7 @@ final class OptInfo { ModelFileType result = ModelFileType.NONE; if(fileName == null) return result; - String lower = fileName.toLowerCase(); + String lower = fileName.toLowerCase(Locale.ROOT); if (lower.endsWith(SFX_PMD)) result = ModelFileType.PMD; else if(lower.endsWith(SFX_XML)) result = ModelFileType.XML_AUTO; @@ -243,7 +244,7 @@ final class OptInfo { throws CmdLineException{ for(CmdLine cmd : cmdLines){ List optArgs = cmd.getOptArgs(); - assert optArgs.size() > 0; + assert ! optArgs.isEmpty(); String optTxt = optArgs.get(0); assert optTxt != null; diff --git a/src/main/java/jp/sfjp/mikutoga/pmd2xml/OptSwitch.java b/src/main/java/jp/sfjp/mikutoga/pmd2xml/OptSwitch.java index 1035a63..46aad83 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd2xml/OptSwitch.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd2xml/OptSwitch.java @@ -69,7 +69,7 @@ enum OptSwitch { /** * コンストラクタ。 - * @patam argnum 必要な引数の数 + * @param argnum 必要な引数の数 * @param cmdopts オプションスイッチパターン群 */ private OptSwitch(int argnum, String... cmdopts) { diff --git a/src/main/java/jp/sfjp/mikutoga/pmd2xml/Pmd2Xml.java b/src/main/java/jp/sfjp/mikutoga/pmd2xml/Pmd2Xml.java index c0af924..06d432c 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd2xml/Pmd2Xml.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd2xml/Pmd2Xml.java @@ -18,6 +18,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.nio.channels.FileChannel; +import java.text.MessageFormat; import java.util.Properties; import jp.sfjp.mikutoga.bin.parser.MmdFormatException; import jp.sfjp.mikutoga.pmd.IllegalPmdDataException; @@ -31,18 +32,18 @@ public final class Pmd2Xml { /** 正常系。 */ public static final int EXIT_OK = 0; + /** 内部エラー。 */ + public static final int EXIT_INTERR = 1; + /** 実行環境に起因するエラー。 */ + public static final int EXIT_ENVERR = 2; + /** オプション指定に起因するエラー。 */ + public static final int EXIT_OPTERR = 3; /** ファイル入出力に起因するエラー。 */ - public static final int EXIT_FILE = 1; + public static final int EXIT_IOERR = 4; /** XMLフォーマットに起因するエラー。 */ - public static final int EXIT_XML = 2; + public static final int EXIT_XMLERR = 5; /** PMDフォーマットに起因するエラー。 */ - public static final int EXIT_PMD = 3; - /** 実行環境に起因するエラー。 */ - public static final int EXIT_JREVER = 4; - /** オプション指定に起因するエラー。 */ - public static final int EXIT_OPT = 5; - /** 内部エラー。 */ - public static final int EXIT_INTERN = 6; + public static final int EXIT_PMDERR = 6; /** アプリ名。 */ public static final String APPNAME; @@ -50,15 +51,30 @@ public final class Pmd2Xml { public static final String APPVER; /** ライセンス種別。 */ public static final String APPLICENSE; + /** 開発元URL。 */ + public static final String APPURL; private static final Class THISCLASS; + private static final String RES_VER = "resources/version.properties"; private static final PrintStream ERROUT = System.err; + private static final String MSG_ERR = "ERROR:\n{0}\n(-h for help)"; + private static final String MSG_HELP = + "{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_ABNFILE = "{0} is not file."; + private static final String MSG_OWOUTFILE = + "{0} already exists.\n" + + "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"; static{ THISCLASS = Pmd2Xml.class; - InputStream ver = - THISCLASS.getResourceAsStream("resources/version.properties"); + InputStream ver = THISCLASS.getResourceAsStream(RES_VER); Properties verProps = new Properties(); try{ try{ @@ -73,6 +89,7 @@ public final class Pmd2Xml { APPNAME = verProps.getProperty("app.name"); APPVER = verProps.getProperty("app.version"); APPLICENSE = verProps.getProperty("app.license"); + APPURL = verProps.getProperty("app.url"); new Pmd2Xml().hashCode(); } @@ -91,9 +108,21 @@ public final class Pmd2Xml { /** * VMを終了させる。 * @param code 終了コード + * @see java.lang.System#exit(int) */ private static void exit(int code){ System.exit(code); + assert false; + throw new AssertionError(); + } + + /** + * 共通エラーメッセージを出力する。 + * @param text 個別メッセージ + */ + private static void errMsg(String text){ + String msg = MessageFormat.format(MSG_ERR, text); + ERROUT.println(msg); return; } @@ -102,12 +131,12 @@ public final class Pmd2Xml { * @param ex 例外 * @param dumpStack スタックトレースを出力するならtrue */ - private static void errPrintln(Throwable ex, boolean dumpStack){ - String text = ex.toString(); - ERROUT.println(text); - + private static void thPrintln(Throwable ex, boolean dumpStack){ if(dumpStack){ ex.printStackTrace(ERROUT); + }else{ + String text = ex.toString(); + ERROUT.println(text); } return; @@ -117,19 +146,8 @@ public final class Pmd2Xml { * 標準エラー出力へ例外情報出力。 * @param ex 例外 */ - private static void errPrintln(Throwable ex){ - errPrintln(ex, false); - return; - } - - /** - * 共通エラーメッセージを出力する。 - * @param text 個別メッセージ - */ - private static void errMsg(String text){ - ERROUT.println("ERROR:"); - ERROUT.println(text); - ERROUT.println("(-h for help)"); + private static void thPrintln(Throwable ex){ + thPrintln(ex, false); return; } @@ -138,9 +156,9 @@ public final class Pmd2Xml { * 例外を出力してVM終了する。 * @param ex 例外 */ - private static void ioError(Throwable ex){ - errPrintln(ex); - exit(EXIT_FILE); + private static void ioError(IOException ex){ + thPrintln(ex); + exit(EXIT_IOERR); } /** @@ -149,8 +167,8 @@ public final class Pmd2Xml { * @param ex 例外 */ private static void xmlError(Throwable ex){ - errPrintln(ex); - exit(EXIT_XML); + thPrintln(ex); + exit(EXIT_XMLERR); } /** @@ -158,9 +176,9 @@ public final class Pmd2Xml { * 例外を出力してVM終了する。 * @param ex 例外 */ - private static void pmdError(Throwable ex){ - errPrintln(ex, true); - exit(EXIT_PMD); + private static void pmdError(MmdFormatException ex){ + thPrintln(ex, true); + exit(EXIT_PMDERR); } /** @@ -169,8 +187,8 @@ public final class Pmd2Xml { * @param ex 例外 */ private static void internalError(Throwable ex){ - errPrintln(ex, true); - exit(EXIT_INTERN); + thPrintln(ex, true); + exit(EXIT_INTERR); } /** @@ -179,37 +197,30 @@ public final class Pmd2Xml { */ private static void checkJRE(){ Package jrePackage = java.lang.Object.class.getPackage(); - if( ! jrePackage.isCompatibleWith("1.6")){ - ERROUT.println("You need JRE 1.6 or later."); - exit(EXIT_JREVER); + if( ! jrePackage.isCompatibleWith(REQUIRED_JRE)){ + String msg = MessageFormat.format(MSG_OLDJRE, REQUIRED_JRE); + ERROUT.println(msg); + exit(EXIT_ENVERR); } return; } /** - * ヘルプメッセージを出力してVMを終了させる。 + * ヘルプメッセージを出力する。 */ private static void putHelp(){ - StringBuilder appInfo = new StringBuilder(); - String indent = " "; - - appInfo.append(APPNAME).append(' ').append(APPVER) - .append('\n'); - appInfo.append(indent) - .append("License").append(" : ").append(APPLICENSE) - .append('\n'); - appInfo.append(indent) - .append("http://mikutoga.sourceforge.jp/") - .append('\n'); - - ERROUT.println(appInfo.toString()); + String msg = + MessageFormat.format(MSG_HELP, + APPNAME, APPVER, APPLICENSE, APPURL); + ERROUT.println(msg); ERROUT.println(OptSwitch.getConsoleHelp()); - return; } /** * ファイルサイズを0に切り詰める。 + *

ファイルが存在しなければなにもしない。 + *

通常ファイルでなければなにもしない。 * @param file ファイル * @throws IOException 入出力エラー */ @@ -236,6 +247,7 @@ public final class Pmd2Xml { /** * 入力ストリームを準備する。 + *

入力ファイルが通常ファイルとして存在しなければエラー終了。 * @param fileName 入力ファイル名 * @return 入力ストリーム */ @@ -244,16 +256,18 @@ public final class Pmd2Xml { if( (! inFile.exists()) || (! inFile.isFile()) ){ String absPath = inFile.getAbsolutePath(); - errMsg("Can't find input file:" + absPath); - exit(EXIT_FILE); + String msg = MessageFormat.format(MSG_NOINFILE, absPath); + errMsg(msg); + exit(EXIT_IOERR); } - InputStream is = null; + InputStream is; try{ is = new FileInputStream(inFile); }catch(FileNotFoundException e){ ioError(e); assert false; + throw new AssertionError(e); } is = new BufferedInputStream(is); @@ -263,6 +277,8 @@ public final class Pmd2Xml { /** * 出力ストリームを準備する。 + *

出力ファイルが通常ファイルでない場合はエラー終了。 + *

既存の出力ファイルに上書き指示が伴っていなければエラー終了。 * @param fileName 出力ファイル名 * @param overWrite 頭から上書きして良ければtrue * @return 出力ストリーム @@ -274,15 +290,13 @@ public final class Pmd2Xml { if(outFile.exists()){ String absPath = outFile.getAbsolutePath(); if( ! outFile.isFile() ){ - String msg = absPath + " is not file."; + String msg = MessageFormat.format(MSG_ABNFILE, absPath); errMsg(msg); - exit(EXIT_FILE); + exit(EXIT_IOERR); }else if( ! overWrite ){ - String msg = - absPath + " already exists.\n" - + "If you want to overwrite, use -f."; + String msg = MessageFormat.format(MSG_OWOUTFILE, absPath); errMsg(msg); - exit(EXIT_FILE); + exit(EXIT_IOERR); } } @@ -292,12 +306,13 @@ public final class Pmd2Xml { ioError(e); } - OutputStream os = null; + OutputStream os; try{ os = new FileOutputStream(outFile); }catch(FileNotFoundException e){ ioError(e); assert false; + throw new AssertionError(e); } os = new BufferedOutputStream(os); @@ -312,15 +327,13 @@ public final class Pmd2Xml { public static void main(String[] args){ checkJRE(); - Pmd2XmlConv converter = new Pmd2XmlConv(); - OptInfo optInfo; try{ optInfo = OptInfo.parseOption(args); }catch(CmdLineException e){ String optErrMsg = e.getLocalizedMessage(); errMsg(optErrMsg); - exit(EXIT_OPT); + exit(EXIT_OPTERR); return; } @@ -329,14 +342,16 @@ public final class Pmd2Xml { exit(EXIT_OK); } - String inputFile = optInfo.getInFilename(); + String inputFile = optInfo.getInFilename(); String outputFile = optInfo.getOutFilename(); boolean overwrite = optInfo.overwriteMode(); InputStream is = openInfile(inputFile); OutputStream os = openOutfile(outputFile, overwrite); - converter.setInType(optInfo.getInFileType()); + Pmd2XmlConv converter = new Pmd2XmlConv(); + + converter.setInType (optInfo.getInFileType()); converter.setOutType(optInfo.getOutFileType()); converter.setNewline(optInfo.getNewline()); diff --git a/src/main/java/jp/sfjp/mikutoga/pmd2xml/Pmd2XmlConv.java b/src/main/java/jp/sfjp/mikutoga/pmd2xml/Pmd2XmlConv.java index 3a0df47..bf1a049 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd2xml/Pmd2XmlConv.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd2xml/Pmd2XmlConv.java @@ -25,7 +25,8 @@ import jp.sfjp.mikutoga.pmd.xml.XmlExporter; import jp.sfjp.mikutoga.pmd.xml.XmlLoader; import jp.sfjp.mikutoga.pmd.xml.XmlModelFileType; import jp.sourceforge.mikutoga.xml.BotherHandler; -import jp.sourceforge.mikutoga.xml.LocalSchema; +import jp.sourceforge.mikutoga.xml.LocalXmlResource; +import jp.sourceforge.mikutoga.xml.SchemaUtil; import jp.sourceforge.mikutoga.xml.TogaXmlException; import jp.sourceforge.mikutoga.xml.XmlResourceResolver; import org.xml.sax.InputSource; @@ -78,23 +79,30 @@ public class Pmd2XmlConv { private DocumentBuilder buildBuilder(){ XmlResourceResolver resolver = new XmlResourceResolver(); - Schema schema; - + LocalXmlResource[] schemaArray; switch(this.inTypes){ case XML_101009: - schema = LocalSchema.newSchema(resolver, new Schema101009()); + schemaArray = new LocalXmlResource[]{ + Schema101009.SINGLETON, + }; break; case XML_130128: - schema = LocalSchema.newSchema(resolver, new Schema130128()); + schemaArray = new LocalXmlResource[]{ + Schema130128.SINGLETON, + }; break; case XML_AUTO: - schema = LocalSchema.newSchema(resolver, - new Schema101009(), new Schema130128()); + schemaArray = new LocalXmlResource[]{ + Schema101009.SINGLETON, + Schema130128.SINGLETON, + }; break; default: throw new IllegalStateException(); } + Schema schema = SchemaUtil.newSchema(resolver, schemaArray); + DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); initBuilderFactory(builderFactory); @@ -117,9 +125,11 @@ public class Pmd2XmlConv { /** * 入力ファイル種別を設定する。 * @param type ファイル種別 + * @throws NullPointerException 引数がnull * @throws IllegalArgumentException 具体的な種別を渡さなかった */ - public void setInType(ModelFileType type){ + public void setInType(ModelFileType type) + throws NullPointerException, IllegalArgumentException { if(type == null) throw new NullPointerException(); if(type == ModelFileType.NONE) throw new IllegalArgumentException(); this.inTypes = type; @@ -137,9 +147,11 @@ public class Pmd2XmlConv { /** * 出力ファイル種別を設定する。 * @param type ファイル種別 + * @throws NullPointerException 引数がnull * @throws IllegalArgumentException 具体的な種別を渡さなかった */ - public void setOutType(ModelFileType type){ + public void setOutType(ModelFileType type) + throws NullPointerException, IllegalArgumentException { if(type == null) throw new NullPointerException(); if(type == ModelFileType.NONE) throw new IllegalArgumentException(); this.outTypes = type; @@ -167,7 +179,7 @@ public class Pmd2XmlConv { * XML出力用改行文字列を返す。 * @return 改行文字 */ - public String getNewLine(){ + public String getNewline(){ return this.newLine; } @@ -217,7 +229,6 @@ public class Pmd2XmlConv { * @throws MmdFormatException フォーマットエラー * @throws SAXException XMLエラー * @throws TogaXmlException XMLエラー - * @throws IllegalStateException ファイル種別がまた指定されていない */ public PmdModel readModel(InputStream is) throws IOException, @@ -243,7 +254,6 @@ public class Pmd2XmlConv { * @param os 出力ストリーム * @throws IOException 出力エラー * @throws IllegalPmdDataException データの不備 - * @throws IllegalStateException ファイル種別がまた指定されていない */ public void writeModel(PmdModel model, OutputStream os) throws IOException, @@ -268,8 +278,8 @@ public class Pmd2XmlConv { */ private PmdModel pmdRead(InputStream is) throws IOException, MmdFormatException{ - PmdLoader loader = new PmdLoader(is); - PmdModel model = loader.load(); + PmdLoader loader = new PmdLoader(); + PmdModel model = loader.load(is); return model; } diff --git a/src/main/resources/jp/sfjp/mikutoga/pmd2xml/resources/version.properties b/src/main/resources/jp/sfjp/mikutoga/pmd2xml/resources/version.properties index 76d9b53..71fb597 100644 --- a/src/main/resources/jp/sfjp/mikutoga/pmd2xml/resources/version.properties +++ b/src/main/resources/jp/sfjp/mikutoga/pmd2xml/resources/version.properties @@ -4,5 +4,6 @@ app.name = ${pom.name} app.version = ${pom.version} app.license = The MIT License +app.url = ${pom.url} # EOF # -- 2.11.0