XML FOR DOMINO
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); } } }
2. This WebQuerySave agent takes the current document, uses the generateXML method to create an XML document, styles it with the included XSL stylesheet, and sends a mail message to a mail-in database named "Book Orders" with the resulting XML.
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"; }
3. This agent runs when new mail arrives. It parses the body of the mail message to create a document and items from the XML data.
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++); } }