package fr.itldev.koya.services.cache; import java.io.Serializable; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import org.alfresco.service.cmr.repository.NodeRef; import org.apache.log4j.Logger; import org.springframework.beans.factory.InitializingBean; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import fr.itldev.koya.model.KoyaNode; import fr.itldev.koya.model.Permissions; import fr.itldev.koya.model.impl.Company; import fr.itldev.koya.model.impl.Dossier; import fr.itldev.koya.model.impl.Preferences; import fr.itldev.koya.model.impl.User; import fr.itldev.koya.services.impl.util.CacheConfig; public class CacheManager implements InitializingBean, Serializable { /** * */ private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(CacheManager.class); private Cache<String, Permissions> permissionsCache; private CacheConfig permissionsCacheConfig; private Cache<Company, Preferences> companyPreferencesCache; private CacheConfig companyPreferencesCacheConfig; private Cache<User, List<KoyaNode>> userFavouritesCache; private CacheConfig userFavouritesCacheConfig; private Cache<KoyaNode, Boolean> nodeSharedWithKoyaClientCache; private CacheConfig nodeSharedWithKoyaClientCacheConfig; private Cache<KoyaNode, Boolean> nodeSharedWithKoyaPartnerCache; private CacheConfig nodeSharedWithKoyaPartnerCacheConfig; private Cache<String, List<Map<String, String>>> invitationsCache; private CacheConfig invitationsCacheConfig; private Cache<String, Boolean> isManagerCache; private CacheConfig isManagerCacheConfig; private Cache<User, List<String>> userGroupsCache; private CacheConfig userGroupsCacheConfig; private Cache<Dossier, Boolean> dossierConfidentialCache; private CacheConfig dossierConfidentialCacheConfig; public void setPermissionsCacheConfig(CacheConfig permissionsCacheConfig) { this.permissionsCacheConfig = permissionsCacheConfig; } public void setCompanyPreferencesCacheConfig( CacheConfig companyPreferencesCacheConfig) { this.companyPreferencesCacheConfig = companyPreferencesCacheConfig; } public void setUserFavouritesCacheConfig( CacheConfig userFavouritesCacheConfig) { this.userFavouritesCacheConfig = userFavouritesCacheConfig; } public void setNodeSharedWithKoyaClientCacheConfig( CacheConfig nodeSharedWithKoyaClientCacheConfig) { this.nodeSharedWithKoyaClientCacheConfig = nodeSharedWithKoyaClientCacheConfig; } public void setNodeSharedWithKoyaPartnerCacheConfig( CacheConfig nodeSharedWithKoyaPartnerCacheConfig) { this.nodeSharedWithKoyaPartnerCacheConfig = nodeSharedWithKoyaPartnerCacheConfig; } public void setInvitationsCacheConfig(CacheConfig invitationsCacheConfig) { this.invitationsCacheConfig = invitationsCacheConfig; } public void setIsManagerCacheConfig(CacheConfig isManagerCacheConfig) { this.isManagerCacheConfig = isManagerCacheConfig; } public void setUserGroupsCacheConfig(CacheConfig userGroupsCacheConfig) { this.userGroupsCacheConfig = userGroupsCacheConfig; } public void setDossierConfidentialCacheConfig( CacheConfig dossierConfidentialCacheConfig) { this.dossierConfidentialCacheConfig = dossierConfidentialCacheConfig; } @Override public void afterPropertiesSet() throws Exception { // if (permissionsCacheConfig == null) { permissionsCacheConfig = CacheConfig.noCache(); } permissionsCacheConfig.debugLogConfig("permissionsCache"); if (permissionsCacheConfig.getEnabled()) { permissionsCache = CacheBuilder .newBuilder() .maximumSize(permissionsCacheConfig.getMaxSize()) .expireAfterWrite( permissionsCacheConfig.getExpireAfterWriteSeconds(), TimeUnit.SECONDS).build(); } // if (companyPreferencesCacheConfig == null) { companyPreferencesCacheConfig = CacheConfig.noCache(); } companyPreferencesCacheConfig.debugLogConfig("companyPreferencesCache"); if (companyPreferencesCacheConfig.getEnabled()) { companyPreferencesCache = CacheBuilder .newBuilder() .maximumSize(companyPreferencesCacheConfig.getMaxSize()) .expireAfterWrite( companyPreferencesCacheConfig .getExpireAfterWriteSeconds(), TimeUnit.SECONDS).build(); } // if (userFavouritesCacheConfig == null) { userFavouritesCacheConfig = CacheConfig.noCache(); } userFavouritesCacheConfig.debugLogConfig("userFavouritesCache"); if (userFavouritesCacheConfig.getEnabled()) { userFavouritesCache = CacheBuilder .newBuilder() .maximumSize(userFavouritesCacheConfig.getMaxSize()) .expireAfterWrite( userFavouritesCacheConfig .getExpireAfterWriteSeconds(), TimeUnit.SECONDS).build(); } // if (nodeSharedWithKoyaClientCacheConfig == null) { nodeSharedWithKoyaClientCacheConfig = CacheConfig.noCache(); } nodeSharedWithKoyaClientCacheConfig .debugLogConfig("nodeSharedWithKoyaClientCache"); if (nodeSharedWithKoyaClientCacheConfig.getEnabled()) { nodeSharedWithKoyaClientCache = CacheBuilder .newBuilder() .maximumSize(nodeSharedWithKoyaClientCacheConfig.getMaxSize()) .expireAfterWrite( nodeSharedWithKoyaClientCacheConfig .getExpireAfterWriteSeconds(), TimeUnit.SECONDS).build(); } // if (nodeSharedWithKoyaPartnerCacheConfig == null) { nodeSharedWithKoyaPartnerCacheConfig = CacheConfig.noCache(); } nodeSharedWithKoyaPartnerCacheConfig .debugLogConfig("nodeSharedWithKoyaPartnerCache"); if (nodeSharedWithKoyaPartnerCacheConfig.getEnabled()) { nodeSharedWithKoyaPartnerCache = CacheBuilder .newBuilder() .maximumSize(nodeSharedWithKoyaPartnerCacheConfig.getMaxSize()) .expireAfterWrite( nodeSharedWithKoyaPartnerCacheConfig .getExpireAfterWriteSeconds(), TimeUnit.SECONDS).build(); } // if (invitationsCacheConfig == null) { invitationsCacheConfig = CacheConfig.noCache(); } invitationsCacheConfig.debugLogConfig("invitationsCache"); if (invitationsCacheConfig.getEnabled()) { invitationsCache = CacheBuilder .newBuilder() .maximumSize(invitationsCacheConfig.getMaxSize()) .expireAfterWrite( invitationsCacheConfig.getExpireAfterWriteSeconds(), TimeUnit.SECONDS).build(); } // if (isManagerCacheConfig == null) { isManagerCacheConfig = CacheConfig.noCache(); } isManagerCacheConfig.debugLogConfig("isManagerCache"); if (isManagerCacheConfig.getEnabled()) { isManagerCache = CacheBuilder .newBuilder() .maximumSize(isManagerCacheConfig.getMaxSize()) .expireAfterWrite( isManagerCacheConfig.getExpireAfterWriteSeconds(), TimeUnit.SECONDS).build(); } // if (userGroupsCacheConfig == null) { userGroupsCacheConfig = CacheConfig.noCache(); } userGroupsCacheConfig.debugLogConfig("userGroupsCache"); if (userGroupsCacheConfig.getEnabled()) { userGroupsCache = CacheBuilder .newBuilder() .maximumSize(userGroupsCacheConfig.getMaxSize()) .expireAfterWrite( userGroupsCacheConfig.getExpireAfterWriteSeconds(), TimeUnit.SECONDS).build(); } // if (dossierConfidentialCacheConfig == null) { dossierConfidentialCacheConfig = CacheConfig.noCache(); } dossierConfidentialCacheConfig .debugLogConfig("dossierConfidentialCache"); if (dossierConfidentialCacheConfig.getEnabled()) { dossierConfidentialCache = CacheBuilder .newBuilder() .maximumSize(dossierConfidentialCacheConfig.getMaxSize()) .expireAfterWrite( dossierConfidentialCacheConfig .getExpireAfterWriteSeconds(), TimeUnit.SECONDS).build(); } } /** * * ======= USER PERMISSIONS ======== * */ public Permissions getPermission(User u, NodeRef n) { Permissions p; if (permissionsCacheConfig.getEnabled()) { p = permissionsCache.getIfPresent(permissionKey(u, n)); if (p != null) { return p; } } return null; } public void setPermission(User u, NodeRef n, Permissions p) { if (permissionsCacheConfig.getEnabled()) { permissionsCache.put(permissionKey(u, n), p); } } public void revokePermission(User u, NodeRef n) { if (permissionsCacheConfig.getEnabled()) { permissionsCache.invalidate(permissionKey(u, n)); } } private String permissionKey(User u, NodeRef n) { return u.getUserName() + "-" + n.getId(); } /** * ======= Company Preferences ========== * */ public Preferences getCompanyPreferences(Company c) { Preferences p; if (companyPreferencesCacheConfig.getEnabled()) { p = companyPreferencesCache.getIfPresent(c); if (p != null) { return p; } } return null; } public void setCompanyPreferences(Company c, Preferences p) { if (companyPreferencesCacheConfig.getEnabled()) { companyPreferencesCache.put(c, p); } } public void revokeCompanyPreferences(Company c) { if (companyPreferencesCacheConfig.getEnabled()) { companyPreferencesCache.invalidate(c); } } /** * ======= User Favourites ========== * */ public List<KoyaNode> getUserFavourites(User u) { List<KoyaNode> f; if (userFavouritesCacheConfig.getEnabled()) { f = userFavouritesCache.getIfPresent(u); if (f != null) { return f; } } return null; } public void setUserFavourites(User u, List<KoyaNode> favourites) { if (userFavouritesCacheConfig.getEnabled()) { userFavouritesCache.put(u, favourites); } } public void revokeUserFavourites(User u) { if (userFavouritesCacheConfig.getEnabled()) { userFavouritesCache.invalidate(u); } } /** * ======= Node Shared With Koya Client ========== * */ public Boolean getNodeSharedWithKoyaClient(KoyaNode i) { Boolean s; if (nodeSharedWithKoyaClientCacheConfig.getEnabled()) { s = nodeSharedWithKoyaClientCache.getIfPresent(i); if (s != null) { return s; } } return null; } public void setNodeSharedWithKoyaClient(KoyaNode i, Boolean s) { if (nodeSharedWithKoyaClientCacheConfig.getEnabled()) { nodeSharedWithKoyaClientCache.put(i, s); } } public void revokeNodeSharedWithKoyaClient(KoyaNode i) { if (nodeSharedWithKoyaClientCacheConfig.getEnabled()) { nodeSharedWithKoyaClientCache.invalidate(i); } } /** * ======= Node Shared With Koya Partner ========== * */ public Boolean getNodeSharedWithKoyaPartner(KoyaNode i) { Boolean s; if (nodeSharedWithKoyaPartnerCacheConfig.getEnabled()) { s = nodeSharedWithKoyaPartnerCache.getIfPresent(i); if (s != null) { return s; } } return null; } public void setNodeSharedWithKoyaPartner(KoyaNode i, Boolean s) { if (nodeSharedWithKoyaPartnerCacheConfig.getEnabled()) { nodeSharedWithKoyaPartnerCache.put(i, s); } } public void revokeNodeSharedWithKoyaPartner(KoyaNode i) { if (nodeSharedWithKoyaPartnerCacheConfig.getEnabled()) { nodeSharedWithKoyaPartnerCache.invalidate(i); } } /** * ======= Invitations ========== * */ public List<Map<String, String>> getInvitations(String userName) { List<Map<String, String>> invitations; if (invitationsCacheConfig.getEnabled()) { invitations = invitationsCache.getIfPresent(userName); if (invitations != null) { return invitations; } } return null; } public void setInvitations(String userName, List<Map<String, String>> invitations) { if (invitationsCacheConfig.getEnabled()) { invitationsCache.put(userName, invitations); } } public void revokeInvitations(String userName) { if (invitationsCacheConfig.getEnabled()) { invitationsCache.invalidate(userName); } } /** * * ======= USER IS MANAGER ======== * */ public Boolean getIsManager(User u, Company c) { Boolean isManager; if (isManagerCacheConfig.getEnabled()) { isManager = isManagerCache.getIfPresent(isManagerKey(u, c)); if (isManager != null) { return isManager; } } return null; } public void setIsManager(User u, Company c, Boolean isManager) { if (isManagerCacheConfig.getEnabled()) { isManagerCache.put(isManagerKey(u, c), isManager); } } public void revokeIsManager(User u, Company c) { if (isManagerCacheConfig.getEnabled()) { isManagerCache.invalidate(isManagerKey(u, c)); } } private String isManagerKey(User u, Company c) { return u.getUserName() + "-" + c.getNodeRef().getId(); } /** * * ======= User GROUPS ======== * */ public List<String> getUserGroups(User u) { List<String> userGroups; if (userGroupsCacheConfig.getEnabled()) { userGroups = userGroupsCache.getIfPresent(u); if (userGroups != null) { return userGroups; } } return null; } public void setUserGroups(User u, List<String> userGroups) { if (userGroupsCacheConfig.getEnabled()) { userGroupsCache.put(u, userGroups); } } public void revokeUserGroups(User u) { if (userGroupsCacheConfig.getEnabled()) { userGroupsCache.invalidate(u); } } /** * * ======= Dossier Confidential ======== * */ public Boolean getDossierConfidential(Dossier d) { Boolean confidential; if (dossierConfidentialCacheConfig.getEnabled()) { confidential = dossierConfidentialCache.getIfPresent(d); if (confidential != null) { return confidential; } } return null; } public void setDossierConfidential(Dossier d, Boolean confidential) { if (dossierConfidentialCacheConfig.getEnabled()) { dossierConfidentialCache.put(d, confidential); } } public void revokeDossierConfidential(Dossier d) { if (dossierConfidentialCacheConfig.getEnabled()) { dossierConfidentialCache.invalidate(d); } } /** * * =================== Cache Dump ======================= * */ public void dumpCacheStatistics() { logger.info("[permissionsCache Stats] " + permissionsCache.stats().toString()); logger.info("[companyPreferencesCache Stats] " + companyPreferencesCache.stats().toString()); logger.info("[userFavouritesCache Stats] " + userFavouritesCache.stats().toString()); logger.info("[nodeSharedWithKoyaClientCache Stats] " + nodeSharedWithKoyaClientCache.stats().toString()); logger.info("[invitationsCache Stats] " + invitationsCache.stats().toString()); logger.info("[isManagerCache Stats] " + isManagerCache.stats().toString()); logger.info("[userGroupsCache Stats] " + userGroupsCache.stats().toString()); logger.info("[dossierConfidentialCache Stats] " + dossierConfidentialCache.stats().toString()); } }