4 * License : The MIT License
5 * Copyright(c) 2008 olyutorskii
8 package jp.sourceforge.jindolf.archiver;
10 import java.io.BufferedOutputStream;
11 import java.io.BufferedReader;
12 import java.io.BufferedWriter;
14 import java.io.FileOutputStream;
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.io.OutputStream;
18 import java.io.OutputStreamWriter;
19 import java.io.Reader;
20 import java.io.Writer;
21 import java.text.MessageFormat;
22 import java.util.List;
23 import java.util.Properties;
24 import javax.xml.validation.Validator;
25 import jp.sourceforge.jindolf.corelib.LandDef;
26 import jp.sourceforge.jindolf.parser.DecodeException;
27 import jp.sourceforge.jindolf.parser.HtmlParseException;
28 import org.xml.sax.SAXException;
33 public final class JinArchiver{
36 public static final String GENERATOR;
39 private static final Class<?> SELF_KLASS;
41 private static final Package SELF_PACKAGE;
43 private static final String TITLE;
45 private static final String VERSION;
48 private static final String RES_VERDEF = "resources/version.properties";
52 SELF_KLASS = JinArchiver.class;
53 SELF_PACKAGE = SELF_KLASS.getPackage();
55 Properties verProp = loadVersionDefinition(SELF_KLASS);
56 TITLE = getPackageInfo(verProp, "pkg-title.", "Unknown");
57 VERSION = getPackageInfo(verProp, "pkg-version.", "0");
58 GENERATOR = TITLE + " " + VERSION;
65 private JinArchiver(){
67 throw new AssertionError();
72 * リソース上のパッケージ定義プロパティをロードする。
73 * MANIFEST.MFが参照できない実行環境での代替品。
74 * @param klass パッケージを構成する任意のクラス
77 private static Properties loadVersionDefinition(Class<?> klass){
78 Properties result = new Properties();
80 InputStream istream = klass.getResourceAsStream(RES_VERDEF);
88 }catch(IOException e){
97 * このクラスのパッケージのパッケージ情報を取得する。
98 * MANIFEST.MFが参照できない実行環境での代替品。
101 * @param defValue 見つからなかった場合のデフォルト値
104 private static String getPackageInfo(Properties prop,
107 return getPackageInfo(prop, SELF_PACKAGE, prefix, defValue);
111 * リソース上のプロパティからパッケージ情報を取得する。
112 * MANIFEST.MFが参照できない実行環境での代替品。
114 * @param pkg 任意のパッケージ
116 * @param defValue デフォルト値
117 * @return 見つからなかった場合のパッケージ情報
119 private static String getPackageInfo(Properties prop,
123 String propName = prefix + pkg.getName();
124 String result = prop.getProperty(propName, defValue);
129 * System.err.println()のWrapper。
132 private static void errprintln(CharSequence text){
133 System.err.println(text);
139 * @param code プロセスコード。
141 private static void exit(int code){
150 private static void helpMessage(){
151 String msg = OptArg.getHelpMessage(GENERATOR);
158 * @param optInfo オプション情報
160 private static void dumpOut(OptInfo optInfo){
162 String outdir = optInfo.getOutdir();
163 LandDef landDef = optInfo.getLandDef();
164 int vid = optInfo.getVid();
168 writer = getFileWriter(outdir, landDef, vid);
170 writer = getStdOutWriter();
173 SnifWriter snifWriter = new SnifWriter(writer);
174 Reader reader = snifWriter.getSnifReader();
176 writer = new BufferedWriter(snifWriter);
177 reader = new BufferedReader(reader);
181 validator = XmlUtils.createValidator();
182 }catch(SAXException e){
183 abortWithException(e, "処理を続行できません。");
187 VillageData villageData;
189 villageData = load(landDef, vid);
190 }catch(IOException e){
191 abortWithException(e);
193 }catch(DecodeException e){
194 abortWithException(e);
196 }catch(HtmlParseException e){
197 abortWithException(e);
201 ValidateTask valTask = new ValidateTask(reader, validator);
202 DumpXmlTask dumpTask = new DumpXmlTask(villageData, writer);
204 ProdCons taskman = new ProdCons(dumpTask, valTask);
207 }catch(InterruptedException e){
208 abortWithException(e);
211 if(taskman.hasError()){
212 Throwable cause = taskman.getCause();
213 String desc = taskman.getErrDescription();
214 abortWithException(cause, desc);
225 private static void abortWithException(Throwable e){
226 abortWithException(e, "処理を続行できません。");
236 private static void abortWithException(Throwable e, String desc){
237 e.printStackTrace(System.err);
244 * 主処理。人狼サーバからXHTMLを読み込み。XMLで出力。
248 * @throws IOException 入出力エラー
249 * @throws DecodeException デコードエラー
250 * @throws HtmlParseException パースエラー
252 public static VillageData load(LandDef landDef, int vid)
253 throws IOException, DecodeException, HtmlParseException{
254 List<PeriodResource> resourceList =
255 HttpAccess.loadResourceList(landDef, vid);
256 VillageData villageData = new VillageData(resourceList);
258 Builder.fillVillageData(villageData);
267 public static Writer getStdOutWriter(){
268 OutputStream ostream;
269 ostream = new BufferedOutputStream(System.out);
272 writer = new OutputStreamWriter(ostream, "UTF-8");
273 writer = new BufferedWriter(writer, 4 * 1024);
274 }catch(IOException e){
285 * @param outdir 出力ディレクトリ
290 public static Writer getFileWriter(String outdir,
293 File outFile = new File(outdir);
294 if( ! outFile.exists() ){
296 outdir + " が存在しません。");
300 if( ! outFile.isDirectory() ){
302 outdir + " はディレクトリではありません。");
306 if( ! outFile.canWrite() ){
308 outdir + " に書き込めません。");
312 String fname = MessageFormat.format(
313 "jin_{0}_{1,number,#00000}.xml", landDef.getLandId(), vid);
314 File xmlFile = new File(outFile, fname);
317 created = xmlFile.createNewFile();
318 }catch(IOException e){
320 xmlFile.getName() + " が作成できません。");
326 fname + " が既に" + outdir + "に存在します。");
331 xmlFile.setReadable(true);
332 xmlFile.setWritable(true);
333 xmlFile.setExecutable(false, false);
337 OutputStream ostream;
338 ostream = new FileOutputStream(xmlFile);
339 ostream = new BufferedOutputStream(ostream, 4 * 1024);
340 writer = new OutputStreamWriter(ostream, "UTF-8");
341 writer = new BufferedWriter(writer, 4 * 1024);
342 }catch(IOException e){
344 xmlFile.getName() + " に書き込めません。");
356 public static void main(String[] args){
357 OptInfo optInfo = OptInfo.parseOptInfo(args);
359 if(optInfo.isHelp()){
366 if(optInfo.hasError()){
367 String errMsg = optInfo.getErrMsg();