/* * 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); } } } }