blob: 4f25efc63ae02dad141328838f241a498f0a4d44 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.apache.ofbiz.widget.cache;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.UtilGenerics;
import org.apache.ofbiz.base.util.UtilMisc;
public final class WidgetContextCacheKey {
public static final String module = WidgetContextCacheKey.class.getName();
private static Set<String> fieldNamesToSkip = createFieldNamesToSkip();
private static Set<String> createFieldNamesToSkip(){
Set<String> fieldNamesToSkip = new HashSet<String>();
fieldNamesToSkip.add("globalContext");
fieldNamesToSkip.add("delegator");
fieldNamesToSkip.add("dispatcher");
fieldNamesToSkip.add("security");
fieldNamesToSkip.add("webSiteId");
fieldNamesToSkip.add("userLogin");
fieldNamesToSkip.add("screens");
fieldNamesToSkip.add("nullField");
fieldNamesToSkip.add("autoUserLogin");
fieldNamesToSkip.add("person");
fieldNamesToSkip.add("partyGroup");
fieldNamesToSkip.add("timeZone");
fieldNamesToSkip.add("sessionAttributes");
fieldNamesToSkip.add("requestAttributes");
fieldNamesToSkip.add("JspTaglibs");
fieldNamesToSkip.add("requestParameters");
fieldNamesToSkip.add("controlPath");
fieldNamesToSkip.add("contextRoot");
fieldNamesToSkip.add("serverRoot");
fieldNamesToSkip.add("checkLoginUrl");
fieldNamesToSkip.add("externalLoginKey");
fieldNamesToSkip.add("externalKeyParam");
fieldNamesToSkip.add("nowTimestamp");
fieldNamesToSkip.add("session");
fieldNamesToSkip.add("request");
fieldNamesToSkip.add("response");
fieldNamesToSkip.add("application");
fieldNamesToSkip.add("formStringRenderer");
fieldNamesToSkip.add("null");
fieldNamesToSkip.add("sections");
fieldNamesToSkip.add("uiLabelMap");
// remove
fieldNamesToSkip.add("layoutSettings");
fieldNamesToSkip.add("activeApp");
fieldNamesToSkip.add("appheaderTemplate");
fieldNamesToSkip.add("servletContext");
// parameters
fieldNamesToSkip.add("visit");
fieldNamesToSkip.add("visitor");
return Collections.unmodifiableSet(fieldNamesToSkip);
}
private final Map<String, Object> context;
public WidgetContextCacheKey(Map<String, ? extends Object> context) {
this.context = Collections.unmodifiableMap(new HashMap<String, Object>(context));
}
@Override
public int hashCode() {
return 0;
}
@Override
public boolean equals(Object obj) {
WidgetContextCacheKey key = null;
if (obj instanceof WidgetContextCacheKey) {
key = (WidgetContextCacheKey)obj;
}
if (key == null || key.context == null) {
return this.context == null;
}
if (this.context == null) {
return false;
}
Set<String> unifiedContext = new HashSet<String>();
unifiedContext.addAll(this.context.keySet());
unifiedContext.addAll(key.context.keySet());
for (String fieldName: unifiedContext) {
if (fieldNamesToSkip.contains(fieldName)) {
continue;
}
Object field1 = this.context.get(fieldName);
Object field2 = key.context.get(fieldName);
if (field1 == null && field2 == null) {
continue;
}
if ((field1 == null || field2 == null) && field1 != field2) {
Debug.logWarning("Screen Key doesn't match for :" + fieldName + "; value1 = " + field1 + "; value2 = " + field2, module);
return false;
}
if ("parameters".equals(fieldName)) {
if (!parametersAreEqual(UtilGenerics.<String, Object>checkMap(field1), UtilGenerics.<String, Object>checkMap(field2))) {
return false;
}
continue;
}
if (!field1.equals(field2)) {
Debug.logWarning("Screen Key doesn't match for :" + fieldName + "; value1 = " + field1 + "; value2 = " + field2, module);
return false;
}
}
return true;
}
@Override
public String toString() {
Map<String, Object> printableMap = new HashMap<String, Object>();
for (String fieldName: this.context.keySet()) {
if (!fieldNamesToSkip.contains(fieldName) && !"parameters".equals(fieldName)) {
printableMap.put(fieldName, this.context.get(fieldName));
}
}
Map<String, Object> parameters = UtilGenerics.checkMap(this.context.get("parameters"));
return printMap(printableMap) + "\n" + printMap(parameters);
}
public static String printMap(Map<String, ? extends Object> map) {
Map<String, Object> printableMap = new HashMap<String, Object>();
for (Map.Entry<String, ? extends Object> entry : map.entrySet()) {
String fieldName = entry.getKey();
if (!fieldNamesToSkip.contains(fieldName) &&
!fieldName.startsWith("javax.servlet") &&
!fieldName.startsWith("org.apache") &&
!fieldName.startsWith("_CLIENT_")) {
printableMap.put(fieldName, entry.getValue());
}
}
return UtilMisc.printMap(printableMap);
}
public static boolean parametersAreEqual(Map<String, ? extends Object> map1, Map<String, ? extends Object> map2) {
Set<String> unifiedContext = new HashSet<String>();
unifiedContext.addAll(map1.keySet());
unifiedContext.addAll(map2.keySet());
for (String fieldName: unifiedContext) {
if (fieldNamesToSkip.contains(fieldName)) {
continue;
}
if (fieldName.startsWith("javax.servlet") ||
fieldName.startsWith("org.apache") ||
fieldName.startsWith("_CLIENT_")) {
continue;
}
Object field1 = map1.get(fieldName);
Object field2 = map2.get(fieldName);
if (field1 == null && field2 == null) {
continue;
}
if ((field1 == null || field2 == null) && field1 != field2) {
Debug.logWarning("Screen Key doesn't match for :" + fieldName + "; value1 = " + field1 + "; value2 = " + field2, module);
return false;
}
if (!field1.equals(field2)) {
Debug.logWarning("Screen Key doesn't match for :" + fieldName + "; value1 = " + field1 + "; value2 = " + field2, module);
return false;
}
}
return true;
}
}