Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package net.seibertmedia.confluence.appcenter.cache;
- import java.util.List;
- import java.util.concurrent.TimeUnit;
- import com.atlassian.cache.CacheLoader;
- import com.atlassian.cache.CacheSettings;
- import com.atlassian.cache.CacheSettingsBuilder;
- import com.atlassian.confluence.user.ConfluenceUser;
- import lombok.Builder;
- import lombok.Getter;
- import lombok.ToString;
- import net.seibertmedia.confluence.appcenter.category.CategoryDto;
- import net.seibertmedia.confluence.appcenter.dto.AppDto;
- /**
- * Compilation of all used cache keys in the plugin.
- * If there is a new cache necessary, add the key here.
- */
- @Getter
- @Builder
- @ToString(of = "cacheKey")
- public class CacheDefinition<K, V> {
- /**
- * The default uses a local cache, because the current implementations would require a major rewrite of the cache usage.
- * A replication via copy is not possible because lists of DTOs are stored and lists cannot be replicated via copy across a cluster.
- * So to have a caching in cluster the default defines local caches and it defines invalidation messages, if any future cache is defined as remote.
- */
- private static final CacheSettings DEFAULT_CACHE_SETTINGS = new CacheSettingsBuilder()
- .local()
- .replicateViaInvalidation()
- .expireAfterWrite(1, TimeUnit.DAYS)
- .flushable()
- .maxEntries(1000)
- .build();
- /**
- * Indicator if cache content is filtered by profile allCaches of a user
- */
- enum ProfileDependentCacheContent {
- YES,
- NO
- }
- /**
- * Apps for a specific user (cached by user)
- */
- static final CacheDefinition<ConfluenceUser, List<AppDto>> USER_APPS = new CacheDefinitionBuilder<ConfluenceUser, List<AppDto>>()
- .cacheKey("net.seibertmedia.confluence.appcenter.apps.user.v2")
- .keyType(ConfluenceUser.class)
- .containsApps(true)
- .valueIsDependentOnProfile(ProfileDependentCacheContent.YES)
- .build();
- /**
- * Recommended apps for a specific user (cached by user)
- */
- static final CacheDefinition<ConfluenceUser, List<AppDto>> RECOMMENDED_APPS = new CacheDefinitionBuilder<ConfluenceUser, List<AppDto>>()
- .cacheKey("net.seibertmedia.confluence.appcenter.apps.recommended.v2")
- .keyType(ConfluenceUser.class)
- .containsApps(true)
- .valueIsDependentOnProfile(ProfileDependentCacheContent.YES)
- .build();
- /**
- * Mandatory apps for a specific user (cached by user)
- */
- static final CacheDefinition<ConfluenceUser, List<AppDto>> MANDATORY_APPS = new CacheDefinitionBuilder<ConfluenceUser, List<AppDto>>()
- .cacheKey("net.seibertmedia.confluence.appcenter.apps.mandatory.v2")
- .keyType(ConfluenceUser.class)
- .containsApps(true)
- .valueIsDependentOnProfile(ProfileDependentCacheContent.YES)
- .build();
- /**
- * Visibility restricted apps for a specific user (cached by user)
- */
- static final CacheDefinition<ConfluenceUser, List<AppDto>> VISIBILITY_RESTRICTED_APPS = new CacheDefinitionBuilder<ConfluenceUser, List<AppDto>>()
- .cacheKey("net.seibertmedia.confluence.appcenter.apps.visibility.restricted.v2")
- .keyType(ConfluenceUser.class)
- .containsApps(true)
- .valueIsDependentOnProfile(ProfileDependentCacheContent.YES)
- .build();
- /**
- * All apps (constant key)
- */
- static final CacheDefinition<String, List<AppDto>> ALL_APPS = new CacheDefinitionBuilder<String, List<AppDto>>()
- .cacheKey("net.seibertmedia.confluence.appcenter.allapps.v2")
- .keyType(String.class)
- .containsApps(true)
- .valueIsDependentOnProfile(ProfileDependentCacheContent.NO)
- .cacheSettings(new CacheSettingsBuilder(DEFAULT_CACHE_SETTINGS).maxEntries(1).build())
- .build();
- /**
- * All categories (cached by their ID)
- */
- static final CacheDefinition<Long, CategoryDto> CATEGORIES = new CacheDefinitionBuilder<Long, CategoryDto>()
- .cacheKey("net.seibertmedia.confluence.appcenter.categories.v2")
- .keyType(Long.class)
- .valueIsDependentOnProfile(ProfileDependentCacheContent.NO)
- .build();
- /**
- * App icons (cached by app id)
- * Still requires a {@link CacheLoader} to be set.
- * Because this cache defines a loader, the cluster cache may be remote, since each node can load the app icon itself without using <code>put</code>.
- */
- static final CacheDefinitionBuilder<String, byte[]> APP_ICONS_CACHE_BUILDER = new CacheDefinitionBuilder<String, byte[]>()
- .cacheKey("net.seibertmedia.confluence.appcenter.apps.icons.v2")
- .keyType(String.class)
- .valueIsDependentOnProfile(ProfileDependentCacheContent.NO)
- .cacheSettings(new CacheSettingsBuilder(DEFAULT_CACHE_SETTINGS)
- .remote()
- .maxEntries(500)
- .build());
- private final String cacheKey;
- private final Class<K> keyType;
- private final boolean containsApps;
- private final ProfileDependentCacheContent valueIsDependentOnProfile;
- private final CacheLoader<K, V> cacheLoader;
- @Builder.Default
- private CacheSettings cacheSettings = DEFAULT_CACHE_SETTINGS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement