@Override
    protected void internalInit(final boolean forceReinit) {
        assertNotNull("configuration", this.configuration);

        // First of all, initialize the configuration. It may dynamically load some properties, if it is not a static one.
        val callbackUrl = computeFinalCallbackUrl(null);
        configuration.setCallbackUrl(callbackUrl);
        configuration.init(forceReinit);

        // The order of these operations is very important
        // since they depend on each other's field references and sometimes 'this' is passed.
        initDecrypter(forceReinit);
        initSignatureSigningParametersProvider(forceReinit);
        initIdentityProviderMetadataResolver(forceReinit);
        initServiceProviderMetadataResolver(forceReinit);
        initSAMLContextProvider(forceReinit);
        initSignatureTrustEngineProvider(forceReinit);
        initSAMLReplayCache(forceReinit);
        initSAMLResponseValidator(forceReinit);
        initSOAPPipelineProvider(forceReinit);
        initSAMLLogoutResponseValidator(forceReinit);
        initRedirectActionBuilder(forceReinit);
        initCredentialExtractor(forceReinit);
        initAuthenticator(forceReinit);
        initStateGenerator(forceReinit);
        initWebSSOMessageSender(forceReinit);
        initLogoutProcessor(forceReinit);
        initLogoutRequestMessageSender(forceReinit);
        initLogoutActionBuilder(forceReinit);
    }
This class is the client to authenticate and logout users with a SAML2 Identity Provider.

@author Michael Remond
@author Misagh Moayyed
@author Ruochao Zheng
@author Jerome Leleu
@since 1.5.0
pac4j-saml/src/main/java/org/pac4j/saml/client/SAML2Client.java