org.eurekastreams.server.service.actions.strategies.ImageWriter.java Source code

Java tutorial

Introduction

Here is the source code for org.eurekastreams.server.service.actions.strategies.ImageWriter.java

Source

/*
 * Copyright (c) 2009-2010 Lockheed Martin Corporation
 *
 * 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.eurekastreams.server.service.actions.strategies;

import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eurekastreams.server.domain.Image;
import org.eurekastreams.server.persistence.mappers.InsertMapper;
import org.eurekastreams.server.persistence.mappers.UpdateMapper;
import org.eurekastreams.server.persistence.mappers.db.DeleteImage;
import org.eurekastreams.server.persistence.mappers.db.GetImageByIdentifier;
import org.eurekastreams.server.persistence.mappers.requests.PersistenceRequest;

/**
 * Writes and reads (misnomer?) to the disk for images. Could be interfaced and replaced with something that reads and
 * writes to a DB.
 *
 */
public class ImageWriter {
    /**
     * The logger.
     */
    private Log log = LogFactory.getLog(ImageWriter.class);

    /**
     * Insert Mapper.
     */
    private InsertMapper<Image> insertMapper;
    /**
     * Update Mapper.
     */
    private UpdateMapper<Image> updateMapper;
    /**
     * Delete Mapper.
     */
    private DeleteImage deleteMapper;
    /**
     * Get Mapper.
     */
    private GetImageByIdentifier getMapper;

    /**
     * Constructor.
     * @param inInsertMapper insert mapper.
     * @param inUpdateMapper update mapper.
     * @param inDeleteMapper delete mapper.
     * @param inGetMapper get mapper.
     */
    public ImageWriter(final InsertMapper<Image> inInsertMapper, final UpdateMapper<Image> inUpdateMapper,
            final DeleteImage inDeleteMapper, final GetImageByIdentifier inGetMapper) {
        insertMapper = inInsertMapper;
        updateMapper = inUpdateMapper;
        deleteMapper = inDeleteMapper;
        getMapper = inGetMapper;
    }

    /**
     * Writers a rendered image to the disk.
     *
     * @param image
     *            The image to write.
     * @param identifier
     *            The path to write it too.
     * @throws Exception
     *             in case something evil happens.
     */
    public void write(final RenderedImage image, final String identifier) throws Exception {
        try {
            Image imageInDb = getMapper.execute(identifier);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(image, "png", baos);

            if (imageInDb == null) {
                insertMapper.execute(new PersistenceRequest<Image>(new Image(identifier, baos.toByteArray())));
            } else {
                imageInDb.setImageBlob(baos.toByteArray());
                updateMapper.execute(new PersistenceRequest<Image>(imageInDb));
            }
        } catch (Exception ex) {
            log.error("Error writing file to database: " + identifier, ex);
        }
    }

    /**
     * Writes an uploaded file to the disk.
     *
     * @param fileItem
     *            The file to write.
     * @param identifier
     *            The path to write it too.
     * @throws Exception
     *             again, the evil.
     */
    public void write(final FileItem fileItem, final String identifier) throws Exception {
        Image imageInDb = getMapper.execute(identifier);

        if (imageInDb == null) {
            insertMapper.execute(new PersistenceRequest<Image>(new Image(identifier, fileItem.get())));
        } else {
            imageInDb.setImageBlob(fileItem.get());
            updateMapper.execute(new PersistenceRequest<Image>(imageInDb));
        }

    }

    /**
     * Deletes a file at a resource.
     *
     * @param identifier
     *            the path to delete the file from.
     */
    public void delete(final String identifier) {
        deleteMapper.execute(identifier);
    }

    /**
     * Renames a file.
     *
     * @param orig
     *            the path to rename from.
     * @param newIdentifier
     *            the path to rename to.
     */
    public void rename(final String orig, final String newIdentifier) {
        Image image = getMapper.execute(orig);
        image.setImageIdentifier(newIdentifier);
        updateMapper.execute(new PersistenceRequest<Image>(image));
    }

    /**
     * Read a file into a rendered image.
     *
     * @param identifier
     *            the path to read from.
     * @return the rendered image.
     * @throws IOException
     *             evil IO error.
     */
    public RenderedImage read(final String identifier) throws IOException {
        try {
            Image image = getMapper.execute(identifier);
            ByteArrayInputStream baos = new ByteArrayInputStream(image.getImageBlob());
            return ImageIO.read(baos);
        } catch (Exception ex) {
            log.error("Error reading file from disk: " + identifier, ex);
            return null;
        }
    }

    /**
     * Get an Image from a File.
     * @param file the file.
     * @return the image.
     * @throws IOException an IO exception.
     */
    public BufferedImage getImageFromFile(final FileItem file) throws IOException {
        ByteArrayInputStream baos = new ByteArrayInputStream(file.get());
        return ImageIO.read(baos);
    }
}