diff gnv/src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java @ 663:9a019c125b60

Improved error handling when changing chart/histogram options. gnv/trunk@755 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 09 Mar 2010 15:18:11 +0000
parents a634d5ee961d
children 15ac78a91d1b
line wrap: on
line diff
--- a/gnv/src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java	Mon Mar 08 17:09:28 2010 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java	Tue Mar 09 15:18:11 2010 +0000
@@ -1,7 +1,10 @@
 package de.intevation.gnv.action;
 
+import java.text.NumberFormat;
+import java.text.ParseException;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.Locale;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
@@ -18,6 +21,8 @@
 import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
 import de.intevation.gnv.artifactdatabase.objects.OutputMode;
 import de.intevation.gnv.artifactdatabase.objects.OutputParameter;
+import de.intevation.gnv.propertiesreader.PropertiesReaderFactory;
+import de.intevation.gnv.propertiesreader.PropertiesReader;
 
 /**
  * @author Tim Englich <tim.englich@intevation.de>
@@ -42,6 +47,8 @@
                                  HttpServletResponse response) throws Exception {
         log.debug("NextArtifactStepAction.execute");
         try {
+            PropertiesReaderFactory fac = PropertiesReaderFactory.getInstance();
+            PropertiesReader reader     = fac.getPropertiesReader();
             SessionModel sm = SessionModelFactory.getInstance()
                     .getSessionModel(request);
 
@@ -58,17 +65,66 @@
                     DiagrammOptions diagrammOptions = new DiagrammOptions();
                     while (it.hasNext()) {
                         OutputParameter parameter = it.next();
-                        String value = request.getParameter(parameter.getName());
-                        if (parameter.getType().equalsIgnoreCase("boolean")){
+                        String name  = parameter.getName();
+                        String old   = parameter.getValue();
+                        String value = request.getParameter(name);
+                        String type  = parameter.getType();
+
+                        if (log.isDebugEnabled()) {
+                            log.debug("Change chart options now...");
+                            log.debug("Parameter name: " + name);
+                            log.debug("Parameter type: " + type);
+                            log.debug("Parameter value: " + value);
+                        }
+
+                        if (type.equalsIgnoreCase("boolean")){
                             if (value == null){
                                 value = "false";
                             }
                             else {
                                 value = "true";
                             }
+
+                            diagrammOptions.setValue(name,value);
                         }
-                        diagrammOptions.setValue(parameter.getName(),value);
+                        else if (type.equalsIgnoreCase("integer")) {
+                            if (validInteger(request.getLocale(), value)) {
+                                diagrammOptions.setValue(name, value);
+                            }
+                            else {
+                                log.warn("Text is not a valid integer: "+value);
+                                diagrammOptions.setValue(name, old);
 
+                                request.setAttribute(
+                                    CommunicationKeys.REQUEST_EXCEPTION_MESSAGE,
+                                    "input.not.a.integer"
+                                );
+
+                                request.setAttribute(
+                                    CommunicationKeys.REQUEST_EXCEPTION_VALUE,
+                                    value
+                                );
+                            }
+                        }
+                        else if (type.equalsIgnoreCase("double")) {
+                            if (validDouble(request.getLocale(), value)) {
+                                diagrammOptions.setValue(name, value);
+                            }
+                            else {
+                                log.warn("Text is not a valid double: "+value);
+                                diagrammOptions.setValue(name, old);
+
+                                request.setAttribute(
+                                    CommunicationKeys.REQUEST_EXCEPTION_MESSAGE,
+                                    "input.not.a.double"
+                                );
+
+                                request.setAttribute(
+                                    CommunicationKeys.REQUEST_EXCEPTION_VALUE,
+                                    value
+                                );
+                            }
+                        }
                     }
                     sm.setDiagrammOptions(diagrammOptions);
 
@@ -101,5 +157,40 @@
         }
     }
 
+    protected boolean validInteger(Locale locale, String value) {
+        try {
+            if (value.split("\\.").length > 1 || value.split("\\,").length > 1){
+                return false;
+            }
+
+            NumberFormat format = NumberFormat.getIntegerInstance(locale);
+            format.setParseIntegerOnly(true);
+            Number       number = format.parse(value);
+
+            if (number.longValue() < 0)
+                return false;
+
+            return (number instanceof Integer) || (number instanceof Long);
+        }
+        catch (ParseException pe) {
+            return false;
+        }
+    }
+
+
+    protected boolean validDouble(Locale locale, String value) {
+        try {
+            NumberFormat format = NumberFormat.getInstance(locale);
+            Number       number = format.parse(value);
+
+            if (number.doubleValue() < 0)
+                return false;
+
+            return (number instanceof Double) || validInteger(locale, value);
+        }
+        catch (ParseException pe) {
+            return false;
+        }
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org