dims 02/05/29 06:05:54 Modified: java/src/org/apache/axis/attachments AttachmentPart.java AttachmentsImpl.java AttachmentUtils.java MimeUtils.java java/src/org/apache/axis/encoding/ser JAFDataHandlerDeserializer.java java/src/org/apache/axis/handlers MD5AttachHandler.java java/src/org/apache/axis Part.java SOAPPart.java Added: java/src/org/apache/axis/utils SOAPUtils.java Log: - Convert org.apache.axis.Part into an interface from an abstract class. - org.apache.axis.SOAPPart extends javax.xml.soap.SOAPPart - org.apache.axis.attachments.AttachmentPart extends javax.xml.soap.AttachmentPart - Fix typo getActiviationDataHandler->getActivationDataHandler - Extract static code previously in org.apache.axis.Part into SOAPUtils.java TODO: - Implement/cleanup the methods in org.apache.axis.SOAPPart and org.apache.axis.attachments.AttachmentPart Revision Changes Path 1.8 +314 -9 xml-axis/java/src/org/apache/axis/attachments/AttachmentPart.java Index: AttachmentPart.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/attachments/AttachmentPart.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- AttachmentPart.java 24 May 2002 18:20:41 -0000 1.7 +++ AttachmentPart.java 29 May 2002 13:05:54 -0000 1.8 @@ -56,28 +56,41 @@ package org.apache.axis.attachments; import org.apache.axis.Part; +import org.apache.axis.utils.JavaUtils; +import org.apache.axis.utils.SOAPUtils; import org.apache.axis.transport.http.HTTPConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -public class AttachmentPart extends Part { +import javax.activation.DataHandler; +import javax.xml.soap.SOAPException; +import java.util.Hashtable; +import java.util.Iterator; + +public class AttachmentPart extends javax.xml.soap.AttachmentPart implements Part { protected static Log log = LogFactory.getLog(AttachmentPart.class.getName()); javax.activation.DataHandler datahandler= null; - + + private Hashtable headers = new Hashtable(); + private String contentId; + private String contentLocation; + public AttachmentPart() { - super(); + addMimeHeader(HTTPConstants.HEADER_CONTENT_ID , SOAPUtils.getNewContentIdValue()); + } public AttachmentPart(javax.activation.DataHandler dh ) { - super(); + addMimeHeader(HTTPConstants.HEADER_CONTENT_ID , SOAPUtils.getNewContentIdValue()); + datahandler= dh; addMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE , dh.getContentType()); } - public javax.activation.DataHandler getActiviationDataHandler(){ + public javax.activation.DataHandler getActivationDataHandler(){ return datahandler; } @@ -86,13 +99,13 @@ public int getContentLength() { return 0; } - */ + */ /** * TODO: everything! - */ + */ public String getContentType() { - return getMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE); + return getFirstMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE); } /** @@ -100,7 +113,299 @@ public int getSize() { return 0; } - */ + */ + + /** + * Add the specified MIME header, as per JAXM. + */ + public void addMimeHeader (String header, String value) { + + if(null == header) { + throw new IllegalArgumentException(JavaUtils.getMessage("headerNotNull")); + } + + header = header.trim(); + + if(header.length() == 0) { + throw new IllegalArgumentException( + JavaUtils.getMessage("headerNotEmpty")); + } + + if(null == value) { + throw new IllegalArgumentException( + JavaUtils.getMessage("headerValueNotNull")); + } + headers.put(header.toLowerCase(), value); + } + + /** + * Get the specified MIME header. + */ + public String getFirstMimeHeader (String header) { + return (String) headers.get(header.toLowerCase()); + } + + /** + * Total size in bytes (of all content and headers, as encoded). + public abstract int getSize(); + */ + + /** + * Content location. + */ + public String getContentLocation() { + return getFirstMimeHeader(HTTPConstants.HEADER_CONTENT_LOCATION); + } + + /** + * Set content location. + */ + public void setContentLocation(String loc) { + addMimeHeader(HTTPConstants.HEADER_CONTENT_LOCATION, loc); + } + + /** + * Sets Content-Id of this part. "cid:" prefix will be added if one wan't + * already defined. + * @param newCid new Content-Id + * @returns void + */ + public void setContentId(String newCid){ + if(!newCid.toLowerCase().startsWith("cid:")){ + newCid="cid:"+newCid; + } + addMimeHeader(HTTPConstants.HEADER_CONTENT_ID,newCid); + } + + /** + * Content ID. + */ + public String getContentId() { + String ret= getFirstMimeHeader(HTTPConstants.HEADER_CONTENT_ID); + //Do not let the contentID ever be empty. + if(ret == null){ + ret=SOAPUtils.getNewContentIdValue(); + addMimeHeader(HTTPConstants.HEADER_CONTENT_ID , ret); + } + ret= ret.trim(); + if(ret.length() ==0){ + ret=SOAPUtils.getNewContentIdValue(); + addMimeHeader(HTTPConstants.HEADER_CONTENT_ID , ret); + } + return ret; + } + + + /** + * Get all headers that match + */ + public java.util.Iterator getMatchingMimeHeaders( final String[] match){ + java.util.LinkedList retList= new java.util.LinkedList(); + if(null != match && 0 != match.length ){ + for(int i= match.length-1 ; i > -1 ; --i){ + if(match[i] != null){ + String key= match[i].toLowerCase(); + if(headers.containsKey(key)) + retList.add(match[i]); + } + } + } + return retList.iterator(); + } + + /** + * Get all headers that do not match + */ + public java.util.Iterator getNonMatchingMimeHeaders( final String[] match){ + java.util.LinkedList retList= new java.util.LinkedList(headers.keySet()); + if(null != match && 0 != match.length && !headers.isEmpty()){ + for(int i= match.length-1 ; i > -1 ; --i){ + if(match[i] != null){ + String remItem= match[i].toLowerCase(); + if(headers.containsKey(remItem)){ + retList.remove(remItem); + } + } + } + } + return retList.iterator(); + } + + /** + * Retrieves all the headers for this <CODE> + * AttachmentPart</CODE> object as an iterator over the <CODE> + * MimeHeader</CODE> objects. + * @return an <CODE>Iterator</CODE> object with all of the Mime + * headers for this <CODE>AttachmentPart</CODE> object + */ + public Iterator getAllMimeHeaders() { + //TODO: Implement this. + return null; + } + /** + * Changes the first header entry that matches the given name + * to the given value, adding a new header if no existing + * header matches. This method also removes all matching + * headers but the first. + * + * <P>Note that RFC822 headers can only contain US-ASCII + * characters.</P> + * @param name a <CODE>String</CODE> giving the + * name of the header for which to search + * @param value a <CODE>String</CODE> giving the + * value to be set for the header whose name matches the + * given name + * @throws java.lang.IllegalArgumentException if + * there was a problem with the specified mime header name + * or value + */ + public void setMimeHeader(String name, String value){ + //TODO: Implement this. + } + + /** Removes all the MIME header entries. */ + public void removeAllMimeHeaders() { + //TODO: Implement this. + } + + /** + * Removes all MIME headers that match the given name. + * @param header - the string name of the MIME + * header/s to be removed + */ + public void removeMimeHeader(String header) { + //TODO: Implement this. + } + + /** + * Gets the <CODE>DataHandler</CODE> object for this <CODE> + * AttachmentPart</CODE> object. + * @return the <CODE>DataHandler</CODE> object associated with + * this <CODE>AttachmentPart</CODE> object + * @throws SOAPException if there is + * no data in this <CODE>AttachmentPart</CODE> object + */ + public DataHandler getDataHandler() throws SOAPException { + //TODO: Implement this. + return null; + } + + /** + * Sets the given <CODE>DataHandler</CODE> object as the + * data handler for this <CODE>AttachmentPart</CODE> object. + * Typically, on an incoming message, the data handler is + * automatically set. When a message is being created and + * populated with content, the <CODE>setDataHandler</CODE> + * method can be used to get data from various data sources into + * the message. + * @param datahandler <CODE>DataHandler</CODE> object to + * be set + * @throws java.lang.IllegalArgumentException if + * there was a problem with the specified <CODE> + * DataHandler</CODE> object + */ + public void setDataHandler(DataHandler datahandler) { + //TODO: Implement this. + } + + /** + * Gets the content of this <CODE>AttachmentPart</CODE> object + * as a Java object. The type of the returned Java object + * depends on (1) the <CODE>DataContentHandler</CODE> object + * that is used to interpret the bytes and (2) the <CODE> + * Content-Type</CODE> given in the header. + * + * <P>For the MIME content types "text/plain", "text/html" and + * "text/xml", the <CODE>DataContentHandler</CODE> object does + * the conversions to and from the Java types corresponding to + * the MIME types. For other MIME types,the <CODE> + * DataContentHandler</CODE> object can return an <CODE> + * InputStream</CODE> object that contains the content data as + * raw bytes.</P> + * + * <P>A JAXM-compliant implementation must, as a minimum, + * return a <CODE>java.lang.String</CODE> object corresponding + * to any content stream with a <CODE>Content-Type</CODE> + * value of <CODE>text/plain</CODE> and a <CODE> + * javax.xml.transform.StreamSource</CODE> object + * corresponding to a content stream with a <CODE> + * Content-Type</CODE> value of <CODE>text/xml</CODE>. For + * those content types that an installed <CODE> + * DataContentHandler</CODE> object does not understand, the + * <CODE>DataContentHandler</CODE> object is required to + * return a <CODE>java.io.InputStream</CODE> object with the + * raw bytes.</P> + * @return a Java object with the content of this <CODE> + * AttachmentPart</CODE> object + * @throws SOAPException if there is no content set + * into this <CODE>AttachmentPart</CODE> object or if there + * was a data transformation error + */ + public Object getContent() throws SOAPException { + //TODO: Implement this. + return null; + } + + /** + * Sets the content of this attachment part to that of the + * given <CODE>Object</CODE> and sets the value of the <CODE> + * Content-Type</CODE> header to the given type. The type of the + * <CODE>Object</CODE> should correspond to the value given for + * the <CODE>Content-Type</CODE>. This depends on the particular + * set of <CODE>DataContentHandler</CODE> objects in use. + * @param object the Java object that makes up + the content for this attachment part + * @param contentType the MIME string that + specifies the type of the content + * @throws java.lang.IllegalArgumentException if + * the contentType does not match the type of the content + * object, or if there was no <CODE> + * DataContentHandler</CODE> object for this content + * object + * @see #getContent() getContent() + */ + public void setContent(Object object, String contentType) { + //TODO: Implement this. + } + + /** + * Clears out the content of this <CODE> + * AttachmentPart</CODE> object. The MIME header portion is left + * untouched. + */ + public void clearContent() { + //TODO: Implement this. + } + + /** + * Returns the number of bytes in this <CODE> + * AttachmentPart</CODE> object. + * @return the size of this <CODE>AttachmentPart</CODE> object + * in bytes or -1 if the size cannot be determined + * @throws SOAPException if the content of this + * attachment is corrupted of if there was an exception + * while trying to determine the size. + */ + public int getSize() throws SOAPException { + //TODO: Implement this. + return -1; + } + + /** + * Gets all the values of the header identified by the given + * <CODE>String</CODE>. + * @param name the name of the header; example: + * "Content-Type" + * @return a <CODE>String</CODE> array giving the value for the + * specified header + * @see #setMimeHeader(java.lang.String, java.lang.String) setMimeHeader(java.lang.String, java.lang.String) + */ + public String[] getMimeHeader(String name) { + //TODO: Flesh this out. + String[] strings = new String[1]; + strings[0] = getFirstMimeHeader(name); + return strings; + } } 1.14 +1 -1 xml-axis/java/src/org/apache/axis/attachments/AttachmentsImpl.java Index: AttachmentsImpl.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/attachments/AttachmentsImpl.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- AttachmentsImpl.java 15 Mar 2002 01:14:10 -0000 1.13 +++ AttachmentsImpl.java 29 May 2002 13:05:54 -0000 1.14 @@ -320,7 +320,7 @@ (multipart = org.apache.axis.attachments.MimeUtils.createMP(soapPart.getAsString(), orderedAttachments))); for( java.util.Iterator i= orderedAttachments.iterator(); i.hasNext(); ){ AttachmentPart part= (AttachmentPart)i.next(); - DataHandler dh= AttachmentUtils.getActiviationDataHandler(part); + DataHandler dh= AttachmentUtils.getActivationDataHandler(part); DataSource ds= dh.getDataSource(); if( ds != null && ds instanceof ManagedMemoryDataSource ){ ((ManagedMemoryDataSource) ds).delete(); 1.5 +2 -2 xml-axis/java/src/org/apache/axis/attachments/AttachmentUtils.java Index: AttachmentUtils.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/attachments/AttachmentUtils.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- AttachmentUtils.java 15 Mar 2002 01:14:10 -0000 1.4 +++ AttachmentUtils.java 29 May 2002 13:05:54 -0000 1.5 @@ -75,7 +75,7 @@ * @return The Java activiation data handler. */ - public static DataHandler getActiviationDataHandler(Part part) throws AxisFault{ + public static DataHandler getActivationDataHandler(Part part) throws AxisFault{ if( null == part) { throw new AxisFault(JavaUtils.getMessage("gotNullPart")); } @@ -84,7 +84,7 @@ throw new AxisFault(JavaUtils.getMessage("unsupportedAttach", part.getClass().getName(), AttachmentPart.class.getName())); } - return ((AttachmentPart) part).getActiviationDataHandler(); + return ((AttachmentPart) part).getActivationDataHandler(); } /** 1.14 +2 -2 xml-axis/java/src/org/apache/axis/attachments/MimeUtils.java Index: MimeUtils.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/attachments/MimeUtils.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- MimeUtils.java 25 Mar 2002 23:55:30 -0000 1.13 +++ MimeUtils.java 29 May 2002 13:05:54 -0000 1.14 @@ -242,7 +242,7 @@ for (java.util.Iterator it = parts.iterator(); it.hasNext(); ) { org.apache.axis.Part part= (org.apache.axis.Part) it.next(); javax.activation.DataHandler dh = - org.apache.axis.attachments.AttachmentUtils.getActiviationDataHandler(part); + org.apache.axis.attachments.AttachmentUtils.getActivationDataHandler(part); String contentID = part.getContentId(); if (contentID.startsWith("cid:")) contentID = contentID.substring(4); @@ -262,7 +262,7 @@ HTTPConstants.HEADER_CONTENT_TYPE, HTTPConstants.HEADER_CONTENT_ID, HTTPConstants.HEADER_CONTENT_TRANSFER_ENCODING }); i.hasNext(); ){ String header= (String) i.next(); - messageBodyPart.setHeader(header, part.getMimeHeader(header)); + messageBodyPart.setHeader(header, part.getFirstMimeHeader(header)); } multipart.addBodyPart(messageBodyPart); } 1.7 +1 -1 xml-axis/java/src/org/apache/axis/encoding/ser/JAFDataHandlerDeserializer.java Index: JAFDataHandlerDeserializer.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/JAFDataHandlerDeserializer.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- JAFDataHandlerDeserializer.java 25 May 2002 03:46:46 -0000 1.6 +++ JAFDataHandlerDeserializer.java 29 May 2002 13:05:54 -0000 1.7 @@ -101,7 +101,7 @@ if (href != null) { Object ref = context.getObjectByRef(href); try{ - ref = AttachmentUtils.getActiviationDataHandler((org.apache.axis.Part)ref); + ref = AttachmentUtils.getActivationDataHandler((org.apache.axis.Part)ref); }catch(org.apache.axis.AxisFault e){;} setValue(ref); 1.10 +1 -1 xml-axis/java/src/org/apache/axis/handlers/MD5AttachHandler.java Index: MD5AttachHandler.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/handlers/MD5AttachHandler.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- MD5AttachHandler.java 9 May 2002 18:25:17 -0000 1.9 +++ MD5AttachHandler.java 29 May 2002 13:05:54 -0000 1.10 @@ -93,7 +93,7 @@ //Get the href associated with the attachment. String href = paramElement.getAttribute(org.apache.axis.Constants.ATTR_HREF); org.apache.axis.Part ap = msg.getAttachments().getAttachmentByReference(href); - javax.activation.DataHandler dh = org.apache.axis.attachments.AttachmentUtils.getActiviationDataHandler(ap); + javax.activation.DataHandler dh = org.apache.axis.attachments.AttachmentUtils.getActivationDataHandler(ap); org.w3c.dom.Node timeNode = paramElement.getFirstChild(); long startTime = -1; 1.8 +21 -139 xml-axis/java/src/org/apache/axis/Part.java Index: Part.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/Part.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- Part.java 15 Mar 2002 01:14:09 -0000 1.7 +++ Part.java 29 May 2002 13:05:54 -0000 1.8 @@ -81,172 +81,54 @@ import org.apache.axis.transport.http.HTTPConstants; -public abstract class Part +public interface Part { - protected static Log log = - LogFactory.getLog(Part.class.getName()); - - private Hashtable headers = new Hashtable(); - private String contentId; - private String contentLocation; - - /** - * Fill in the Message field. (Of course this can only be called by - * subclass constructors since Part itself is abstract.) - */ - public Part () { - addMimeHeader(HTTPConstants.HEADER_CONTENT_ID , getNewContentIdValue()); - - } - /** * Add the specified MIME header, as per JAXM. */ - public void addMimeHeader (String header, String value) { - - if(null == header) { - throw new IllegalArgumentException(JavaUtils.getMessage("headerNotNull")); - } - - header = header.trim(); - - if(header.length() == 0) { - throw new IllegalArgumentException( - JavaUtils.getMessage("headerNotEmpty")); - } - - if(null == value) { - throw new IllegalArgumentException( - JavaUtils.getMessage("headerValueNotNull")); - } - headers.put(header.toLowerCase(), value); - } + public void addMimeHeader (String header, String value); /** * Get the specified MIME header. */ - public String getMimeHeader (String header) { - return (String) headers.get(header.toLowerCase()); - } - - /** - * Total size in bytes (of all content and headers, as encoded). - public abstract int getSize(); - */ + public String getFirstMimeHeader (String header); /** * Content location. */ - public String getContentLocation() { - return getMimeHeader(HTTPConstants.HEADER_CONTENT_LOCATION); - } + public String getContentLocation(); /** * Set content location. */ - public void setContentLocation(String loc) { - addMimeHeader(HTTPConstants.HEADER_CONTENT_LOCATION, loc); - } - - /** - * Sets Content-Id of this part. "cid:" prefix will be added if one wan't - * already defined. - * @param newCid new Content-Id - * @returns void - */ - public void setContentId(String newCid){ - if(!newCid.toLowerCase().startsWith("cid:")){ - newCid="cid:"+newCid; - } - addMimeHeader(HTTPConstants.HEADER_CONTENT_ID,newCid); - } + public void setContentLocation(String loc); + + /** + * Sets Content-Id of this part. "cid:" prefix will be added if one wan't + * already defined. + * @param newCid new Content-Id + * @returns void + */ + public void setContentId(String newCid); /** * Content ID. */ - public String getContentId() { - String ret= getMimeHeader(HTTPConstants.HEADER_CONTENT_ID); - //Do not let the contentID ever be empty. - if(ret == null){ - ret=getNewContentIdValue(); - addMimeHeader(HTTPConstants.HEADER_CONTENT_ID , ret); - } - ret= ret.trim(); - if(ret.length() ==0){ - ret=getNewContentIdValue(); - addMimeHeader(HTTPConstants.HEADER_CONTENT_ID , ret); - } - return ret; - } + public String getContentId(); + /** + * Get all headers that match + */ + public java.util.Iterator getMatchingMimeHeaders( final String[] match); /** - * Get all headers that match - */ - public java.util.Iterator getMatchingMimeHeaders( final String[] match){ - java.util.LinkedList retList= new java.util.LinkedList(); - if(null != match && 0 != match.length ){ - for(int i= match.length-1 ; i > -1 ; --i){ - if(match[i] != null){ - String key= match[i].toLowerCase(); - if(headers.containsKey(key)) - retList.add(match[i]); - } - } - } - return retList.iterator(); - } - - /** - * Get all headers that do not match - */ - public java.util.Iterator getNonMatchingMimeHeaders( final String[] match){ - java.util.LinkedList retList= new java.util.LinkedList(headers.keySet()); - if(null != match && 0 != match.length && !headers.isEmpty()){ - for(int i= match.length-1 ; i > -1 ; --i){ - if(match[i] != null){ - String remItem= match[i].toLowerCase(); - if(headers.containsKey(remItem)){ - retList.remove(remItem); - } - } - } - } - return retList.iterator(); - } + * Get all headers that do not match + */ + public java.util.Iterator getNonMatchingMimeHeaders( final String[] match); /** * Content type. */ public abstract String getContentType(); - - - static String thisHost = null; - - private static int count = (int) (Math.random() * 100); - - public static String getNewContentIdValue() { - int lcount; - - synchronized (org.apache.axis.Part.class ) { - lcount = ++count; - } - if (null == thisHost) { - try { - thisHost = java.net.InetAddress.getLocalHost().getHostName(); - } - catch (java.net.UnknownHostException e) { - log.error(JavaUtils.getMessage("javaNetUnknownHostException00"), e); - - thisHost = "localhost"; - } - } - - StringBuffer s = new StringBuffer(); - - // Unique string is <hashcode>.<currentTime>.apache-soap.<hostname> - s.append("cid:").append( lcount).append(s.hashCode()).append('.').append(System.currentTimeMillis()).append(".AXIS@").append(thisHost); - return s.toString(); - } } 1.22 +243 -2 xml-axis/java/src/org/apache/axis/SOAPPart.java Index: SOAPPart.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/SOAPPart.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- SOAPPart.java 24 May 2002 18:20:41 -0000 1.21 +++ SOAPPart.java 29 May 2002 13:05:54 -0000 1.22 @@ -62,6 +62,8 @@ import org.apache.axis.message.InputStreamBody; import org.apache.axis.message.SOAPEnvelope; import org.apache.axis.utils.JavaUtils; +import org.apache.axis.utils.SOAPUtils; +import org.apache.axis.transport.http.HTTPConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -69,7 +71,11 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import javax.xml.soap.SOAPException; +import javax.xml.transform.Source; import java.io.*; +import java.util.Hashtable; +import java.util.Iterator; /** * The SOAPPart provides access to the root part of the Message which @@ -86,7 +92,7 @@ * @author Doug Davis ([EMAIL PROTECTED]) * @author Glen Daniels ([EMAIL PROTECTED]) */ -public class SOAPPart extends Part +public class SOAPPart extends javax.xml.soap.SOAPPart implements Part { protected static Log log = LogFactory.getLog(SOAPPart.class.getName()); @@ -99,6 +105,11 @@ private static final int FORM_FAULT = 6; private int currentForm; + private Hashtable headers = new Hashtable(); + private String contentId; + private String contentLocation; + + private static final String[] formNames = { "", "FORM_STRING", "FORM_INPUTSTREAM", "FORM_SOAPENVELOPE", "FORM_BYTES", "FORM_BODYINSTREAM", "FORM_FAULT" }; @@ -132,7 +143,8 @@ * "Just something to us working..." */ public SOAPPart(Message parent, Object initialContents, boolean isBodyStream) { - super(); + addMimeHeader(HTTPConstants.HEADER_CONTENT_ID , SOAPUtils.getNewContentIdValue()); + msgObject=parent; // originalMessage = initialContents; @@ -454,5 +466,234 @@ return (SOAPEnvelope)currentMessage; } + /** + * Add the specified MIME header, as per JAXM. + */ + public void addMimeHeader (String header, String value) { + + if(null == header) { + throw new IllegalArgumentException(JavaUtils.getMessage("headerNotNull")); + } + + header = header.trim(); + + if(header.length() == 0) { + throw new IllegalArgumentException( + JavaUtils.getMessage("headerNotEmpty")); + } + + if(null == value) { + throw new IllegalArgumentException( + JavaUtils.getMessage("headerValueNotNull")); + } + headers.put(header.toLowerCase(), value); + } + + /** + * Get the specified MIME header. + */ + public String getFirstMimeHeader (String header) { + return (String) headers.get(header.toLowerCase()); + } + + /** + * Total size in bytes (of all content and headers, as encoded). + public abstract int getSize(); + */ + + /** + * Content location. + */ + public String getContentLocation() { + return getFirstMimeHeader(HTTPConstants.HEADER_CONTENT_LOCATION); + } + + /** + * Set content location. + */ + public void setContentLocation(String loc) { + addMimeHeader(HTTPConstants.HEADER_CONTENT_LOCATION, loc); + } + + /** + * Sets Content-Id of this part. "cid:" prefix will be added if one wan't + * already defined. + * @param newCid new Content-Id + * @returns void + */ + public void setContentId(String newCid){ + if(!newCid.toLowerCase().startsWith("cid:")){ + newCid="cid:"+newCid; + } + addMimeHeader(HTTPConstants.HEADER_CONTENT_ID,newCid); + } + + /** + * Content ID. + */ + public String getContentId() { + String ret= getFirstMimeHeader(HTTPConstants.HEADER_CONTENT_ID); + //Do not let the contentID ever be empty. + if(ret == null){ + ret=SOAPUtils.getNewContentIdValue(); + addMimeHeader(HTTPConstants.HEADER_CONTENT_ID , ret); + } + ret= ret.trim(); + if(ret.length() ==0){ + ret=SOAPUtils.getNewContentIdValue(); + addMimeHeader(HTTPConstants.HEADER_CONTENT_ID , ret); + } + return ret; + } + + + /** + * Get all headers that match + */ + public java.util.Iterator getMatchingMimeHeaders( final String[] match){ + java.util.LinkedList retList= new java.util.LinkedList(); + if(null != match && 0 != match.length ){ + for(int i= match.length-1 ; i > -1 ; --i){ + if(match[i] != null){ + String key= match[i].toLowerCase(); + if(headers.containsKey(key)) + retList.add(match[i]); + } + } + } + return retList.iterator(); + } + + /** + * Get all headers that do not match + */ + public java.util.Iterator getNonMatchingMimeHeaders( final String[] match){ + java.util.LinkedList retList= new java.util.LinkedList(headers.keySet()); + if(null != match && 0 != match.length && !headers.isEmpty()){ + for(int i= match.length-1 ; i > -1 ; --i){ + if(match[i] != null){ + String remItem= match[i].toLowerCase(); + if(headers.containsKey(remItem)){ + retList.remove(remItem); + } + } + } + } + return retList.iterator(); + } + + /** + * Sets the content of the <CODE>SOAPEnvelope</CODE> object + * with the data from the given <CODE>Source</CODE> object. + * @param source javax.xml.transform.Source</CODE> object with the data to + * be set + * @throws SOAPException if there is a problem in + * setting the source + * @see #getContent() getContent() + */ + public void setContent(Source source) throws SOAPException { + //TODO: Flesh this out. + } + + /** + * Returns the content of the SOAPEnvelope as a JAXP <CODE> + * Source</CODE> object. + * @return the content as a <CODE> + * javax.xml.transform.Source</CODE> object + * @throws SOAPException if the implementation cannot + * convert the specified <CODE>Source</CODE> object + * @see #setContent(javax.xml.transform.Source) setContent(javax.xml.transform.Source) + */ + public Source getContent() throws SOAPException { + //TODO: Flesh this out. + return null; + } + + /** + * Retrieves all the headers for this <CODE>SOAPPart</CODE> + * object as an iterator over the <CODE>MimeHeader</CODE> + * objects. + * @return an <CODE>Iterator</CODE> object with all of the Mime + * headers for this <CODE>SOAPPart</CODE> object + */ + public Iterator getAllMimeHeaders() { + //TODO: Flesh this out. + return null; + } + + /** + * Changes the first header entry that matches the given + * header name so that its value is the given value, adding a + * new header with the given name and value if no existing + * header is a match. If there is a match, this method clears + * all existing values for the first header that matches and + * sets the given value instead. If more than one header has + * the given name, this method removes all of the matching + * headers after the first one. + * + * <P>Note that RFC822 headers can contain only US-ASCII + * characters.</P> + * @param name a <CODE>String</CODE> giving the + * header name for which to search + * @param value a <CODE>String</CODE> giving the + * value to be set. This value will be substituted for the + * current value(s) of the first header that is a match if + * there is one. If there is no match, this value will be + * the value for a new <CODE>MimeHeader</CODE> object. + * @ throws java.lang.IllegalArgumentException if + * there was a problem with the specified mime header name + * or value + * @see #getMimeHeader(java.lang.String) getMimeHeader(java.lang.String) + */ + public void setMimeHeader(String name, String value) { + //TODO: Flesh this out. + } + + /** + * Gets all the values of the <CODE>MimeHeader</CODE> object + * in this <CODE>SOAPPart</CODE> object that is identified by + * the given <CODE>String</CODE>. + * @param name the name of the header; example: + * "Content-Type" + * @return a <CODE>String</CODE> array giving all the values for + * the specified header + * @see #setMimeHeader(java.lang.String, java.lang.String) setMimeHeader(java.lang.String, java.lang.String) + */ + public String[] getMimeHeader(String name) { + //TODO: Flesh this out. + String[] strings = new String[1]; + strings[0] = getFirstMimeHeader(name); + return strings; + } + + /** + * Removes all the <CODE>MimeHeader</CODE> objects for this + * <CODE>SOAPEnvelope</CODE> object. + */ + public void removeAllMimeHeaders() { + //TODO: Flesh this out. + } + + /** + * Removes all MIME headers that match the given name. + * @param header a <CODE>String</CODE> giving + * the name of the MIME header(s) to be removed + */ + public void removeMimeHeader(String header) { + //TODO: Flesh this out. + } + + /** + * Gets the <CODE>SOAPEnvelope</CODE> object associated with + * this <CODE>SOAPPart</CODE> object. Once the SOAP envelope is + * obtained, it can be used to get its contents. + * @return the <CODE>SOAPEnvelope</CODE> object for this <CODE> + * SOAPPart</CODE> object + * @throws SOAPException if there is a SOAP error + */ + public javax.xml.soap.SOAPEnvelope getEnvelope() throws SOAPException { + //TODO: Flesh this out. + return null; + } } 1.1 xml-axis/java/src/org/apache/axis/utils/SOAPUtils.java Index: SOAPUtils.java =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Axis" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.axis.utils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.axis.SOAPPart; public class SOAPUtils { protected static Log log = LogFactory.getLog(SOAPUtils.class.getName()); static String thisHost = null; private static int count = (int) (Math.random() * 100); public static String getNewContentIdValue() { int lcount; synchronized (org.apache.axis.utils.SOAPUtils.class ) { lcount = ++count; } if (null == thisHost) { try { thisHost = java.net.InetAddress.getLocalHost().getHostName(); } catch (java.net.UnknownHostException e) { log.error(JavaUtils.getMessage("javaNetUnknownHostException00"), e); thisHost = "localhost"; } } StringBuffer s = new StringBuffer(); // Unique string is <hashcode>.<currentTime>.apache-soap.<hostname> s.append("cid:").append( lcount).append(s.hashCode()).append('.').append(System.currentTimeMillis()).append(".AXIS@").append(thisHost); return s.toString(); } }