001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package javax.mail;
021
022 import java.io.IOException;
023 import java.io.OutputStream;
024 import java.util.Vector;
025
026 /**
027 * A container for multiple {@link BodyPart BodyParts}.
028 *
029 * @version $Rev: 467553 $ $Date: 2006-10-25 00:01:51 -0400 (Wed, 25 Oct 2006) $
030 */
031 public abstract class Multipart {
032 /**
033 * Vector of sub-parts.
034 */
035 protected Vector parts = new Vector();
036
037 /**
038 * The content type of this multipart object; defaults to "multipart/mixed"
039 */
040 protected String contentType = "multipart/mixed";
041
042 /**
043 * The Part that contains this multipart.
044 */
045 protected Part parent;
046
047 protected Multipart() {
048 }
049
050 /**
051 * Initialize this multipart object from the supplied data source.
052 * This adds any {@link BodyPart BodyParts} into this object and initializes the content type.
053 *
054 * @param mds the data source
055 * @throws MessagingException
056 */
057 protected void setMultipartDataSource(MultipartDataSource mds) throws MessagingException {
058 parts.clear();
059 contentType = mds.getContentType();
060 int size = mds.getCount();
061 for (int i = 0; i < size; i++) {
062 parts.add(mds.getBodyPart(i));
063 }
064 }
065
066 /**
067 * Return the content type.
068 *
069 * @return the content type
070 */
071 public String getContentType() {
072 return contentType;
073 }
074
075 /**
076 * Return the number of enclosed parts
077 *
078 * @return the number of parts
079 * @throws MessagingException
080 */
081 public int getCount() throws MessagingException {
082 return parts.size();
083 }
084
085 /**
086 * Get the specified part; numbering starts at zero.
087 *
088 * @param index the part to get
089 * @return the part
090 * @throws MessagingException
091 */
092 public BodyPart getBodyPart(int index) throws MessagingException {
093 return (BodyPart) parts.get(index);
094 }
095
096 /**
097 * Remove the supplied part from the list.
098 *
099 * @param part the part to remove
100 * @return true if the part was removed
101 * @throws MessagingException
102 */
103 public boolean removeBodyPart(BodyPart part) throws MessagingException {
104 return parts.remove(part);
105 }
106
107 /**
108 * Remove the specified part; all others move down one
109 *
110 * @param index the part to remove
111 * @throws MessagingException
112 */
113 public void removeBodyPart(int index) throws MessagingException {
114 parts.remove(index);
115 }
116
117 /**
118 * Add a part to the end of the list.
119 *
120 * @param part the part to add
121 * @throws MessagingException
122 */
123 public void addBodyPart(BodyPart part) throws MessagingException {
124 parts.add(part);
125 }
126
127 /**
128 * Insert a part into the list at a designated point; all subsequent parts move down
129 *
130 * @param part the part to add
131 * @param pos the index of the new part
132 * @throws MessagingException
133 */
134 public void addBodyPart(BodyPart part, int pos) throws MessagingException {
135 parts.add(pos, part);
136 }
137
138 /**
139 * Encode and write this multipart to the supplied OutputStream; the encoding
140 * used is determined by the implementation.
141 *
142 * @param out the stream to write to
143 * @throws IOException
144 * @throws MessagingException
145 */
146 public abstract void writeTo(OutputStream out) throws IOException, MessagingException;
147
148 /**
149 * Return the Part containing this Multipart object or null if unknown.
150 *
151 * @return this Multipart's parent
152 */
153 public Part getParent() {
154 return parent;
155 }
156
157 /**
158 * Set the parent of this Multipart object
159 *
160 * @param part this object's parent
161 */
162 public void setParent(Part part) {
163 parent = part;
164 }
165
166 }