org.squale.jraf.provider.persistence.hibernate.BlobHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.squale.jraf.provider.persistence.hibernate.BlobHelper.java

Source

/**
 * Copyright (C) 2008-2010, Squale Project - http://www.squale.org
 *
 * This file is part of Squale.
 *
 * Squale is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or any later version.
 *
 * Squale is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with Squale.  If not, see <http://www.gnu.org/licenses/>.
 */
/*
 * Created on Oct 15, 2004
 */
package org.squale.jraf.provider.persistence.hibernate;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.hibernate.LockMode;
import org.hibernate.Session;
import oracle.sql.BLOB;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.hibernate.Session;

import org.squale.jraf.commons.exception.JrafEnterpriseException;
import org.squale.jraf.commons.exception.JrafPersistenceException;
import org.squale.jraf.spi.persistence.ISession;

/**
 * <p>Title : BlobHelper.java</p>
 * <p>Description : </p>
 * <p>Copyright : Copyright (c) 2004</p>
 * 
 */
public class BlobHelper {

    /** logger */
    private static final Log log = LogFactory.getLog(BlobHelper.class);

    /**
     * Creation d'un BLOB Oracle vide
     * @param s session de persistance
     * @param bo business object
     * @param property nom de la propriete
     * @return 
     * @throws JrafPersistenceException
     */
    private final static void createEmptyBlob(Session s, Object bo, String property)
            throws JrafPersistenceException {

        try {
            // on fixe le BLOB vide
            PropertyUtils.setProperty(bo, property, oracle.sql.BLOB.empty_lob());
            // on sauve le BO
            s.save(bo);
            s.flush();
            s.connection().commit();

        } catch (Exception e) {
            // on transforme l'exception
            log.error("Erreur lors de l'ecriture du BLOB vide", e);
            throw new JrafPersistenceException("Erreur lors de l'ecriture du BLOB vide", e);
        }
    }

    public final static void writeByte2BLOB(ISession session, Object bo, String property, byte[] bytes)
            throws JrafPersistenceException {

        // recuperation de la session hibernate
        Session hSession = ((SessionImpl) session).getSession();

        try {
            // ecriture du BLOB vide
            createEmptyBlob(hSession, bo, property);

            // refresh de l'objet
            hSession.refresh(bo, LockMode.UPGRADE);

            // recuperation du BLOB
            BLOB oracleBLOB = (BLOB) PropertyUtils.getProperty(bo, property);

            // ouverture du stream d'ecriture sur le BLOB
            OutputStream blobOutputStream = oracleBLOB.getBinaryOutputStream();

            blobOutputStream.write(bytes, 0, bytes.length);
            blobOutputStream.flush();
            blobOutputStream.close();
        } catch (Exception e) {
            log.error("Probleme lors de l'ecriture des donnees dans le BLOB", e);
            throw new JrafPersistenceException("Probleme lors de l'ecriture des donnees dans le BLOB", e);
        }

    }

    /**
     * Ecriture d'un fichier dans un BLOB
     * @param session session de persistance
     * @param bo business object
     * @param property propriete
     * @param file fichier
     * @throws JrafPersistenceException
     */
    public final static void writeFile2BLOB(ISession session, Object bo, String property, File file)
            throws JrafPersistenceException {

        // recuperation de la session hibernate
        Session hSession = ((SessionImpl) session).getSession();

        long fSize = file.length();
        byte[] buffer = null;

        try {
            // ecriture du BLOB vide
            createEmptyBlob(hSession, bo, property);

            // refresh de l'objet
            hSession.refresh(bo, LockMode.UPGRADE);

            // recuperation du BLOB
            BLOB oracleBLOB = (BLOB) PropertyUtils.getProperty(bo, property);

            // ouverture du stream d'ecriture sur le BLOB
            OutputStream blobOutputStream = oracleBLOB.getBinaryOutputStream();

            InputStream sampleFileStream = new FileInputStream(file);

            // cas tres gros fichier
            if (fSize > Integer.MAX_VALUE) {
                buffer = new byte[Integer.MAX_VALUE];
            } else {
                buffer = new byte[(int) file.length()];
            }

            int nread = 0;
            while ((nread = sampleFileStream.read(buffer)) != -1)
                blobOutputStream.write(buffer, 0, nread);
            sampleFileStream.close();
            blobOutputStream.flush();
            blobOutputStream.close();

        } catch (Exception e) {
            log.error("Probleme lors de l'ecriture des donnees dans le BLOB", e);
            throw new JrafPersistenceException("Probleme lors de l'ecriture des donnees dans le BLOB", e);
        }

    }

    public final static byte[] readByteFromBlob(ISession session, Object bo, String property)
            throws JrafPersistenceException {
        BLOB oracleBLOB = null;
        byte[] bytes = null;
        try {
            oracleBLOB = (BLOB) PropertyUtils.getProperty(bo, property);
            long bSize = oracleBLOB.length();
            // cas tres gros fichier
            if (bSize > Integer.MAX_VALUE) {
                bytes = new byte[Integer.MAX_VALUE];
            } else {
                bytes = new byte[(int) bSize];
            }
            long lon = 0;
            InputStream in = oracleBLOB.getBinaryStream();
            lon = in.read(bytes);
            in.close();

        } catch (Exception e) {
            log.error("Probleme lors de la lecture des donnees d'un BLOB", e);
            throw new JrafPersistenceException("Probleme lors de la lecture des donnees d'un BLOB", e);
        }
        return bytes;
    }

    /**
     * Utilitaire pour transformer des fichiers en byte(]
     * @param file Fichier a lire
     * @return fichier sous forme de byte[]
     * @throws JrafEnterpriseException dans le cas ou le fichier est trop gros ou fichier manquant.
     */
    static public byte[] fileToByte(File file) throws JrafEnterpriseException {
        byte[] buffer = null;
        long fSize = file.length();

        // cas tres gros fichier
        if (fSize > Integer.MAX_VALUE) {
            throw new JrafEnterpriseException("File too long");
        } else {
            buffer = new byte[(int) fSize];
        }
        try {
            (new FileInputStream(file)).read(buffer);
        } catch (FileNotFoundException e) {
            throw new JrafEnterpriseException(e);
        } catch (IOException e) {
            throw new JrafEnterpriseException(e);
        }

        return buffer;

    }

}