- 次のエージェントは InputSource、InputStream、Reader から XML データを読み取り、その XML データを解析し指定したスタイルシートを使用して変換します。
import lotus.domino.*;
import java.io.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session s = getSession();
AgentContext agentContext = s.getAgentContext();
Database db = agentContext.getCurrentDatabase();
if (db == null)
db = s.getDatabase("", "xml.nsf", true);
if (db == null){
System.out.println("db xml.nsf is not found!");
return;
}
// (Your code goes here)
dopart1(s, db);
dopart2(s, db);
} catch(Exception e) {
e.printStackTrace();
}
}
public void dopart2(Session s, Database db)
throws Exception
{
for (int i=0; i<2; i++)
{
if (i==0) s.setConvertMIME(false);
else if (i==1) s.setConvertMIME(true);
if (s.isConvertMIME())
System.out.println("isConvertMIME = true");
else System.out.println("isConvertMime = false");
View view = db.getView("MIMEData");
Document doc = view.getFirstDocument();
while (doc != null)
{
String name = doc.getFirstItem("Subject").getText();
System.out.println(name);
try
{
System.out.println(" Body");
Item it = doc.getFirstItem("Body");
MIMEEntity me = it.getMIMEEntity();
if (me != null)
{
java.io.InputStream is = me.getInputStream();
if (is != null)
{
DataInputStream dis = new DataInputStream(is);
System.out.println(
" MIMEEntity Stream from InputStream - "
+ dis.readLine());
}
else
System.out.println(" No MIMEEntity InputStream ");
org.w3c.dom.Document domdoc = me.parseXML(false);
if (domdoc == null)
System.out.println("MIMEEntity.parseXML failed.");
else
System.out.println(
"MIMEEntity.parseXML succeeded.");
me.recycle();
}
else if (it instanceof RichTextItem)
{
RichTextItem rit = (RichTextItem) it;
java.util.Vector objs = rit.getEmbeddedObjects();
if ((objs != null) && (objs.size() > 0))
{
EmbeddedObject em = (EmbeddedObject)
objs.firstElement();
org.w3c.dom.Document domdoc =
em.parseXML(false);
em.recycle();
}
else
{
// Getting reader from RichTextItem
Reader rd = rit.getReader();
try {
char[] buff = new char [50];
rd.read(buff,0,40);
System.out.println(
"GetReader from RTItem: " + buff );
}catch (Exception e) {
System.out.println(
"Exception while opening items InputStream"
+ e);
}
org.w3c.dom.Document domdoc =
it.parseXML(false);
}
}
else
{
org.w3c.dom.Document domdoc = it.parseXML(false);
}
it.recycle();
}catch (Exception e){
e.printStackTrace();
}
{
Document tmpdoc = view.getNextDocument(doc);
doc.recycle();
doc = tmpdoc;
}
}
}
}
public void dopart1(Session s, Database db)
throws Exception
{
View view = db.getView("OtherData");
Document doc = view.getFirstDocument();
while (doc != null)
{
String name = doc.getFirstItem("Name").getText();
System.out.println(name);
try {
System.out.println(" TextBody");
Item it = doc.getFirstItem("TextBody");
org.w3c.dom.Document domdoc = it.parseXML(false);
} catch (Exception e){
e.printStackTrace();
}
try {
System.out.println(" RichTextBody");
Item it = doc.getFirstItem("RichTextBody");
org.w3c.dom.Document domdoc = it.parseXML(false);
it.recycle();
} catch (Exception e){
e.printStackTrace();
}
try {
System.out.println(" EmbBody");
Item it = doc.getFirstItem("EmbBody");
if (it instanceof RichTextItem)
{
RichTextItem rit = (RichTextItem) it;
EmbeddedObject em = rit.getEmbeddedObject(name);
org.w3c.dom.Document domdoc = em.parseXML(false);
em.recycle();
rit.recycle();
}
else
System.out.println("Not richtext!");
it.recycle();
} catch (Exception e){
e.printStackTrace();
}
try {
System.out.println(" Attachment");
EmbeddedObject em = doc.getAttachment(name);
org.xml.sax.InputSource is = em.getInputSource();
if (is != null)
System.out.println(
" System ID from Attachment InputSource - "
+ is.getSystemId());
else
System.out.println(" No Attachment InputSource! " );
org.w3c.dom.Document domdoc = em.parseXML(false);
em.recycle();
} catch (Exception e){
e.printStackTrace();
}
try {
Item StyleName = doc.getFirstItem("UseStyle");
if ((StyleName != null) &&
(! (StyleName.getText().equals(""))))
{
System.out.println(
" UseStyle(" + StyleName.getText() + ")");
Item xml = doc.getFirstItem("TextBody");
if (xml == null) System.out.println(
"xml is null!");
Document StyleDoc =
view.getDocumentByKey(StyleName.getText());
if (StyleDoc == null)
System.out.println("Style doc not found!");
else
{
Item xsl = StyleDoc.getFirstItem("TextBody");
if (xsl == null) System.out.println(
"xsl is null!");
XSLTResultTarget out = new XSLTResultTarget();
out.setFileName(name + "_" +
StyleName.getText() + ".out");
xml.transformXML(xsl, out);
}
xml.recycle();
StyleDoc.recycle();
StyleName.recycle();
}
} catch (Exception e){
e.printStackTrace();
}
doc = view.getNextDocument(doc);
}
}
}
- 次の WebQuerySave エージェントは、カレント文書を取得し、generateXML メソッドを使用して XML 文書を生成します。XML 文書はインクルードした XSL スタイルシートでスタイル付けします。最終的に生成された XML 文書を添付したメールメッセージをメールインデータベース「Book Orders」に送信します。
import lotus.domino.*;
import org.xml.sax.InputSource;
import java.io.*;
public class JavaAgent extends AgentBase {
public void NotesMain()
{
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Database db = agentContext.getCurrentDatabase();
Document order = agentContext.getDocumentContext();
Document msg = db.createDocument();
msg.appendItemValue("Form", "Memo");
msg.appendItemValue("Subject", "Got an order!");
RichTextItem body = msg.createRichTextItem("Body");
InputSource style = new
InputSource(new StringReader(promote_xsl));
StringWriter resultWriter = new StringWriter();
XSLTResultTarget result =
new XSLTResultTarget(resultWriter);
order.generateXML(style, result);
body.appendText(resultWriter.toString());
msg.send("Book Orders");
// This agent is run at the end of handling a form, so we
// have to specify the HTML to display next.
getAgentOutput().println(
"<head><title>Thank you</title><h2>" +
"Thank you for your order!</h2>");
getAgentOutput().println(
"<p><b><a onClick='self.close()' "href='#'>" +
"Click here to close this window.</a></b></p>");
} catch(Exception e) {
e.printStackTrace();
}
}
// Promote.xsl:
// Turn DXL document into simple XML
// A document is turned into an XML element named after the Form.
// Each item becomes a child element named after the item.
private String promote_xsl =
"<?xml version='1.0'?>"+
"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'"+
"version='1.0'>"+
"<xsl:template match='document'>"+
" <xsl:element name='{translate(@form,¥" ¥", ¥"¥")}'>"+
" <xsl:for-each select='item'>"+
" <xsl:choose>"+
" <!-- Items whose names have dollars are skipped -->"+
" <xsl:when test='contains(@name, ¥"$¥")'/>"+
" <!-- Items named SaveOptions are skipped -->"+
" <xsl:when test='@name=¥"SaveOptions¥"'/>"+
" <!-- Items starting with 'dsp' are skipped -->"+
" <xsl:when test='starts-with(@name, ¥"dsp¥")'/>"+
" <xsl:otherwise>"+
" <xsl:element name='{@name}'>"+
" <xsl:value-of select='*'/>"+
" </xsl:element>"+
" </xsl:otherwise>"+
" </xsl:choose>"+
" </xsl:for-each>"+
" </xsl:element>"+
"</xsl:template>"+
"</xsl:stylesheet>¥n";
}
- 次のエージェントは新規のメールが受信されると実行されます。メールのボディを解析し、XML データから文書とアイテムを生成します。
import lotus.domino.*;
import org.w3c.dom.*;
public class JavaAgent extends AgentBase {
public void NotesMain()
{
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
lotus.domino.Document inDoc =
agentContext.getDocumentContext();
// Parse the XML body of the mail message.
RichTextItem inBody = (RichTextItem)
inDoc.getFirstItem("Body");
org.w3c.dom.Document inDom = inBody.parseXML(false);
// Call the item shredder and Save the result
shredXML(inDom.getDocumentElement(), inDoc);
inDoc.save();
} catch (Exception e) {
if (e instanceof NotesException)
{
System.err.println(((NotesException)e).text);
}
e.printStackTrace();
}
}
//Convert an XML DOM tree into a set of items on a document.
// Each child of the given Node is turned into an item named
// after the element.
private void shredXML(Node n, lotus.domino.Document doc)
throws lotus.domino.NotesException
{
for(Children cTop = new Children(n); cTop.hasMoreNodes(); ) {
Node node = cTop.nextChild();
if (node.getNodeType() == Node.ELEMENT_NODE) {
doc.appendItemValue(node.getNodeName(),
getChildrenText(node));
}
}
}
// A DOM helper method to collect up all of the text content
// for a node. All of the children (and children of children,
// and ...) are examined, and all of the text is concatenated
// together.
private String getChildrenText(Node n)
{
String text = "";
for(Children c = new Children(n); c.hasMoreNodes(); ) {
Node child = c.nextChild();
switch (child.getNodeType()) {
case Node.DOCUMENT_NODE:
case Node.ELEMENT_NODE:
// For an element or document root, recur on the children
// of the node.
text += getChildrenText(child);
break;
case Node.TEXT_NODE:
case Node.CDATA_SECTION_NODE:
// For text content or CDATA nodes, append the content.
text += child.getNodeValue();
break;
}
}
return text;
}
}
// A helper class for the DOM: an iterator over the children
// of a node.
import org.w3c.dom.*;
public class Children {
private NodeList nodelist;
private int i;
private int numChildren;
// Construct a Children from a Node.
public Children(Node n)
{
nodelist = n.getChildNodes();
if (nodelist == null) {
numChildren = 0;
}
else {
numChildren = nodelist.getLength();
}
i = 0;
}
// Are there any more children, or have we used them all?
public boolean hasMoreNodes()
{
return i < numChildren;
}
// Return the next child.
public Node nextChild()
{
if (i >= numChildren) {
return null;
}
return nodelist.item(i++);
}
}