View Javadoc

1   /**
2    * 2007, Digitalis Informatica. All rights reserved. Distribuicao e Gestao de Informatica, Lda. Estrada de Paco de Arcos
3    * num.9 - Piso -1 2780-666 Paco de Arcos Telefone: (351) 21 4408990 Fax: (351) 21 4408999 http://www.digitalis.pt
4    */
5   package pt.digitalis.dif.dem.objects.parameters.types;
6   
7   import java.math.BigDecimal;
8   import java.util.ArrayList;
9   import java.util.Date;
10  import java.util.List;
11  
12  import pt.digitalis.dif.controller.interfaces.IDIFContext;
13  import pt.digitalis.dif.dem.interfaces.IStageInstance;
14  import pt.digitalis.dif.dem.objects.parameters.constraints.IParameterConstraint;
15  import pt.digitalis.dif.dem.objects.parameters.errors.ParameterError;
16  import pt.digitalis.dif.dem.objects.parameters.errors.ParameterErrorList;
17  import pt.digitalis.dif.dem.objects.parameters.errors.ParameterErrorType;
18  import pt.digitalis.dif.exception.objects.ParameterException;
19  import pt.digitalis.dif.startup.DIFGeneralConfigurationParameters;
20  
21  /**
22   * This class will define a numeric Parameter.
23   * <p>
24   * It will hold information relative to the Parameter value, ID key and validation constraints.
25   * 
26   * @author Pedro Viegas <a href="mailto:pviegas@digitalis.pt">pviegas@digitalis.pt</a>
27   * @author Rodrigo Gonçalves <a href="mailto:rgoncalves@digitalis.pt">rgoncalves@digitalis.pt</a>
28   * @created Nov 23, 2007
29   */
30  public class DoubleParameter extends AbstractParameter<Number> {
31  
32      /** The list of supported classes to define in the concrete implementations */
33      @SuppressWarnings("serial")
34      final static private List<String> supportedClasses = new ArrayList<String>() {
35  
36          {
37              add(Double.class.getCanonicalName());
38          }
39      };
40  
41      /**
42       * @see pt.digitalis.dif.dem.objects.parameters.types.AbstractParameter#automaticConstraints()
43       */
44      @Override
45      protected String automaticConstraints()
46      {
47          return "numeric";
48      }
49  
50      /**
51       * @see pt.digitalis.dif.dem.objects.parameters.IParameter#getSupportedClasses()
52       */
53      public List<String> getSupportedClasses()
54      {
55          return supportedClasses;
56      }
57  
58      /**
59       * @see pt.digitalis.dif.dem.objects.parameters.IParameter#getValueAsBigDecimal(pt.digitalis.dif.controller.interfaces.IDIFContext)
60       */
61      public BigDecimal getValueAsBigDecimal(IDIFContext context) throws ParameterException
62      {
63          return BigDecimal.valueOf(getValue(context).doubleValue());
64      }
65  
66      /**
67       * @see pt.digitalis.dif.dem.objects.parameters.IParameter#getValueAsBoolean(IDIFContext)
68       */
69      public boolean getValueAsBoolean(IDIFContext context) throws ParameterException
70      {
71          return (getValue(context).doubleValue() != 0D);
72      }
73  
74      /**
75       * @see pt.digitalis.dif.dem.objects.parameters.IParameter#getValueAsDate(IDIFContext)
76       */
77      public Date getValueAsDate(IDIFContext context)
78      {
79          return null;
80      }
81  
82      /**
83       * @see pt.digitalis.dif.dem.objects.parameters.IParameter#getValueAsDouble(IDIFContext)
84       */
85      public Double getValueAsDouble(IDIFContext context) throws ParameterException
86      {
87          return getValue(context).doubleValue();
88      }
89  
90      /**
91       * @see pt.digitalis.dif.dem.objects.parameters.IParameter#getValueAsLong(IDIFContext)
92       */
93      public Long getValueAsLong(IDIFContext context) throws ParameterException
94      {
95          return getValue(context).longValue();
96      }
97  
98      /**
99       * @see pt.digitalis.dif.dem.objects.parameters.IParameter#isNumeric()
100      */
101     public boolean isNumeric()
102     {
103         return true;
104     }
105 
106     /**
107      * @see pt.digitalis.dif.dem.objects.parameters.IParameter#setValueFromString(java.lang.String,
108      *      pt.digitalis.dif.dem.interfaces.IStageInstance, boolean)
109      */
110     public ParameterErrorList setValueFromString(String value, IStageInstance stageInstance,
111             boolean initializationInProgress)
112     {
113 
114         ParameterErrorList list = new ParameterErrorList(this, value);
115         ParameterError error;
116         // TODO: Create a floating point constraint. This will not pick up the floating point errors
117         IParameterConstraint constraint = getConstraints().get("numeric");
118         IDIFContext context;
119 
120         if (stageInstance == null)
121             context = null;
122         else
123             context = stageInstance.getContext();
124 
125         // If the numeric constraint does not validate...
126         if (!constraint.validateConstraint(value, stageInstance))
127         {
128             String language;
129 
130             if (context == null)
131                 language = DIFGeneralConfigurationParameters.getInstance().getDefaultLanguage();
132             else
133                 language = context.getLanguage();
134 
135             error = new ParameterError(constraint.validationErrorMessage(language), ParameterErrorType.CONSTRAINT);
136             error.setConstraint("numeric", constraint);
137 
138             list.addError(error);
139         }
140         else
141         {
142             try
143             {
144                 if (value == null || "".equals(value))
145                     return setValue(null, stageInstance, initializationInProgress);
146                 else
147                 {
148                     value = value.replace(',', '.').trim();
149 
150                     return setValue(Double.valueOf(value), stageInstance, initializationInProgress);
151                 }
152             }
153             catch (Exception e)
154             {
155                 /*
156                  * Unreachable exception: to get here Double#parseDouble() would have to throw a NumberFormatException.
157                  * This exception is raised if the string does not contain a parsable double. This would happen if a bad
158                  * value is passed. This situation is avoided by the constraint validation mechanism. So if a bad value
159                  * is passed the code never enters the 'else' branch and as such is never possible to get here.
160                  */
161                 error = new ParameterError("Error parsing value", ParameterErrorType.OTHER);
162                 error.setException(e);
163                 list.addError(error);
164             }
165         }
166         return list;
167     }
168 }