CAPTCHA_FORWARD_ERROR_URLS_PARAMETER,
CAPTCHA_ERROR_URLS_PARAMETER,
    public void init(final FilterConfig theFilterConfig) throws ServletException    {        // get rendering URL from web.xml        this.captchaRenderingURL =            FilterConfigUtils.getStringInitParameter(                theFilterConfig,                CAPTCHA_RENDERING_URL_PARAMETER,                true);        // get verification URLs from web.xml (CSV list of URLs)        String captchaVerificationURLs =            FilterConfigUtils.getStringInitParameter(                theFilterConfig,                CAPTCHA_VERIFICATION_URLS_PARAMETER,                true);        // get forward error URLs from web.xml (CSV list of URLs)        String captchaForwardErrorURLs =            FilterConfigUtils.getStringInitParameter(                theFilterConfig,                CAPTCHA_FORWARD_ERROR_URLS_PARAMETER,                true);        // initialize the verificationForwards hashtable        StringTokenizer verificationURLs =            new StringTokenizer(captchaVerificationURLs, CSV_DELIMITER, false);        StringTokenizer forwardErrorURLs =            new StringTokenizer(captchaForwardErrorURLs, CSV_DELIMITER, false);        if (verificationURLs.countTokens() != forwardErrorURLs.countTokens())        {            // The URL lists are not consistant (there should be a forward and            // a success for each verification URL)            throw new ServletException(                CAPTCHA_VERIFICATION_URLS_PARAMETER                    + " and "                    + CAPTCHA_FORWARD_ERROR_URLS_PARAMETER                    + " values are not consistant in web.xml : there should be"                    + " exactly one forward success and one forward error for"                    + " each verification URL !");        }        while (verificationURLs.hasMoreTokens())        {            // Create a ForwardInfo for each verification URL and store it in            // the verificationForward hashtable            this.verificationForwards.put(                verificationURLs.nextToken(),                forwardErrorURLs.nextToken());        }        // get captcha ID parameter name from web.xml        this.captchaIDParameterName =            FilterConfigUtils.getStringInitParameter(                theFilterConfig,                CAPTCHA_ID_PARAMETER_NAME_PARAMETER,                true);        // get captcha ID max length from web.xml        Integer captchaIDMaxMLengthAsInteger =            FilterConfigUtils.getIntegerInitParameter(                theFilterConfig,                CAPTCHA_ID_MAX_LENGTH_PARAMETER,                true,                0,                Integer.MAX_VALUE);        if (captchaIDMaxMLengthAsInteger != null)        {            this.captchaIDMaxLength = captchaIDMaxMLengthAsInteger.intValue();        }        // get challenge response parameter name from web.xml        this.captchaChallengeResponseParameterName =            FilterConfigUtils.getStringInitParameter(                theFilterConfig,                CAPTCHA_RESPONSE_PARAMETER_NAME_PARAMETER,                true);        // get internal store size from web.xml        Integer captchaInternalStoreSizeAsInteger =            FilterConfigUtils.getIntegerInitParameter(                theFilterConfig,                CAPTCHA_INTERNAL_STORE_SIZE_PARAMETER,                true,                0,                Integer.MAX_VALUE);        if (captchaInternalStoreSizeAsInteger != null)        {            this.captchaInternalStoreSize =                captchaInternalStoreSizeAsInteger.intValue();        }        // get captcha time to live from web.xml        Integer captchaTimeToLiveAsInteger =            FilterConfigUtils.getIntegerInitParameter(                theFilterConfig,                CAPTCHA_TIME_TO_LIVE_PARAMETER,                true,                Integer.MIN_VALUE,                Integer.MAX_VALUE);        if (captchaTimeToLiveAsInteger != null)        {            this.captchaTimeToLive = captchaTimeToLiveAsInteger.intValue();        }        // get the indicator signaling if the CaptchaFilter should be        // registered to an MBean Server        this.captchaRegisterToMBeanServer =            FilterConfigUtils.getBooleanInitParameter(                theFilterConfig,                CAPTCHA_REGISTER_TO_MBEAN_SERVER_PARAMETER,                false);        // get associated servlet context        this.servletContext = theFilterConfig.getServletContext();        // init internal store        this.internalStore =            new ConstantCapacityHashtable(                this.captchaInternalStoreSize,                this.captchaTimeToLive);        if (this.captchaRegisterToMBeanServer)        {            // try to register to the current JMX MBeanServer, if any            registerToMBeanServer();        }    }