Skip to content

Commit 42e4e06

Browse files
committed
Updated the code for dotCMS 3.2
1 parent 36ea4b3 commit 42e4e06

14 files changed

+168
-100
lines changed
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
javax.portlet.title.EXT_CONFIGURATION=Configuration Cache
1+
com.dotcms.repackage.javax.portlet.title.EXT_CONFIGURATION=Configuration Cache

Configuration/conf/web-ext.xml

+4-14
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,8 @@
1-
<filter>
2-
<filter-name>ConfigurationRequestStoringFilter</filter-name>
3-
<filter-class>nl.isaac.dotcms.plugin.configuration.filter.RequestStoringFilter</filter-class>
4-
</filter>
5-
6-
<filter-mapping>
7-
<filter-name>ConfigurationRequestStoringFilter</filter-name>
8-
<url-pattern>/*</url-pattern>
9-
<dispatcher>REQUEST</dispatcher>
10-
<dispatcher>FORWARD</dispatcher>
11-
<dispatcher>ERROR</dispatcher>
12-
</filter-mapping>
13-
141
<listener>
15-
<listener-class>nl.isaac.dotcms.plugin.configuration.filter.SessionListener</listener-class>
2+
<listener-class>nl.isaac.dotcms.plugin.configuration.listener.RequestStoringListener</listener-class>
3+
</listener>
4+
<listener>
5+
<listener-class>nl.isaac.dotcms.plugin.configuration.listener.SessionListener</listener-class>
166
</listener>
177

188
<servlet>
Binary file not shown.

Configuration/server/tomcat/conf/applications/locationConfigPlugins.xml

+4-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818
<xml fileName="${sys:catalina.home}/conf/applications/${param:pluginName}/pluginConfig.xml" optional="true" />
1919
<properties fileName="${sys:catalina.home}/conf/applications/${param:pluginName}/plugin.properties" optional="true"/>
2020

21-
<!-- Indien een plugin gebruik makt van de configuratie plugin dan MOET een van onderstaande bestanden bestaan -->
21+
<!-- Indien een plugin gebruik maakt van de configuratie plugin dan MOET een van onderstaande bestanden bestaan -->
2222
<xml fileName="${sys:catalina.home}/../plugins/${param:pluginName}/conf/pluginConfig.xml" optional="true"/>
2323
<properties fileName="${sys:catalina.home}/../plugins/${param:pluginName}/conf/plugin.properties" optional="true"/>
24+
25+
<!-- Default osgi plugin.properties location when putting the plugin.properties in the resources/ext folder -->
26+
<properties fileName="${sys:catalina.home}/webapps/ROOT/WEB-INF/velocity/osgi/${param:osgiJarName}/ext/plugin.properties" optional="true"/>
2427
</configuration>

Configuration/src/nl/isaac/comp/configuration/visitor/ToStringMultiLineVisitor.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import nl.isaac.dotcms.plugin.configuration.dependencies.org.apache.commons.configuration.tree.ConfigurationNode;
66
import nl.isaac.dotcms.plugin.configuration.dependencies.org.apache.commons.configuration.tree.ConfigurationNodeVisitor;
77

8-
9-
108
public class ToStringMultiLineVisitor implements ConfigurationNodeVisitor {
119

1210
private Stack<String> parentStack = new Stack<String>();
@@ -22,16 +20,16 @@ public void visitBeforeChildren(ConfigurationNode node) {
2220
parentStack.add(node.getName());
2321

2422
if (node.getChildrenCount() == 0) {
25-
buf.append("\n");
23+
if (buf.length() > 0) {
24+
buf.append("\n");
25+
}
2626

2727
for (int i = 0; i < parentStack.size() - 1; i++) {
2828
buf.append(parentStack.get(i)).append(".");
2929
}
30-
}
3130

32-
buf.append(parentStack.peek());
31+
buf.append(parentStack.peek());
3332

34-
if (node.getChildrenCount() == 0) {
3533
buf.append(" = ").append(node.getValue());
3634
}
3735
}

Configuration/src/nl/isaac/dotcms/plugin/configuration/ConfigurationService.java

+68-22
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,22 @@
99
*/
1010

1111
import java.util.HashMap;
12+
import java.util.HashSet;
1213
import java.util.Map;
14+
import java.util.Set;
1315
import java.util.concurrent.ConcurrentHashMap;
1416

