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