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