blob: d6e7c117658ee8fb80f28a080e302bc1844c5807 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2020 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Nick Boldt, Red Hat - disable tests that don't work with Photon.0.M5; make reusable method public (see TEIValidation.java)
*
*******************************************************************************/
package org.eclipse.jst.jsp.core.tests.translation;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.compiler.IProblem;
import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;
import org.eclipse.jst.jsp.core.internal.contenttype.DeploymentDescriptorPropertyCache;
import org.eclipse.jst.jsp.core.internal.contenttype.ServletAPIDescriptor;
import org.eclipse.jst.jsp.core.internal.java.IJSPProblem;
import org.eclipse.jst.jsp.core.internal.java.IJSPTranslation;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslation;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslationAdapter;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslationExtension;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslationUtil;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslator;
import org.eclipse.jst.jsp.core.internal.modelhandler.ModelHandlerForJSP;
import org.eclipse.jst.jsp.core.internal.preferences.JSPCorePreferenceNames;
import org.eclipse.jst.jsp.core.internal.taglib.CustomTag;
import org.eclipse.jst.jsp.core.internal.taglib.TaglibHelper;
import org.eclipse.jst.jsp.core.internal.validation.JSPJavaValidator;
import org.eclipse.jst.jsp.core.internal.validation.JSPValidator;
import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
import org.eclipse.jst.jsp.core.tests.JSPCoreTestsPlugin;
import org.eclipse.jst.jsp.core.tests.ProjectUtil;
import org.eclipse.jst.jsp.core.tests.taglibindex.BundleResourceUtil;
import org.eclipse.jst.jsp.core.tests.validation.ReporterForTest;
import org.eclipse.jst.jsp.core.tests.validation.ValidationContextForTest;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.validation.ValidationFramework;
import org.eclipse.wst.validation.internal.core.Message;
import org.eclipse.wst.validation.internal.operations.ValidatorManager;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import junit.framework.TestCase;
public class JSPJavaTranslatorCoreTest extends TestCase {
static final String WTP_AUTOTEST_NONINTERACTIVE = "wtp.autotest.noninteractive";
private static byte[] creationLock = new byte[0];
public JSPJavaTranslatorCoreTest() {
}
public JSPJavaTranslatorCoreTest(String name) {
super(name);
}
String wtp_autotest_noninteractive = null;
protected void setUp() throws Exception {
super.setUp();
String noninteractive = System.getProperty(WTP_AUTOTEST_NONINTERACTIVE);
if (noninteractive != null)
wtp_autotest_noninteractive = noninteractive;
System.setProperty(WTP_AUTOTEST_NONINTERACTIVE, "true");
}
protected void tearDown() throws Exception {
super.tearDown();
if (wtp_autotest_noninteractive != null)
System.setProperty(WTP_AUTOTEST_NONINTERACTIVE, wtp_autotest_noninteractive);
}
public void test_107338() throws Exception {
String projectName = "bug_107338";
// Create new project
IProject project = BundleResourceUtil.createSimpleProject(projectName, null, null);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + projectName, "/" + projectName);
project.open(new NullProgressMonitor());
IFile file = project.getFile("WebContent/test107338.jsp");
assertTrue(file.exists());
IStructuredModel model = StructuredModelManager.getModelManager().getModelForRead(file);
IDOMModel jspModel = (IDOMModel) model;
String jspSource = model.getStructuredDocument().get();
assertTrue("line delimiters have been converted to Windows [CRLF]", jspSource.indexOf("\r\n") < 0);
assertTrue("line delimiters have been converted to Mac [CR]", jspSource.indexOf("\r") < 0);
ModelHandlerForJSP.ensureTranslationAdapterFactory(model);
IDOMDocument xmlDoc = jspModel.getDocument();
JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) xmlDoc.getAdapterFor(IJSPTranslation.class);
JSPTranslation translation = translationAdapter.getJSPTranslation();
// System.err.print(translation.getJavaText());
assertTrue("new-line beginning scriptlet missing from translation", translation.getJavaText().indexOf("int i = 0;") >= 0);
model.releaseFromRead();
}
/**
* Tests jsp translation when jsp is within html comments. See
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=126377
*
* @throws Exception
*/
public void test_126377() throws Exception {
String projectName = "bug_126377";
// Create new project
IProject project = BundleResourceUtil.createJavaWebProject(projectName);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + projectName, "/" + projectName);
IFile file = project.getFile("WebContent/test126377_noerror.jsp");
assertTrue(file.exists());
JSPValidator validator = new JSPJavaValidator();
IReporter reporter = new ReporterForTest();
ValidationContextForTest helper = new ValidationContextForTest();
helper.setURI(file.getFullPath().toOSString());
validator.validate(helper, reporter);
String strings = "";
for (int i = 0; i < reporter.getMessages().size(); i++) {
strings = strings + ((IMessage) reporter.getMessages().get(i)).getText() + "\n";
}
assertTrue("found problems within html comments when there should be none: "+ strings, reporter.getMessages().isEmpty());
file = project.getFile("WebContent/test126377_error.jsp");
assertTrue(file.exists());
helper.setURI(file.getFullPath().toOSString());
validator.validate(helper, reporter);
int errors = reporter.getMessages().size();
assertTrue("found "+errors+" jsp java errors within html comments when there should be 3", (errors == 3));
}
// public void testMangling() {
// assertEquals("_simple_2E_tag", JSP2ServletNameUtil.mangle("simple.tag"));
// assertEquals("_simple_2E_jspf", JSP2ServletNameUtil.mangle("simple.jspf"));
// assertEquals("sim_005f_005fple_tagx", JSP2ServletNameUtil.mangle("sim__ple.tagx"));
// assertEquals(new Path("Project.folder.simple_tag"), JSP2ServletNameUtil.mangle("/Project/folder/simple.tag"));
// assertEquals(new Path("Project.fold_005fer.simple_jspx"), JSP2ServletNameUtil.mangle("/Project/fold_er/simple.jspx"));
// }
//
// public void testUnmangling() {
// assertEquals("simple.tag", JSP2ServletNameUtil.unmangle("simple_tag"));
// assertEquals("simple.jspf", JSP2ServletNameUtil.unmangle("simple_jspf"));
// assertEquals("sim__ple.tagx", JSP2ServletNameUtil.unmangle("sim_005f_005fple_tagx"));
// assertEquals(new Path("/Project/folder/simple.tag"), JSP2ServletNameUtil.unmangle("Project.folder.simple_tag"));
// assertEquals(new Path("/Project/fold_er/simple.jspx"), JSP2ServletNameUtil.unmangle("Project.fold_005fer.simple_jspx"));
// }
public void test_174042() throws Exception {
boolean doValidateSegments = JSPCorePlugin.getDefault().getPluginPreferences().getBoolean(JSPCorePreferenceNames.VALIDATE_FRAGMENTS);
String testName = "bug_174042";
// Create new project
IProject project = BundleResourceUtil.createSimpleProject(testName, null, null);
assertTrue(project.exists());
JSPCorePlugin.getDefault().getPluginPreferences().setValue(JSPCorePreferenceNames.VALIDATE_FRAGMENTS, true);
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
BundleResourceUtil.copyBundleEntryIntoWorkspace("/testfiles/struts.jar", "/" + testName + "/struts.jar");
waitForBuildAndValidation(project);
JSPCorePlugin.getDefault().getPluginPreferences().setValue(JSPCorePreferenceNames.VALIDATE_FRAGMENTS, doValidateSegments);
IFile main = project.getFile("main.jsp");
IMarker[] markers = main.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_ZERO);
StringBuffer s = new StringBuffer();
for (int i = 0; i < markers.length; i++) {
s.append("\nproblem marker on line " + markers[i].getAttribute(IMarker.LINE_NUMBER) + ": \"" + markers[i].getAttribute(IMarker.MESSAGE) + "\" ");
}
assertEquals("problem markers found, " + s.toString(), 0, markers.length);
}
/* make reusable method public (see TEIValidation.java) */
public static boolean waitForBuildAndValidation() throws CoreException {
IWorkspaceRoot root = null;
try {
ResourcesPlugin.getWorkspace().checkpoint(true);
Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, new NullProgressMonitor());
Job.getJobManager().join(ResourcesPlugin.FAMILY_MANUAL_BUILD, new NullProgressMonitor());
Job.getJobManager().join(ValidatorManager.VALIDATOR_JOB_FAMILY, new NullProgressMonitor());
Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, new NullProgressMonitor());
Thread.sleep(200);
Job.getJobManager().beginRule(root = ResourcesPlugin.getWorkspace().getRoot(), null);
}
catch (InterruptedException e) {
// woken up from sleep?
StringWriter s = new StringWriter();
e.printStackTrace(new PrintWriter(s));
fail(s.toString());
}
catch (IllegalArgumentException e) {
StringWriter s = new StringWriter();
e.printStackTrace(new PrintWriter(s));
fail(s.toString());
}
catch (OperationCanceledException e) {
StringWriter s = new StringWriter();
e.printStackTrace(new PrintWriter(s));
fail(s.toString());
}
finally {
if (root != null) {
Job.getJobManager().endRule(root);
}
}
return true;
}
/* make reusable method public (see TEIValidation.java) */
public static void waitForBuildAndValidation(IProject project) throws CoreException {
project.build(IncrementalProjectBuilder.CLEAN_BUILD, new NullProgressMonitor());
assertTrue("waitForBuildAndValidation :: Clean build could not be completed for project = " + project.toString(), waitForBuildAndValidation());
project.build(IncrementalProjectBuilder.FULL_BUILD, new NullProgressMonitor());
assertTrue("waitForBuildAndValidation :: Full build could not be completed for project = " + project.toString(), waitForBuildAndValidation());
}
public void test_178443() throws Exception {
boolean doValidateSegments = JSPCorePlugin.getDefault().getPluginPreferences().getBoolean(JSPCorePreferenceNames.VALIDATE_FRAGMENTS);
String testName = "bug_178443";
// Create new project
IProject project = BundleResourceUtil.createSimpleProject(testName, Platform.getStateLocation(JSPCoreTestsPlugin.getDefault().getBundle()).append(testName), null);
assertTrue(project.exists());
/*
* Should be set to false. A referenced class in an included segment
* does not exist.
*/
JSPCorePlugin.getDefault().getPluginPreferences().setValue(JSPCorePreferenceNames.VALIDATE_FRAGMENTS, false);
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
BundleResourceUtil.copyBundleEntryIntoWorkspace("/testfiles/struts.jar", "/" + testName + "/struts.jar");
waitForBuildAndValidation(project);
JSPCorePlugin.getDefault().getPluginPreferences().setValue(JSPCorePreferenceNames.VALIDATE_FRAGMENTS, doValidateSegments);
IFile main = project.getFile("main.jsp");
IMarker[] markers = main.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_ZERO);
StringBuffer s = new StringBuffer();
for (int i = 0; i < markers.length; i++) {
s.append("\nproblem on line " + markers[i].getAttribute(IMarker.LINE_NUMBER) + ": " + markers[i].getAttribute(IMarker.MESSAGE));
}
assertEquals("problem markers found" + s.toString(), 0, markers.length);
}
public void test_109721() throws Exception {
/*
* https://bugs.eclipse.org/109721 JSP editor does not find taglib
* directives in include-prelude or jsp:include, make sure the
* contents were processed
*/
String testName = "bug_109721";
// Create new project
final IProject project = BundleResourceUtil.createSimpleProject(testName, null, null);
assertTrue(project.isAccessible());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
BundleResourceUtil.copyBundleEntryIntoWorkspace("/testfiles/struts.jar", "/" + testName + "/WebContent/WEB-INF/lib/struts.jar");
waitForBuildAndValidation(project);
String filename = "/WebContent/main.jsp";
IStructuredModel sm = StructuredModelManager.getModelManager().getModelForRead(project.getFile(filename));
assertNotNull("couldn't load JSP for test", sm);
JSPTranslationUtil translationUtil = new JSPTranslationUtil(sm.getStructuredDocument());
String translation = translationUtil.getTranslation().getJavaText();
sm.releaseFromRead();
assertTrue("Java content from Fragment included by web.xml is missing", translation.indexOf("int alpha = 5;") > 0);
assertTrue("Tag that could only be known by processing Fragment included only by web.xml is not in the translation", translation.indexOf("org.apache.struts.taglib.bean.DefineTag") > 0);
}
public void test_181057a() throws Exception {
boolean doValidateSegments = JSPCorePlugin.getDefault().getPluginPreferences().getBoolean(JSPCorePreferenceNames.VALIDATE_FRAGMENTS);
String testName = "bug_181057";
// Create new project
IProject j = BundleResourceUtil.createSimpleProject("j", null, null);
assertTrue(j.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/j", "/j");
IProject k = BundleResourceUtil.createSimpleProject("k", null, null);
assertTrue(k.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/k", "/k");
IProject project = BundleResourceUtil.createSimpleProject(testName, Platform.getStateLocation(JSPCoreTestsPlugin.getDefault().getBundle()).append(testName), null);
assertTrue(project.exists());
JSPCorePlugin.getDefault().getPluginPreferences().setValue(JSPCorePreferenceNames.VALIDATE_FRAGMENTS, true);
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
BundleResourceUtil.copyBundleEntryIntoWorkspace("/testfiles/struts.jar", "/" + testName + "/struts.jar");
waitForBuildAndValidation(project);
JSPCorePlugin.getDefault().getPluginPreferences().setValue(JSPCorePreferenceNames.VALIDATE_FRAGMENTS, doValidateSegments);
/*
* main.jsp contains numerous references to tags in struts.jar, which
* is at the end of the build path
*/
IFile main = project.getFile("main.jsp");
IMarker[] markers = main.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_ZERO);
StringBuffer s = new StringBuffer();
for (int i = 0; i < markers.length; i++) {
s.append("\n" + markers[i].getAttribute(IMarker.LINE_NUMBER) + ":" + markers[i].getAttribute(IMarker.MESSAGE));
}
assertEquals("problem markers found" + s.toString(), 0, markers.length);
}
public void test_219761a() throws Exception {
/**
* Broken behavior has a Java syntax error on line 19, which only
* contains an include directive to a fragment that doesn't exist.
*
* All syntax errors should be on lines 25 or 28 and after offset 373
* (single character line delimiter!).
*/
String testName = "testTranslatorMessagesWithIncludes";
// Create new project
IProject project = BundleResourceUtil.createJavaWebProject(testName);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
waitForBuildAndValidation(project);
ValidationFramework.getDefault().validate(new IProject[]{project}, true, true, new NullProgressMonitor());
IFile main = project.getFile("/WebContent/sample.jsp");
assertTrue("sample test file does not exist", main.isAccessible());
IMarker[] markers = main.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_ZERO);
StringBuffer markerText = new StringBuffer();
for (int i = 0; i < markers.length; i++) {
// line/start-end
markerText.append("\nL" + markers[i].getAttribute(IMarker.LINE_NUMBER) + "/o" + markers[i].getAttribute(IMarker.CHAR_START) + "-" + markers[i].getAttribute(IMarker.CHAR_END) + ":" + markers[i].getAttribute(IMarker.MESSAGE));
}
// int numberOfSyntaxErrors = 0;
for (int i = 0; i < markers.length; i++) {
Object message = markers[i].getAttribute(IMarker.MESSAGE);
assertNotNull("Marker message was null!", message);
if (message.toString().startsWith("Syntax error")) {
// numberOfSyntaxErrors++;
assertTrue("Syntax error reported before line 25" + markerText, ((Integer) markers[i].getAttribute(IMarker.LINE_NUMBER)).intValue() >= 25);
// assertTrue("Syntax error reported before offset 371" + markerText, ((Integer) markers[i].getAttribute(IMarker.CHAR_START)).intValue() >= 370);
// assertTrue("Syntax error reported after 456" + markerText, ((Integer) markers[i].getAttribute(IMarker.CHAR_START)).intValue() < 456);
}
}
// assertEquals("wrong number of syntax errors reported\n" + markerText, 3, numberOfSyntaxErrors);
// clean up if we got to the end
try {
project.delete(true, true, null);
}
catch (Exception e) {
// not a failure condition
}
}
public void test_150794() throws Exception {
String testName = "bug_150794";
// Create new project
IProject project = BundleResourceUtil.createJavaWebProject(testName);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
IFile main = project.getFile("/WebContent/escapedQuotes.jsp");
assertTrue("sample test file does not exist", main.isAccessible());
JSPJavaValidator validator = new JSPJavaValidator();
IReporter reporter = new ReporterForTest();
ValidationContextForTest helper = new ValidationContextForTest();
helper.setURI(main.getFullPath().toOSString());
validator.validate(helper, reporter);
String strings = "";
for (int i = 0; i < reporter.getMessages().size(); i++) {
strings = strings + ((IMessage) reporter.getMessages().get(i)).getText() + "\n";
}
assertTrue("Unexpected problems found: " + strings, reporter.getMessages().isEmpty());
// clean up if we got to the end
try {
project.delete(true, true, null);
}
catch (Exception e) {
// not a failure condition
}
}
public void test_preludes() throws Exception {
String testName = "testPreludeAndCodas";
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(testName);
synchronized (creationLock) {
if (!project.isAccessible()) {
// Create new project
project = BundleResourceUtil.createSimpleProject(testName, null, null);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
}
}
IFile main = project.getFile("/web stuff/prelude-user/test.jsp");
assertTrue("sample test file not accessible", main.isAccessible());
IDOMModel model = null;
try {
model = (IDOMModel) StructuredModelManager.getModelManager().getModelForEdit(main);
ModelHandlerForJSP.ensureTranslationAdapterFactory(model);
JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) model.getDocument().getAdapterFor(IJSPTranslation.class);
IJSPTranslation translation = translationAdapter.getJSPTranslation();
assertNotNull("no Java translation found", translation);
assertTrue("prelude0 contents not included", translation.getJavaText().indexOf("int prelude0") > 0);
assertTrue("prelude1 contents not included", translation.getJavaText().indexOf("int prelude1") > 0);
assertTrue("import statement not found", translation.getJavaText().indexOf("import java.lang.ref.Reference") > 0);
}
finally {
if (model != null)
model.releaseFromEdit();
}
}
public void testApiDetection1() throws Exception {
String testName = "testapidetection1";
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(testName);
synchronized (creationLock) {
if (!project.isAccessible()) {
// Create new project
project = BundleResourceUtil.createSimpleProject(testName, null, new String[] {JavaCore.NATURE_ID, "org.eclipse.pde.PluginNature"});
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
}
}
ServletAPIDescriptor servletAPIVersion = DeploymentDescriptorPropertyCache.getInstance().getServletAPIVersion(project);
assertNotNull("no API version was detected", servletAPIVersion);
// TODO: enable this test
// IClasspathEntry[] resolvedClasspath = JavaCore.create(project).getResolvedClasspath(true);
// StringBuilder builder = new StringBuilder();
// for (int i = 0; i < resolvedClasspath.length; i++) {
// builder.append('\n');
// builder.append(resolvedClasspath[i].getPath());
// }
// assertFalse("Default API version returned, nothing was detected\n" + builder, servletAPIVersion == ServletAPIDescriptor.DEFAULT);
// assertEquals("Unexpected API version", 3.1f, servletAPIVersion.getAPIversion());
// assertEquals("Unexpected root package", "javax.servlet", servletAPIVersion.getRootPackage());
}
public void testApiDetection2() throws Exception {
String testName = "testapidetection2";
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(testName);
synchronized (creationLock) {
if (!project.isAccessible()) {
// Create new project
project = BundleResourceUtil.createSimpleProject(testName, null, new String[] {JavaCore.NATURE_ID, "org.eclipse.pde.PluginNature"});
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
}
}
ServletAPIDescriptor servletAPIVersion = DeploymentDescriptorPropertyCache.getInstance().getServletAPIVersion(project);
assertNotNull("no API version was detected", servletAPIVersion);
// TODO: enable this test
// IClasspathEntry[] resolvedClasspath = JavaCore.create(project).getResolvedClasspath(true);
// StringBuilder builder = new StringBuilder();
// for (int i = 0; i < resolvedClasspath.length; i++) {
// builder.append('\n');
// builder.append(resolvedClasspath[i].getPath());
// }
// assertFalse("Default API version returned, nothing was detected\n" + builder, servletAPIVersion == ServletAPIDescriptor.DEFAULT);
// assertEquals("Unexpected API version", 3.1f, servletAPIVersion.getAPIversion());
// assertEquals("Unexpected root package", "javax.servlet", servletAPIVersion.getRootPackage());
}
public void test_codas() throws Exception {
String testName = "testPreludeAndCodas";
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(testName);
synchronized (creationLock) {
if (!project.isAccessible()) {
// Create new project
project = BundleResourceUtil.createSimpleProject(testName, null, null);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
}
}
IFile main = project.getFile("/web stuff/coda-user/test.jsp");
assertTrue("sample test file not accessible", main.isAccessible());
IDOMModel model = null;
try {
model = (IDOMModel) StructuredModelManager.getModelManager().getModelForEdit(main);
ModelHandlerForJSP.ensureTranslationAdapterFactory(model);
JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) model.getDocument().getAdapterFor(IJSPTranslation.class);
IJSPTranslation translation = translationAdapter.getJSPTranslation();
assertNotNull("no Java translation found", translation);
assertTrue("coda0 contents not included", translation.getJavaText().indexOf("int coda0") > 0);
assertTrue("coda1 contents not included", translation.getJavaText().indexOf("int coda1") > 0);
assertTrue("import statement not found", translation.getJavaText().indexOf("import java.lang.ref.Reference") > 0);
}
finally {
if (model != null)
model.releaseFromEdit();
}
}
public void test_prelude_and_coda() throws Exception {
String testName = "testPreludeAndCodas";
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(testName);
synchronized (creationLock) {
if (!project.isAccessible()) {
// Create new project
project = BundleResourceUtil.createSimpleProject(testName, null, null);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
}
}
IFile main = project.getFile("/web stuff/both/test.jsp");
assertTrue("sample test file not accessible", main.isAccessible());
IDOMModel model = null;
try {
model = (IDOMModel) StructuredModelManager.getModelManager().getModelForEdit(main);
ModelHandlerForJSP.ensureTranslationAdapterFactory(model);
JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) model.getDocument().getAdapterFor(IJSPTranslation.class);
IJSPTranslation translation = translationAdapter.getJSPTranslation();
assertNotNull("no Java translation found", translation);
assertTrue("prelude0 contents not included", translation.getJavaText().indexOf("int prelude0") > 0);
assertTrue("prelude1 contents included", translation.getJavaText().indexOf("int prelude1") < 0);
assertTrue("coda0 contents not included", translation.getJavaText().indexOf("int coda0") > 0);
assertTrue("coda1 contents included", translation.getJavaText().indexOf("int coda1") < 0);
assertTrue("import statement not found", translation.getJavaText().indexOf("import java.lang.ref.Reference") > 0);
}
finally {
if (model != null)
model.releaseFromEdit();
}
}
public void testVariablesFromIncludedFragments() throws Exception {
String testName = "testVariablesFromIncludedFragments";
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(testName);
synchronized (creationLock) {
if (!project.isAccessible()) {
// Create new project
project = BundleResourceUtil.createSimpleProject(testName, null, null);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
}
}
IFile main = project.getFile("/WebContent/main.jsp");
assertTrue("sample test file not accessible", main.isAccessible());
IDOMModel model = null;
try {
model = (IDOMModel) StructuredModelManager.getModelManager().getModelForEdit(main);
ModelHandlerForJSP.ensureTranslationAdapterFactory(model);
JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) model.getDocument().getAdapterFor(IJSPTranslation.class);
IJSPTranslation translation = translationAdapter.getJSPTranslation();
assertNotNull("no Java translation found", translation);
assertTrue("String variableFromHeader1 not found", translation.getJavaText().indexOf("String variableFromHeader1") > 0);
assertTrue("header1 contents not included", translation.getJavaText().indexOf("String variableFromHeader1 = \"initialized in header 1\";") > 0);
assertTrue("header2 contents not included", translation.getJavaText().indexOf("variableFromHeader1 = \"reassigned in header 2\";") > 0);
}
finally {
if (model != null)
model.releaseFromEdit();
}
}
public void testIterationTags() throws Exception {
String testName = "testIterationTags";
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(testName);
if (!project.isAccessible()) {
// Create new project
project = BundleResourceUtil.createSimpleProject(testName, null, null);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
}
/* This test is failing as of 20180213 so until someone can debug and fix it, comment it out */
/* waitForBuildAndValidation(project); */
IFile testFile = project.getFile("/WebContent/test.jsp");
assertTrue("test.jsp is not accessible", testFile.isAccessible());
IDOMModel model = null;
try {
model = (IDOMModel) StructuredModelManager.getModelManager().getModelForEdit(testFile);
ModelHandlerForJSP.ensureTranslationAdapterFactory(model);
JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) model.getDocument().getAdapterFor(IJSPTranslation.class);
JSPTranslationExtension translation = translationAdapter.getJSPTranslation();
translation.setProblemCollectingActive(true);
assertNotNull("No Java translation found", translation);
translation.reconcileCompilationUnit();
translation.setProblemCollectingActive(false);
List<IProblem> problems = translation.getProblems();
assertNotNull("Translation had a null problems list.", problems);
Iterator<IProblem> it = problems.iterator();
String javaText = translation.getJavaText();
int startOffset = javaText.indexOf("<plain:simple>");
assertTrue("<plan:simple> scope not found.", startOffset > 0);
int endOffset = javaText.indexOf("</plain:simple>", startOffset);
assertTrue("</plan:simple> scope not found.", endOffset > 0);
// Finds all errors caused by "continue cannot be used outside of a loop" - should only occur between <plain:simple></plain:simple>
while (it.hasNext()) {
IProblem problem = it.next();
if (problem.isError()) {
if ("continue cannot be used outside of a loop".equals(problem.getMessage())) {
assertTrue("'continue cannot be used outside of a loop' outside of iteration tag: ", problem.getSourceStart() > startOffset && problem.getSourceEnd() < endOffset);
}
}
}
}
finally {
if (model != null)
model.releaseFromEdit();
}
}
/**
* Tests that an iteration tag will generate
* @throws Exception
*/
public void testIterationTagsIncomplete() throws Exception {
String testName = "testIterationTags";
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(testName);
if (!project.isAccessible()) {
// Create new project
project = BundleResourceUtil.createSimpleProject(testName, null, null);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
}
/* This test is failing as of 20180213 so until someone can debug and fix it, comment it out */
/* waitForBuildAndValidation(project); */
IFile testFile = project.getFile("/WebContent/test_missing_end_tag.jsp");
assertTrue("test_missing_end_tag.jsp is not accessible", testFile.isAccessible());
IDOMModel model = null;
try {
model = (IDOMModel) StructuredModelManager.getModelManager().getModelForEdit(testFile);
ModelHandlerForJSP.ensureTranslationAdapterFactory(model);
JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) model.getDocument().getAdapterFor(IJSPTranslation.class);
JSPTranslationExtension translation = translationAdapter.getJSPTranslation();
String javaText = translation.getJavaText();
int startOffset = javaText.indexOf("} // [</plain:loop>]");
assertTrue("Missing end tag was not accounted for.", startOffset != -1);
}
finally {
if (model != null)
model.releaseFromEdit();
}
}
public void testTaglibHelperWrongHierarchy() throws Exception {
String testName = "testIterationTags";
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(testName);
if (!project.isAccessible()) {
// Create new project
project = BundleResourceUtil.createSimpleProject(testName, null, null);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
}
/* This test is failing as of 20180213 so until someone can debug and fix it, comment it out */
/* waitForBuildAndValidation(project); */
TaglibHelper helper = new TaglibHelper(project);
IFile testFile = project.getFile("/WebContent/iterationTester.jsp");
assertTrue("iterationTester.jsp is not accessible", testFile.isAccessible());
IDOMModel model = null;
try {
model = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(testFile);
IStructuredDocument doc = model.getStructuredDocument();
CustomTag tag = helper.getCustomTag("plain:list", doc, null, new ArrayList());
assertFalse("plain:list should not be an IterationTag", tag.isIterationTag());
}
finally {
if (model != null)
model.releaseFromRead();
}
}
public void testTaglibHelperUnresolvedSupertype() throws Exception {
String testName = "testIterationTags";
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(testName);
if (!project.isAccessible()) {
// Create new project
project = BundleResourceUtil.createJavaWebProject(testName);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
}
/* This test is failing as of 20180213 so until someone can debug and fix it, comment it out */
/* waitForBuildAndValidation(project); */
TaglibHelper helper = new TaglibHelper(project);
IFile testFile = project.getFile("/WebContent/iterationTester.jsp");
assertTrue("iterationTester.jsp is not accessible", testFile.isAccessible());
IDOMModel model = null;
try {
model = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(testFile);
IStructuredDocument doc = model.getStructuredDocument();
CustomTag tag = helper.getCustomTag("plain:uberloop", doc, null, new ArrayList());
assertTrue("plain:uberloop should be an IterationTag", tag.isIterationTag());
}
finally {
if (model != null)
model.releaseFromRead();
}
}
public void test_javaVariableIncludes() throws Exception {
String testFolderName = "jspx_javaVariable_includes";
// Create new project
IProject project = BundleResourceUtil.createJavaWebProject(testFolderName);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testFolderName, "/" + testFolderName);
/* This test is failing as of 20180213 so until someone can debug and fix it, comment it out */
/* waitForBuildAndValidation(project); */
ValidationFramework.getDefault().validate(new IProject[]{project}, true, false, new NullProgressMonitor());
assertNoProblemMarkers(project.getFile("/WebContent/test1.jsp"));
assertNoProblemMarkers(project.getFile("/WebContent/index.jspx"));
// clean up if we got to the end
try {
project.delete(true, true, null);
}
catch (Exception e) {
// not a failure condition
}
}
private void assertNoProblemMarkers(IFile file) throws CoreException {
assertTrue("sample test file does not exist", file.isAccessible());
IMarker[] markers = file.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_ZERO);
StringBuffer markerText = new StringBuffer();
for (int i = 0; i < markers.length; i++) {
// line/start-end
markerText.append("\nL" + markers[i].getAttribute(IMarker.LINE_NUMBER) + "/o" + markers[i].getAttribute(IMarker.CHAR_START) + "-" + markers[i].getAttribute(IMarker.CHAR_END) + ":" + markers[i].getAttribute(IMarker.MESSAGE));
}
assertEquals("Problem markers reported found \n" + markerText, 0, markers.length);
}
public void test_389174() throws CoreException, IOException {
IProject j = BundleResourceUtil.createJavaWebProject(getName());
assertTrue(j.exists());
String typeName = "List<List<Boolean>>";
InputStream source = new ByteArrayInputStream(("<jsp:useBean id=\"x\" type=\"" + typeName + "\" />").getBytes());
IFile file = j.getFile(getName() + "_test.jsp");
file.create(source, IResource.FORCE, null);
JSPTranslator translator = new JSPTranslator();
IDOMModel structuredModel = null;
try {
structuredModel = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(file);
translator.reset(structuredModel.getDocument(), new NullProgressMonitor());
translator.translate();
assertTrue("specified type did not survive translation", translator.getTranslation().indexOf(typeName) >= 0);
IJSPProblem[] translationProblems = (IJSPProblem[]) translator.getTranslationProblems().toArray(new IJSPProblem[0]);
for (int i = 0; i < translationProblems.length; i++) {
assertEquals("expected IJSPProblem type: " + translationProblems[i].getMessage(), Integer.toHexString(IProblem.UndefinedType), Integer.toHexString(translationProblems[i].getID()));
}
}
finally {
if (structuredModel != null)
structuredModel.releaseFromRead();
}
}
// http://bugs.eclipse.org/432978
public void test_432978() throws Exception {
String testName = "bug_432978";
// Create new project
IProject project = BundleResourceUtil.createJavaWebProject(testName);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
// TEI class needs to already be compiled
// waitForBuildAndValidation(project);
// project.build(IncrementalProjectBuilder.FULL_BUILD, "org.eclipse.jdt.internal.core.builder.JavaBuilder", null, null);
project.getWorkspace().checkpoint(true);
IFile file1 = project.getFile("/WebContent/test.jsp");
IFile file2= project.getFile("/WebContent/test2.jsp");
IDOMModel structuredModel1 = null;
IDOMModel structuredModel2 = null;
try {
ITaglibRecord tld = TaglibIndex.resolve(file1.getFullPath().toString(), "http://eclipse.org/testbug_432978", false);
structuredModel1 = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(file1);
ModelHandlerForJSP.ensureTranslationAdapterFactory(structuredModel1);
JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) structuredModel1.getDocument().getAdapterFor(IJSPTranslation.class);
final String translation = translationAdapter.getJSPTranslation().getJavaText();
assertTrue("The 'extra' integer declared by a TEI class was not found, taglib was: " + tld, translation.indexOf("java.lang.Integer extra") > 0);
/*
* the extra variable should only be declared once in the
* translated text
*/
assertEquals(2, translation.split("java.lang.Integer extra").length);
structuredModel2 = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(file2);
ModelHandlerForJSP.ensureTranslationAdapterFactory(structuredModel2);
JSPTranslationAdapter translationAdapter2 = (JSPTranslationAdapter) structuredModel2.getDocument().getAdapterFor(IJSPTranslation.class);
final String translation2 = translationAdapter2.getJSPTranslation().getJavaText();
assertTrue( translation2.indexOf( "extra" ) != -1 );
// the extra variable should be declared twice because of the nested atbegin tags
assertEquals( 3, translation2.split( "java.lang.Integer extra" ).length );
}
finally {
if (structuredModel1 != null)
structuredModel1.releaseFromRead();
if (structuredModel2 != null)
structuredModel2.releaseFromRead();
}
}
// http://bugs.eclipse.org/518987
public void test_518987() throws Exception {
String testName = "bug_518987";
// Create new project
IProject project = BundleResourceUtil.createJavaWebProject(testName);
assertTrue(project.exists());
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + testName, "/" + testName);
// TEI class needs to already be compiled
// waitForBuildAndValidation(project);
// project.build(IncrementalProjectBuilder.FULL_BUILD, "org.eclipse.jdt.internal.core.builder.JavaBuilder", null, null);
project.getWorkspace().checkpoint(true);
IFile file1 = project.getFile("/WebContent/test1.jsp");
IDOMModel structuredModel1 = null;
try {
structuredModel1 = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(file1);
ModelHandlerForJSP.ensureTranslationAdapterFactory(structuredModel1);
JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) structuredModel1.getDocument().getAdapterFor(IJSPTranslation.class);
final String translation = translationAdapter.getJSPTranslation().getJavaText();
assertFalse("The unprocessed custom action's attribute value pair should not be in the translated source, was the custom tag not parsed?", translation.indexOf("insert=") > 0);
assertTrue("The 'insert' integer declared by a TEI class was not found, was the custom tag not parsed?\n\n" + translation, translation.indexOf("java.lang.Integer insert") > 0);
}
finally {
if (structuredModel1 != null)
structuredModel1.releaseFromRead();
}
}
public void test_530968_ExpressionInCustomTagInComment() throws Exception {
JSPJavaValidator validator = new JSPJavaValidator();
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("bug_530968");
if (!project.exists()) {
ProjectUtil.createProject("bug_530968", null, null);
BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/bug_530968", "/bug_530968");
}
String filePath = "/bug_530968/WebContent/bug530968.jsp";
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(filePath));
assertTrue(file.exists());
IReporter reporter = new ReporterForTest();
ValidationContextForTest helper = new ValidationContextForTest();
helper.setURI(filePath);
validator.validate(helper, reporter);
String messageText = reporter.getMessages().isEmpty() ? "no error found" : ((Message) reporter.getMessages().get(0)).getText();
assertTrue(messageText, reporter.getMessages().isEmpty());
}
}