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 Thilina Gunarathne <cs...@gmail.com> on 2005/06/28 19:54:28 UTC

[Axis2]Re: svn commit: r202253 - in /webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om: MIMEOutputUtils.java OMOutput.java impl/llom/OMOutput.java

Hi,
I'm not sure where to keep the MIMEOutputUtils class. For the moment it is 
in o,a,a.om <http://a.om>
Shall we keep it there or move to o.a.a.attachments
 regards,
~Thilina
 On 6/28/05, thilina@apache.org <th...@apache.org> wrote: 
> 
> Author: thilina
> Date: Tue Jun 28 10:43:09 2005
> New Revision: 202253
> 
> URL: http://svn.apache.org/viewcvs?rev=202253&view=rev
> Log:
> Moved the JavaMail dependent code pieces to MIMEOutputUtils.java.So<http://MIMEOutputUtils.java.So>that in the run time OM will work without JavaMail.
> 
> Added:
> 
> webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java
> 
> webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java
> Removed:
> 
> webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/OMOutput.java
> 
> Added: 
> webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java
> URL: 
> http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java?rev=202253&view=auto
> 
> ==============================================================================
> --- 
> webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java 
> (added)
> +++ 
> webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java 
> Tue Jun 28 10:43:09 2005
> @@ -0,0 +1,136 @@
> +/*
> 
> + * Copyright 2004,2005 The Apache Software Foundation.
> 
> + *
> 
> + * 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
> 
> + *
> 
> + * http://www.apache.org/licenses/LICENSE-2.0
> 
> + *
> 
> + * 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.
> 
> + */
> 
> +package org.apache.axis.om <http://org.apache.axis.om>;
> 
> +
> 
> +import java.io.IOException;
> 
> +import java.io.OutputStream;
> 
> +import java.util.Iterator;
> 
> +import java.util.LinkedList;
> 
> +
> 
> +import javax.activation.DataHandler;
> 
> +import javax.mail.MessagingException;
> 
> +import javax.mail.internet.ContentType;
> 
> +import javax.mail.internet.MimeBodyPart;
> 
> +import javax.xml.stream.XMLStreamException;
> 
> +/**
> 
> + * @author <a href="mailto:thilina@opensource.lk">Thilina Gunarathne </a>
> 
> + */
> 
> +public class MIMEOutputUtils {
> 
> +
> 
> + private static byte[] CRLF = { 13, 10 };
> 
> +
> 
> + static String SOAP_PART_CONTENT_ID = "<SOAPPart>";
> 
> +
> 
> + public static void complete(OutputStream outStream,
> 
> + OutputStream bufferedSoapOutStream, LinkedList binaryNodeList,
> 
> + String boundary) throws XMLStreamException {
> 
> + try {
> 
> + startWritingMime(outStream, boundary);
> 
> +
> 
> +
> 
> + DataHandler dh = new DataHandler(bufferedSoapOutStream.toString(),
> 
> + "text/xml");
> 
> + MimeBodyPart rootMimeBodyPart = new MimeBodyPart();
> 
> + rootMimeBodyPart.setDataHandler(dh);
> 
> + rootMimeBodyPart.addHeader("Content-Type", "application/xop+xml");
> 
> + rootMimeBodyPart.addHeader("Content-Transfer-Encoding", "8bit");
> 
> + rootMimeBodyPart.addHeader("Content-ID", SOAP_PART_CONTENT_ID);
> 
> +
> 
> + writeBodyPart(outStream, rootMimeBodyPart, boundary);
> 
> +
> 
> + Iterator binaryNodeIterator = binaryNodeList.iterator();
> 
> + while (binaryNodeIterator.hasNext()) {
> 
> + OMText binaryNode = (OMText) binaryNodeIterator.next();
> 
> + writeBodyPart(outStream, createMimeBodyPart(binaryNode), boundary);
> 
> + }
> 
> + finishWritingMime(outStream);
> 
> + } catch (IOException e) {
> 
> + throw new OMException("Problem with the OutputStream."+e.toString());
> 
> + } catch (MessagingException e) {
> 
> + throw new OMException("Problem writing Mime Parts."+e.toString());
> 
> + }
> 
> + }
> 
> +
> 
> + private static MimeBodyPart createMimeBodyPart(OMText node)
> 
> + throws MessagingException {
> 
> + MimeBodyPart mimeBodyPart = new MimeBodyPart();
> 
> + mimeBodyPart.setDataHandler(node.getDataHandler());
> 
> + mimeBodyPart.addHeader("Content-Transfer-Encoding", "binary");
> 
> + mimeBodyPart.addHeader("Content-ID", "<" + node.getContentID() + ">");
> 
> + return mimeBodyPart;
> 
> +
> 
> + }
> 
> +
> 
> + /**
> 
> + * @throws IOException
> 
> + * This will write the boundary to output Stream
> 
> + */
> 
> + private static void writeMimeBoundary(OutputStream outStream,
> 
> + String boundary) throws IOException {
> 
> + outStream.write(new byte[] { 45, 45 });
> 
> + outStream.write(boundary.getBytes());
> 
> + }
> 
> +
> 
> + /**
> 
> + * @throws IOException
> 
> + * This will write the boundary with CRLF
> 
> + */
> 
> + private static void startWritingMime(OutputStream outStream, String 
> boundary)
> 
> + throws IOException {
> 
> + writeMimeBoundary(outStream, boundary);
> 
> + outStream.write(CRLF);
> 
> + }
> 
> +
> 
> + /**
> 
> + * this will write a CRLF for the earlier boudary then the BodyPart data
> 
> + * with headers followed by boundary. Writes only the boundary. No more
> 
> + * CRLF's are wriiting after that.
> 
> + *
> 
> + * @throws IOException
> 
> + * @throws MessagingException
> 
> + */
> 
> + private static void writeBodyPart(OutputStream outStream,
> 
> + MimeBodyPart part, String boundary) throws IOException,
> 
> + MessagingException {
> 
> + outStream.write(CRLF);
> 
> + part.writeTo(outStream);
> 
> + outStream.write(CRLF);
> 
> + writeMimeBoundary(outStream, boundary);
> 
> + }
> 
> +
> 
> + /**
> 
> + * @throws IOException
> 
> + * This will write "--" to the end of last boundary
> 
> + */
> 
> + private static void finishWritingMime(OutputStream outStream)
> 
> + throws IOException {
> 
> + outStream.write(new byte[] { 45, 45 });
> 
> + }
> 
> +
> 
> + public static String getContentTypeForMime(String boundary) {
> 
> + ContentType contentType = new ContentType();
> 
> + contentType.setPrimaryType("multipart");
> 
> + contentType.setSubType("related");
> 
> + contentType.setParameter("boundary", boundary);
> 
> + contentType.setParameter("start", MIMEOutputUtils.SOAP_PART_CONTENT_ID);
> 
> + contentType.setParameter("type", "application/xop+xml");
> 
> + //TODO theres something called action that can be set with
> 
> + // following. May be SOAPAction. Better check.
> 
> + contentType.setParameter("startinfo", "application/xop+xml");
> 
> + return contentType.toString();
> 
> + }
> 
> +
> 
> +}
> \ No newline at end of file
> 
> Added: 
> webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java
> URL: 
> http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java?rev=202253&view=auto
> 
> ==============================================================================
> --- 
> webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java 
> (added)
> +++ 
> webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java 
> Tue Jun 28 10:43:09 2005
> @@ -0,0 +1,135 @@
> +/*
> 
> + * Copyright 2004,2005 The Apache Software Foundation.
> 
> + *
> 
> + * 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
> 
> + *
> 
> + * http://www.apache.org/licenses/LICENSE-2.0
> 
> + *
> 
> + * 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.
> 
> + */
> 
> +package org.apache.axis.om <http://org.apache.axis.om>;
> 
> +
> 
> +import java.io.ByteArrayOutputStream;
> 
> +import java.io.OutputStream;
> 
> +import java.util.LinkedList;
> 
> +
> 
> +import javax.xml.stream.FactoryConfigurationError;
> 
> +import javax.xml.stream.XMLOutputFactory;
> 
> +import javax.xml.stream.XMLStreamException;
> 
> +import javax.xml.stream.XMLStreamWriter;
> 
> +
> 
> +
> 
> +/**
> 
> + * @author <a href="mailto:thilina@opensource.lk">Thilina Gunarathne </a> 
> For
> 
> + * the moment this assumes that transport takes the decision of whether
> 
> + * to optimise or not by looking at whether the MTOM optimise is enabled 
> &
> 
> + * also looking at the OM tree whether it has any optimisable content
> 
> + */
> 
> +
> 
> +public class OMOutput {
> 
> + private XMLStreamWriter xmlWriter;
> 
> +
> 
> + private boolean doOptimise;
> 
> +
> 
> + private OutputStream outStream;
> 
> +
> 
> + private XMLStreamWriter writer;
> 
> +
> 
> + private LinkedList binaryNodeList;
> 
> +
> 
> + private ByteArrayOutputStream bufferedSoapOutStream;
> 
> +
> 
> + private String mimeBoundary = null;
> 
> +
> 
> + private String contentType = null;
> 
> +
> 
> + /**
> 
> + * @param xmlWriter
> 
> + * if it is guaranteed for not using attachments one can use this
> 
> + */
> 
> + public OMOutput(XMLStreamWriter xmlWriter) {
> 
> + this.xmlWriter = xmlWriter;
> 
> + }
> 
> +
> 
> + /**
> 
> + * @throws FactoryConfigurationError
> 
> + * @throws XMLStreamException
> 
> + *
> 
> + */
> 
> + public OMOutput(OutputStream outStream, boolean doOptimise)
> 
> + throws XMLStreamException, FactoryConfigurationError {
> 
> + this.doOptimise = doOptimise;
> 
> + this.outStream = outStream;
> 
> + if (doOptimise) {
> 
> + bufferedSoapOutStream = new ByteArrayOutputStream();
> 
> + xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(
> 
> + bufferedSoapOutStream);
> 
> + binaryNodeList = new LinkedList();
> 
> + } else {
> 
> + xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(
> 
> + outStream);
> 
> +
> 
> + }
> 
> +
> 
> + }
> 
> +
> 
> + public XMLStreamWriter getXmlStreamWriter() {
> 
> + return xmlWriter;
> 
> + }
> 
> +
> 
> + public void flush() throws XMLStreamException {
> 
> + // if (doOptimise) {
> 
> + // try {
> 
> + // this.complete();
> 
> + // } catch (IOException e) {
> 
> + // //TODO this is just a hack to avoid passing IOException. Must find a
> 
> + // better way to handle this
> 
> + // throw new XMLStreamException("Error creating mime parts. Problem with
> 
> + // Streams");
> 
> + // } catch (MessagingException e) {
> 
> + // throw new XMLStreamException("Error creating mime Body parts");
> 
> + // }
> 
> + // } else {
> 
> + xmlWriter.flush();
> 
> + // }
> 
> +
> 
> + }
> 
> +
> 
> + public boolean doOptimise() {
> 
> + return doOptimise;
> 
> + }
> 
> +
> 
> + public String getContentType() {
> 
> + if (contentType == null && doOptimise) {
> 
> + MIMEOutputUtils.getContentTypeForMime(getMimeBoundary());
> 
> + }
> 
> + return contentType.toString();
> 
> + }
> 
> +
> 
> + public void writeOptimised(OMText node) {
> 
> + binaryNodeList.add(node);
> 
> + }
> 
> +
> 
> + public void complete() throws XMLStreamException {
> 
> + if (doOptimise) {
> 
> + xmlWriter.flush();
> 
> + MIMEOutputUtils.complete(outStream, bufferedSoapOutStream,
> 
> + binaryNodeList, getMimeBoundary());
> 
> + }
> 
> + }
> 
> +
> 
> + private String getMimeBoundary() {
> 
> + //TODO have to dynamically generate.
> 
> + if (mimeBoundary == null) {
> 
> + mimeBoundary = "----=_AxIs2_Def_boundary_=42214532";
> 
> + }
> 
> + return mimeBoundary;
> 
> + }
> 
> +
> 
> +}
> \ No newline at end of file
> 
> 
> 


