ingo@1022: /* ingo@1022: * Copyright (c) 2010 by Intevation GmbH ingo@1022: * ingo@1022: * This program is free software under the LGPL (>=v2.1) ingo@1022: * Read the file LGPL.txt coming with the software for details ingo@1022: * or visit http://www.gnu.org/licenses/ if it does not exist. ingo@1022: */ ingo@1022: 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 { ingo@991: if (isSessionExhausted(request)) { ingo@991: return sessionExhaustedForward(mapping, form, request, response); ingo@991: } ingo@991: 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 :