com.alkacon.opencms.counter.CmsCounterManager.java Source code

Java tutorial

Introduction

Here is the source code for com.alkacon.opencms.counter.CmsCounterManager.java

Source

/*
 * File   : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.counter/src/com/alkacon/opencms/counter/CmsCounterManager.java,v $
 * Date   : $Date: 2009/06/18 17:26:12 $
 * Version: $Revision: 1.2 $
 *
 * This library is part of OpenCms -
 * the Open Source Content Mananagement System
 *
 * Copyright (C) 2005 Alkacon Software GmbH (http://www.alkacon.com)
 *
 * This library 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 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * For further information about Alkacon Software GmbH, please see the
 * company website: http://www.alkacon.com
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package com.alkacon.opencms.counter;

import com.alkacon.opencms.util.CmsDbUtil;

import org.opencms.configuration.CmsConfigurationManager;
import org.opencms.file.CmsObject;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.CmsRuntimeException;
import org.opencms.module.A_CmsModuleAction;
import org.opencms.module.CmsModule;
import org.opencms.util.CmsStringUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;

import org.apache.commons.logging.Log;

/**
 * This is a helper class that provides methods used for the table counter in the database.<p>
 * 
 * @author Anja Roettgers
 * 
 * @version $Revision: 1.2 $
 * 
 * @since 7.0.3
 */
public class CmsCounterManager extends A_CmsModuleAction {

    /** Constant for the module name. */
    public static final String MODULE_NAME = "com.alkacon.opencms.counter";

    /** Query to check if the table exists in the database. */
    private static final String C_CHECK_DB = "SELECT count(*) FROM CMS_COUNTER_MODULES";

    /** the name of the table of counters in the database.*/
    private static final String C_COUNTER_TABLE = "CMS_COUNTER_MODULES";

    /** Query to insert a new entry in the counter table.*/
    private static final String C_CREATE_COUNTER_ENTRY = "INSERT INTO " + C_COUNTER_TABLE
            + " (COUNTER_KEY, COUNTER_COUNT) VALUES(?,?)";

    /** Query to create the counter table in the database.*/
    private static final String C_CREATE_TABLE = "CREATE TABLE " + C_COUNTER_TABLE + " ("
            + "  COUNTER_KEY varchar(255) default NULL," + "  COUNTER_COUNT int default NULL" + ") ";

    /** Query to update a counter entry.*/
    private static final String C_DELETE_COUNTER_ENTRY = "DELETE FROM " + C_COUNTER_TABLE + " WHERE COUNTER_KEY= ?";

    /** Query to get a counter entry.*/
    private static final String C_GET_COUNTER_ENTRY = "SELECT COUNTER_COUNT FROM " + C_COUNTER_TABLE
            + " WHERE COUNTER_KEY = ?";

    /** Query to get all counter entries from the database.*/
    private static final String C_GET_COUNTERS = "SELECT * FROM " + C_COUNTER_TABLE;

    /** Query to update a counter entry from the database.*/
    private static final String C_UPDATE_COUNTER_ENTRY = "UPDATE " + C_COUNTER_TABLE
            + " SET COUNTER_COUNT=? WHERE COUNTER_KEY = ?";

    /** The log object for this class. */
    private static final Log LOG = CmsLog.getLog(CmsCounterManager.class);

    /** The connection pool id. */
    private String m_connectionPool;

    /**
     * default constructor.<p>
     */
    public CmsCounterManager() {

        // NOOP
    }

    /**
     * This function deletes a counter entry in the database.<p>
     * 
     * @param entryKey the counter entry which should be deleted
     * 
     * @return <code>true</code> if successfully deleting otherwise <code>false</code>
     * 
     * @throws CmsException if an error occurred
     */
    public boolean deleteCounter(String entryKey) throws CmsException {

        boolean result = false;
        Connection con = null;
        PreparedStatement statement = null;

        // check if the parameters are empty
        if (CmsStringUtil.isEmptyOrWhitespaceOnly(entryKey)) {
            return result;
        }

        try {
            // get connection and execute the delete query
            con = CmsDbUtil.getInstance().getConnection(m_connectionPool);
            statement = con.prepareStatement(C_DELETE_COUNTER_ENTRY);
            statement.setString(1, entryKey);
            result = statement.execute();

        } catch (SQLException ex) {
            if (LOG.isErrorEnabled()) {
                LOG.error(Messages.get().getBundle().key(Messages.LOG_ERROR_ACCESSING_DB_1, C_COUNTER_TABLE), ex);
            }
            throw new CmsException(Messages.get().container(Messages.LOG_ERROR_DELETE_COUNTER_1, entryKey));
        } finally {
            CmsDbUtil.getInstance().closeConnection(null, statement, con);
        }
        return result;
    }

