[294672] [validation] Errors generated by El Generated and associated classes are not being reported
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCoreMessages.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCoreMessages.java
index fcc32ed..9269604 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCoreMessages.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCoreMessages.java
@@ -52,6 +52,7 @@
 	public static String JSPTranslator_3;
 	public static String JSPTranslator_4;
 	public static String JSPTranslator_5;
+	public static String JSPELTranslator_0;
 	public static String TLDValidator_MissingValidator;
 	public static String TLDValidator_MissingVariable;
 	public static String TLDValidator_MissingListener;
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePluginResources.properties b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePluginResources.properties
index 284a121..e2a16de 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePluginResources.properties
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePluginResources.properties
@@ -41,6 +41,7 @@
 JSPTranslator_3=Unknown type for identifier "{0}"
 JSPTranslator_4=Missing start tag for "{0}"
 JSPTranslator_5=Missing end tag for "{0}"
+JSPELTranslator_0=The function {0} is undefined
 TLDValidator_MissingValidator=The TagLibraryValidator subclass '{0}' was not found on the Java Build Path
 TLDValidator_MissingVariable=The variable class '{0}' was not found on the Java Build Path
 TLDValidator_MissingListener=The listener class '{0}' was not found on the Java Build Path
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/IJSPProblem.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/IJSPProblem.java
index 4bd7140..8270cd8 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/IJSPProblem.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/IJSPProblem.java
@@ -28,7 +28,8 @@
 	int EndCustomTagMissing  = F_PROBLEM_ID_LITERAL + 10;
 	int UseBeanStartTagMissing  = F_PROBLEM_ID_LITERAL + 11;
 	int UseBeanEndTagMissing  = F_PROBLEM_ID_LITERAL + 12;
-	
+	int ELProblem = F_PROBLEM_ID_LITERAL + 13;
+
 	/**
 	 * @return the ID of this JSP problem
 	 */
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
index d16ee8e..cc07896 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
@@ -1634,7 +1634,8 @@
 	private void translateEL(String elText, String delim, IStructuredDocumentRegion currentNode, int contentStart, int contentLength) {
 		IJSPELTranslator translator = getELTranslator();
 		if (null != translator) {
-			translator.translateEL(elText, delim, currentNode, contentStart, contentLength, fUserELExpressions, fUserELRanges, fStructuredDocument);
+			List elProblems = translator.translateEL(elText, delim, currentNode, contentStart, contentLength, fUserELExpressions, fUserELRanges, fStructuredDocument);
+			fTranslationProblems.addAll(elProblems);
 		}
 	}
 
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGenerator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGenerator.java
index 11292e3..7ee3b72 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGenerator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGenerator.java
@@ -12,8 +12,10 @@
 
 package org.eclipse.jst.jsp.core.internal.java.jspel;
 
+import java.util.List;
 import java.util.Map;
 
+import org.eclipse.jst.jsp.core.jspel.ELProblem;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
@@ -30,18 +32,25 @@
     public ELGenerator() {
     } // constructor
 	
-
     /**
      * Check the netuiel AST and set diagnostics as necessary.
-     * @param translator TODO
-     * @param jspReferenceRegion TODO
-     * @param contentStart 
-     * @param contentLength 
+     * 
+     * @param root
+     * @param currentNode
+     * @param result
+     * @param codeMap
+     * @param document
+     * @param jspReferenceRegion
+     * @param contentStart
+     * @param contentLength
+     * @return a {@link List} of {@link ELProblem}s reported by the {@link ELGeneratorVisitor} this {@link ELGenerator} uses
      */
