/* * Copyright (C) 2004-2009 Jive Software. All rights reserved. * * 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 com.jivesoftware.util.cache; import com.tangosol.net.DefaultConfigurableCacheFactory; import com.tangosol.run.xml.XmlElement; import org.jivesoftware.util.cache.CacheFactory; import java.util.HashMap; import java.util.Map; /** * A coherence cache factory which adds the ability to register caches at runtime which are not defined * in the core coherence-cache-config.xml. */ public class JiveConfigurableCacheFactory extends DefaultConfigurableCacheFactory { public JiveConfigurableCacheFactory() { super(); } public JiveConfigurableCacheFactory(String s) { super(s); } public JiveConfigurableCacheFactory(String s, ClassLoader classLoader) { super(s, classLoader); } public JiveConfigurableCacheFactory(XmlElement xmlElement) { super(xmlElement); } public CacheInfo findSchemeMapping(String cacheName) { CacheInfo mapping = null; try { mapping = super.findSchemeMapping(cacheName); // Check if there are system properties overriding default values if (CacheFactory.getCacheTypeProperty(cacheName) != null) { String cacheType = CacheFactory.getCacheTypeProperty(cacheName); mapping = new CacheInfo(cacheName, cacheType, mapping.getAttributes()); } if (CacheFactory.hasMaxSizeFromProperty(cacheName)) { long maxCacheSize = CacheFactory.getMaxCacheSize(cacheName); if (maxCacheSize == -1l) { maxCacheSize = 0; } mapping.getAttributes().put("back-size-high", Long.toString(maxCacheSize)); } if (CacheFactory.hasMaxLifetimeFromProperty(cacheName)) { long maxLifetime = CacheFactory.getMaxCacheLifetime(cacheName); if (maxLifetime == -1l) { maxLifetime = 0; } mapping.getAttributes().put("back-expiry", Long.toString(maxLifetime)); } } catch (IllegalArgumentException iae) { // Do nothing. Mapping will be null so we will find one later } if (mapping == null) { String typeProperty = CacheFactory.getCacheTypeProperty(cacheName); long maxCacheSize = CacheFactory.getMaxCacheSize(cacheName); long minCacheSize = CacheFactory.getMinCacheSize(cacheName); long maxLifetime = CacheFactory.getMaxCacheLifetime(cacheName); if (typeProperty != null) { Map<String, String> attributes = new HashMap<String, String>(); if (maxCacheSize == -1l) { maxCacheSize = 0; } attributes.put("back-size-high", Long.toString(maxCacheSize)); if (maxLifetime == -1l) { maxLifetime = 0; } attributes.put("back-expiry", Long.toString(maxLifetime)); if (minCacheSize == -1l) { minCacheSize = 0; } attributes.put("back-size-low", Long.toString(minCacheSize)); mapping = new CacheInfo(cacheName, typeProperty, attributes); } } if (mapping == null) { //this is to mirror the superclass behavior throw new IllegalArgumentException("No scheme for cache: " + cacheName); } return mapping; } }