/**
   * Fetches the localized name for a form field if one exists in the form field resource bundle. If
   * for any reason a localized value cannot be found (e.g. the bundle cannot be found, or does not
   * contain the required properties) then null will be returned.
   *
   * <p>Looks first for a property called {@code beanClassFQN.fieldName} in the resource bundle. If
   * that is undefined, it next looks for {@code actionPath.fieldName} and if not defined, looks for
   * a property called {@code fieldName}. Will strip any indexing from the field name prior to using
   * it to construct property names (e.g. foo[12] will become simply foo).
   *
   * @param fieldName The name of the field whose localized name to look up
   * @param actionPath The action path of the form in which the field is nested. If for some reason
   *     this is not available, null may be passed without causing errors.
   * @param locale The desired locale of the looked up name.
   * @return a localized field name if one can be found, or null otherwise.
   */
  public static String getLocalizedFieldName(
      String fieldName, String actionPath, Class<? extends ActionBean> beanclass, Locale locale) {

    ParameterName parameterName = new ParameterName(fieldName);
    String strippedName = parameterName.getStrippedName();
    String localizedValue = null;
    ResourceBundle bundle = null;

    try {
      bundle =
          StripesFilter.getConfiguration()
              .getLocalizationBundleFactory()
              .getFormFieldBundle(locale);
    } catch (MissingResourceException mre) {
      log.error(mre);
      return null;
    }

    // First with the bean class
    if (beanclass != null) {
      try {
        localizedValue = bundle.getString(beanclass.getName() + "." + strippedName);
      } catch (MissingResourceException mre) {
        /* do nothing */
      }
    }

    // Then all by itself
    if (localizedValue == null) {
      try {
        localizedValue = bundle.getString(strippedName);
      } catch (MissingResourceException mre2) {
        /* do nothing */
      }
    }

    // Lastly, check @Validate on the ActionBean property
    if (localizedValue == null && beanclass != null) {
      ValidationMetadata validate =
          StripesFilter.getConfiguration()
              .getValidationMetadataProvider()
              .getValidationMetadata(beanclass, parameterName);
      if (validate != null && validate.label() != null && !"".equals(validate.label())) {
        localizedValue = validate.label();
      }
    }

    return localizedValue;
  }
 /**
  * Looks up the specified key in the error message resource bundle. If the bundle is missing or if
  * the resource cannot be found, will return null instead of throwing an exception.
  *
  * @param locale the locale in which to lookup the resource
  * @param key the exact resource key to lookup
  * @return the resource String or null
  */
 public static String getErrorMessage(Locale locale, String key) {
   try {
     Configuration config = StripesFilter.getConfiguration();
     ResourceBundle bundle = config.getLocalizationBundleFactory().getErrorMessageBundle(locale);
     return bundle.getString(key);
   } catch (MissingResourceException mre) {
     return null;
   }
 }
  /**
   * calling injectors post creation on Action beans and Interceptors
   *
   * @param context
   * @return
   * @throws Exception
   */
  public Resolution intercept(ExecutionContext context) throws Exception {
    Configuration conf = StripesFilter.getConfiguration();

    FilterConfig filterConfig = conf.getBootstrapPropertyResolver().getFilterConfig();
    String className = filterConfig.getInitParameter(INJECTOR_FACTORY_CLASS);
    String methodName = filterConfig.getInitParameter(INJECTOR_FACTORY_METHOD);

    Injector injector = null;
    try {
      Class clazz = Class.forName(className);
      Method method = clazz.getMethod(methodName);
      injector = (Injector) method.invoke(null);
    } catch (ClassNotFoundException e) {
      log.error("Injector factory class not found - " + className, e);
      throw new Exception("Injector factory class not found - " + methodName, e);
    } catch (NoSuchMethodException e) {
      log.error("Injector factory method not found - " + methodName + " in class " + className, e);
      throw new Exception(
          "Injector factory method not found - " + methodName + " in class " + className, e);
    } catch (SecurityException e) {
      log.error(
          "SecurityException when trying to invoke - " + methodName + " in class " + className, e);
      throw new Exception(
          "SecurityException when trying to invoke - " + methodName + " in class " + className, e);
    } catch (IllegalAccessException e) {
      log.error(
          "IllegalAccessException when trying to invoke - " + methodName + " in class " + className,
          e);
      throw new Exception(
          "IllegalAccessException when trying to invoke - " + methodName + " in class " + className,
          e);
    } catch (IllegalArgumentException e) {
      log.error(
          "IllegalArgumentException when trying to invoke - "
              + methodName
              + " in class "
              + className,
          e);
      throw new Exception(
          "IllegalArgumentException when trying to invoke - "
              + methodName
              + " in class "
              + className,
          e);
    } catch (InvocationTargetException e) {
      log.error(
          "InvocationTargetException when trying to invoke - "
              + methodName
              + " in class "
              + className,
          e);
      throw new Exception(
          "InvocationTargetException when trying to invoke - "
              + methodName
              + " in class "
              + className,
          e);
    }

    //    if (context.getActionBean() != null) injector.injectMembers(context.getActionBean());
    if (context.getActionBeanContext() != null)
      injector.injectMembers(context.getActionBeanContext());

    for (Interceptor interceptor : conf.getInterceptors(context.getLifecycleStage())) {
      if (interceptor != null) injector.injectMembers(interceptor);
    }

    return context.proceed();
  }