2 * file archive utilities
\r
4 * Copyright(c) 2008 olyutorskii
\r
7 package jp.sourceforge.jindolf.archiver;
\r
10 import java.io.IOException;
\r
11 import java.io.InputStream;
\r
12 import java.io.InputStreamReader;
\r
13 import java.io.LineNumberReader;
\r
14 import java.io.Reader;
\r
15 import java.net.MalformedURLException;
\r
16 import java.net.URI;
\r
17 import java.net.URL;
\r
18 import java.text.DateFormat;
\r
19 import java.text.ParseException;
\r
20 import java.text.SimpleDateFormat;
\r
21 import java.util.Date;
\r
22 import java.util.LinkedList;
\r
23 import java.util.List;
\r
24 import java.util.Locale;
\r
25 import java.util.regex.Matcher;
\r
26 import java.util.regex.Pattern;
\r
27 import jp.sourceforge.jindolf.corelib.LandDef;
\r
28 import jp.sourceforge.jindolf.corelib.PeriodType;
\r
32 * 生XHTMLデータおよびログファイルへのアクセス諸々。
\r
34 public final class FileArchive{
\r
36 private static final Pattern LINE_PATTERN;
\r
37 private static final DateFormat ISO_FORMAT;
\r
41 "(jin_([^_]+)_(\\d+)_(\\d+)_"
\r
42 +"(?:(prologue)|(progress)|(epilogue))"
\r
44 LINE_PATTERN = Pattern.compile(
\r
45 "^" + fnameRegex + "\\s+(\\S+)\\s+(\\S+)\\s+(\\d)" + "$");
\r
48 new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.JAPAN);
\r
52 * ISO形式の日付時刻情報をパースする。
\r
56 public static long parseISODate(String text){
\r
59 synchronized(ISO_FORMAT){
\r
60 date = ISO_FORMAT.parse(text);
\r
62 }catch(ParseException e){
\r
63 throw new IllegalArgumentException(e);
\r
65 return date.getTime();
\r
69 * ログ記述からリソース情報を生成する。
\r
70 * @param logLine 1行に納められたログ記述
\r
73 public static PeriodResource parseDownLogLine(CharSequence logLine){
\r
74 PeriodResource result;
\r
76 Matcher matcher = LINE_PATTERN.matcher(logLine);
\r
77 if( ! matcher.matches() ) throw new IllegalArgumentException();
\r
79 String fname = matcher.group(1);
\r
80 String landId = matcher.group(2);
\r
81 int villageId = Integer.parseInt(matcher.group(3));
\r
82 int day = Integer.parseInt(matcher.group(4));
\r
84 PeriodType periodType;
\r
85 if (matcher.start(5) >= 0) periodType = PeriodType.PROLOGUE;
\r
86 else if(matcher.start(6) >= 0) periodType = PeriodType.PROGRESS;
\r
87 else if(matcher.start(7) >= 0) periodType = PeriodType.EPILOGUE;
\r
88 else throw new IllegalArgumentException();
\r
90 String uriText = matcher.group(8);
\r
91 String dateText = matcher.group(9);
\r
92 int hasError = Integer.parseInt(matcher.group(10));
\r
93 if(hasError != 0) throw new IllegalArgumentException();
\r
95 long dateMs = parseISODate(dateText);
\r
97 if(landId.equals("wolf0")) landId = "wolf";
\r
98 if(landId.equals("wolf1")) landId = "wolf0";
\r
99 LandDef landDef = JinArchiver.getLandDef(landId);
\r
101 File file = new File(fname);
\r
102 URI fileUri = file.toURI();
\r
105 fileUrl = fileUri.toURL();
\r
106 }catch(MalformedURLException e){
\r
107 throw new IllegalArgumentException(e);
\r
110 result = new PeriodResource(landDef,
\r
122 * ログファイルからリソース列を抽出する。
\r
123 * @param reader ログファイルの内容
\r
125 * @throws IOException 入力エラー
\r
127 public static List<PeriodResource> parseDownList(LineNumberReader reader)
\r
128 throws IOException{
\r
129 List<PeriodResource> result = new LinkedList<PeriodResource>();
\r
132 String line = reader.readLine();
\r
133 if(line == null) break;
\r
134 PeriodResource info = parseDownLogLine(line);
\r
136 throw new IllegalArgumentException();
\r
145 * ログファイルからリソース列を抽出する。
\r
146 * @param istream ログファイルの内容
\r
148 * @throws IOException 入力エラー
\r
150 public static List<PeriodResource> parseDownloadLog(InputStream istream)
\r
151 throws IOException{
\r
152 Reader reader = new InputStreamReader(istream, "US-ASCII");
\r
153 LineNumberReader lineReader = new LineNumberReader(reader);
\r
154 List<PeriodResource> result = parseDownList(lineReader);
\r
155 lineReader.close();
\r
162 private FileArchive(){
\r