All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.axiom.attachments.PartContentOnFile Maven / Gradle / Ivy

There is a newer version: 1.4.0
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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 org.apache.axiom.attachments.impl.BufferUtils;
import org.apache.axiom.attachments.lifecycle.LifecycleManager;
import org.apache.axiom.attachments.lifecycle.impl.FileAccessor;

import javax.activation.DataSource;
import javax.mail.MessagingException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * Stores the content of a MIME part in a file. This implementation is used for very large
 * attachments to reduce the in-memory footprint.
 * 
 * @see PartContentFactory
 */
class PartContentOnFile extends PartContent {
    private final FileAccessor fileAccessor;
    private final LifecycleManager manager;
    
    /**
     * Constructor.
     * 
     * @param manager
     *            the lifecycle manager that will be used for managing temporary files created by
     *            this instance
     * @param in1
     *            InputStream containing data
     * @param in2
     *            InputStream containing data
     * @param attachmentDir
     *            the file system location where temporary files are created; this value will be
     *            used in calls to {@link LifecycleManager#create(String)}
     */
    PartContentOnFile(LifecycleManager manager, InputStream is1, InputStream is2, String attachmentDir) throws IOException {
        this.manager = manager;
        fileAccessor = manager.create(attachmentDir);
        
        // Now write the data to the backing file
        OutputStream fos = fileAccessor.getOutputStream();
        BufferUtils.inputStream2OutputStream(is1, fos);
        BufferUtils.inputStream2OutputStream(is2, fos);
        fos.flush();
        fos.close();
        
    }

    InputStream getInputStream() throws IOException {
        try {
            return fileAccessor.getInputStream();
        } catch (MessagingException ex) {
            // The FileAccessor API uses MessagingException, although we no longer use javax.mail.
            // Convert the exception to an IOException to keep the attachments API clean.
            IOException ex2 = new IOException(ex.getMessage());
            ex2.setStackTrace(ex.getStackTrace());
            throw ex2;
        }
    }
    
    DataSource getDataSource(String contentType) {
        // The attachment cleanup code in Axis2 relies on the assumption that we
        // produce a CachedFileDataSource here.
        CachedFileDataSource ds = new CachedFileDataSource(fileAccessor.getFile());
        ds.setContentType(contentType);
        return ds;
    }

    void writeTo(OutputStream out) throws IOException {
        InputStream in = getInputStream();
        try {
            BufferUtils.inputStream2OutputStream(in, out);
        } finally {
            in.close();
        }
    }

    long getSize() {
        return fileAccessor.getSize();
    }

    void destroy() throws IOException {
        manager.delete(fileAccessor.getFile());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy