import java.io.File;\r
import java.io.FileOutputStream;\r
import java.io.IOException;\r
+import java.io.InputStream;\r
import java.io.OutputStream;\r
import java.io.OutputStreamWriter;\r
import java.io.Writer;\r
import java.text.MessageFormat;\r
import java.util.List;\r
+import java.util.Properties;\r
import javax.xml.parsers.DocumentBuilder;\r
import javax.xml.parsers.DocumentBuilderFactory;\r
import jp.sourceforge.jindolf.corelib.LandDef;\r
* メインエントリ。\r
*/\r
public final class JinArchiver{\r
+\r
+ /** このClass。 */\r
+ private static final Class<?> SELF_KLASS;\r
+ /** このPackage。 */\r
+ private static final Package SELF_PACKAGE;\r
+ /** タイトル。 */\r
+ private static final String TITLE;\r
+ /** バージョン。 */\r
+ private static final String VERSION;\r
/** Generator. */\r
- public static final String GENERATOR = "JinArchiver 1.401.2";\r
+ private static final String GENERATOR;\r
+\r
private static final List<LandDef> LANDDEF_LIST;\r
\r
+ /** バージョン定義リソース。 */\r
+ private static final String RES_VERDEF = "resources/version.properties";\r
+\r
static{\r
+ SELF_KLASS = JinArchiver.class;\r
+ SELF_PACKAGE = SELF_KLASS.getPackage();\r
+\r
+ Properties verProp = loadVersionDefinition(SELF_KLASS);\r
+ TITLE = getPackageInfo(verProp, "pkg-title.", "Unknown");\r
+ VERSION = getPackageInfo(verProp, "pkg-version.", "0");\r
+ GENERATOR = TITLE + " " + VERSION;\r
+\r
DocumentBuilderFactory factory =\r
DocumentBuilderFactory.newInstance();\r
try{\r
}\r
\r
/**\r
+ * リソース上のパッケージ定義プロパティをロードする。\r
+ * MANIFEST.MFが参照できない実行環境での代替品。\r
+ * @param klass パッケージを構成する任意のクラス\r
+ * @return プロパティ\r
+ */\r
+ private static Properties loadVersionDefinition(Class klass){\r
+ Properties result = new Properties();\r
+\r
+ InputStream istream = klass.getResourceAsStream(RES_VERDEF);\r
+ try{\r
+ result.load(istream);\r
+ }catch(IOException e){\r
+ return result;\r
+ }finally{\r
+ try{\r
+ istream.close();\r
+ }catch(IOException e){\r
+ return result;\r
+ }\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
+ /**\r
+ * リソース上のプロパティから\r
+ * このクラスのパッケージのパッケージ情報を取得する。\r
+ * MANIFEST.MFが参照できない実行環境での代替品。\r
+ * @param prop プロパティ\r
+ * @param prefix 接頭辞\r
+ * @param defValue 見つからなかった場合のデフォルト値\r
+ * @return パッケージ情報\r
+ */\r
+ private static String getPackageInfo(Properties prop,\r
+ String prefix,\r
+ String defValue){\r
+ return getPackageInfo(prop, SELF_PACKAGE, prefix, defValue);\r
+ }\r
+\r
+ /**\r
+ * リソース上のプロパティからパッケージ情報を取得する。\r
+ * MANIFEST.MFが参照できない実行環境での代替品。\r
+ * @param prop プロパティ\r
+ * @param pkg 任意のパッケージ\r
+ * @param prefix 接頭辞\r
+ * @param defValue デフォルト値\r
+ * @return 見つからなかった場合のパッケージ情報\r
+ */\r
+ private static String getPackageInfo(Properties prop,\r
+ Package pkg,\r
+ String prefix,\r
+ String defValue){\r
+ String propName = prefix + pkg.getName();\r
+ String result = prop.getProperty(propName, defValue);\r
+ return result;\r
+ }\r
+\r
+ /**\r
+ * System.err.println()のWrapper。\r
+ * @param text 出力テキスト\r
+ */\r
+ private static void errprintln(CharSequence text){\r
+ System.err.println(text);\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * プログラムの終了。\r
+ * @param code プロセスコード。\r
+ */\r
+ private static void exit(int code){\r
+ System.exit(code);\r
+ assert false;\r
+ return;\r
+ }\r
+\r
+ /**\r
* 国IDから国情報を得る。\r
* @param landId 国ID\r
* @return 国情報\r
* ヘルプメッセージ出力。\r
*/\r
private static void helpMessage(){\r
- System.err.println(\r
+ errprintln(\r
"\n" + GENERATOR + " 人狼BBS アーカイブ作成ツール\n\n"\r
+"-h, -help, -?\n\tヘルプメッセージ\n"\r
+"-land 国識別子\n"\r
for(LandDef landDef : LANDDEF_LIST){\r
landList.append(landDef.getLandId()).append(' ');\r
}\r
- System.err.print("利用可能な国識別子は ");\r
- System.err.println(landList);\r
- System.err.println();\r
+ errprintln("利用可能な国識別子は " + landList + "\n");\r
+\r
return;\r
}\r
\r
private static void parseOption(String[] args){\r
if(args.length <= 0){\r
helpMessage();\r
- System.exit(0);\r
+ exit(0);\r
return;\r
}\r
\r
String arg = args[pos];\r
\r
if( ! arg.startsWith("-") ){\r
- System.err.println("不正なオプションです。 " + arg);\r
- System.exit(1);\r
+ errprintln("不正なオプションです。 " + arg);\r
+ exit(1);\r
return;\r
}\r
\r
if(arg.equals("-h") || arg.equals("-help") || arg.equals("-?")){\r
helpMessage();\r
- System.exit(0);\r
+ exit(0);\r
return;\r
}\r
\r
}\r
\r
if(++pos >= args.length){\r
- System.err.println(\r
+ errprintln(\r
"オプション " + arg + " に引数がありません。");\r
- System.exit(1);\r
+ exit(1);\r
return;\r
}\r
\r
if(arg.equals("-land")){\r
landDef = getLandDef(val);\r
if(landDef == null){\r
- System.err.println("不正な国識別子です。 " + val);\r
- System.exit(1);\r
+ errprintln("不正な国識別子です。 " + val);\r
+ exit(1);\r
return;\r
}\r
}else if(arg.equals("-vid")){\r
vid = Integer.parseInt(val);\r
if(vid < 0){\r
- System.err.println("不正な村番号です。 " + vid);\r
- System.exit(1);\r
+ errprintln("不正な村番号です。 " + vid);\r
+ exit(1);\r
return;\r
}\r
}else if(arg.equals("-outdir")){\r
outdir = val;\r
stdout = false;\r
}else{\r
- System.err.println("不正なオプションです。 " + arg);\r
- System.exit(1);\r
+ errprintln("不正なオプションです。 " + arg);\r
+ exit(1);\r
return;\r
}\r
}\r
\r
if(landDef == null){\r
- System.err.println(\r
+ errprintln(\r
"-land オプションで国識別子を指定してください。");\r
- System.exit(1);\r
+ exit(1);\r
return;\r
}\r
\r
if(vid < 0){\r
- System.err.println(\r
+ errprintln(\r
"-vid オプションで村番号を指定してください。");\r
- System.exit(1);\r
+ exit(1);\r
return;\r
}\r
\r
if( (outdir == null && stdout == false)\r
|| (outdir != null && stdout == true) ){\r
- System.err.println(\r
+ errprintln(\r
"-outdir か -stdout のどちらか一方を指定してください。");\r
- System.exit(1);\r
+ exit(1);\r
return;\r
}\r
\r
throw e;\r
}catch(Exception e){\r
e.printStackTrace(System.err);\r
- System.err.println("処理を続行できません。");\r
- System.exit(1);\r
+ errprintln("処理を続行できません。");\r
+ exit(1);\r
return;\r
}\r
\r
writer = new OutputStreamWriter(ostream, "UTF-8");\r
writer = new BufferedWriter(writer, 4 * 1024);\r
}catch(IOException e){\r
- System.err.println(\r
+ errprintln(\r
"標準出力に書き込めません。");\r
- System.exit(1);\r
+ exit(1);\r
return null;\r
}\r
return writer;\r
int vid ){\r
File outFile = new File(outdir);\r
if( ! outFile.exists() ){\r
- System.err.println(\r
+ errprintln(\r
outdir + " が存在しません。");\r
- System.exit(1);\r
+ exit(1);\r
return null;\r
}\r
if( ! outFile.isDirectory() ){\r
- System.err.println(\r
+ errprintln(\r
outdir + " はディレクトリではありません。");\r
- System.exit(1);\r
+ exit(1);\r
return null;\r
}\r
if( ! outFile.canWrite() ){\r
- System.err.println(\r
+ errprintln(\r
outdir + " に書き込めません。");\r
- System.exit(1);\r
+ exit(1);\r
return null;\r
}\r
String fname = MessageFormat.format(\r
try{\r
created = xmlFile.createNewFile();\r
}catch(IOException e){\r
- System.err.println(\r
+ errprintln(\r
xmlFile.getName() + " が作成できません。");\r
- System.exit(1);\r
+ exit(1);\r
return null;\r
}\r
if( ! created ){\r
- System.err.println(\r
+ errprintln(\r
fname + " が既に" + outdir + "に存在します。");\r
- System.exit(1);\r
+ exit(1);\r
return null;\r
}\r
/* JRE 1.6 only\r
writer = new OutputStreamWriter(ostream, "UTF-8");\r
writer = new BufferedWriter(writer, 4 * 1024);\r
}catch(IOException e){\r
- System.err.println(\r
+ errprintln(\r
xmlFile.getName() + " に書き込めません。");\r
- System.exit(1);\r
+ exit(1);\r
return null;\r
}\r
\r
*/\r
public static void main(String[] args){\r
parseOption(args);\r
- System.exit(0);\r
+ exit(0);\r
return;\r
}\r
\r