/*******************************************************************************
* Copyright (c) 2007-2013 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.test.validation;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.wst.validation.ValidationFramework;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.jboss.tools.common.base.test.validation.TestUtil;
import org.jboss.tools.common.el.core.ElCoreMessages;
import org.jboss.tools.common.preferences.SeverityPreferences;
import org.jboss.tools.common.validation.ContextValidationHelper;
import org.jboss.tools.common.validation.IProjectValidationContext;
import org.jboss.tools.common.validation.IValidator;
import org.jboss.tools.common.validation.ValidationErrorManager;
import org.jboss.tools.common.validation.ValidatorManager;
import org.jboss.tools.common.validation.internal.SimpleValidatingProjectTree;
import org.jboss.tools.jst.web.kb.WebKbPlugin;
import org.jboss.tools.jst.web.kb.internal.validation.ELValidationMessages;
import org.jboss.tools.jst.web.kb.internal.validation.ELValidator;
import org.jboss.tools.jst.web.kb.preferences.ELSeverityPreferences;
import org.jboss.tools.test.util.ProjectImportTestSetup;
import org.jboss.tools.tests.AbstractResourceMarkerTest;
public class ELValidatorTest extends AbstractResourceMarkerTest{
public static final String MARKER_TYPE = "org.eclipse.wst.validation.problemmarker";
public static final String EL_VALIDATOR_MARKER_TYPE = "org.jboss.tools.jst.web.kb.elproblem";
protected void setUp() throws Exception {
// JobUtils.waitForIdle();
project = ProjectImportTestSetup.loadProject("JSFKickStartOldFormat");
// this.project.build(IncrementalProjectBuilder.CLEAN_BUILD,
// new NullProgressMonitor());
//
// JobUtils.waitForIdle();
}
public void testPropertyInBrackets() throws CoreException, ValidationException {
MarkerAssertUtil.assertMarkerIsCreatedForLine(project,
"WebContent/pages/inputname.jsp",
ELValidationMessages.UNKNOWN_EL_VARIABLE_PROPERTY_NAME,
new Object[] {"'age1'"},
20);
MarkerAssertUtil.assertMarkerIsNotCreatedForLine(project,
"WebContent/pages/inputname.jsp",
ELValidationMessages.UNKNOWN_EL_VARIABLE_PROPERTY_NAME,
new Object[] {"'age'"},
19);
}
public void testUnknownELVariable() throws CoreException, ValidationException {
IPreferenceStore store = WebKbPlugin.getDefault().getPreferenceStore();
store.setValue(ELSeverityPreferences.RE_VALIDATE_UNRESOLVED_EL, ELSeverityPreferences.ENABLE);
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, ELSeverityPreferences.ERROR);
try {
copyContentsFile("WebContent/WEB-INF/faces-config.xml", "WebContent/WEB-INF/faces-config.1");
MarkerAssertUtil.assertMarkerIsCreatedForLine(project,
"WebContent/testElRevalidation.xhtml",
ELValidationMessages.UNKNOWN_EL_VARIABLE_PROPERTY_NAME,
new Object[] {"user"},
14);
// Check if the validator was not invoked.
copyContentsFile("WebContent/WEB-INF/faces-config.xml", "WebContent/WEB-INF/faces-config.original");
MarkerAssertUtil.assertMarkerIsNotCreatedForLine(project,
"WebContent/testElRevalidation.xhtml",
ELValidationMessages.UNKNOWN_EL_VARIABLE_PROPERTY_NAME,
new Object[] {"user"},
14);
} finally {
copyContentsFile("WebContent/WEB-INF/faces-config.xml", "WebContent/WEB-INF/faces-config.original");
store.setValue(ELSeverityPreferences.RE_VALIDATE_UNRESOLVED_EL, ELSeverityPreferences.ENABLE);
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, ELSeverityPreferences.IGNORE);
}
}
public void _testRevalidationUnresolvedELs() throws CoreException, ValidationException{
IPreferenceStore store = WebKbPlugin.getDefault().getPreferenceStore();
store.setValue(ELSeverityPreferences.RE_VALIDATE_UNRESOLVED_EL, ELSeverityPreferences.DISABLE);
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, ELSeverityPreferences.ERROR);
try {
copyContentsFile("WebContent/WEB-INF/faces-config.xml", "WebContent/WEB-INF/faces-config.1");
MarkerAssertUtil.assertMarkerIsCreatedForLine(project,
"WebContent/testElRevalidation.xhtml",
ELValidationMessages.UNKNOWN_EL_VARIABLE_PROPERTY_NAME,
new Object[] {"user"},
14);
IFile file = project.getFile("WebContent/testElRevalidation.xhtml");
file.deleteMarkers(EL_VALIDATOR_MARKER_TYPE, true, IResource.DEPTH_ZERO);
MarkerAssertUtil.assertMarkerIsNotCreatedForLine(project,
"WebContent/testElRevalidation.xhtml",
ELValidationMessages.UNKNOWN_EL_VARIABLE_PROPERTY_NAME,
new Object[] {"user"},
14, false);
// Check if the validator was not invoked.
copyContentsFile("WebContent/WEB-INF/faces-config.xml", "WebContent/WEB-INF/faces-config.original");
file = project.getFile("WebContent/WEB-INF/faces-config.xml");
ValidationFramework.getDefault().validate(file, new NullProgressMonitor());
MarkerAssertUtil.assertMarkerIsNotCreatedForLine(project,
"WebContent/testElRevalidation.xhtml",
ELValidationMessages.UNKNOWN_EL_VARIABLE_PROPERTY_NAME,
new Object[] {"user"},
14, false);
} finally {
store.setValue(ELSeverityPreferences.RE_VALIDATE_UNRESOLVED_EL, ELSeverityPreferences.ENABLE);
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, ELSeverityPreferences.IGNORE);
}
}
/**
* See https://jira.jboss.org/browse/JBIDE-7067
* @throws CoreException
* @throws ValidationException
*/
public void testELValidationEnablement() throws CoreException, ValidationException {
WebKbPlugin.getDefault().getPreferenceStore().setValue(ELSeverityPreferences.ENABLE_BLOCK_PREFERENCE_NAME, SeverityPreferences.DISABLE);
try {
IFile file = project.getFile("WebContent/pages/el.jsp");
file.deleteMarkers(IValidator.KB_PROBLEM_MARKER_TYPE, true, IResource.DEPTH_ZERO);
validateFile("WebContent/pages/el.jsp", 0);
int number = getMarkersNumberByGroupName(IValidator.KB_PROBLEM_MARKER_TYPE, file, IValidator.MARKED_RESOURCE_MESSAGE_GROUP);
assertEquals("Problem marker was found.", 0, number);
WebKbPlugin.getDefault().getPreferenceStore().setValue(ELSeverityPreferences.ENABLE_BLOCK_PREFERENCE_NAME, SeverityPreferences.ENABLE);
validateFile("WebContent/pages/el.jsp", 0);
number = getMarkersNumberByGroupName(IValidator.KB_PROBLEM_MARKER_TYPE, file, IValidator.MARKED_RESOURCE_MESSAGE_GROUP);
assertEquals("Problem marker was not found.", 1, number);
} finally {
WebKbPlugin.getDefault().getPreferenceStore().setValue(ELSeverityPreferences.ENABLE_BLOCK_PREFERENCE_NAME, SeverityPreferences.ENABLE);
}
}
/**
* See https://jira.jboss.org/browse/JBIDE-7147
* @throws CoreException
*/
public void testMaxNumberOfMarkersPerFileLesThanDefault() throws CoreException {
IPreferenceStore store = WebKbPlugin.getDefault().getPreferenceStore();
int max = store.getInt(SeverityPreferences.MAX_NUMBER_OF_MARKERS_PREFERENCE_NAME);
store.setValue(SeverityPreferences.MAX_NUMBER_OF_MARKERS_PREFERENCE_NAME, 1);
String errorSeverity = store.getString(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME);
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, ELSeverityPreferences.ERROR);
try {
MarkerAssertUtil.assertMarkerIsCreatedForLine(project,
"WebContent/pages/maxNumberOfMarkers.jsp",
ELValidationMessages.UNKNOWN_EL_VARIABLE_NAME,
new Object[] {"wrongUserName"},
3);
MarkerAssertUtil.assertMarkerIsNotCreatedForLine(project,
"WebContent/pages/maxNumberOfMarkers.jsp",
ELValidationMessages.UNKNOWN_EL_VARIABLE_NAME,
new Object[] {"wrongUserName2"},
4);
store.setValue(SeverityPreferences.MAX_NUMBER_OF_MARKERS_PREFERENCE_NAME, max);
MarkerAssertUtil.assertMarkerIsCreatedForLine(project,
"WebContent/pages/maxNumberOfMarkers.jsp",
ELValidationMessages.UNKNOWN_EL_VARIABLE_NAME,
new Object[] {"wrongUserName"},
3);
MarkerAssertUtil.assertMarkerIsCreatedForLine(project,
"WebContent/pages/maxNumberOfMarkers.jsp",
ELValidationMessages.UNKNOWN_EL_VARIABLE_NAME,
new Object[] {"wrongUserName2"},
4);
} finally {
store.setValue(SeverityPreferences.MAX_NUMBER_OF_MARKERS_PREFERENCE_NAME, max);
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, errorSeverity);
}
}
/**
* See https://jira.jboss.org/browse/JBIDE-7147
* @throws CoreException
*/
public void testMaxNumberOfMarkersPerFileMoreThanDefault() throws CoreException, ValidationException {
IPreferenceStore store = WebKbPlugin.getDefault().getPreferenceStore();
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, ELSeverityPreferences.ERROR);
try {
IFile file = project.getFile("WebContent/pages/lineNumbers.xhtml");
String messagePattern = MessageFormat.format(ELValidationMessages.UNKNOWN_EL_VARIABLE_NAME, new Object[] {"wrongUserName"});
long time = validateFile("WebContent/pages/lineNumbers.xhtml", 100);
System.out.println("Validation time: " + time);
int[] lines = new int[100];
for (int i = 8; i < 108; i++) {
lines[i-8]=i;
}
assertMarkerIsCreated(file, EL_VALIDATOR_MARKER_TYPE, messagePattern, lines);
time = validateFile("WebContent/pages/lineNumbers.xhtml", 100);
System.out.println("Validation time: " + time);
} finally {
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, ELSeverityPreferences.IGNORE);
}
}
/**
* See https://jira.jboss.org/browse/JBIDE-7264
* @throws CoreException
* @throws ValidationException
*/
public void testPerformanceOfCalculatingLineNumbers() throws CoreException, ValidationException {
IPreferenceStore store = WebKbPlugin.getDefault().getPreferenceStore();
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, ELSeverityPreferences.ERROR);
try {
IFile file = project.getFile("/pagesOutsideWebContent/lineCalculating.xhtml");
assertTrue("Test xhtml file is not accessible.", file.isAccessible());
ELValidator validator = getElValidator(file.getFullPath().toString());
List<IMarker> markers = new ArrayList<IMarker>();
long withoutLineNumber = System.currentTimeMillis();
for (int i = 8; i < 108; i++) {
IMarker marker = ValidationErrorManager.addError("test error", IMessage.HIGH_SEVERITY, new Object[0], -1, 1, 79397 + i, file, validator.getDocumentProvider(), "testMarkerId", this.getClass(), 100, "testMarkerType");
assertNotNull("Marker has not been created.", marker);
assertTrue("Wrong line number", marker.getAttribute(IMarker.LINE_NUMBER, -1)>0);
markers.add(marker);
}
withoutLineNumber = System.currentTimeMillis() - withoutLineNumber;
for (IMarker marker : markers) {
marker.delete();
}
markers.clear();
long withLineNumber = System.currentTimeMillis();
for (int i = 8; i < 108; i++) {
IMarker marker = ValidationErrorManager.addError("test error", IMessage.HIGH_SEVERITY, new Object[0], i, 1, 79397 + i, file, validator.getDocumentProvider(), "testMarkerId", this.getClass(), 100, "testMarkerType");
assertNotNull("Marker has not been created.", marker);
assertEquals("Wrong line number", i, marker.getAttribute(IMarker.LINE_NUMBER, -1));
markers.add(marker);
}
withLineNumber = System.currentTimeMillis() - withLineNumber;
System.out.println("IMarker creation time with line calculating via IDocument: " + withoutLineNumber);
System.out.println("IMarker creation time without line calculating: " + withLineNumber);
assertTrue("", withLineNumber<withoutLineNumber);
} finally {
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, ELSeverityPreferences.IGNORE);
}
}
/**
* See https://jira.jboss.org/browse/JBIDE-10661
* @throws CoreException
* @throws ValidationException
*/
public void testSyntaxErrors() throws CoreException, ValidationException {
IFile file = project.getFile("WebContent/pages/syntaxErrors.xhtml");
TestUtil.validate(file);
String messagePattern = MessageFormat.format(ELValidationMessages.EL_SYNTAX_ERROR, new Object[]{ElCoreMessages.ExpressionRule_ExpectingJavaName});
AbstractResourceMarkerTest.assertMarkerIsCreated(file, messagePattern, false, 7, 8);
messagePattern = MessageFormat.format(ELValidationMessages.UNKNOWN_EL_VARIABLE_NAME, new Object[]{"abc."});
AbstractResourceMarkerTest.assertMarkerIsNotCreated(file, messagePattern, 7);
messagePattern = MessageFormat.format(ELValidationMessages.UNKNOWN_EL_VARIABLE_PROPERTY_NAME, new Object[]{"broken"});
AbstractResourceMarkerTest.assertMarkerIsCreated(file, messagePattern, false, 8);
}
public void testSyntaxErrorsInXML() throws CoreException, ValidationException {
IFile file = project.getFile("WebContent/pages/a.xml");
TestUtil.validate(file);
String messagePattern = MessageFormat.format(ELValidationMessages.EL_SYNTAX_ERROR, new Object[]{ElCoreMessages.OperationRule_ExpectingRBrace});
AbstractResourceMarkerTest.assertMarkerIsCreated(file, messagePattern, false, 9);
AbstractResourceMarkerTest.assertMarkerIsNotCreated(file, messagePattern, 8);
}
private long validateFile(String fileName, int numberOfMarkers) throws ValidationException {
Set<String> files = new HashSet<String>();
files.add(fileName);
return validateFile(files, numberOfMarkers);
}
private long validateFile(Set<String> fileNames, int numberOfMarkers) throws ValidationException {
IPreferenceStore store = WebKbPlugin.getDefault().getPreferenceStore();
int max = store.getInt(SeverityPreferences.MAX_NUMBER_OF_MARKERS_PREFERENCE_NAME);
if(numberOfMarkers>0) {
store.setValue(SeverityPreferences.MAX_NUMBER_OF_MARKERS_PREFERENCE_NAME, numberOfMarkers);
}
String errorSeverity = store.getString(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME);
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, ELSeverityPreferences.ERROR);
try {
ELValidator validator = new ELValidator();
validator.setProblemType(EL_VALIDATOR_MARKER_TYPE);
ContextValidationHelper helper = new ContextValidationHelper();
helper.setProject(project);
helper.initialize();
Set<IFile> files = new HashSet<IFile>();
for (String fileName : fileNames) {
IFile file = project.getFile(fileName);
helper.registerResource(file);
files.add(file);
}
ValidatorManager manager = new ValidatorManager();
WorkbenchReporter reporter = new WorkbenchReporter(project, new NullProgressMonitor());
long current = System.currentTimeMillis();
IProjectValidationContext context = new SimpleValidatingProjectTree(project).getBrunches().values().iterator().next().getRootContext();
validator.validate(files, project, helper, context, manager, reporter);
long result = System.currentTimeMillis() - current;
return result;
} finally {
store.setValue(SeverityPreferences.MAX_NUMBER_OF_MARKERS_PREFERENCE_NAME, max);
store.setValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, errorSeverity);
}
}
private ELValidator getElValidator(String fileName) throws ValidationException {
Set<String> files = new HashSet<String>();
files.add(fileName);
return getElValidator(files);
}
private ELValidator getElValidator(Set<String> fileNames) {
ELValidator validator = new ELValidator();
validator.setProblemType(EL_VALIDATOR_MARKER_TYPE);
ValidatorManager manager = new ValidatorManager();
WorkbenchReporter reporter = new WorkbenchReporter(project, new NullProgressMonitor());
IProjectValidationContext context = new SimpleValidatingProjectTree(project).getBrunches().values().iterator().next().getRootContext();
validator.init(project, getHelper(fileNames), context, manager, reporter);
return validator;
}
private ContextValidationHelper getHelper(Set<String> fileNames) {
ContextValidationHelper helper = new ContextValidationHelper();
helper.setProject(project);
helper.initialize();
Set<IFile> files = new HashSet<IFile>();
for (String fileName : fileNames) {
IFile file = project.getFile(fileName);
helper.registerResource(file);
files.add(file);
}
return helper;
}
}