4 * License : The MIT License
5 * Copyright(c) 2008 olyutorskii
8 package jp.sfjp.jindolf.net;
10 import java.net.HttpURLConnection;
12 import java.net.URISyntaxException;
13 import java.text.DateFormatSymbols;
14 import java.text.ParseException;
15 import java.text.SimpleDateFormat;
16 import java.util.Calendar;
17 import java.util.Date;
18 import java.util.GregorianCalendar;
19 import java.util.Locale;
20 import java.util.TimeZone;
23 * 人狼BBSアカウント管理用のCookie。
24 * JRE1.6 HttpCookie の代用品。
26 class AccountCookie{ // TODO JRE 1.6対応とともにHttpCookieへ移行予定
28 // 人狼BBSのCookie期限表記例: 「Thu, 26 Jun 2008 06:44:34 GMT」
29 private static final String DATE_FORM = "EEE, dd MMM yyyy HH:mm:ss z";
30 private static final SimpleDateFormat FORMAT;
33 Calendar calendar = new GregorianCalendar();
34 TimeZone zoneGMT = TimeZone.getTimeZone("GMT");
35 DateFormatSymbols customSyms = new DateFormatSymbols();
36 String[] sweekdays = customSyms.getShortWeekdays();
37 sweekdays[Calendar.SUNDAY] = "Sun";
38 sweekdays[Calendar.MONDAY] = "Mon";
39 sweekdays[Calendar.TUESDAY] = "Tue";
40 sweekdays[Calendar.WEDNESDAY] = "Wed";
41 sweekdays[Calendar.THURSDAY] = "Thu";
42 sweekdays[Calendar.FRIDAY] = "Fri";
43 sweekdays[Calendar.SATURDAY] = "Sat";
44 customSyms.setShortWeekdays(sweekdays);
45 String[] months = customSyms.getShortMonths();
46 months[Calendar.JANUARY] = "Jan";
47 months[Calendar.FEBRUARY] = "Feb";
48 months[Calendar.MARCH] = "Mar";
49 months[Calendar.APRIL] = "Apr";
50 months[Calendar.MAY] = "May";
51 months[Calendar.JUNE] = "Jun";
52 months[Calendar.JULY] = "Jul";
53 months[Calendar.AUGUST] = "Aug";
54 months[Calendar.SEPTEMBER] = "Sep";
55 months[Calendar.OCTOBER] = "Oct";
56 months[Calendar.NOVEMBER] = "Nov";
57 months[Calendar.DECEMBER] = "Dec";
58 customSyms.setShortMonths(months);
60 FORMAT = new SimpleDateFormat(DATE_FORM, Locale.JAPAN);
61 FORMAT.setCalendar(calendar);
62 FORMAT.setTimeZone(zoneGMT);
63 FORMAT.setDateFormatSymbols(customSyms);
64 FORMAT.setLenient(true);
67 private final String loginData;
68 private final URI pathURI;
69 private final Date expireDate;
73 * @param loginData 認証データ
74 * @param path Cookieパス
75 * @param expireDate expire日付
76 * @throws java.lang.NullPointerException 引数がnull
77 * @throws java.lang.IllegalArgumentException パスが変
79 public AccountCookie(String loginData, String path, Date expireDate)
80 throws NullPointerException, IllegalArgumentException{
83 if(loginData == null || path == null || expireDate == null){
84 throw new NullPointerException();
87 this.loginData = loginData;
89 this.pathURI = new URI(path);
90 }catch(URISyntaxException e){
91 throw new IllegalArgumentException(path, e);
93 this.expireDate = expireDate;
99 * Cookie期限が切れてないか判定する。
100 * @return 期限が切れていたらtrue
102 public boolean hasExpired(){
103 long nowMs = System.currentTimeMillis();
104 long expireMs = this.expireDate.getTime();
105 if(expireMs < nowMs) return true;
113 public URI getPathURI(){
121 public String getLoginData(){
122 return this.loginData;
127 * @param cookieSource HTTPヘッダ 「Cookie=」の値
130 public static AccountCookie createCookie(String cookieSource){
131 String[] cookieParts = cookieSource.split("; ");
132 if(cookieParts.length <= 0) return null;
136 String expires = null;
137 for(String part : cookieParts){
138 String[] nmval = part.split("=", 2);
139 if(nmval == null) continue;
140 if(nmval.length != 2) continue;
141 String name = nmval[0];
142 String value = nmval[1];
144 if(name.equals("login")){
146 }else if(name.equals("path")){
148 }else if(name.equals("expires")){
152 if(login == null || path == null || expires == null) return null;
156 date = FORMAT.parse(expires);
157 }catch(ParseException e){
161 AccountCookie cookie = new AccountCookie(login, path, date);
168 * @param connection HTTP接続
171 public static AccountCookie createCookie(HttpURLConnection connection){
172 String cookieHeader = connection.getHeaderField("Set-Cookie");
173 if(cookieHeader == null) return null;
174 AccountCookie cookie = createCookie(cookieHeader);
183 public String toString(){
184 return this.loginData;