James Moger edited this page Nov 20, 2015 · 1 revision

About

Fathom-JCache provides your application with seamless caching integration.

Installation

Add the Fathom-JCache artifact...

<dependency>
<groupId>com.gitblit.fathom</groupId>
<artifactId>fathom-jcache</artifactId>
<version>${fathom.version}</version>
</dependency>

... and also add your preferred JCache provider:

ProviderArtifact
Hazelcastcom.hazelcast:hazelcast
Infinispanorg.infinispan:infinispan-jcache
Ehcacheorg.ehcache:jcache

Layout

YourApp
└── src
└── main
└── java
└── conf
└── Caches.java

!!! Note This module depends on the value of the application.package setting. If you have specified an application package then your Caches class must be ${package}/conf/Caches.java.

Configuration

You don't have to configure your JCache provider to use it. Each provider ships with default settings which allows you to get up-and-running very quickly.

If you need to specify a provider-specific configuration you may do so.

# Ehcache configuration file# see http://ehcache.org/documentation# specify 'jcache' to default to the Jcache default configuration# ehcache.configurationFile = "classpath:conf/ehcache.xml"ehcache.configurationFile = "jcache"# Infinispan configuration file# see http://infinispan.org/docs/7.0.x/user_guide/user_guide.html# specify 'jcache' to default to the Jcache default configuration# infinispan.configurationFile = "classpath:conf/infinispan.xml"infinispan.configurationFile = "jcache"# Hazelcast configuration file# see http://hazelcast.org/documentation# specify 'jcache' to default to the Jcache default configuration# hazelcast.configurationFile = "classpath:conf/hazelcast.xml"hazelcast.configurationFile = "jcache"

Multiple Providers on the classpath

In the event that you have multiple providers on the classpath at the same time, Fathom will pick the first one loaded by the JVM unless you specify a preference.

# Set the preferred JCache provider.# If unspecified, the first provider discovered will be used.# You may specify a full provider classname or you may specify# a nickname for an already registered JCache implementation# such as: ehcache, infinispan, hazelcastjcache.preferredProvider = ""

One scenario where you might have multiple providers is using one for DEV mode and a different one for PROD mode. This would be the caching analog of using an SQL db like SQLite or H2 for development and PostgreSQL for production.

Usage

Defining your Caches

Create a conf/Caches.java class.

packageconf;
publicclassCachesextendsCachesModule {
publicstaticfinalStringEMPLOYEE_CACHE = "employeeCache";
@Overrideprotectedvoidsetup(Settingssettings, CacheManagercacheManager) {
// example employee cachecacheManager.createCache(EMPLOYEE_CACHE, newMutableConfiguration()
.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(Duration.ONE_MINUTE))
.setStatisticsEnabled(true)
.setStoreByValue(true));
}
}

Using your Caches

The most elegant way to use Fathom's JCache integration is with annotations.

In the following non-functional example we are annotating our employee DAO singleton to specify that all methods in this DAO access the EMPLOYEE_CACHE defined in our conf/Caches.java class.

We are also annotating the get, getAll, delete, and save methods. Calling these methods will transparently manage the cache.

@Singleton@CacheDefaults(cacheName = Caches.EMPLOYEE_CACHE)
publicclassEmployeeDao {
privatestaticfinalLoggerlog = LoggerFactory.getLogger(EmployeeDao.class);
publicEmployeeDao() {
}
@CacheResultpublicEmployeeget(intid) {
log.info("Getting employee #{} by id", id);
Employeeemployee = employees.get(id);
returnemployee;
}
@CacheResultpublicList<Employee> getAll() {
log.info("Getting all employees");
returnnewArrayList<>(employees.values());
}
@CacheRemoveAllpublicEmployeedelete(intid) {
Employeeemployee = employees.get(id);
employees.remove(id);
returnemployee;
}
@CacheRemoveAllpublicEmployeesave(Employeeemployee) {
returnput(employee);
}
}

!!! Warning It's important to note that the JCache method interceptors, like all Guice method interceptors, are bound by the same limitations - including method scope.

- Classes must be public or package-private.
- Classes must be non-final
- Methods must be public, package-private or protected
- Methods must be non-final
- Instances must be created by Guice by an @Inject-annotated or no-argument constructor It is not possible to use method interception on instances that aren't constructed by Guice.

Viewing and Managing your Caches

Fathom does not provide a mechansim to view & manage your caches, however, several JCache providers register MBeans which allow cache viewing and management via JConsole or VisualVM.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
James Moger edited this page Nov 20, 2015 · 1 revision

