3.0.5Patch - Bug 293211 - Performance problem when validate managed properties
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyNameValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyNameValidationVisitor.java
index f58804d..ae6bf84 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyNameValidationVisitor.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyNameValidationVisitor.java
@@ -10,11 +10,21 @@
*******************************************************************************/
package org.eclipse.jst.jsf.validation.internal.appconfig;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
+import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
+import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
/**
@@ -25,6 +35,8 @@
class PropertyNameValidationVisitor extends EObjectValidationVisitor
{
private final EStructuralFeature _parentClassNameFeature;
+ private final Map<IType, Map<String, JDTBeanProperty>> _propertyCache;
+ private final Map<String, IType> _typeCache;
/**
* @param feature
@@ -36,6 +48,8 @@
{
super(feature, version);
_parentClassNameFeature = parentClassNameFeature;
+ _propertyCache = new HashMap<IType, Map<String, JDTBeanProperty>>();
+ _typeCache = new HashMap<String, IType>();
}
protected EObjectValidationVisitor[] getChildNodeValidators()
@@ -49,13 +63,13 @@
if (parentClassType != null)
{
- String typeSig =
- PropertyValidationVisitor.validateProperty((PropertyNameType)object
+ final boolean isBeanProperty =
+ validateProperty((PropertyNameType)object
, file.getProject(), parentClassType);
final String propertyName =
((PropertyNameType)object).getTextContent();
- if (typeSig == null)
+ if (!isBeanProperty)
{
PropertyValidationVisitor.addMessageInfo(messages,
DiagnosticFactory
@@ -98,4 +112,58 @@
return parentClassType;
}
+
+ private boolean validateProperty(PropertyNameType object, IProject project, String parentClassType)
+ {
+ boolean isBeanProperty = false;
+
+ final IType type = getType(parentClassType, project);
+
+ if (type != null)
+ {
+ final String propertyName = object.getTextContent();
+
+ Map<String, JDTBeanProperty> cachedType = _propertyCache.get(type);
+ if (cachedType == null)
+ {
+ cachedType = getProperties(type, project);
+ _propertyCache.put(type, cachedType);
+ }
+
+ final JDTBeanProperty beanProperty = cachedType.get(propertyName);
+
+ if (beanProperty != null)
+ {
+ isBeanProperty = true;
+ }
+ }
+ return isBeanProperty;
+ }
+
+ private Map<String, JDTBeanProperty> getProperties(final IType type, final IProject project)
+ {
+ final JDTBeanIntrospector introspector = new JDTBeanIntrospector(type);
+ return introspector.getProperties();
+ }
+
+ private IType getType(final String typeName, final IProject project)
+ {
+ IType type = _typeCache.get(typeName);
+ if (type == null)
+ {
+ IJavaProject javaProject = JavaCore.create(project);
+ try
+ {
+ type = javaProject.findType(typeName);
+ _typeCache.put(typeName, type);
+ }
+ catch (JavaModelException e)
+ {
+ JSFCorePlugin
+ .log(new Exception(e),
+ "Problem validating on parent: "+typeName);
+ }
+ }
+ return type;
+ }
}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyValidationVisitor.java
index be9f5ec..5ff1e81 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyValidationVisitor.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyValidationVisitor.java
@@ -11,21 +11,11 @@
package org.eclipse.jst.jsf.validation.internal.appconfig;
import java.util.List;
-import java.util.Map;
import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
-import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
/**
* Validates property's
@@ -73,38 +63,5 @@
};
}
- static String validateProperty(PropertyNameType object, IProject project, String parentClassType)
- {
- String signatureBeanProperty = null;
- try
- {
- IJavaProject javaProject = JavaCore.create(project);
- IType type = javaProject.findType(parentClassType);
-
- if (type != null)
- {
- final JDTBeanIntrospector introspector =
- new JDTBeanIntrospector(type);
-
- final Map properties = introspector.getProperties();
- final String propertyName = object.getTextContent();
- if (properties.containsKey(propertyName))
- {
- final JDTBeanProperty beanProperty =
- (JDTBeanProperty) properties.get(propertyName);
- signatureBeanProperty =
- beanProperty.getTypeSignature();
- }
- }
- }
- catch(JavaModelException jme)
- {
- JSFCorePlugin
- .log(new Exception(jme),
- "Problem validating on parent: "+parentClassType);
- }
-
- return signatureBeanProperty;
- }
}