/*
 * 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
 *
 * 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.
 */

package org.apache.axiom.attachments;

import java.io.IOException;
import java.util.Enumeration;

import javax.mail.Header;
import javax.mail.MessagingException;
import javax.mail.internet.InternetHeaders;

import org.apache.axiom.om.OMException;
/**
 * The MultipartAttachmentStreams class is used to create
 * IncomingAttachmentInputStream objects when the HTTP stream shows a marked
 * separation between the SOAP and each attachment parts. Unlike the DIME
 * version, this class will use the BoundaryDelimitedStream to parse data in the
 * SwA format. Another difference between the two is that the
 * MultipartAttachmentStreams class must also provide a way to hold attachment
 * parts parsed prior to where the SOAP part appears in the HTTP stream (i.e.
 * the root part of the multipart-related message). Our DIME counterpart didn't
 * have to worry about this since the SOAP part is guaranteed to be the first in
 * the stream. But since SwA has no such guarantee, we must fall back to caching
 * these first parts. Afterwards, we can stream the rest of the attachments that
 * are after the SOAP part of the request message.
 */
public final class MultipartAttachmentStreams extends IncomingAttachmentStreams {
    private BoundaryDelimitedStream _delimitedStream = null;

    public MultipartAttachmentStreams(BoundaryDelimitedStream delimitedStream)
            throws OMException {
    	this._delimitedStream = delimitedStream;
    }

    /**
     * 
     * @see org.apache.axis.attachments.IncomingAttachmentStreams#getNextStream()
     */
    public IncomingAttachmentInputStream getNextStream() throws OMException {
    	IncomingAttachmentInputStream stream;
    	
    	if (!isReadyToGetNextStream()) {
    		throw new IllegalStateException("nextStreamNotReady");
    	}
    	
    	InternetHeaders headers;
    	
    	try {
    		_delimitedStream = _delimitedStream.getNextStream();
    		if (_delimitedStream == null) {
    			return null;
    		}
    		
        	headers = new InternetHeaders(_delimitedStream);

    	} catch (IOException ioe) {
    		ioe.printStackTrace();
    		throw new OMException(ioe);
    	} catch (MessagingException me) {
    		me.printStackTrace();
    		throw new OMException(me);
    	}

    	stream = new IncomingAttachmentInputStream(_delimitedStream, this);
    	
    	Header header;
    	String name;
    	String value;
    	Enumeration e = headers.getAllHeaders();
    	while (e != null && e.hasMoreElements()) {
    		header = (Header) e.nextElement();
    		name = header.getName().toLowerCase();
    		value = header.getValue();
    		if (IncomingAttachmentInputStream.HEADER_CONTENT_ID.equals(name)
    				|| IncomingAttachmentInputStream.HEADER_CONTENT_TYPE.equals(name)
    				|| IncomingAttachmentInputStream.HEADER_CONTENT_LOCATION.equals(name)) {
    			value = value.trim();
    		}
    		stream.addHeader(name, value);
    	}

    	setReadyToGetNextStream(false);
    	return stream;
    }
}
