/* * * Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved. * * This file is part of Entando software. * Entando is a free software; * You can redistribute it and/or modify it * under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; version 2. * * See the file License for the specific language governing permissions * and limitations under the License * * * * Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved. * */ package com.agiletec.plugins.jpstats.aps.util; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.jfree.data.category.DefaultIntervalCategoryDataset; import com.agiletec.aps.system.exception.ApsSystemException; import com.agiletec.plugins.jpstats.aps.system.services.stats.IStatsManager; import de.laures.cewolf.DatasetProduceException; import de.laures.cewolf.DatasetProducer; /** * Abstract class for building CategoryDataProducer type charts * All the classes that extends this one must implement the method * getResultSet, that must return a Map with the data to render */ public abstract class AbstractCategoryDataProducer implements DatasetProducer { /** * @param manager The StatsManager * @param bean IStatsDataBean object that holds the date interval to render */ public AbstractCategoryDataProducer(IStatsManager manager, IStatsDataBean bean) { this._statsManager = manager; this._dataBean = bean; } public String getProducerId() { return "CategoryDataProducer"; } public boolean hasExpired(Map params, Date since) { return (System.currentTimeMillis() - since.getTime()) > 5000; } public Object produceDataset(Map params) throws DatasetProduceException { DefaultIntervalCategoryDataset ds = null; try{ ds = getDefaultIntervalCategoryDataset(); } catch (Throwable e) { throw new DatasetProduceException("An error occurred generating the DefaultIntervalCategoryDataset object " + this.getClass().getName()); } return ds; } protected abstract Map<String, Integer> getResultset() throws ApsSystemException, SQLException; /** * The data that is meant to be rendered in a * CategoryDataProducer chart type must be a Map * @param result Map the data to render in the chart * @return List of two Arrays, categories and values * used to build DefaultIntervalCategoryDataset object */ private List getDataFromResultset(Map<String, Integer> result) { List data = new ArrayList(); int size = result.size(); Integer[] hits; String[] categories; categories = new String[size]; hits = new Integer[size]; int i = 0; for (Entry<String, Integer> item : result.entrySet()) { categories[i]= item.getKey(); hits[i] = item.getValue(); i++; } data.add(categories); data.add(hits); return data; } private DefaultIntervalCategoryDataset getDefaultIntervalCategoryDataset() throws ApsSystemException { DefaultIntervalCategoryDataset ds = null; try { Map<String, Integer> result = this.getResultset(); List data = this.getDataFromResultset(result); String[] categories = (String[]) data.get(0); Integer[] hits = (Integer[]) data.get(1); final Integer[][] startValues = new Integer[_seriesNames.length][categories.length]; final Integer[][] endValues = new Integer[_seriesNames.length][categories.length]; int i; for (int series = 0; series < _seriesNames.length; series++) { for ( i = 0; i < categories.length; i++) { startValues[series][i] = new Integer(0); endValues[series][i] = hits[i]; } } ds = new DefaultIntervalCategoryDataset(_seriesNames, categories, startValues, endValues); } catch (Throwable e) { throw new ApsSystemException("An error occurred getting statistics data ", e); } return ds; } public IStatsDataBean getDataBean() { return _dataBean; } public IStatsManager getStatsManager() { return _statsManager; } public String[] getSeriesNames() { return _seriesNames; } public void setSeriesNames(String[] names) { _seriesNames = names; } private IStatsManager _statsManager; private IStatsDataBean _dataBean; private String[] _seriesNames = {""}; }