[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)