001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
034     * <p>
035     * See https://issues.liferay.com/browse/LPS-48535.
036     * </p>
037     *
038     * @author Shuyang Zhou
039     * @author Edward Han
040     * @author Tina Tian
041     */
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    }