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/