package com.cfinkel.reports; import com.cfinkel.reports.exceptions.InvalidInputException; import com.cfinkel.reports.wrappers.Report; import com.cfinkel.reports.wrappers.Output; import com.cfinkel.reports.generatedbeans.OutputElement; import com.cfinkel.reports.util.MapToInput; import com.cfinkel.reports.valuelist.CFDynaBeanAdapter; import com.cfinkel.reports.web.ParameterNames; import org.apache.log4j.Logger; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.ParseException; import java.util.HashMap; import java.util.List; import java.util.Map; import net.mlw.vlh.ValueListAdapter; /** * $Author: charles $ * $Revision: 8904 $ * $Date: 2006-05-01 18:02:06 -0400 (Mon, 01 May 2006) $ * * This object is for session info per report * User: charles * Date: Apr 14, 2006 * Time: 1:26:12 AM * To change this template use File | Settings | File Templates. */ public class ReportSessionInfo implements Serializable { private static final Logger log = Logger.getLogger(ReportSessionInfo.class); private final Report report; public Map<String, List> getCachedData() { return cachedData; } /** * session data: */ private Map<String, List> cachedData = null; public Map<String, ValueListAdapter> getValueListAdapters() { return valueListAdapters; } private Map<String, ValueListAdapter> valueListAdapters = new HashMap<String,ValueListAdapter>(); private Map<String,String[]> cachedParameterMapOfRunReport = new HashMap<String,String[]>(); private boolean reportWasRunAndDataWasNotCleared = false; public Report getReport() { return report; } public ReportSessionInfo(Report report) { this.report = report; } public void clearCachedData() { if (cachedData != null) { cachedData.clear(); cachedData = null; } reportWasRunAndDataWasNotCleared = false; } public Map<String, String[]> getCachedParameterMapOfRunReport() { return cachedParameterMapOfRunReport; } public void setCachedParameterMap(Map<String, String[]> parameterMap) { cachedParameterMapOfRunReport = new HashMap<String,String[]>(); for (String key : parameterMap.keySet()) { cachedParameterMapOfRunReport.put(key,parameterMap.get(key)); } } /** * gets encoded cached parameters * @return encoded parameters */ public String getEncodedParameters() { StringBuilder s = new StringBuilder("?"); try { for (String inputName : cachedParameterMapOfRunReport.keySet()) { String[] inputs = cachedParameterMapOfRunReport.get(inputName); for (String value : inputs) { String urlValue = URLEncoder.encode(value,"UTF-8"); s.append(inputName).append("=").append(urlValue).append("&"); } } } catch (UnsupportedEncodingException e) { log.error(e); } return s.toString(); } public Map<String,List> runReport(Map<String,String[]> parameterMap ) throws InvalidInputException, ParseException { this.setCachedParameterMap(parameterMap); Map<String, List> reportData = this.report.runNewSearch(this); this.cachedData = new HashMap<String,List>(); for (String outputName : this.report.getOutputs().keySet()) { Output output = this.report.getOutputs().get(outputName); OutputElement outputElement = output.getOutputElement(); if (!outputElement.isValueList()) { // remove any adapter that may have been present from before: this.valueListAdapters.remove(outputName); List outputData = reportData.get(outputName); if ((outputElement.getMaxRowsForCache() <= 0) || outputElement.getMaxRowsForCache() > outputData.size()) { // cache all data: this.cachedData.put(outputName,outputData); } else if (outputData.size() == outputElement.getMaxRowsForDisplayTag()) { // use valuelist: createAndAddAdapter(output,parameterMap); } else { // no cached data // remove cachedData: this.cachedData.remove(outputName); } } else { // value list: createAndAddAdapter(output,parameterMap); } } reportWasRunAndDataWasNotCleared = true; return reportData; } /** * todo: fine tune this method: * @param output */ private void createAndAddAdapter(Output output,Map<String,String[]> parameterMap) throws InvalidInputException, ParseException { CFDynaBeanAdapter adapter = new CFDynaBeanAdapter(); adapter.setDataSource(output.getQuery().getDataSource()); adapter.setUseName(false); adapter.setDefaultNumberPerPage(output.getOutputElement().getRowsPerPage()); adapter.setDefaultSortDirection("asc"); adapter.setShowSql(false); // get query string, then add sort Column adapter.setSql("select * from (\n" + output.getQuery().getQueryString(MapToInput.convertParameterMapToInputs(parameterMap,this.report)) + ")\n" + " /~" + ParameterNames.sortColumn + ": ORDER BY \"[" + ParameterNames.sortColumn + "]\" [" + ParameterNames.sortDirection + "]~/" ); this.valueListAdapters.put(output.getOutputElement().getName(),adapter); } public boolean isReportWasRunAndDataWasNotCleared() { return reportWasRunAndDataWasNotCleared; } public Map<String, List> runOnlyForNonCachedData() throws InvalidInputException, ParseException { return this.report.runOnlyForNonCachedData(this); } public boolean isHasAnAdapterForOutput(Output output) { return this.valueListAdapters.get(output.getOutputElement().getName()) != null; } }