VIVO-552 Reduce “memory leak” messages at shutdown.
Tomcat also complains if the VALUE of a ThreadLocal is an instance of a class that is defined in the Webapp. So even though the key type was HttpServleetRequest, some of the values were VitroRequest objects. Refactor so the value is the hash code of the request.
This commit is contained in:
parent
2064bbd7e0
commit
ebe1e1430e
1 changed files with 14 additions and 8 deletions
|
@ -10,7 +10,6 @@ import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.WeakHashMap;
|
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
@ -50,17 +49,17 @@ public class FreemarkerConfigurationImpl extends Configuration {
|
||||||
private static final Log log = LogFactory
|
private static final Log log = LogFactory
|
||||||
.getLog(FreemarkerConfigurationImpl.class);
|
.getLog(FreemarkerConfigurationImpl.class);
|
||||||
|
|
||||||
private final ThreadLocal<HttpServletRequest> currentRequest = new ThreadLocal<>();
|
private final ThreadLocal<Integer> currentRequestHash = new ThreadLocal<>();
|
||||||
private final Map<HttpServletRequest, RequestBasedInformation> rbiMap = Collections
|
private final Map<Integer, RequestBasedInformation> rbiMap = Collections
|
||||||
.synchronizedMap(new WeakHashMap<HttpServletRequest, RequestBasedInformation>());
|
.synchronizedMap(new HashMap<Integer, RequestBasedInformation>());
|
||||||
|
|
||||||
protected void setRequestInfo(HttpServletRequest req) {
|
protected void setRequestInfo(HttpServletRequest req) {
|
||||||
currentRequest.set(req);
|
currentRequestHash.set(req.hashCode());
|
||||||
rbiMap.put(req, new RequestBasedInformation(req, this));
|
rbiMap.put(req.hashCode(), new RequestBasedInformation(req, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
private RequestBasedInformation getRequestInfo() {
|
private RequestBasedInformation getRequestInfo() {
|
||||||
return rbiMap.get(currentRequest.get());
|
return rbiMap.get(currentRequestHash.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -103,7 +102,7 @@ public class FreemarkerConfigurationImpl extends Configuration {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Locale getLocale() {
|
public Locale getLocale() {
|
||||||
return currentRequest.get().getLocale();
|
return getRequestInfo().getReq().getLocale();
|
||||||
}
|
}
|
||||||
|
|
||||||
private String[] joinNames(Set<String> nameSet, String[] nameArray) {
|
private String[] joinNames(Set<String> nameSet, String[] nameArray) {
|
||||||
|
@ -235,16 +234,23 @@ public class FreemarkerConfigurationImpl extends Configuration {
|
||||||
* custom attribute, and the locale. In the future, it could be more.
|
* custom attribute, and the locale. In the future, it could be more.
|
||||||
*/
|
*/
|
||||||
private static class RequestBasedInformation {
|
private static class RequestBasedInformation {
|
||||||
|
private final HttpServletRequest req;
|
||||||
private final Configuration c;
|
private final Configuration c;
|
||||||
private final Map<String, Object> customAttributes = new HashMap<>();
|
private final Map<String, Object> customAttributes = new HashMap<>();
|
||||||
private final Map<String, TemplateModel> sharedVariables = new HashMap<>();
|
private final Map<String, TemplateModel> sharedVariables = new HashMap<>();
|
||||||
|
|
||||||
public RequestBasedInformation(HttpServletRequest req, Configuration c) {
|
public RequestBasedInformation(HttpServletRequest req, Configuration c) {
|
||||||
|
this.req = req;
|
||||||
this.c = c;
|
this.c = c;
|
||||||
|
|
||||||
setSharedVariables(req);
|
setSharedVariables(req);
|
||||||
setCustomAttributes(req);
|
setCustomAttributes(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HttpServletRequest getReq() {
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
|
||||||
public Map<String, Object> getCustomAttributes() {
|
public Map<String, Object> getCustomAttributes() {
|
||||||
return customAttributes;
|
return customAttributes;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue