View Javadoc

1   package pt.digitalis.dif.dem.objects.parameters.constraints.impl;
2   
3   import java.util.ArrayList;
4   import java.util.HashMap;
5   import java.util.List;
6   import java.util.Map;
7   
8   import pt.digitalis.dif.dem.interfaces.IStageInstance;
9   import pt.digitalis.dif.dem.objects.parameters.constraints.AbstractParameterConstraint;
10  
11  /**
12   * @author Galaio da Silva <a href="mailto:jgalaio@digitalis.pt">jgalaio@digitalis.pt</a><br/>
13   * @created Jul 27, 2010
14   */
15  public class ParameterConstraintRegexImpl extends AbstractParameterConstraint {
16  
17      /** the separator for multiple regular expressions (Java & JavaScript) */
18      public final static String REGEXP_COMMA = "<<COMMA>>";
19  
20      /** the end delimiter for multiple regular expressions (Java & JavaScript) */
21      public final static String REGEXP_LIST_END = "<<END_REG_EXP>>";
22  
23      /** the separator for multiple regular expressions (Java & JavaScript) */
24      public final static String REGEXP_LIST_SEPARATOR = "<<REG_EXP_SEP>>";
25  
26      /** the start delimiter for multiple regular expressions (Java & JavaScript) */
27      public final static String REGEXP_LIST_START = "<<START_REG_EXP>>";
28  
29      /** Supported classes by numeric constraints */
30      @SuppressWarnings("serial")
31      final static private List<String> supportedClasses = new ArrayList<String>() {
32  
33          {
34              add(String.class.getCanonicalName());
35          }
36      };
37  
38      /** Last tested value */
39      String lastTestedValue;
40  
41      /** Regular Expression: Java syntax */
42      String regexJava;
43  
44      /** Regular Expression: JavaScript syntax */
45      String regexJavaScript;
46  
47      /**
48       * @see pt.digitalis.dif.dem.objects.parameters.constraints.IParameterConstraint#configureConstraint(java.lang.String)
49       */
50      public void configureConstraint(String configurationString)
51      {
52          String value = configurationString.substring(configurationString.indexOf("=") + 1);
53  
54          if (value.contains(REGEXP_LIST_SEPARATOR))
55          {
56              String[] values = value.split(REGEXP_LIST_SEPARATOR);
57  
58              regexJava = values[0].substring(REGEXP_LIST_START.length());
59              regexJavaScript = values[1].substring(0, values[1].length() - REGEXP_LIST_END.length());
60          }
61          else
62          {
63              regexJava = value;
64              regexJavaScript = "/^" + value + "$/";
65          }
66  
67          regexJava = regexJava.replaceAll(REGEXP_COMMA, ",");
68          regexJavaScript = regexJavaScript.replaceAll(REGEXP_COMMA, ",");
69      }
70  
71      /**
72       * @see pt.digitalis.dif.dem.objects.parameters.constraints.AbstractParameterConstraint#getErrorMessageValues(boolean)
73       */
74      @Override
75      protected Map<String, String> getErrorMessageValues(boolean parseValues)
76      {
77          Map<String, String> substitutions = new HashMap<String, String>();
78  
79          if (parseValues)
80          {
81              substitutions.put("value", lastTestedValue);
82          }
83          substitutions.put("regex", regexJava);
84  
85          return substitutions;
86      }
87  
88      /**
89       * @see pt.digitalis.dif.dem.objects.parameters.constraints.IParameterConstraint#getJavaScriptValidationCondition()
90       */
91      public String getJavaScriptValidationCondition()
92      {
93          return "(new RegExp(" + regexJavaScript + ").test(value))";
94      }
95  
96      /**
97       * @see pt.digitalis.dif.dem.objects.parameters.constraints.IParameterConstraint#isSupportedClass(java.lang.Class)
98       */
99      public boolean isSupportedClass(Class<?> clazz)
100     {
101         return supportedClasses.contains(clazz.getCanonicalName());
102     }
103 
104     /**
105      * @see pt.digitalis.dif.dem.objects.parameters.constraints.IParameterConstraint#validateConstraint(java.lang.String,
106      *      pt.digitalis.dif.dem.interfaces.IStageInstance)
107      */
108     public boolean validateConstraint(String value, IStageInstance stageInstance)
109     {
110         lastTestedValue = value;
111 
112         return (value == null || value.matches(regexJava));
113     }
114 }