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

Java tutorial

Introduction

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

Source

/*
 * File   : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.counter/src/com/alkacon/opencms/counter/CmsCounterDialog.java,v $
 * Date   : $Date: 2009/07/21 12:35:57 $
 * 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 org.opencms.jsp.CmsJspActionElement;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.module.CmsModule;
import org.opencms.util.CmsStringUtil;
import org.opencms.widgets.CmsCheckboxWidget;
import org.opencms.widgets.CmsInputWidget;
import org.opencms.workplace.CmsDialog;
import org.opencms.workplace.CmsWidgetDialog;
import org.opencms.workplace.CmsWidgetDialogParameter;
import org.opencms.workplace.CmsWorkplaceSettings;

import java.util.Iterator;
import java.util.SortedMap;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;

import org.apache.commons.logging.Log;

/**
 * Dialog to create a list of counters based on the database-tables in the administration view.<p>
 * 
 * @author Anja Roettgers
 * 
 * @version $Revision: 1.2 $
 * 
 * @since 7.0.3
 */
public class CmsCounterDialog extends CmsWidgetDialog {

    /** localized messages Keys prefix. */
    public static final String COUNTER_KEY_PREFIX = "counter";

    /** Defines which pages are valid for this dialog. */
    public static final String[] PAGES = { "page1" };

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

    /**
     * This function returns the CounterManager from the module action instance. If
     * it isn't exists, then it will be created.<p>
     * 
     * @return the CounterManager
     */
    public static CmsCounterManager getCounterManager() {

        // Get the module
        CmsModule module = OpenCms.getModuleManager().getModule(CmsCounterManager.MODULE_NAME);
        // Get the action class
        CmsCounterManager result = (CmsCounterManager) module.getActionInstance();
        if (result == null) {
            result = new CmsCounterManager();
        }
        return result;
    }

    /** Contains all available counters from the database. */
    private SortedMap m_counterList;

    /** The manager which is the gateway to the database. */
    private CmsCounterManager m_manager;

    /** Contains the flag to overwrite the values in the database. */
    private boolean m_overwrite;

    /**
     * Public constructor with JSP action element.<p>
     * 
     * @param jsp an initialized JSP action element
     */
    public CmsCounterDialog(CmsJspActionElement jsp) {

        super(jsp);

    }

    /**
     * Public constructor with JSP variables.<p>
     * 
     * @param context the JSP page context
     * @param req the JSP request
     * @param res the JSP response
     */
    public CmsCounterDialog(PageContext context, HttpServletRequest req, HttpServletResponse res) {

        this(new CmsJspActionElement(context, req, res));

    }

    /**
     * 
     * @see org.opencms.workplace.CmsWidgetDialog#actionCommit()
     */
    public void actionCommit() {

        if (!hasCommitErrors()) {
            if (!m_counterList.isEmpty()) {
                try {

                    // update the database with the values from the dialog
                    updateCounterValues(m_counterList);

                } catch (Exception ex) {
                    if (LOG.isErrorEnabled()) {
                        LOG.error(Messages.get().getBundle().key(Messages.LOG_ERROR_UPDATE_DB_0), ex);
                    }
                    addCommitError(ex);
                }
            }
        }

    }

    /**
     * Returns a sorted Map.<p>
     *
     * @return the sorted map of counters
     */
    public SortedMap getCounters() {

        return m_counterList;
    }

    /**
     * Returns the overwrite.<p>
     *
     * @return the overwrite
     */
    public boolean isOverwrite() {

        return m_overwrite;
    }

    /**
     * Sets the counters.<p>
     *
     * @param counters the counters to set
     */
    public void setCounters(SortedMap counters) {

        m_counterList = counters;
    }

    /**
     * Sets the overwrite.<p>
     *
     * @param overwrite the overwrite to set
     */
    public void setOverwrite(boolean overwrite) {

        m_overwrite = overwrite;
    }

    /**
     * 
     * @see org.opencms.workplace.CmsWidgetDialog#createDialogHtml(java.lang.String)
     */
    protected String createDialogHtml(String dialog) {

        StringBuffer result = new StringBuffer(1024);

        // show error header once if there were validation errors
        result.append(createWidgetTableStart());
        result.append(createWidgetErrorHeader());

        if (dialog == null || dialog.equals(PAGES[0])) {

            result.append(createWidgetBlockStart(key(Messages.GUI_COUNTERS_BLOCK_LABEL_0)));
            result.append(createDialogRowsHtml(0, 0));
            result.append(createWidgetBlockEnd());

            result.append(createWidgetBlockStart(key(Messages.GUI_OVERWRITE_BLOCK_LABEL_0)));
            result.append(
                    createDialogRowHtml((CmsWidgetDialogParameter) getWidgets().get(getWidgets().size() - 1)));
            result.append(createWidgetBlockEnd());
        }

        result.append(createWidgetTableEnd());
        return result.toString();
    }

