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/07/20 14:11:22 UTC

svn commit: r219884 - in /webservices/axis/trunk/java/modules/xml: src/org/apache/axis2/attachments/ src/org/apache/axis2/om/impl/ src/org/apache/axis2/om/impl/llom/ src/org/apache/axis2/om/impl/llom/mtom/ test-resources/mtom/ test/org/apache/axis2/om/

Author: thilina
Date: Wed Jul 20 05:11:18 2005
New Revision: 219884

URL: http://svn.apache.org/viewcvs?rev=219884&view=rev
Log:
Changing MIME Content-ID processing according to the spec & MSFT way

Modified:
    webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java
    webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java
    webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java
    webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java
    webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java
    webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java
    webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt
    webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java

Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java?rev=219884&r1=219883&r2=219884&view=diff
==============================================================================
--- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java (original)
+++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java Wed Jul 20 05:11:18 2005
@@ -1,22 +1,19 @@
 /**
- * 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/>
+ * 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.axis2.attachments;
 
-import org.apache.axis2.om.OMException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PushbackInputStream;
+import java.util.HashMap;
 
 import javax.activation.DataHandler;
 import javax.mail.MessagingException;
@@ -24,90 +21,94 @@
 import javax.mail.internet.ContentType;
 import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.ParseException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PushbackInputStream;
-import java.util.HashMap;
 
+import org.apache.axis2.om.OMException;
+
+/**
+ * @author <a href="mailto:thilina@opensource.lk"> Thilina Gunarathne </a>
+ */
 public class MIMEHelper {
     /**
      * if the Message is MTOM optimised then <code>MTOM_TYPE</code>
      */
     public static final String MTOM_TYPE = "application/xop+xml";
-
+    
     /**
      * If the message is Soap with Attachments <code>SwA_TYPE</code>
      */
     public static final String SWA_TYPE = "text/xml";
-
+    
     /**
      * <code>rootPart</code> is used as the key for the root BodyPart in the
      * Parts HashMap
      */
     public static final String ROOT_PART = "SoapPart";
-
+    
     /**
      * <code>ContentType</code> of the MIME message
      */
     ContentType contentType;
-
+    
     /**
      * Mime <code>boundary</code> which seperates mime parts
      */
     byte[] boundary;
-
+    
     /**
      * <code>applicationType</code> used to distinguish between MTOM & SWA If
      * the message is MTOM optimised type is application/xop+xml If the message
      * is SWA, type is ??have to find out
      */
     String applicationType = null;
-
+    
     /**
      * <code>pushbackInStream</code> stores the reference to the incoming
      * stream A PushbackStream has the ability to "push back" or "unread" one
      * byte.
      */
     PushbackInputStream pushbackInStream;
-
+    
     /**
      * <code>mimeBodyPartsMap</code> stores the already parsed Mime Body
      * Parts. This Map will be keyed using the content-ID's
      */
     HashMap bodyPartsMap;
-
+    
     /**
      * <code>partIndex</code>- Number of Mime parts parsed
      */
     int partIndex = 0;
-
+    
+    boolean endOfStreamReached = false;
+    
     String firstPartId = null;
-
+    
     boolean fileCacheEnable = false;
-
+    
     String attachmentRepoDir = null;
-
+    
     public MIMEHelper(InputStream inStream, String contentTypeString,
-                      boolean fileCacheEnable, String attachmentRepoDir)
-            throws OMException {
+            boolean fileCacheEnable, String attachmentRepoDir)
+    throws OMException {
         this.attachmentRepoDir = attachmentRepoDir;
         this.fileCacheEnable = fileCacheEnable;
         bodyPartsMap = new HashMap();
         try {
             contentType = new ContentType(contentTypeString);
         } catch (ParseException e) {
-            throw new OMException("Invalid Content Type Field in the Mime Message"
+            throw new OMException(
+                    "Invalid Content Type Field in the Mime Message"
                     + e.toString());
         }
         // Boundary always have the prefix "--".
         this.boundary = ("--" + contentType.getParameter("boundary"))
-                .getBytes();
-
+        .getBytes();
+        
         //TODO do we need to wrap InputStream from a BufferedInputStream before
         // wrapping from PushbackStream
         pushbackInStream = new PushbackInputStream(inStream,
                 (this.boundary.length + 2));
-
+        
         // Move the read pointer to the begining of the first part
         // read till the end of first boundary
         while (true) {
@@ -121,7 +122,7 @@
                         value = pushbackInStream.read();
                         if (value == -1)
                             throw new OMException(
-                                    "Unexpected End of Stream while searching for first Mime Boundary");
+                            "Unexpected End of Stream while searching for first Mime Boundary");
                         boundaryIndex++;
                     }
                     if (boundaryIndex == boundary.length) { // boundary found
@@ -130,19 +131,19 @@
                     }
                 } else if ((byte) value == -1) {
                     throw new OMException(
-                            "Mime parts not found. Stream ended while searching for the boundary");
+                    "Mime parts not found. Stream ended while searching for the boundary");
                 }
             } catch (IOException e1) {
                 throw new OMException("Stream Error" + e1.toString());
             }
         }
     }
-
+    
     public MIMEHelper(InputStream inStream, String contentTypeString)
-            throws OMException {
+    throws OMException {
         this(inStream, contentTypeString, false, null);
     }
-
+    
     /**
      * @return whether Message Type is SOAP with Attachments or MTOM optimised
      *         by checking the application type parameter in the Contant Type
@@ -156,12 +157,12 @@
                 this.applicationType = SWA_TYPE;
             } else {
                 throw new OMException(
-                        "Invalid Application type. Support available for MTOM & SwA only.");
+                "Invalid Application type. Support available for MTOM & SwA only.");
             }
         }
         return this.applicationType;
     }
-
+    
     /**
      * @return the InputStream which includes the SOAP Envelope We assumes that
      *         the root mime part is always pointed by "start" parameter in
@@ -169,6 +170,7 @@
      */
     public InputStream getSOAPPartInputStream() throws OMException {
         String rootContentID = contentType.getParameter("start");
+        
         // to handle the Start parameter not mentioned situation
         if (rootContentID == null) {
             if (partIndex == 0) {
@@ -177,13 +179,23 @@
             rootContentID = firstPartId;
         } else {
             rootContentID.trim();
+            // Keep it here till we make sure the two angle brackets are
+            // required or not
+            if ((rootContentID.indexOf("<") > -1)
+                    & (rootContentID.indexOf(">") > -1))
+                rootContentID = rootContentID.substring(1, (rootContentID
+                        .length() - 1));
+        }
+        // Strips off the "cid" part from content-id
+        if (rootContentID.substring(0, 3).equalsIgnoreCase("cid")) {
+            rootContentID = rootContentID.substring(4);
         }
         DataHandler dh;
         try {
             dh = getDataHandler(rootContentID);
             if (dh == null) {
                 throw new OMException(
-                        "Mandatory Root MIME part containing the SOAP Envelope is missing");
+                "Mandatory Root MIME part containing the SOAP Envelope is missing");
             }
             return dh.getInputStream();
         } catch (IOException e) {
@@ -191,21 +203,22 @@
                     "Problem with DataHandler of the Root Mime Part. " + e);
         }
     }
-
+    
     /**
      * @param blobContentID
      * @return The DataHandler of the mime part refered by the content-Id
-     * @throws OMException First checks whether the MIME part is already parsed by
-     *                     checking the parts HashMap. If it is not parsed yet then call
-     *                     the getNextPart() till we find the required part.
+     * @throws OMException
+     *             First checks whether the MIME part is already parsed by
+     *             checking the parts HashMap. If it is not parsed yet then call
+     *             the getNextPart() till we find the required part.
      */
     public DataHandler getDataHandler(String blobContentID) throws OMException {
-
+        
         Part bodyPart;
+        //	blobContentID = "<" + blobContentID + ">";
         boolean attachmentFound = false;
-
-        //		// without the following part a Null Pointer Exception is thrown
-        //
+        
+        //TODO make sure to add surrounding angle brackets to the content ID
         if (bodyPartsMap.containsKey(blobContentID)) {
             bodyPart = (Part) bodyPartsMap.get(blobContentID);
             attachmentFound = true;
@@ -231,40 +244,53 @@
                     }
                 }
             } catch (MessagingException e) {
-                throw new OMException("Invalid Mime Message " + e.toString());
+                throw new OMException("Invalid Mime Message " + e);
             }
         }
-
+        
     }
-
+    
+    protected void setEndOfStream(boolean value)
+    {
+        this.endOfStreamReached = value;
+        
+    }
+    
     /**
      * @return The next MIME Body part in the stream Uses the MimeBodyPartStream
      *         to obtain streams delimited by boundaries.
-     * @throws MessagingException
+     * @throws OMException
      */
-    // TODO do we need Locking for this
     private MimeBodyPart getMimeBodyPart() throws OMException {
+        // endOfStreamReached will be set to true if the message ended in MIME Style
+        // having "--" suffix with the last mime boundary
+        if (endOfStreamReached)
+            throw new OMException(
+            "Referenced MIME part not found.End of Stream reached.");
+        
         MimeBodyPart mimeBodyPart = null;
-
         MimeBodyPartInputStream partStream;
-        partStream = new MimeBodyPartInputStream(pushbackInStream,
-                boundary);
+        partStream = new MimeBodyPartInputStream(pushbackInStream, boundary,
+                this);
         try {
             mimeBodyPart = new MimeBodyPart(partStream);
+            
+            // This will take care if stream ended without having MIME message terminator
+            if (mimeBodyPart.getSize() <= 0) {
+                throw new OMException(
+                "Referenced MIME part not found.End of Stream reached.");
+            }
         } catch (MessagingException e) {
             throw new OMException("Problem reading Mime Part No "
                     + (partIndex + 1) + ". " + e);
         }
-
         partIndex++;
         return mimeBodyPart;
     }
-
+    
     /**
-     * @return The Mime body part which contains the SOAP Envelope In MTOM case
-     *         it is the first part In SwA case we assumes it to be first
-     *         part.Have to FIX This
-     * @throws MessagingException
+     * @return
+     * @throws OMException
      */
     private MimeBodyPart getRootMimeBodyPart() throws OMException {
         MimeBodyPart rootMimeBodyPart;
@@ -276,7 +302,7 @@
         }
         return rootMimeBodyPart;
     }
-
+    
     private Part getNextPart() throws OMException {
         MimeBodyPart nextMimeBodyPart;
         nextMimeBodyPart = getMimeBodyPart();
@@ -284,31 +310,51 @@
             String partContentID;
             try {
                 partContentID = nextMimeBodyPart.getContentID();
+                
                 if (partContentID == null & partIndex == 1) {
                     bodyPartsMap.put("firstPart", nextMimeBodyPart);
                     firstPartId = "firstPart";
                     return nextMimeBodyPart;
+                }
+                if (partContentID == null) {
+                    throw new OMException(
+                    "Part content ID cannot be blank for non root MIME parts");
+                }
+                if ((partContentID.indexOf("<") > -1)
+                        & (partContentID.indexOf(">") > -1)) {
+                    partContentID = partContentID.substring(1, (partContentID
+                            .length() - 1));
+                    
                 } else if (partIndex == 1) {
                     firstPartId = partContentID;
                 }
-                if (fileCacheEnable) {
-                    PartOnFile part = new PartOnFile(nextMimeBodyPart,
-                            partContentID,
-                            attachmentRepoDir);
-                    return part;
-                } else {
-                    bodyPartsMap.put(partContentID, nextMimeBodyPart);
-                    return nextMimeBodyPart;
+                if (bodyPartsMap.containsKey(partContentID))
+                {
+                    throw new OMException("Two MIME parts with the same Content-ID not allowed.");
                 }
+       /*
+        * Temporary File storage support is deffered till 1.0
+        */         
+                //                if (fileCacheEnable) {
+                //                    PartOnFile part = new PartOnFile(nextMimeBodyPart,
+                //                            partContentID,
+                //                            attachmentRepoDir);
+                //                    return part;
+                //                } else {
+                bodyPartsMap.put(partContentID, nextMimeBodyPart);
+                return nextMimeBodyPart;
+                //                }
             } catch (MessagingException e) {
-                throw new OMException("Error Reading Content-ID from Mime Part No "
-                        + partIndex + ". " + e);
-            } catch (Exception e) {
-                throw new OMException("Error Creating File  Storage Part"
+                throw new OMException(
+                        "Error Reading Content-ID from Mime Part No "
                         + partIndex + ". " + e);
             }
+            //            } catch (Exception e) {
+            //                throw new OMException("Error Creating File Storage Part"
+            //                        + partIndex + ". " + e);
+            //            }
         } else
             return null;
     }
-
+    
 }

Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java?rev=219884&r1=219883&r2=219884&view=diff
==============================================================================
--- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java (original)
+++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java Wed Jul 20 05:11:18 2005
@@ -1,18 +1,12 @@
 /**
- * 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/>
+ * 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.axis2.attachments;
 
@@ -25,15 +19,22 @@
 
     boolean boundaryFound = false;
 
+    MIMEHelper parent = null;
+
     byte[] boundary;
 
-    public MimeBodyPartInputStream(PushbackInputStream inStream,
-                                   byte[] boundary) {
+    public MimeBodyPartInputStream(PushbackInputStream inStream, byte[] boundary) {
         super();
         this.inStream = inStream;
         this.boundary = boundary;
     }
 
+    public MimeBodyPartInputStream(PushbackInputStream inStream,
+            byte[] boundary, MIMEHelper parent) {
+        this(inStream, boundary);
+        this.parent = parent;
+    }
+
     public int read() throws IOException {
         if (boundaryFound) {
             return -1;
@@ -41,7 +42,8 @@
         // read the next value from stream
         int value = inStream.read();
 
-        // A problem occured because all the mime parts tends to have a /r/n at the end. Making it hard to transform them to correct DataSources.
+        // A problem occured because all the mime parts tends to have a /r/n at
+        // the end. Making it hard to transform them to correct DataSources.
         // This logic introduced to handle it
         //TODO look more in to this && for a better way to do this
         if (value == 13) {
@@ -64,22 +66,23 @@
         // read value is the first byte of the boundary. Start matching the
         // next characters to find a boundary
         int boundaryIndex = 0;
-        while ((boundaryIndex < boundary.length)
+        while ((boundaryIndex < (boundary.length - 1))
                 && ((byte) value == boundary[boundaryIndex])) {
             value = inStream.read();
             boundaryIndex++;
         }
 
-        if (boundaryIndex == boundary.length) { // boundary found
+        if (boundaryIndex == (boundary.length - 1)) { // boundary found
             boundaryFound = true;
             // read the end of line character
-            if (inStream.read() == 45) {
+            if ((value = inStream.read()) == 45) {
                 //check whether end of stream
                 //Last mime boundary should have a succeeding "--"
-                if (!((value = inStream.read()) == 45)) {
-                    inStream.unread(value);
+                if ((value = inStream.read()) == 45 && parent!=null) {
+                    parent.setEndOfStream(true);
                 }
-
+            } else {
+                inStream.read();
             }
 
             return -1;

Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java?rev=219884&r1=219883&r2=219884&view=diff
==============================================================================
--- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java (original)
+++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java Wed Jul 20 05:11:18 2005
@@ -15,22 +15,22 @@
  */
 package org.apache.axis2.om.impl;
 