-- 

"May the SourcE be with u"

Re: [Axis2]Re: svn commit: r202253 - in /webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om: MIMEOutputUtils.java OMOutput.java impl/llom/OMOutput.java

Posted by Sanjiva Weerawarana <sa...@opensource.lk>.
We should not have any o.a.a.attachments stuff .. that's all part of OM
now. 

IMO there's no need to move the MIME code out of OMOutput at all to make
this work.

Sanjiva.

On Tue, 2005-06-28 at 23:54 +0600, Thilina Gunarathne wrote:
> Hi,
> I'm not sure where to keep the MIMEOutputUtils class. For the moment
> it is in o,a,a.om
> Shall we keep it there or move to o.a.a.attachments
>  
> regards,
> ~Thilina
>  
> On 6/28/05, thilina@apache.org <th...@apache.org> wrote: 
>         Author: thilina
>         Date: Tue Jun 28 10:43:09 2005
>         New Revision: 202253
>         
>         URL: http://svn.apache.org/viewcvs?rev=202253&view=rev
>         Log:
>         Moved the JavaMail dependent code pieces to
>         MIMEOutputUtils.java.So that in the run time OM will work
>         without JavaMail. 
>         
>         Added:
>         
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java
>         
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java
>         Removed:
>         
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/OMOutput.java 
>         
>         Added:
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java
>         URL:
>         http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java?rev=202253&view=auto
>         ============================================================================== 
>         ---
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java (added)
>         +++
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java Tue Jun 28 10:43:09 2005
>         @@ -0,0 +1,136 @@ 
>         +/*
>         
>         + * Copyright 2004,2005 The Apache Software Foundation.
>         
>         + *
>         
>         + * 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
>         
>         + *
>         
>         + *      http://www.apache.org/licenses/LICENSE-2.0
>         
>         + *
>         
>         + * 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.
>         
>         + */
>         
>         +package org.apache.axis.om;
>         
>         +
>         
>         +import java.io.IOException;
>         
>         +import java.io.OutputStream;
>         
>         +import java.util.Iterator;
>         
>         +import java.util.LinkedList;
>         
>         +
>         
>         +import javax.activation.DataHandler;
>         
>         +import javax.mail.MessagingException;
>         
>         +import javax.mail.internet.ContentType;
>         
>         +import javax.mail.internet.MimeBodyPart ;
>         
>         +import javax.xml.stream.XMLStreamException;
>         
>         +/**
>         
>         + * @author <a href="mailto:thilina@opensource.lk">Thilina
>         Gunarathne </a>
>         
>         + */ 
>         
>         +public class MIMEOutputUtils {
>         
>         +
>         
>         +       private static byte[] CRLF = { 13, 10 };
>         
>         +
>         
>         +       static String SOAP_PART_CONTENT_ID = "<SOAPPart>";
>         
>         +
>         
>         +       public static void complete(OutputStream outStream, 
>         
>         +                       OutputStream bufferedSoapOutStream,
>         LinkedList binaryNodeList,
>         
>         +                       String boundary) throws
>         XMLStreamException {
>         
>         +               try {
>         
>         +                       startWritingMime(outStream,
>         boundary); 
>         
>         +
>         
>         +
>         
>         +               DataHandler dh = new
>         DataHandler(bufferedSoapOutStream.toString(),
>         
>         +                               "text/xml");
>         
>         +               MimeBodyPart rootMimeBodyPart = new
>         MimeBodyPart(); 
>         
>         +               rootMimeBodyPart.setDataHandler(dh);
>         
>         +               rootMimeBodyPart.addHeader("Content-Type",
>         "application/xop+xml");
>         
>         +
>         rootMimeBodyPart.addHeader("Content-Transfer-Encoding",
>         "8bit"); 
>         
>         +               rootMimeBodyPart.addHeader("Content-ID",
>         SOAP_PART_CONTENT_ID);
>         
>         +
>         
>         +               writeBodyPart(outStream, rootMimeBodyPart,
>         boundary);
>         
>         +
>         
>         +               Iterator binaryNodeIterator =
>         binaryNodeList.iterator();
>         
>         +               while (binaryNodeIterator.hasNext()) {
>         
>         +                       OMText binaryNode = (OMText)
>         binaryNodeIterator.next();
>         
>         +                       writeBodyPart(outStream,
>         createMimeBodyPart(binaryNode), boundary); 
>         
>         +               }
>         
>         +               finishWritingMime(outStream);
>         
>         +               } catch (IOException e) {
>         
>         +                       throw new OMException("Problem with
>         the OutputStream."+e.toString()); 
>         
>         +               } catch (MessagingException e) {
>         
>         +                       throw new OMException("Problem writing
>         Mime Parts."+e.toString());
>         
>         +               }
>         
>         +       }
>         
>         +
>         
>         +       private static MimeBodyPart createMimeBodyPart(OMText
>         node)
>         
>         +                       throws MessagingException {
>         
>         +               MimeBodyPart mimeBodyPart = new
>         MimeBodyPart();
>         
>         +
>         mimeBodyPart.setDataHandler(node.getDataHandler());
>         
>         +
>         mimeBodyPart.addHeader("Content-Transfer-Encoding", "binary");
>         
>         +               mimeBodyPart.addHeader("Content-ID", "<" +
>         node.getContentID() + ">");
>         
>         +               return mimeBodyPart;
>         
>         +
>         
>         +       }
>         
>         +
>         
>         +       /**
>         
>         +        * @throws IOException
>         
>         +        *             This will write the boundary to output
>         Stream 
>         
>         +        */
>         
>         +       private static void writeMimeBoundary(OutputStream
>         outStream,
>         
>         +                       String boundary) throws IOException {
>         
>         +               outStream.write(new byte[] { 45, 45 }); 
>         
>         +               outStream.write(boundary.getBytes());
>         
>         +       }
>         
>         +
>         
>         +       /**
>         
>         +        * @throws IOException
>         
>         +        *             This will write the boundary with CRLF
>         
>         +        */
>         
>         +       private static void startWritingMime(OutputStream
>         outStream, String boundary)
>         
>         +                       throws IOException {
>         
>         +               writeMimeBoundary(outStream, boundary);
>         
>         +               outStream.write(CRLF);
>         
>         +       }
>         
>         +
>         
>         +       /**
>         
>         +        * this will write a CRLF for the earlier boudary then
>         the BodyPart data
>         
>         +        * with headers followed by boundary. Writes only the
>         boundary. No more 
>         
>         +        * CRLF's are wriiting after that.
>         
>         +        *
>         
>         +        * @throws IOException
>         
>         +        * @throws MessagingException
>         
>         +        */
>         
>         +       private static void writeBodyPart(OutputStream
>         outStream, 
>         
>         +                       MimeBodyPart part, String boundary)
>         throws IOException,
>         
>         +                       MessagingException {
>         
>         +               outStream.write(CRLF);
>         
>         +               part.writeTo (outStream);
>         
>         +               outStream.write(CRLF);
>         
>         +               writeMimeBoundary(outStream, boundary);
>         
>         +       }
>         
>         +
>         
>         +       /**
>         
>         +        * @throws IOException
>         
>         +        *             This will write "--" to the end of last
>         boundary 
>         
>         +        */
>         
>         +       private static void finishWritingMime(OutputStream
>         outStream)
>         
>         +                       throws IOException {
>         
>         +               outStream.write(new byte[] { 45, 45 });
>         
>         +       } 
>         
>         +
>         
>         +       public static String getContentTypeForMime(String
>         boundary) {
>         
>         +               ContentType contentType = new ContentType();
>         
>         +               contentType.setPrimaryType("multipart"); 
>         
>         +               contentType.setSubType("related");
>         
>         +               contentType.setParameter("boundary",
>         boundary);
>         
>         +               contentType.setParameter("start",
>         MIMEOutputUtils.SOAP_PART_CONTENT_ID );
>         
>         +               contentType.setParameter("type",
>         "application/xop+xml");
>         
>         +               //TODO theres something called action that can
>         be set with
>         
>         +               // following. May be SOAPAction. Better
>         check. 
>         
>         +               contentType.setParameter("startinfo",
>         "application/xop+xml");
>         
>         +               return contentType.toString();
>         
>         +       }
>         
>         +
>         
>         +}
>         \ No newline at end of file 
>         
>         Added:
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java
>         URL:
>         http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java?rev=202253&view=auto
>         ==============================================================================
>         ---
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java (added)
>         +++
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java Tue Jun 28 10:43:09 2005
>         @@ -0,0 +1,135 @@
>         +/*
>         
>         + * Copyright 2004,2005 The Apache Software Foundation.
>         
>         + *
>         
>         + * 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
>         
>         + *
>         
>         + *      http://www.apache.org/licenses/LICENSE-2.0
>         
>         + *
>         
>         + * 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.
>         
>         + */
>         
>         +package org.apache.axis.om;
>         
>         +
>         
>         +import java.io.ByteArrayOutputStream;
>         
>         +import java.io.OutputStream ;
>         
>         +import java.util.LinkedList;
>         
>         +
>         
>         +import javax.xml.stream.FactoryConfigurationError;
>         
>         +import javax.xml.stream.XMLOutputFactory;
>         
>         +import javax.xml.stream.XMLStreamException;
>         
>         +import javax.xml.stream.XMLStreamWriter;
>         
>         +
>         
>         +
>         
>         +/**
>         
>         + * @author <a href="mailto:thilina@opensource.lk">Thilina
>         Gunarathne </a> For
>         
>         + *         the moment this assumes that transport takes the
>         decision of whether
>         
>         + *         to optimise or not by looking at whether the MTOM
>         optimise is enabled &
>         
>         + *         also looking at the OM tree whether it has any
>         optimisable content 
>         
>         + */
>         
>         +
>         
>         +public class OMOutput {
>         
>         +       private XMLStreamWriter xmlWriter;
>         
>         +
>         
>         +       private boolean doOptimise;
>         
>         +
>         
>         +       private OutputStream outStream;
>         
>         +
>         
>         +       private XMLStreamWriter writer;
>         
>         +
>         
>         +       private LinkedList binaryNodeList;
>         
>         +
>         
>         +       private ByteArrayOutputStream bufferedSoapOutStream;
>         
>         +
>         
>         +       private String mimeBoundary = null; 
>         
>         +
>         
>         +       private String contentType = null;
>         
>         +
>         
>         +       /**
>         
>         +        * @param xmlWriter
>         
>         +        *            if it is guaranteed for not using
>         attachments one can use this
>         
>         +        */
>         
>         +       public OMOutput(XMLStreamWriter xmlWriter) {
>         
>         +               this.xmlWriter = xmlWriter;
>         
>         +       }
>         
>         +
>         
>         +       /**
>         
>         +        * @throws FactoryConfigurationError
>         
>         +        * @throws XMLStreamException
>         
>         +        *
>         
>         +        */
>         
>         +       public OMOutput(OutputStream outStream, boolean
>         doOptimise)
>         
>         +                       throws XMLStreamException,
>         FactoryConfigurationError { 
>         
>         +               this.doOptimise = doOptimise;
>         
>         +               this.outStream = outStream;
>         
>         +               if (doOptimise) {
>         
>         +                       bufferedSoapOutStream = new
>         ByteArrayOutputStream(); 
>         
>         +                       xmlWriter =
>         XMLOutputFactory.newInstance().createXMLStreamWriter(
>         
>         +
>         bufferedSoapOutStream);
>         
>         +                       binaryNodeList = new LinkedList(); 
>         
>         +               } else {
>         
>         +                       xmlWriter =
>         XMLOutputFactory.newInstance().createXMLStreamWriter(
>         
>         +                                       outStream);
>         
>         +
>         
>         +               } 
>         
>         +
>         
>         +       }
>         
>         +
>         
>         +       public XMLStreamWriter getXmlStreamWriter() {
>         
>         +               return xmlWriter;
>         
>         +       }
>         
>         +
>         
>         +       public void flush() throws XMLStreamException { 
>         
>         +               //              if (doOptimise) {
>         
>         +               //                      try {
>         
>         +               //                              this.complete();
>         
>         +               //                      } catch (IOException
>         e) { 
>         
>         +               //                              //TODO this is
>         just a hack to avoid passing IOException. Must find a
>         
>         +               // better way to handle this
>         
>         +               //                              throw new
>         XMLStreamException("Error creating mime parts. Problem with 
>         
>         +               // Streams");
>         
>         +               //                      } catch
>         (MessagingException e) {
>         
>         +               //                              throw new
>         XMLStreamException("Error creating mime Body parts"); 
>         
>         +               //                      }
>         
>         +               //              } else {
>         
>         +               xmlWriter.flush();
>         
>         +               //              }
>         
>         +
>         
>         +       }
>         
>         +
>         
>         +       public boolean doOptimise() {
>         
>         +               return doOptimise;
>         
>         +       }
>         
>         +
>         
>         +       public String getContentType() {
>         
>         +               if (contentType == null && doOptimise) { 
>         
>         +
>         MIMEOutputUtils.getContentTypeForMime(getMimeBoundary());
>         
>         +               }
>         
>         +               return contentType.toString();
>         
>         +       }
>         
>         +
>         
>         +       public void writeOptimised(OMText node) { 
>         
>         +               binaryNodeList.add(node);
>         
>         +       }
>         
>         +
>         
>         +       public void complete() throws XMLStreamException {
>         
>         +               if (doOptimise) {
>         
>         +                       xmlWriter.flush ();
>         
>         +                       MIMEOutputUtils.complete(outStream,
>         bufferedSoapOutStream,
>         
>         +                                       binaryNodeList,
>         getMimeBoundary());
>         
>         +               }
>         
>         +       }
>         
>         +
>         
>         +       private String getMimeBoundary() {
>         
>         +               //TODO have to dynamically generate.
>         
>         +               if (mimeBoundary == null) {
>         
>         +                       mimeBoundary =
>         "----=_AxIs2_Def_boundary_=42214532"; 
>         
>         +               }
>         
>         +               return mimeBoundary;
>         
>         +       }
>         
>         +
>         
>         +}
>         \ No newline at end of file
>         
>         
> 
> 
> 
> -- 
> 
> "May the SourcE be with u" 


Re: [Axis2]Re: svn commit: r202253 - in /webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om: MIMEOutputUtils.java OMOutput.java impl/llom/OMOutput.java

Posted by Sanjiva Weerawarana <sa...@opensource.lk>.
We should not have any o.a.a.attachments stuff .. that's all part of OM
now. 

IMO there's no need to move the MIME code out of OMOutput at all to make
this work.

Sanjiva.

On Tue, 2005-06-28 at 23:54 +0600, Thilina Gunarathne wrote:
> Hi,
> I'm not sure where to keep the MIMEOutputUtils class. For the moment
> it is in o,a,a.om
> Shall we keep it there or move to o.a.a.attachments
>  
> regards,
> ~Thilina
>  
> On 6/28/05, thilina@apache.org <th...@apache.org> wrote: 
>         Author: thilina
>         Date: Tue Jun 28 10:43:09 2005
>         New Revision: 202253
>         
>         URL: http://svn.apache.org/viewcvs?rev=202253&view=rev
>         Log:
>         Moved the JavaMail dependent code pieces to
>         MIMEOutputUtils.java.So that in the run time OM will work
>         without JavaMail. 
>         
>         Added:
>         
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java
>         
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java
>         Removed:
>         
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/impl/llom/OMOutput.java 
>         
>         Added:
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java
>         URL:
>         http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java?rev=202253&view=auto
>         ============================================================================== 
>         ---
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java (added)
>         +++
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/MIMEOutputUtils.java Tue Jun 28 10:43:09 2005
>         @@ -0,0 +1,136 @@ 
>         +/*
>         
>         + * Copyright 2004,2005 The Apache Software Foundation.
>         
>         + *
>         
>         + * 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
>         
>         + *
>         
>         + *      http://www.apache.org/licenses/LICENSE-2.0
>         
>         + *
>         
>         + * 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.
>         
>         + */
>         
>         +package org.apache.axis.om;
>         
>         +
>         
>         +import java.io.IOException;
>         
>         +import java.io.OutputStream;
>         
>         +import java.util.Iterator;
>         
>         +import java.util.LinkedList;
>         
>         +
>         
>         +import javax.activation.DataHandler;
>         
>         +import javax.mail.MessagingException;
>         
>         +import javax.mail.internet.ContentType;
>         
>         +import javax.mail.internet.MimeBodyPart ;
>         
>         +import javax.xml.stream.XMLStreamException;
>         
>         +/**
>         
>         + * @author <a href="mailto:thilina@opensource.lk">Thilina
>         Gunarathne </a>
>         
>         + */ 
>         
>         +public class MIMEOutputUtils {
>         
>         +
>         
>         +       private static byte[] CRLF = { 13, 10 };
>         
>         +
>         
>         +       static String SOAP_PART_CONTENT_ID = "<SOAPPart>";
>         
>         +
>         
>         +       public static void complete(OutputStream outStream, 
>         
>         +                       OutputStream bufferedSoapOutStream,
>         LinkedList binaryNodeList,
>         
>         +                       String boundary) throws
>         XMLStreamException {
>         
>         +               try {
>         
>         +                       startWritingMime(outStream,
>         boundary); 
>         
>         +
>         
>         +
>         
>         +               DataHandler dh = new
>         DataHandler(bufferedSoapOutStream.toString(),
>         
>         +                               "text/xml");
>         
>         +               MimeBodyPart rootMimeBodyPart = new
>         MimeBodyPart(); 
>         
>         +               rootMimeBodyPart.setDataHandler(dh);
>         
>         +               rootMimeBodyPart.addHeader("Content-Type",
>         "application/xop+xml");
>         
>         +
>         rootMimeBodyPart.addHeader("Content-Transfer-Encoding",
>         "8bit"); 
>         
>         +               rootMimeBodyPart.addHeader("Content-ID",
>         SOAP_PART_CONTENT_ID);
>         
>         +
>         
>         +               writeBodyPart(outStream, rootMimeBodyPart,
>         boundary);
>         
>         +
>         
>         +               Iterator binaryNodeIterator =
>         binaryNodeList.iterator();
>         
>         +               while (binaryNodeIterator.hasNext()) {
>         
>         +                       OMText binaryNode = (OMText)
>         binaryNodeIterator.next();
>         
>         +                       writeBodyPart(outStream,
>         createMimeBodyPart(binaryNode), boundary); 
>         
>         +               }
>         
>         +               finishWritingMime(outStream);
>         
>         +               } catch (IOException e) {
>         
>         +                       throw new OMException("Problem with
>         the OutputStream."+e.toString()); 
>         
>         +               } catch (MessagingException e) {
>         
>         +                       throw new OMException("Problem writing
>         Mime Parts."+e.toString());
>         
>         +               }
>         
>         +       }
>         
>         +
>         
>         +       private static MimeBodyPart createMimeBodyPart(OMText
>         node)
>         
>         +                       throws MessagingException {
>         
>         +               MimeBodyPart mimeBodyPart = new
>         MimeBodyPart();
>         
>         +
>         mimeBodyPart.setDataHandler(node.getDataHandler());
>         
>         +
>         mimeBodyPart.addHeader("Content-Transfer-Encoding", "binary");
>         
>         +               mimeBodyPart.addHeader("Content-ID", "<" +
>         node.getContentID() + ">");
>         
>         +               return mimeBodyPart;
>         
>         +
>         
>         +       }
>         
>         +
>         
>         +       /**
>         
>         +        * @throws IOException
>         
>         +        *             This will write the boundary to output
>         Stream 
>         
>         +        */
>         
>         +       private static void writeMimeBoundary(OutputStream
>         outStream,
>         
>         +                       String boundary) throws IOException {
>         
>         +               outStream.write(new byte[] { 45, 45 }); 
>         
>         +               outStream.write(boundary.getBytes());
>         
>         +       }
>         
>         +
>         
>         +       /**
>         
>         +        * @throws IOException
>         
>         +        *             This will write the boundary with CRLF
>         
>         +        */
>         
>         +       private static void startWritingMime(OutputStream
>         outStream, String boundary)
>         
>         +                       throws IOException {
>         
>         +               writeMimeBoundary(outStream, boundary);
>         
>         +               outStream.write(CRLF);
>         
>         +       }
>         
>         +
>         
>         +       /**
>         
>         +        * this will write a CRLF for the earlier boudary then
>         the BodyPart data
>         
>         +        * with headers followed by boundary. Writes only the
>         boundary. No more 
>         
>         +        * CRLF's are wriiting after that.
>         
>         +        *
>         
>         +        * @throws IOException
>         
>         +        * @throws MessagingException
>         
>         +        */
>         
>         +       private static void writeBodyPart(OutputStream
>         outStream, 
>         
>         +                       MimeBodyPart part, String boundary)
>         throws IOException,
>         
>         +                       MessagingException {
>         
>         +               outStream.write(CRLF);
>         
>         +               part.writeTo (outStream);
>         
>         +               outStream.write(CRLF);
>         
>         +               writeMimeBoundary(outStream, boundary);
>         
>         +       }
>         
>         +
>         
>         +       /**
>         
>         +        * @throws IOException
>         
>         +        *             This will write "--" to the end of last
>         boundary 
>         
>         +        */
>         
>         +       private static void finishWritingMime(OutputStream
>         outStream)
>         
>         +                       throws IOException {
>         
>         +               outStream.write(new byte[] { 45, 45 });
>         
>         +       } 
>         
>         +
>         
>         +       public static String getContentTypeForMime(String
>         boundary) {
>         
>         +               ContentType contentType = new ContentType();
>         
>         +               contentType.setPrimaryType("multipart"); 
>         
>         +               contentType.setSubType("related");
>         
>         +               contentType.setParameter("boundary",
>         boundary);
>         
>         +               contentType.setParameter("start",
>         MIMEOutputUtils.SOAP_PART_CONTENT_ID );
>         
>         +               contentType.setParameter("type",
>         "application/xop+xml");
>         
>         +               //TODO theres something called action that can
>         be set with
>         
>         +               // following. May be SOAPAction. Better
>         check. 
>         
>         +               contentType.setParameter("startinfo",
>         "application/xop+xml");
>         
>         +               return contentType.toString();
>         
>         +       }
>         
>         +
>         
>         +}
>         \ No newline at end of file 
>         
>         Added:
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java
>         URL:
>         http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java?rev=202253&view=auto
>         ==============================================================================
>         ---
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java (added)
>         +++
>         webservices/axis/trunk/java/modules/xml/src/org/apache/axis/om/OMOutput.java Tue Jun 28 10:43:09 2005
>         @@ -0,0 +1,135 @@
>         +/*
>         
>         + * Copyright 2004,2005 The Apache Software Foundation.
>         
>         + *
>         
>         + * 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
>         
>         + *
>         
>         + *      http://www.apache.org/licenses/LICENSE-2.0
>         
>         + *
>         
>         + * 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.
>         
>         + */
>         
>         +package org.apache.axis.om;
>         
>         +
>         
>         +import java.io.ByteArrayOutputStream;
>         
>         +import java.io.OutputStream ;
>         
>         +import java.util.LinkedList;
>         
>         +
>         
>         +import javax.xml.stream.FactoryConfigurationError;
>         
>         +import javax.xml.stream.XMLOutputFactory;
>         
>         +import javax.xml.stream.XMLStreamException;
>         
>         +import javax.xml.stream.XMLStreamWriter;
>         
>         +
>         
>         +
>         
>         +/**
>         
>         + * @author <a href="mailto:thilina@opensource.lk">Thilina
>         Gunarathne </a> For
>         
>         + *         the moment this assumes that transport takes the
>         decision of whether
>         
>         + *         to optimise or not by looking at whether the MTOM
>         optimise is enabled &
>         
>         + *         also looking at the OM tree whether it has any
>         optimisable content 
>         
>         + */
>         
>         +
>         
>         +public class OMOutput {
>         
>         +       private XMLStreamWriter xmlWriter;
>         
>         +
>         
>         +       private boolean doOptimise;
>         
>         +
>         
>         +       private OutputStream outStream;
>         
>         +
>         
>         +       private XMLStreamWriter writer;
>         
>         +
>         
>         +       private LinkedList binaryNodeList;
>         
>         +
>         
>         +       private ByteArrayOutputStream bufferedSoapOutStream;
>         
>         +
>         
>         +       private String mimeBoundary = null; 
>         
>         +
>         
>         +       private String contentType = null;
>         
>         +
>         
>         +       /**
>         
>         +        * @param xmlWriter
>         
>         +        *            if it is guaranteed for not using
>         attachments one can use this
>         
>         +        */
>         
>         +       public OMOutput(XMLStreamWriter xmlWriter) {
>         
>         +               this.xmlWriter = xmlWriter;
>         
>         +       }
>         
>         +
>         
>         +       /**
>         
>         +        * @throws FactoryConfigurationError
>         
>         +        * @throws XMLStreamException
>         
>         +        *
>         
>         +        */
>         
>         +       public OMOutput(OutputStream outStream, boolean
>         doOptimise)
>         
>         +                       throws XMLStreamException,
>         FactoryConfigurationError { 
>         
>         +               this.doOptimise = doOptimise;
>         
>         +               this.outStream = outStream;
>         
>         +               if (doOptimise) {
>         
>         +                       bufferedSoapOutStream = new
>         ByteArrayOutputStream(); 
>         
>         +                       xmlWriter =
>         XMLOutputFactory.newInstance().createXMLStreamWriter(
>         
>         +
>         bufferedSoapOutStream);
>         
>         +                       binaryNodeList = new LinkedList(); 
>         
>         +               } else {
>         
>         +                       xmlWriter =
>         XMLOutputFactory.newInstance().createXMLStreamWriter(
>         
>         +                                       outStream);
>         
>         +
>         
>         +               } 
>         
>         +
>         
>         +       }
>         
>         +
>         
>         +       public XMLStreamWriter getXmlStreamWriter() {
>         
>         +               return xmlWriter;
>         
>         +       }
>         
>         +
>         
>         +       public void flush() throws XMLStreamException { 
>         
>         +               //              if (doOptimise) {
>         
>         +               //                      try {
>         
>         +               //                              this.complete();
>         
>         +               //                      } catch (IOException
>         e) { 
>         
>         +               //                              //TODO this is
>         just a hack to avoid passing IOException. Must find a
>         
>         +               // better way to handle this
>         
>         +               //                              throw new
>         XMLStreamException("Error creating mime parts. Problem with 
>         
>         +               // Streams");
>         
>         +               //                      } catch
>         (MessagingException e) {
>         
>         +               //                              throw new
>         XMLStreamException("Error creating mime Body parts"); 
>         
>         +               //                      }
>         
>         +               //              } else {
>         
>         +               xmlWriter.flush();
>         
>         +               //              }
>         
>         +
>         
>         +       }
>         
>         +
>         
>         +       public boolean doOptimise() {
>         
>         +               return doOptimise;
>         
>         +       }
>         
>         +
>         
>         +       public String getContentType() {
>         
>         +               if (contentType == null && doOptimise) { 
>         
>         +
>         MIMEOutputUtils.getContentTypeForMime(getMimeBoundary());
>         
>         +               }
>         
>         +               return contentType.toString();
>         
>         +       }
>         
>         +
>         
>         +       public void writeOptimised(OMText node) { 
>         
>         +               binaryNodeList.add(node);
>         
>         +       }
>         
>         +
>         
>         +       public void complete() throws XMLStreamException {
>         
>         +               if (doOptimise) {
>         
>         +                       xmlWriter.flush ();
>         
>         +                       MIMEOutputUtils.complete(outStream,
>         bufferedSoapOutStream,
>         
>         +                                       binaryNodeList,
>         getMimeBoundary());
>         
>         +               }
>         
>         +       }
>         
>         +
>         
>         +       private String getMimeBoundary() {
>         
>         +               //TODO have to dynamically generate.
>         
>         +               if (mimeBoundary == null) {
>         
>         +                       mimeBoundary =
>         "----=_AxIs2_Def_boundary_=42214532"; 
>         
>         +               }
>         
>         +               return mimeBoundary;
>         
>         +       }
>         
>         +
>         
>         +}
>         \ No newline at end of file
>         
>         
> 
> 
> 
> -- 
> 
> "May the SourcE be with u"