About

Fathom-JCache provides your application with seamless caching integration.

Installation

Add the Fathom-JCache artifact...

<dependency>
<groupId>com.gitblit.fathom</groupId>
<artifactId>fathom-jcache</artifactId>
<version>${fathom.version}</version>
</dependency>

... and also add your preferred JCache provider:

ProviderArtifact
Hazelcastcom.hazelcast:hazelcast
Infinispanorg.infinispan:infinispan-jcache
Ehcacheorg.ehcache:jcache

Layout

YourApp
└── src
└── main
└── java
└── conf
└── Caches.java

!!! Note This module depends on the value of the application.package setting. If you have specified an application package then your Caches class must be ${package}/conf/Caches.java.

Configuration

You don't have to configure your JCache provider to use it. Each provider ships with default settings which allows you to get up-and-running very quickly.

If you need to specify a provider-specific configuration you may do so.

# Ehcache configuration file# see http://ehcache.org/documentation# specify 'jcache' to default to the Jcache default configuration# ehcache.configurationFile = "classpath:conf/ehcache.xml"ehcache.configurationFile = "jcache"# Infinispan configuration file# see http://infinispan.org/docs/7.0.x/user_guide/user_guide.html# specify 'jcache' to default to the Jcache default configuration# infinispan.configurationFile = "classpath:conf/infinispan.xml"infinispan.configurationFile = "jcache"# Hazelcast configuration file# see http://hazelcast.org/documentation# specify 'jcache' to default to the Jcache default configuration# hazelcast.configurationFile = "classpath:conf/hazelcast.xml"hazelcast.configurationFile = "jcache"

Multiple Providers on the classpath

In the event that you have multiple providers on the classpath at the same time, Fathom will pick the first one loaded by the JVM unless you specify a preference.

# Set the preferred JCache provider.# If unspecified, the first provider discovered will be used.# You may specify a full provider classname or you may specify# a nickname for an already registered JCache implementation# such as: ehcache, infinispan, hazelcastjcache.preferredProvider = ""

One scenario where you might have multiple providers is using one for DEV mode and a different one for PROD mode. This would be the caching analog of using an SQL db like SQLite or H2 for development and PostgreSQL for production.

Usage

Defining your Caches

Create a conf/Caches.java class.

packageconf;
publicclassCachesextendsCachesModule {
publicstaticfinalStringEMPLOYEE_CACHE = "employeeCache";
@Overrideprotectedvoidsetup(Settingssettings, CacheManagercacheManager) {
// example employee cachecacheManager.createCache(EMPLOYEE_CACHE, newMutableConfiguration()
.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(Duration.ONE_MINUTE))
.setStatisticsEnabled(true)
.setStoreByValue(true));
}
}

Using your Caches

The most elegant way to use Fathom's JCache integration is with annotations.

In the following non-functional example we are annotating our employee DAO singleton to specify that all methods in this DAO access the EMPLOYEE_CACHE defined in our conf/Caches.java class.

We are also annotating the get, getAll, delete, and save methods. Calling these methods will transparently manage the cache.

@Singleton@CacheDefaults(cacheName = Caches.EMPLOYEE_CACHE)
publicclassEmployeeDao {
privatestaticfinalLoggerlog = LoggerFactory.getLogger(EmployeeDao.class);
publicEmployeeDao() {
}
@CacheResultpublicEmployeeget(intid) {
log.info("Getting employee #{} by id", id);
Employeeemployee = employees.get(id);
returnemployee;
}
@CacheResultpublicList<Employee> getAll() {
log.info("Getting all employees");
returnnewArrayList<>(employees.values());
}
@CacheRemoveAllpublicEmployeedelete(intid) {
Employeeemployee = employees.get(id);
employees.remove(id);
returnemployee;
}
@CacheRemoveAllpublicEmployeesave(Employeeemployee) {
returnput(employee);
}
}

!!! Warning It's important to note that the JCache method interceptors, like all Guice method interceptors, are bound by the same limitations - including method scope.

- Classes must be public or package-private.
- Classes must be non-final
- Methods must be public, package-private or protected
- Methods must be non-final
- Instances must be created by Guice by an @Inject-annotated or no-argument constructor It is not possible to use method interception on instances that aren't constructed by Guice.

Viewing and Managing your Caches

Fathom does not provide a mechansim to view & manage your caches, however, several JCache providers register MBeans which allow cache viewing and management via JConsole or VisualVM.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
James Moger edited this page Nov 20, 2015 · 1 revision

