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.springframework.dao.DataAccessException;
import java.util.*;
/**
* $Author: charles $
* $Revision: 8904 $
* $Date: 2006-05-01 18:02:06 -0400 (Mon, 01 May 2006) $
*
* Created by IntelliJ IDEA.
* User: charles
* Date: Mar 25, 2006
* Time: 8:03:14 PM
* To change this template use File | Settings | File Templates.
*/
public class DependentInputWithDynamicValues extends DependentInput {
private String description;
private Control control;
private Datatype datatype;
private String defaultVal = "";
private Query query;
private HashMap <String,String> attributeValues;
ControlElement controlElement = null;
public ControlElement getControlElement() {
return controlElement;
}
// abstract methods:
public Map<String, String> getValues() throws Exception {
Map<Input,Object> inputMap = new HashMap<Input,Object>();
// get parent current value from the request:
String parentValue = getParentValueFromRequest();
if (Util.anyAreNullOrBlank(parentValue)) {
parentValue = parentInput.getDefaultVal();
}
if (parentValue.equals("")) {
// get first key in parent's values list
Map<String,String> parentValues = parentInput.getValues();
if (parentValues.size() > 0) {
parentValue = parentValues.keySet().iterator().next();
}
else {
// todo: is this cause for error?
}
}
inputMap.put(parentInput,parentValue);
List data = null;
try {
data = query.getData(inputMap);
} catch (DataAccessException e) {
// todo: error with SQL: notify user (developer)
}
Map<String,String> values = new LinkedHashMap<String,String>();
values.putAll(this.attributeValues);
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);
}
return values;
}
public String getDefaultVal() {
return defaultVal;
}
public String getDescription() {
return description;
}
public Control getControl() {
return control;
}
public Datatype getDatatype() {
return datatype;
}
public DependentInputWithDynamicValues(DependentInputElement dependentInputElement, Report report, Input parentInput, int depth) throws BadReportSyntaxException {
super(dependentInputElement,report, depth,parentInput);
if (dependentInputElement.getWhen().size() > 1) throw new BadReportSyntaxException("there must be only one 'when' element if it's value is '*'");
// just get first when element:
WhenElement whenElement = dependentInputElement.getWhen().get(0);
this.description = whenElement.getDescription();
this.datatype = whenElement.getDatatype();
this.attributeValues = Input.getValuesFromAttribute(whenElement.getValues() );
defaultVal = getDefaultValue(whenElement.getDefault(),this.datatype);
// grab query elements and control element from this crappy data structure:
List<QueryElement> queryElements = new ArrayList<QueryElement>();
for (Object object : whenElement.getControlAndQueryOrGeneratedQuery()) {
if (object instanceof QueryElement) {
queryElements.add((QueryElement)object);
} else {
controlElement = (ControlElement)object;
}
}
if (queryElements.size() == 0) {
throw new BadReportSyntaxException("there must be one query inside of a dependent input with dynamic values");
}
// only grab one query:
query = QueryFactory.getQuery(queryElements.get(0),report);
// set control attribute:
if (controlElement == null) {
control = whenElement.getControl();
} else {
control = getControlAttributeFromControlElement(controlElement);
}
this.control = whenElement.getControl();
}
}