tim@29: package de.intevation.gnv.action;
tim@29:
sascha@683: import de.intevation.gnv.action.sessionmodel.DiagrammOptions;
sascha@683: import de.intevation.gnv.action.sessionmodel.SessionModel;
sascha@683: import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
sascha@683:
sascha@683: import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
sascha@683: import de.intevation.gnv.artifactdatabase.objects.OutputMode;
sascha@683: import de.intevation.gnv.artifactdatabase.objects.OutputParameter;
sascha@683:
ingo@663: import java.text.NumberFormat;
ingo@663: import java.text.ParseException;
sascha@683:
tim@30: import java.util.Collection;
tim@30: import java.util.Iterator;
ingo@663: import java.util.Locale;
ingo@407: import java.util.Map;
tim@30:
tim@29: import javax.servlet.http.HttpServletRequest;
tim@29: import javax.servlet.http.HttpServletResponse;
tim@29:
tim@29: import org.apache.log4j.Logger;
sascha@683:
tim@29: import org.apache.struts.action.ActionForm;
tim@29: import org.apache.struts.action.ActionForward;
tim@29: import org.apache.struts.action.ActionMapping;
tim@29:
tim@29: /**
ingo@690: * This controller is called to change options used in charts and histograms
ingo@690: * (e.g. width, height, etc).
ingo@690: *
sascha@684: * @author Tim Englich
tim@29: */
ingo@409: public class ChangeOptionsAction extends DescribeUIAction {
tim@29: /**
tim@29: * the logger, used to log exceptions and additonaly information
tim@29: */
tim@29: private static Logger log = Logger.getLogger(ChangeOptionsAction.class);
tim@36:
tim@29: /**
tim@29: * Constructor
tim@29: */
tim@29: public ChangeOptionsAction() {
tim@29: super();
tim@29: }
tim@29:
tim@29: @Override
tim@29: public ActionForward execute(ActionMapping mapping, ActionForm form,
tim@38: HttpServletRequest request,
tim@38: HttpServletResponse response) throws Exception {
tim@29: log.debug("NextArtifactStepAction.execute");
tim@34: try {
tim@36: SessionModel sm = SessionModelFactory.getInstance()
tim@36: .getSessionModel(request);
tim@36:
ingo@409: ArtifactDescription ad = sm.getArtifactDescription();
ingo@409:
ingo@967: String target = request.getParameter("target");
tim@34: OutputMode outputMode = sm.getOutputMode(target);
ingo@967: Locale locale = sm.getCurrentLocale();
ingo@967:
tim@36: if (outputMode != null) {
tim@36: Collection op = outputMode
tim@36: .getOutputParameters();
tim@36: if (op != null) {
tim@34: Iterator it = op.iterator();
ingo@967: DiagrammOptions oldOptions = sm.getDiagrammOptions();
tim@34: DiagrammOptions diagrammOptions = new DiagrammOptions();
tim@36: while (it.hasNext()) {
tim@34: OutputParameter parameter = it.next();
ingo@663: String name = parameter.getName();
ingo@967: Object old = oldOptions != null
ingo@967: ? oldOptions.getValue(name)
ingo@967: : parameter.getValue();
ingo@663: String value = request.getParameter(name);
ingo@663: String type = parameter.getType();
ingo@663:
ingo@663: if (log.isDebugEnabled()) {
ingo@663: log.debug("Change chart options now...");
ingo@663: log.debug("Parameter name: " + name);
ingo@663: log.debug("Parameter type: " + type);
ingo@663: log.debug("Parameter value: " + value);
ingo@663: }
ingo@663:
ingo@663: if (type.equalsIgnoreCase("boolean")){
tim@289: if (value == null){
tim@289: value = "false";
tim@289: }
ingo@407: else {
ingo@407: value = "true";
ingo@407: }
ingo@663:
ingo@663: diagrammOptions.setValue(name,value);
tim@289: }
ingo@663: else if (type.equalsIgnoreCase("integer")) {
ingo@663: if (validInteger(request.getLocale(), value)) {
ingo@663: diagrammOptions.setValue(name, value);
ingo@663: }
ingo@663: else {
ingo@663: log.warn("Text is not a valid integer: "+value);
ingo@663: diagrammOptions.setValue(name, old);
tim@36:
ingo@663: request.setAttribute(
ingo@663: CommunicationKeys.REQUEST_EXCEPTION_MESSAGE,
ingo@663: "input.not.a.integer"
ingo@663: );
ingo@663:
ingo@663: request.setAttribute(
ingo@663: CommunicationKeys.REQUEST_EXCEPTION_VALUE,
ingo@663: value
ingo@663: );
ingo@663: }
ingo@663: }
ingo@663: else if (type.equalsIgnoreCase("double")) {
ingo@967: try {
ingo@967: double val = parseDoubleValue(locale, value);
ingo@967: String valStr = Double.toString(val);
ingo@967: log.debug("Change diagram options ["
ingo@967: + name +"] to " + val);
ingo@967: diagrammOptions.setValue(name, val);
ingo@663: }
ingo@967: catch (ParseException pe) {
ingo@663: log.warn("Text is not a valid double: "+value);
ingo@663: diagrammOptions.setValue(name, old);
ingo@663:
ingo@663: request.setAttribute(
ingo@663: CommunicationKeys.REQUEST_EXCEPTION_MESSAGE,
ingo@663: "input.not.a.double"
ingo@663: );
ingo@663:
ingo@663: request.setAttribute(
ingo@663: CommunicationKeys.REQUEST_EXCEPTION_VALUE,
ingo@663: value
ingo@663: );
ingo@663: }
ingo@663: }
tim@34: }
tim@34: sm.setDiagrammOptions(diagrammOptions);
ingo@575:
ingo@575: // XXX Little workarround. We should implement a 'choice' type,
ingo@575: // if we need further choice elements! (iw)
ingo@575: String bintype = request.getParameter("bintype");
ingo@575: if (bintype != null) {
ingo@575: diagrammOptions.setValue("bintype", bintype);
ingo@575: sm.setDiagrammOptions(diagrammOptions);
ingo@575: request.setAttribute("bintype", bintype);
ingo@575: }
tim@30: }
tim@30: }
tim@36:
ingo@407: Map tmpOuts = ad.getOutputModes();
ingo@407: if (tmpOuts == null || tmpOuts.isEmpty()) {
ingo@407: request.setAttribute("furthertargets", true);
ingo@407: }
ingo@407: else {
ingo@573: request.setAttribute(target, true);
tim@34: }
ingo@407:
tim@34: return super.execute(mapping, form, request, response);
tim@34: } catch (Exception e) {
tim@36: log.error(e, e);
tim@36: request.setAttribute(
tim@36: CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e
tim@36: .getMessage());
tim@34: return super.getExceptionForward(mapping);
tim@30: }
tim@29: }
tim@29:
ingo@663: protected boolean validInteger(Locale locale, String value) {
ingo@663: try {
ingo@663: if (value.split("\\.").length > 1 || value.split("\\,").length > 1){
ingo@663: return false;
ingo@663: }
ingo@663:
ingo@663: NumberFormat format = NumberFormat.getIntegerInstance(locale);
ingo@663: format.setParseIntegerOnly(true);
ingo@663: Number number = format.parse(value);
ingo@663:
ingo@663: if (number.longValue() < 0)
ingo@663: return false;
ingo@663:
ingo@663: return (number instanceof Integer) || (number instanceof Long);
ingo@663: }
ingo@663: catch (ParseException pe) {
ingo@663: return false;
ingo@663: }
ingo@663: }
ingo@663:
ingo@967: protected double parseDoubleValue(Locale locale, String value)
ingo@967: throws ParseException
ingo@967: {
ingo@967: log.error("LOCALE FOR DOUBLE PARSING: " + locale.toString());
ingo@967: NumberFormat format = NumberFormat.getNumberInstance(locale);
ingo@967: Number number = format.parse(value);
ingo@663:
ingo@967: return number.doubleValue();
ingo@663: }
tim@29: }
ingo@409: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :