loginmodules/password/pwcommon/src/main/java/org/beiter/michael/authn/jaas/loginmodules/password/common/PasswordLoginModule.java
@Override
    public final void initialize(final Subject subject, final CallbackHandler callbackHandler,
                                 final Map<String, ?> sharedState, final Map<String, ?> options) {

        LOG.debug("Initializing");

        Validate.notNull(subject, "The validated object 'subject' is null");
        Validate.notNull(callbackHandler, "The validated object 'callbackHandler' is null");
        Validate.notNull(sharedState, "The validated object 'sharedState' is null");
        Validate.notNull(options, "The validated object 'options' is null");

        // keep a reference to the originally provided arguments (no defensive copy)
        this.pSubject = subject;
        this.pCallbackHandler = callbackHandler;

        // It would be nice to parse the configuration only once, and store it for later use. However, we are
        // deliberately NOT caching the parsed configuration, as JAAS does not offer a standard way to to reset the
        // cached variable, and allow users of the login module to reset the parsed config in case an app does need to
        // re-read its configuration.
        final CommonProperties commonProps = JaasBasedCommonPropsBuilder.build(options);

        // initialize the audit object
        initAudit(commonProps);

        // initialize the message object
        initMessageQueue(commonProps);

        // initialize the validator object
        initPwValidator(commonProps);

        // initialize the authenticator object
        initPwAuthenticator(commonProps);

        LOG.info("Initialization complete");
    }
@Override
    public final void initialize(final Subject subject, final CallbackHandler callbackHandler,
                                 final Map<String, ?> sharedState, final Map<String, ?> options) {

        LOG.debug("Initializing");

        Validate.notNull(subject, "The validated object 'subject' is null");
        Validate.notNull(callbackHandler, "The validated object 'callbackHandler' is null");
        Validate.notNull(sharedState, "The validated object 'sharedState' is null");
        Validate.notNull(options, "The validated object 'options' is null");

        // keep a reference to the originally provided arguments (no defensive copy)
        this.pSubject = subject;
        this.pCallbackHandler = callbackHandler;

        // It would be nice to parse the configuration only once, and store it for later use. However, we are
        // deliberately NOT caching the parsed configuration, as JAAS does not offer a standard way to to reset the
        // cached variable, and allow users of the login module to reset the parsed config in case an app does need to
        // re-read its configuration.
        final CommonProperties commonProps = JaasBasedCommonPropsBuilder.build(options);

        // initialize the audit object
        initAudit(commonProps);

        // initialize the message object
        initMessageQueue(commonProps);

        // initialize the validator object
        initPwValidator(commonProps);

        // initialize the authenticator object
        initPwAuthenticator(commonProps);

        LOG.info("Initialization complete");
    }
{@inheritDoc}

@throws NullPointerException When the {@code subject}, {@code callbackHandler}, {@code sharedState}, or
{@code options} are {@code null}