About

Fathom-JCache provides your application with seamless caching integration.

Installation

Add the Fathom-JCache artifact...

<dependency>
<groupId>com.gitblit.fathom</groupId>
<artifactId>fathom-jcache</artifactId>
<version>${fathom.version}</version>
</dependency>

... and also add your preferred JCache provider:

ProviderArtifact
Hazelcastcom.hazelcast:hazelcast
Infinispanorg.infinispan:infinispan-jcache
Ehcacheorg.ehcache:jcache

Layout

YourApp
└── src
└── main
└── java
└── conf
└── Caches.java

!!! Note This module depends on the value of the application.package setting. If you have specified an application package then your Caches class must be ${package}/conf/Caches.java.

Configuration

You don't have to configure your JCache provider to use it. Each provider ships with default settings which allows you to get up-and-running very quickly.

If you need to specify a provider-specific configuration you may do so.

# Ehcache configuration file# see http://ehcache.org/documentation# specify 'jcache' to default to the Jcache default configuration# ehcache.configurationFile = "classpath:conf/ehcache.xml"ehcache.configurationFile = "jcache"# Infinispan configuration file# see http://infinispan.org/docs/7.0.x/user_guide/user_guide.html# specify 'jcache' to default to the Jcache default configuration# infinispan.configurationFile = "classpath:conf/infinispan.xml"infinispan.configurationFile = "jcache"# Hazelcast configuration file# see http://hazelcast.org/documentation# specify 'jcache' to default to the Jcache default configuration# hazelcast.configurationFile = "classpath:conf/hazelcast.xml"hazelcast.configurationFile = "jcache"

Multiple Providers on the classpath

In the event that you have multiple providers on the classpath at the same time, Fathom will pick the first one loaded by the JVM unless you specify a preference.

# Set the preferred JCache provider.# If unspecified, the first provider discovered will be used.# You may specify a full provider classname or you may specify# a nickname for an already registered JCache implementation# such as: ehcache, infinispan, hazelcastjcache.preferredProvider = ""

One scenario where you might have multiple providers is using one for DEV mode and a different one for PROD mode. This would be the caching analog of using an SQL db like SQLite or H2 for development and PostgreSQL for production.

Usage

Defining your Caches

Create a conf/Caches.java class.

packageconf;
publicclassCachesextendsCachesModule {
publicstaticfinalStringEMPLOYEE_CACHE = "employeeCache";
@Overrideprotectedvoidsetup(Settingssettings, CacheManagercacheManager) {
// example employee cachecacheManager.createCache(EMPLOYEE_CACHE, newMutableConfiguration()
.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(Duration.ONE_MINUTE))
.setStatisticsEnabled(true)
.setStoreByValue(true));
}
}

Using your Caches

The most elegant way to use Fathom's JCache integration is with annotations.

In the following non-functional example we are annotating our employee DAO singleton to specify that all methods in this DAO access the EMPLOYEE_CACHE defined in our conf/Caches.java class.

We are also annotating the get, getAll, delete, and save methods. Calling these methods will transparently manage the cache.

@Singleton@CacheDefaults(cacheName = Caches.EMPLOYEE_CACHE)
publicclassEmployeeDao {
privatestaticfinalLoggerlog = LoggerFactory.getLogger(EmployeeDao.class);
publicEmployeeDao() {
}
@CacheResultpublicEmployeeget(intid) {
log.info("Getting employee #{} by id", id);
Employeeemployee = employees.get(id);
returnemployee;
}
@CacheResultpublicList<Employee> getAll() {
log.info("Getting all employees");
returnnewArrayList<>(employees.values());
}
@CacheRemoveAllpublicEmployeedelete(intid) {
Employeeemployee = employees.get(id);
employees.remove(id);
returnemployee;
}
@CacheRemoveAllpublicEmployeesave(Employeeemployee) {
returnput(employee);
}
}

!!! Warning It's important to note that the JCache method interceptors, like all Guice method interceptors, are bound by the same limitations - including method scope.

- Classes must be public or package-private.
- Classes must be non-final
- Methods must be public, package-private or protected
- Methods must be non-final
- Instances must be created by Guice by an @Inject-annotated or no-argument constructor It is not possible to use method interception on instances that aren't constructed by Guice.

Viewing and Managing your Caches

Fathom does not provide a mechansim to view & manage your caches, however, several JCache providers register MBeans which allow cache viewing and management via JConsole or VisualVM.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
James Moger edited this page Nov 20, 2015 · 1 revision

