001
014
015 package com.liferay.portal.cache.ehcache;
016
017 import com.liferay.portal.cache.cluster.EhcachePortalCacheClusterReplicatorFactory;
018 import com.liferay.portal.kernel.util.Validator;
019 import com.liferay.portal.util.PropsValues;
020
021 import java.net.URL;
022
023 import java.util.ArrayList;
024 import java.util.List;
025 import java.util.Map;
026
027 import net.sf.ehcache.config.CacheConfiguration;
028 import net.sf.ehcache.config.CacheConfiguration.CacheEventListenerFactoryConfiguration;
029 import net.sf.ehcache.config.Configuration;
030 import net.sf.ehcache.config.ConfigurationFactory;
031 import net.sf.ehcache.config.FactoryConfiguration;
032
033
042 public class EhcacheConfigurationUtil {
043
044 public static Configuration getConfiguration(String configurationPath) {
045 return getConfiguration(configurationPath, false);
046 }
047
048 public static Configuration getConfiguration(
049 String configurationPath, boolean clusterAware) {
050
051 return getConfiguration(configurationPath, clusterAware, false);
052 }
053
054 public static Configuration getConfiguration(
055 String configurationPath, boolean clusterAware, boolean usingDefault) {
056
057 if (Validator.isNull(configurationPath)) {
058 return null;
059 }
060
061 URL configurationURL = EhcacheConfigurationUtil.class.getResource(
062 configurationPath);
063
064 return getConfiguration(configurationURL, clusterAware, usingDefault);
065 }
066
067 public static Configuration getConfiguration(URL configurationURL) {
068 return getConfiguration(configurationURL, false);
069 }
070
071 public static Configuration getConfiguration(
072 URL configurationURL, boolean clusterAware) {
073
074 return getConfiguration(configurationURL, clusterAware, false);
075 }
076
077 public static Configuration getConfiguration(
078 URL configurationURL, boolean clusterAware, boolean usingDefault) {
079
080 if (configurationURL == null) {
081 return null;
082 }
083
084 Configuration configuration = ConfigurationFactory.parseConfiguration(
085 configurationURL);
086
087 List<CacheConfiguration> cacheConfigurations =
088 _getAllCacheConfigurations(configuration);
089
090 if (!PropsValues.EHCACHE_BOOTSTRAP_CACHE_LOADER_ENABLED) {
091 _clearBootstrapCacheLoaderConfigurations(cacheConfigurations);
092 }
093
094 if (!clusterAware ||
095 (PropsValues.CLUSTER_LINK_ENABLED &&
096 !PropsValues.EHCACHE_CLUSTER_LINK_REPLICATION_ENABLED)) {
097
098 return configuration;
099 }
100
101 _configureEhcacheReplication(
102 configuration, cacheConfigurations, usingDefault);
103
104 return configuration;
105 }
106
107 private static void _clearBootstrapCacheLoaderConfigurations(
108 List<CacheConfiguration> cacheConfigurations) {
109
110 for (CacheConfiguration cacheConfiguration : cacheConfigurations) {
111 cacheConfiguration.addBootstrapCacheLoaderFactory(null);
112 }
113 }
114
115 private static String _clearCacheEventListenerConfigurations(
116 CacheConfiguration cacheConfiguration, boolean usingDefault) {
117
118 List<CacheEventListenerFactoryConfiguration>
119 cacheEventListenerConfigurations =
120 cacheConfiguration.getCacheEventListenerConfigurations();
121
122 List<CacheEventListenerFactoryConfiguration>
123 copyCacheEventListenerConfigurations =
124 new ArrayList<CacheEventListenerFactoryConfiguration>(
125 cacheEventListenerConfigurations);
126
127 if (usingDefault) {
128 cacheEventListenerConfigurations.clear();
129 }
130
131 for (CacheEventListenerFactoryConfiguration
132 cacheEventListenerFactoryConfiguration :
133 copyCacheEventListenerConfigurations) {
134
135 String fullyQualifiedClassPath =
136 cacheEventListenerFactoryConfiguration.
137 getFullyQualifiedClassPath();
138
139 if (fullyQualifiedClassPath.contains(
140 "LiferayCacheEventListenerFactory") ||
141 fullyQualifiedClassPath.contains(
142 "net.sf.ehcache.distribution")) {
143
144 cacheEventListenerConfigurations.remove(
145 cacheEventListenerFactoryConfiguration);
146
147 return cacheEventListenerFactoryConfiguration.getProperties();
148 }
149 }
150
151 return null;
152 }
153
154 @SuppressWarnings("rawtypes")
155 private static void _configureEhcacheReplication(
156 Configuration configuration,
157 List<CacheConfiguration> cacheConfigurations, boolean usingDefault) {
158
159 List<FactoryConfiguration> factoryConfigurations =
160 configuration.getCacheManagerPeerListenerFactoryConfigurations();
161
162 factoryConfigurations.clear();
163
164 factoryConfigurations =
165 configuration.getCacheManagerPeerProviderFactoryConfiguration();
166
167 factoryConfigurations.clear();
168
169 for (CacheConfiguration cacheConfiguration : cacheConfigurations) {
170 String properties = _clearCacheEventListenerConfigurations(
171 cacheConfiguration, usingDefault);
172
173 if ((properties != null) &&
174 PropsValues.EHCACHE_CLUSTER_LINK_REPLICATION_ENABLED) {
175
176 _enableClusterLinkReplication(cacheConfiguration, properties);
177 }
178 }
179 }
180
181 private static void _enableClusterLinkReplication(
182 CacheConfiguration cacheConfiguration,
183 String cacheEventListenerProperties) {
184
185 CacheEventListenerFactoryConfiguration
186 cacheEventListenerFactoryConfiguration =
187 new CacheEventListenerFactoryConfiguration();
188
189 cacheEventListenerFactoryConfiguration.setClass(
190 EhcachePortalCacheClusterReplicatorFactory.class.getName());
191 cacheEventListenerFactoryConfiguration.setProperties(
192 cacheEventListenerProperties);
193
194 cacheConfiguration.addCacheEventListenerFactory(
195 cacheEventListenerFactoryConfiguration);
196 }
197
198 private static List<CacheConfiguration> _getAllCacheConfigurations(
199 Configuration configuration) {
200
201 List<CacheConfiguration> cacheConfigurations =
202 new ArrayList<CacheConfiguration>();
203
204 CacheConfiguration defaultCacheConfiguration =
205 configuration.getDefaultCacheConfiguration();
206
207 if (defaultCacheConfiguration != null) {
208 cacheConfigurations.add(defaultCacheConfiguration);
209 }
210
211 Map<String, CacheConfiguration> cacheConfigurationsMap =
212 configuration.getCacheConfigurations();
213
214 for (CacheConfiguration cacheConfiguration :
215 cacheConfigurationsMap.values()) {
216
217 cacheConfigurations.add(cacheConfiguration);
218 }
219
220 return cacheConfigurations;
221 }
222
223 }