OSDN Git Service

Maven3対応。
[jindolf/Jindolf.git] / src / main / java / jp / sfjp / jindolf / net / AccountCookie.java
1 /*
2  * account cookie
3  *
4  * License : The MIT License
5  * Copyright(c) 2008 olyutorskii
6  */
7
8 package jp.sfjp.jindolf.net;
9
10 import java.net.HttpURLConnection;
11 import java.net.URI;
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;
21
22 /**
23  * 人狼BBSアカウント管理用のCookie。
24  * JRE1.6 HttpCookie の代用品。
25  */
26 class AccountCookie{          // TODO JRE 1.6対応とともにHttpCookieへ移行予定
27
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;
31
32     static{
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);
59
60         FORMAT = new SimpleDateFormat(DATE_FORM, Locale.JAPAN);
61         FORMAT.setCalendar(calendar);
62         FORMAT.setTimeZone(zoneGMT);
63         FORMAT.setDateFormatSymbols(customSyms);
64         FORMAT.setLenient(true);
65     }
66
67     private final String loginData;
68     private final URI pathURI;
69     private final Date expireDate;
70
71     /**
72      * 認証クッキーの生成。
73      * @param loginData 認証データ
74      * @param path Cookieパス
75      * @param expireDate expire日付
76      * @throws java.lang.NullPointerException 引数がnull
77      * @throws java.lang.IllegalArgumentException パスが変
78      */
79     public AccountCookie(String loginData, String path, Date expireDate)
80             throws NullPointerException, IllegalArgumentException{
81         super();
82
83         if(loginData == null || path == null || expireDate == null){
84             throw new NullPointerException();
85         }
86
87         this.loginData = loginData;
88         try{
89             this.pathURI = new URI(path);
90         }catch(URISyntaxException e){
91             throw new IllegalArgumentException(path, e);
92         }
93         this.expireDate = expireDate;
94
95         return;
96     }
97
98     /**
99      * Cookie期限が切れてないか判定する。
100      * @return 期限が切れていたらtrue
101      */
102     public boolean hasExpired(){
103         long nowMs = System.currentTimeMillis();
104         long expireMs = this.expireDate.getTime();
105         if(expireMs < nowMs) return true;
106         return false;
107     }
108
109     /**
110      * Cookieパスを返す。
111      * @return Cookieパス
112      */
113     public URI getPathURI(){
114         return this.pathURI;
115     }
116
117     /**
118      * 認証データを返す。
119      * @return 認証データ
120      */
121     public String getLoginData(){
122         return this.loginData;
123     }
124
125     /**
126      * 認証Cookieを抽出する。
127      * @param cookieSource HTTPヘッダ 「Cookie=」の値
128      * @return 認証Cookie
129      */
130     public static AccountCookie createCookie(String cookieSource){
131         String[] cookieParts = cookieSource.split("; ");
132         if(cookieParts.length <= 0) return null;
133
134         String login = null;
135         String path = 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];
143
144             if(name.equals("login")){
145                 login = value;
146             }else if(name.equals("path")){
147                 path = value;
148             }else if(name.equals("expires")){
149                 expires = value;
150             }
151         }
152         if(login == null || path == null || expires == null) return null;
153
154         Date date;
155         try{
156             date = FORMAT.parse(expires);
157         }catch(ParseException e){
158             return null;
159         }
160
161         AccountCookie cookie = new AccountCookie(login, path, date);
162
163         return cookie;
164     }
165
166     /**
167      * 認証Cookieを抽出する。
168      * @param connection HTTP接続
169      * @return 認証Cookie
170      */
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);
175         return cookie;
176     }
177
178     /**
179      * 認証Cookieの文字列表記。
180      * @return String文字列
181      */
182     @Override
183     public String toString(){
184         return this.loginData;
185     }
186
187 }