About

Fathom-JCache provides your application with seamless caching integration.

Installation

Add the Fathom-JCache artifact...

<dependency>
<groupId>com.gitblit.fathom</groupId>
<artifactId>fathom-jcache</artifactId>
<version>${fathom.version}</version>
</dependency>

... and also add your preferred JCache provider:

ProviderArtifact
Hazelcastcom.hazelcast:hazelcast
Infinispanorg.infinispan:infinispan-jcache
Ehcacheorg.ehcache:jcache

Layout

YourApp
└── src
└── main
└── java
└── conf
└── Caches.java

!!! Note This module depends on the value of the application.package setting. If you have specified an application package then your Caches class must be ${package}/conf/Caches.java.

Configuration

You don't have to configure your JCache provider to use it. Each provider ships with default settings which allows you to get up-and-running very quickly.

If you need to specify a provider-specific configuration you may do so.

# Ehcache configuration file# see http://ehcache.org/documentation# specify 'jcache' to default to the Jcache default configuration# ehcache.configurationFile = "classpath:conf/ehcache.xml"ehcache.configurationFile = "jcache"# Infinispan configuration file# see http://infinispan.org/docs/7.0.x/user_guide/user_guide.html# specify 'jcache' to default to the Jcache default configuration# infinispan.configurationFile = "classpath:conf/infinispan.xml"infinispan.configurationFile = "jcache"# Hazelcast configuration file# see http://hazelcast.org/documentation# specify 'jcache' to default to the Jcache default configuration# hazelcast.configurationFile = "classpath:conf/hazelcast.xml"hazelcast.configurationFile = "jcache"

Multiple Providers on the classpath

In the event that you have multiple providers on the classpath at the same time, Fathom will pick the first one loaded by the JVM unless you specify a preference.

# Set the preferred JCache provider.# If unspecified, the first provider discovered will be used.# You may specify a full provider classname or you may specify# a nickname for an already registered JCache implementation# such as: ehcache, infinispan, hazelcastjcache.preferredProvider = ""

One scenario where you might have multiple providers is using one for DEV mode and a different one for PROD mode. This would be the caching analog of using an SQL db like SQLite or H2 for development and PostgreSQL for production.

Usage

Defining your Caches

Create a conf/Caches.java class.

packageconf;
publicclassCachesextendsCachesModule {
publicstaticfinalStringEMPLOYEE_CACHE = "employeeCache";
@Overrideprotectedvoidsetup(Settingssettings, CacheManagercacheManager) {
// example employee cachecacheManager.createCache(EMPLOYEE_CACHE, newMutableConfiguration()
.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(Duration.ONE_MINUTE))
.setStatisticsEnabled(true)
.setStoreByValue(true));
}
}

Using your Caches

The most elegant way to use Fathom's JCache integration is with annotations.

In the following non-functional example we are annotating our employee DAO singleton to specify that all methods in this DAO access the EMPLOYEE_CACHE defined in our conf/Caches.java class.

We are also annotating the get, getAll, delete, and save methods. Calling these methods will transparently manage the cache.

@Singleton@CacheDefaults(cacheName = Caches.EMPLOYEE_CACHE)
publicclassEmployeeDao {
privatestaticfinalLoggerlog = LoggerFactory.getLogger(EmployeeDao.class);
publicEmployeeDao() {
}
@CacheResultpublicEmployeeget(intid) {
log.info("Getting employee #{} by id", id);
Employeeemployee = employees.get(id);
returnemployee;
}
@CacheResultpublicList<Employee> getAll() {
log.info("Getting all employees");
returnnewArrayList<>(employees.values());
}
@CacheRemoveAllpublicEmployeedelete(intid) {
Employeeemployee = employees.get(id);
employees.remove(id);
returnemployee;
}
@CacheRemoveAllpublicEmployeesave(Employeeemployee) {
returnput(employee);
}
}

!!! Warning It's important to note that the JCache method interceptors, like all Guice method interceptors, are bound by the same limitations - including method scope.

- Classes must be public or package-private.
- Classes must be non-final
- Methods must be public, package-private or protected
- Methods must be non-final
- Instances must be created by Guice by an @Inject-annotated or no-argument constructor It is not possible to use method interception on instances that aren't constructed by Guice.

Viewing and Managing your Caches

Fathom does not provide a mechansim to view & manage your caches, however, several JCache providers register MBeans which allow cache viewing and management via JConsole or VisualVM.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
James Moger edited this page Nov 20, 2015 · 1 revision

