[389174] jsp:useBean doesn't work for nested generics e.g. type="List<List<Boolean>>"
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 73fe234..ae8de80 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
@@ -3073,45 +3073,44 @@
 	 */
 	private boolean isTypeFound(String rawTypeValue, List errorTypeNames) {
 		IFile file = getFile();
-		if(file == null)
+		if (file == null)
 			return true;
-		
+
 		IProject project = file.getProject();
 		IJavaProject p = JavaCore.create(project);
 		if (p.exists()) {
-			String types[] = new String[3];
+			List types = new ArrayList();
 			if (rawTypeValue.indexOf('<') > 0) {
 				// JSR 14 : Generics are being used, parse them out
 				try {
 					StringTokenizer toker = new StringTokenizer(rawTypeValue);
-					// generic
-					types[0] = toker.nextToken("<"); //$NON-NLS-1$
-					// type 1 or key
-					types[1] = toker.nextToken(",>"); //$NON-NLS-1$
-					// type 2 or value
-					types[2] = toker.nextToken(",>"); //$NON-NLS-1$
+					String token = toker.nextToken("<,>/\""); //$NON-NLS-1$
+					while (token != null) {
+						types.add(token);
+						token = toker.nextToken("<,>/\""); //$NON-NLS-1$
+					}
 				}
 				catch (NoSuchElementException e) {
 					// StringTokenizer failure with unsupported syntax
+					return true;
 				}
 			}
 			else {
-				types[0] = rawTypeValue;
+				types.add(rawTypeValue);
 			}
 
-			for (int i = 0; i < types.length; i++) {
-				if (types[i] != null) {
-					// remove any array suffixes 
-					if (types[i].indexOf('[') > 0) {
-						types[i] = types[i].substring(0, types[i].indexOf('['));
-					}
-					// remove any "extends" prefixes (JSR 14)
-					if (types[i].indexOf("extends") > 0) { //$NON-NLS-1$
-						types[i] = StringUtils.strip(types[i].substring(types[i].indexOf("extends"))); //$NON-NLS-1$
-					}
-
-					addNameToListIfTypeNotFound(p, types[i], errorTypeNames);
+			for (int i = 0; i < types.size(); i++) {
+				String typeName = types.get(i).toString();
+				// remove any array suffixes
+				if (typeName.indexOf('[') > 0 && typeName.indexOf(']') > typeName.indexOf('[')) {
+					typeName = typeName.substring(0, typeName.indexOf('['));
 				}
+				// remove any "extends" prefixes (JSR 14)
+				if (typeName.indexOf("extends") > 0) { //$NON-NLS-1$
+					typeName = StringUtils.strip(typeName.substring(typeName.indexOf("extends"))); //$NON-NLS-1$
+				}
+
+				addNameToListIfTypeNotFound(p, typeName, errorTypeNames);
 			}
 		}
 		return errorTypeNames.isEmpty();
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/hyperlink/JSPJavaHyperlinkDetector.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/hyperlink/JSPJavaHyperlinkDetector.java
index 7b2ba67..dd561e5 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/hyperlink/JSPJavaHyperlinkDetector.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/hyperlink/JSPJavaHyperlinkDetector.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2011 IBM Corporation and others.
+ * Copyright (c) 2006, 2012 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -27,6 +27,7 @@
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITypedRegion;
 import org.eclipse.jface.text.Region;
 import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
 import org.eclipse.jface.text.hyperlink.IHyperlink;
@@ -44,6 +45,7 @@
  * Detects hyperlinks in JSP Java content
  */
 public class JSPJavaHyperlinkDetector extends AbstractHyperlinkDetector {
+	private static final String SUPPORTED_PARTITION_TYPE= "org.eclipse.jst.jsp.SCRIPT.JAVA"; //$NON-NLS-1$
 
 	private IHyperlink createHyperlink(IJavaElement element, IRegion region, IDocument document) {
 		IHyperlink link = null;
@@ -131,28 +133,41 @@
 
 		if (region != null && textViewer != null) {
 			IDocument document = textViewer.getDocument();
-
-			// check and make sure this is a valid Java type
-			JSPTranslation jspTranslation = getJSPTranslation(document);
-			if (jspTranslation != null) {
-				// check if we are in JSP Java content
-				int javaOffset = jspTranslation.getJavaOffset(region.getOffset());
-				if (javaOffset > -1) {
-					// check that we are not in indirect Java content (like
-					// included files)
-					if (!jspTranslation.isIndirect(javaOffset)) {
-						// get Java elements
-						IJavaElement[] elements = jspTranslation.getElementsFromJspRange(region.getOffset(), region.getOffset() + region.getLength());
-						if (elements != null && elements.length > 0) {
-							// create a JSPJavaHyperlink for each Java element
-							for (int i = 0; i < elements.length; ++i) {
-								IJavaElement element = elements[i];
-
-								// find hyperlink range for Java element
-								IRegion hyperlinkRegion = selectWord(document, region.getOffset());
-								IHyperlink link = createHyperlink(element, hyperlinkRegion, document);
-								if (link != null) {
-									hyperlinks.add(link);
+			boolean proceed = false;
+			try {
+				ITypedRegion[] partitions = document.computePartitioning(region.getOffset(), region.getLength());
+				for (int i = 0; i < partitions.length; i++) {
+					if (SUPPORTED_PARTITION_TYPE.equals(partitions[i].getType())) {
+						proceed = true;
+						break;
+					}
+				}
+			}
+			catch (BadLocationException e) {
+				proceed = true;
+			}
+			if (proceed) {
+				JSPTranslation jspTranslation = getJSPTranslation(document);
+				if (jspTranslation != null) {
+					// check if we are in JSP Java content
+					int javaOffset = jspTranslation.getJavaOffset(region.getOffset());
+					if (javaOffset > -1) {
+						// check that we are not in indirect Java content (like
+						// included files)
+						if (!jspTranslation.isIndirect(javaOffset)) {
+							// get Java elements
+							IJavaElement[] elements = jspTranslation.getElementsFromJspRange(region.getOffset(), region.getOffset() + region.getLength());
+							if (elements != null && elements.length > 0) {
+								// create a JSPJavaHyperlink for each Java element
+								for (int i = 0; i < elements.length; ++i) {
+									IJavaElement element = elements[i];
+	
+									// find hyperlink range for Java element
+									IRegion hyperlinkRegion = selectWord(document, region.getOffset());
+									IHyperlink link = createHyperlink(element, hyperlinkRegion, document);
+									if (link != null) {
+										hyperlinks.add(link);
+									}
 								}
 							}
 						}
diff --git a/bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/internal/validation/JsValidator.java b/bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/internal/validation/JsValidator.java
index 19d6341..2dd0e75 100644
--- a/bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/internal/validation/JsValidator.java
+++ b/bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/internal/validation/JsValidator.java
@@ -132,10 +132,12 @@
 	private IMessage createMessageFromProblem(IProblem problem, IFile f, IJsTranslation translation, IDocument textDoc) {
 		int sourceStart = problem.getSourceStart();
 		int sourceEnd = problem.getSourceEnd();
-		if (sourceStart == -1) {
+		if (sourceStart < 0) {
 			return null;
 		}
 		sourceStart = ((JsTranslation)translation).getWebPageOffset(sourceStart);
+		if (sourceStart < 0)
+			return null;
 		sourceEnd = ((JsTranslation)translation).getWebPageOffset(sourceEnd);
 		/*
 		 * Bug 241794 - Validation shows errors when using JSP Expressions
diff --git a/bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/javascript/JsTranslation.java b/bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/javascript/JsTranslation.java
index 9021f94..aabb7e4 100644
--- a/bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/javascript/JsTranslation.java
+++ b/bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/javascript/JsTranslation.java
@@ -314,9 +314,13 @@
 	}
 	
 	public IJavaScriptElement[] getElementsFromWebRange(int webPositionStart, int webPositionEnd) {
-		int javaPositionStart = getJavaScriptOffset(webPositionStart);
-		int javaPositionEnd = getJavaScriptOffset(webPositionEnd);
-		return getElementsFromJsRange(javaPositionStart, javaPositionEnd);
+		int javaScriptPositionStart = getJavaScriptOffset(webPositionStart);
+		int javaScriptPositionEnd = getJavaScriptOffset(webPositionEnd);
+		
+		if (javaScriptPositionStart < 0 || javaScriptPositionEnd < 0)
+			return new IJavaScriptElement[0];
+
+		return getElementsFromJsRange(javaScriptPositionStart, javaScriptPositionEnd);
 	}
 
 	private String getHtmlPageName() {
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java
index 7e71549..a2ad00f 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java
@@ -64,11 +64,12 @@
    */
   public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor){
 	  ValidationResult result = new ValidationResult();  
-	  IReporter reporter = result.getReporter(monitor);
 		IFile file = null;
 		if (resource instanceof IFile)file = (IFile)resource;
 		if (file != null && shouldValidate(file))
 		{
+		  IReporter reporter = result.getReporter(monitor);
+
 		  NestedValidatorContext nestedcontext = getNestedContext(state, false);
 	      boolean teardownRequired = false;
 	      if (nestedcontext == null)