1517
import nl.isaac.comp.configuration.CustomConfiguration;
1618
import nl.isaac.comp.configuration.types.EnvironmentType;
1719
import nl.isaac.dotcms.plugin.configuration.dependencies.org.apache.commons.configuration.ConfigurationException;
1820
import nl.isaac.dotcms.plugin.configuration.dependencies.org.apache.commons.configuration.DefaultConfigurationBuilder.ConfigurationProvider;
21+
import nl.isaac.dotcms.plugin.configuration.dependencies.org.apache.commons.configuration.FileConfiguration;
1922
import nl.isaac.dotcms.plugin.configuration.dependencies.org.apache.commons.lang.text.StrLookup;
2023
import nl.isaac.dotcms.plugin.configuration.dotcms.DotCMSFileConfigurationProvider;
2124
import nl.isaac.dotcms.plugin.configuration.exception.ConfigurationNotFoundException;
25+
import nl.isaac.dotcms.plugin.configuration.listener.RequestStoringListener;
2226
import nl.isaac.dotcms.plugin.configuration.util.EmptyConfiguration;
2327

24-
import com.dotmarketing.business.APILocator;
25-
import com.dotmarketing.exception.DotDataException;
2628
import com.dotmarketing.util.Logger;
2729

2830
/**
@@ -53,6 +55,7 @@ public class ConfigurationService {
5355
private static final String locationConfigPlugins = "${sys:catalina.home}/conf/applications/locationConfigPlugins.xml";
5456

5557
private static final ConcurrentHashMap<String, CustomConfiguration> serverCache = new ConcurrentHashMap<String, CustomConfiguration>();
58+
private static final Set<String> ipForwardCache = new HashSet<String>();
5659

5760
/**
5861
* The type of environment
@@ -104,7 +107,6 @@ public static CustomConfiguration tryGetHostConfiguration() {
104107
* @throws ConfigurationException
105108
*/
106109
public static CustomConfiguration getPluginConfiguration(String pluginName) throws ConfigurationException, ConfigurationNotFoundException {
107-
validatePluginName(pluginName);
108110
return retrieveFromCacheOrCreateConfiguration("plugin_" + pluginName + '_', pluginName, locationConfigPlugins);
109111
}
110112
/**
@@ -161,7 +163,6 @@ public static CustomConfiguration getHostConfiguration(String hostName, String i
161163
* @throws ConfigurationException
162164
*/
163165
public static CustomConfiguration getPluginConfiguration(String pluginName, String hostName, String ipAddress, String sessionId) throws ConfigurationException {
164-
validatePluginName(pluginName);
165166
return retrieveFromCacheOrCreateConfiguration("plugin_" + pluginName + '_', hostName, ipAddress, sessionId, pluginName, locationConfigPlugins);
166167
}
167168
/**
@@ -182,15 +183,23 @@ private static CustomConfiguration retrieveFromCacheOrCreateConfiguration(String
182183
ConfigurationDotCMSCacheGroupHandler.setLoaded();
183184
}
184185

185-
String key = keyPrefix + hostName;
186+
String key;
187+
final String basicKey = keyPrefix + hostName;
186188

187189
// On Windows the : character is not allowed, replace it with _
188190
if (ipAddress != null) {
189191
ipAddress = ipAddress.replace(':', '_');
190192
}
191193

192194
if (cacheOnIp) {
193-
key += '_' + ipAddress + '_' + sessionId;
195+
String ipKey = basicKey + '_' + ipAddress + '_' + sessionId;
196+
if (!ipForwardCache.contains(ipKey)) {
197+
key = ipKey;
198+
} else {
199+
key = basicKey;
200+
}
201+
} else {
202+
key = basicKey;
194203
}
195204

196205
Logger.debug(ConfigurationService.class, "Looking up configuration under key: " + key);
@@ -206,11 +215,20 @@ private static CustomConfiguration retrieveFromCacheOrCreateConfiguration(String
206215

207216
interpolationValues.put("hostName", hostName);
208217
if (pluginName != null) {
209-
interpolationValues.put("pluginName", pluginName);
218+
if(pluginName.startsWith("osgi/")) {
219+
//This is an OSGi plugin
220+
String[] splitPluginName = pluginName.split("/");
221+
interpolationValues.put("pluginName", splitPluginName[1]);
222+
if(splitPluginName.length > 2) {
223+
interpolationValues.put("osgiJarName", splitPluginName[2]);
224+
}
225+
} else {
226+
interpolationValues.put("pluginName", pluginName);
227+
}
210228
}
211229

212230
// We only do ip specific things on DEV (and local of course!)
213-
if (cacheOnIp) {
231+
if (cacheOnIp && ipAddress != null) {
214232
interpolationValues.put("ClientIPAddress", ipAddress);
215233
}
216234

@@ -222,27 +240,39 @@ private static CustomConfiguration retrieveFromCacheOrCreateConfiguration(String
222240
providers.put("dotcms", dotCmsProvider);
223241

224242
conf = ConfigurationFactory.createConfiguration(key, configurationLocation, interpolators, providers);
225-
ConfigurationParameters params = defaultParameters.get();
226-
if (params != null) {
227-
params.addConfigurationToSession(key);
243+
244+
boolean isIpSpecific = false;
245+
if (cacheOnIp && ipAddress != null) {
246+
for (FileConfiguration fileConf : conf.getLoadedFileConfigurations()) {
247+
if (fileConf.getFileName() != null && fileConf.getFileName().contains(ipAddress)) {
248+
249+
isIpSpecific = true;
250+
251+
return conf;
252+
}
253+
}
254+
}
255+
if (isIpSpecific) {
256+
ConfigurationParameters params = defaultParameters.get();
257+
if (params != null) {
258+
params.addConfigurationToSession(key);
259+
}
260+
}
261+
if (cacheOnIp && !isIpSpecific) {
262+
ipForwardCache.add(key);
263+
if (serverCache.contains(basicKey)) {
264+
return serverCache.get(basicKey);
265+
} else {
266+
key = basicKey;
267+
}
228268
}
229269
Logger.debug(ConfigurationService.class, "Created a new configuration! " + key);
270+
230271
serverCache.put(key, conf);
231272

232273
return conf;
233274
}
234275

235-
private static void validatePluginName(String pluginName) {
236-
// First check if this plugin exists!
237-
try {
238-
if (null == APILocator.getPluginAPI().loadPlugin(pluginName)) {
239-
throw new DotDataException("DotCMS does not know a plugin by the name: '" + pluginName + "'");
240-
}
241-
} catch (DotDataException e) {
242-
throw new IllegalArgumentException("DotCMS does not know a plugin by the name: '" + pluginName + "'", e);
243-
}
244-
245-
}
246276
/**
247277
* This is, effectively, a tuple, being able to return the required parameters needed to construct a key.
248278
* It also contains a hook to whatever system is outside of this class to register a configuration object (or at least it's key) so that the outside system can clean up when it's no-longer needed.
@@ -272,6 +302,12 @@ public static final void storeDefaultParameters(ConfigurationParameters params)
272302
public static final void clearDefaultParameters() {
273303
defaultParameters.remove();
274304
}
305+
/**
306+
* Method to be used by {@link RequestStoringListener} to stack the parameters in nested requests
307+
*/
308+
public static final ConfigurationParameters getDefaultParameters() {
309+
return defaultParameters.get();
310+
}
275311
/**
276312
* This will invalidate a specifically cached configuration.
277313
* @param key
@@ -285,5 +321,15 @@ public static final void removeConfigurationForKey(String key) {
285321
*/
286322
public static final void clearCache() {
287323
serverCache.clear();
324+
ipForwardCache.clear();
325+
}
326+
327+
/**
328+
* This determines the number of loaded configuration variants.
329+
*
330+
* @return
331+
*/
332+
public static int getNumberOfLoadedConfigurations() {
333+
return serverCache.size();
288334
}
289335
}

