org.ralasafe.entitle.BackupManagerImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.ralasafe.entitle.BackupManagerImpl.java

Source

/**
 * Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com
 * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
 */
package org.ralasafe.entitle;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Random;
import java.util.SortedSet;
import java.util.TreeSet;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.ralasafe.EntityExistException;
import org.ralasafe.RalasafeException;
import org.ralasafe.SystemConstant;
import org.ralasafe.db.DBLevelException;
import org.ralasafe.db.DBPower;
import org.ralasafe.db.JavaBeanColumnAdapter;
import org.ralasafe.db.JavaBeanObjectNewer;
import org.ralasafe.db.SelectCondition;
import org.ralasafe.db.Table;
import org.ralasafe.db.TableNewer;
import org.ralasafe.db.impl.TableDeletorImpl;
import org.ralasafe.db.impl.TableSaverImpl;
import org.ralasafe.db.impl.TableSelectorImpl;
import org.ralasafe.db.impl.TableUpdatorImpl;
import org.ralasafe.util.DBUtil;
import org.ralasafe.util.ZipUtil;

public class BackupManagerImpl implements BackupManager {
    private static Log log = LogFactory.getLog(BackupManagerImpl.class);
    //   private static final String BACKUP_TABLE = "backup";
    private static String UPDATE_CONTENT_SQL;
    private static String SELECT_CONTENT_SQL;

    //   private String appName;
    private Table table;
    private TableSelectorImpl selector;
    private TableSaverImpl saver;
    private TableUpdatorImpl updator;
    private TableDeletorImpl deleter;
    private Comparator comp;

    public BackupManagerImpl() {
        String appName = "Ralasafe";
        UPDATE_CONTENT_SQL = "UPDATE " + appName + "_backup" + " SET content=? WHERE id=? ";
        SELECT_CONTENT_SQL = "SELECT content from " + appName + "_backup" + " WHERE id=? ";

        TableNewer tableNewer = new TableNewer();
        tableNewer.setTableName(appName + "_backup");
        tableNewer.setColumnNames(new String[] { "id", "description", "createTime" });
        tableNewer.setIdColumnNames(new String[] { "id" });
        tableNewer.setMappingClass(Backup.class.getName());
        tableNewer.put("id", new JavaBeanColumnAdapter("id", "int"));
        tableNewer.put("description", new JavaBeanColumnAdapter("description", "java.lang.String"));
        tableNewer.put("createTime", new JavaBeanColumnAdapter("createTime", "java.util.Date"));
        tableNewer.setId(DBPower.getTableId(null, tableNewer.getTableName()));
        table = tableNewer.getTable();
        selector = new TableSelectorImpl();
        selector.setObjectNewer(new JavaBeanObjectNewer(tableNewer.getMappingClass()));
        saver = new TableSaverImpl();
        updator = new TableUpdatorImpl();
        deleter = new TableDeletorImpl();
        selector.setTable(table);
        saver.setTable(table);
        updator.setTable(table);
        deleter.setTable(table);
        comp = new Comparator() {
            public int compare(Object o1, Object o2) {
                Backup q1 = (Backup) o1;
                Backup q2 = (Backup) o2;
                return q2.getCreateTime().compareTo(q1.getCreateTime());
            }
        };
    }

    public Backup addBackup(Backup backup) throws EntityExistException {
        backup.setId(newBackupId());
        Connection conn = null;
        try {
            conn = DBPower.getConnection(table.getId());
            conn.setAutoCommit(false);
            backup.setCreateTime(new Date());
            saver.save(conn, backup);
            importBackup(conn, backup);
            conn.commit();
        } catch (SQLException e) {
            log.error("", e);
            try {
                conn.rollback();
            } catch (SQLException e1) {
                log.error("", e1);
                throw new RalasafeException(e1);
            }
        } finally {
            DBUtil.close(conn);
        }

        return backup;
    }

    private void importBackup(Connection conn, Backup backup) throws DBLevelException {
        PreparedStatement pstmt = null;
        try {
            // create tmp zip
            String tempZip = SystemConstant.getRepositoryDir() + new Random().nextLong() + ".zip";
            String xmlDir = SystemConstant.getRepositoryDir() + "ralasafe";
            ZipUtil.zip(tempZip, xmlDir);

            // update clob
            File zipFile = new File(tempZip);
            InputStream zipIn = new FileInputStream(zipFile);
            pstmt = conn.prepareStatement(UPDATE_CONTENT_SQL);
            pstmt.setBinaryStream(1, zipIn, (int) zipFile.length());
            pstmt.setInt(2, backup.getId());
            pstmt.executeUpdate();
            zipIn.close();

            // delete tmp zip
            zipFile.delete();

        } catch (Exception e) {
            log.error("", e);
            throw new RalasafeException(e);
        } finally {
            DBUtil.close(pstmt);
        }
    }

    public void updateBackup(Backup backup) {
        try {
            Backup old = getBackup(backup.getId());
            old.setDescription(backup.getDescription());
            backup = old;
            updator.updateByIdColumns(backup);
        } catch (EntityExistException e) {
            log.error("", e);
            throw new RalasafeException(e);
        }
    }

    public Collection getBackups() {
        Collection backups = selector.select(new SelectCondition(), null);
        SortedSet result = Collections.synchronizedSortedSet(new TreeSet(comp));
        result.addAll(backups);
        return result;
    }

    public void exportBackup(int id, OutputStream out) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = DBPower.getConnection(table.getId());
            conn.setAutoCommit(false);
            pstmt = conn.prepareStatement(SELECT_CONTENT_SQL);
            pstmt.setInt(1, id);
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                Blob blob = rs.getBlob(1);
                InputStream in = blob.getBinaryStream();
                byte[] buf = new byte[1024];
                int len = 0;
                while ((len = in.read(buf)) != -1) {
                    out.write(buf, 0, len);
                }
                in.close();
            }
            conn.commit();
        } catch (Exception e) {
            log.error("", e);
        } finally {
            DBUtil.close(pstmt, conn);
        }
    }

    private int newBackupId() {
        try {
            int id = DBUtil.getSequenceNextVal(table, "id");

            while (id <= 0) {
                id = DBUtil.getSequenceNextVal(table, "id");
            }
            return id;
        } catch (SQLException e) {
            log.error("", e);
            throw new DBLevelException(e);
        }
    }

    public Backup getBackup(int id) {
        Backup backup = new Backup();
        backup.setId(id);
        return (Backup) selector.selectByIdColumns(backup);
    }
}