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 th...@apache.org on 2005/06/20 08:37:37 UTC

svn commit: r191400 - in /webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom: ./ MTOMStAXSOAPModelBuilder.java MTOMXMLStreamWriter.java

Author: thilina
Date: Sun Jun 19 23:37:35 2005
New Revision: 191400

URL: http://svn.apache.org/viewcvs?rev=191400&view=rev
Log:
comitting the MTOM stuff to main tree

Added:
    webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom/
    webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java
    webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom/MTOMXMLStreamWriter.java

Added: webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java?rev=191400&view=auto
==============================================================================
--- webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java (added)
+++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java Sun Jun 19 23:37:35 2005
@@ -0,0 +1,243 @@
+/**
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * <p/>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * <p/>
+ */
+package org.apache.axis.om.impl.llom.mtom;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.LinkedList;
+import java.util.ListIterator;
+import java.util.Properties;
+
+import javax.activation.DataHandler;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import javax.mail.internet.MimePartDataSource;
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axis.attachments.MIMEHelper;
+import org.apache.axis.om.OMAttribute;
+import org.apache.axis.om.OMElement;
+import org.apache.axis.om.OMException;
+import org.apache.axis.om.OMNode;
+import org.apache.axis.om.impl.llom.OMBlobImpl;
+import org.apache.axis.soap.SOAPFactory;
+import org.apache.axis.soap.impl.llom.builder.StAXSOAPModelBuilder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author Thilina Gunarathne thilina@opensource.lk
+ */
+public class MTOMStAXSOAPModelBuilder extends StAXSOAPModelBuilder {
+	private Log log = LogFactory.getLog(getClass());
+
+	/**
+	 * <code>mimeHelper</code> handles deffered parsing of incoming MIME
+	 * Messages
+	 */
+	MIMEHelper mimeHelper;
+
+	LinkedList mimeBodyPartsList;
+
+	MimeMessage mimeMessage;
+
+	int partIndex = 0;
+
+	
+	public MTOMStAXSOAPModelBuilder(XMLStreamReader parser,SOAPFactory factory, MIMEHelper mimeHelper)
+	{
+		super(parser,factory);
+		this.mimeHelper=  mimeHelper;
+	}
+	
+
+	/**
+	 * @param reader
+	 * @param mimeHelper2
+	 */
+	public MTOMStAXSOAPModelBuilder(XMLStreamReader reader, MIMEHelper mimeHelper) {
+		super(reader);
+		this.mimeHelper = mimeHelper;
+	}
+
+	/*
+	 * private XMLStreamReader getParserFromMime() throws OMException {
+	 * mimeBodyPartsList = new LinkedList(); Properties props = new
+	 * Properties(); javax.mail.Session session =
+	 * javax.mail.Session.getInstance(props, null); try { mimeMessage = new
+	 * MimeMessage(session, inStream);
+	 * 
+	 * MimeBodyPart rootMimeBodyPart;
+	 * 
+	 * rootMimeBodyPart = getRootMimeBodyPart(); return
+	 * XMLInputFactory.newInstance().createXMLStreamReader(
+	 * rootMimeBodyPart.getInputStream());
+	 *  } catch (IOException e1) { throw new OMException(e1.toString());
+	 *  } catch (MessagingException e) { throw new OMException( "Message
+	 * identified as MTOM optimised doesn't contain a valid MIME Stream" +
+	 * e.toString()); } catch (XMLStreamException e) { throw new OMException(
+	 * "SOAP Message contained within Mime root is invalid " + e.toString()); }
+	 * catch (FactoryConfigurationError e) { throw new OMException( "SOAP
+	 * Message contained within Mime root is invalid" + e.toString()); }
+	 *  }
+	 */
+	protected OMNode createOMElement() throws OMException {
+
+		String elementName = parser.getLocalName();
+
+		String namespaceURI = parser.getNamespaceURI();
+
+		// create an OMBlob if the element is an <xop:Include>
+		if (elementName.equalsIgnoreCase("Include")
+				& namespaceURI
+						.equalsIgnoreCase("http://www.w3.org/2004/08/xop/include")) {
+
+			OMBlobImpl node;
+			String contentID = null;
+			String contentIDName = null;
+			OMAttribute Attr;
+			if (lastNode == null) {
+				// Decide whether to ckeck the level >3 or not
+				throw new OMException(
+						"XOP:Include element is not supported here");
+			}
+			if (parser.getAttributeCount() > 0) {
+				contentID = parser.getAttributeValue(0);
+				contentID = contentID.trim();
+				contentIDName = parser.getAttributeLocalName(0);
+				if (contentIDName.equalsIgnoreCase("href")
+						& contentID.substring(0, 3).equalsIgnoreCase("cid")) {
+					contentID = contentID.substring(4);
+				} else {
+					throw new OMException(
+							"contentID not Found in XOP:Include element");
+				}
+			} else {
+				throw new OMException(
+						"Href attribute not found in XOP:Include element");
+			}
+
+			if (lastNode.isComplete()) {
+				node = new OMBlobImpl(contentID, lastNode.getParent(), this);
+				lastNode.setNextSibling(node);
+				node.setPreviousSibling(lastNode);
+			} else {
+				OMElement e = (OMElement) lastNode;
+				node = new OMBlobImpl(contentID, (OMElement) lastNode, this);
+				e.setFirstChild(node);
+			}
+			return node;
+
+		} else {
+			OMElement node;
+			if (lastNode == null) {
+				node = constructNode(null, elementName, true);
+			} else if (lastNode.isComplete()) {
+				node = constructNode(lastNode.getParent(), elementName, false);
+				lastNode.setNextSibling(node);
+				node.setPreviousSibling(lastNode);
+			} else {
+				OMElement e = (OMElement) lastNode;
+				node = constructNode((OMElement) lastNode, elementName, false);
+				e.setFirstChild(node);
+			}
+
+			// fill in the attributes
+			processAttributes(node);
+			log.info("Build the OMElelment {" + node.getLocalName() + '}'
+					+ node.getLocalName() + "By the StaxSOAPModelBuilder");
+			return node;
+		}
+	}
+
+	public DataHandler getDataHandler(String blobContentID) throws OMException {
+		/*
+		 * First checks whether the part is already parsed by checking the parts
+		 * linked list. If it is not parsed yet then call the getnextPart() till
+		 * we find the required part.
+		 */
+		MimeBodyPart mimeBodyPart;
+
+		boolean attachmentFound = false;
+		ListIterator partsIterator = mimeBodyPartsList.listIterator();
+		try {
+			while (partsIterator.hasNext()) {
+				mimeBodyPart = (MimeBodyPart) partsIterator.next();
+				if (blobContentID.equals(mimeBodyPart.getContentID())) {
+					attachmentFound = true;
+					DataHandler dh = mimeBodyPart.getDataHandler();
+					return dh;
+				}
+			}
+			while (!attachmentFound) {
+				mimeBodyPart = this.getNextMimeBodyPart();
+
+				if (mimeBodyPart == null) {
+					break;
+				}
+				String partContentID = mimeBodyPart.getContentID();
+				String delimitedBlobContentID = "<" + blobContentID + ">";
+				if (delimitedBlobContentID.equals(partContentID)) {
+					attachmentFound = true;
+					DataHandler dh = mimeBodyPart.getDataHandler();
+					return dh;
+				}
+			}
+			return null;
+		} catch (MessagingException e) {
+			throw new OMException("Invalid Mime Message " + e.toString());
+		}
+	}
+
+	private MimeBodyPart getMimeBodyPart() throws MessagingException {
+		MimeBodyPart mimeBodyPart = null;
+
+		DataHandler dh = mimeMessage.getDataHandler();
+		MimeMultipart multiPart = new MimeMultipart((MimePartDataSource) dh
+				.getDataSource());
+		mimeBodyPart = (MimeBodyPart) multiPart.getBodyPart(partIndex);
+
+		partIndex++;
+		return mimeBodyPart;
+	}
+
+	private MimeBodyPart getRootMimeBodyPart() throws MessagingException {
+		MimeBodyPart rootMimeBodyPart;
+		if (mimeBodyPartsList.isEmpty()) {
+			rootMimeBodyPart = getMimeBodyPart();
+			mimeBodyPartsList.add(rootMimeBodyPart);
+		} else {
+			rootMimeBodyPart = (MimeBodyPart) mimeBodyPartsList.getFirst();
+		}
+		return rootMimeBodyPart;
+	}
+
+	private MimeBodyPart getNextMimeBodyPart() throws MessagingException {
+		MimeBodyPart nextMimeBodyPart;
+		nextMimeBodyPart = getMimeBodyPart();
+		if (nextMimeBodyPart != null) {
+			mimeBodyPartsList.add(nextMimeBodyPart);
+			return nextMimeBodyPart;
+		} else
+			return null;
+	}
+}
\ No newline at end of file

