4 * Copyright(c) 2008 olyutorskii
\r
7 package jp.sourceforge.jindolf.archiver;
\r
9 import java.io.BufferedOutputStream;
\r
10 import java.io.BufferedWriter;
\r
11 import java.io.File;
\r
12 import java.io.FileOutputStream;
\r
13 import java.io.IOException;
\r
14 import java.io.OutputStream;
\r
15 import java.io.OutputStreamWriter;
\r
16 import java.io.Writer;
\r
17 import java.text.MessageFormat;
\r
18 import java.util.List;
\r
19 import javax.xml.parsers.DocumentBuilder;
\r
20 import javax.xml.parsers.DocumentBuilderFactory;
\r
21 import jp.sourceforge.jindolf.corelib.LandDef;
\r
22 import jp.sourceforge.jindolf.parser.DecodeException;
\r
23 import jp.sourceforge.jindolf.parser.HtmlParseException;
\r
28 public final class JinArchiver{
\r
30 public static final String GENERATOR = "JinArchiver 1.401.2";
\r
31 private static final List<LandDef> LANDDEF_LIST;
\r
34 DocumentBuilderFactory factory =
\r
35 DocumentBuilderFactory.newInstance();
\r
37 DocumentBuilder builder = factory.newDocumentBuilder();
\r
38 LANDDEF_LIST = LandDef.buildLandDefList(builder);
\r
39 }catch(RuntimeException e){
\r
41 }catch(Exception e){
\r
42 throw new ExceptionInInitializerError(e);
\r
51 public static LandDef getLandDef(String landId){
\r
52 for(LandDef landDef : LANDDEF_LIST){
\r
53 if(landDef.getLandId().equals(landId)) return landDef;
\r
61 private static void helpMessage(){
\r
63 "\n" + GENERATOR + " 人狼BBS アーカイブ作成ツール\n\n"
\r
64 +"-h, -help, -?\n\tヘルプメッセージ\n"
\r
67 +"-outdir 出力ディレクトリ\n"
\r
68 +"-stdout\n\t標準出力へ出力\n\n"
\r
69 +"※ -outdir と -stdout は排他指定\n"
\r
71 StringBuilder landList = new StringBuilder();
\r
72 for(LandDef landDef : LANDDEF_LIST){
\r
73 landList.append(landDef.getLandId()).append(' ');
\r
75 System.err.print("利用可能な国識別子は ");
\r
76 System.err.println(landList);
\r
77 System.err.println();
\r
83 * @param args オプション文字列
\r
85 private static void parseOption(String[] args){
\r
86 if(args.length <= 0){
\r
92 LandDef landDef = null;
\r
94 String outdir = null;
\r
95 boolean stdout = false;
\r
97 for(int pos = 0; pos < args.length; pos++){
\r
98 String arg = args[pos];
\r
100 if( ! arg.startsWith("-") ){
\r
101 System.err.println("不正なオプションです。 " + arg);
\r
106 if(arg.equals("-h") || arg.equals("-help") || arg.equals("-?")){
\r
112 if(arg.equals("-stdout")){
\r
118 if(++pos >= args.length){
\r
119 System.err.println(
\r
120 "オプション " + arg + " に引数がありません。");
\r
125 String val = args[pos];
\r
126 if(arg.equals("-land")){
\r
127 landDef = getLandDef(val);
\r
128 if(landDef == null){
\r
129 System.err.println("不正な国識別子です。 " + val);
\r
133 }else if(arg.equals("-vid")){
\r
134 vid = Integer.parseInt(val);
\r
136 System.err.println("不正な村番号です。 " + vid);
\r
140 }else if(arg.equals("-outdir")){
\r
144 System.err.println("不正なオプションです。 " + arg);
\r
150 if(landDef == null){
\r
151 System.err.println(
\r
152 "-land オプションで国識別子を指定してください。");
\r
158 System.err.println(
\r
159 "-vid オプションで村番号を指定してください。");
\r
164 if( (outdir == null && stdout == false)
\r
165 || (outdir != null && stdout == true) ){
\r
166 System.err.println(
\r
167 "-outdir か -stdout のどちらか一方を指定してください。");
\r
173 if(outdir != null){
\r
174 writer = getFileWriter(outdir, landDef, vid);
\r
176 writer = getStdOutWriter();
\r
179 writer = ValidateTask.wrapValidator(writer);
\r
182 dump(writer, landDef, vid);
\r
183 }catch(RuntimeException e){
\r
185 }catch(Exception e){
\r
186 e.printStackTrace(System.err);
\r
187 System.err.println("処理を続行できません。");
\r
196 * 主処理。人狼サーバからXHTMLを読み込み。XMLで出力。
\r
197 * @param writer 出力先
\r
198 * @param landDef 国情報
\r
200 * @throws IOException 入出力エラー
\r
201 * @throws DecodeException デコードエラー
\r
202 * @throws HtmlParseException パースエラー
\r
204 public static void dump(Writer writer, LandDef landDef, int vid)
\r
205 throws IOException, DecodeException, HtmlParseException{
\r
206 List<PeriodResource> resourceList =
\r
207 HttpAccess.loadResourceList(landDef, vid);
\r
208 VillageData village = new VillageData(resourceList);
\r
210 Builder.fillVillageData(village);
\r
211 XmlUtils.dumpVillageData(writer, village);
\r
220 public static Writer getStdOutWriter(){
\r
221 OutputStream ostream;
\r
222 ostream = new BufferedOutputStream(System.out);
\r
225 writer = new OutputStreamWriter(ostream, "UTF-8");
\r
226 writer = new BufferedWriter(writer, 4 * 1024);
\r
227 }catch(IOException e){
\r
228 System.err.println(
\r
237 * ローカルファイルへの出力先を得る。
\r
238 * @param outdir 出力ディレクトリ
\r
239 * @param landDef 国情報
\r
243 public static Writer getFileWriter(String outdir,
\r
246 File outFile = new File(outdir);
\r
247 if( ! outFile.exists() ){
\r
248 System.err.println(
\r
249 outdir + " が存在しません。");
\r
253 if( ! outFile.isDirectory() ){
\r
254 System.err.println(
\r
255 outdir + " はディレクトリではありません。");
\r
259 if( ! outFile.canWrite() ){
\r
260 System.err.println(
\r
261 outdir + " に書き込めません。");
\r
265 String fname = MessageFormat.format(
\r
266 "jin_{0}_{1,number,#00000}.xml", landDef.getLandId(), vid);
\r
267 File xmlFile = new File(outFile, fname);
\r
270 created = xmlFile.createNewFile();
\r
271 }catch(IOException e){
\r
272 System.err.println(
\r
273 xmlFile.getName() + " が作成できません。");
\r
278 System.err.println(
\r
279 fname + " が既に" + outdir + "に存在します。");
\r
284 xmlFile.setReadable(true);
\r
285 xmlFile.setWritable(true);
\r
286 xmlFile.setExecutable(false, false);
\r
290 OutputStream ostream;
\r
291 ostream = new FileOutputStream(xmlFile);
\r
292 ostream = new BufferedOutputStream(ostream, 4 * 1024);
\r
293 writer = new OutputStreamWriter(ostream, "UTF-8");
\r
294 writer = new BufferedWriter(writer, 4 * 1024);
\r
295 }catch(IOException e){
\r
296 System.err.println(
\r
297 xmlFile.getName() + " に書き込めません。");
\r
309 public static void main(String[] args){
\r
318 private JinArchiver(){
\r