class OidcClient extends IndirectClient {

    @Getter
    @Setter
    private OidcConfiguration configuration;

    /**
     * <p>Constructor for OidcClient.</p>
     */
    public OidcClient() { }

    /**
     * <p>Constructor for OidcClient.</p>
     *
     * @param configuration a {@link OidcConfiguration} object
     */
    public OidcClient(final OidcConfiguration configuration) {
        setConfiguration(configuration);
    }

    /** {@inheritDoc} */
    @Override
    protected void beforeInternalInit(final boolean forceReinit) {
        super.beforeInternalInit(forceReinit);
        assertNotNull("configuration", configuration);
    }

    /** {@inheritDoc} */
    @Override
    protected void internalInit(final boolean forceReinit) {
        configuration.init(forceReinit);

        setRedirectionActionBuilderIfUndefined(new OidcRedirectionActionBuilder(this));
        setCredentialsExtractorIfUndefined(new OidcCredentialsExtractor(configuration, this));
        setAuthenticatorIfUndefined(new OidcAuthenticator(configuration, this));
        setProfileCreatorIfUndefined(new OidcProfileCreator(configuration, this));
        setLogoutProcessorIfUndefined(new OidcLogoutProcessor(configuration, findSessionLogoutHandler()));
        setLogoutActionBuilderIfUndefined(new OidcLogoutActionBuilder(configuration));
    }

    /** {@inheritDoc} */
    @Override
    public Optional<UserProfile> renewUserProfile(final CallContext ctx, final UserProfile profile) {<FILL_FUNCTION_BODY>}

    /** {@inheritDoc} */
    @Override
    public void notifySessionRenewal(final CallContext ctx, final String oldSessionId) {
        val sessionLogoutHandler = findSessionLogoutHandler();
        if (sessionLogoutHandler != null) {
            sessionLogoutHandler.renewSession(ctx, oldSessionId);
        }
    }
}

        val oidcProfile = (OidcProfile) profile;
        val refreshToken = oidcProfile.getRefreshToken();
        if (refreshToken != null) {
            val credentials = new OidcCredentials();
            credentials.setRefreshTokenObject(refreshToken);
            val authenticator = (OidcAuthenticator)getAuthenticator();
            authenticator.refresh(credentials);

            // Create a profile if the refresh grant was successful
            if (credentials.getAccessToken() != null) {
                return getUserProfile(ctx, credentials);
            }
        }

        return Optional.empty();
    
<methods>public non-sealed void <init>() ,public java.lang.String computeFinalCallbackUrl(org.pac4j.core.context.WebContext) ,public java.lang.String getCodeVerifierSessionAttributeName() ,public final Optional<org.pac4j.core.exception.http.RedirectionAction> getLogoutAction(CallContext, org.pac4j.core.profile.UserProfile, java.lang.String) ,public java.lang.String getNonceSessionAttributeName() ,public final Optional<org.pac4j.core.exception.http.RedirectionAction> getRedirectionAction(CallContext) ,public java.lang.String getStateSessionAttributeName() ,public org.pac4j.core.exception.http.HttpAction processLogout(CallContext, org.pac4j.core.credentials.Credentials) <variables>public static final java.lang.String ATTEMPTED_AUTHENTICATION_SUFFIX,private static final java.lang.String CODE_VERIFIER_SESSION_PARAMETER,private static final java.lang.String NONCE_SESSION_PARAMETER,private static final java.lang.String STATE_SESSION_PARAMETER,private org.pac4j.core.http.ajax.AjaxRequestResolver ajaxRequestResolver,protected java.lang.String callbackUrl,protected org.pac4j.core.http.callback.CallbackUrlResolver callbackUrlResolver,private boolean checkAuthenticationAttempt,private org.pac4j.core.logout.LogoutActionBuilder logoutActionBuilder,private org.pac4j.core.logout.processor.LogoutProcessor logoutProcessor,private org.pac4j.core.redirect.RedirectionActionBuilder redirectionActionBuilder,protected org.pac4j.core.http.url.UrlResolver urlResolver