Added: webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom/MTOMXMLStreamWriter.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom/MTOMXMLStreamWriter.java?rev=191400&view=auto
==============================================================================
--- webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom/MTOMXMLStreamWriter.java (added)
+++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/mtom/MTOMXMLStreamWriter.java Sun Jun 19 23:37:35 2005
@@ -0,0 +1,439 @@
+/**
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * <p/>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * <p/>
+ */
+package org.apache.axis.om.impl.llom.mtom;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Properties;
+import java.util.Random;
+
+import javax.activation.DataHandler;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMultipart;
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.axis.om.impl.llom.OMBlobImpl;
+
+
+/**
+ * @author Thilina Gunarathne thilina@opensource.lk
+ */
+public class MTOMXMLStreamWriter implements XMLStreamWriter {
+
+    OutputStream outStream;
+
+    XMLStreamWriter writer;
+
+    Random rnd;
+
+    LinkedList blobList;
+
+    ByteArrayOutputStream bufferedSoapOutStream;
+
+    public static String[] filter = new String[] { "Message-ID" }; // to filter
+                                                                   // the
+                                                                   // message ID
+                                                                   // header
+
+    public MTOMXMLStreamWriter(OutputStream outStream)
+            throws XMLStreamException, FactoryConfigurationError {
+        super();
+        this.outStream = outStream;
+
+        bufferedSoapOutStream = new ByteArrayOutputStream();
+
+        writer = XMLOutputFactory.newInstance().createXMLStreamWriter(
+                bufferedSoapOutStream);
+        blobList = new LinkedList();
+        rnd = new Random();
+
+    }
+
+    public void writeOptimised(OMBlobImpl blob) {
+        blobList.add(blob);
+    }
+
+    private MimeBodyPart createMimeBodyPart(OMBlobImpl blob)
+            throws Exception {
+        MimeBodyPart mimeBodyPart = new MimeBodyPart();
+        mimeBodyPart.setDataHandler(blob.getDataHandler());
+        mimeBodyPart.addHeader("Content-Transfer-Encoding", "binary");
+        mimeBodyPart.addHeader("Content-ID", "<" + blob.getContentID()+ ">");
+        return mimeBodyPart;
+
+    }
+
+    public void complete() throws Exception {
+        DataHandler dh = new DataHandler(bufferedSoapOutStream.toString(),
+                "text/xml");
+        MimeBodyPart mimeBodyPart = new MimeBodyPart();
+        mimeBodyPart.setDataHandler(dh);
+        mimeBodyPart.addHeader("Content-Type", "application/xop+xml");
+        mimeBodyPart.addHeader("Content-Transfer-Encoding", "8bit");
+        String contentID = "<http://example.org/my.hsh>";
+        mimeBodyPart.addHeader("Content-ID", contentID);
+
+        Properties props = new Properties();
+        javax.mail.Session session = javax.mail.Session
+                .getInstance(props, null);
+        javax.mail.internet.MimeMessage mimeMessage = new javax.mail.internet.MimeMessage(
+                session);
+        MimeMultipart multipartMessage = new MimeMultipart("Related");
+        multipartMessage.addBodyPart(mimeBodyPart);
+
+        Iterator blobIterator = blobList.iterator();
+        while (blobIterator.hasNext()) {
+            OMBlobImpl blob = (OMBlobImpl) blobIterator.next();
+            multipartMessage
+                    .addBodyPart(createMimeBodyPart(blob));
+        }
+        mimeMessage.setContent(multipartMessage);
+        mimeMessage.writeTo(outStream, filter);
+    }
+
+    public void writeStartElement(String localName) throws XMLStreamException {
+        writer.writeStartElement(localName);
+    }
+
+    public void writeStartElement(String namespaceURI, String localName)
+            throws XMLStreamException {
+        writer.writeStartElement(namespaceURI, localName);
+
+    }
+
+    public void writeStartElement(String prefix, String localName,
+            String namespaceURI) throws XMLStreamException {
+        writer.writeStartElement(prefix, localName, namespaceURI);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeEmptyElement(java.lang.String,
+     *      java.lang.String)
+     */
+    public void writeEmptyElement(String namespaceURI, String localName)
+            throws XMLStreamException {
+        writer.writeEmptyElement(namespaceURI, localName);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeEmptyElement(java.lang.String,
+     *      java.lang.String, java.lang.String)
+     */
+    public void writeEmptyElement(String prefix, String localName,
+            String namespaceURI) throws XMLStreamException {
+        writer.writeEmptyElement(prefix, localName, namespaceURI);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeEmptyElement(java.lang.String)
+     */
+    public void writeEmptyElement(String localName) throws XMLStreamException {
+        writer.writeEmptyElement(localName);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeEndElement()
+     */
+    public void writeEndElement() throws XMLStreamException {
+        writer.writeEndElement();
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeEndDocument()
+     */
+    public void writeEndDocument() throws XMLStreamException {
+        writer.writeEndDocument();
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#close()
+     */
+    public void close() throws XMLStreamException {
+        writer.close();
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#flush()
+     */
+    public void flush() throws XMLStreamException {
+        writer.flush();
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeAttribute(java.lang.String,
+     *      java.lang.String)
+     */
+    public void writeAttribute(String localName, String value)
+            throws XMLStreamException {
+        writer.writeAttribute(localName, value);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeAttribute(java.lang.String,
+     *      java.lang.String, java.lang.String, java.lang.String)
+     */
+    public void writeAttribute(String prefix, String namespaceURI,
+            String localName, String value) throws XMLStreamException {
+        writer.writeAttribute(prefix, namespaceURI, localName, value);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeAttribute(java.lang.String,
+     *      java.lang.String, java.lang.String)
+     */
+    public void writeAttribute(String namespaceURI, String localName,
+            String value) throws XMLStreamException {
+        writer.writeAttribute(namespaceURI, localName, value);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeNamespace(java.lang.String,
+     *      java.lang.String)
+     */
+    public void writeNamespace(String prefix, String namespaceURI)
+            throws XMLStreamException {
+        writer.writeNamespace(prefix, namespaceURI);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeDefaultNamespace(java.lang.String)
+     */
+    public void writeDefaultNamespace(String namespaceURI)
+            throws XMLStreamException {
+        writer.writeDefaultNamespace(namespaceURI);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeComment(java.lang.String)
+     */
+    public void writeComment(String data) throws XMLStreamException {
+        writer.writeComment(data);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeProcessingInstruction(java.lang.String)
+     */
+    public void writeProcessingInstruction(String target)
+            throws XMLStreamException {
+        writer.writeProcessingInstruction(target);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeProcessingInstruction(java.lang.String,
+     *      java.lang.String)
+     */
+    public void writeProcessingInstruction(String target, String data)
+            throws XMLStreamException {
+        writer.writeProcessingInstruction(target, data);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeCData(java.lang.String)
+     */
+    public void writeCData(String data) throws XMLStreamException {
+        writer.writeCData(data);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeDTD(java.lang.String)
+     */
+    public void writeDTD(String dtd) throws XMLStreamException {
+        writer.writeDTD(dtd);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeEntityRef(java.lang.String)
+     */
+    public void writeEntityRef(String name) throws XMLStreamException {
+        writer.writeEntityRef(name);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeStartDocument()
+     */
+    public void writeStartDocument() throws XMLStreamException {
+        writer.writeStartDocument();
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeStartDocument(java.lang.String)
+     */
+    public void writeStartDocument(String version) throws XMLStreamException {
+        writer.writeStartDocument(version);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeStartDocument(java.lang.String,
+     *      java.lang.String)
+     */
+    public void writeStartDocument(String encoding, String version)
+            throws XMLStreamException {
+        writer.writeStartDocument(encoding, version);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeCharacters(java.lang.String)
+     */
+    public void writeCharacters(String text) throws XMLStreamException {
+        writer.writeCharacters(text);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#writeCharacters(char[], int, int)
+     */
+    public void writeCharacters(char[] text, int start, int len)
+            throws XMLStreamException {
+        writer.writeCharacters(text, start, len);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#getPrefix(java.lang.String)
+     */
+    public String getPrefix(String uri) throws XMLStreamException {
+
+        return writer.getPrefix(uri);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#setPrefix(java.lang.String,
+     *      java.lang.String)
+     */
+    public void setPrefix(String prefix, String uri) throws XMLStreamException {
+        writer.setPrefix(prefix, uri);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#setDefaultNamespace(java.lang.String)
+     */
+    public void setDefaultNamespace(String uri) throws XMLStreamException {
+        writer.setDefaultNamespace(uri);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#setNamespaceContext(javax.xml.namespace.NamespaceContext)
+     */
+    public void setNamespaceContext(NamespaceContext context)
+            throws XMLStreamException {
+        writer.setNamespaceContext(context);
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#getNamespaceContext()
+     */
+    public NamespaceContext getNamespaceContext() {
+
+        return writer.getNamespaceContext();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.xml.stream.XMLStreamWriter#getProperty(java.lang.String)
+     */
+    public Object getProperty(String name) throws IllegalArgumentException {
+
+        return writer.getProperty(name);
+    }
+}
\ No newline at end of file