TRINIDAD-2434: fixed performance issue when retrieving node type method
diff --git a/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/TreeRenderer.java b/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/TreeRenderer.java
index 365d018..e8fc3a7 100644
--- a/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/TreeRenderer.java
+++ b/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/TreeRenderer.java
@@ -881,22 +881,39 @@
String nodeType = null;
Object rowData = tree.getRowData();
Class rowClass = rowData.getClass();
- Method method = null;
+ Method method;
try
{
- method = rowClass.getMethod("getNodeType");
+ method = retrieveGetNodeTypeMethod(rowClass);
if (method != null && method.getReturnType().equals(String.class))
{
nodeType = (String) method.invoke(rowData);
}
}
catch (IllegalAccessException e) { ; }
- catch (NoSuchMethodException e) { ; }
catch (InvocationTargetException e) { ; }
return nodeType;
}
+ private Method retrieveGetNodeTypeMethod(Class rowClass)
+ {
+ try {
+ synchronized (NODE_TYPE_METHOD_CACHE) {
+ if (NODE_TYPE_METHOD_CACHE.containsKey(rowClass))
+ {
+ return NODE_TYPE_METHOD_CACHE.get(rowClass);
+ }
+
+ Method getNodeTypeMethod = rowClass.getMethod("getNodeType");
+ NODE_TYPE_METHOD_CACHE.put(rowClass, getNodeTypeMethod);
+ return getNodeTypeMethod;
+ }
+ } catch (Exception e)
+ { return null; }
+
+ }
+
protected String getNodeIconSelector(
String nodeType,
int expandedState)
@@ -1202,6 +1219,7 @@
// Key used by StyledTextBean to query style class
static final String _STYLE_CLASS_KEY = "_styleClass";
+ private final Map<Class<?>, Method> NODE_TYPE_METHOD_CACHE = new HashMap<Class<?>, Method>();
private PropertyKey _immediateKey;
// translation keys