About

Fathom-JCache provides your application with seamless caching integration.

Installation

Add the Fathom-JCache artifact...

<dependency>
<groupId>com.gitblit.fathom</groupId>
<artifactId>fathom-jcache</artifactId>
<version>${fathom.version}</version>
</dependency>

... and also add your preferred JCache provider:

ProviderArtifact
Hazelcastcom.hazelcast:hazelcast
Infinispanorg.infinispan:infinispan-jcache
Ehcacheorg.ehcache:jcache

Layout

YourApp
└── src
└── main
└── java
└── conf
└── Caches.java

!!! Note This module depends on the value of the application.package setting. If you have specified an application package then your Caches class must be ${package}/conf/Caches.java.

Configuration

You don't have to configure your JCache provider to use it. Each provider ships with default settings which allows you to get up-and-running very quickly.

If you need to specify a provider-specific configuration you may do so.

# Ehcache configuration file# see http://ehcache.org/documentation# specify 'jcache' to default to the Jcache default configuration# ehcache.configurationFile = "classpath:conf/ehcache.xml"ehcache.configurationFile = "jcache"# Infinispan configuration file# see http://infinispan.org/docs/7.0.x/user_guide/user_guide.html# specify 'jcache' to default to the Jcache default configuration# infinispan.configurationFile = "classpath:conf/infinispan.xml"infinispan.configurationFile = "jcache"# Hazelcast configuration file# see http://hazelcast.org/documentation# specify 'jcache' to default to the Jcache default configuration# hazelcast.configurationFile = "classpath:conf/hazelcast.xml"hazelcast.configurationFile = "jcache"

Multiple Providers on the classpath

In the event that you have multiple providers on the classpath at the same time, Fathom will pick the first one loaded by the JVM unless you specify a preference.

# Set the preferred JCache provider.# If unspecified, the first provider discovered will be used.# You may specify a full provider classname or you may specify# a nickname for an already registered JCache implementation# such as: ehcache, infinispan, hazelcastjcache.preferredProvider = ""

One scenario where you might have multiple providers is using one for DEV mode and a different one for PROD mode. This would be the caching analog of using an SQL db like SQLite or H2 for development and PostgreSQL for production.

Usage

Defining your Caches

Create a conf/Caches.java class.

packageconf;
publicclassCachesextendsCachesModule {
publicstaticfinalStringEMPLOYEE_CACHE = "employeeCache";
@Overrideprotectedvoidsetup(Settingssettings, CacheManagercacheManager) {
// example employee cachecacheManager.createCache(EMPLOYEE_CACHE, newMutableConfiguration()
.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(Duration.ONE_MINUTE))
.setStatisticsEnabled(true)
.setStoreByValue(true));
}
}

Using your Caches

The most elegant way to use Fathom's JCache integration is with annotations.

In the following non-functional example we are annotating our employee DAO singleton to specify that all methods in this DAO access the EMPLOYEE_CACHE defined in our conf/Caches.java class.

We are also annotating the get, getAll, delete, and save methods. Calling these methods will transparently manage the cache.

@Singleton@CacheDefaults(cacheName = Caches.EMPLOYEE_CACHE)
publicclassEmployeeDao {
privatestaticfinalLoggerlog = LoggerFactory.getLogger(EmployeeDao.class);
publicEmployeeDao() {
}
@CacheResultpublicEmployeeget(intid) {
log.info("Getting employee #{} by id", id);
Employeeemployee = employees.get(id);
returnemployee;
}
@CacheResultpublicList<Employee> getAll() {
log.info("Getting all employees");
returnnewArrayList<>(employees.values());
}
@CacheRemoveAllpublicEmployeedelete(intid) {
Employeeemployee = employees.get(id);
employees.remove(id);
returnemployee;
}
@CacheRemoveAllpublicEmployeesave(Employeeemployee) {
returnput(employee);
}
}

!!! Warning It's important to note that the JCache method interceptors, like all Guice method interceptors, are bound by the same limitations - including method scope.

- Classes must be public or package-private.
- Classes must be non-final
- Methods must be public, package-private or protected
- Methods must be non-final
- Instances must be created by Guice by an @Inject-annotated or no-argument constructor It is not possible to use method interception on instances that aren't constructed by Guice.

Viewing and Managing your Caches

Fathom does not provide a mechansim to view & manage your caches, however, several JCache providers register MBeans which allow cache viewing and management via JConsole or VisualVM.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
James Moger edited this page Nov 20, 2015 · 1 revision

