Java を使用した添付ファイルの処理 (1)

ドミノのサーバーエージェントで添付ファイルを処理するやり方をまとめてみました。
以前もこちらで簡単に紹介したことがあったのですが、今回はまとめて、読み込み処理を行うエージェントと書き出し処理を行うエージェントの2つを書いてみました。

読み込み処理を行うエージェントの内容ですが、IFS上の PCファイル (ネットワークドライブ経由でコピー/FTP で BIN モードでコピー、などで作成されたものとします)をノーツ文書に読み込む/添付ファイルとして保管する、という処理を行います。

書き出し処理を行うエージェントはノーツ文書にある添付ファイル(複数でも可)を、指定されたディレクトリに添付ファイルと同じ名前で書き出す、という処理を行います。確認のために再度読み込んで、内容をノーツ文書に読み込む、という処理を行っていますが、この処理の流れも応用できるでしょう。

テスト用のテキストファイル

読み込み用

PC上で作成した、読み込み処理エージェント用のテキストファイルです。
これを IFS 上にそのまま置いて使用します。

書き出し用

PC上で作成した、書き出し処理エージェント用のテキストファイルです。
これをノーツデータベースのテスト文書の中のリッチテキストフィールドに添付ファイルとして保管します。

こちらは同様に作成された、2つめの添付ファイル用のテキストファイルです。

テスト用のデータベース

テスト用にノーツデータベースを作成しました。

Master フォーム

テスト用のデータを参照するマスター文書用として、読み込むファイル名を指定するためのテキストフィールド、書き出し先のディレクトリ名を指定するテキストフィールド、読み込んで書き出す添付ファイルが保管されるリッチテキストフィールドの 3つのフィールドを持ったフォームを作成しています。(Master という名前にしました)

AttachForm フォーム

読み込み処理用のエージェントが結果を書き込む文書用に、読み込んだファイル名とそのファイルを添付するためのリッチテキストフィールドを持ったフォームを作成しています。(AttachForm という名前にしました)

DetachForm フォーム

書き込み処理用のエージェントの書き出し先のファイル名を記録するフィールドと、書き出し中のデータと再読み込みのデータを記録するためのフィールドを持ったフォームを作成しています。(DetachForm という名前にしました)

それぞれのフォームを作成した結果です。

All ビュー

エージェントからアクセスするためのビューを作成しています。作るのが面倒なので「無題」を「All」に名前変更しました。

エージェント

読み出し処理用に Attach というエージェント、書き出し処理用に Detach というエージェントを作成しています。

Attach エージェントの内容です。

import lotus.domino.*;
import java.util.*;
import java.io.*;

public class JavaAgent extends AgentBase {

public void NotesMain() {

StringBuffer statusMessage = new StringBuffer();

try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)
Database database = agentContext.getCurrentDatabase();
View view = database.getView("All");
Document doc = view.getFirstDocument();
String filename = doc.getItemValueString("FileName");
System.out.println("サーバー上のファイル: " + filename + " を読み込み");
File file = new File(filename);
InputStreamReader filereader = new InputStreamReader(new FileInputStream(file), "MS932");
BufferedReader bufferedreader = new BufferedReader(filereader);
statusMessage.append("[読み出し時のファイル " + filename + " の内容]: ");

String line = null;
while((line = bufferedreader.readLine()) != null) {
System.out.println("内容: " + line);
statusMessage.append(line);
}

System.out.println("サーバー上のファイル: " + filename + " を添付");
Document newdoc = database.createDocument();
newdoc.replaceItemValue("Form", "AttachForm");
newdoc.replaceItemValue("FileName", filename);
RichTextItem body = newdoc.createRichTextItem("Body");
body.embedObject(EmbeddedObject.EMBED_ATTACHMENT, null, filename, null);
body.addNewLine(1);
body.appendText(statusMessage.toString());
newdoc.save(true, true);

newdoc.recycle();
doc.recycle();

} catch(Exception e) {
e.printStackTrace();
}
}
}

Detach エージェントの内容です。

import lotus.domino.*;
import java.util.*;
import java.io.*;

public class JavaAgent extends AgentBase {

public void NotesMain() {

String filename = null;

try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)
Database database = agentContext.getCurrentDatabase();
View view = database.getView("All");
Document doc = view.getFirstDocument();
RichTextItem rtitem = (RichTextItem)doc.getFirstItem("Body");

Vector v = rtitem.getEmbeddedObjects();
Enumeration e = v.elements();
while (e.hasMoreElements()) {
EmbeddedObject eo = (EmbeddedObject)e.nextElement();
System.out.println("添付オブジェクト名: " + eo.getName());

String type = null;
switch (eo.getType()) {
case EmbeddedObject.EMBED_ATTACHMENT :
type = "file attachment";
break;
case EmbeddedObject.EMBED_OBJECT :
type = "embedded object";
break;
case EmbeddedObject.EMBED_OBJECTLINK :
type = "object link";
}

System.out.println("タイプ: " + type);
if (type.equals("file attachment"))
try {
BufferedReader reader = new BufferedReader(eo.getReader());
filename = doc.getItemValueString("ExtractDir") + eo.getSource();
PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(filename)));
StringBuffer statusMessage = new StringBuffer();
String line;
while((line = reader.readLine()) != null) {
writer.println(line);
statusMessage.append(line + " ");
}
reader.close();
writer.close();
System.out.println("サーバー上にファイル: " + filename + " を書き出し");
System.out.println("サーバー上のファイル: " + filename + " を読み出し");
Document newdoc = database.createDocument();
newdoc(newdoc, filename, statusMessage);
}
catch (IOException ie) {
ie.printStackTrace();
}
}

doc.recycle();

} catch(Exception e) {
e.printStackTrace();
}
}

private void newdoc(Document newdoc, String filename, StringBuffer statusMessage) {
try {
newdoc.replaceItemValue("Form", "DetachForm");
newdoc.replaceItemValue("ExtractDir", filename);
RichTextItem body = newdoc.createRichTextItem("Body");

System.out.println("サーバー上に書き出したファイル: " + filename + " を読み込み");
File file = new File(filename);
InputStreamReader filereader = new InputStreamReader(new FileInputStream(file), "MS932");
BufferedReader bufferedreader = new BufferedReader(filereader);
body.appendText("[書き出し時のファイル " + filename + " の内容]: ");
body.appendText(statusMessage.toString());

String line;
body.addNewLine(1);
body.appendText("[書き出したファイル " + filename + " の再読み込みの内容]: ");
while((line = bufferedreader.readLine()) != null) {
System.out.println("内容: " + line);
body.appendText(line);
body.addNewLine(0);
}
statusMessage = null;
newdoc.save(true, true);
newdoc.recycle();
} catch(Exception e) {
e.printStackTrace();
}
}
}

実行した結果はこちらに載せました。

[Top Pageに戻る]

Ads by TOK2