Configuration/src/nl/isaac/dotcms/plugin/configuration/filter/RequestStoringFilter.java

-44
This file was deleted.

Configuration/src/nl/isaac/dotcms/plugin/configuration/filter/RequestBasedConfigurationParameters.java Configuration/src/nl/isaac/dotcms/plugin/configuration/listener/RequestBasedConfigurationParameters.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package nl.isaac.dotcms.plugin.configuration.filter;
1+
package nl.isaac.dotcms.plugin.configuration.listener;
22
/**
33
* dotCMS Configuration plugin by ISAAC - The Full Service Internet Agency is licensed
44
* under a Creative Commons Attribution 3.0 Unported License
@@ -13,6 +13,7 @@
1313
import javax.servlet.http.HttpServletRequest;
1414

1515
import nl.isaac.dotcms.plugin.configuration.ConfigurationService;
16+
import nl.isaac.dotcms.plugin.configuration.ConfigurationService.ConfigurationParameters;
1617

1718
import com.dotmarketing.business.web.WebAPILocator;
1819
import com.dotmarketing.exception.DotDataException;
@@ -28,8 +29,13 @@
2829
public class RequestBasedConfigurationParameters implements ConfigurationService.ConfigurationParameters {
2930

3031
private final HttpServletRequest request;
31-
public RequestBasedConfigurationParameters(HttpServletRequest request) {
32+
private final ConfigurationParameters previous;
33+
public RequestBasedConfigurationParameters(HttpServletRequest request, ConfigurationService.ConfigurationParameters previous) {
3234
this.request = request;
35+
this.previous = previous;
36+
}
37+
public ConfigurationParameters getPrevious() {
38+
return previous;
3339
}
3440

3541
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package nl.isaac.dotcms.plugin.configuration.listener;
2+
/**
3+
* dotCMS Configuration plugin by ISAAC - The Full Service Internet Agency is licensed
4+
* under a Creative Commons Attribution 3.0 Unported License
5+
* - http://creativecommons.org/licenses/by/3.0/
6+
* - http://www.geekyplugins.com/
7+
*
8+
* @copyright Copyright (c) 2011 ISAAC Software Solutions B.V. (http://www.isaac.nl)
9+
*/
10+
11+
import javax.servlet.ServletRequestEvent;
12+
import javax.servlet.ServletRequestListener;
13+
import javax.servlet.http.HttpServletRequest;
14+
15+
import nl.isaac.dotcms.plugin.configuration.ConfigurationService;
16+
import nl.isaac.dotcms.plugin.configuration.ConfigurationService.ConfigurationParameters;
17+
18+
/**
19+
* The only purpose of this class is to set and clear the default parameters for {@link ConfigurationService} while the request is active.
20+
* @author maarten
21+
*
22+
*/
23+
public class RequestStoringListener implements ServletRequestListener {
24+
25+
@Override
26+
public void requestInitialized(ServletRequestEvent sre) {
27+
if (sre.getServletRequest() instanceof HttpServletRequest) {
28+
final ConfigurationParameters previousParams = ConfigurationService.getDefaultParameters();
29+
ConfigurationService.storeDefaultParameters(new RequestBasedConfigurationParameters((HttpServletRequest) sre.getServletRequest(), previousParams));
30+
}
31+
}
32+
33+
@Override
34+
public void requestDestroyed(ServletRequestEvent sre) {
35+
final ConfigurationParameters current = ConfigurationService.getDefaultParameters();
36+
if (current instanceof RequestBasedConfigurationParameters
37+
&& ((RequestBasedConfigurationParameters) current).getPrevious() != null) {
38+
ConfigurationService.storeDefaultParameters(((RequestBasedConfigurationParameters) current).getPrevious());
39+
} else {
40+
ConfigurationService.clearDefaultParameters();
41+
}
42+
}
43+
44+
}

