extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/plugins/cmd/EnumValidator.java

Code
Comments
Other
Rev Date Author Line
6217 19 Apr 21 nicklas 1 package net.sf.basedb.reggie.plugins.cmd;
6217 19 Apr 21 nicklas 2
6217 19 Apr 21 nicklas 3 import java.util.Arrays;
6217 19 Apr 21 nicklas 4 import java.util.List;
6217 19 Apr 21 nicklas 5
6217 19 Apr 21 nicklas 6 import net.sf.basedb.core.DbControl;
6966 10 Jan 23 nicklas 7 import net.sf.basedb.reggie.converter.Translater;
6217 19 Apr 21 nicklas 8 import net.sf.basedb.reggie.dao.Annotationtype;
6217 19 Apr 21 nicklas 9 import net.sf.basedb.util.Values;
6217 19 Apr 21 nicklas 10
6217 19 Apr 21 nicklas 11
6217 19 Apr 21 nicklas 12 /**
6217 19 Apr 21 nicklas 13   Validator for string values that are expected to match
6217 19 Apr 21 nicklas 14   one value in a predefined enumeration. The validator
6217 19 Apr 21 nicklas 15   allow null values. Use JsonSection.getRequiredEntry() if 
6217 19 Apr 21 nicklas 16   a value is required.
6217 19 Apr 21 nicklas 17
6217 19 Apr 21 nicklas 18   @since 4.32
6217 19 Apr 21 nicklas 19 */
6217 19 Apr 21 nicklas 20 public class EnumValidator
6966 10 Jan 23 nicklas 21   implements ValueValidator<String, String>, Cloneable
6217 19 Apr 21 nicklas 22 {
6217 19 Apr 21 nicklas 23   /**
6217 19 Apr 21 nicklas 24     The laterality is LEFT or RIGHT.
6217 19 Apr 21 nicklas 25   */
6702 26 Apr 22 nicklas 26   public static final EnumValidator LATERALITY = new EnumValidator(Annotationtype.LATERALITY, true);
6217 19 Apr 21 nicklas 27
6217 19 Apr 21 nicklas 28   /**
6217 19 Apr 21 nicklas 29     The specimen type.
6217 19 Apr 21 nicklas 30   */
6702 26 Apr 22 nicklas 31   public static final EnumValidator SPECIMEN_TYPE = new EnumValidator(Annotationtype.SPECIMEN_TYPE, false);
6217 19 Apr 21 nicklas 32
6217 19 Apr 21 nicklas 33   /**
6217 19 Apr 21 nicklas 34     The biopsy type.
6217 19 Apr 21 nicklas 35   */
6702 26 Apr 22 nicklas 36   public static final EnumValidator BIOPSY_TYPE = new EnumValidator(Annotationtype.BIOPSY_TYPE, false);
6217 19 Apr 21 nicklas 37   
6966 10 Jan 23 nicklas 38   /**
6966 10 Jan 23 nicklas 39     Translations for Biopsy type. Currently:
6966 10 Jan 23 nicklas 40      * Operationspreparat -> SpecimenSurgery
6966 10 Jan 23 nicklas 41
6966 10 Jan 23 nicklas 42     @since 4.42
6966 10 Jan 23 nicklas 43    */
6966 10 Jan 23 nicklas 44   public static final Translater BIOPSY_TYPE_TRANSLATIONS = new Translater("Operationspreparat", "SpecimenSurgery");
6966 10 Jan 23 nicklas 45   
6217 19 Apr 21 nicklas 46   private final List<String> values;
6217 19 Apr 21 nicklas 47   private final Annotationtype annotationType;
6702 26 Apr 22 nicklas 48   private final boolean testUppercase;
6966 10 Jan 23 nicklas 49
6966 10 Jan 23 nicklas 50   private Translater translater;
6217 19 Apr 21 nicklas 51   
6217 19 Apr 21 nicklas 52   /**
6217 19 Apr 21 nicklas 53     Enum validator with a specified list of allowed values.
6217 19 Apr 21 nicklas 54   */
6702 26 Apr 22 nicklas 55   public EnumValidator(boolean testUppercase, String... values)
6217 19 Apr 21 nicklas 56   {
6217 19 Apr 21 nicklas 57     this.values = Arrays.asList(values);
6217 19 Apr 21 nicklas 58     this.annotationType = null;
6702 26 Apr 22 nicklas 59     this.testUppercase = testUppercase;
6217 19 Apr 21 nicklas 60   }
6217 19 Apr 21 nicklas 61   
6217 19 Apr 21 nicklas 62   /**
6217 19 Apr 21 nicklas 63     Enum validator that uses the allowed values from an existing annotation type.
6217 19 Apr 21 nicklas 64   */
6702 26 Apr 22 nicklas 65   public EnumValidator(Annotationtype annotationType, boolean testUppercase)
6217 19 Apr 21 nicklas 66   {
6217 19 Apr 21 nicklas 67     this.annotationType = annotationType;
6217 19 Apr 21 nicklas 68     this.values = null;
6702 26 Apr 22 nicklas 69     this.testUppercase = testUppercase;
6217 19 Apr 21 nicklas 70   }
6217 19 Apr 21 nicklas 71   
6217 19 Apr 21 nicklas 72   @Override
6217 19 Apr 21 nicklas 73   public String isValid(DbControl dc, String value, JsonSection section, String entryKey)
6217 19 Apr 21 nicklas 74   {
6217 19 Apr 21 nicklas 75     if (value != null)
6217 19 Apr 21 nicklas 76     {
6966 10 Jan 23 nicklas 77       String originalValue = value;
6966 10 Jan 23 nicklas 78       if (translater != null) value = translater.get(value);
6966 10 Jan 23 nicklas 79       
6217 19 Apr 21 nicklas 80       List<String> allowed = annotationType == null ? values : annotationType.get(dc).getValues();
6217 19 Apr 21 nicklas 81       if (allowed != null && allowed.size() > 0 && allowed.indexOf(value) == -1)
6217 19 Apr 21 nicklas 82       {
6702 26 Apr 22 nicklas 83         // Also test if UPPER CASE matches
6702 26 Apr 22 nicklas 84         String ucValue = value.toUpperCase();
6702 26 Apr 22 nicklas 85         if (!testUppercase || allowed.indexOf(ucValue) == -1)
6702 26 Apr 22 nicklas 86         {
6966 10 Jan 23 nicklas 87           section.addErrorMessage("Invalid entry in JSON: "+entryKey+"="+originalValue+
6702 26 Apr 22 nicklas 88             " (expected one of: " +Values.getString(allowed, ", ", true)+")");
6702 26 Apr 22 nicklas 89           return null;
6702 26 Apr 22 nicklas 90         }
6702 26 Apr 22 nicklas 91         value = ucValue;
6217 19 Apr 21 nicklas 92       }
6217 19 Apr 21 nicklas 93     }
6217 19 Apr 21 nicklas 94     return value;
6217 19 Apr 21 nicklas 95   }
6217 19 Apr 21 nicklas 96   
6217 19 Apr 21 nicklas 97   @Override
6217 19 Apr 21 nicklas 98   public Class<String> getExpectedClass() 
6217 19 Apr 21 nicklas 99   {
6217 19 Apr 21 nicklas 100     return String.class;
6217 19 Apr 21 nicklas 101   }
6966 10 Jan 23 nicklas 102   
6966 10 Jan 23 nicklas 103   @Override
6966 10 Jan 23 nicklas 104   protected EnumValidator clone() 
6966 10 Jan 23 nicklas 105   {
6966 10 Jan 23 nicklas 106     try
6966 10 Jan 23 nicklas 107     {
6966 10 Jan 23 nicklas 108       return (EnumValidator)super.clone();
6966 10 Jan 23 nicklas 109     }
6966 10 Jan 23 nicklas 110     catch (CloneNotSupportedException e) 
6966 10 Jan 23 nicklas 111     {
6966 10 Jan 23 nicklas 112       // Should never happen
6966 10 Jan 23 nicklas 113       throw new UnsupportedOperationException("clone()");
6966 10 Jan 23 nicklas 114     }
6966 10 Jan 23 nicklas 115   }
6217 19 Apr 21 nicklas 116
6966 10 Jan 23 nicklas 117   /**
6966 10 Jan 23 nicklas 118     Extend the validator with the possibility to translate some options to
6966 10 Jan 23 nicklas 119     other values before they are validated.
6966 10 Jan 23 nicklas 120     @since 4.42
6966 10 Jan 23 nicklas 121   */
6966 10 Jan 23 nicklas 122   public ValueValidator<String, String> withTranslations(Translater translater)
6966 10 Jan 23 nicklas 123   {
6966 10 Jan 23 nicklas 124     EnumValidator wrap = clone();
6966 10 Jan 23 nicklas 125     wrap.translater = translater;
6966 10 Jan 23 nicklas 126     return wrap;
6966 10 Jan 23 nicklas 127   }
6966 10 Jan 23 nicklas 128
6217 19 Apr 21 nicklas 129 }