/* * JBoss, Home of Professional Open Source. * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.cache.config; import org.jboss.cache.loader.CacheLoader; import org.jboss.cache.loader.SingletonStoreCacheLoader; import org.jboss.cache.util.Util; import java.util.ArrayList; import java.util.List; import java.util.Properties; /** * Holds the configuration of the cache loader chain. ALL cache loaders should be defined using this class, adding * individual cache loaders to the chain by calling {@link CacheLoaderConfig#addIndividualCacheLoaderConfig} * * @author Manik Surtani (manik AT jboss DOT org) * @author Brian Stansberry * @author Galder Zamarreno */ public class CacheLoaderConfig extends ConfigurationComponent { private static final long serialVersionUID = 2210349340378984424L; private boolean passivation; private String preload; private List cacheLoaderConfigs = new ArrayList(); private boolean shared; public String getPreload() { return preload; } public void setPreload(String preload) { testImmutability("preload"); this.preload = preload; } public void setPassivation(boolean passivation) { testImmutability("passivation"); this.passivation = passivation; } public boolean isPassivation() { return passivation; } public void addIndividualCacheLoaderConfig(IndividualCacheLoaderConfig clc) { testImmutability("cacheLoaderConfigs"); cacheLoaderConfigs.add(clc); // Ensure this config gets our back ref to the cache addChildConfig(clc); } public List getIndividualCacheLoaderConfigs() { return cacheLoaderConfigs; } public void setIndividualCacheLoaderConfigs(List configs) { testImmutability("cacheLoaderConfigs"); // Ensure these configs get our back ref to the cache replaceChildConfigs(this.cacheLoaderConfigs, configs); this.cacheLoaderConfigs = configs == null ? new ArrayList() : configs; } public IndividualCacheLoaderConfig getFirstCacheLoaderConfig() { if (cacheLoaderConfigs.size() == 0) return null; return cacheLoaderConfigs.get(0); } public boolean useChainingCacheLoader() { return !isPassivation() && cacheLoaderConfigs.size() > 1; } @Override public String toString() { return new StringBuilder().append("CacheLoaderConfig{").append("shared=").append(shared).append(", passivation=").append(passivation).append(", preload='").append(preload).append('\'').append(", cacheLoaderConfigs.size()=").append(cacheLoaderConfigs.size()).append('}').toString(); } public void setShared(boolean shared) { testImmutability("shared"); this.shared = shared; } public boolean isShared() { return shared; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj instanceof CacheLoaderConfig) { CacheLoaderConfig other = (CacheLoaderConfig) obj; return (this.passivation == other.passivation) && (this.shared == other.shared) && Util.safeEquals(this.preload, other.preload) && Util.safeEquals(this.cacheLoaderConfigs, other.cacheLoaderConfigs); } return false; } @Override public int hashCode() { int result = 19; result = 51 * result + (passivation ? 0 : 1); result = 51 * result + (shared ? 0 : 1); result = 51 * result + (preload == null ? 0 : preload.hashCode()); result = 51 * result + (cacheLoaderConfigs == null ? 0 : cacheLoaderConfigs.hashCode()); return result; } @Override public CacheLoaderConfig clone() throws CloneNotSupportedException { CacheLoaderConfig clone = (CacheLoaderConfig) super.clone(); if (cacheLoaderConfigs != null) { List clcs = new ArrayList(cacheLoaderConfigs.size()); for (IndividualCacheLoaderConfig clc : cacheLoaderConfigs) { clcs.add(clc.clone()); } clone.setIndividualCacheLoaderConfigs(clcs); } return clone; } /** * Loops through all individual cache loader configs and checks if fetchPersistentState is set on any of them */ public boolean isFetchPersistentState() { for (IndividualCacheLoaderConfig iclc : cacheLoaderConfigs) { if (iclc.isFetchPersistentState()) return true; } return false; } /** * Configuration object that holds the confguration of an individual cache loader. * * @author Manik Surtani (manik AT jboss DOT org) * @author Galder Zamarreno */ public static class IndividualCacheLoaderConfig extends PluggableConfigurationComponent { private static final long serialVersionUID = -2282396799100828593L; private boolean async; private boolean ignoreModifications; private boolean fetchPersistentState; private boolean purgeOnStartup; private SingletonStoreConfig singletonStoreConfig; private transient CacheLoader cacheLoader; protected void populateFromBaseConfig(IndividualCacheLoaderConfig base) { if (base != null) { setAsync(base.isAsync()); setIgnoreModifications(base.isIgnoreModifications()); setFetchPersistentState(base.isFetchPersistentState()); setSingletonStoreConfig(base.getSingletonStoreConfig()); setPurgeOnStartup(base.isPurgeOnStartup()); setProperties(base.getProperties()); } } public boolean isPurgeOnStartup() { return purgeOnStartup; } public boolean isFetchPersistentState() { return fetchPersistentState; } public void setFetchPersistentState(boolean fetchPersistentState) { testImmutability("fetchPersistentState"); this.fetchPersistentState = fetchPersistentState; } public void setAsync(boolean async) { testImmutability("async"); this.async = async; } public boolean isAsync() { return async; } public void setIgnoreModifications(boolean ignoreModifications) { testImmutability("ignoreModifications"); this.ignoreModifications = ignoreModifications; } public boolean isIgnoreModifications() { return ignoreModifications; } public void setPurgeOnStartup(boolean purgeOnStartup) { testImmutability("purgeOnStartup"); this.purgeOnStartup = purgeOnStartup; } public SingletonStoreConfig getSingletonStoreConfig() { return singletonStoreConfig; } public void setSingletonStoreConfig(SingletonStoreConfig singletonStoreConfig) { testImmutability("singletonStoreConfig"); replaceChildConfig(this.singletonStoreConfig, singletonStoreConfig); this.singletonStoreConfig = singletonStoreConfig; } /** * Provides the ability to get and set a running cache loader, which, if exists, will be used rather than * constructing a new one. Primarily to facilitate testing with mock objects. * * @return cache loader, if one exists * @since 2.1.0 */ public CacheLoader getCacheLoader() { return cacheLoader; } /** * Provides the ability to get and set a running cache loader, which, if exists, will be used rather than * constructing a new one. Primarily to facilitate testing with mock objects. * * @param cacheLoader cacheLoader to set * @since 2.1.0 */ public void setCacheLoader(CacheLoader cacheLoader) { this.cacheLoader = cacheLoader; } @Override public boolean equals(Object obj) { if (super.equals(obj)) { IndividualCacheLoaderConfig i = (IndividualCacheLoaderConfig) obj; return equalsExcludingProperties(i); } return false; } protected boolean equalsExcludingProperties(Object obj) { if (!(obj instanceof IndividualCacheLoaderConfig)) return false; IndividualCacheLoaderConfig other = (IndividualCacheLoaderConfig) obj; return Util.safeEquals(this.className, other.className) && (this.async == other.async) && (this.ignoreModifications == other.ignoreModifications) && (this.fetchPersistentState == other.fetchPersistentState) && Util.safeEquals(this.singletonStoreConfig, other.singletonStoreConfig); } @Override public int hashCode() { return 31 * hashCodeExcludingProperties() + (properties == null ? 0 : properties.hashCode()); } protected int hashCodeExcludingProperties() { int result = 17; result = 31 * result + (className == null ? 0 : className.hashCode()); result = 31 * result + (async ? 0 : 1); result = 31 * result + (ignoreModifications ? 0 : 1); result = 31 * result + (fetchPersistentState ? 0 : 1); result = 31 * result + (singletonStoreConfig == null ? 0 : singletonStoreConfig.hashCode()); result = 31 * result + (purgeOnStartup ? 0 : 1); return result; } @Override public String toString() { return new StringBuilder().append("IndividualCacheLoaderConfig{").append("className='").append(className).append('\'') .append(", async=").append(async) .append(", ignoreModifications=").append(ignoreModifications) .append(", fetchPersistentState=").append(fetchPersistentState) .append(", properties=").append(properties) .append(", purgeOnStartup=").append(purgeOnStartup).append("},") .append("SingletonStoreConfig{").append(singletonStoreConfig).append('}') .toString(); } @Override public IndividualCacheLoaderConfig clone() throws CloneNotSupportedException { IndividualCacheLoaderConfig clone = (IndividualCacheLoaderConfig) super.clone(); if (singletonStoreConfig != null) clone.setSingletonStoreConfig(singletonStoreConfig.clone()); clone.cacheLoader = cacheLoader; return clone; } /** * Configuration for a SingletonStoreCacheLoader */ public static class SingletonStoreConfig extends PluggableConfigurationComponent { private static final long serialVersionUID = 824251894176131850L; /** * Indicates whether the singleton store functionality is enabled or not. */ private boolean singletonStoreEnabled; public SingletonStoreConfig() { // default value className = SingletonStoreCacheLoader.class.getName(); } public boolean isSingletonStoreEnabled() { return singletonStoreEnabled; } public void setSingletonStoreEnabled(boolean singletonStoreEnabled) { testImmutability("singletonStoreEnabled"); this.singletonStoreEnabled = singletonStoreEnabled; } public String getSingletonStoreClass() { return className; } public void setSingletonStoreClass(String className) { setClassName(className); } public Properties getSingletonStoreproperties() { return properties; } public void setSingletonStoreproperties(Properties properties) { setProperties(properties); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (super.equals(obj)) { SingletonStoreConfig other = (SingletonStoreConfig) obj; return this.singletonStoreEnabled == other.singletonStoreEnabled; } return false; } @Override public int hashCode() { int result = 19; result = 41 * result + super.hashCode(); result = 41 * result + (singletonStoreEnabled ? 0 : 1); return result; } @Override public String toString() { return super.toString() + " enabled=" + singletonStoreEnabled + " class=" + className + " properties=" + properties; } @Override public SingletonStoreConfig clone() throws CloneNotSupportedException { return (SingletonStoreConfig) super.clone(); } } } }