About

Fathom-JCache provides your application with seamless caching integration.

Installation

Add the Fathom-JCache artifact...

<dependency>
<groupId>com.gitblit.fathom</groupId>
<artifactId>fathom-jcache</artifactId>
<version>${fathom.version}</version>
</dependency>

... and also add your preferred JCache provider:

ProviderArtifact
Hazelcastcom.hazelcast:hazelcast
Infinispanorg.infinispan:infinispan-jcache
Ehcacheorg.ehcache:jcache

Layout

YourApp
└── src
└── main
└── java
└── conf
└── Caches.java

!!! Note This module depends on the value of the application.package setting. If you have specified an application package then your Caches class must be ${package}/conf/Caches.java.

Configuration

You don't have to configure your JCache provider to use it. Each provider ships with default settings which allows you to get up-and-running very quickly.

If you need to specify a provider-specific configuration you may do so.

# Ehcache configuration file# see http://ehcache.org/documentation# specify 'jcache' to default to the Jcache default configuration# ehcache.configurationFile = "classpath:conf/ehcache.xml"ehcache.configurationFile = "jcache"# Infinispan configuration file# see http://infinispan.org/docs/7.0.x/user_guide/user_guide.html# specify 'jcache' to default to the Jcache default configuration# infinispan.configurationFile = "classpath:conf/infinispan.xml"infinispan.configurationFile = "jcache"# Hazelcast configuration file# see http://hazelcast.org/documentation# specify 'jcache' to default to the Jcache default configuration# hazelcast.configurationFile = "classpath:conf/hazelcast.xml"hazelcast.configurationFile = "jcache"

Multiple Providers on the classpath

In the event that you have multiple providers on the classpath at the same time, Fathom will pick the first one loaded by the JVM unless you specify a preference.

# Set the preferred JCache provider.# If unspecified, the first provider discovered will be used.# You may specify a full provider classname or you may specify# a nickname for an already registered JCache implementation# such as: ehcache, infinispan, hazelcastjcache.preferredProvider = ""

One scenario where you might have multiple providers is using one for DEV mode and a different one for PROD mode. This would be the caching analog of using an SQL db like SQLite or H2 for development and PostgreSQL for production.

Usage

Defining your Caches

Create a conf/Caches.java class.

packageconf;
publicclassCachesextendsCachesModule {
publicstaticfinalStringEMPLOYEE_CACHE = "employeeCache";
@Overrideprotectedvoidsetup(Settingssettings, CacheManagercacheManager) {
// example employee cachecacheManager.createCache(EMPLOYEE_CACHE, newMutableConfiguration()
.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(Duration.ONE_MINUTE))
.setStatisticsEnabled(true)
.setStoreByValue(true));
}
}

Using your Caches

The most elegant way to use Fathom's JCache integration is with annotations.

In the following non-functional example we are annotating our employee DAO singleton to specify that all methods in this DAO access the EMPLOYEE_CACHE defined in our conf/Caches.java class.

We are also annotating the get, getAll, delete, and save methods. Calling these methods will transparently manage the cache.

@Singleton@CacheDefaults(cacheName = Caches.EMPLOYEE_CACHE)
publicclassEmployeeDao {
privatestaticfinalLoggerlog = LoggerFactory.getLogger(EmployeeDao.class);
publicEmployeeDao() {
}
@CacheResultpublicEmployeeget(intid) {
log.info("Getting employee #{} by id", id);
Employeeemployee = employees.get(id);
returnemployee;
}
@CacheResultpublicList<Employee> getAll() {
log.info("Getting all employees");
returnnewArrayList<>(employees.values());
}
@CacheRemoveAllpublicEmployeedelete(intid) {
Employeeemployee = employees.get(id);
employees.remove(id);
returnemployee;
}
@CacheRemoveAllpublicEmployeesave(Employeeemployee) {
returnput(employee);
}
}

!!! Warning It's important to note that the JCache method interceptors, like all Guice method interceptors, are bound by the same limitations - including method scope.

- Classes must be public or package-private.
- Classes must be non-final
- Methods must be public, package-private or protected
- Methods must be non-final
- Instances must be created by Guice by an @Inject-annotated or no-argument constructor It is not possible to use method interception on instances that aren't constructed by Guice.

Viewing and Managing your Caches

Fathom does not provide a mechansim to view & manage your caches, however, several JCache providers register MBeans which allow cache viewing and management via JConsole or VisualVM.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
James Moger edited this page Nov 20, 2015 · 1 revision

