You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by gd...@apache.org on 2004/11/19 16:21:23 UTC
svn commit: r105823 - in webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy: . axis2 axis2/om axis2/samples
Author: gdaniels
Date: Fri Nov 19 07:21:18 2004
New Revision: 105823
Added:
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/BasicSerializationContext.java
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/SerializationContext.java
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/TestWriting.java
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/om/
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/om/OMElement.java
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/om/OMWriter.java
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/samples/
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/samples/BaseWriter.java
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/samples/MTOMWriter.java
webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/readme.txt
Log:
Add simple MTOM-like example
Added: webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/BasicSerializationContext.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/BasicSerializationContext.java Fri Nov 19 07:21:18 2004
@@ -0,0 +1,12 @@
+package axis2;
+
+import axis2.om.OMWriter;
+
+/**
+ * SerializationContext placeholder.
+ */
+public class BasicSerializationContext implements SerializationContext {
+ public void serialize(Object obj, OMWriter writer) throws Exception {
+ writer.writeText(obj.toString());
+ }
+}
Added: webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/SerializationContext.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/SerializationContext.java Fri Nov 19 07:21:18 2004
@@ -0,0 +1,14 @@
+package axis2;
+
+import axis2.om.OMWriter;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: glen
+ * Date: Nov 19, 2004
+ * Time: 12:41:29 AM
+ * To change this template use File | Settings | File Templates.
+ */
+public interface SerializationContext {
+ void serialize(Object obj, OMWriter writer) throws Exception;
+}
Added: webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/TestWriting.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/TestWriting.java Fri Nov 19 07:21:18 2004
@@ -0,0 +1,33 @@
+package axis2;
+
+import axis2.om.OMElement;
+import axis2.samples.BaseWriter;
+import axis2.samples.MTOMWriter;
+
+import javax.activation.DataHandler;
+
+/**
+ * Simple test of MTOM-like writing. Create a toy OM hierarchy:
+ * <root>
+ * <child>{text content}</child>
+ * </root>
+ *
+ * Serialize the exact same OMElement with a BaseWriter and an
+ * MTOMWriter, to demonstrate the basic flow.
+ */
+public class TestWriting {
+ public static void main(String[] args) throws Exception {
+ SerializationContext sc = new BasicSerializationContext();
+ BaseWriter bw = new BaseWriter(System.out, sc);
+ OMElement root = new OMElement("root");
+ OMElement child = new OMElement("child");
+
+ DataHandler dh = new DataHandler("Hello there!", "text/plain");
+ child.setContent(dh);
+ root.addChild(child);
+ root.writeTo(bw);
+
+ MTOMWriter mw = new MTOMWriter(System.out, sc);
+ root.writeTo(mw);
+ }
+}
Added: webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/om/OMElement.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/om/OMElement.java Fri Nov 19 07:21:18 2004
@@ -0,0 +1,56 @@
+package axis2.om;
+
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+/**
+ * "Toy" OMElement class - uses simple String names, no QNames, no attributes.
+ */
+public class OMElement {
+ String name;
+ Object content;
+ List children;
+
+ public OMElement() {
+ }
+
+ public OMElement(String name) {
+ this.name = name;
+ }
+
+ public OMElement(String name, Object content) {
+ this.name = name;
+ this.content = content;
+ }
+
+ public void addChild(OMElement child) {
+ if (children == null) {
+ children = new ArrayList();
+ }
+ children.add(child);
+ }
+
+ public Object getContent() {
+ return content;
+ }
+
+ public void setContent(Object content) {
+ this.content = content;
+ }
+
+ public void writeTo(OMWriter writer) throws Exception {
+ writer.startElement(name);
+
+ if (content != null) {
+ writer.serialize(content);
+ } else if (children != null) {
+ for (Iterator i = children.iterator(); i.hasNext();) {
+ OMElement child = (OMElement) i.next();
+ child.writeTo(writer);
+ }
+ }
+
+ writer.endElement();
+ }
+}
Added: webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/om/OMWriter.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/om/OMWriter.java Fri Nov 19 07:21:18 2004
@@ -0,0 +1,14 @@
+package axis2.om;
+
+/**
+ * OMWriter interface
+ */
+public interface OMWriter {
+ void startElement(String name) throws Exception;
+
+ void endElement() throws Exception;
+
+ void writeText(String text) throws Exception;
+
+ void serialize(Object obj) throws Exception;
+}
Added: webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/samples/BaseWriter.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/samples/BaseWriter.java Fri Nov 19 07:21:18 2004
@@ -0,0 +1,79 @@
+package axis2.samples;
+
+import axis2.SerializationContext;
+import axis2.om.OMWriter;
+import org.apache.axis.utils.XMLUtils;
+
+import javax.activation.DataHandler;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.Stack;
+
+/**
+ * Basic XML writing implementation, which writes base64 for binary content
+ */
+public class BaseWriter implements OMWriter {
+ PrintWriter writer;
+ Stack openElements = new Stack();
+ SerializationContext serContext;
+
+ public BaseWriter(OutputStream os, SerializationContext serContext) {
+ this.serContext = serContext;
+ writer = new PrintWriter(os);
+ }
+
+ public void startElement(String name) {
+ writer.write("<");
+ writer.write(name);
+ writer.write(">");
+ openElements.push(name);
+ }
+
+ public void endElement() throws Exception {
+ String name = (String)openElements.pop();
+ writer.write("</");
+ writer.write(name);
+ writer.write(">");
+ if (openElements.isEmpty()) {
+ endDocument();
+ }
+ }
+
+ public void writeText(String text) {
+ writer.write(text);
+ }
+
+ /**
+ * Write object content (inside a tag). If the content is
+ * binary (i.e. a DataHandler in this example), use the
+ * writeBinary() method. If not, use the SerializationContext
+ * to do the work.
+ *
+ * @param obj
+ * @throws Exception
+ */
+ public void serialize(Object obj) throws Exception {
+ if (obj instanceof DataHandler) {
+ DataHandler dh = (DataHandler)obj;
+ writeBinary(dh);
+ return;
+ }
+ serContext.serialize(obj, this);
+ }
+
+ public void writeBinary(DataHandler dh) throws Exception {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ dh.writeTo(baos);
+ baos.close();
+ writeText(XMLUtils.base64encode(baos.toByteArray()));
+ }
+
+ public void endDocument() throws Exception {
+ flush();
+ }
+
+ public void flush() {
+ writer.flush();
+ }
+}
Added: webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/samples/MTOMWriter.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/axis2/samples/MTOMWriter.java Fri Nov 19 07:21:18 2004
@@ -0,0 +1,83 @@
+package axis2.samples;
+
+import axis2.SerializationContext;
+
+import javax.activation.DataHandler;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * MTOMWriters understand how to write MTOM packages.
+ */
+public class MTOMWriter extends BaseWriter {
+ Map parts = new HashMap();
+ OutputStream os;
+
+ byte [] HEADER = "---PACKAGE HEADER---\n".getBytes();
+ byte [] BEGINPART = "---START PART '".getBytes();
+ byte [] ENDLINE = "'---\n".getBytes();
+ byte [] ENDPART = "---END PART '".getBytes();
+ byte [] FOOTER = "---PACKAGE FOOTER---\n".getBytes();
+
+ public MTOMWriter(OutputStream os, SerializationContext serContext) {
+ super(os, serContext);
+
+ // Hold onto this
+ this.os = os;
+
+ try {
+ // Write MIME packaging
+ os.write(HEADER);
+ // Start main part
+ os.write(BEGINPART);
+ os.write("XML".getBytes());
+ os.write(ENDLINE);
+ } catch (IOException e) {
+ // deal with exception...
+ }
+ }
+
+ public void writeBinary(DataHandler dh) throws Exception {
+ String key = (String)parts.get(dh);
+ if (key == null) {
+ // Haven't yet written this
+ key = "Attachment" + Integer.toString(parts.size());
+ parts.put(dh, key);
+ }
+
+ startElement("mtom:include");
+ writeText(key);
+ endElement();
+ }
+
+ public void endDocument() throws Exception {
+ flush();
+
+ // End of XML, write closure for this part
+ os.write(ENDPART);
+ os.write("XML".getBytes());
+ os.write(ENDLINE);
+
+ // Now serialize each attachment
+ for (Iterator i = parts.entrySet().iterator(); i.hasNext();) {
+ Map.Entry entry = (Map.Entry)i.next();
+ String partName = (String) entry.getValue();
+ os.write(BEGINPART);
+ os.write(partName.getBytes());
+ os.write(ENDLINE);
+
+ DataHandler dh = (DataHandler)entry.getKey();
+ dh.writeTo(os);
+
+ os.write(ENDPART);
+ os.write(partName.getBytes());
+ os.write(ENDLINE);
+ }
+
+ os.write(FOOTER);
+ os.close();
+ }
+}
Added: webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/readme.txt
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/MTOMToy/readme.txt Fri Nov 19 07:21:18 2004
@@ -0,0 +1,12 @@
+This is a quickie example just to show a design pattern
+with which Object/MTOM functionality might be implemented.
+
+The OMElement only knows how to write itself to an OMWriter,
+and if it's got Object content it asks the OMWriter to
+serialize it once it's written the start tag (realistically
+we'd need to deal with attributes as well, so we'd
+probably leave the start tag open). The BasicWriter
+notices if content is a DataHandler, and calls writeBinary()
+if so. MTOMWriter extends BasicWriter in order to add
+(trivial) MTOM-like packaging.
+