    /**
     * 
     * @see org.opencms.workplace.CmsWidgetDialog#defineWidgets()
     */
    protected void defineWidgets() {

        // initialize the counter list to use for the dialog
        initCounterObject();
        setKeyPrefix(COUNTER_KEY_PREFIX);

        // widgets to display
        addWidget(new CmsWidgetDialogParameter(this, "counters", PAGES[0], new CmsInputWidget()));
        addWidget(new CmsWidgetDialogParameter(this, "overwrite", PAGES[0], new CmsCheckboxWidget()));
    }

    /**
     * @see org.opencms.workplace.CmsWidgetDialog#getPageArray()
     */
    protected String[] getPageArray() {

        return PAGES;
    }

    /**
     * Initializes the counter object to work with depending on the dialog state and request parameters.<p>
     * 
     */
    protected void initCounterObject() {

        if (m_manager == null) {
            m_manager = getCounterManager();
        }

        if (CmsStringUtil.isEmpty(getParamAction()) || CmsDialog.DIALOG_INITIAL.equals(getParamAction())) {
            // initialize
            if (m_counterList == null) {
                m_counterList = m_manager.getCounters();
            }
        } else {
            // this is not the initial call, get module from session
            Object o = getDialogObject();
            if (o instanceof SortedMap) {
                m_counterList = (SortedMap) o;
            } else {
                m_counterList = m_manager.getCounters();
            }
        }
    }

    /**
     * @see org.opencms.workplace.CmsWorkplace#initWorkplaceRequestValues(org.opencms.workplace.CmsWorkplaceSettings, javax.servlet.http.HttpServletRequest)
     */
    protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) {

        super.initWorkplaceRequestValues(settings, request);

        // save the current state of the module (may be changed because of the widget values)
        setDialogObject(m_counterList);
    }

    /**
     * @see org.opencms.workplace.CmsWidgetDialog#validateParamaters()
     */
    protected void validateParamaters() throws Exception {

        if (m_counterList != null && !m_counterList.isEmpty()) {
            Iterator iterator = m_counterList.values().iterator();
            while (iterator.hasNext()) {
                getIntValue(iterator.next());
            }
        }
    }

    /**
     * This functions parse the given value and return the value as integer value.<p>
     * 
     * @param value the value with numbers with the type of {@link String} or {@link Integer} 
     * 
     * @return the integer value of the given object or "0" if something goes wrong
     * 
     * @throws CmsException if an error occurred
     */
    private int getIntValue(Object value) throws CmsException {

        int result = 0;
        try {
            if (value != null) {
                if (value instanceof String) {
                    String string = (String) value;
                    result = Integer.parseInt(string);
                } else if (value instanceof Integer) {
                    Integer integ = (Integer) value;
                    result = integ.intValue();
                }
            }
        } catch (Exception ex) {
            if (LOG.isErrorEnabled()) {
                LOG.error(Messages.get().container(Messages.LOG_ERROR_PARSE_INTEGER_1, value), ex);
            }
            throw new CmsException(Messages.get().container(Messages.LOG_ERROR_PARSE_INTEGER_1, value), ex);
        }
        return result;
    }

    /**
     * This function compares the list from the dialog with the list from the database and
     * update the list from the database with the values from the dialog.<p>
     * 
     * @param counterList the list from the dialog
     *
     * @throws Exception if an Exception occurred.
     */
    private void updateCounterValues(SortedMap counterList) throws Exception {

        if (m_manager == null) {
            m_manager = getCounterManager();
        }
        // get the counters from the database
        TreeMap map = m_manager.getCounters();
        Iterator iteratork = map.keySet().iterator();
        Iterator iterator = map.values().iterator();

        // for each entry check if its changed or deleted
        int o_value;
        int new_value;
        String o_key;
        while (iterator.hasNext() && iteratork.hasNext()) {
            o_value = getIntValue(iterator.next());
            o_key = (String) iteratork.next();
            if (counterList.containsKey(o_key)) {
                // the value exits
                new_value = getIntValue(counterList.get(o_key));
                if (o_value != new_value) {
                    if ((o_value < new_value) || (o_value > new_value && m_overwrite)) {
                        m_manager.setCounter(o_key, new_value);
                    }
                    counterList.remove(o_key);
                } else {
                    counterList.remove(o_key);
                }
            } else {
                // the value is deleted
                m_manager.deleteCounter(o_key);
            }
        }

        // now the new values is adding to the database
        if (!counterList.isEmpty()) {
            iteratork = counterList.keySet().iterator();
            iterator = counterList.values().iterator();
            while (iterator.hasNext() && iteratork.hasNext()) {
                o_value = getIntValue(iterator.next());
                o_key = (String) iteratork.next();
                m_manager.setCounter(o_key, o_value);
            }
        }

    }
}