-    public void generate(ASTExpression root, IStructuredDocumentRegion currentNode, StringBuffer result, Map codeMap, IStructuredDocument document, ITextRegionCollection jspReferenceRegion, int contentStart, int contentLength) {
+    public List generate(ASTExpression root, IStructuredDocumentRegion currentNode, StringBuffer result, Map codeMap, IStructuredDocument document, ITextRegionCollection jspReferenceRegion, int contentStart, int contentLength) {
 		ELGeneratorVisitor visitor = new ELGeneratorVisitor(result, currentNode, codeMap, document, jspReferenceRegion, contentStart);
 		visitor.startFunctionDefinition(root.getFirstToken().beginColumn - 1);
 		root.jjtAccept(visitor, null);
 		visitor.endFunctionDefinition(root.getLastToken().endColumn - 1);
+		
+		return visitor.getELProblems();
     }
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGeneratorVisitor.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGeneratorVisitor.java
index f9d8fdd..7bb6633 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGeneratorVisitor.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGeneratorVisitor.java
@@ -15,6 +15,7 @@
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.java.jspel;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -27,11 +28,14 @@
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jface.text.Position;
+import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
 import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentImpl;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDFunction;
+import org.eclipse.jst.jsp.core.jspel.ELProblem;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
@@ -108,6 +112,8 @@
 
 	private boolean fUseParameterizedTypes;
 
+	private List fELProblems;
+
 	/**
 	 * Tranlsation of XML-style operators to java
 	 */
@@ -143,6 +149,7 @@
 		fCurrentNode = currentNode;
 		fGeneratedFunctionStart = -1; //set when generating function definition
 		fUseParameterizedTypes = compilerSupportsParameterizedTypes();
+		fELProblems = new ArrayList();
 	}
 
 	/**
@@ -544,10 +551,29 @@
 			}
 			append(")"); //$NON-NLS-1$
 		}
+		else {
+			//column offsets are 1 based not 0 based, thus subtract one
+			final int problemOffset = fContentStart + node.getFirstToken().beginColumn - 1;
+			final int problemLength = node.getLastToken().endColumn - 1;
+
+			//could not find function translation so report error
+			fELProblems.add(new ELProblem(new Position(problemOffset, problemLength), NLS.bind(JSPCoreMessages.JSPELTranslator_0, node.getFullFunctionName())));
+			
+			//error message to be injected into translation purely for debugging purposes
+			String errorMsg = "\"Could not find function translation for: " + node.getFullFunctionName() + "\""; //$NON-NLS-1$ //$NON-NLS-2$
+			append(errorMsg);
+ 		}
 		return null;
 	}
 
 	/**
+	 * @return the {@link ELProblem}s found by this visitor
+	 */
+	public List getELProblems() {
+		return fELProblems;
+	}
+
+	/**
 	 * Literal
 	 */
 	public Object visit(ASTLiteral node, Object data) {
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELTranslator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELTranslator.java
index 745f9e6..c995a1a 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELTranslator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELTranslator.java
@@ -47,7 +47,8 @@
 			
 				ASTExpression expression = elParser.Expression();
 				ELGenerator gen = new ELGenerator();
-				gen.generate(expression, currentNode, fUserELExpressions, fUserELRanges, document, currentNode, contentStart, contentLength);
+				List generatorELProblems = gen.generate(expression, currentNode, fUserELExpressions, fUserELRanges, document, currentNode, contentStart, contentLength);
+				elProblems.addAll(generatorELProblems);
 			}
 		} catch (ParseException e) {
 			Token curTok = e.currentToken;
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/jspel/ELProblem.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/jspel/ELProblem.java
index cb548c0..ef95d18 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/jspel/ELProblem.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/jspel/ELProblem.java
@@ -13,22 +13,78 @@
 package org.eclipse.jst.jsp.core.jspel;
 
 import org.eclipse.jface.text.Position;
+import org.eclipse.jst.jsp.core.internal.java.IJSPProblem;
 
-public class ELProblem {
+/**
+ * All ELProblems are currently assumed to be errors.
+ */
+public class ELProblem implements IJSPProblem {
 	private Position fPos;
 	private String fMessage;
-	
+	private int fId = IJSPProblem.ELProblem;
+
+	/**
+	 * @param pos should be relative to the JSP document the error is to be reported on
+	 * @param message
+	 */
 	public ELProblem(Position pos, String message)	{
 		fPos = pos;
 		fMessage = message;
 	}
+
+	public ELProblem(Position pos, String message, int id)	{
+		fPos = pos;
+		fMessage = message;
+		fId = id;
+	}
 	
 	public String getMessage() {
 		return fMessage;
 	}
 	
-
 	public Position getPosition() {
 		return fPos;
 	}
+
+	public String[] getArguments() {
+		return null;
+	}
+
+	public int getID() {
+		return fId;
+	}
+	
+	public int getEID() {
+		return fId;
+	}
+
+	public char[] getOriginatingFileName() {
+		return null;
+	}
+
+	public int getSourceEnd() {
+		return fPos.getOffset() + fPos.getLength();
+	}
+
+	public int getSourceLineNumber() {
+		return 0;
+	}
+
+	public int getSourceStart() {
+		return fPos.getOffset();
+	}
+
+	public boolean isError() {
+		return true;
+	}
+
+	public boolean isWarning() {
+		return false;
+	}
+
+	public void setSourceEnd(int sourceEnd) {}
+
+	public void setSourceLineNumber(int lineNumber) {}
+
+	public void setSourceStart(int sourceStart) {}
 }