    /**
     * This function returns the value of the counter entry.<p> 
     * 
     * @param entryKey the id of the counter entry
     * 
     * @return return the value of the counter entry otherwise <code>null</code> if nothing is found or an exception occurred
     */
    public Integer getCounter(String entryKey) {

        Integer result = null;
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet res = null;

        // check if the parameters are empty
        if (CmsStringUtil.isEmptyOrWhitespaceOnly(entryKey)) {
            return result;
        }

        try {
            // get the connection and create the statement
            con = CmsDbUtil.getInstance().getConnection(m_connectionPool);
            statement = con.prepareStatement(C_GET_COUNTER_ENTRY);
            statement.setString(1, entryKey);

            // execute the query and return the value of the entry
            res = statement.executeQuery();
            if (res.next()) {
                result = new Integer(res.getInt(1));
            }

            // make a log entry
            if (LOG.isDebugEnabled()) {
                LOG.debug(Messages.get().getBundle().key(Messages.LOG_DEBUG_GET_COUNTER_2, entryKey, result));
            }

        } catch (Exception ex) {
            if (LOG.isErrorEnabled()) {
                LOG.error(Messages.get().getBundle().key(Messages.LOG_ERROR_ACCESSING_DB_1, C_COUNTER_TABLE), ex);
            }
        } finally {
            CmsDbUtil.getInstance().closeConnection(res, statement, con);
        }
        return result;
    }

    /** 
     * This functions returns all counter entries from the database.<p>
     * 
     * @return a Map of all counter entries with id as key and {@link Integer} as value
     */
    public TreeMap getCounters() {

        TreeMap result = new TreeMap();
        PreparedStatement statement = null;
        Connection con = null;
        ResultSet res = null;
        try {

            // get connection and set the statements
            con = CmsDbUtil.getInstance().getConnection(m_connectionPool);
            statement = con.prepareStatement(C_GET_COUNTERS);
            res = statement.executeQuery();

            // the query result is parsing into key and value
            String key;
            int value;
            while (res.next()) {
                key = res.getString(1);
                value = res.getInt(2);
                result.put(key, new Integer(value));
            }

        } catch (Exception ex) {
            if (LOG.isErrorEnabled()) {
                LOG.error(Messages.get().getBundle().key(Messages.LOG_ERROR_ACCESSING_DB_1, C_COUNTER_TABLE), ex);
            }
        } finally {
            CmsDbUtil.getInstance().closeConnection(res, statement, con);
        }
        return result;
    }

    /**
     * Returns the count value of the counter entry incremented. <p>
     * 
     * Important: the incremented value is saved in the database.<p>
     * 
     * @param entryKey the id of the counter entry
     * 
     * @return return the incremented value of the counter entry otherwise it returns <code>1</code>
     * 
     * @throws CmsException if an exception occurred
     */
    public int incrementCounter(String entryKey) throws CmsException {

        int result = 0;
        Integer value = getCounter(entryKey);
        if (value != null) {
            result = value.intValue();
        }
        result++;
        setCounter(entryKey, result);
        return result;
    }

    /**
     * @see org.opencms.module.I_CmsModuleAction#initialize(org.opencms.file.CmsObject, CmsConfigurationManager, CmsModule)
     */
    public void initialize(CmsObject adminCms, CmsConfigurationManager configurationManager, CmsModule module) {

        super.initialize(adminCms, configurationManager, module);

        try {
            m_connectionPool = CmsDbUtil.getInstance().getConnectionPoolParameter(module.getName());
        } catch (CmsRuntimeException ex) {
            if (LOG.isInfoEnabled()) {
                LOG.info(ex);
            }
            m_connectionPool = "default";
        }

        // check if the required database tables exists and create its
        try {
            List createScript = new ArrayList();
            createScript.add(C_CREATE_TABLE);
            CmsDbUtil.getInstance().ensureDBTablesExistance(m_connectionPool, C_CHECK_DB, createScript);
        } catch (Exception e) {
            if (LOG.isErrorEnabled()) {
                LOG.error(Messages.get().getBundle().key(Messages.LOG_ERROR_CREATING_TABLE_1, C_COUNTER_TABLE), e);
            }
        }

    }

    /**
     * This functions adds a new counter entry to the database table or if its exists then
     * the value is updated. <p>
     * 
     * @param entryKey the id of the counter entry
     * @param newValue the value of the counter entry
     * 
     * @throws CmsException if an exception occurred
     */
    public void setCounter(String entryKey, int newValue) throws CmsException {

        Connection con = null;
        PreparedStatement statement = null;

        // check if the values are empty
        if (CmsStringUtil.isEmptyOrWhitespaceOnly(entryKey) || newValue < 0) {
            throw new CmsRuntimeException(Messages.get().container(Messages.LOG_ERROR_MISSING_VALUES_1, "update"));
        }

        try {
            // gets the connection and check if the Counter-Entry exists
            con = CmsDbUtil.getInstance().getConnection(m_connectionPool);
            Integer count = getCounter(entryKey);

            // create the statement to create or update
            if (count == null) {
                statement = con.prepareStatement(C_CREATE_COUNTER_ENTRY);
                statement.setString(1, entryKey);
                statement.setInt(2, newValue);
            } else {
                statement = con.prepareStatement(C_UPDATE_COUNTER_ENTRY);
                statement.setInt(1, newValue);
                statement.setString(2, entryKey);
            }

            // execute the statement
            statement.executeUpdate();

        } catch (SQLException ex) {
            if (LOG.isErrorEnabled()) {
                LOG.error(Messages.get().getBundle().key(Messages.LOG_ERROR_ACCESSING_DB_1, C_COUNTER_TABLE), ex);
            }
            throw new CmsException(
                    Messages.get().container(Messages.LOG_ERROR_SET_COUNTER_2, String.valueOf(newValue), entryKey));
        } finally {
            CmsDbUtil.getInstance().closeConnection(null, statement, con);
        }
    }

}