About

Fathom-JCache provides your application with seamless caching integration.

Installation

Add the Fathom-JCache artifact...

<dependency>
<groupId>com.gitblit.fathom</groupId>
<artifactId>fathom-jcache</artifactId>
<version>${fathom.version}</version>
</dependency>

... and also add your preferred JCache provider:

ProviderArtifact
Hazelcastcom.hazelcast:hazelcast
Infinispanorg.infinispan:infinispan-jcache
Ehcacheorg.ehcache:jcache

Layout

YourApp
└── src
└── main
└── java
└── conf
└── Caches.java

!!! Note This module depends on the value of the application.package setting. If you have specified an application package then your Caches class must be ${package}/conf/Caches.java.

Configuration

You don't have to configure your JCache provider to use it. Each provider ships with default settings which allows you to get up-and-running very quickly.

If you need to specify a provider-specific configuration you may do so.

# Ehcache configuration file# see http://ehcache.org/documentation# specify 'jcache' to default to the Jcache default configuration# ehcache.configurationFile = "classpath:conf/ehcache.xml"ehcache.configurationFile = "jcache"# Infinispan configuration file# see http://infinispan.org/docs/7.0.x/user_guide/user_guide.html# specify 'jcache' to default to the Jcache default configuration# infinispan.configurationFile = "classpath:conf/infinispan.xml"infinispan.configurationFile = "jcache"# Hazelcast configuration file# see http://hazelcast.org/documentation# specify 'jcache' to default to the Jcache default configuration# hazelcast.configurationFile = "classpath:conf/hazelcast.xml"hazelcast.configurationFile = "jcache"

Multiple Providers on the classpath

In the event that you have multiple providers on the classpath at the same time, Fathom will pick the first one loaded by the JVM unless you specify a preference.

# Set the preferred JCache provider.# If unspecified, the first provider discovered will be used.# You may specify a full provider classname or you may specify# a nickname for an already registered JCache implementation# such as: ehcache, infinispan, hazelcastjcache.preferredProvider = ""

One scenario where you might have multiple providers is using one for DEV mode and a different one for PROD mode. This would be the caching analog of using an SQL db like SQLite or H2 for development and PostgreSQL for production.

Usage

Defining your Caches

Create a conf/Caches.java class.

packageconf;
publicclassCachesextendsCachesModule {
publicstaticfinalStringEMPLOYEE_CACHE = "employeeCache";
@Overrideprotectedvoidsetup(Settingssettings, CacheManagercacheManager) {
// example employee cachecacheManager.createCache(EMPLOYEE_CACHE, newMutableConfiguration()
.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(Duration.ONE_MINUTE))
.setStatisticsEnabled(true)
.setStoreByValue(true));
}
}

Using your Caches

The most elegant way to use Fathom's JCache integration is with annotations.

In the following non-functional example we are annotating our employee DAO singleton to specify that all methods in this DAO access the EMPLOYEE_CACHE defined in our conf/Caches.java class.

We are also annotating the get, getAll, delete, and save methods. Calling these methods will transparently manage the cache.

@Singleton@CacheDefaults(cacheName = Caches.EMPLOYEE_CACHE)
publicclassEmployeeDao {
privatestaticfinalLoggerlog = LoggerFactory.getLogger(EmployeeDao.class);
publicEmployeeDao() {
}
@CacheResultpublicEmployeeget(intid) {
log.info("Getting employee #{} by id", id);
Employeeemployee = employees.get(id);
returnemployee;
}
@CacheResultpublicList<Employee> getAll() {
log.info("Getting all employees");
returnnewArrayList<>(employees.values());
}
@CacheRemoveAllpublicEmployeedelete(intid) {
Employeeemployee = employees.get(id);
employees.remove(id);
returnemployee;
}
@CacheRemoveAllpublicEmployeesave(Employeeemployee) {
returnput(employee);
}
}

!!! Warning It's important to note that the JCache method interceptors, like all Guice method interceptors, are bound by the same limitations - including method scope.

- Classes must be public or package-private.
- Classes must be non-final
- Methods must be public, package-private or protected
- Methods must be non-final
- Instances must be created by Guice by an @Inject-annotated or no-argument constructor It is not possible to use method interception on instances that aren't constructed by Guice.

Viewing and Managing your Caches

Fathom does not provide a mechansim to view & manage your caches, however, several JCache providers register MBeans which allow cache viewing and management via JConsole or VisualVM.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
James Moger edited this page Nov 20, 2015 · 1 revision