-import org.apache.axis2.om.OMText;
-import org.apache.axis2.om.OMException;
-
-import javax.activation.DataHandler;
-import javax.mail.MessagingException;
-import javax.mail.internet.ContentType;
-import javax.mail.internet.MimeBodyPart;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Random;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Random;
+
+import javax.activation.DataHandler;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeBodyPart;
+
+import org.apache.axis2.om.OMException;
+import org.apache.axis2.om.OMText;
 
 public class MIMEOutputUtils {
 
@@ -51,7 +51,7 @@
             rootMimeBodyPart.addHeader("content-type",
                     "application/xop+xml; charset=utf-8; type=\"text/xml; charset=utf-8\"");
             rootMimeBodyPart.addHeader("content-transfer-encoding", "binary");
-            rootMimeBodyPart.addHeader("content-id", contentId);
+            rootMimeBodyPart.addHeader("content-id","<"+contentId+">");
 
             writeBodyPart(outStream, rootMimeBodyPart, boundary);
 
@@ -73,7 +73,7 @@
             throws MessagingException {
         MimeBodyPart mimeBodyPart = new MimeBodyPart();
         mimeBodyPart.setDataHandler(node.getDataHandler());
-        mimeBodyPart.addHeader("content-id", node.getContentID());
+        mimeBodyPart.addHeader("content-id", "<"+node.getContentID()+">");
         mimeBodyPart.addHeader("content-type", "application/octet-stream");
         mimeBodyPart.addHeader("content-transfer-encoding", "binary");
         return mimeBodyPart;
@@ -133,7 +133,7 @@
         sb.append("; ");
         sb.append("type=\"application/xop+xml\"");
         sb.append("; ");
-        sb.append("start=\"" + contentId + "\"");
+        sb.append("start=\"<" + "cid:"+contentId + ">\"");
         sb.append("; ");
         sb.append("start-info=\"text/xml; charset=utf-8\"");
         return sb.toString();

Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java?rev=219884&r1=219883&r2=219884&view=diff
==============================================================================
--- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java (original)
+++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java Wed Jul 20 05:11:18 2005
@@ -15,20 +15,16 @@
  */
 package org.apache.axis2.om.impl;
 
-import org.apache.axis2.om.OMText;
+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;
-import java.io.ByteArrayOutputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.LinkedList;
-import java.util.Random;
+
+import org.apache.axis2.om.OMText;
 
 /**
  * For the moment this assumes that transport takes the decision of whether
@@ -104,20 +100,20 @@
 
     public String getMimeBoundary() {
         if(mimeBoundary == null) {
-            mimeBoundary = "--MIMEBoundary" + MIMEOutputUtils.getRandomStringOf18Characters();
+            mimeBoundary = "MIMEBoundary" + MIMEOutputUtils.getRandomStringOf18Characters();
         }
         return mimeBoundary;
     }
 
     public String getRootContentId() {
         if(rootContentId == null) {
-            rootContentId = "cid:0." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
+            rootContentId = "0." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
         }
         return rootContentId;
     }
 
     public String getNextContentId() {
         nextid++;
-        return "cid:" + nextid + "." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
+        return nextid + "." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
     }
 }

Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java?rev=219884&r1=219883&r2=219884&view=diff
==============================================================================
--- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java (original)
+++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java Wed Jul 20 05:11:18 2005
@@ -1,20 +1,29 @@
 /*
  * 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
- *
+ * 
+ * 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.
+ * 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.axis2.om.impl.llom;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.Random;
+
+import javax.activation.DataHandler;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
 import org.apache.axis2.attachments.Base64;
 import org.apache.axis2.attachments.ByteArrayDataSource;
 import org.apache.axis2.attachments.IOUtils;
@@ -24,386 +33,406 @@
 import org.apache.axis2.om.OMException;
 import org.apache.axis2.om.OMNamespace;
 import org.apache.axis2.om.OMNode;
-import org.apache.axis2.om.impl.OMOutputImpl;
-import org.apache.axis2.om.impl.MIMEOutputUtils;
 import org.apache.axis2.om.OMText;
 import org.apache.axis2.om.OMXMLParserWrapper;
+import org.apache.axis2.om.impl.MIMEOutputUtils;
+import org.apache.axis2.om.impl.OMOutputImpl;
 import org.apache.axis2.om.impl.llom.mtom.MTOMStAXSOAPModelBuilder;
 
-import javax.activation.DataHandler;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Date;
-import java.util.Random;
-
 public class OMTextImpl extends OMNodeImpl implements OMText, OMConstants {
-    protected String value = null;
-    protected String mimeType;
-    protected boolean optimize = false;
-    protected boolean isBinary = false;
-    private static Random rnd = new Random(new Date().getTime());
-    /**
-     * Field contentID for the mime part used when serialising Binary stuff as
-     * MTOM optimised
-     */
-    private String contentID = null;
-    /**
-     * Field dataHandler
-     */
-    private DataHandler dataHandler = null;
-    /**
-     * Field nameSpace used when serialising Binary stuff as MTOM optimised
-     */
-    protected OMNamespace ns = new OMNamespaceImpl(
-            "http://www.w3.org/2004/08/xop/include", "xop");
-    /**
-     * Field localName used when serialising Binary stuff as MTOM optimised
-     */
-    protected String localName = "Include";
-    /**
-     * Field attributes used when serialising Binary stuff as MTOM optimised
-     */
-    protected OMAttribute attribute;
-
-    /**
-     * Constructor OMTextImpl
-     *
-     * @param s
-     */
-    public OMTextImpl(String s) {
-        this.value = s;
-        this.nodeType = TEXT_NODE;
-    }
-
-    /**
-     * Constructor OMTextImpl
-     *
-     * @param parent
-     * @param text
-     */
-    public OMTextImpl(OMElement parent, String text) {
-        super(parent);
-        this.value = text;
-        done = true;
-        this.nodeType = TEXT_NODE;
-    }
-
-    /**
-     * @param s        -
-     *                 base64 encoded String representation of Binary
-     * @param mimeType of the Binary
-     */
-    public OMTextImpl(String s, String mimeType, boolean optimize) {
-        this(null, s, mimeType, optimize);
-    }
-
-    /**
-     * @param parent
-     * @param s        -
-     *                 base64 encoded String representation of Binary
-     * @param mimeType of the Binary
-     */
-    public OMTextImpl(OMElement parent, String s, String mimeType,
-                      boolean optimize) {
-        this(parent, s);
-        this.mimeType = mimeType;
-        this.optimize = optimize;
-        done = true;
-        this.nodeType = TEXT_NODE;
-    }
-
-    /**
-     * @param dataHandler To send binary optimised content Created programatically.
-     */
-    public OMTextImpl(DataHandler dataHandler) {
-        this(dataHandler, true);
-    }
-
-    /**
-     * @param dataHandler
-     * @param optimize    To send binary content. Created progrmatically.
-     */
-    public OMTextImpl(DataHandler dataHandler, boolean optimize) {
-        this.dataHandler = dataHandler;
-        this.isBinary = true;
-        this.optimize = optimize;
-        done = true;
-        this.nodeType = TEXT_NODE;
-    }
-
-    /**
-     * @param contentID
-     * @param parent
-     * @param builder   Used when the builder is encountered with a XOP:Include tag
-     *                  Stores a reference to the builder and the content-id. Supports
-     *                  deffered parsing of MIME messages
-     */
-    public OMTextImpl(String contentID, OMElement parent,
-                      OMXMLParserWrapper builder) {
-        super(parent);
-        this.contentID = contentID;
-        this.optimize = true;
-        this.isBinary = true;
-        this.builder = builder;
-        this.nodeType = TEXT_NODE;
-    }
-
-    /**
-     * @param omOutput
-     * @throws XMLStreamException
-     */
-    public void serializeWithCache(org.apache.axis2.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
-        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
-        int type = getType();
-        if (type == TEXT_NODE) {
-            writer.writeCharacters(this.value);
-        } else if (type == CDATA_SECTION_NODE) {
-            writer.writeCData(this.value);
-        }
-        OMNode nextSibling = this.getNextSibling();
-        if (nextSibling != null) {
-            nextSibling.serializeWithCache(omOutput);
-        }
-    }
-
-    /**
-     * Returns the value
-     */
-    public String getText() throws OMException {
-        if (this.value != null) {
-            return this.value;
-        } else {
-            try {
-                InputStream inStream;
-                inStream = this.getInputStream();
-                byte[] data;
-                data = new byte[inStream.available()];
-                IOUtils.readFully(inStream, data);
-                return Base64.encode(data);
-            } catch (Exception e) {
-                throw new OMException("Cannot read from Stream taken form the Data Handler"
-                        + e);
-            }
-        }
-    }
-
-    public boolean isOptimized() {
-        return optimize;
-    }
-
-    public void setOptimize(boolean value) {
-        this.optimize = value;
-    }
-
-    /**
-     * @return
-     * @throws org.apache.axis2.om.OMException
-     *
-     * @throws OMException
-     */
-    public DataHandler getDataHandler() {
-        /*
-        * this should return a DataHandler containing the binary data
-        * reperesented by the Base64 strings stored in OMText
-        */
-        if (value != null) {
-            ByteArrayDataSource dataSource;
-            byte[] data = Base64.decode(value);
-            if (mimeType != null) {
-                dataSource = new ByteArrayDataSource(data, mimeType);
-            } else {
-                // Assumes type as application/octet-stream
-                dataSource = new ByteArrayDataSource(data);
-            }
-            return new DataHandler(dataSource);
-        } else {
-            if (contentID == null){
-                throw new RuntimeException("ContentID is null");
-            }
-            if (dataHandler == null) {
-                dataHandler = ((MTOMStAXSOAPModelBuilder) builder)
-                        .getDataHandler(contentID);
-            }
-            return dataHandler;
-        }
-    }
-
-    public String getLocalName() {
-        return localName;
-    }
-
-    public java.io.InputStream getInputStream() throws OMException {
-        if (isBinary) {
-            if (dataHandler == null) {
-                getDataHandler();
-            }
-            InputStream inStream;
-            try {
-                inStream = dataHandler.getDataSource().getInputStream();
-            } catch (IOException e) {
-                throw new OMException(
-                        "Cannot get InputStream from DataHandler." + e);
-            }
-            return inStream;
-        } else {
-            throw new OMException("Unsupported Operation");
-        }
-    }
-
-    public String getContentID() {
-        if(contentID == null) {
-            contentID = "cid:" + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
-        }
-        return this.contentID;
-    }
-
-    public boolean isComplete() {
-        return done;
-    }
-
-    public void serialize(org.apache.axis2.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
-        if (!this.isBinary) {
-            serializeWithCache(omOutput);
-        } else {
-            if (omOutput.isOptimized()) {
-                if(contentID == null){
-                    contentID = omOutput.getNextContentId();
-                }
-                // send binary as MTOM optimised
-                this.attribute =
-                        new OMAttributeImpl("href",
-                                new OMNamespaceImpl("", ""),
-                                getContentID());
-                this.serializeStartpart(omOutput);
-                omOutput.writeOptimized(this);
-                omOutput.getXmlStreamWriter().writeEndElement();
-            } else {
-                omOutput.getXmlStreamWriter().writeCharacters(this.getText());
-            }
-            // TODO do we need these
-            OMNode nextSibling = this.getNextSibling();
-            if (nextSibling != null) {
-                // serilize next sibling
-                nextSibling.serialize(omOutput);
-            } else {
-                // TODO : See whether following part is really needed
-                if (parent != null && !parent.isComplete()) {
-                    // do the special serialization
-                    // Only the push serializer is left now
-                    builder.next();
-                }
-            }
-        }
-    }
-
-    /*
-    * Methods to copy from OMSerialize utils
-    */
-    private void serializeStartpart(OMOutputImpl omOutput)
-            throws XMLStreamException {
-        String nameSpaceName;
-        String writer_prefix;
-        String prefix;
-        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
-        if (this.ns != null) {
-            nameSpaceName = this.ns.getName();
-            writer_prefix = writer.getPrefix(nameSpaceName);
-            prefix = this.ns.getPrefix();
-            if (nameSpaceName != null) {
-                if (writer_prefix != null) {
-                    writer.writeStartElement(nameSpaceName,
-                            this.getLocalName());
-                } else {
-                    if (prefix != null) {
-                        writer.writeStartElement(prefix, this.getLocalName(),
-                                nameSpaceName);
-                        //TODO FIX ME
-                        //writer.writeNamespace(prefix, nameSpaceName);
-                        writer.setPrefix(prefix, nameSpaceName);
-                    } else {
-                        writer.writeStartElement(nameSpaceName,
-                                this.getLocalName());
-                        writer.writeDefaultNamespace(nameSpaceName);
-                        writer.setDefaultNamespace(nameSpaceName);
-                    }
-                }
-            } else {
-                writer.writeStartElement(this.getLocalName());
-            }
-        } else {
-            writer.writeStartElement(this.getLocalName());
-        }
-        // add the elements attribute "href"
-        serializeAttribute(this.attribute, omOutput);
-        // add the namespace
-        serializeNamespace(this.ns, omOutput);
-    }
-
-    /**
-     * Method serializeAttribute
-     *
-     * @param attr
-     * @param omOutput
-     * @throws XMLStreamException
-     */
-    static void serializeAttribute(OMAttribute attr, OMOutputImpl omOutput)
-            throws XMLStreamException {
-        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
-        // first check whether the attribute is associated with a namespace
-        OMNamespace ns = attr.getNamespace();
-        String prefix;
-        String namespaceName;
-        if (ns != null) {
-            // add the prefix if it's availble
-            prefix = ns.getPrefix();
-            namespaceName = ns.getName();
-            if (prefix != null) {
-                writer.writeAttribute(prefix,
-                        namespaceName,
-                        attr
-                                .getLocalName(),
-                        attr.getValue());
-            } else {
-                writer.writeAttribute(namespaceName,
-                        attr.getLocalName(),
-                        attr
-                                .getValue());
-            }
-        } else {
-            writer.writeAttribute(attr.getLocalName(), attr.getValue());
-        }
-    }
-
-    /**
-     * Method serializeNamespace
-     *
-     * @param namespace
-     * @param omOutput
-     * @throws XMLStreamException
-     */
-    static void serializeNamespace(OMNamespace namespace, org.apache.axis2.om.impl.OMOutputImpl omOutput)
-            throws XMLStreamException {
-        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
-        if (namespace != null) {
-            String uri = namespace.getName();
-            String ns_prefix = namespace.getPrefix();
-            writer.writeNamespace(ns_prefix, namespace.getName());
-            writer.setPrefix(ns_prefix, uri);
-        }
-    }
-
-    /**
-     * Slightly different implementation of the discard method
-     *
-     * @throws OMException
-     */
-    public void discard() throws OMException {
-        if (done) {
-            this.detach();
-        } else {
-            builder.discard((OMElement) this.parent);
-        }
-    }
+	protected String value = null;
+
+	protected String mimeType;
+
+	protected boolean optimize = false;
+
+	protected boolean isBinary = false;
+
+	private static Random rnd = new Random(new Date().getTime());
+
+	/**
+	 * Field contentID for the mime part used when serialising Binary stuff as
+	 * MTOM optimised
+	 */
+	private String contentID = null;
+
+	/**
+	 * Field dataHandler
+	 */
+	private DataHandler dataHandler = null;
+
+	/**
+	 * Field nameSpace used when serialising Binary stuff as MTOM optimised
+	 */
+	protected OMNamespace ns = new OMNamespaceImpl(
+			"http://www.w3.org/2004/08/xop/include", "xop");
+
+	/**
+	 * Field localName used when serialising Binary stuff as MTOM optimised
+	 */
+	protected String localName = "Include";
+
+	/**
+	 * Field attributes used when serialising Binary stuff as MTOM optimised
+	 */
+	protected OMAttribute attribute;
+
+	/**
+	 * Constructor OMTextImpl
+	 * 
+	 * @param s
+	 */
+	public OMTextImpl(String s) {
+		this.value = s;
+		this.nodeType = TEXT_NODE;
+	}
+
+	/**
+	 * Constructor OMTextImpl
+	 * 
+	 * @param parent
+	 * @param text
+	 */
+	public OMTextImpl(OMElement parent, String text) {
+		super(parent);
+		this.value = text;
+		done = true;
+		this.nodeType = TEXT_NODE;
+	}
+
+	/**
+	 * @param s -
+	 *            base64 encoded String representation of Binary
+	 * @param mimeType
+	 *            of the Binary
+	 */
+	public OMTextImpl(String s, String mimeType, boolean optimize) {
+		this(null, s, mimeType, optimize);
+	}
+
+	/**
+	 * @param parent
+	 * @param s -
+	 *            base64 encoded String representation of Binary
+	 * @param mimeType
+	 *            of the Binary
+	 */
+	public OMTextImpl(OMElement parent, String s, String mimeType,
+			boolean optimize) {
+		this(parent, s);
+		this.mimeType = mimeType;
+		this.optimize = optimize;
+		done = true;
+		this.nodeType = TEXT_NODE;
+	}
+
+	/**
+	 * @param dataHandler
+	 *            To send binary optimised content Created programatically.
+	 */
+	public OMTextImpl(DataHandler dataHandler) {
+		this(dataHandler, true);
+	}
+
+	/**
+	 * @param dataHandler
+	 * @param optimize
+	 *            To send binary content. Created progrmatically.
+	 */
+	public OMTextImpl(DataHandler dataHandler, boolean optimize) {
+		this.dataHandler = dataHandler;
+		this.isBinary = true;
+		this.optimize = optimize;
+		done = true;
+		this.nodeType = TEXT_NODE;
+	}
+
+	/**
+	 * @param contentID
+	 * @param parent
+	 * @param builder
+	 *            Used when the builder is encountered with a XOP:Include tag
+	 *            Stores a reference to the builder and the content-id. Supports
+	 *            deffered parsing of MIME messages
+	 */
+	public OMTextImpl(String contentID, OMElement parent,
+			OMXMLParserWrapper builder) {
+		super(parent);
+		this.contentID = contentID;
+		this.optimize = true;
+		this.isBinary = true;
+		this.builder = builder;
+		this.nodeType = TEXT_NODE;
+	}
+
+	/**
+	 * @param omOutput
+	 * @throws XMLStreamException
+	 */
+	public void serializeWithCache(
+			org.apache.axis2.om.impl.OMOutputImpl omOutput)
+			throws XMLStreamException {
+		XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+		int type = getType();
+		if (type == TEXT_NODE) {
+			writer.writeCharacters(this.value);
+		} else if (type == CDATA_SECTION_NODE) {
+			writer.writeCData(this.value);
+		}
+		OMNode nextSibling = this.getNextSibling();
+		if (nextSibling != null) {
+			nextSibling.serializeWithCache(omOutput);
+		}
+	}
+
+	/**
+	 * Returns the value
+	 */
+	public String getText() throws OMException {
+		if (this.value != null) {
+			return this.value;
+		} else {
+			try {
+				InputStream inStream;
+				inStream = this.getInputStream();
+				int x = inStream.available();
+				byte[] data;
+				// There are times, this inStream reports the Available bytes incorrectly.
+				// Reading the First byte & then getting the available number of bytes fixed it.
+				if (x==0)
+				{
+				int firstByte = inStream.read();
+				data = new byte[inStream.available()+1];
+				data[0] = (byte)firstByte;
+				IOUtils.readFully(inStream, data,1,data.length-1);
+				}
+				else
+				{	
+					data = new byte[inStream.available()];
+					IOUtils.readFully(inStream, data);
+				}
+				return Base64.encode(data);
+			} catch (Exception e) {
+				throw new OMException(
+						"Cannot read from Stream taken form the Data Handler"
+								+ e);
+			}
+		}
+	}
+
+	public boolean isOptimized() {
+		return optimize;
+	}
+
+	public void setOptimize(boolean value) {
+		this.optimize = value;
+	}
+
+	/**
+	 * @return
+	 * @throws org.apache.axis2.om.OMException
+	 * 
+	 * @throws OMException
+	 */
+	public DataHandler getDataHandler() {
+		/*
+		 * this should return a DataHandler containing the binary data
+		 * reperesented by the Base64 strings stored in OMText
+		 */
+		if (value != null) {
+			ByteArrayDataSource dataSource;
+			byte[] data = Base64.decode(value);
+			if (mimeType != null) {
+				dataSource = new ByteArrayDataSource(data, mimeType);
+			} else {
+				// Assumes type as application/octet-stream
+				dataSource = new ByteArrayDataSource(data);
+			}
+			return new DataHandler(dataSource);
+		} else {
+			
+			if (dataHandler == null) {
+				if (contentID == null) {
+					throw new RuntimeException("ContentID is null");
+				}
+				dataHandler = ((MTOMStAXSOAPModelBuilder) builder)
+						.getDataHandler(contentID);
+			}
+			return dataHandler;
+		}
+	}
+
+	public String getLocalName() {
+		return localName;
+	}
+
+	public java.io.InputStream getInputStream() throws OMException {
+		if (isBinary) {
+			if (dataHandler == null) {
+				getDataHandler();
+			}
+			InputStream inStream;
+			try {
+				inStream = dataHandler.getDataSource().getInputStream();
+			} catch (IOException e) {
+				throw new OMException(
+						"Cannot get InputStream from DataHandler." + e);
+			}
+			return inStream;
+		} else {
+			throw new OMException("Unsupported Operation");
+		}
+	}
+
+	public String getContentID() {
+		if (contentID == null) {
+			contentID = MIMEOutputUtils.getRandomStringOf18Characters()
+					+ "@apache.org";
+		}
+		return this.contentID;
+	}
+
+	public boolean isComplete() {
+		return done;
+	}
+
+	public void serialize(org.apache.axis2.om.impl.OMOutputImpl omOutput)
+			throws XMLStreamException {
+		if (!this.isBinary) {
+			serializeWithCache(omOutput);
+		} else {
+			if (omOutput.isOptimized()) {
+				if (contentID == null) {
+					contentID = omOutput.getNextContentId();
+				}
+				// send binary as MTOM optimised
+				this.attribute = new OMAttributeImpl("href",
+						new OMNamespaceImpl("", ""), "cid:" + getContentID());
+				this.serializeStartpart(omOutput);
+				omOutput.writeOptimized(this);
+				omOutput.getXmlStreamWriter().writeEndElement();
+			} else {
+				omOutput.getXmlStreamWriter().writeCharacters(this.getText());
+			}
+			// TODO do we need these
+			OMNode nextSibling = this.getNextSibling();
+			if (nextSibling != null) {
+				// serilize next sibling
+				nextSibling.serialize(omOutput);
+			} else {
+				// TODO : See whether following part is really needed
+				if (parent != null && !parent.isComplete()) {
+					// do the special serialization
+					// Only the push serializer is left now
+					builder.next();
+				}
+			}
+		}
+	}
+
+	/*
+	 * Methods to copy from OMSerialize utils
+	 */
+	private void serializeStartpart(OMOutputImpl omOutput)
+			throws XMLStreamException {
+		String nameSpaceName;
+		String writer_prefix;
+		String prefix;
+		XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+		if (this.ns != null) {
+			nameSpaceName = this.ns.getName();
+			writer_prefix = writer.getPrefix(nameSpaceName);
+			prefix = this.ns.getPrefix();
+			if (nameSpaceName != null) {
+				if (writer_prefix != null) {
+					writer
+							.writeStartElement(nameSpaceName, this
+									.getLocalName());
+				} else {
+					if (prefix != null) {
+						writer.writeStartElement(prefix, this.getLocalName(),
+								nameSpaceName);
+						//TODO FIX ME
+						//writer.writeNamespace(prefix, nameSpaceName);
+						writer.setPrefix(prefix, nameSpaceName);
+					} else {
+						writer.writeStartElement(nameSpaceName, this
+								.getLocalName());
+						writer.writeDefaultNamespace(nameSpaceName);
+						writer.setDefaultNamespace(nameSpaceName);
+					}
+				}
+			} else {
+				writer.writeStartElement(this.getLocalName());
+			}
+		} else {
+			writer.writeStartElement(this.getLocalName());
+		}
+		// add the elements attribute "href"
+		serializeAttribute(this.attribute, omOutput);
+		// add the namespace
+		serializeNamespace(this.ns, omOutput);
+	}
+
+	/**
+	 * Method serializeAttribute
+	 * 
+	 * @param attr
+	 * @param omOutput
+	 * @throws XMLStreamException
+	 */
+	static void serializeAttribute(OMAttribute attr, OMOutputImpl omOutput)
+			throws XMLStreamException {
+		XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+		// first check whether the attribute is associated with a namespace
+		OMNamespace ns = attr.getNamespace();
+		String prefix;
+		String namespaceName;
+		if (ns != null) {
+			// add the prefix if it's availble
+			prefix = ns.getPrefix();
+			namespaceName = ns.getName();
+			if (prefix != null) {
+				writer.writeAttribute(prefix, namespaceName, attr
+						.getLocalName(), attr.getValue());
+			} else {
+				writer.writeAttribute(namespaceName, attr.getLocalName(), attr
+						.getValue());
+			}
+		} else {
+			writer.writeAttribute(attr.getLocalName(), attr.getValue());
+		}
+	}
+
+	/**
+	 * Method serializeNamespace
+	 * 
+	 * @param namespace
+	 * @param omOutput
+	 * @throws XMLStreamException
+	 */
+	static void serializeNamespace(OMNamespace namespace,
+			org.apache.axis2.om.impl.OMOutputImpl omOutput)
+			throws XMLStreamException {
+		XMLStreamWriter writer = omOutput.getXmlStreamWriter();
+		if (namespace != null) {
+			String uri = namespace.getName();
+			String ns_prefix = namespace.getPrefix();
+			writer.writeNamespace(ns_prefix, namespace.getName());
+			writer.setPrefix(ns_prefix, uri);
+		}
+	}
+
+	/**
+	 * Slightly different implementation of the discard method
+	 * 
+	 * @throws OMException
+	 */
+	public void discard() throws OMException {
+		if (done) {
+			this.detach();
+		} else {
+			builder.discard((OMElement) this.parent);
+		}
+	}
 }

Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java?rev=219884&r1=219883&r2=219884&view=diff
==============================================================================
--- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java (original)
+++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java Wed Jul 20 05:11:18 2005
@@ -86,7 +86,8 @@
                 if (contentIDName.equalsIgnoreCase("href")
                         & contentID.substring(0, 3).equalsIgnoreCase("cid")) {
                     contentID = contentID.substring(4);
-                } else {
+                } else if (!(contentIDName.equalsIgnoreCase("href")
+                       & (!contentID.equals("")))) {                    
                     throw new OMException(
                             "contentID not Found in XOP:Include element");
                 }

Modified: webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt?rev=219884&r1=219883&r2=219884&view=diff
==============================================================================
--- webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt (original)
+++ webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt Wed Jul 20 05:11:18 2005
@@ -7,6 +7,5 @@
 ------=_AxIs2_Def_boundary_=42214532
 Content-Transfer-Encoding: binary
 Content-ID: -1609420109260943731
-
-
8A ýþÿb
+
8A ???b
 ------=_AxIs2_Def_boundary_=42214532--

Modified: webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java?rev=219884&r1=219883&r2=219884&view=diff
==============================================================================
--- webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java (original)
+++ webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java Wed Jul 20 05:11:18 2005
@@ -19,6 +19,7 @@
 import org.apache.axis2.attachments.ByteArrayDataSource;
 import org.apache.axis2.soap.SOAPFactory;
 import org.apache.axis2.om.impl.MIMEOutputUtils;
+import org.apache.axis2.om.impl.OMOutputImpl;
 
 import javax.activation.DataHandler;
 import javax.mail.MessagingException;
@@ -43,9 +44,12 @@
         super.setUp();
         SOAPFactory factory = OMAbstractFactory.getSOAP11Factory();
         ByteArrayOutputStream outStream;
-        String boundary = "----TemporaryBoundary";
+        String boundary;
+        
+        OMOutputImpl omOutput = new OMOutputImpl(null);
+        boundary = omOutput.getMimeBoundary();
 
-        String contentType = org.apache.axis2.om.impl.MIMEOutputUtils.getContentTypeForMime(boundary, "cid:0.632569289925808400@example.org");
+        String contentType = org.apache.axis2.om.impl.MIMEOutputUtils.getContentTypeForMime(boundary,omOutput.getRootContentId());
         DataHandler dataHandler;
         dataHandler = new DataHandler(new ByteArrayDataSource(byteArray));
         OMText textData = factory.createText(dataHandler, true);



Re: svn commit: r219884 - in /webservices/axis/trunk/java/modules/xml: src/org/apache/axis2/attachments/ src/org/apache/axis2/om/impl/ src/org/apache/axis2/om/impl/llom/ src/org/apache/axis2/om/impl/llom/mtom/ test-resources/mtom/ test/org/apache/axi

Posted by Thilina Gunarathne <cs...@gmail.com>.
Here after I'll make sure... Pls correct if there are any inconsistancies..

On 7/20/05, Davanum Srinivas <da...@gmail.com> wrote:
> 
> are just way too much white space changes...next
> time, could you please submit a separate commit for just white space
> changes and one for the code changes? it's difficult to understand
> what changed if both are inter-mixed. i will try to review it again
> later today.




-- 
"May the SourcE be with u" 
http://www.bloglines.com/blog/thilina

Re: svn commit: r219884 - in /webservices/axis/trunk/java/modules/xml: src/org/apache/axis2/attachments/ src/org/apache/axis2/om/impl/ src/org/apache/axis2/om/impl/llom/ src/org/apache/axis2/om/impl/llom/mtom/ test-resources/mtom/ test/org/apache/axi

Posted by Thilina Gunarathne <cs...@gmail.com>.
Here after I'll make sure... Pls correct if there are any inconsistancies..

On 7/20/05, Davanum Srinivas <da...@gmail.com> wrote:
> 
> are just way too much white space changes...next
> time, could you please submit a separate commit for just white space
> changes and one for the code changes? it's difficult to understand
> what changed if both are inter-mixed. i will try to review it again
> later today.




-- 
"May the SourcE be with u" 
http://www.bloglines.com/blog/thilina

Re: svn commit: r219884 - in /webservices/axis/trunk/java/modules/xml: src/org/apache/axis2/attachments/ src/org/apache/axis2/om/impl/ src/org/apache/axis2/om/impl/llom/ src/org/apache/axis2/om/impl/llom/mtom/ test-resources/mtom/ test/org/apache/axi

Posted by Davanum Srinivas <da...@gmail.com>.
Thilina,

unfortunately there are just way too much white space changes...next
time, could you please submit a separate commit for just white space
changes and one for the code changes? it's difficult to understand
what changed if both are inter-mixed. i will try to review it again
later today.

thanks,
dims

On 7/20/05, thilina@apache.org <th...@apache.org> wrote:
> Author: thilina
> Date: Wed Jul 20 05:11:18 2005
> New Revision: 219884
> 
> URL: http://svn.apache.org/viewcvs?rev=219884&view=rev
> Log:
> Changing MIME Content-ID processing according to the spec & MSFT way
> 
> Modified:
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java
>     webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt
>     webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java Wed Jul 20 05:11:18 2005
> @@ -1,22 +1,19 @@
>  /**
> 
> - * 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/>
> 
> + * 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.axis2.attachments;
> 
> 
> 
> -import org.apache.axis2.om.OMException;
> 
> +import java.io.IOException;
> 
> +import java.io.InputStream;
> 
> +import java.io.PushbackInputStream;
> 
> +import java.util.HashMap;
> 
> 
> 
>  import javax.activation.DataHandler;
> 
>  import javax.mail.MessagingException;
> 
> @@ -24,90 +21,94 @@
>  import javax.mail.internet.ContentType;
> 
>  import javax.mail.internet.MimeBodyPart;
> 
>  import javax.mail.internet.ParseException;
> 
> -import java.io.IOException;
> 
> -import java.io.InputStream;
> 
> -import java.io.PushbackInputStream;
> 
> -import java.util.HashMap;
> 
> 
> 
> +import org.apache.axis2.om.OMException;
> 
> +
> 
> +/**
> 
> + * @author <a href="mailto:thilina@opensource.lk"> Thilina Gunarathne </a>
> 
> + */
> 
>  public class MIMEHelper {
> 
>      /**
> 
>       * if the Message is MTOM optimised then <code>MTOM_TYPE</code>
> 
>       */
> 
>      public static final String MTOM_TYPE = "application/xop+xml";
> 
> -
> 
> +
> 
>      /**
> 
>       * If the message is Soap with Attachments <code>SwA_TYPE</code>
> 
>       */
> 
>      public static final String SWA_TYPE = "text/xml";
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>rootPart</code> is used as the key for the root BodyPart in the
> 
>       * Parts HashMap
> 
>       */
> 
>      public static final String ROOT_PART = "SoapPart";
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>ContentType</code> of the MIME message
> 
>       */
> 
>      ContentType contentType;
> 
> -
> 
> +
> 
>      /**
> 
>       * Mime <code>boundary</code> which seperates mime parts
> 
>       */
> 
>      byte[] boundary;
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>applicationType</code> used to distinguish between MTOM & SWA If
> 
>       * the message is MTOM optimised type is application/xop+xml If the message
> 
>       * is SWA, type is ??have to find out
> 
>       */
> 
>      String applicationType = null;
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>pushbackInStream</code> stores the reference to the incoming
> 
>       * stream A PushbackStream has the ability to "push back" or "unread" one
> 
>       * byte.
> 
>       */
> 
>      PushbackInputStream pushbackInStream;
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>mimeBodyPartsMap</code> stores the already parsed Mime Body
> 
>       * Parts. This Map will be keyed using the content-ID's
> 
>       */
> 
>      HashMap bodyPartsMap;
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>partIndex</code>- Number of Mime parts parsed
> 
>       */
> 
>      int partIndex = 0;
> 
> -
> 
> +
> 
> +    boolean endOfStreamReached = false;
> 
> +
> 
>      String firstPartId = null;
> 
> -
> 
> +
> 
>      boolean fileCacheEnable = false;
> 
> -
> 
> +
> 
>      String attachmentRepoDir = null;
> 
> -
> 
> +
> 
>      public MIMEHelper(InputStream inStream, String contentTypeString,
> 
> -                      boolean fileCacheEnable, String attachmentRepoDir)
> 
> -            throws OMException {
> 
> +            boolean fileCacheEnable, String attachmentRepoDir)
> 
> +    throws OMException {
> 
>          this.attachmentRepoDir = attachmentRepoDir;
> 
>          this.fileCacheEnable = fileCacheEnable;
> 
>          bodyPartsMap = new HashMap();
> 
>          try {
> 
>              contentType = new ContentType(contentTypeString);
> 
>          } catch (ParseException e) {
> 
> -            throw new OMException("Invalid Content Type Field in the Mime Message"
> 
> +            throw new OMException(
> 
> +                    "Invalid Content Type Field in the Mime Message"
> 
>                      + e.toString());
> 
>          }
> 
>          // Boundary always have the prefix "--".
> 
>          this.boundary = ("--" + contentType.getParameter("boundary"))
> 
> -                .getBytes();
> 
> -
> 
> +        .getBytes();
> 
> +
> 
>          //TODO do we need to wrap InputStream from a BufferedInputStream before
> 
>          // wrapping from PushbackStream
> 
>          pushbackInStream = new PushbackInputStream(inStream,
> 
>                  (this.boundary.length + 2));
> 
> -
> 
> +
> 
>          // Move the read pointer to the begining of the first part
> 
>          // read till the end of first boundary
> 
>          while (true) {
> 
> @@ -121,7 +122,7 @@
>                          value = pushbackInStream.read();
> 
>                          if (value == -1)
> 
>                              throw new OMException(
> 
> -                                    "Unexpected End of Stream while searching for first Mime Boundary");
> 
> +                            "Unexpected End of Stream while searching for first Mime Boundary");
> 
>                          boundaryIndex++;
> 
>                      }
> 
>                      if (boundaryIndex == boundary.length) { // boundary found
> 
> @@ -130,19 +131,19 @@
>                      }
> 
>                  } else if ((byte) value == -1) {
> 
>                      throw new OMException(
> 
> -                            "Mime parts not found. Stream ended while searching for the boundary");
> 
> +                    "Mime parts not found. Stream ended while searching for the boundary");
> 
>                  }
> 
>              } catch (IOException e1) {
> 
>                  throw new OMException("Stream Error" + e1.toString());
> 
>              }
> 
>          }
> 
>      }
> 
> -
> 
> +
> 
>      public MIMEHelper(InputStream inStream, String contentTypeString)
> 
> -            throws OMException {
> 
> +    throws OMException {
> 
>          this(inStream, contentTypeString, false, null);
> 
>      }
> 
> -
> 
> +
> 
>      /**
> 
>       * @return whether Message Type is SOAP with Attachments or MTOM optimised
> 
>       *         by checking the application type parameter in the Contant Type
> 
> @@ -156,12 +157,12 @@
>                  this.applicationType = SWA_TYPE;
> 
>              } else {
> 
>                  throw new OMException(
> 
> -                        "Invalid Application type. Support available for MTOM & SwA only.");
> 
> +                "Invalid Application type. Support available for MTOM & SwA only.");
> 
>              }
> 
>          }
> 
>          return this.applicationType;
> 
>      }
> 
> -
> 
> +
> 
>      /**
> 
>       * @return the InputStream which includes the SOAP Envelope We assumes that
> 
>       *         the root mime part is always pointed by "start" parameter in
> 
> @@ -169,6 +170,7 @@
>       */
> 
>      public InputStream getSOAPPartInputStream() throws OMException {
> 
>          String rootContentID = contentType.getParameter("start");
> 
> +
> 
>          // to handle the Start parameter not mentioned situation
> 
>          if (rootContentID == null) {
> 
>              if (partIndex == 0) {
> 
> @@ -177,13 +179,23 @@
>              rootContentID = firstPartId;
> 
>          } else {
> 
>              rootContentID.trim();
> 
> +            // Keep it here till we make sure the two angle brackets are
> 
> +            // required or not
> 
> +            if ((rootContentID.indexOf("<") > -1)
> 
> +                    & (rootContentID.indexOf(">") > -1))
> 
> +                rootContentID = rootContentID.substring(1, (rootContentID
> 
> +                        .length() - 1));
> 
> +        }
> 
> +        // Strips off the "cid" part from content-id
> 
> +        if (rootContentID.substring(0, 3).equalsIgnoreCase("cid")) {
> 
> +            rootContentID = rootContentID.substring(4);
> 
>          }
> 
>          DataHandler dh;
> 
>          try {
> 
>              dh = getDataHandler(rootContentID);
> 
>              if (dh == null) {
> 
>                  throw new OMException(
> 
> -                        "Mandatory Root MIME part containing the SOAP Envelope is missing");
> 
> +                "Mandatory Root MIME part containing the SOAP Envelope is missing");
> 
>              }
> 
>              return dh.getInputStream();
> 
>          } catch (IOException e) {
> 
> @@ -191,21 +203,22 @@
>                      "Problem with DataHandler of the Root Mime Part. " + e);
> 
>          }
> 
>      }
> 
> -
> 
> +
> 
>      /**
> 
>       * @param blobContentID
> 
>       * @return The DataHandler of the mime part refered by the content-Id
> 
> -     * @throws OMException First checks whether the MIME part is already parsed by
> 
> -     *                     checking the parts HashMap. If it is not parsed yet then call
> 
> -     *                     the getNextPart() till we find the required part.
> 
> +     * @throws OMException
> 
> +     *             First checks whether the MIME part is already parsed by
> 
> +     *             checking the parts HashMap. If it is not parsed yet then call
> 
> +     *             the getNextPart() till we find the required part.
> 
>       */
> 
>      public DataHandler getDataHandler(String blobContentID) throws OMException {
> 
> -
> 
> +
> 
>          Part bodyPart;
> 
> +        //     blobContentID = "<" + blobContentID + ">";
> 
>          boolean attachmentFound = false;
> 
> -
> 
> -        //             // without the following part a Null Pointer Exception is thrown
> 
> -        //
> 
> +
> 
> +        //TODO make sure to add surrounding angle brackets to the content ID
> 
>          if (bodyPartsMap.containsKey(blobContentID)) {
> 
>              bodyPart = (Part) bodyPartsMap.get(blobContentID);
> 
>              attachmentFound = true;
> 
> @@ -231,40 +244,53 @@
>                      }
> 
>                  }
> 
>              } catch (MessagingException e) {
> 
> -                throw new OMException("Invalid Mime Message " + e.toString());
> 
> +                throw new OMException("Invalid Mime Message " + e);
> 
>              }
> 
>          }
> 
> -
> 
> +
> 
>      }
> 
> -
> 
> +
> 
> +    protected void setEndOfStream(boolean value)
> 
> +    {
> 
> +        this.endOfStreamReached = value;
> 
> +
> 
> +    }
> 
> +
> 
>      /**
> 
>       * @return The next MIME Body part in the stream Uses the MimeBodyPartStream
> 
>       *         to obtain streams delimited by boundaries.
> 
> -     * @throws MessagingException
> 
> +     * @throws OMException
> 
>       */
> 
> -    // TODO do we need Locking for this
> 
>      private MimeBodyPart getMimeBodyPart() throws OMException {
> 
> +        // endOfStreamReached will be set to true if the message ended in MIME Style
> 
> +        // having "--" suffix with the last mime boundary
> 
> +        if (endOfStreamReached)
> 
> +            throw new OMException(
> 
> +            "Referenced MIME part not found.End of Stream reached.");
> 
> +
> 
>          MimeBodyPart mimeBodyPart = null;
> 
> -
> 
>          MimeBodyPartInputStream partStream;
> 
> -        partStream = new MimeBodyPartInputStream(pushbackInStream,
> 
> -                boundary);
> 
> +        partStream = new MimeBodyPartInputStream(pushbackInStream, boundary,
> 
> +                this);
> 
>          try {
> 
>              mimeBodyPart = new MimeBodyPart(partStream);
> 
> +
> 
> +            // This will take care if stream ended without having MIME message terminator
> 
> +            if (mimeBodyPart.getSize() <= 0) {
> 
> +                throw new OMException(
> 
> +                "Referenced MIME part not found.End of Stream reached.");
> 
> +            }
> 
>          } catch (MessagingException e) {
> 
>              throw new OMException("Problem reading Mime Part No "
> 
>                      + (partIndex + 1) + ". " + e);
> 
>          }
> 
> -
> 
>          partIndex++;
> 
>          return mimeBodyPart;
> 
>      }
> 
> -
> 
> +
> 
>      /**
> 
> -     * @return The Mime body part which contains the SOAP Envelope In MTOM case
> 
> -     *         it is the first part In SwA case we assumes it to be first
> 
> -     *         part.Have to FIX This
> 
> -     * @throws MessagingException
> 
> +     * @return
> 
> +     * @throws OMException
> 
>       */
> 
>      private MimeBodyPart getRootMimeBodyPart() throws OMException {
> 
>          MimeBodyPart rootMimeBodyPart;
> 
> @@ -276,7 +302,7 @@
>          }
> 
>          return rootMimeBodyPart;
> 
>      }
> 
> -
> 
> +
> 
>      private Part getNextPart() throws OMException {
> 
>          MimeBodyPart nextMimeBodyPart;
> 
>          nextMimeBodyPart = getMimeBodyPart();
> 
> @@ -284,31 +310,51 @@
>              String partContentID;
> 
>              try {
> 
>                  partContentID = nextMimeBodyPart.getContentID();
> 
> +
> 
>                  if (partContentID == null & partIndex == 1) {
> 
>                      bodyPartsMap.put("firstPart", nextMimeBodyPart);
> 
>                      firstPartId = "firstPart";
> 
>                      return nextMimeBodyPart;
> 
> +                }
> 
> +                if (partContentID == null) {
> 
> +                    throw new OMException(
> 
> +                    "Part content ID cannot be blank for non root MIME parts");
> 
> +                }
> 
> +                if ((partContentID.indexOf("<") > -1)
> 
> +                        & (partContentID.indexOf(">") > -1)) {
> 
> +                    partContentID = partContentID.substring(1, (partContentID
> 
> +                            .length() - 1));
> 
> +
> 
>                  } else if (partIndex == 1) {
> 
>                      firstPartId = partContentID;
> 
>                  }
> 
> -                if (fileCacheEnable) {
> 
> -                    PartOnFile part = new PartOnFile(nextMimeBodyPart,
> 
> -                            partContentID,
> 
> -                            attachmentRepoDir);
> 
> -                    return part;
> 
> -                } else {
> 
> -                    bodyPartsMap.put(partContentID, nextMimeBodyPart);
> 
> -                    return nextMimeBodyPart;
> 
> +                if (bodyPartsMap.containsKey(partContentID))
> 
> +                {
> 
> +                    throw new OMException("Two MIME parts with the same Content-ID not allowed.");
> 
>                  }
> 
> +       /*
> 
> +        * Temporary File storage support is deffered till 1.0
> 
> +        */
> 
> +                //                if (fileCacheEnable) {
> 
> +                //                    PartOnFile part = new PartOnFile(nextMimeBodyPart,
> 
> +                //                            partContentID,
> 
> +                //                            attachmentRepoDir);
> 
> +                //                    return part;
> 
> +                //                } else {
> 
> +                bodyPartsMap.put(partContentID, nextMimeBodyPart);
> 
> +                return nextMimeBodyPart;
> 
> +                //                }
> 
>              } catch (MessagingException e) {
> 
> -                throw new OMException("Error Reading Content-ID from Mime Part No "
> 
> -                        + partIndex + ". " + e);
> 
> -            } catch (Exception e) {
> 
> -                throw new OMException("Error Creating File  Storage Part"
> 
> +                throw new OMException(
> 
> +                        "Error Reading Content-ID from Mime Part No "
> 
>                          + partIndex + ". " + e);
> 
>              }
> 
> +            //            } catch (Exception e) {
> 
> +            //                throw new OMException("Error Creating File Storage Part"
> 
> +            //                        + partIndex + ". " + e);
> 
> +            //            }
> 
>          } else
> 
>              return null;
> 
>      }
> 
> -
> 
> +
> 
>  }
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java Wed Jul 20 05:11:18 2005
> @@ -1,18 +1,12 @@
>  /**
> 
> - * 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/>
> 
> + * 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.axis2.attachments;
> 
> 
> 
> @@ -25,15 +19,22 @@
> 
> 
>      boolean boundaryFound = false;
> 
> 
> 
> +    MIMEHelper parent = null;
> 
> +
> 
>      byte[] boundary;
> 
> 
> 
> -    public MimeBodyPartInputStream(PushbackInputStream inStream,
> 
> -                                   byte[] boundary) {
> 
> +    public MimeBodyPartInputStream(PushbackInputStream inStream, byte[] boundary) {
> 
>          super();
> 
>          this.inStream = inStream;
> 
>          this.boundary = boundary;
> 
>      }
> 
> 
> 
> +    public MimeBodyPartInputStream(PushbackInputStream inStream,
> 
> +            byte[] boundary, MIMEHelper parent) {
> 
> +        this(inStream, boundary);
> 
> +        this.parent = parent;
> 
> +    }
> 
> +
> 
>      public int read() throws IOException {
> 
>          if (boundaryFound) {
> 
>              return -1;
> 
> @@ -41,7 +42,8 @@
>          // read the next value from stream
> 
>          int value = inStream.read();
> 
> 
> 
> -        // A problem occured because all the mime parts tends to have a /r/n at the end. Making it hard to transform them to correct DataSources.
> 
> +        // A problem occured because all the mime parts tends to have a /r/n at
> 
> +        // the end. Making it hard to transform them to correct DataSources.
> 
>          // This logic introduced to handle it
> 
>          //TODO look more in to this && for a better way to do this
> 
>          if (value == 13) {
> 
> @@ -64,22 +66,23 @@
>          // read value is the first byte of the boundary. Start matching the
> 
>          // next characters to find a boundary
> 
>          int boundaryIndex = 0;
> 
> -        while ((boundaryIndex < boundary.length)
> 
> +        while ((boundaryIndex < (boundary.length - 1))
> 
>                  && ((byte) value == boundary[boundaryIndex])) {
> 
>              value = inStream.read();
> 
>              boundaryIndex++;
> 
>          }
> 
> 
> 
> -        if (boundaryIndex == boundary.length) { // boundary found
> 
> +        if (boundaryIndex == (boundary.length - 1)) { // boundary found
> 
>              boundaryFound = true;
> 
>              // read the end of line character
> 
> -            if (inStream.read() == 45) {
> 
> +            if ((value = inStream.read()) == 45) {
> 
>                  //check whether end of stream
> 
>                  //Last mime boundary should have a succeeding "--"
> 
> -                if (!((value = inStream.read()) == 45)) {
> 
> -                    inStream.unread(value);
> 
> +                if ((value = inStream.read()) == 45 && parent!=null) {
> 
> +                    parent.setEndOfStream(true);
> 
>                  }
> 
> -
> 
> +            } else {
> 
> +                inStream.read();
> 
>              }
> 
> 
> 
>              return -1;
> 
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java Wed Jul 20 05:11:18 2005
> @@ -15,22 +15,22 @@
>   */
> 
>  package org.apache.axis2.om.impl;
> 
> 
> 
> -import org.apache.axis2.om.OMText;
> 
> -import org.apache.axis2.om.OMException;
> 
> -
> 
> -import javax.activation.DataHandler;
> 
> -import javax.mail.MessagingException;
> 
> -import javax.mail.internet.ContentType;
> 
> -import javax.mail.internet.MimeBodyPart;
> 
>  import java.io.IOException;
> 
>  import java.io.OutputStream;
> 
> -import java.util.Iterator;
> 
> -import java.util.LinkedList;
> 
> -import java.util.Random;
> 
>  import java.net.InetAddress;
> 
>  import java.net.UnknownHostException;
> 
>  import java.security.MessageDigest;
> 
>  import java.security.NoSuchAlgorithmException;
> 
> +import java.util.Iterator;
> 
> +import java.util.LinkedList;
> 
> +import java.util.Random;
> 
> +
> 
> +import javax.activation.DataHandler;
> 
> +import javax.mail.MessagingException;
> 
> +import javax.mail.internet.MimeBodyPart;
> 
> +
> 
> +import org.apache.axis2.om.OMException;
> 
> +import org.apache.axis2.om.OMText;
> 
> 
> 
>  public class MIMEOutputUtils {
> 
> 
> 
> @@ -51,7 +51,7 @@
>              rootMimeBodyPart.addHeader("content-type",
> 
>                      "application/xop+xml; charset=utf-8; type=\"text/xml; charset=utf-8\"");
> 
>              rootMimeBodyPart.addHeader("content-transfer-encoding", "binary");
> 
> -            rootMimeBodyPart.addHeader("content-id", contentId);
> 
> +            rootMimeBodyPart.addHeader("content-id","<"+contentId+">");
> 
> 
> 
>              writeBodyPart(outStream, rootMimeBodyPart, boundary);
> 
> 
> 
> @@ -73,7 +73,7 @@
>              throws MessagingException {
> 
>          MimeBodyPart mimeBodyPart = new MimeBodyPart();
> 
>          mimeBodyPart.setDataHandler(node.getDataHandler());
> 
> -        mimeBodyPart.addHeader("content-id", node.getContentID());
> 
> +        mimeBodyPart.addHeader("content-id", "<"+node.getContentID()+">");
> 
>          mimeBodyPart.addHeader("content-type", "application/octet-stream");
> 
>          mimeBodyPart.addHeader("content-transfer-encoding", "binary");
> 
>          return mimeBodyPart;
> 
> @@ -133,7 +133,7 @@
>          sb.append("; ");
> 
>          sb.append("type=\"application/xop+xml\"");
> 
>          sb.append("; ");
> 
> -        sb.append("start=\"" + contentId + "\"");
> 
> +        sb.append("start=\"<" + "cid:"+contentId + ">\"");
> 
>          sb.append("; ");
> 
>          sb.append("start-info=\"text/xml; charset=utf-8\"");
> 
>          return sb.toString();
> 
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java Wed Jul 20 05:11:18 2005
> @@ -15,20 +15,16 @@
>   */
> 
>  package org.apache.axis2.om.impl;
> 
> 
> 
> -import org.apache.axis2.om.OMText;
> 
> +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;
> 
> -import java.io.ByteArrayOutputStream;
> 
> -import java.io.OutputStream;
> 
> -import java.net.InetAddress;
> 
> -import java.net.UnknownHostException;
> 
> -import java.security.MessageDigest;
> 
> -import java.security.NoSuchAlgorithmException;
> 
> -import java.util.LinkedList;
> 
> -import java.util.Random;
> 
> +
> 
> +import org.apache.axis2.om.OMText;
> 
> 
> 
>  /**
> 
>   * For the moment this assumes that transport takes the decision of whether
> 
> @@ -104,20 +100,20 @@
> 
> 
>      public String getMimeBoundary() {
> 
>          if(mimeBoundary == null) {
> 
> -            mimeBoundary = "--MIMEBoundary" + MIMEOutputUtils.getRandomStringOf18Characters();
> 
> +            mimeBoundary = "MIMEBoundary" + MIMEOutputUtils.getRandomStringOf18Characters();
> 
>          }
> 
>          return mimeBoundary;
> 
>      }
> 
> 
> 
>      public String getRootContentId() {
> 
>          if(rootContentId == null) {
> 
> -            rootContentId = "cid:0." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
> 
> +            rootContentId = "0." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
> 
>          }
> 
>          return rootContentId;
> 
>      }
> 
> 
> 
>      public String getNextContentId() {
> 
>          nextid++;
> 
> -        return "cid:" + nextid + "." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
> 
> +        return nextid + "." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
> 
>      }
> 
>  }
> 
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java Wed Jul 20 05:11:18 2005
> @@ -1,20 +1,29 @@
>  /*
>   * 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
> - *
> + *
> + * 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.
> + * 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.axis2.om.impl.llom;
> 
> +import java.io.IOException;
> +import java.io.InputStream;
> +import java.util.Date;
> +import java.util.Random;
> +
> +import javax.activation.DataHandler;
> +import javax.xml.stream.XMLStreamException;
> +import javax.xml.stream.XMLStreamWriter;
> +
>  import org.apache.axis2.attachments.Base64;
>  import org.apache.axis2.attachments.ByteArrayDataSource;
>  import org.apache.axis2.attachments.IOUtils;
> @@ -24,386 +33,406 @@
>  import org.apache.axis2.om.OMException;
>  import org.apache.axis2.om.OMNamespace;
>  import org.apache.axis2.om.OMNode;
> -import org.apache.axis2.om.impl.OMOutputImpl;
> -import org.apache.axis2.om.impl.MIMEOutputUtils;
>  import org.apache.axis2.om.OMText;
>  import org.apache.axis2.om.OMXMLParserWrapper;
> +import org.apache.axis2.om.impl.MIMEOutputUtils;
> +import org.apache.axis2.om.impl.OMOutputImpl;
>  import org.apache.axis2.om.impl.llom.mtom.MTOMStAXSOAPModelBuilder;
> 
> -import javax.activation.DataHandler;
> -import javax.xml.stream.XMLStreamException;
> -import javax.xml.stream.XMLStreamWriter;
> -import java.io.IOException;
> -import java.io.InputStream;
> -import java.util.Date;
> -import java.util.Random;
> -
>  public class OMTextImpl extends OMNodeImpl implements OMText, OMConstants {
> -    protected String value = null;
> -    protected String mimeType;
> -    protected boolean optimize = false;
> -    protected boolean isBinary = false;
> -    private static Random rnd = new Random(new Date().getTime());
> -    /**
> -     * Field contentID for the mime part used when serialising Binary stuff as
> -     * MTOM optimised
> -     */
> -    private String contentID = null;
> -    /**
> -     * Field dataHandler
> -     */
> -    private DataHandler dataHandler = null;
> -    /**
> -     * Field nameSpace used when serialising Binary stuff as MTOM optimised
> -     */
> -    protected OMNamespace ns = new OMNamespaceImpl(
> -            "http://www.w3.org/2004/08/xop/include", "xop");
> -    /**
> -     * Field localName used when serialising Binary stuff as MTOM optimised
> -     */
> -    protected String localName = "Include";
> -    /**
> -     * Field attributes used when serialising Binary stuff as MTOM optimised
> -     */
> -    protected OMAttribute attribute;
> -
> -    /**
> -     * Constructor OMTextImpl
> -     *
> -     * @param s
> -     */
> -    public OMTextImpl(String s) {
> -        this.value = s;
> -        this.nodeType = TEXT_NODE;
> -    }
> -
> -    /**
> -     * Constructor OMTextImpl
> -     *
> -     * @param parent
> -     * @param text
> -     */
> -    public OMTextImpl(OMElement parent, String text) {
> -        super(parent);
> -        this.value = text;
> -        done = true;
> -        this.nodeType = TEXT_NODE;
> -    }
> -
> -    /**
> -     * @param s        -
> -     *                 base64 encoded String representation of Binary
> -     * @param mimeType of the Binary
> -     */
> -    public OMTextImpl(String s, String mimeType, boolean optimize) {
> -        this(null, s, mimeType, optimize);
> -    }
> -
> -    /**
> -     * @param parent
> -     * @param s        -
> -     *                 base64 encoded String representation of Binary
> -     * @param mimeType of the Binary
> -     */
> -    public OMTextImpl(OMElement parent, String s, String mimeType,
> -                      boolean optimize) {
> -        this(parent, s);
> -        this.mimeType = mimeType;
> -        this.optimize = optimize;
> -        done = true;
> -        this.nodeType = TEXT_NODE;
> -    }
> -
> -    /**
> -     * @param dataHandler To send binary optimised content Created programatically.
> -     */
> -    public OMTextImpl(DataHandler dataHandler) {
> -        this(dataHandler, true);
> -    }
> -
> -    /**
> -     * @param dataHandler
> -     * @param optimize    To send binary content. Created progrmatically.
> -     */
> -    public OMTextImpl(DataHandler dataHandler, boolean optimize) {
> -        this.dataHandler = dataHandler;
> -        this.isBinary = true;
> -        this.optimize = optimize;
> -        done = true;
> -        this.nodeType = TEXT_NODE;
> -    }
> -
> -    /**
> -     * @param contentID
> -     * @param parent
> -     * @param builder   Used when the builder is encountered with a XOP:Include tag
> -     *                  Stores a reference to the builder and the content-id. Supports
> -     *                  deffered parsing of MIME messages
> -     */
> -    public OMTextImpl(String contentID, OMElement parent,
> -                      OMXMLParserWrapper builder) {
> -        super(parent);
> -        this.contentID = contentID;
> -        this.optimize = true;
> -        this.isBinary = true;
> -        this.builder = builder;
> -        this.nodeType = TEXT_NODE;
> -    }
> -
> -    /**
> -     * @param omOutput
> -     * @throws XMLStreamException
> -     */
> -    public void serializeWithCache(org.apache.axis2.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
> -        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> -        int type = getType();
> -        if (type == TEXT_NODE) {
> -            writer.writeCharacters(this.value);
> -        } else if (type == CDATA_SECTION_NODE) {
> -            writer.writeCData(this.value);
> -        }
> -        OMNode nextSibling = this.getNextSibling();
> -        if (nextSibling != null) {
> -            nextSibling.serializeWithCache(omOutput);
> -        }
> -    }
> -
> -    /**
> -     * Returns the value
> -     */
> -    public String getText() throws OMException {
> -        if (this.value != null) {
> -            return this.value;
> -        } else {
> -            try {
> -                InputStream inStream;
> -                inStream = this.getInputStream();
> -                byte[] data;
> -                data = new byte[inStream.available()];
> -                IOUtils.readFully(inStream, data);
> -                return Base64.encode(data);
> -            } catch (Exception e) {
> -                throw new OMException("Cannot read from Stream taken form the Data Handler"
> -                        + e);
> -            }
> -        }
> -    }
> -
> -    public boolean isOptimized() {
> -        return optimize;
> -    }
> -
> -    public void setOptimize(boolean value) {
> -        this.optimize = value;
> -    }
> -
> -    /**
> -     * @return
> -     * @throws org.apache.axis2.om.OMException
> -     *
> -     * @throws OMException
> -     */
> -    public DataHandler getDataHandler() {
> -        /*
> -        * this should return a DataHandler containing the binary data
> -        * reperesented by the Base64 strings stored in OMText
> -        */
> -        if (value != null) {
> -            ByteArrayDataSource dataSource;
> -            byte[] data = Base64.decode(value);
> -            if (mimeType != null) {
> -                dataSource = new ByteArrayDataSource(data, mimeType);
> -            } else {
> -                // Assumes type as application/octet-stream
> -                dataSource = new ByteArrayDataSource(data);
> -            }
> -            return new DataHandler(dataSource);
> -        } else {
> -            if (contentID == null){
> -                throw new RuntimeException("ContentID is null");
> -            }
> -            if (dataHandler == null) {
> -                dataHandler = ((MTOMStAXSOAPModelBuilder) builder)
> -                        .getDataHandler(contentID);
> -            }
> -            return dataHandler;
> -        }
> -    }
> -
> -    public String getLocalName() {
> -        return localName;
> -    }
> -
> -    public java.io.InputStream getInputStream() throws OMException {
> -        if (isBinary) {
> -            if (dataHandler == null) {
> -                getDataHandler();
> -            }
> -            InputStream inStream;
> -            try {
> -                inStream = dataHandler.getDataSource().getInputStream();
> -            } catch (IOException e) {
> -                throw new OMException(
> -                        "Cannot get InputStream from DataHandler." + e);
> -            }
> -            return inStream;
> -        } else {
> -            throw new OMException("Unsupported Operation");
> -        }
> -    }
> -
> -    public String getContentID() {
> -        if(contentID == null) {
> -            contentID = "cid:" + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
> -        }
> -        return this.contentID;
> -    }
> -
> -    public boolean isComplete() {
> -        return done;
> -    }
> -
> -    public void serialize(org.apache.axis2.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
> -        if (!this.isBinary) {
> -            serializeWithCache(omOutput);
> -        } else {
> -            if (omOutput.isOptimized()) {
> -                if(contentID == null){
> -                    contentID = omOutput.getNextContentId();
> -                }
> -                // send binary as MTOM optimised
> -                this.attribute =
> -                        new OMAttributeImpl("href",
> -                                new OMNamespaceImpl("", ""),
> -                                getContentID());
> -                this.serializeStartpart(omOutput);
> -                omOutput.writeOptimized(this);
> -                omOutput.getXmlStreamWriter().writeEndElement();
> -            } else {
> -                omOutput.getXmlStreamWriter().writeCharacters(this.getText());
> -            }
> -            // TODO do we need these
> -            OMNode nextSibling = this.getNextSibling();
> -            if (nextSibling != null) {
> -                // serilize next sibling
> -                nextSibling.serialize(omOutput);
> -            } else {
> -                // TODO : See whether following part is really needed
> -                if (parent != null && !parent.isComplete()) {
> -                    // do the special serialization
> -                    // Only the push serializer is left now
> -                    builder.next();
> -                }
> -            }
> -        }
> -    }
> -
> -    /*
> -    * Methods to copy from OMSerialize utils
> -    */
> -    private void serializeStartpart(OMOutputImpl omOutput)
> -            throws XMLStreamException {
> -        String nameSpaceName;
> -        String writer_prefix;
> -        String prefix;
> -        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> -        if (this.ns != null) {
> -            nameSpaceName = this.ns.getName();
> -            writer_prefix = writer.getPrefix(nameSpaceName);
> -            prefix = this.ns.getPrefix();
> -            if (nameSpaceName != null) {
> -                if (writer_prefix != null) {
> -                    writer.writeStartElement(nameSpaceName,
> -                            this.getLocalName());
> -                } else {
> -                    if (prefix != null) {
> -                        writer.writeStartElement(prefix, this.getLocalName(),
> -                                nameSpaceName);
> -                        //TODO FIX ME
> -                        //writer.writeNamespace(prefix, nameSpaceName);
> -                        writer.setPrefix(prefix, nameSpaceName);
> -                    } else {
> -                        writer.writeStartElement(nameSpaceName,
> -                                this.getLocalName());
> -                        writer.writeDefaultNamespace(nameSpaceName);
> -                        writer.setDefaultNamespace(nameSpaceName);
> -                    }
> -                }
> -            } else {
> -                writer.writeStartElement(this.getLocalName());
> -            }
> -        } else {
> -            writer.writeStartElement(this.getLocalName());
> -        }
> -        // add the elements attribute "href"
> -        serializeAttribute(this.attribute, omOutput);
> -        // add the namespace
> -        serializeNamespace(this.ns, omOutput);
> -    }
> -
> -    /**
> -     * Method serializeAttribute
> -     *
> -     * @param attr
> -     * @param omOutput
> -     * @throws XMLStreamException
> -     */
> -    static void serializeAttribute(OMAttribute attr, OMOutputImpl omOutput)
> -            throws XMLStreamException {
> -        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> -        // first check whether the attribute is associated with a namespace
> -        OMNamespace ns = attr.getNamespace();
> -        String prefix;
> -        String namespaceName;
> -        if (ns != null) {
> -            // add the prefix if it's availble
> -            prefix = ns.getPrefix();
> -            namespaceName = ns.getName();
> -            if (prefix != null) {
> -                writer.writeAttribute(prefix,
> -                        namespaceName,
> -                        attr
> -                                .getLocalName(),
> -                        attr.getValue());
> -            } else {
> -                writer.writeAttribute(namespaceName,
> -                        attr.getLocalName(),
> -                        attr
> -                                .getValue());
> -            }
> -        } else {
> -            writer.writeAttribute(attr.getLocalName(), attr.getValue());
> -        }
> -    }
> -
> -    /**
> -     * Method serializeNamespace
> -     *
> -     * @param namespace
> -     * @param omOutput
> -     * @throws XMLStreamException
> -     */
> -    static void serializeNamespace(OMNamespace namespace, org.apache.axis2.om.impl.OMOutputImpl omOutput)
> -            throws XMLStreamException {
> -        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> -        if (namespace != null) {
> -            String uri = namespace.getName();
> -            String ns_prefix = namespace.getPrefix();
> -            writer.writeNamespace(ns_prefix, namespace.getName());
> -            writer.setPrefix(ns_prefix, uri);
> -        }
> -    }
> -
> -    /**
> -     * Slightly different implementation of the discard method
> -     *
> -     * @throws OMException
> -     */
> -    public void discard() throws OMException {
> -        if (done) {
> -            this.detach();
> -        } else {
> -            builder.discard((OMElement) this.parent);
> -        }
> -    }
> +       protected String value = null;
> +
> +       protected String mimeType;
> +
> +       protected boolean optimize = false;
> +
> +       protected boolean isBinary = false;
> +
> +       private static Random rnd = new Random(new Date().getTime());
> +
> +       /**
> +        * Field contentID for the mime part used when serialising Binary stuff as
> +        * MTOM optimised
> +        */
> +       private String contentID = null;
> +
> +       /**
> +        * Field dataHandler
> +        */
> +       private DataHandler dataHandler = null;
> +
> +       /**
> +        * Field nameSpace used when serialising Binary stuff as MTOM optimised
> +        */
> +       protected OMNamespace ns = new OMNamespaceImpl(
> +                       "http://www.w3.org/2004/08/xop/include", "xop");
> +
> +       /**
> +        * Field localName used when serialising Binary stuff as MTOM optimised
> +        */
> +       protected String localName = "Include";
> +
> +       /**
> +        * Field attributes used when serialising Binary stuff as MTOM optimised
> +        */
> +       protected OMAttribute attribute;
> +
> +       /**
> +        * Constructor OMTextImpl
> +        *
> +        * @param s
> +        */
> +       public OMTextImpl(String s) {
> +               this.value = s;
> +               this.nodeType = TEXT_NODE;
> +       }
> +
> +       /**
> +        * Constructor OMTextImpl
> +        *
> +        * @param parent
> +        * @param text
> +        */
> +       public OMTextImpl(OMElement parent, String text) {
> +               super(parent);
> +               this.value = text;
> +               done = true;
> +               this.nodeType = TEXT_NODE;
> +       }
> +
> +       /**
> +        * @param s -
> +        *            base64 encoded String representation of Binary
> +        * @param mimeType
> +        *            of the Binary
> +        */
> +       public OMTextImpl(String s, String mimeType, boolean optimize) {
> +               this(null, s, mimeType, optimize);
> +       }
> +
> +       /**
> +        * @param parent
> +        * @param s -
> +        *            base64 encoded String representation of Binary
> +        * @param mimeType
> +        *            of the Binary
> +        */
> +       public OMTextImpl(OMElement parent, String s, String mimeType,
> +                       boolean optimize) {
> +               this(parent, s);
> +               this.mimeType = mimeType;
> +               this.optimize = optimize;
> +               done = true;
> +               this.nodeType = TEXT_NODE;
> +       }
> +
> +       /**
> +        * @param dataHandler
> +        *            To send binary optimised content Created programatically.
> +        */
> +       public OMTextImpl(DataHandler dataHandler) {
> +               this(dataHandler, true);
> +       }
> +
> +       /**
> +        * @param dataHandler
> +        * @param optimize
> +        *            To send binary content. Created progrmatically.
> +        */
> +       public OMTextImpl(DataHandler dataHandler, boolean optimize) {
> +               this.dataHandler = dataHandler;
> +               this.isBinary = true;
> +               this.optimize = optimize;
> +               done = true;
> +               this.nodeType = TEXT_NODE;
> +       }
> +
> +       /**
> +        * @param contentID
> +        * @param parent
> +        * @param builder
> +        *            Used when the builder is encountered with a XOP:Include tag
> +        *            Stores a reference to the builder and the content-id. Supports
> +        *            deffered parsing of MIME messages
> +        */
> +       public OMTextImpl(String contentID, OMElement parent,
> +                       OMXMLParserWrapper builder) {
> +               super(parent);
> +               this.contentID = contentID;
> +               this.optimize = true;
> +               this.isBinary = true;
> +               this.builder = builder;
> +               this.nodeType = TEXT_NODE;
> +       }
> +
> +       /**
> +        * @param omOutput
> +        * @throws XMLStreamException
> +        */
> +       public void serializeWithCache(
> +                       org.apache.axis2.om.impl.OMOutputImpl omOutput)
> +                       throws XMLStreamException {
> +               XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> +               int type = getType();
> +               if (type == TEXT_NODE) {
> +                       writer.writeCharacters(this.value);
> +               } else if (type == CDATA_SECTION_NODE) {
> +                       writer.writeCData(this.value);
> +               }
> +               OMNode nextSibling = this.getNextSibling();
> +               if (nextSibling != null) {
> +                       nextSibling.serializeWithCache(omOutput);
> +               }
> +       }
> +
> +       /**
> +        * Returns the value
> +        */
> +       public String getText() throws OMException {
> +               if (this.value != null) {
> +                       return this.value;
> +               } else {
> +                       try {
> +                               InputStream inStream;
> +                               inStream = this.getInputStream();
> +                               int x = inStream.available();
> +                               byte[] data;
> +                               // There are times, this inStream reports the Available bytes incorrectly.
> +                               // Reading the First byte & then getting the available number of bytes fixed it.
> +                               if (x==0)
> +                               {
> +                               int firstByte = inStream.read();
> +                               data = new byte[inStream.available()+1];
> +                               data[0] = (byte)firstByte;
> +                               IOUtils.readFully(inStream, data,1,data.length-1);
> +                               }
> +                               else
> +                               {
> +                                       data = new byte[inStream.available()];
> +                                       IOUtils.readFully(inStream, data);
> +                               }
> +                               return Base64.encode(data);
> +                       } catch (Exception e) {
> +                               throw new OMException(
> +                                               "Cannot read from Stream taken form the Data Handler"
> +                                                               + e);
> +                       }
> +               }
> +       }
> +
> +       public boolean isOptimized() {
> +               return optimize;
> +       }
> +
> +       public void setOptimize(boolean value) {
> +               this.optimize = value;
> +       }
> +
> +       /**
> +        * @return
> +        * @throws org.apache.axis2.om.OMException
> +        *
> +        * @throws OMException
> +        */
> +       public DataHandler getDataHandler() {
> +               /*
> +                * this should return a DataHandler containing the binary data
> +                * reperesented by the Base64 strings stored in OMText
> +                */
> +               if (value != null) {
> +                       ByteArrayDataSource dataSource;
> +                       byte[] data = Base64.decode(value);
> +                       if (mimeType != null) {
> +                               dataSource = new ByteArrayDataSource(data, mimeType);
> +                       } else {
> +                               // Assumes type as application/octet-stream
> +                               dataSource = new ByteArrayDataSource(data);
> +                       }
> +                       return new DataHandler(dataSource);
> +               } else {
> +
> +                       if (dataHandler == null) {
> +                               if (contentID == null) {
> +                                       throw new RuntimeException("ContentID is null");
> +                               }
> +                               dataHandler = ((MTOMStAXSOAPModelBuilder) builder)
> +                                               .getDataHandler(contentID);
> +                       }
> +                       return dataHandler;
> +               }
> +       }
> +
> +       public String getLocalName() {
> +               return localName;
> +       }
> +
> +       public java.io.InputStream getInputStream() throws OMException {
> +               if (isBinary) {
> +                       if (dataHandler == null) {
> +                               getDataHandler();
> +                       }
> +                       InputStream inStream;
> +                       try {
> +                               inStream = dataHandler.getDataSource().getInputStream();
> +                       } catch (IOException e) {
> +                               throw new OMException(
> +                                               "Cannot get InputStream from DataHandler." + e);
> +                       }
> +                       return inStream;
> +               } else {
> +                       throw new OMException("Unsupported Operation");
> +               }
> +       }
> +
> +       public String getContentID() {
> +               if (contentID == null) {
> +                       contentID = MIMEOutputUtils.getRandomStringOf18Characters()
> +                                       + "@apache.org";
> +               }
> +               return this.contentID;
> +       }
> +
> +       public boolean isComplete() {
> +               return done;
> +       }
> +
> +       public void serialize(org.apache.axis2.om.impl.OMOutputImpl omOutput)
> +                       throws XMLStreamException {
> +               if (!this.isBinary) {
> +                       serializeWithCache(omOutput);
> +               } else {
> +                       if (omOutput.isOptimized()) {
> +                               if (contentID == null) {
> +                                       contentID = omOutput.getNextContentId();
> +                               }
> +                               // send binary as MTOM optimised
> +                               this.attribute = new OMAttributeImpl("href",
> +                                               new OMNamespaceImpl("", ""), "cid:" + getContentID());
> +                               this.serializeStartpart(omOutput);
> +                               omOutput.writeOptimized(this);
> +                               omOutput.getXmlStreamWriter().writeEndElement();
> +                       } else {
> +                               omOutput.getXmlStreamWriter().writeCharacters(this.getText());
> +                       }
> +                       // TODO do we need these
> +                       OMNode nextSibling = this.getNextSibling();
> +                       if (nextSibling != null) {
> +                               // serilize next sibling
> +                               nextSibling.serialize(omOutput);
> +                       } else {
> +                               // TODO : See whether following part is really needed
> +                               if (parent != null && !parent.isComplete()) {
> +                                       // do the special serialization
> +                                       // Only the push serializer is left now
> +                                       builder.next();
> +                               }
> +                       }
> +               }
> +       }
> +
> +       /*
> +        * Methods to copy from OMSerialize utils
> +        */
> +       private void serializeStartpart(OMOutputImpl omOutput)
> +                       throws XMLStreamException {
> +               String nameSpaceName;
> +               String writer_prefix;
> +               String prefix;
> +               XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> +               if (this.ns != null) {
> +                       nameSpaceName = this.ns.getName();
> +                       writer_prefix = writer.getPrefix(nameSpaceName);
> +                       prefix = this.ns.getPrefix();
> +                       if (nameSpaceName != null) {
> +                               if (writer_prefix != null) {
> +                                       writer
> +                                                       .writeStartElement(nameSpaceName, this
> +                                                                       .getLocalName());
> +                               } else {
> +                                       if (prefix != null) {
> +                                               writer.writeStartElement(prefix, this.getLocalName(),
> +                                                               nameSpaceName);
> +                                               //TODO FIX ME
> +                                               //writer.writeNamespace(prefix, nameSpaceName);
> +                                               writer.setPrefix(prefix, nameSpaceName);
> +                                       } else {
> +                                               writer.writeStartElement(nameSpaceName, this
> +                                                               .getLocalName());
> +                                               writer.writeDefaultNamespace(nameSpaceName);
> +                                               writer.setDefaultNamespace(nameSpaceName);
> +                                       }
> +                               }
> +                       } else {
> +                               writer.writeStartElement(this.getLocalName());
> +                       }
> +               } else {
> +                       writer.writeStartElement(this.getLocalName());
> +               }
> +               // add the elements attribute "href"
> +               serializeAttribute(this.attribute, omOutput);
> +               // add the namespace
> +               serializeNamespace(this.ns, omOutput);
> +       }
> +
> +       /**
> +        * Method serializeAttribute
> +        *
> +        * @param attr
> +        * @param omOutput
> +        * @throws XMLStreamException
> +        */
> +       static void serializeAttribute(OMAttribute attr, OMOutputImpl omOutput)
> +                       throws XMLStreamException {
> +               XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> +               // first check whether the attribute is associated with a namespace
> +               OMNamespace ns = attr.getNamespace();
> +               String prefix;
> +               String namespaceName;
> +               if (ns != null) {
> +                       // add the prefix if it's availble
> +                       prefix = ns.getPrefix();
> +                       namespaceName = ns.getName();
> +                       if (prefix != null) {
> +                               writer.writeAttribute(prefix, namespaceName, attr
> +                                               .getLocalName(), attr.getValue());
> +                       } else {
> +                               writer.writeAttribute(namespaceName, attr.getLocalName(), attr
> +                                               .getValue());
> +                       }
> +               } else {
> +                       writer.writeAttribute(attr.getLocalName(), attr.getValue());
> +               }
> +       }
> +
> +       /**
> +        * Method serializeNamespace
> +        *
> +        * @param namespace
> +        * @param omOutput
> +        * @throws XMLStreamException
> +        */
> +       static void serializeNamespace(OMNamespace namespace,
> +                       org.apache.axis2.om.impl.OMOutputImpl omOutput)
> +                       throws XMLStreamException {
> +               XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> +               if (namespace != null) {
> +                       String uri = namespace.getName();
> +                       String ns_prefix = namespace.getPrefix();
> +                       writer.writeNamespace(ns_prefix, namespace.getName());
> +                       writer.setPrefix(ns_prefix, uri);
> +               }
> +       }
> +
> +       /**
> +        * Slightly different implementation of the discard method
> +        *
> +        * @throws OMException
> +        */
> +       public void discard() throws OMException {
> +               if (done) {
> +                       this.detach();
> +               } else {
> +                       builder.discard((OMElement) this.parent);
> +               }
> +       }
>  }
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java Wed Jul 20 05:11:18 2005
> @@ -86,7 +86,8 @@
>                  if (contentIDName.equalsIgnoreCase("href")
> 
>                          & contentID.substring(0, 3).equalsIgnoreCase("cid")) {
> 
>                      contentID = contentID.substring(4);
> 
> -                } else {
> 
> +                } else if (!(contentIDName.equalsIgnoreCase("href")
> 
> +                       & (!contentID.equals("")))) {
> 
>                      throw new OMException(
> 
>                              "contentID not Found in XOP:Include element");
> 
>                  }
> 
> 
> Modified: webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt (original)
> +++ webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt Wed Jul 20 05:11:18 2005
> @@ -7,6 +7,5 @@
>  ------=_AxIs2_Def_boundary_=42214532
> 
>  Content-Transfer-Encoding: binary
> 
>  Content-ID: -1609420109260943731
> 
> -
> 
> -
> 8A ýþÿb
> 
> +
> 8A ???b
> 
>  ------=_AxIs2_Def_boundary_=42214532--
> 
> Modified: webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java (original)
> +++ webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java Wed Jul 20 05:11:18 2005
> @@ -19,6 +19,7 @@
>  import org.apache.axis2.attachments.ByteArrayDataSource;
>  import org.apache.axis2.soap.SOAPFactory;
>  import org.apache.axis2.om.impl.MIMEOutputUtils;
> +import org.apache.axis2.om.impl.OMOutputImpl;
> 
>  import javax.activation.DataHandler;
>  import javax.mail.MessagingException;
> @@ -43,9 +44,12 @@
>          super.setUp();
>          SOAPFactory factory = OMAbstractFactory.getSOAP11Factory();
>          ByteArrayOutputStream outStream;
> -        String boundary = "----TemporaryBoundary";
> +        String boundary;
> +
> +        OMOutputImpl omOutput = new OMOutputImpl(null);
> +        boundary = omOutput.getMimeBoundary();
> 
> -        String contentType = org.apache.axis2.om.impl.MIMEOutputUtils.getContentTypeForMime(boundary, "cid:0.632569289925808400@example.org");
> +        String contentType = org.apache.axis2.om.impl.MIMEOutputUtils.getContentTypeForMime(boundary,omOutput.getRootContentId());
>          DataHandler dataHandler;
>          dataHandler = new DataHandler(new ByteArrayDataSource(byteArray));
>          OMText textData = factory.createText(dataHandler, true);
> 
> 
> 


-- 
Davanum Srinivas -http://blogs.cocoondev.org/dims/

Re: svn commit: r219884 - in /webservices/axis/trunk/java/modules/xml: src/org/apache/axis2/attachments/ src/org/apache/axis2/om/impl/ src/org/apache/axis2/om/impl/llom/ src/org/apache/axis2/om/impl/llom/mtom/ test-resources/mtom/ test/org/apache/axi

Posted by Davanum Srinivas <da...@gmail.com>.
Thilina,

unfortunately there are just way too much white space changes...next
time, could you please submit a separate commit for just white space
changes and one for the code changes? it's difficult to understand
what changed if both are inter-mixed. i will try to review it again
later today.

thanks,
dims

On 7/20/05, thilina@apache.org <th...@apache.org> wrote:
> Author: thilina
> Date: Wed Jul 20 05:11:18 2005
> New Revision: 219884
> 
> URL: http://svn.apache.org/viewcvs?rev=219884&view=rev
> Log:
> Changing MIME Content-ID processing according to the spec & MSFT way
> 
> Modified:
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java
>     webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java
>     webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt
>     webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MIMEHelper.java Wed Jul 20 05:11:18 2005
> @@ -1,22 +1,19 @@
>  /**
> 
> - * 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/>
> 
> + * 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.axis2.attachments;
> 
> 
> 
> -import org.apache.axis2.om.OMException;
> 
> +import java.io.IOException;
> 
> +import java.io.InputStream;
> 
> +import java.io.PushbackInputStream;
> 
> +import java.util.HashMap;
> 
> 
> 
>  import javax.activation.DataHandler;
> 
>  import javax.mail.MessagingException;
> 
> @@ -24,90 +21,94 @@
>  import javax.mail.internet.ContentType;
> 
>  import javax.mail.internet.MimeBodyPart;
> 
>  import javax.mail.internet.ParseException;
> 
> -import java.io.IOException;
> 
> -import java.io.InputStream;
> 
> -import java.io.PushbackInputStream;
> 
> -import java.util.HashMap;
> 
> 
> 
> +import org.apache.axis2.om.OMException;
> 
> +
> 
> +/**
> 
> + * @author <a href="mailto:thilina@opensource.lk"> Thilina Gunarathne </a>
> 
> + */
> 
>  public class MIMEHelper {
> 
>      /**
> 
>       * if the Message is MTOM optimised then <code>MTOM_TYPE</code>
> 
>       */
> 
>      public static final String MTOM_TYPE = "application/xop+xml";
> 
> -
> 
> +
> 
>      /**
> 
>       * If the message is Soap with Attachments <code>SwA_TYPE</code>
> 
>       */
> 
>      public static final String SWA_TYPE = "text/xml";
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>rootPart</code> is used as the key for the root BodyPart in the
> 
>       * Parts HashMap
> 
>       */
> 
>      public static final String ROOT_PART = "SoapPart";
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>ContentType</code> of the MIME message
> 
>       */
> 
>      ContentType contentType;
> 
> -
> 
> +
> 
>      /**
> 
>       * Mime <code>boundary</code> which seperates mime parts
> 
>       */
> 
>      byte[] boundary;
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>applicationType</code> used to distinguish between MTOM & SWA If
> 
>       * the message is MTOM optimised type is application/xop+xml If the message
> 
>       * is SWA, type is ??have to find out
> 
>       */
> 
>      String applicationType = null;
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>pushbackInStream</code> stores the reference to the incoming
> 
>       * stream A PushbackStream has the ability to "push back" or "unread" one
> 
>       * byte.
> 
>       */
> 
>      PushbackInputStream pushbackInStream;
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>mimeBodyPartsMap</code> stores the already parsed Mime Body
> 
>       * Parts. This Map will be keyed using the content-ID's
> 
>       */
> 
>      HashMap bodyPartsMap;
> 
> -
> 
> +
> 
>      /**
> 
>       * <code>partIndex</code>- Number of Mime parts parsed
> 
>       */
> 
>      int partIndex = 0;
> 
> -
> 
> +
> 
> +    boolean endOfStreamReached = false;
> 
> +
> 
>      String firstPartId = null;
> 
> -
> 
> +
> 
>      boolean fileCacheEnable = false;
> 
> -
> 
> +
> 
>      String attachmentRepoDir = null;
> 
> -
> 
> +
> 
>      public MIMEHelper(InputStream inStream, String contentTypeString,
> 
> -                      boolean fileCacheEnable, String attachmentRepoDir)
> 
> -            throws OMException {
> 
> +            boolean fileCacheEnable, String attachmentRepoDir)
> 
> +    throws OMException {
> 
>          this.attachmentRepoDir = attachmentRepoDir;
> 
>          this.fileCacheEnable = fileCacheEnable;
> 
>          bodyPartsMap = new HashMap();
> 
>          try {
> 
>              contentType = new ContentType(contentTypeString);
> 
>          } catch (ParseException e) {
> 
> -            throw new OMException("Invalid Content Type Field in the Mime Message"
> 
> +            throw new OMException(
> 
> +                    "Invalid Content Type Field in the Mime Message"
> 
>                      + e.toString());
> 
>          }
> 
>          // Boundary always have the prefix "--".
> 
>          this.boundary = ("--" + contentType.getParameter("boundary"))
> 
> -                .getBytes();
> 
> -
> 
> +        .getBytes();
> 
> +
> 
>          //TODO do we need to wrap InputStream from a BufferedInputStream before
> 
>          // wrapping from PushbackStream
> 
>          pushbackInStream = new PushbackInputStream(inStream,
> 
>                  (this.boundary.length + 2));
> 
> -
> 
> +
> 
>          // Move the read pointer to the begining of the first part
> 
>          // read till the end of first boundary
> 
>          while (true) {
> 
> @@ -121,7 +122,7 @@
>                          value = pushbackInStream.read();
> 
>                          if (value == -1)
> 
>                              throw new OMException(
> 
> -                                    "Unexpected End of Stream while searching for first Mime Boundary");
> 
> +                            "Unexpected End of Stream while searching for first Mime Boundary");
> 
>                          boundaryIndex++;
> 
>                      }
> 
>                      if (boundaryIndex == boundary.length) { // boundary found
> 
> @@ -130,19 +131,19 @@
>                      }
> 
>                  } else if ((byte) value == -1) {
> 
>                      throw new OMException(
> 
> -                            "Mime parts not found. Stream ended while searching for the boundary");
> 
> +                    "Mime parts not found. Stream ended while searching for the boundary");
> 
>                  }
> 
>              } catch (IOException e1) {
> 
>                  throw new OMException("Stream Error" + e1.toString());
> 
>              }
> 
>          }
> 
>      }
> 
> -
> 
> +
> 
>      public MIMEHelper(InputStream inStream, String contentTypeString)
> 
> -            throws OMException {
> 
> +    throws OMException {
> 
>          this(inStream, contentTypeString, false, null);
> 
>      }
> 
> -
> 
> +
> 
>      /**
> 
>       * @return whether Message Type is SOAP with Attachments or MTOM optimised
> 
>       *         by checking the application type parameter in the Contant Type
> 
> @@ -156,12 +157,12 @@
>                  this.applicationType = SWA_TYPE;
> 
>              } else {
> 
>                  throw new OMException(
> 
> -                        "Invalid Application type. Support available for MTOM & SwA only.");
> 
> +                "Invalid Application type. Support available for MTOM & SwA only.");
> 
>              }
> 
>          }
> 
>          return this.applicationType;
> 
>      }
> 
> -
> 
> +
> 
>      /**
> 
>       * @return the InputStream which includes the SOAP Envelope We assumes that
> 
>       *         the root mime part is always pointed by "start" parameter in
> 
> @@ -169,6 +170,7 @@
>       */
> 
>      public InputStream getSOAPPartInputStream() throws OMException {
> 
>          String rootContentID = contentType.getParameter("start");
> 
> +
> 
>          // to handle the Start parameter not mentioned situation
> 
>          if (rootContentID == null) {
> 
>              if (partIndex == 0) {
> 
> @@ -177,13 +179,23 @@
>              rootContentID = firstPartId;
> 
>          } else {
> 
>              rootContentID.trim();
> 
> +            // Keep it here till we make sure the two angle brackets are
> 
> +            // required or not
> 
> +            if ((rootContentID.indexOf("<") > -1)
> 
> +                    & (rootContentID.indexOf(">") > -1))
> 
> +                rootContentID = rootContentID.substring(1, (rootContentID
> 
> +                        .length() - 1));
> 
> +        }
> 
> +        // Strips off the "cid" part from content-id
> 
> +        if (rootContentID.substring(0, 3).equalsIgnoreCase("cid")) {
> 
> +            rootContentID = rootContentID.substring(4);
> 
>          }
> 
>          DataHandler dh;
> 
>          try {
> 
>              dh = getDataHandler(rootContentID);
> 
>              if (dh == null) {
> 
>                  throw new OMException(
> 
> -                        "Mandatory Root MIME part containing the SOAP Envelope is missing");
> 
> +                "Mandatory Root MIME part containing the SOAP Envelope is missing");
> 
>              }
> 
>              return dh.getInputStream();
> 
>          } catch (IOException e) {
> 
> @@ -191,21 +203,22 @@
>                      "Problem with DataHandler of the Root Mime Part. " + e);
> 
>          }
> 
>      }
> 
> -
> 
> +
> 
>      /**
> 
>       * @param blobContentID
> 
>       * @return The DataHandler of the mime part refered by the content-Id
> 
> -     * @throws OMException First checks whether the MIME part is already parsed by
> 
> -     *                     checking the parts HashMap. If it is not parsed yet then call
> 
> -     *                     the getNextPart() till we find the required part.
> 
> +     * @throws OMException
> 
> +     *             First checks whether the MIME part is already parsed by
> 
> +     *             checking the parts HashMap. If it is not parsed yet then call
> 
> +     *             the getNextPart() till we find the required part.
> 
>       */
> 
>      public DataHandler getDataHandler(String blobContentID) throws OMException {
> 
> -
> 
> +
> 
>          Part bodyPart;
> 
> +        //     blobContentID = "<" + blobContentID + ">";
> 
>          boolean attachmentFound = false;
> 
> -
> 
> -        //             // without the following part a Null Pointer Exception is thrown
> 
> -        //
> 
> +
> 
> +        //TODO make sure to add surrounding angle brackets to the content ID
> 
>          if (bodyPartsMap.containsKey(blobContentID)) {
> 
>              bodyPart = (Part) bodyPartsMap.get(blobContentID);
> 
>              attachmentFound = true;
> 
> @@ -231,40 +244,53 @@
>                      }
> 
>                  }
> 
>              } catch (MessagingException e) {
> 
> -                throw new OMException("Invalid Mime Message " + e.toString());
> 
> +                throw new OMException("Invalid Mime Message " + e);
> 
>              }
> 
>          }
> 
> -
> 
> +
> 
>      }
> 
> -
> 
> +
> 
> +    protected void setEndOfStream(boolean value)
> 
> +    {
> 
> +        this.endOfStreamReached = value;
> 
> +
> 
> +    }
> 
> +
> 
>      /**
> 
>       * @return The next MIME Body part in the stream Uses the MimeBodyPartStream
> 
>       *         to obtain streams delimited by boundaries.
> 
> -     * @throws MessagingException
> 
> +     * @throws OMException
> 
>       */
> 
> -    // TODO do we need Locking for this
> 
>      private MimeBodyPart getMimeBodyPart() throws OMException {
> 
> +        // endOfStreamReached will be set to true if the message ended in MIME Style
> 
> +        // having "--" suffix with the last mime boundary
> 
> +        if (endOfStreamReached)
> 
> +            throw new OMException(
> 
> +            "Referenced MIME part not found.End of Stream reached.");
> 
> +
> 
>          MimeBodyPart mimeBodyPart = null;
> 
> -
> 
>          MimeBodyPartInputStream partStream;
> 
> -        partStream = new MimeBodyPartInputStream(pushbackInStream,
> 
> -                boundary);
> 
> +        partStream = new MimeBodyPartInputStream(pushbackInStream, boundary,
> 
> +                this);
> 
>          try {
> 
>              mimeBodyPart = new MimeBodyPart(partStream);
> 
> +
> 
> +            // This will take care if stream ended without having MIME message terminator
> 
> +            if (mimeBodyPart.getSize() <= 0) {
> 
> +                throw new OMException(
> 
> +                "Referenced MIME part not found.End of Stream reached.");
> 
> +            }
> 
>          } catch (MessagingException e) {
> 
>              throw new OMException("Problem reading Mime Part No "
> 
>                      + (partIndex + 1) + ". " + e);
> 
>          }
> 
> -
> 
>          partIndex++;
> 
>          return mimeBodyPart;
> 
>      }
> 
> -
> 
> +
> 
>      /**
> 
> -     * @return The Mime body part which contains the SOAP Envelope In MTOM case
> 
> -     *         it is the first part In SwA case we assumes it to be first
> 
> -     *         part.Have to FIX This
> 
> -     * @throws MessagingException
> 
> +     * @return
> 
> +     * @throws OMException
> 
>       */
> 
>      private MimeBodyPart getRootMimeBodyPart() throws OMException {
> 
>          MimeBodyPart rootMimeBodyPart;
> 
> @@ -276,7 +302,7 @@
>          }
> 
>          return rootMimeBodyPart;
> 
>      }
> 
> -
> 
> +
> 
>      private Part getNextPart() throws OMException {
> 
>          MimeBodyPart nextMimeBodyPart;
> 
>          nextMimeBodyPart = getMimeBodyPart();
> 
> @@ -284,31 +310,51 @@
>              String partContentID;
> 
>              try {
> 
>                  partContentID = nextMimeBodyPart.getContentID();
> 
> +
> 
>                  if (partContentID == null & partIndex == 1) {
> 
>                      bodyPartsMap.put("firstPart", nextMimeBodyPart);
> 
>                      firstPartId = "firstPart";
> 
>                      return nextMimeBodyPart;
> 
> +                }
> 
> +                if (partContentID == null) {
> 
> +                    throw new OMException(
> 
> +                    "Part content ID cannot be blank for non root MIME parts");
> 
> +                }
> 
> +                if ((partContentID.indexOf("<") > -1)
> 
> +                        & (partContentID.indexOf(">") > -1)) {
> 
> +                    partContentID = partContentID.substring(1, (partContentID
> 
> +                            .length() - 1));
> 
> +
> 
>                  } else if (partIndex == 1) {
> 
>                      firstPartId = partContentID;
> 
>                  }
> 
> -                if (fileCacheEnable) {
> 
> -                    PartOnFile part = new PartOnFile(nextMimeBodyPart,
> 
> -                            partContentID,
> 
> -                            attachmentRepoDir);
> 
> -                    return part;
> 
> -                } else {
> 
> -                    bodyPartsMap.put(partContentID, nextMimeBodyPart);
> 
> -                    return nextMimeBodyPart;
> 
> +                if (bodyPartsMap.containsKey(partContentID))
> 
> +                {
> 
> +                    throw new OMException("Two MIME parts with the same Content-ID not allowed.");
> 
>                  }
> 
> +       /*
> 
> +        * Temporary File storage support is deffered till 1.0
> 
> +        */
> 
> +                //                if (fileCacheEnable) {
> 
> +                //                    PartOnFile part = new PartOnFile(nextMimeBodyPart,
> 
> +                //                            partContentID,
> 
> +                //                            attachmentRepoDir);
> 
> +                //                    return part;
> 
> +                //                } else {
> 
> +                bodyPartsMap.put(partContentID, nextMimeBodyPart);
> 
> +                return nextMimeBodyPart;
> 
> +                //                }
> 
>              } catch (MessagingException e) {
> 
> -                throw new OMException("Error Reading Content-ID from Mime Part No "
> 
> -                        + partIndex + ". " + e);
> 
> -            } catch (Exception e) {
> 
> -                throw new OMException("Error Creating File  Storage Part"
> 
> +                throw new OMException(
> 
> +                        "Error Reading Content-ID from Mime Part No "
> 
>                          + partIndex + ". " + e);
> 
>              }
> 
> +            //            } catch (Exception e) {
> 
> +            //                throw new OMException("Error Creating File Storage Part"
> 
> +            //                        + partIndex + ". " + e);
> 
> +            //            }
> 
>          } else
> 
>              return null;
> 
>      }
> 
> -
> 
> +
> 
>  }
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/attachments/MimeBodyPartInputStream.java Wed Jul 20 05:11:18 2005
> @@ -1,18 +1,12 @@
>  /**
> 
> - * 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/>
> 
> + * 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.axis2.attachments;
> 
> 
> 
> @@ -25,15 +19,22 @@
> 
> 
>      boolean boundaryFound = false;
> 
> 
> 
> +    MIMEHelper parent = null;
> 
> +
> 
>      byte[] boundary;
> 
> 
> 
> -    public MimeBodyPartInputStream(PushbackInputStream inStream,
> 
> -                                   byte[] boundary) {
> 
> +    public MimeBodyPartInputStream(PushbackInputStream inStream, byte[] boundary) {
> 
>          super();
> 
>          this.inStream = inStream;
> 
>          this.boundary = boundary;
> 
>      }
> 
> 
> 
> +    public MimeBodyPartInputStream(PushbackInputStream inStream,
> 
> +            byte[] boundary, MIMEHelper parent) {
> 
> +        this(inStream, boundary);
> 
> +        this.parent = parent;
> 
> +    }
> 
> +
> 
>      public int read() throws IOException {
> 
>          if (boundaryFound) {
> 
>              return -1;
> 
> @@ -41,7 +42,8 @@
>          // read the next value from stream
> 
>          int value = inStream.read();
> 
> 
> 
> -        // A problem occured because all the mime parts tends to have a /r/n at the end. Making it hard to transform them to correct DataSources.
> 
> +        // A problem occured because all the mime parts tends to have a /r/n at
> 
> +        // the end. Making it hard to transform them to correct DataSources.
> 
>          // This logic introduced to handle it
> 
>          //TODO look more in to this && for a better way to do this
> 
>          if (value == 13) {
> 
> @@ -64,22 +66,23 @@
>          // read value is the first byte of the boundary. Start matching the
> 
>          // next characters to find a boundary
> 
>          int boundaryIndex = 0;
> 
> -        while ((boundaryIndex < boundary.length)
> 
> +        while ((boundaryIndex < (boundary.length - 1))
> 
>                  && ((byte) value == boundary[boundaryIndex])) {
> 
>              value = inStream.read();
> 
>              boundaryIndex++;
> 
>          }
> 
> 
> 
> -        if (boundaryIndex == boundary.length) { // boundary found
> 
> +        if (boundaryIndex == (boundary.length - 1)) { // boundary found
> 
>              boundaryFound = true;
> 
>              // read the end of line character
> 
> -            if (inStream.read() == 45) {
> 
> +            if ((value = inStream.read()) == 45) {
> 
>                  //check whether end of stream
> 
>                  //Last mime boundary should have a succeeding "--"
> 
> -                if (!((value = inStream.read()) == 45)) {
> 
> -                    inStream.unread(value);
> 
> +                if ((value = inStream.read()) == 45 && parent!=null) {
> 
> +                    parent.setEndOfStream(true);
> 
>                  }
> 
> -
> 
> +            } else {
> 
> +                inStream.read();
> 
>              }
> 
> 
> 
>              return -1;
> 
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/MIMEOutputUtils.java Wed Jul 20 05:11:18 2005
> @@ -15,22 +15,22 @@
>   */
> 
>  package org.apache.axis2.om.impl;
> 
> 
> 
> -import org.apache.axis2.om.OMText;
> 
> -import org.apache.axis2.om.OMException;
> 
> -
> 
> -import javax.activation.DataHandler;
> 
> -import javax.mail.MessagingException;
> 
> -import javax.mail.internet.ContentType;
> 
> -import javax.mail.internet.MimeBodyPart;
> 
>  import java.io.IOException;
> 
>  import java.io.OutputStream;
> 
> -import java.util.Iterator;
> 
> -import java.util.LinkedList;
> 
> -import java.util.Random;
> 
>  import java.net.InetAddress;
> 
>  import java.net.UnknownHostException;
> 
>  import java.security.MessageDigest;
> 
>  import java.security.NoSuchAlgorithmException;
> 
> +import java.util.Iterator;
> 
> +import java.util.LinkedList;
> 
> +import java.util.Random;
> 
> +
> 
> +import javax.activation.DataHandler;
> 
> +import javax.mail.MessagingException;
> 
> +import javax.mail.internet.MimeBodyPart;
> 
> +
> 
> +import org.apache.axis2.om.OMException;
> 
> +import org.apache.axis2.om.OMText;
> 
> 
> 
>  public class MIMEOutputUtils {
> 
> 
> 
> @@ -51,7 +51,7 @@
>              rootMimeBodyPart.addHeader("content-type",
> 
>                      "application/xop+xml; charset=utf-8; type=\"text/xml; charset=utf-8\"");
> 
>              rootMimeBodyPart.addHeader("content-transfer-encoding", "binary");
> 
> -            rootMimeBodyPart.addHeader("content-id", contentId);
> 
> +            rootMimeBodyPart.addHeader("content-id","<"+contentId+">");
> 
> 
> 
>              writeBodyPart(outStream, rootMimeBodyPart, boundary);
> 
> 
> 
> @@ -73,7 +73,7 @@
>              throws MessagingException {
> 
>          MimeBodyPart mimeBodyPart = new MimeBodyPart();
> 
>          mimeBodyPart.setDataHandler(node.getDataHandler());
> 
> -        mimeBodyPart.addHeader("content-id", node.getContentID());
> 
> +        mimeBodyPart.addHeader("content-id", "<"+node.getContentID()+">");
> 
>          mimeBodyPart.addHeader("content-type", "application/octet-stream");
> 
>          mimeBodyPart.addHeader("content-transfer-encoding", "binary");
> 
>          return mimeBodyPart;
> 
> @@ -133,7 +133,7 @@
>          sb.append("; ");
> 
>          sb.append("type=\"application/xop+xml\"");
> 
>          sb.append("; ");
> 
> -        sb.append("start=\"" + contentId + "\"");
> 
> +        sb.append("start=\"<" + "cid:"+contentId + ">\"");
> 
>          sb.append("; ");
> 
>          sb.append("start-info=\"text/xml; charset=utf-8\"");
> 
>          return sb.toString();
> 
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/OMOutputImpl.java Wed Jul 20 05:11:18 2005
> @@ -15,20 +15,16 @@
>   */
> 
>  package org.apache.axis2.om.impl;
> 
> 
> 
> -import org.apache.axis2.om.OMText;
> 
> +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;
> 
> -import java.io.ByteArrayOutputStream;
> 
> -import java.io.OutputStream;
> 
> -import java.net.InetAddress;
> 
> -import java.net.UnknownHostException;
> 
> -import java.security.MessageDigest;
> 
> -import java.security.NoSuchAlgorithmException;
> 
> -import java.util.LinkedList;
> 
> -import java.util.Random;
> 
> +
> 
> +import org.apache.axis2.om.OMText;
> 
> 
> 
>  /**
> 
>   * For the moment this assumes that transport takes the decision of whether
> 
> @@ -104,20 +100,20 @@
> 
> 
>      public String getMimeBoundary() {
> 
>          if(mimeBoundary == null) {
> 
> -            mimeBoundary = "--MIMEBoundary" + MIMEOutputUtils.getRandomStringOf18Characters();
> 
> +            mimeBoundary = "MIMEBoundary" + MIMEOutputUtils.getRandomStringOf18Characters();
> 
>          }
> 
>          return mimeBoundary;
> 
>      }
> 
> 
> 
>      public String getRootContentId() {
> 
>          if(rootContentId == null) {
> 
> -            rootContentId = "cid:0." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
> 
> +            rootContentId = "0." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
> 
>          }
> 
>          return rootContentId;
> 
>      }
> 
> 
> 
>      public String getNextContentId() {
> 
>          nextid++;
> 
> -        return "cid:" + nextid + "." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
> 
> +        return nextid + "." + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
> 
>      }
> 
>  }
> 
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java Wed Jul 20 05:11:18 2005
> @@ -1,20 +1,29 @@
>  /*
>   * 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
> - *
> + *
> + * 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.
> + * 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.axis2.om.impl.llom;
> 
> +import java.io.IOException;
> +import java.io.InputStream;
> +import java.util.Date;
> +import java.util.Random;
> +
> +import javax.activation.DataHandler;
> +import javax.xml.stream.XMLStreamException;
> +import javax.xml.stream.XMLStreamWriter;
> +
>  import org.apache.axis2.attachments.Base64;
>  import org.apache.axis2.attachments.ByteArrayDataSource;
>  import org.apache.axis2.attachments.IOUtils;
> @@ -24,386 +33,406 @@
>  import org.apache.axis2.om.OMException;
>  import org.apache.axis2.om.OMNamespace;
>  import org.apache.axis2.om.OMNode;
> -import org.apache.axis2.om.impl.OMOutputImpl;
> -import org.apache.axis2.om.impl.MIMEOutputUtils;
>  import org.apache.axis2.om.OMText;
>  import org.apache.axis2.om.OMXMLParserWrapper;
> +import org.apache.axis2.om.impl.MIMEOutputUtils;
> +import org.apache.axis2.om.impl.OMOutputImpl;
>  import org.apache.axis2.om.impl.llom.mtom.MTOMStAXSOAPModelBuilder;
> 
> -import javax.activation.DataHandler;
> -import javax.xml.stream.XMLStreamException;
> -import javax.xml.stream.XMLStreamWriter;
> -import java.io.IOException;
> -import java.io.InputStream;
> -import java.util.Date;
> -import java.util.Random;
> -
>  public class OMTextImpl extends OMNodeImpl implements OMText, OMConstants {
> -    protected String value = null;
> -    protected String mimeType;
> -    protected boolean optimize = false;
> -    protected boolean isBinary = false;
> -    private static Random rnd = new Random(new Date().getTime());
> -    /**
> -     * Field contentID for the mime part used when serialising Binary stuff as
> -     * MTOM optimised
> -     */
> -    private String contentID = null;
> -    /**
> -     * Field dataHandler
> -     */
> -    private DataHandler dataHandler = null;
> -    /**
> -     * Field nameSpace used when serialising Binary stuff as MTOM optimised
> -     */
> -    protected OMNamespace ns = new OMNamespaceImpl(
> -            "http://www.w3.org/2004/08/xop/include", "xop");
> -    /**
> -     * Field localName used when serialising Binary stuff as MTOM optimised
> -     */
> -    protected String localName = "Include";
> -    /**
> -     * Field attributes used when serialising Binary stuff as MTOM optimised
> -     */
> -    protected OMAttribute attribute;
> -
> -    /**
> -     * Constructor OMTextImpl
> -     *
> -     * @param s
> -     */
> -    public OMTextImpl(String s) {
> -        this.value = s;
> -        this.nodeType = TEXT_NODE;
> -    }
> -
> -    /**
> -     * Constructor OMTextImpl
> -     *
> -     * @param parent
> -     * @param text
> -     */
> -    public OMTextImpl(OMElement parent, String text) {
> -        super(parent);
> -        this.value = text;
> -        done = true;
> -        this.nodeType = TEXT_NODE;
> -    }
> -
> -    /**
> -     * @param s        -
> -     *                 base64 encoded String representation of Binary
> -     * @param mimeType of the Binary
> -     */
> -    public OMTextImpl(String s, String mimeType, boolean optimize) {
> -        this(null, s, mimeType, optimize);
> -    }
> -
> -    /**
> -     * @param parent
> -     * @param s        -
> -     *                 base64 encoded String representation of Binary
> -     * @param mimeType of the Binary
> -     */
> -    public OMTextImpl(OMElement parent, String s, String mimeType,
> -                      boolean optimize) {
> -        this(parent, s);
> -        this.mimeType = mimeType;
> -        this.optimize = optimize;
> -        done = true;
> -        this.nodeType = TEXT_NODE;
> -    }
> -
> -    /**
> -     * @param dataHandler To send binary optimised content Created programatically.
> -     */
> -    public OMTextImpl(DataHandler dataHandler) {
> -        this(dataHandler, true);
> -    }
> -
> -    /**
> -     * @param dataHandler
> -     * @param optimize    To send binary content. Created progrmatically.
> -     */
> -    public OMTextImpl(DataHandler dataHandler, boolean optimize) {
> -        this.dataHandler = dataHandler;
> -        this.isBinary = true;
> -        this.optimize = optimize;
> -        done = true;
> -        this.nodeType = TEXT_NODE;
> -    }
> -
> -    /**
> -     * @param contentID
> -     * @param parent
> -     * @param builder   Used when the builder is encountered with a XOP:Include tag
> -     *                  Stores a reference to the builder and the content-id. Supports
> -     *                  deffered parsing of MIME messages
> -     */
> -    public OMTextImpl(String contentID, OMElement parent,
> -                      OMXMLParserWrapper builder) {
> -        super(parent);
> -        this.contentID = contentID;
> -        this.optimize = true;
> -        this.isBinary = true;
> -        this.builder = builder;
> -        this.nodeType = TEXT_NODE;
> -    }
> -
> -    /**
> -     * @param omOutput
> -     * @throws XMLStreamException
> -     */
> -    public void serializeWithCache(org.apache.axis2.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
> -        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> -        int type = getType();
> -        if (type == TEXT_NODE) {
> -            writer.writeCharacters(this.value);
> -        } else if (type == CDATA_SECTION_NODE) {
> -            writer.writeCData(this.value);
> -        }
> -        OMNode nextSibling = this.getNextSibling();
> -        if (nextSibling != null) {
> -            nextSibling.serializeWithCache(omOutput);
> -        }
> -    }
> -
> -    /**
> -     * Returns the value
> -     */
> -    public String getText() throws OMException {
> -        if (this.value != null) {
> -            return this.value;
> -        } else {
> -            try {
> -                InputStream inStream;
> -                inStream = this.getInputStream();
> -                byte[] data;
> -                data = new byte[inStream.available()];
> -                IOUtils.readFully(inStream, data);
> -                return Base64.encode(data);
> -            } catch (Exception e) {
> -                throw new OMException("Cannot read from Stream taken form the Data Handler"
> -                        + e);
> -            }
> -        }
> -    }
> -
> -    public boolean isOptimized() {
> -        return optimize;
> -    }
> -
> -    public void setOptimize(boolean value) {
> -        this.optimize = value;
> -    }
> -
> -    /**
> -     * @return
> -     * @throws org.apache.axis2.om.OMException
> -     *
> -     * @throws OMException
> -     */
> -    public DataHandler getDataHandler() {
> -        /*
> -        * this should return a DataHandler containing the binary data
> -        * reperesented by the Base64 strings stored in OMText
> -        */
> -        if (value != null) {
> -            ByteArrayDataSource dataSource;
> -            byte[] data = Base64.decode(value);
> -            if (mimeType != null) {
> -                dataSource = new ByteArrayDataSource(data, mimeType);
> -            } else {
> -                // Assumes type as application/octet-stream
> -                dataSource = new ByteArrayDataSource(data);
> -            }
> -            return new DataHandler(dataSource);
> -        } else {
> -            if (contentID == null){
> -                throw new RuntimeException("ContentID is null");
> -            }
> -            if (dataHandler == null) {
> -                dataHandler = ((MTOMStAXSOAPModelBuilder) builder)
> -                        .getDataHandler(contentID);
> -            }
> -            return dataHandler;
> -        }
> -    }
> -
> -    public String getLocalName() {
> -        return localName;
> -    }
> -
> -    public java.io.InputStream getInputStream() throws OMException {
> -        if (isBinary) {
> -            if (dataHandler == null) {
> -                getDataHandler();
> -            }
> -            InputStream inStream;
> -            try {
> -                inStream = dataHandler.getDataSource().getInputStream();
> -            } catch (IOException e) {
> -                throw new OMException(
> -                        "Cannot get InputStream from DataHandler." + e);
> -            }
> -            return inStream;
> -        } else {
> -            throw new OMException("Unsupported Operation");
> -        }
> -    }
> -
> -    public String getContentID() {
> -        if(contentID == null) {
> -            contentID = "cid:" + MIMEOutputUtils.getRandomStringOf18Characters() + "@apache.org";
> -        }
> -        return this.contentID;
> -    }
> -
> -    public boolean isComplete() {
> -        return done;
> -    }
> -
> -    public void serialize(org.apache.axis2.om.impl.OMOutputImpl omOutput) throws XMLStreamException {
> -        if (!this.isBinary) {
> -            serializeWithCache(omOutput);
> -        } else {
> -            if (omOutput.isOptimized()) {
> -                if(contentID == null){
> -                    contentID = omOutput.getNextContentId();
> -                }
> -                // send binary as MTOM optimised
> -                this.attribute =
> -                        new OMAttributeImpl("href",
> -                                new OMNamespaceImpl("", ""),
> -                                getContentID());
> -                this.serializeStartpart(omOutput);
> -                omOutput.writeOptimized(this);
> -                omOutput.getXmlStreamWriter().writeEndElement();
> -            } else {
> -                omOutput.getXmlStreamWriter().writeCharacters(this.getText());
> -            }
> -            // TODO do we need these
> -            OMNode nextSibling = this.getNextSibling();
> -            if (nextSibling != null) {
> -                // serilize next sibling
> -                nextSibling.serialize(omOutput);
> -            } else {
> -                // TODO : See whether following part is really needed
> -                if (parent != null && !parent.isComplete()) {
> -                    // do the special serialization
> -                    // Only the push serializer is left now
> -                    builder.next();
> -                }
> -            }
> -        }
> -    }
> -
> -    /*
> -    * Methods to copy from OMSerialize utils
> -    */
> -    private void serializeStartpart(OMOutputImpl omOutput)
> -            throws XMLStreamException {
> -        String nameSpaceName;
> -        String writer_prefix;
> -        String prefix;
> -        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> -        if (this.ns != null) {
> -            nameSpaceName = this.ns.getName();
> -            writer_prefix = writer.getPrefix(nameSpaceName);
> -            prefix = this.ns.getPrefix();
> -            if (nameSpaceName != null) {
> -                if (writer_prefix != null) {
> -                    writer.writeStartElement(nameSpaceName,
> -                            this.getLocalName());
> -                } else {
> -                    if (prefix != null) {
> -                        writer.writeStartElement(prefix, this.getLocalName(),
> -                                nameSpaceName);
> -                        //TODO FIX ME
> -                        //writer.writeNamespace(prefix, nameSpaceName);
> -                        writer.setPrefix(prefix, nameSpaceName);
> -                    } else {
> -                        writer.writeStartElement(nameSpaceName,
> -                                this.getLocalName());
> -                        writer.writeDefaultNamespace(nameSpaceName);
> -                        writer.setDefaultNamespace(nameSpaceName);
> -                    }
> -                }
> -            } else {
> -                writer.writeStartElement(this.getLocalName());
> -            }
> -        } else {
> -            writer.writeStartElement(this.getLocalName());
> -        }
> -        // add the elements attribute "href"
> -        serializeAttribute(this.attribute, omOutput);
> -        // add the namespace
> -        serializeNamespace(this.ns, omOutput);
> -    }
> -
> -    /**
> -     * Method serializeAttribute
> -     *
> -     * @param attr
> -     * @param omOutput
> -     * @throws XMLStreamException
> -     */
> -    static void serializeAttribute(OMAttribute attr, OMOutputImpl omOutput)
> -            throws XMLStreamException {
> -        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> -        // first check whether the attribute is associated with a namespace
> -        OMNamespace ns = attr.getNamespace();
> -        String prefix;
> -        String namespaceName;
> -        if (ns != null) {
> -            // add the prefix if it's availble
> -            prefix = ns.getPrefix();
> -            namespaceName = ns.getName();
> -            if (prefix != null) {
> -                writer.writeAttribute(prefix,
> -                        namespaceName,
> -                        attr
> -                                .getLocalName(),
> -                        attr.getValue());
> -            } else {
> -                writer.writeAttribute(namespaceName,
> -                        attr.getLocalName(),
> -                        attr
> -                                .getValue());
> -            }
> -        } else {
> -            writer.writeAttribute(attr.getLocalName(), attr.getValue());
> -        }
> -    }
> -
> -    /**
> -     * Method serializeNamespace
> -     *
> -     * @param namespace
> -     * @param omOutput
> -     * @throws XMLStreamException
> -     */
> -    static void serializeNamespace(OMNamespace namespace, org.apache.axis2.om.impl.OMOutputImpl omOutput)
> -            throws XMLStreamException {
> -        XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> -        if (namespace != null) {
> -            String uri = namespace.getName();
> -            String ns_prefix = namespace.getPrefix();
> -            writer.writeNamespace(ns_prefix, namespace.getName());
> -            writer.setPrefix(ns_prefix, uri);
> -        }
> -    }
> -
> -    /**
> -     * Slightly different implementation of the discard method
> -     *
> -     * @throws OMException
> -     */
> -    public void discard() throws OMException {
> -        if (done) {
> -            this.detach();
> -        } else {
> -            builder.discard((OMElement) this.parent);
> -        }
> -    }
> +       protected String value = null;
> +
> +       protected String mimeType;
> +
> +       protected boolean optimize = false;
> +
> +       protected boolean isBinary = false;
> +
> +       private static Random rnd = new Random(new Date().getTime());
> +
> +       /**
> +        * Field contentID for the mime part used when serialising Binary stuff as
> +        * MTOM optimised
> +        */
> +       private String contentID = null;
> +
> +       /**
> +        * Field dataHandler
> +        */
> +       private DataHandler dataHandler = null;
> +
> +       /**
> +        * Field nameSpace used when serialising Binary stuff as MTOM optimised
> +        */
> +       protected OMNamespace ns = new OMNamespaceImpl(
> +                       "http://www.w3.org/2004/08/xop/include", "xop");
> +
> +       /**
> +        * Field localName used when serialising Binary stuff as MTOM optimised
> +        */
> +       protected String localName = "Include";
> +
> +       /**
> +        * Field attributes used when serialising Binary stuff as MTOM optimised
> +        */
> +       protected OMAttribute attribute;
> +
> +       /**
> +        * Constructor OMTextImpl
> +        *
> +        * @param s
> +        */
> +       public OMTextImpl(String s) {
> +               this.value = s;
> +               this.nodeType = TEXT_NODE;
> +       }
> +
> +       /**
> +        * Constructor OMTextImpl
> +        *
> +        * @param parent
> +        * @param text
> +        */
> +       public OMTextImpl(OMElement parent, String text) {
> +               super(parent);
> +               this.value = text;
> +               done = true;
> +               this.nodeType = TEXT_NODE;
> +       }
> +
> +       /**
> +        * @param s -
> +        *            base64 encoded String representation of Binary
> +        * @param mimeType
> +        *            of the Binary
> +        */
> +       public OMTextImpl(String s, String mimeType, boolean optimize) {
> +               this(null, s, mimeType, optimize);
> +       }
> +
> +       /**
> +        * @param parent
> +        * @param s -
> +        *            base64 encoded String representation of Binary
> +        * @param mimeType
> +        *            of the Binary
> +        */
> +       public OMTextImpl(OMElement parent, String s, String mimeType,
> +                       boolean optimize) {
> +               this(parent, s);
> +               this.mimeType = mimeType;
> +               this.optimize = optimize;
> +               done = true;
> +               this.nodeType = TEXT_NODE;
> +       }
> +
> +       /**
> +        * @param dataHandler
> +        *            To send binary optimised content Created programatically.
> +        */
> +       public OMTextImpl(DataHandler dataHandler) {
> +               this(dataHandler, true);
> +       }
> +
> +       /**
> +        * @param dataHandler
> +        * @param optimize
> +        *            To send binary content. Created progrmatically.
> +        */
> +       public OMTextImpl(DataHandler dataHandler, boolean optimize) {
> +               this.dataHandler = dataHandler;
> +               this.isBinary = true;
> +               this.optimize = optimize;
> +               done = true;
> +               this.nodeType = TEXT_NODE;
> +       }
> +
> +       /**
> +        * @param contentID
> +        * @param parent
> +        * @param builder
> +        *            Used when the builder is encountered with a XOP:Include tag
> +        *            Stores a reference to the builder and the content-id. Supports
> +        *            deffered parsing of MIME messages
> +        */
> +       public OMTextImpl(String contentID, OMElement parent,
> +                       OMXMLParserWrapper builder) {
> +               super(parent);
> +               this.contentID = contentID;
> +               this.optimize = true;
> +               this.isBinary = true;
> +               this.builder = builder;
> +               this.nodeType = TEXT_NODE;
> +       }
> +
> +       /**
> +        * @param omOutput
> +        * @throws XMLStreamException
> +        */
> +       public void serializeWithCache(
> +                       org.apache.axis2.om.impl.OMOutputImpl omOutput)
> +                       throws XMLStreamException {
> +               XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> +               int type = getType();
> +               if (type == TEXT_NODE) {
> +                       writer.writeCharacters(this.value);
> +               } else if (type == CDATA_SECTION_NODE) {
> +                       writer.writeCData(this.value);
> +               }
> +               OMNode nextSibling = this.getNextSibling();
> +               if (nextSibling != null) {
> +                       nextSibling.serializeWithCache(omOutput);
> +               }
> +       }
> +
> +       /**
> +        * Returns the value
> +        */
> +       public String getText() throws OMException {
> +               if (this.value != null) {
> +                       return this.value;
> +               } else {
> +                       try {
> +                               InputStream inStream;
> +                               inStream = this.getInputStream();
> +                               int x = inStream.available();
> +                               byte[] data;
> +                               // There are times, this inStream reports the Available bytes incorrectly.
> +                               // Reading the First byte & then getting the available number of bytes fixed it.
> +                               if (x==0)
> +                               {
> +                               int firstByte = inStream.read();
> +                               data = new byte[inStream.available()+1];
> +                               data[0] = (byte)firstByte;
> +                               IOUtils.readFully(inStream, data,1,data.length-1);
> +                               }
> +                               else
> +                               {
> +                                       data = new byte[inStream.available()];
> +                                       IOUtils.readFully(inStream, data);
> +                               }
> +                               return Base64.encode(data);
> +                       } catch (Exception e) {
> +                               throw new OMException(
> +                                               "Cannot read from Stream taken form the Data Handler"
> +                                                               + e);
> +                       }
> +               }
> +       }
> +
> +       public boolean isOptimized() {
> +               return optimize;
> +       }
> +
> +       public void setOptimize(boolean value) {
> +               this.optimize = value;
> +       }
> +
> +       /**
> +        * @return
> +        * @throws org.apache.axis2.om.OMException
> +        *
> +        * @throws OMException
> +        */
> +       public DataHandler getDataHandler() {
> +               /*
> +                * this should return a DataHandler containing the binary data
> +                * reperesented by the Base64 strings stored in OMText
> +                */
> +               if (value != null) {
> +                       ByteArrayDataSource dataSource;
> +                       byte[] data = Base64.decode(value);
> +                       if (mimeType != null) {
> +                               dataSource = new ByteArrayDataSource(data, mimeType);
> +                       } else {
> +                               // Assumes type as application/octet-stream
> +                               dataSource = new ByteArrayDataSource(data);
> +                       }
> +                       return new DataHandler(dataSource);
> +               } else {
> +
> +                       if (dataHandler == null) {
> +                               if (contentID == null) {
> +                                       throw new RuntimeException("ContentID is null");
> +                               }
> +                               dataHandler = ((MTOMStAXSOAPModelBuilder) builder)
> +                                               .getDataHandler(contentID);
> +                       }
> +                       return dataHandler;
> +               }
> +       }
> +
> +       public String getLocalName() {
> +               return localName;
> +       }
> +
> +       public java.io.InputStream getInputStream() throws OMException {
> +               if (isBinary) {
> +                       if (dataHandler == null) {
> +                               getDataHandler();
> +                       }
> +                       InputStream inStream;
> +                       try {
> +                               inStream = dataHandler.getDataSource().getInputStream();
> +                       } catch (IOException e) {
> +                               throw new OMException(
> +                                               "Cannot get InputStream from DataHandler." + e);
> +                       }
> +                       return inStream;
> +               } else {
> +                       throw new OMException("Unsupported Operation");
> +               }
> +       }
> +
> +       public String getContentID() {
> +               if (contentID == null) {
> +                       contentID = MIMEOutputUtils.getRandomStringOf18Characters()
> +                                       + "@apache.org";
> +               }
> +               return this.contentID;
> +       }
> +
> +       public boolean isComplete() {
> +               return done;
> +       }
> +
> +       public void serialize(org.apache.axis2.om.impl.OMOutputImpl omOutput)
> +                       throws XMLStreamException {
> +               if (!this.isBinary) {
> +                       serializeWithCache(omOutput);
> +               } else {
> +                       if (omOutput.isOptimized()) {
> +                               if (contentID == null) {
> +                                       contentID = omOutput.getNextContentId();
> +                               }
> +                               // send binary as MTOM optimised
> +                               this.attribute = new OMAttributeImpl("href",
> +                                               new OMNamespaceImpl("", ""), "cid:" + getContentID());
> +                               this.serializeStartpart(omOutput);
> +                               omOutput.writeOptimized(this);
> +                               omOutput.getXmlStreamWriter().writeEndElement();
> +                       } else {
> +                               omOutput.getXmlStreamWriter().writeCharacters(this.getText());
> +                       }
> +                       // TODO do we need these
> +                       OMNode nextSibling = this.getNextSibling();
> +                       if (nextSibling != null) {
> +                               // serilize next sibling
> +                               nextSibling.serialize(omOutput);
> +                       } else {
> +                               // TODO : See whether following part is really needed
> +                               if (parent != null && !parent.isComplete()) {
> +                                       // do the special serialization
> +                                       // Only the push serializer is left now
> +                                       builder.next();
> +                               }
> +                       }
> +               }
> +       }
> +
> +       /*
> +        * Methods to copy from OMSerialize utils
> +        */
> +       private void serializeStartpart(OMOutputImpl omOutput)
> +                       throws XMLStreamException {
> +               String nameSpaceName;
> +               String writer_prefix;
> +               String prefix;
> +               XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> +               if (this.ns != null) {
> +                       nameSpaceName = this.ns.getName();
> +                       writer_prefix = writer.getPrefix(nameSpaceName);
> +                       prefix = this.ns.getPrefix();
> +                       if (nameSpaceName != null) {
> +                               if (writer_prefix != null) {
> +                                       writer
> +                                                       .writeStartElement(nameSpaceName, this
> +                                                                       .getLocalName());
> +                               } else {
> +                                       if (prefix != null) {
> +                                               writer.writeStartElement(prefix, this.getLocalName(),
> +                                                               nameSpaceName);
> +                                               //TODO FIX ME
> +                                               //writer.writeNamespace(prefix, nameSpaceName);
> +                                               writer.setPrefix(prefix, nameSpaceName);
> +                                       } else {
> +                                               writer.writeStartElement(nameSpaceName, this
> +                                                               .getLocalName());
> +                                               writer.writeDefaultNamespace(nameSpaceName);
> +                                               writer.setDefaultNamespace(nameSpaceName);
> +                                       }
> +                               }
> +                       } else {
> +                               writer.writeStartElement(this.getLocalName());
> +                       }
> +               } else {
> +                       writer.writeStartElement(this.getLocalName());
> +               }
> +               // add the elements attribute "href"
> +               serializeAttribute(this.attribute, omOutput);
> +               // add the namespace
> +               serializeNamespace(this.ns, omOutput);
> +       }
> +
> +       /**
> +        * Method serializeAttribute
> +        *
> +        * @param attr
> +        * @param omOutput
> +        * @throws XMLStreamException
> +        */
> +       static void serializeAttribute(OMAttribute attr, OMOutputImpl omOutput)
> +                       throws XMLStreamException {
> +               XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> +               // first check whether the attribute is associated with a namespace
> +               OMNamespace ns = attr.getNamespace();
> +               String prefix;
> +               String namespaceName;
> +               if (ns != null) {
> +                       // add the prefix if it's availble
> +                       prefix = ns.getPrefix();
> +                       namespaceName = ns.getName();
> +                       if (prefix != null) {
> +                               writer.writeAttribute(prefix, namespaceName, attr
> +                                               .getLocalName(), attr.getValue());
> +                       } else {
> +                               writer.writeAttribute(namespaceName, attr.getLocalName(), attr
> +                                               .getValue());
> +                       }
> +               } else {
> +                       writer.writeAttribute(attr.getLocalName(), attr.getValue());
> +               }
> +       }
> +
> +       /**
> +        * Method serializeNamespace
> +        *
> +        * @param namespace
> +        * @param omOutput
> +        * @throws XMLStreamException
> +        */
> +       static void serializeNamespace(OMNamespace namespace,
> +                       org.apache.axis2.om.impl.OMOutputImpl omOutput)
> +                       throws XMLStreamException {
> +               XMLStreamWriter writer = omOutput.getXmlStreamWriter();
> +               if (namespace != null) {
> +                       String uri = namespace.getName();
> +                       String ns_prefix = namespace.getPrefix();
> +                       writer.writeNamespace(ns_prefix, namespace.getName());
> +                       writer.setPrefix(ns_prefix, uri);
> +               }
> +       }
> +
> +       /**
> +        * Slightly different implementation of the discard method
> +        *
> +        * @throws OMException
> +        */
> +       public void discard() throws OMException {
> +               if (done) {
> +                       this.detach();
> +               } else {
> +                       builder.discard((OMElement) this.parent);
> +               }
> +       }
>  }
> 
> Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java (original)
> +++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/mtom/MTOMStAXSOAPModelBuilder.java Wed Jul 20 05:11:18 2005
> @@ -86,7 +86,8 @@
>                  if (contentIDName.equalsIgnoreCase("href")
> 
>                          & contentID.substring(0, 3).equalsIgnoreCase("cid")) {
> 
>                      contentID = contentID.substring(4);
> 
> -                } else {
> 
> +                } else if (!(contentIDName.equalsIgnoreCase("href")
> 
> +                       & (!contentID.equals("")))) {
> 
>                      throw new OMException(
> 
>                              "contentID not Found in XOP:Include element");
> 
>                  }
> 
> 
> Modified: webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt (original)
> +++ webservices/axis/trunk/java/modules/xml/test-resources/mtom/MTOMBuilderTestIn.txt Wed Jul 20 05:11:18 2005
> @@ -7,6 +7,5 @@
>  ------=_AxIs2_Def_boundary_=42214532
> 
>  Content-Transfer-Encoding: binary
> 
>  Content-ID: -1609420109260943731
> 
> -
> 
> -
> 8A ýþÿb
> 
> +
> 8A ???b
> 
>  ------=_AxIs2_Def_boundary_=42214532--
> 
> Modified: webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java
> URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java?rev=219884&r1=219883&r2=219884&view=diff
> ==============================================================================
> --- webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java (original)
> +++ webservices/axis/trunk/java/modules/xml/test/org/apache/axis2/om/MIMEOutputUtilsTest.java Wed Jul 20 05:11:18 2005
> @@ -19,6 +19,7 @@
>  import org.apache.axis2.attachments.ByteArrayDataSource;
>  import org.apache.axis2.soap.SOAPFactory;
>  import org.apache.axis2.om.impl.MIMEOutputUtils;
> +import org.apache.axis2.om.impl.OMOutputImpl;
> 
>  import javax.activation.DataHandler;
>  import javax.mail.MessagingException;
> @@ -43,9 +44,12 @@
>          super.setUp();
>          SOAPFactory factory = OMAbstractFactory.getSOAP11Factory();
>          ByteArrayOutputStream outStream;
> -        String boundary = "----TemporaryBoundary";
> +        String boundary;
> +
> +        OMOutputImpl omOutput = new OMOutputImpl(null);
> +        boundary = omOutput.getMimeBoundary();
> 
> -        String contentType = org.apache.axis2.om.impl.MIMEOutputUtils.getContentTypeForMime(boundary, "cid:0.632569289925808400@example.org");
> +        String contentType = org.apache.axis2.om.impl.MIMEOutputUtils.getContentTypeForMime(boundary,omOutput.getRootContentId());
>          DataHandler dataHandler;
>          dataHandler = new DataHandler(new ByteArrayDataSource(byteArray));
>          OMText textData = factory.createText(dataHandler, true);
> 
> 
> 


-- 
Davanum Srinivas -http://blogs.cocoondev.org/dims/