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