| 1 |
TODO |
| 2 |
|
| 3 |
でかいファイルをgetした後のisFileとかisDirectoryとかのリクエストが |
| 4 |
失敗するみたい。何回かsyncすれば問題ないが、プログラム的には問題 |
| 5 |
あり。 |
| 6 |
|
| 7 |
syncでlocalのフォルダが削除されるべき時に |
| 8 |
削除されない. |
| 9 |
|
| 10 |
putとかgetでExceptionが発生すると,何のファイルでエラーなのか |
| 11 |
わからないので,表示するようにする. |
| 12 |
|
| 13 |
大量にデータが保存されているフォルダの中に,さらに |
| 14 |
新しいフォルダを付け加えるという作業を行う場合 |
| 15 |
その付け加えるフォルダの内容が少ないものであったとしても |
| 16 |
大量の同期が必要になるので,ちょっと工夫するべし. |
| 17 |
|
| 18 |
サーバで,状態の変更が起った時もgetが実行されてしまうのだが, |
| 19 |
これはいいことなのかどうか? |
| 20 |
|
| 21 |
以下2点は変更してみたが,要チェック |
| 22 |
|
| 23 |
フォルダはコンフリクト関係ないので無視するようにするべし. |
| 24 |
|
| 25 |
コンフリクトの表示の後,もう一度Syncするとコンフリクトが無視 |
| 26 |
されるっぽい.要調査. |
| 27 |
|
| 28 |
---------------------------------------------------------------------- |
| 29 |
|
| 30 |
* <http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/net/http-auth.html> |
| 31 |
|
| 32 |
以前にやってみたんだっけ?もういちど試してみるべし.それと |
| 33 |
これを使えばKerberosも行けるのか? |
| 34 |
|
| 35 |
* <http://x68000.q-e-d.net/~68user/net/sample/HttpClientHttpURLConnectionAuth.java> |
| 36 |
|
| 37 |
import java.net.*; |
| 38 |
import java.io.*; |
| 39 |
import java.util.*; |
| 40 |
|
| 41 |
/** |
| 42 |
* Java HTTP クライアントサンプル - HttpURLConnection + 認証編 - |
| 43 |
* |
| 44 |
* @author 68user http://X68000.q-e-d.net/~68user/ |
| 45 |
*/ |
| 46 |
public class HttpClientHttpURLConnectionAuth { |
| 47 |
public static void main(String[] args) |
| 48 |
throws MalformedURLException, ProtocolException, IOException { |
| 49 |
|
| 50 |
URL url = new URL("http://X68000.q-e-d.net/~68user/net/sample/http-auth/secret.html"); |
| 51 |
//URL url = new URL("http://X68000.q-e-d.net/~68user/net/sample/http-auth-digest/secret.html"); |
| 52 |
String username = "hoge"; |
| 53 |
String password = "fuga"; |
| 54 |
|
| 55 |
HttpAuthenticator http_authenticator = new HttpAuthenticator(username, password); |
| 56 |
Authenticator.setDefault(http_authenticator); |
| 57 |
|
| 58 |
HttpURLConnection urlconn = (HttpURLConnection)url.openConnection(); |
| 59 |
urlconn.setRequestMethod("GET"); |
| 60 |
urlconn.setInstanceFollowRedirects(false); |
| 61 |
urlconn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3"); |
| 62 |
|
| 63 |
urlconn.connect(); |
| 64 |
|
| 65 |
Map headers = urlconn.getHeaderFields(); |
| 66 |
Iterator it = headers.keySet().iterator(); |
| 67 |
System.out.println("レスポンスヘッダ:"); |
| 68 |
while (it.hasNext()){ |
| 69 |
String key= (String)it.next(); |
| 70 |
System.out.println(" " + key + ": " + headers.get(key)); |
| 71 |
} |
| 72 |
|
| 73 |
System.out.println |
| 74 |
("レスポンスコード[" + urlconn.getResponseCode() + "] " + |
| 75 |
"レスポンスメッセージ[" + urlconn.getResponseMessage() + "]"); |
| 76 |
System.out.println |
| 77 |
("プロンプト(realm)[" + http_authenticator.myGetRequestingPrompt() + "]"); |
| 78 |
System.out.println("\n---- ボディ ----"); |
| 79 |
|
| 80 |
|
| 81 |
BufferedReader reader = |
| 82 |
new BufferedReader(new InputStreamReader(urlconn.getInputStream())); |
| 83 |
|
| 84 |
while (true){ |
| 85 |
String line = reader.readLine(); |
| 86 |
if ( line == null ){ |
| 87 |
break; |
| 88 |
} |
| 89 |
System.out.println(line); |
| 90 |
} |
| 91 |
|
| 92 |
reader.close(); |
| 93 |
urlconn.disconnect(); |
| 94 |
} |
| 95 |
} |
| 96 |
|
| 97 |
class HttpAuthenticator extends Authenticator { |
| 98 |
private String username; |
| 99 |
private String password; |
| 100 |
public HttpAuthenticator(String username, String password){ |
| 101 |
this.username = username; |
| 102 |
this.password = password; |
| 103 |
} |
| 104 |
protected PasswordAuthentication getPasswordAuthentication(){ |
| 105 |
return new |
| 106 |
PasswordAuthentication(username, password.toCharArray()); |
| 107 |
} |
| 108 |
public String myGetRequestingPrompt(){ |
| 109 |
return super.getRequestingPrompt(); |
| 110 |
} |
| 111 |
} |
| 112 |
|
| 113 |
---------------------------------------------------------------------- |
| 114 |
|
| 115 |
以下、ファイルとフォルダの両方をまとめて対象と呼ぶことにする。 |
| 116 |
|
| 117 |
entriesファイルに保存されている対象の状態と時間の意味 |
| 118 |
SYNCED : 同期。以前同期を取ったことがある。 |
| 119 |
時間は同期した時間。 |
| 120 |
ADDED : 追加。クライアントで追加されており、まだサーバと同期してない。 |
| 121 |
時間はaddした時間 |
| 122 |
REMOVED : 削除。クライアントで削除されており、まだサーバと同期してない。 |
| 123 |
時間はremoveした時間 |
| 124 |
CONFLICT : 衝突。同期を取ろうとしたが、衝突したので保留している。 |
| 125 |
時間は同期しようとした時間 |
| 126 |
ABANDON : 放棄。ローカルの対象をサーバの対象で上書きしたい状態。 |
| 127 |
この状態はconflictが検出された後に、それをどのように |
| 128 |
解決するかユーザが指定する時に設定される。 |
| 129 |
時間はユーザがabandonに指定した時間。 |
| 130 |
FORCED : 強制。サーバの対象をローカルの対象で上書きしたい状態。 |
| 131 |
この状態はconflictが検出された後に、それをどのように |
| 132 |
解決するかユーザが指定する時に設定される。 |
| 133 |
時間はユーザがforcedに指定した時間。 |
| 134 |
NONE : これは実際にはentriesファイルに記述される状態ではなく、 |
| 135 |
記述されていないということを表す状態。 |
| 136 |
補足: |
| 137 |
クライアントでは、削除されて同期された対象は完全に消滅する。 |
| 138 |
つまり、状態というものも存在せず(noneになる)、以前その対象が |
| 139 |
存在していた記録もなくなってしまう。ただ、削除された対象の名前と |
| 140 |
削除された時のタイムスタンプがサーバには保存されている。しかし、 |
| 141 |
サーバではクライアントで指定できるような状態は保持していない |
| 142 |
(必要ないから)。 |
| 143 |
|
| 144 |
同期のプロセスを制御するためのフラグ |
| 145 |
recursiveF : 再帰的に同期させる |
| 146 |
デフォルトはfalse |
| 147 |
addF : addされていないファイルを探してaddする |
| 148 |
デフォルトはfalse |
| 149 |
removeF : removeされていないファイルを探してremoveする |
| 150 |
デフォルトはfalse |
| 151 |
prudenceF : 慎重を期して、削除は行なわないことにする。 |
| 152 |
デフォルトはfalse |
| 153 |
confirmF : 削除する場合にはユーザに確認をする |
| 154 |
デフォルトはtrue |
| 155 |
|
| 156 |
syncのプロセス |
| 157 |
u1: オプションを解析してフラグを設定 |
| 158 |
設定するオプション:recursiveF,addF,removeF,prudenceF |
| 159 |
u2: カレントフォルダがcheckoutされたフォルダかチェック。 |
| 160 |
そうなってなければエラーを表示して終了。 |
| 161 |
u3: カレントフォルダに対応するフォルダがサーバにあるか |
| 162 |
チェック。なければエラーを表示して終了。 |
| 163 |
u4: カレントフォルダのLFile(lf)とそれに対応したPFile(pf)を |
| 164 |
作り、その2つに関連する全ての対象のリストを生成する。 |
| 165 |
(関連する全てのリストには、サーバに記録されて |
| 166 |
いる以前削除されたファイルも含まれる。) |
| 167 |
そのリストの一つ一つについて新しいlf,pfを作成し |
| 168 |
o1を呼出す。 |
| 169 |
u5: 終了 |
| 170 |
|
| 171 |
o1: スキップファイルならなにもせず正常終了 |
| 172 |
o2: lf.status==nullなのに存在していてaddF==true |
| 173 |
ならばlfをaddする |
| 174 |
o3: lf.statusがaddedかsyncedなのに存在しなくてremoveF==true |
| 175 |
ならばlfをremovedにする |
| 176 |
o4: 状況に応じて次の操作のどれか一つをする。 |
| 177 |
・コンフリクトの場合は表示してスキップ |
| 178 |
・両方とも削除されているのでなにもしない |
| 179 |
・タイプ不一致で警告表示 |
| 180 |
・サーバ側の削除+entryからの削除 |
| 181 |
・クライアント側の削除+entryからの削除 |
| 182 |
・FORCEDなのでput |
| 183 |
・ABANDONなのでget |
| 184 |
・conflictの処理 |
| 185 |
・putかget |
| 186 |
・フォルダ同期(u4と同じ) |
| 187 |
・その他はなにもしない(フラグの設定で操作をスキップする場合など) |
| 188 |
|
| 189 |
***** 以下未完 ***** |
| 190 |
|
| 191 |
updateのプロセス |
| 192 |
u0: 同期すべき対象がユーザから指定される。 |
| 193 |
対象が省略された場合は、カレントフォルダ。 |
| 194 |
対象は、ファイルでもフォルダでも可。 |
| 195 |
対象は複数指定することが可能。 |
| 196 |
対象はカレントフォルダ直下の物しか指定できない。 |
| 197 |
u1: recursiveF = true |
| 198 |
addF = false |
| 199 |
removeF = false |
| 200 |
prudenceF = false |
| 201 |
u2: カレントフォルダがcheckoutされたフォルダかチェック。 |
| 202 |
そうなってなければエラーを表示して終了。 |
| 203 |
u3: カレントフォルダに対応するフォルダがサーバにあるか |
| 204 |
チェック。なければエラーを表示して終了。 |
| 205 |
u4: ユーザから指定された対象を一個ずつループ { |
| 206 |
その対象のLFile(lf)とそれに対応したPFile(pf)を作り |
| 207 |
o1へ |
| 208 |
} |
| 209 |
ループが終了したらおしまい |
| 210 |
|
| 211 |
o1: |