/**
  * State/Province Bean processing function.
  *
  * @param in Java bean containing the raw stateprovince as String
  * @param out Java bean containing the stateprovince (from controlled vocabulary) as String
  * @param params Will be ignored so use null
  * @param result Optional ProcessingResult
  */
 @Override
 public void processBean(
     Object in, Object out, Map<String, Object> params, ProcessingResult result) {
   try {
     String textStateProvince = (String) PropertyUtils.getSimpleProperty(in, stateProvinceName);
     StateProvinceEnum stateProvinceEnum = process(textStateProvince, result);
     String stateProvinceStr = null;
     if (stateProvinceEnum == null) {
       switch (errorHandlingMode) {
         case USE_ORIGINAL:
           stateProvinceStr = textStateProvince;
           break;
         case USE_NULL:
           stateProvinceStr = null;
           break;
         case USE_EMPTY:
           stateProvinceStr = "";
           break;
         default:
           stateProvinceStr = null;
           break;
       }
     } else {
       stateProvinceStr = stateProvinceEnum.getName();
     }
     PropertyUtils.setSimpleProperty(out, stateProvinceName, stateProvinceStr);
   } catch (IllegalAccessException e) {
     logger.error("Bean access error", e);
   } catch (InvocationTargetException e) {
     logger.error("Bean access error", e);
   } catch (NoSuchMethodException e) {
     logger.error("Bean access error", e);
   }
 }
  /**
   * NoSuchElementException could be thrown if something is wrong with the dictionary file or the
   * StateProvinceEnum implementation. NullPointerException will be thrown if the dictionary can not
   * be found.
   *
   * @param targetCountry used to retrieve the dictionary file
   * @param stateProvince class of the concrete enum
   * @param stateProvinceName name of the field holding the stateprovince value
   * @param errorHandlingMode
   */
  public StateProvinceProcessor(
      Country targetCountry,
      Class<T> stateProvinceClass,
      String stateProvinceName,
      ErrorHandlingModeEnum errorHandlingMode) {
    super(
        false,
        new InputStream[] {
          StateProvinceProcessor.class.getResourceAsStream(
              "/dictionaries/geography/"
                  + targetCountry.getIso2LetterCode()
                  + "_StateProvinceName.txt")
        });
    this.associatedCountry = targetCountry;
    this.errorHandlingMode = errorHandlingMode;
    this.stateProvinceName = stateProvinceName;
    try {
      // make sure we can find the fromCode(String) method for this enum
      fromCodeMethod = stateProvinceClass.getMethod("fromCode", String.class);
    } catch (SecurityException e) {
      fromCodeMethod = null;
    } catch (NoSuchMethodException e) {
      fromCodeMethod = null;
    }

    StateProvinceEnum[] statesProvinces = stateProvinceClass.getEnumConstants();
    if (statesProvinces == null || statesProvinces.length <= 0 || fromCodeMethod == null) {
      String errorText =
          "No well-formed StateProvinceEnum found for country "
              + targetCountry.getTitle()
              + " and Class "
              + stateProvinceClass;
      logger.error(errorText);
      throw new NoSuchElementException(errorText);
    }

    for (StateProvinceEnum cp : statesProvinces) {
      add(cp.getName(), cp.getCode());
      add(cp.getCode(), cp.getCode());
    }

    // always a default Locale
    setLocale(Locale.ENGLISH);
  }