You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2016/12/04 20:32:54 UTC
incubator-freemarker git commit: Utilizing Java 5 generics at some
places where it doesn't break backward compatibility. Some code cleanup.
Repository: incubator-freemarker
Updated Branches:
refs/heads/2.3-gae 277956d94 -> c253e33d2
Utilizing Java 5 generics at some places where it doesn't break backward compatibility. Some code cleanup.
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/c253e33d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/c253e33d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/c253e33d
Branch: refs/heads/2.3-gae
Commit: c253e33d22db9365e3c134f59110bf20c0872670
Parents: 277956d
Author: ddekany <dd...@apache.org>
Authored: Sun Dec 4 17:55:56 2016 +0100
Committer: ddekany <dd...@apache.org>
Committed: Sun Dec 4 21:31:17 2016 +0100
----------------------------------------------------------------------
.../java/freemarker/ext/beans/BeanModel.java | 88 +++++++++-----------
.../freemarker/ext/beans/ClassIntrospector.java | 1 -
.../template/AdapterTemplateModel.java | 2 +-
.../freemarker/template/SimpleSequence.java | 2 +-
4 files changed, 42 insertions(+), 51 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/c253e33d/src/main/java/freemarker/ext/beans/BeanModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/beans/BeanModel.java b/src/main/java/freemarker/ext/beans/BeanModel.java
index ba3dc62..24f8590 100644
--- a/src/main/java/freemarker/ext/beans/BeanModel.java
+++ b/src/main/java/freemarker/ext/beans/BeanModel.java
@@ -80,10 +80,9 @@ implements
}
};
- // Cached template models that implement member properties and methods for this
- // instance. Keys are FeatureDescriptor instances (from classCache values),
- // values are either ReflectionMethodModels/ReflectionScalarModels
- private HashMap memberMap;
+ // I've tried to use a volatile ConcurrentHashMap field instead of HashMap + synchronized(this), but oddly it was
+ // a bit slower, at least on Java 8 u66.
+ private HashMap<Object, TemplateModel> memberCache;
/**
* Creates a new model that wraps the specified object. Note that there are
@@ -192,7 +191,7 @@ implements
}
}
- private void logNoSuchKey(String key, Map keyMap) {
+ private void logNoSuchKey(String key, Map<?, ?> keyMap) {
LOG.debug("Key " + StringUtil.jQuoteNoXSS(key) + " was not found on instance of " +
object.getClass().getName() + ". Introspection information for " +
"the class is: " + keyMap);
@@ -207,71 +206,64 @@ implements
}
private TemplateModel invokeThroughDescriptor(Object desc, Map<Object, Object> classInfo)
- throws IllegalAccessException,
- InvocationTargetException,
- TemplateModelException {
- // See if this particular instance has a cached implementation
- // for the requested feature descriptor
- TemplateModel member;
+ throws IllegalAccessException, InvocationTargetException, TemplateModelException {
+ // See if this particular instance has a cached implementation for the requested feature descriptor
+ TemplateModel cachedModel;
synchronized (this) {
- if (memberMap != null) {
- member = (TemplateModel) memberMap.get(desc);
- } else {
- member = null;
- }
+ cachedModel = memberCache != null ? memberCache.get(desc) : null;
}
- if (member != null)
- return member;
+ if (cachedModel != null) {
+ return cachedModel;
+ }
- TemplateModel retval = UNKNOWN;
+ TemplateModel resultModel = UNKNOWN;
if (desc instanceof IndexedPropertyDescriptor) {
- Method readMethod =
- ((IndexedPropertyDescriptor) desc).getIndexedReadMethod();
- retval = member =
+ Method readMethod = ((IndexedPropertyDescriptor) desc).getIndexedReadMethod();
+ resultModel = cachedModel =
new SimpleMethodModel(object, readMethod,
ClassIntrospector.getArgTypes(classInfo, readMethod), wrapper);
} else if (desc instanceof PropertyDescriptor) {
PropertyDescriptor pd = (PropertyDescriptor) desc;
- retval = wrapper.invokeMethod(object, pd.getReadMethod(), null);
- // (member == null) condition remains, as we don't cache these
+ resultModel = wrapper.invokeMethod(object, pd.getReadMethod(), null);
+ // cachedModel remains null, as we don't cache these
} else if (desc instanceof Field) {
- retval = wrapper.wrap(((Field) desc).get(object));
- // (member == null) condition remains, as we don't cache these
+ resultModel = wrapper.wrap(((Field) desc).get(object));
+ // cachedModel remains null, as we don't cache these
} else if (desc instanceof Method) {
Method method = (Method) desc;
- retval = member = new SimpleMethodModel(object, method,
- ClassIntrospector.getArgTypes(classInfo, method), wrapper);
+ resultModel = cachedModel = new SimpleMethodModel(
+ object, method, ClassIntrospector.getArgTypes(classInfo, method), wrapper);
} else if (desc instanceof OverloadedMethods) {
- retval = member =
- new OverloadedMethodsModel(object, (OverloadedMethods) desc, wrapper);
+ resultModel = cachedModel = new OverloadedMethodsModel(
+ object, (OverloadedMethods) desc, wrapper);
}
- // If new cacheable member was created, cache it
- if (member != null) {
+ // If new cachedModel was created, cache it
+ if (cachedModel != null) {
synchronized (this) {
- if (memberMap == null) {
- memberMap = new HashMap();
+ if (memberCache == null) {
+ memberCache = new HashMap<Object, TemplateModel>();
}
- memberMap.put(desc, member);
+ memberCache.put(desc, cachedModel);
}
}
- return retval;
+ return resultModel;
}
void clearMemberCache() {
synchronized (this) {
- memberMap = null;
+ memberCache = null;
}
}
- protected TemplateModel invokeGenericGet(Map keyMap, Class clazz, String key)
- throws IllegalAccessException,
- InvocationTargetException,
+ protected TemplateModel invokeGenericGet(Map/*<Object, Object>*/ classInfo, Class<?> clazz, String key)
+ throws IllegalAccessException, InvocationTargetException,
TemplateModelException {
- Method genericGet = (Method) keyMap.get(ClassIntrospector.GENERIC_GET_KEY);
- if (genericGet == null)
+ Method genericGet = (Method) classInfo.get(ClassIntrospector.GENERIC_GET_KEY);
+ if (genericGet == null) {
return UNKNOWN;
+ }
return wrapper.invokeMethod(object, genericGet, new Object[] { key });
}
@@ -295,13 +287,13 @@ implements
return ((String) object).length() == 0;
}
if (object instanceof Collection) {
- return ((Collection) object).isEmpty();
+ return ((Collection<?>) object).isEmpty();
}
if (object instanceof Iterator && wrapper.is2324Bugfixed()) {
- return !((Iterator) object).hasNext();
+ return !((Iterator<?>) object).hasNext();
}
if (object instanceof Map) {
- return ((Map) object).isEmpty();
+ return ((Map<?,?>) object).isEmpty();
}
return object == null || Boolean.FALSE.equals(object);
}
@@ -310,7 +302,7 @@ implements
* Returns the same as {@link #getWrappedObject()}; to ensure that, this method will be final starting from 2.4.
* This behavior of {@link BeanModel} is assumed by some FreeMarker code.
*/
- public Object getAdaptedObject(Class hint) {
+ public Object getAdaptedObject(Class<?> hint) {
return object; // return getWrappedObject(); starting from 2.4
}
@@ -327,7 +319,7 @@ implements
}
public TemplateCollectionModel values() throws TemplateModelException {
- List values = new ArrayList(size());
+ List<Object> values = new ArrayList<Object>(size());
TemplateModelIterator it = keys().iterator();
while (it.hasNext()) {
String key = ((TemplateScalarModel) it.next()).getAsString();
@@ -363,7 +355,7 @@ implements
* interface. Subclasses that override <tt>invokeGenericGet</tt> to
* provide additional hash keys should also override this method.
*/
- protected Set keySet() {
+ protected Set/*<Object>*/ keySet() {
return wrapper.getClassIntrospector().keySet(object.getClass());
}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/c253e33d/src/main/java/freemarker/ext/beans/ClassIntrospector.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/beans/ClassIntrospector.java b/src/main/java/freemarker/ext/beans/ClassIntrospector.java
index c852636..7c08e49 100644
--- a/src/main/java/freemarker/ext/beans/ClassIntrospector.java
+++ b/src/main/java/freemarker/ext/beans/ClassIntrospector.java
@@ -28,7 +28,6 @@ import java.beans.PropertyDescriptor;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
-import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/c253e33d/src/main/java/freemarker/template/AdapterTemplateModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/template/AdapterTemplateModel.java b/src/main/java/freemarker/template/AdapterTemplateModel.java
index fb76d22..2f32cae 100644
--- a/src/main/java/freemarker/template/AdapterTemplateModel.java
+++ b/src/main/java/freemarker/template/AdapterTemplateModel.java
@@ -45,5 +45,5 @@ public interface AdapterTemplateModel extends TemplateModel {
* @return the underlying object, or its value accommodated for the hint
* class.
*/
- public Object getAdaptedObject(Class hint);
+ public Object getAdaptedObject(Class<?> hint);
}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/c253e33d/src/main/java/freemarker/template/SimpleSequence.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/template/SimpleSequence.java b/src/main/java/freemarker/template/SimpleSequence.java
index 0cc9411..e0ea945 100644
--- a/src/main/java/freemarker/template/SimpleSequence.java
+++ b/src/main/java/freemarker/template/SimpleSequence.java
@@ -161,7 +161,7 @@ public class SimpleSequence extends WrappingTemplateModel implements TemplateSeq
* using {@link DefaultListAdapter} instead.
*
* @param collection
- * The collection containing the initial items of this sequence. A shalow copy of this collection is made
+ * The collection containing the initial items of the sequence. A shallow copy of this collection is made
* immediately for internal use (thus, later modification on the parameter collection won't be visible in
* the resulting sequence). The items however, will be only wrapped with the {@link ObjectWrapper}
* lazily, when first needed.