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.
+