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/01 06:55:57 UTC

svn commit: r208711 - /webservices/axis/trunk/java/modules/xml/src/org/apache/axis/attachments/MIMEHelper.java

Author: thilina
Date: Thu Jun 30 21:55:56 2005
New Revision: 208711

URL: http://svn.apache.org/viewcvs?rev=208711&view=rev
Log:
Fixing the bug of Malfuntioning with repetitive requests

Modified:
    webservices/axis/trunk/java/modules/xml/src/org/apache/axis/attachments/MIMEHelper.java

Modified: webservices/axis/trunk/java/modules/xml/src/org/apache/axis/attachments/MIMEHelper.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/modules/xml/src/org/apache/axis/attachments/MIMEHelper.java?rev=208711&r1=208710&r2=208711&view=diff
==============================================================================
--- webservices/axis/trunk/java/modules/xml/src/org/apache/axis/attachments/MIMEHelper.java (original)
+++ webservices/axis/trunk/java/modules/xml/src/org/apache/axis/attachments/MIMEHelper.java Thu Jun 30 21:55:56 2005
@@ -1,297 +1,311 @@
-/**
- * Copyright 2001-2004 The Apache Software Foundation.
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * <p/>
- */
-package org.apache.axis.attachments;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PushbackInputStream;
-import java.util.HashMap;
-
-import javax.activation.DataHandler;
-import javax.mail.MessagingException;
-import javax.mail.Part;
-import javax.mail.internet.ContentType;
-import javax.mail.internet.MimeBodyPart;
-import javax.mail.internet.ParseException;
-
-import org.apache.axis.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;
-
-	public MIMEHelper(InputStream inStream, String contentTypeString)
-			throws OMException {
-		bodyPartsMap = new HashMap();
-		try {
-			contentType = new ContentType(contentTypeString);
-		} catch (ParseException e) {
-			throw new OMException(
-					"Invalid Content Type Field in the Mime Message"
-							+ e.toString());
-		}
-		// Boundary always have the prefix "--".
-		this.boundary = ("--" + contentType.getParameter("boundary"))
-				.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) {
-			int value;
-			try {
-				value = pushbackInStream.read();
-				if ((byte) value == boundary[0]) {
-					int boundaryIndex = 0;
-					while ((boundaryIndex < boundary.length)
-							&& ((byte) value == boundary[boundaryIndex])) {
-						value = pushbackInStream.read();
-						if (value == -1)
-							throw new OMException(
-									"Unexpected End of Stream while searching for first Mime Boundary");
-						boundaryIndex++;
-					}
-					if (boundaryIndex == boundary.length) { // boundary found
-						pushbackInStream.read();
-						break;
-					}
-				} else if ((byte) value == -1) {
-					throw new OMException(
-							"Mime parts not found. Stream ended while searching for the boundary");
-				}
-			} catch (IOException e1) {
-				throw new OMException("Stream Error" + e1.toString());
-			}
-		}
-	}
-
-	/**
-	 * @return whether Message Type is SOAP with Attachments or MTOM optimised
-	 *         by checking the application type parameter in the Contant Type
-	 */
-	public String getAttachmentSpecType() {
-		if (this.applicationType == null) {
-			applicationType = contentType.getParameter("type");
-			if (applicationType.equalsIgnoreCase(MTOM_TYPE)) {
-				this.applicationType = MTOM_TYPE;
-			} else if (applicationType.equalsIgnoreCase(SWA_TYPE)) {
-				this.applicationType = SWA_TYPE;
-			} else {
-				throw new OMException(
-						"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
-	 *         content-type
-	 */
-	public InputStream getSOAPPartInputStream() throws OMException {
-		String rootContentID = contentType.getParameter("start");
-		rootContentID.trim();
-		rootContentID = rootContentID
-				.substring(1, (rootContentID.length() - 1));
-
-		DataHandler dh;
-		try {
-			dh = getDataHandler(rootContentID);
-			if (dh == null) {
-				throw new OMException(
-						"Mandatory Root MIME part containing the SOAP Envelope is missing");
-			}
-			return dh.getInputStream();
-		} catch (IOException e) {
-			throw new OMException(
-					"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.
-	 */
-	public DataHandler getDataHandler(String blobContentID) throws OMException {
-
-		Part bodyPart;
-		blobContentID = "<" + blobContentID + ">";
-		boolean attachmentFound = false;
-
-		//		// without the following part a Null Pointer Exception is thrown
-		//		
-		if (bodyPartsMap.containsKey(blobContentID)) {
-			bodyPart = (Part) bodyPartsMap.get(blobContentID);
-			attachmentFound = true;
-			DataHandler dh;
-			try {
-				dh = bodyPart.getDataHandler();
-			} catch (MessagingException e) {
-				throw new OMException("Problem with Mime Body Part No "
-						+ partIndex + ".  " + e);
-			}
-			return dh;
-		} else {
-			try {
-				while (true) {
-					bodyPart = this.getNextMimeBodyPart();
-					if (bodyPart == null) {
-						return null;
-					}
-					if (bodyPartsMap.containsKey(blobContentID)) {
-						bodyPart = (Part) bodyPartsMap.get(blobContentID);
-						DataHandler dh = bodyPart.getDataHandler();
-						return dh;
-					}
-				}
-			} catch (MessagingException e) {
-				throw new OMException("Invalid Mime Message " + e.toString());
-			}
-		}
-
-	}
-
-	/**
-	 * @return The next MIME Body part in the stream Uses the MimeBodyPartStream
-	 *         to obtain streams delimited by boundaries.
-	 * @throws MessagingException
-	 */
-	// TODO do we need Locking for this
-	private MimeBodyPart getMimeBodyPart() throws OMException {
-		MimeBodyPart mimeBodyPart = null;
-        
-		//String Line = pushbackInStream.readLine();
-		MimeBodyPartInputStream partStream;
-		try {
-			if (pushbackInStream.available() > 0) {
-				partStream = new MimeBodyPartInputStream(pushbackInStream,
-						boundary);
-			} else {
-				throw new OMException(
-						"Attachment not found. End of Stream reached");
-			}
-		} catch (IOException e1) {
-			throw new OMException("Attachement not found. Problem with Stream");
-		}
-
-		try {
-			mimeBodyPart = new MimeBodyPart(partStream);
-		} 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
-	 */
-	private MimeBodyPart getRootMimeBodyPart() throws OMException {
-		MimeBodyPart rootMimeBodyPart;
-		if (bodyPartsMap.isEmpty()) {
-			rootMimeBodyPart = getMimeBodyPart();
-			bodyPartsMap.put(ROOT_PART, rootMimeBodyPart);
-		} else {
-			rootMimeBodyPart = (MimeBodyPart) bodyPartsMap.get(ROOT_PART);
-		}
-		return rootMimeBodyPart;
-	}
-
-	private MimeBodyPart getNextMimeBodyPart() throws OMException {
-		MimeBodyPart nextMimeBodyPart;
-		nextMimeBodyPart = getMimeBodyPart();
-		if (nextMimeBodyPart != null) {
-			String partContentID;
-			try {
-				partContentID = nextMimeBodyPart.getContentID();
-				bodyPartsMap.put(partContentID, nextMimeBodyPart);
-				return nextMimeBodyPart;
-			} catch (MessagingException e) {
-				throw new OMException(
-						"Error Reading Content-ID from Mime Part No "
-								+ partIndex + ". " + e);
-			}
-		} else
-			return null;
-	}
-
+/**
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * <p/>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * <p/>
+ */
+package org.apache.axis.attachments;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PushbackInputStream;
+import java.util.HashMap;
+
+import javax.activation.DataHandler;
+import javax.mail.MessagingException;
+import javax.mail.Part;
+import javax.mail.internet.ContentType;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.ParseException;
+
+import org.apache.axis.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 fileCacheEnable = false;
+
+	String attachmentRepoDir = null;
+
+	public MIMEHelper(InputStream inStream, String contentTypeString,
+			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"
+							+ e.toString());
+		}
+		// Boundary always have the prefix "--".
+		this.boundary = ("--" + contentType.getParameter("boundary"))
+				.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) {
+			int value;
+			try {
+				value = pushbackInStream.read();
+				if ((byte) value == boundary[0]) {
+					int boundaryIndex = 0;
+					while ((boundaryIndex < boundary.length)
+							&& ((byte) value == boundary[boundaryIndex])) {
+						value = pushbackInStream.read();
+						if (value == -1)
+							throw new OMException(
+									"Unexpected End of Stream while searching for first Mime Boundary");
+						boundaryIndex++;
+					}
+					if (boundaryIndex == boundary.length) { // boundary found
+						pushbackInStream.read();
+						break;
+					}
+				} else if ((byte) value == -1) {
+					throw new OMException(
+							"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 {
+		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
+	 */
+	public String getAttachmentSpecType() {
+		if (this.applicationType == null) {
+			applicationType = contentType.getParameter("type");
+			if (applicationType.equalsIgnoreCase(MTOM_TYPE)) {
+				this.applicationType = MTOM_TYPE;
+			} else if (applicationType.equalsIgnoreCase(SWA_TYPE)) {
+				this.applicationType = SWA_TYPE;
+			} else {
+				throw new OMException(
+						"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
+	 *         content-type
+	 */
+	public InputStream getSOAPPartInputStream() throws OMException {
+		String rootContentID = contentType.getParameter("start");
+		rootContentID.trim();
+		rootContentID = rootContentID
+				.substring(1, (rootContentID.length() - 1));
+
+		DataHandler dh;
+		try {
+			dh = getDataHandler(rootContentID);
+			if (dh == null) {
+				throw new OMException(
+						"Mandatory Root MIME part containing the SOAP Envelope is missing");
+			}
+			return dh.getInputStream();
+		} catch (IOException e) {
+			throw new OMException(
+					"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.
+	 */
+	public DataHandler getDataHandler(String blobContentID) throws OMException {
+
+		Part bodyPart;
+		blobContentID = "<" + blobContentID + ">";
+		boolean attachmentFound = false;
+
+		//		// without the following part a Null Pointer Exception is thrown
+		//		
+		if (bodyPartsMap.containsKey(blobContentID)) {
+			bodyPart = (Part) bodyPartsMap.get(blobContentID);
+			attachmentFound = true;
+			DataHandler dh;
+			try {
+				dh = bodyPart.getDataHandler();
+			} catch (MessagingException e) {
+				throw new OMException("Problem with Mime Body Part No "
+						+ partIndex + ".  " + e);
+			}
+			return dh;
+		} else {
+			try {
+				while (true) {
+					bodyPart = this.getNextMimeBodyPart();
+					if (bodyPart == null) {
+						return null;
+					}
+					System.out.println("blob cid : "+blobContentID);
+					if (bodyPartsMap.containsKey(blobContentID)) {
+						bodyPart = (Part) bodyPartsMap.get(blobContentID);
+						DataHandler dh = bodyPart.getDataHandler();
+						return dh;
+					}
+				}
+			} catch (MessagingException e) {
+				throw new OMException("Invalid Mime Message " + e.toString());
+			}
+		}
+
+	}
+
+	/**
+	 * @return The next MIME Body part in the stream Uses the MimeBodyPartStream
+	 *         to obtain streams delimited by boundaries.
+	 * @throws MessagingException
+	 */
+	// TODO do we need Locking for this
+	private MimeBodyPart getMimeBodyPart() throws OMException {
+		MimeBodyPart mimeBodyPart = null;
+
+		//String Line = pushbackInStream.readLine();
+		MimeBodyPartInputStream partStream;
+//		try {
+			//if (pushbackInStream.available() > 0) {
+				partStream = new MimeBodyPartInputStream(pushbackInStream,
+						boundary);
+			//} else {
+			//	throw new OMException(
+			//			"Attachment not found. End of Stream reached");
+			//}
+//		} catch (IOException e1) {
+//			throw new OMException("Attachement not found. Problem with Stream");
+//		}
+
+		try {
+			mimeBodyPart = new MimeBodyPart(partStream);
+		} 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
+	 */
+	private MimeBodyPart getRootMimeBodyPart() throws OMException {
+		MimeBodyPart rootMimeBodyPart;
+		if (bodyPartsMap.isEmpty()) {
+			rootMimeBodyPart = getMimeBodyPart();
+			bodyPartsMap.put(ROOT_PART, rootMimeBodyPart);
+		} else {
+			rootMimeBodyPart = (MimeBodyPart) bodyPartsMap.get(ROOT_PART);
+		}
+		return rootMimeBodyPart;
+	}
+
+	private MimeBodyPart getNextMimeBodyPart() throws OMException {
+		MimeBodyPart nextMimeBodyPart;
+		nextMimeBodyPart = getMimeBodyPart();
+		if (nextMimeBodyPart != null) {
+			String partContentID;
+			try {
+				partContentID = nextMimeBodyPart.getContentID();
+				System.out.println("Mime part cid : "+partContentID);
+				bodyPartsMap.put(partContentID, nextMimeBodyPart);
+				return nextMimeBodyPart;
+			} catch (MessagingException e) {
+				throw new OMException(
+						"Error Reading Content-ID from Mime Part No "
+								+ partIndex + ". " + e);
+			}
+		} else
+			return null;
+	}
+
 }