ホソカワ@お久しぶりです。
on 00.10.24 4:43 PM, tetsuya@....jp at tetsuya@....jp wrote:
> 栗原です。
>
> あまりに停滞させておくと忘れ去られそうなので、昨日の夜
> スクラッチで作ってみました。
>
> jp.co.esm.wiki.extremedomo.message.MessageParser
> ヘッダー部とボディ部の分割を行う
>
> jp.co.esm.wiki.extremedomo.message.HeaderParts
> ヘッダー部を解析して、コレクション化する
>
> jp.co.esm.wiki.extremedomo.message.HeaderField
> 個々のヘッダー情報をあらわす
>
> jp.co.esm.wiki.extremedomo.message.MessageException
> ラップ例外
>
> 以下、ソースコード(長いです。)
> 幅も長かったりしますm(_ _)m
>
> /*
> * $Id$
> */
> package jp.co.esm.wiki.extremedomo.message;
>
> import java.io.*;
>
> public class MessageParser {
> public MessageParser(byte[] msg) {
> message = msg;
> }
> public void parse()
> throws MessageException {
>
> setHeaderParts();
> setBodyPart();
> }
> public HeaderParts getHeaderParts() {
> return headerParts;
> }
> public String getBodyPart() {
> return bodyPart;
> }
> private void setHeaderParts()
> throws MessageException {
>
> headerParts = new HeaderParts(message);
> }
> private void setBodyPart()
> throws MessageException {
>
> BufferedReader bufIn = null;
> try {
> bufIn = new BufferedReader(
> new InputStreamReader(
> new ByteArrayInputStream(message)));
>
> while (true) {
> String line = bufIn.readLine();
> if (line == null)
> return;
>
> if (line.length() == 0)
> break;
> }
>
> // It is not well reflected at the time
> // only of a new-line of the message last.
> StringBuffer buf = new StringBuffer(512);
> int count = 0;
> while (true) {
> String line = bufIn.readLine();
> if (line == null)
> break;
>
> if (count != 0)
> buf.append("\r\n");
>
> buf.append(line);
> count++;
> }
> bodyPart = buf.toString();
> } catch (IOException e) {
> throw new MessageException(e.toString());
> } finally {
> try {
> if (bufIn != null)
> bufIn.close();
> } catch (IOException e) {
> }
> }
> }
>
> private byte[] message;
>
> private HeaderParts headerParts;
> private String bodyPart;
> }
MessageParser を refactor させて頂きました。変更点は以下の通りです。
1. private 変数の宣言を前に持って来ました。
2. parse() メソッドをプライベートにし、コンストラクターから呼ぶようにしまし
た。コンストラクターに、throws ... を追加しました。(MessageParserTest の
testParse() メソッドから parser.parse(); をとる必要があります。)
3. skipHeader(...) メソッドを追加しました。
4. "\r\n" は、System から取得するようにしました。
「// It is ... 」で始まるコメントがよくわかりませんでしたが、だいじょうぶで
しょうか?
/*
* $Id$
*/
package jp.co.esm.wiki.extremedomo.message;
import java.io.*;
public class MessageParser {
private byte[] message;
private HeaderParts headerParts;
private String bodyPart;
private String lineSeparator;
public MessageParser(byte[] msg) throws MessageException {
message = msg;
lineSeparator = System.getProperty("line.separator");
parse();
}
public HeaderParts getHeaderParts() {
return headerParts;
}
public String getBodyPart() {
return bodyPart;
}
private void parse()
throws MessageException {
setHeaderParts();
setBodyPart();
}
private void setHeaderParts()
throws MessageException {
headerParts = new HeaderParts(message);
}
private void setBodyPart()
throws MessageException {
BufferedReader bufIn = null;
try {
bufIn = new BufferedReader(
new InputStreamReader(
new ByteArrayInputStream(message)));
skipHeader(bufIn);
// It is not well reflected at the time
// only of a new-line of the message last.
StringBuffer buf = new StringBuffer(512);
int count = 0;
while (true) {
String line = bufIn.readLine();
if (line == null)
break;
if (count != 0)
buf.append(lineSeparator);
buf.append(line);
count++;
}
bodyPart = buf.toString();
} catch (IOException e) {
throw new MessageException(e.toString());
} finally {
try {
if (bufIn != null)
bufIn.close();
} catch (IOException e) {
}
}
}
private skipHeader(BufferedReader bufIn) throws MessageException {
try {
while (true) {
String line = bufIn.readLine();
if (line == null)
return;
if (line.length() == 0)
break;
}
} catch (IOException e) {
throw new MessageException(e.toString());
}
}
}
--
Kaoru Hosokawa
khosokawa@....com