/* * Copyright 2016 Red Hat, Inc. and/or its affiliates * and other contributors as indicated by the @author tags. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.keycloak.models.cache.infinispan.authorization; import org.keycloak.authorization.model.CachedModel; import org.keycloak.authorization.model.ResourceServer; import org.keycloak.models.cache.infinispan.authorization.entities.CachedResourceServer; import org.keycloak.representations.idm.authorization.PolicyEnforcementMode; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class ResourceServerAdapter implements ResourceServer, CachedModel<ResourceServer> { protected CachedResourceServer cached; protected StoreFactoryCacheSession cacheSession; protected ResourceServer updated; public ResourceServerAdapter(CachedResourceServer cached, StoreFactoryCacheSession cacheSession) { this.cached = cached; this.cacheSession = cacheSession; } @Override public ResourceServer getDelegateForUpdate() { if (updated == null) { cacheSession.registerResourceServerInvalidation(cached.getId(), cached.getClientId()); updated = cacheSession.getResourceServerStoreDelegate().findById(cached.getId()); if (updated == null) throw new IllegalStateException("Not found in database"); } return updated; } protected boolean invalidated; protected void invalidateFlag() { invalidated = true; } @Override public void invalidate() { invalidated = true; getDelegateForUpdate(); } @Override public long getCacheTimestamp() { return cached.getCacheTimestamp(); } protected boolean isUpdated() { if (updated != null) return true; if (!invalidated) return false; updated = cacheSession.getResourceServerStoreDelegate().findById(cached.getId()); if (updated == null) throw new IllegalStateException("Not found in database"); return true; } @Override public String getId() { if (isUpdated()) return updated.getId(); return cached.getId(); } @Override public String getClientId() { if (isUpdated()) return updated.getClientId(); return cached.getClientId(); } @Override public boolean isAllowRemoteResourceManagement() { if (isUpdated()) return updated.isAllowRemoteResourceManagement(); return cached.isAllowRemoteResourceManagement(); } @Override public void setAllowRemoteResourceManagement(boolean allowRemoteResourceManagement) { getDelegateForUpdate(); updated.setAllowRemoteResourceManagement(allowRemoteResourceManagement); } @Override public PolicyEnforcementMode getPolicyEnforcementMode() { if (isUpdated()) return updated.getPolicyEnforcementMode(); return cached.getPolicyEnforcementMode(); } @Override public void setPolicyEnforcementMode(PolicyEnforcementMode enforcementMode) { getDelegateForUpdate(); updated.setPolicyEnforcementMode(enforcementMode); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || !(o instanceof ResourceServer)) return false; ResourceServer that = (ResourceServer) o; return that.getId().equals(getId()); } @Override public int hashCode() { return getId().hashCode(); } }