About

Fathom-JCache provides your application with seamless caching integration.

Installation

Add the Fathom-JCache artifact...

<dependency>
<groupId>com.gitblit.fathom</groupId>
<artifactId>fathom-jcache</artifactId>
<version>${fathom.version}</version>
</dependency>

... and also add your preferred JCache provider:

ProviderArtifact
Hazelcastcom.hazelcast:hazelcast
Infinispanorg.infinispan:infinispan-jcache
Ehcacheorg.ehcache:jcache

Layout

YourApp
└── src
└── main
└── java
└── conf
└── Caches.java

!!! Note This module depends on the value of the application.package setting. If you have specified an application package then your Caches class must be ${package}/conf/Caches.java.

Configuration

You don't have to configure your JCache provider to use it. Each provider ships with default settings which allows you to get up-and-running very quickly.

If you need to specify a provider-specific configuration you may do so.

# Ehcache configuration file# see http://ehcache.org/documentation# specify 'jcache' to default to the Jcache default configuration# ehcache.configurationFile = "classpath:conf/ehcache.xml"ehcache.configurationFile = "jcache"# Infinispan configuration file# see http://infinispan.org/docs/7.0.x/user_guide/user_guide.html# specify 'jcache' to default to the Jcache default configuration# infinispan.configurationFile = "classpath:conf/infinispan.xml"infinispan.configurationFile = "jcache"# Hazelcast configuration file# see http://hazelcast.org/documentation# specify 'jcache' to default to the Jcache default configuration# hazelcast.configurationFile = "classpath:conf/hazelcast.xml"hazelcast.configurationFile = "jcache"

Multiple Providers on the classpath

In the event that you have multiple providers on the classpath at the same time, Fathom will pick the first one loaded by the JVM unless you specify a preference.

# Set the preferred JCache provider.# If unspecified, the first provider discovered will be used.# You may specify a full provider classname or you may specify# a nickname for an already registered JCache implementation# such as: ehcache, infinispan, hazelcastjcache.preferredProvider = ""

One scenario where you might have multiple providers is using one for DEV mode and a different one for PROD mode. This would be the caching analog of using an SQL db like SQLite or H2 for development and PostgreSQL for production.

Usage

Defining your Caches

Create a conf/Caches.java class.

packageconf;
publicclassCachesextendsCachesModule {
publicstaticfinalStringEMPLOYEE_CACHE = "employeeCache";
@Overrideprotectedvoidsetup(Settingssettings, CacheManagercacheManager) {
// example employee cachecacheManager.createCache(EMPLOYEE_CACHE, newMutableConfiguration()
.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(Duration.ONE_MINUTE))
.setStatisticsEnabled(true)
.setStoreByValue(true));
}
}

Using your Caches

The most elegant way to use Fathom's JCache integration is with annotations.

In the following non-functional example we are annotating our employee DAO singleton to specify that all methods in this DAO access the EMPLOYEE_CACHE defined in our conf/Caches.java class.

We are also annotating the get, getAll, delete, and save methods. Calling these methods will transparently manage the cache.

@Singleton@CacheDefaults(cacheName = Caches.EMPLOYEE_CACHE)
publicclassEmployeeDao {
privatestaticfinalLoggerlog = LoggerFactory.getLogger(EmployeeDao.class);
publicEmployeeDao() {
}
@CacheResultpublicEmployeeget(intid) {
log.info("Getting employee #{} by id", id);
Employeeemployee = employees.get(id);
returnemployee;
}
@CacheResultpublicList<Employee> getAll() {
log.info("Getting all employees");
returnnewArrayList<>(employees.values());
}
@CacheRemoveAllpublicEmployeedelete(intid) {
Employeeemployee = employees.get(id);
employees.remove(id);
returnemployee;
}
@CacheRemoveAllpublicEmployeesave(Employeeemployee) {
returnput(employee);
}
}

!!! Warning It's important to note that the JCache method interceptors, like all Guice method interceptors, are bound by the same limitations - including method scope.

- Classes must be public or package-private.
- Classes must be non-final
- Methods must be public, package-private or protected
- Methods must be non-final
- Instances must be created by Guice by an @Inject-annotated or no-argument constructor It is not possible to use method interception on instances that aren't constructed by Guice.

Viewing and Managing your Caches

Fathom does not provide a mechansim to view & manage your caches, however, several JCache providers register MBeans which allow cache viewing and management via JConsole or VisualVM.

Clone this wiki locally