Package cn.edu.zju.acm.onlinejudge.persistence.sql

Source Code of cn.edu.zju.acm.onlinejudge.persistence.sql.ConfigurationPersistenceImpl

/*
* Copyright 2007 Zhang, Zheng <oldbig@gmail.com>
*
* This file is part of ZOJ.
*
* ZOJ is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either revision 3 of the License, or (at your option) any later revision.
*
* ZOJ 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 General Public License along with ZOJ. if not, see
* <http://www.gnu.org/licenses/>.
*/

package cn.edu.zju.acm.onlinejudge.persistence.sql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import cn.edu.zju.acm.onlinejudge.bean.Configuration;
import cn.edu.zju.acm.onlinejudge.persistence.ConfigurationPersistence;
import cn.edu.zju.acm.onlinejudge.persistence.PersistenceException;

/**
* <p>
* ConfigurationPersistenceImpl implements ConfigurationPersistence interface
* </p>
* <p>
* ConfigurationPersistence interface defines the API used to load and store Configurations from the persistence layer.
* </p>
*
* @version 2.0
* @author Zhang, Zheng
*/
public class ConfigurationPersistenceImpl implements ConfigurationPersistence {

    /**
     * The query to get all configurations.
     */
    private static final String GET_ALL_CONFIGURATIONS = "SELECT * FROM configuration";

    /**
     * The query to get configuration names.
     */
    private static final String GET_CONFIGURATION_NAMES = "SELECT name FROM configuration WHERE name IN ";

    /**
     * The query to insert a configuration.
     */
    private static final String INSERT_CONFIGURATION =
            "INSERT INTO configuration (name, value, description, create_user, create_date, "
                + "last_update_user, last_update_date) VALUES (?, ?, ?, ?, ?, ?, ?)";

    /**
     * The query to insert a configuration.
     */
    private static final String UPDATE_CONFIGURATION =
            "UPDATE configuration SET value=?, description=?, last_update_user=?, last_update_date=? WHERE name=?";

    /**
     * <p>
     * Returns a list of Configuration instances retrieved from persistence layer.
     * </p>
     *
     * @return a list of Configuration instances retrieved from persistence layer.
     * @throws PersistenceException
     *             wrapping a persistence implementation specific exception
     */
    public List<Configuration> getConfigurations() throws PersistenceException {
        Connection conn = null;
        try {
            conn = Database.createConnection();
            PreparedStatement ps = null;
            try {
                ps = conn.prepareStatement(ConfigurationPersistenceImpl.GET_ALL_CONFIGURATIONS);
                ResultSet rs = ps.executeQuery();
                List<Configuration> configurations = new ArrayList<Configuration>();
                while (rs.next()) {
                    Configuration configuration = new Configuration();
                    configuration.setName(rs.getString(DatabaseConstants.CONFIGURATION_NAME));
                    configuration.setValue(rs.getString(DatabaseConstants.CONFIGURATION_VALUE));
                    configuration.setDescription(rs.getString(DatabaseConstants.CONFIGURATION_DESCRIPTION));
                    configurations.add(configuration);
                }
                return configurations;
            } finally {
                Database.dispose(ps);
            }
        } catch (SQLException e) {
            throw new PersistenceException("Error.", e);
        } finally {
            Database.dispose(conn);
        }
    }

    /**
     * <p>
     * Stores the given list of Configuration instances to persistence layer.
     * </p>
     *
     * @param configurations
     *            a list of Configuration instances to store
     * @param user
     *            the id of the user who made this modification.
     * @throws PersistenceException
     *             wrapping a persistence implementation specific exception
     * @throws NullPointerException
     *             if configurations is null
     * @throws IllegalArgumentException
     *             if configurations contains invalid or duplicate element
     */
    public void setConfigurations(List<Configuration> configurations, long user) throws PersistenceException {
        if (configurations.size() == 0) {
            return;
        }
        Set<String> nameSet = new HashSet<String>();
        for (Configuration configuration : configurations) {
            String name = configuration.getName();
            if (!nameSet.add(name)) {
                throw new IllegalArgumentException("configurations contains duplicate element");
            }
        }

        Connection conn = null;
        try {
            conn = Database.createConnection();
            conn.setAutoCommit(false);
            PreparedStatement ps = null;
            Set<String> existingConfigurations = new HashSet<String>();
            try {
                // get existing configurations
                ps =
                        conn.prepareStatement(ConfigurationPersistenceImpl.GET_CONFIGURATION_NAMES +
                            Database.createValues(nameSet));
                ResultSet rs = ps.executeQuery();
                while (rs.next()) {
                    existingConfigurations.add(rs.getString(DatabaseConstants.CONFIGURATION_NAME));
                }
            } finally {
                Database.dispose(ps);
            }
            // update
            for (Configuration configuration : configurations) {
                try {
                    if (existingConfigurations.contains(configuration.getName())) {
                        ps = conn.prepareStatement(ConfigurationPersistenceImpl.UPDATE_CONFIGURATION);
                        ps.setString(5, configuration.getName());
                        ps.setString(1, configuration.getValue());
                        ps.setString(2, configuration.getDescription());
                        ps.setLong(3, user);
                        ps.setTimestamp(4, new Timestamp(new Date().getTime()));
                    } else {
                        ps = conn.prepareStatement(ConfigurationPersistenceImpl.INSERT_CONFIGURATION);
                        ps.setString(1, configuration.getName());
                        ps.setString(2, configuration.getValue());
                        ps.setString(3, configuration.getDescription());
                        ps.setLong(4, user);
                        ps.setTimestamp(5, new Timestamp(new Date().getTime()));
                        ps.setLong(6, user);
                        ps.setTimestamp(7, new Timestamp(new Date().getTime()));
                    }
                    ps.executeUpdate();
                } finally {
                    Database.dispose(ps);
                }
            }
            conn.commit();
        } catch (SQLException e) {
            Database.rollback(conn);
            throw new PersistenceException("Error.", e);
        } finally {
            Database.dispose(conn);
        }
    }

}
TOP

Related Classes of cn.edu.zju.acm.onlinejudge.persistence.sql.ConfigurationPersistenceImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.