// Path: services/google/api/src/main/java/eu/hlavki/identity/services/google/NoPrivateKeyException.java
// public class NoPrivateKeyException extends RuntimeException {
// 
//     private static final long serialVersionUID = 2712920621905135028L;
// 
//     public NoPrivateKeyException() {
//         super();
//     }
// 
// 
//     public NoPrivateKeyException(String message) {
//         super(message);
//     }
// 
// 
//     public NoPrivateKeyException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// 
//     public NoPrivateKeyException(Throwable cause) {
//         super(cause);
//     }
// }
// 
// Path: services/google/api/src/main/java/eu/hlavki/identity/services/google/config/Configuration.java
// public interface Configuration {
// 
//     String getGSuiteDomain();
// 
// 
//     String getGSuiteImplicitGroup();
// 
// 
//     boolean isSetGSuiteImplicitGroup();
// 
// 
//     String getServiceAccountEmail();
// 
// 
//     String getServiceAccountSubject();
// 
// 
//     Set<String> getServiceAccountScopes();
// 
// 
//     PrivateKey readServiceAccountKey() throws NoPrivateKeyException;
// 
// 
//     void setServiceAccount(String clientEmail, String privateKey, String subject, String tokenUri);
// 
// 
//     void resetServiceAccount();
// 
// 
//     String getServiceAccountTokenUri();
// 
// 
//     long getServiceAccountTokenLifetime();
// 
// 
//     String getPushServiceHostname();
// 
// 
//     void setPushServiceHostname(String hostname);
// 
// 
//     File getPushChannelFile();
// 
// 
//     boolean isPushEnabled();
// 
// 
//     void setPushEnabled(boolean value);
// 
// 
//     Duration getPushRefreshInterval();
// }


import com.google.common.base.Supplier;
import static com.google.common.base.Suppliers.memoizeWithExpiration;
import eu.hlavki.identity.services.google.NoPrivateKeyException;
import eu.hlavki.identity.services.google.config.Configuration;
import java.util.Arrays;
import static java.util.concurrent.TimeUnit.SECONDS;
import javax.ws.rs.core.MediaType;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.rs.security.jose.common.JoseType;
import org.apache.cxf.rs.security.jose.jwa.SignatureAlgorithm;
import org.apache.cxf.rs.security.jose.jws.JwsHeaders;
import org.apache.cxf.rs.security.jose.jws.JwsJwtCompactProducer;
import org.apache.cxf.rs.security.jose.jwt.JwtClaims;
import org.apache.cxf.rs.security.jose.jwt.JwtToken;
import org.apache.cxf.rs.security.oauth2.client.AccessTokenGrantWriter;
import org.apache.cxf.rs.security.oauth2.common.ClientAccessToken;
import org.apache.cxf.rs.security.oauth2.grants.jwt.JwtBearerGrant;
import org.apache.cxf.rs.security.oauth2.provider.OAuthJSONProvider;
import org.apache.cxf.rs.security.oauth2.utils.OAuthUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
package eu.hlavki.identity.services.google.impl;


public class TokenCache {

    private static final Logger log = LoggerFactory.getLogger(TokenCache.class);

// Path: services/google/api/src/main/java/eu/hlavki/identity/services/google/NoPrivateKeyException.java
// public class NoPrivateKeyException extends RuntimeException {
// 
//     private static final long serialVersionUID = 2712920621905135028L;
// 
//     public NoPrivateKeyException() {
//         super();
//     }
// 
// 
//     public NoPrivateKeyException(String message) {
//         super(message);
//     }
// 
// 
//     public NoPrivateKeyException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// 
//     public NoPrivateKeyException(Throwable cause) {
//         super(cause);
//     }
// }
// 
// Path: services/google/api/src/main/java/eu/hlavki/identity/services/google/config/Configuration.java
// public interface Configuration {
// 
//     String getGSuiteDomain();
// 
// 
//     String getGSuiteImplicitGroup();
// 
// 
//     boolean isSetGSuiteImplicitGroup();
// 
// 
//     String getServiceAccountEmail();
// 
// 
//     String getServiceAccountSubject();
// 
// 
//     Set<String> getServiceAccountScopes();
// 
// 
//     PrivateKey readServiceAccountKey() throws NoPrivateKeyException;
// 
// 
//     void setServiceAccount(String clientEmail, String privateKey, String subject, String tokenUri);
// 
// 
//     void resetServiceAccount();
// 
// 
//     String getServiceAccountTokenUri();
// 
// 
//     long getServiceAccountTokenLifetime();
// 
// 
//     String getPushServiceHostname();
// 
// 
//     void setPushServiceHostname(String hostname);
// 
// 
//     File getPushChannelFile();
// 
// 
//     boolean isPushEnabled();
// 
// 
//     void setPushEnabled(boolean value);
// 
// 
//     Duration getPushRefreshInterval();
// }


// Path: services/google/api/src/main/java/eu/hlavki/identity/services/google/impl/TokenCache.java
import com.google.common.base.Supplier;
import static com.google.common.base.Suppliers.memoizeWithExpiration;
import eu.hlavki.identity.services.google.NoPrivateKeyException;
import eu.hlavki.identity.services.google.config.Configuration;
import java.util.Arrays;
import static java.util.concurrent.TimeUnit.SECONDS;
import javax.ws.rs.core.MediaType;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.rs.security.jose.common.JoseType;
import org.apache.cxf.rs.security.jose.jwa.SignatureAlgorithm;
import org.apache.cxf.rs.security.jose.jws.JwsHeaders;
import org.apache.cxf.rs.security.jose.jws.JwsJwtCompactProducer;
import org.apache.cxf.rs.security.jose.jwt.JwtClaims;
import org.apache.cxf.rs.security.jose.jwt.JwtToken;
import org.apache.cxf.rs.security.oauth2.client.AccessTokenGrantWriter;
import org.apache.cxf.rs.security.oauth2.common.ClientAccessToken;
import org.apache.cxf.rs.security.oauth2.grants.jwt.JwtBearerGrant;
import org.apache.cxf.rs.security.oauth2.provider.OAuthJSONProvider;
import org.apache.cxf.rs.security.oauth2.utils.OAuthUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

package eu.hlavki.identity.services.google.impl;


public class TokenCache {

    private static final Logger log = LoggerFactory.getLogger(TokenCache.class);

    private final Configuration config;