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

org.duracloud.client.util.DuracloudFileWriter Maven / Gradle / Ivy

There is a newer version: 8.1.0
Show newest version
/*
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 *     http://duracloud.org/license/
 */
package org.duracloud.client.util;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.MessageFormat;

import org.duracloud.client.ContentStore;
import org.duracloud.common.error.DuraCloudRuntimeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * This class encapsulates writing a simple text file and saving it as a content
 * item.
 *
 * @author Danny Bernstein
 * Date: Jan 4, 2011
 */
public class DuracloudFileWriter extends Writer {
    private static Logger log = LoggerFactory.getLogger(DuracloudFileWriter.class);
    private String contentId;
    private String spaceId;
    private String storeId;
    private String mimetype;
    private ContentStoreUtil contentStoreUtil;

    private File tempFile;
    private Writer writer;

    /**
     * @param spaceId      of the space in which you would like to persist the text.
     * @param contentId    of the item you would like to store the text in.
     * @param contentStore to which you would like write the stream.
     * @throws DuraCloudRuntimeException
     */
    public DuracloudFileWriter(String spaceId,
                               String contentId,
                               String mimetype,
                               ContentStore contentStore) throws DuraCloudRuntimeException {
        throwIllegalArgumentExceptionIfNull(spaceId, "spaceId");
        throwIllegalArgumentExceptionIfNull(spaceId, "contentId");
        throwIllegalArgumentExceptionIfNull(mimetype, "mimetype");
        throwIllegalArgumentExceptionIfNull(contentStore, "contentStore");
        try {
            this.contentId = contentId;
            this.spaceId = spaceId;
            this.mimetype = mimetype;
            this.tempFile = File.createTempFile("dc-content-item-writer", null);
            this.contentStoreUtil = new ContentStoreUtil(contentStore);
            this.storeId = contentStore.getStoreId();
            this.writer = new FileWriter(tempFile);
        } catch (IOException e) {
            log.error("constructor failed", e);
            throw new DuraCloudRuntimeException(e);
        }

    }

    private void throwIllegalArgumentExceptionIfNull(Object value,
                                                     String varName) {
        if (value == null) {
            throw new IllegalArgumentException(MessageFormat.format("{0} must not be null", new Object[] {varName}));
        }
    }

    /**
     * Writes the tempfile to durastore.
     */
    @Override
    public void flush() throws IOException {
        checkWriter();
        writer.flush();
        try {
            contentStoreUtil.storeContentStream(tempFile,
                                                spaceId,
                                                contentId,
                                                mimetype);
        } catch (DuraCloudRuntimeException ex) {
            throw new IOException("flush failed: " + ex.getMessage(), ex);
        }
    }

    private void checkWriter() throws IOException {
        if (writer == null) {
            throw new IOException("write has been closed");
        }
    }

    @Override
    public void close() throws IOException {
        checkWriter();
        writer.close();
        try {
            contentStoreUtil.storeContentStream(tempFile, spaceId, contentId, mimetype);
        } catch (DuraCloudRuntimeException ex) {
            String msg =
                MessageFormat.format("failed to save file ( contentId={}, spaceId={}, storeId={}, mimetype={} )",
                                     new Object[] {
                                         contentId,
                                         spaceId,
                                         storeId,
                                         mimetype});
            log.error(msg, ex);
            throw new IOException(msg, ex);
        } finally {
            this.tempFile.delete();
            this.tempFile = null;
            this.writer = null;
        }
    }

    /**
     * Same as write but appends a new line to the end of the supplied line.
     *
     * @param line
     * @throws DuraCloudRuntimeException
     */
    public void writeLine(String line) throws IOException {
        write(line + "\n");
    }

    @Override
    public void write(String line) throws IOException {
        if (writer == null) {
            throw new IOException("The writer has already been closed.");
        }

        writer.write(line);
    }

    @Override
    protected void finalize() throws Throwable {
        if (this.tempFile != null) {
            this.tempFile.delete();
        }

        super.finalize();

    }

    @Override
    public void write(char[] cbuf, int off, int len) throws IOException {
        writer.write(cbuf, off, len);
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy