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;
-    }
 }