package com.cfinkel.reports.wrappers; import com.cfinkel.reports.exceptions.BadReportSyntaxException; import com.cfinkel.reports.generatedbeans.*; import com.cfinkel.reports.util.QueryFactory; import com.cfinkel.reports.util.Util; import org.apache.log4j.Logger; import org.springframework.dao.DataAccessException; import java.io.Serializable; import java.text.ParseException; import java.util.*; /** * $Author:charles $ * $Revision:10429 $ * $Date:2006-07-26 18:00:43 -0400 (Wed, 26 Jul 2006) $ * * Created by IntelliJ IDEA. * User: charles * Date: Mar 25, 2006 * Time: 7:54:17 PM * To change this template use File | Settings | File Templates. */ public class BaseInput extends Input implements Serializable { private static final Logger log = Logger.getLogger(BaseInput.class); String description; Control control; Datatype dataType; String defaultVal = ""; private Map<String,String> values; // abstract methods: public Map<String, String> getValues() throws Exception { return values; } public String getDefaultVal() { return defaultVal; } public String getDescription() { return description; } public Control getControl() { return control; } public Datatype getDatatype() { return dataType; } ControlElement controlElement = null; public ControlElement getControlElement() { return controlElement; } public BaseInput(BaseInputElement baseInputElement,Report report) throws BadReportSyntaxException { super(baseInputElement,report,1); description = baseInputElement.getDescription(); dataType = baseInputElement.getDatatype(); // separate queries and control: List<QueryElement> queryElements = new ArrayList<QueryElement>(); for (Object object : baseInputElement.getControlAndQueryOrGeneratedQuery()) { if (object instanceof QueryElement) { queryElements.add((QueryElement)object); } else { controlElement = (ControlElement)object; } } // set control attribute: if (controlElement == null) { control = baseInputElement.getControl(); } else { control = getControlAttributeFromControlElement(controlElement); } // should be runReport in this order: if (Util.equalsAny(control,Control.DROPDOWN,Control.LISTBOX,Control.RADIO)) { populateValues(baseInputElement, queryElements); } defaultVal = getDefaultValueFirstTime(baseInputElement); } /** * todo: check exception handling for this method * @param baseInputElement * @return val */ private String getDefaultValueFirstTime(BaseInputElement baseInputElement ) { if (!Util.anyAreNullOrBlank(baseInputElement.getDefault())) { return Input.getDefaultValue(baseInputElement.getDefault(),dataType); } else { Map<String,String> values; // get first key in parent's values list try { values = this.getValues(); } catch (Exception e) { return ""; } if (values != null && values.size() > 0) { return values.keySet().iterator().next(); } else { return ""; // todo: is this cause for error? } } } private void populateValues( BaseInputElement baseInputElement, List<QueryElement> queryElements) throws BadReportSyntaxException { values = new LinkedHashMap<String,String>(); values.putAll( getValuesFromAttribute(baseInputElement.getValues()) ); // process query elements: for (QueryElement queryElement : queryElements) { Query query = QueryFactory.getQuery(queryElement,this.getReport()); List data = null; try { try { data = query.getData(null); } catch (ParseException e) { log.error("This should never happen",e); } } catch (DataAccessException e) { log.error("Data access exception running query for input values",e); throw new BadReportSyntaxException(e.toString()); } for (Object obj : data) { Map map = (Map)obj; Iterator it = map.values().iterator(); String key = it.next().toString(); String value = it.hasNext() ? it.next().toString() : key; values.put(key,value); } } if (values.size() == 0) throw new BadReportSyntaxException("No values for input " + baseInputElement.getName() +"."); } }