X.XXX.X (20XX-XX-XX)
・デフォルトロケールによる出力揺らぎを解消。
+ ・プロセス終了コードの変更。
1.201.2 (2013-03-17)
・Maven3対応。
<groupId>jp.sourceforge.mikutoga</groupId>
<artifactId>pmd2xml</artifactId>
- <version>1.201.3-SNAPSHOT</version>
+ <version>1.201.5-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Pmd2XML</name>
<dependency>
<groupId>jp.sourceforge.mikutoga</groupId>
<artifactId>togagem</artifactId>
- <version>2.102.3-SNAPSHOT</version>
+ <version>2.102.5-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
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;
@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);
}
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);
}
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;
private static final String CRLF = CR + LF; // 0x0d, 0x0a
static{
- assert NOPREVBONE_ID > PmdLimits.MAX_BONE - 1;
+ assert NOPREVBONE_ID > PmdConst.MAX_BONE - 1;
}
/**
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();
else filler = FDFILLER;
dumpFixedW31j(text.toString(),
- PmdLimits.MAXBYTES_TEXTUREFILENAME,
+ PmdConst.MAXBYTES_TEXTUREFILENAME,
filler );
return;
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);
dumpLeShort(totalMorphPart);
}
- dumpText("base", PmdLimits.MAXBYTES_MORPHNAME);
+ dumpText("base", PmdConst.MAXBYTES_MORPHNAME);
int totalVertex = mergedMorphVertexList.size();
dumpLeInt(totalVertex);
dumpByte(MorphType.BASE.encode());
if(partList == null) continue;
for(MorphPart part : partList){
dumpText(part.getMorphName().getPrimaryText(),
- PmdLimits.MAXBYTES_MORPHNAME );
+ PmdConst.MAXBYTES_MORPHNAME );
List<MorphVertex> morphVertexList = part.getMorphVertexList();
dumpLeInt(morphVertexList.size());
dumpByte(part.getMorphType().encode());
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);
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;
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();
}
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();
for(MorphPart part : partList){
String morphName = part.getMorphName().getGlobalText();
if(morphName == null) morphName = "";
- dumpText(morphName, PmdLimits.MAXBYTES_MORPHNAME);
+ dumpText(morphName, PmdConst.MAXBYTES_MORPHNAME);
}
}
if(group.isDefaultBoneGroup()) continue;
String groupName = group.getGroupName().getGlobalText();
if(groupName == null) groupName = "";
- dumpText(groupName, PmdLimits.MAXBYTES_BONEGROUPNAME);
+ dumpText(groupName, PmdConst.MAXBYTES_BONEGROUPNAME);
}
flush();
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;
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();
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;
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){
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();
*/
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;
}
+
/**
- * パーサに各種ハンドラの設定を行う。
+ * 正常パース時に読み残したデータがあったか判定する。
+ * <p>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<MorphPart> morphPartList = new ArrayList<MorphPart>();
- 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<MorphPart> morphPartList = new ArrayList<MorphPart>();
+ 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;
}
}
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;
ListUtil.prepareDefConsList(this.rigidGroupList,
RigidGroup.class,
- PmdLimits.RIGIDGROUP_FIXEDNUM );
+ PmdConst.RIGIDGROUP_FIXEDNUM );
ListUtil.assignIndexedSerial(this.rigidGroupList);
return;
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){
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;
@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;
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 =
}catch(URISyntaxException e){
throw new ExceptionInInitializerError(e);
}
+
+ SINGLETON = new Schema101009();
}
/**
- * 隠しコンストラクタ。
+ * コンストラクタ。
*/
- public Schema101009(){
+ private Schema101009(){
super();
assert this.getClass() == THISCLASS;
return;
* @return {@inheritDoc}
*/
@Override
- public URI getOriginalSchema(){
+ public URI getOriginalResource(){
return URI_SCHEMA_PMDXML;
}
* @return {@inheritDoc}
*/
@Override
- public URI getLocalSchema(){
+ public URI getLocalResource(){
return RES_SCHEMA_PMDXML;
}
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 =
}catch(URISyntaxException e){
throw new ExceptionInInitializerError(e);
}
+
+ SINGLETON = new Schema130128();
}
/**
- * 隠しコンストラクタ。
+ * コンストラクタ。
*/
- public Schema130128(){
+ private Schema130128(){
super();
assert this.getClass() == THISCLASS;
return;
* @return {@inheritDoc}
*/
@Override
- public URI getOriginalSchema(){
+ public URI getOriginalResource(){
return URI_SCHEMA_PMDXML;
}
* @return {@inheritDoc}
*/
@Override
- public URI getLocalSchema(){
+ public URI getLocalResource(){
return RES_SCHEMA_PMDXML;
}
/**
* コマンドラインの1オプションとその引数群に相当。
*/
-class CmdLine {
+final class CmdLine {
private OptSwitch opt;
private List<String> optArgs;
import java.text.MessageFormat;
import java.util.List;
+import java.util.Locale;
/**
* コマンドラインオプション情報。
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;
throws CmdLineException{
for(CmdLine cmd : cmdLines){
List<String> optArgs = cmd.getOptArgs();
- assert optArgs.size() > 0;
+ assert ! optArgs.isEmpty();
String optTxt = optArgs.get(0);
assert optTxt != null;
/**
* コンストラクタ。
- * @patam argnum 必要な引数の数
+ * @param argnum 必要な引数の数
* @param cmdopts オプションスイッチパターン群
*/
private OptSwitch(int argnum, String... cmdopts) {
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;
/** 正常系。 */
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;
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{
APPNAME = verProps.getProperty("app.name");
APPVER = verProps.getProperty("app.version");
APPLICENSE = verProps.getProperty("app.license");
+ APPURL = verProps.getProperty("app.url");
new Pmd2Xml().hashCode();
}
/**
* 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;
}
* @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;
* 標準エラー出力へ例外情報出力。
* @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;
}
* 例外を出力して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);
}
/**
* @param ex 例外
*/
private static void xmlError(Throwable ex){
- errPrintln(ex);
- exit(EXIT_XML);
+ thPrintln(ex);
+ exit(EXIT_XMLERR);
}
/**
* 例外を出力して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);
}
/**
* @param ex 例外
*/
private static void internalError(Throwable ex){
- errPrintln(ex, true);
- exit(EXIT_INTERN);
+ thPrintln(ex, true);
+ exit(EXIT_INTERR);
}
/**
*/
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;
}
/**
- * ã\83\98ã\83«ã\83\97ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92å\87ºå\8a\9bã\81\97ã\81¦VMã\82\92çµ\82äº\86ã\81\95ã\81\9bる。
+ * ã\83\98ã\83«ã\83\97ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92å\87ºå\8a\9bã\81\99る。
*/
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に切り詰める。
+ * <p>ファイルが存在しなければなにもしない。
+ * <p>通常ファイルでなければなにもしない。
* @param file ファイル
* @throws IOException 入出力エラー
*/
/**
* 入力ストリームを準備する。
+ * <p>入力ファイルが通常ファイルとして存在しなければエラー終了。
* @param fileName 入力ファイル名
* @return 入力ストリーム
*/
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);
/**
* 出力ストリームを準備する。
+ * <p>出力ファイルが通常ファイルでない場合はエラー終了。
+ * <p>既存の出力ファイルに上書き指示が伴っていなければエラー終了。
* @param fileName 出力ファイル名
* @param overWrite 頭から上書きして良ければtrue
* @return 出力ストリーム
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);
}
}
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);
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;
}
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());
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;
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);
/**
* 入力ファイル種別を設定する。
* @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;
/**
* 出力ファイル種別を設定する。
* @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;
* XML出力用改行文字列を返す。
* @return 改行文字
*/
- public String getNewLine(){
+ public String getNewline(){
return this.newLine;
}
* @throws MmdFormatException フォーマットエラー
* @throws SAXException XMLエラー
* @throws TogaXmlException XMLエラー
- * @throws IllegalStateException ファイル種別がまた指定されていない
*/
public PmdModel readModel(InputStream is)
throws IOException,
* @param os 出力ストリーム
* @throws IOException 出力エラー
* @throws IllegalPmdDataException データの不備
- * @throws IllegalStateException ファイル種別がまた指定されていない
*/
public void writeModel(PmdModel model, OutputStream os)
throws IOException,
*/
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;
}
app.name = ${pom.name}
app.version = ${pom.version}
app.license = The MIT License
+app.url = ${pom.url}
# EOF #