Configuration/src/nl/isaac/dotcms/plugin/configuration/filter/SessionListener.java Configuration/src/nl/isaac/dotcms/plugin/configuration/listener/SessionListener.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package nl.isaac.dotcms.plugin.configuration.filter;
1+
package nl.isaac.dotcms.plugin.configuration.listener;
22
/**
33
* dotCMS Configuration plugin by ISAAC - The Full Service Internet Agency is licensed
44
* under a Creative Commons Attribution 3.0 Unported License

Configuration/src/nl/isaac/dotcms/plugin/configuration/viewtool/ConfigurationViewTool.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import nl.isaac.comp.configuration.CustomConfiguration;
2121
import nl.isaac.dotcms.plugin.configuration.ConfigurationService;
2222
import nl.isaac.dotcms.plugin.configuration.dependencies.org.apache.commons.configuration.ConfigurationException;
23-
import nl.isaac.dotcms.plugin.configuration.filter.RequestStoringFilter;
23+
import nl.isaac.dotcms.plugin.configuration.listener.RequestStoringListener;
2424
import nl.isaac.dotcms.plugin.configuration.util.BasicMap;
2525

2626
import org.apache.velocity.tools.view.context.ViewContext;
@@ -30,7 +30,7 @@
3030

3131
/**
3232
* This view tool will always use {@link ConfigurationService#getHostConfiguration()} for host configuration and {@link ConfigurationService#getPluginConfiguration(String)} for plugin configurations.
33-
* So ensure that something like {@link RequestStoringFilter} is deployed!
33+
* So ensure that something like {@link RequestStoringListener} is deployed!
3434
*
3535
* @author maarten
3636
*

0 commit comments

Comments
 (0)