/******************************************************************************* * Copyright (c) 2007 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 * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.core.test; import java.io.IOException; import java.text.MessageFormat; import java.util.ArrayList; 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.IProject; import org.eclipse.core.resources.IResource; 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.jface.preference.IPersistentPreferenceStore; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.wst.validation.internal.core.ValidationException; import org.jboss.tools.common.base.test.validation.TestUtil; import org.jboss.tools.common.validation.IValidator; 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.preferences.ELSeverityPreferences; import org.jboss.tools.seam.core.ISeamComponent; import org.jboss.tools.seam.core.ISeamComponentMethod; import org.jboss.tools.seam.core.ISeamProject; import org.jboss.tools.seam.core.SeamComponentMethodType; import org.jboss.tools.seam.core.SeamCorePlugin; import org.jboss.tools.seam.core.SeamPreferences; import org.jboss.tools.seam.core.test.validation.ELValidatorWrapper; import org.jboss.tools.seam.core.test.validation.IValidatorSupport; import org.jboss.tools.seam.core.test.validation.SeamCoreValidatorWrapper; import org.jboss.tools.seam.internal.core.SeamProject; import org.jboss.tools.seam.internal.core.validation.SeamValidationErrorManager; import org.jboss.tools.seam.internal.core.validation.SeamValidationMessages; import org.jboss.tools.test.util.JobUtils; import org.jboss.tools.tests.AbstractResourceMarkerTest; import org.jboss.tools.tests.IMarkerFilter; public class SeamValidatorsTest extends AbstractResourceMarkerTest { public static SeamMarkerFilter SEAM_MARKER_FILTER = new SeamMarkerFilter(); public SeamValidatorsTest() { super("Seam Validator Tests"); } public SeamValidatorsTest(String name) { super(name); } @Override protected void copyContentsFile(IFile originalFile, IFile newContentFile) throws CoreException { assertTrue(originalFile.exists()); assertTrue(newContentFile.exists()); super.copyContentsFile(originalFile, newContentFile); if("xml".equalsIgnoreCase(originalFile.getFileExtension())) { // Workaroud for an issue in XModel. If we change a XML too fast then its timestamp may not be changed. So XModel may not load the changed file. originalFile.setLocalTimeStamp(originalFile.getModificationStamp() + 3000); } project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, null); project.build(IncrementalProjectBuilder.FULL_BUILD, new NullProgressMonitor()); } @Override protected void setUp() throws Exception { project = ResourcesPlugin.getWorkspace().getRoot().getProject("SeamWebWarTestProject"); assertTrue(project.exists()); } @Override protected void tearDown() throws Exception { } private ISeamProject getSeamProject(IProject project) throws CoreException { ISeamProject seamProject = (ISeamProject)project.getNature(SeamProject.NATURE_ID); assertNotNull("Seam project is null", seamProject); return seamProject; } /** * Test for https://jira.jboss.org/jira/browse/JBIDE-6176 * @throws CoreException * @throws ValidationException */ public void testFactory() throws CoreException, ValidationException { IFile componentFile = project.getFile("src/action/org/domain/SeamWebWarTestProject/session/FactoryTest.java"); copyContentsFile(componentFile, "src/action/org/domain/SeamWebWarTestProject/session/FactoryTest.new"); SeamCoreValidatorWrapper seamValidator = new SeamCoreValidatorWrapper(project); seamValidator.validate(componentFile); assertTrue("Error marker not found", seamValidator.isMessageCreated(SeamValidationMessages.UNKNOWN_FACTORY_NAME, new String[]{"somethings"})); copyContentsFile(componentFile, "src/action/org/domain/SeamWebWarTestProject/session/FactoryTest.original"); } /** * Test for https://jira.jboss.org/jira/browse/JBIDE-784 * @throws CoreException */ public void testJavaFileOutsideClassPath() throws CoreException { IFile file = project.getFile("WebContent/Authenticator.java"); String[] messages = getMarkersMessage(file, SEAM_MARKER_FILTER); assertTrue("Problem marker was found in WebContent/Authenticator.java file. Seam EL validator should not validate it.", messages.length == 0); } /** * Test for http://jira.jboss.com/jira/browse/JBIDE-1318 * @throws CoreException */ public void testJBIDE1318() throws CoreException { getSeamProject(project); IFile testJSP = project.getFile("WebContent/test.jsp"); project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, null); assertMarkerIsNotCreated(testJSP, MARKER_TYPE, "actor cannot be resolved"); } public void testVarAttributes() throws CoreException, ValidationException { // Test for http://jira.jboss.com/jira/browse/JBIDE-999 IFile file = project.getFile("WebContent/varAttributes.xhtml"); TestUtil.validate(file); String messagePattern = MessageFormat.format(ELValidationMessages.UNKNOWN_EL_VARIABLE_PROPERTY_NAME, new Object[]{"nonExistingBroken"}); List<IMarker> markers = getMarkersByGroupName(file, SeamValidationErrorManager.MARKED_SEAM_PROJECT_MESSAGE_GROUP); StringBuffer sb = new StringBuffer("Here is a list of found markers in ").append(file.getFullPath().toOSString()).append(markers.size()==0?" : [": " : [\r\n"); //$NON-NLS-1$ //$NON-NLS-2$"); int i = 0; for (IMarker marker : markers) { String message = marker.getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$ marker.getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$ int line = marker.getAttribute(IMarker.LINE_NUMBER, -1); String mType = marker.getType(); sb.append(i).append(") line=\"").append(line).append("\"; type=\"").append(mType).append("\"; message=\"").append(message).append("\";\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ i++; } sb.append("]"); //$NON-NLS-1$ System.out.println(sb.toString()); AbstractResourceMarkerTest.assertMarkerIsCreated(file, messagePattern, false, 49, 50, 53, 57, 64); } private List<IMarker> getMarkersByGroupName(IResource resource, String messageGroup) throws CoreException { List<IMarker> ms = new ArrayList<IMarker>(); IMarker[] markers = resource.findMarkers(MARKER_TYPE, true, IResource.DEPTH_INFINITE); for (int i = 0; i < markers.length; i++) { String groupName = markers[i].getAttribute("groupName", null); if(groupName!=null && (groupName.equals(messageGroup) || groupName.equals("markedKbResource"))) { ms.add(markers[i]); } } return ms; } public void testMessageBundles() throws CoreException { // Test for https://jira.jboss.org/jira/browse/JBIDE-5089 IFile file = project.getFile("WebContent/messagesValidation.jsp"); int number = getMarkersNumberByGroupName(file, SeamValidationErrorManager.MARKED_SEAM_PROJECT_MESSAGE_GROUP); assertEquals("Problem marker was found in messagesValidation.jsp file. Validator did not recognize a message bundle.", 0, number); } public void testJiraJbide1696() throws CoreException, ValidationException { //getSeamProject(project); // Test for http://jira.jboss.com/jira/browse/JBIDE-1696 IFile subclassComponentFile = project.getFile("src/action/org/domain/SeamWebWarTestProject/session/SubclassTestComponent.java"); SeamCoreValidatorWrapper seamValidator = new SeamCoreValidatorWrapper(project); seamValidator.validate(subclassComponentFile); assertTrue("Error marker not found", seamValidator.isMessageCreated(SeamValidationMessages.STATEFUL_COMPONENT_DOES_NOT_CONTAIN_REMOVE, new String[]{"testComponentJBIDE1696"})); IFile superclassComponentFile = project.getFile("src/action/org/domain/SeamWebWarTestProject/session/SuperclassTestComponent.java"); copyContentsFile(superclassComponentFile, "src/action/org/domain/SeamWebWarTestProject/session/SuperclassTestComponent.withRemove"); project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, null); seamValidator = new SeamCoreValidatorWrapper(project); seamValidator.validate(subclassComponentFile); assertTrue("We changed super class of component but it still don't see changes.", seamValidator.getMessages().size()==0); } public void testJiraJbide1631() throws CoreException, ValidationException { // Test for http://jira.jboss.com/jira/browse/JBIDE-1631 IFile jbide1631XHTMLFile = project.getFile("WebContent/JBIDE-1631.xhtml"); IFile jbide1631XHTMLFile2 = project.getFile("WebContent/JBIDE-1631.1"); copyContentsFile(jbide1631XHTMLFile, jbide1631XHTMLFile2); ELValidatorWrapper elValidator = new ELValidatorWrapper(project); elValidator.validate(jbide1631XHTMLFile); assertTrue("Error marker not found", elValidator.isMessageCreated(ELValidationMessages.UNKNOWN_EL_VARIABLE_NAME, new Object[]{"foo1"})); assertTrue("Error marker not found", elValidator.isMessageCreated(ELValidationMessages.UNKNOWN_EL_VARIABLE_NAME, new Object[]{"foo2"})); } public void testDuplicateComponentNameValidator() throws CoreException, ValidationException { copyContentsFile( "src/action/org/domain/SeamWebWarTestProject/session/BbcComponent.java", "src/action/org/domain/SeamWebWarTestProject/session/BbcComponent.original"); IFile bbcComponentFile = project .getFile("src/action/org/domain/SeamWebWarTestProject/session/BbcComponent.java"); SeamCoreValidatorWrapper seamValidator = new SeamCoreValidatorWrapper(project); seamValidator.validate(bbcComponentFile); assertFalse("Error marker was found", seamValidator.isMessageCreated( SeamValidationMessages.NONUNIQUE_COMPONENT_NAME_MESSAGE, new Object[]{"abcComponent"})); // Duplicate component name copyContentsFile( "src/action/org/domain/SeamWebWarTestProject/session/BbcComponent.java", "src/action/org/domain/SeamWebWarTestProject/session/BbcComponent.2"); seamValidator = new SeamCoreValidatorWrapper(project); seamValidator.validate(bbcComponentFile); assertTrue("Error marker not found", seamValidator.isMessageCreated( SeamValidationMessages.NONUNIQUE_COMPONENT_NAME_MESSAGE, new Object[]{"abcComponent"})); // restore file content copyContentsFile( "src/action/org/domain/SeamWebWarTestProject/session/BbcComponent.java", "src/action/org/domain/SeamWebWarTestProject/session/BbcComponent.original"); } public void testStatefulComponentWithoutRemoveMethodValidator() throws CoreException, ValidationException { IFile statefulComponentFile = project.getFile("src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.java"); String markerText = "Stateful component \"statefulComponent\" must have a method marked @Remove"; // Stateful component does not contain @Remove method assertMarkerIsCreatedForLine("src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.java", "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.2", SeamValidationMessages.STATEFUL_COMPONENT_DOES_NOT_CONTAIN_REMOVE, new Object[]{"statefulComponent"}, 16); } private void assertMarkerIsCreatedForLineOfFile(String path, String markerTemplate, Object[] parameters, int lineNumber) throws CoreException, ValidationException { IValidatorSupport validator = new SeamCoreValidatorWrapper(project); assertMarkerIsCreatedForLine(validator,path,markerTemplate,parameters,lineNumber); } private void assertMarkerIsCreatedForLine(String target, String newContent, String markerTemplate, Object[] parameters,int lineNumber) throws CoreException, ValidationException { IValidatorSupport validator = new SeamCoreValidatorWrapper(project); assertMarkerIsCreatedForLine(validator, target, newContent, markerTemplate, parameters, lineNumber); } private void assertMarkerIsCreatedForLine(IValidatorSupport validator,String target, String newContent, String markerTemplate, Object[] parameters,int lineNumber) throws CoreException, ValidationException { copyContentsFile( target, newContent); assertMarkerIsCreatedForLine(validator,target,markerTemplate,parameters,lineNumber); } private void assertMarkerIsCreatedForLine(String target, String markerTemplate, Object[] parameters,int lineNumber) throws CoreException, ValidationException { IValidatorSupport validator = new SeamCoreValidatorWrapper(project); assertMarkerIsCreatedForLine(validator, target, markerTemplate, parameters, lineNumber); } private void assertMarkerIsCreatedForLine(IValidatorSupport validator,String target, String markerTemplate, Object[] parameters,int lineNumber) throws CoreException, ValidationException { IFile targetFile = project.getFile(target); validator.validate(targetFile); assertTrue("Error marker not found", validator.isMessageCreated(markerTemplate, parameters)); assertTrue("Error marker has wrong line number", validator.isMessageCreatedOnLine(markerTemplate, parameters,lineNumber)); } private void assertMarkerIsNotCreatedForFile(String target, String newContent, String markerTemplate, Object[] parameters) throws CoreException, ValidationException { IValidatorSupport validator = new SeamCoreValidatorWrapper(project); assertMarkerIsNotCreatedForFile(validator, target, newContent, markerTemplate, parameters); } private void assertMarkerIsNotCreatedForFile(IValidatorSupport validator,String target, String newContent, String markerTemplate, Object[] parameters) throws CoreException, ValidationException { copyContentsFile( target, newContent); assertMarkerIsNotCreatedForFile(validator,target,markerTemplate, parameters); } private void assertMarkerIsNotCreatedForFile(String target, String markerTemplate, Object[] parameters) throws ValidationException, CoreException { IValidatorSupport validator = new SeamCoreValidatorWrapper(project); assertMarkerIsNotCreatedForFile(validator, target, markerTemplate, parameters); } private void assertMarkerIsNotCreatedForFile(IValidatorSupport validator, String target, String markerTemplate, Object[] parameters) throws ValidationException, CoreException { IFile targetFile = project.getFile(target); validator.validate(targetFile); assertFalse("Error marker was found", validator.isMessageCreated(markerTemplate, parameters)); } public void testStatefulComponentWithoutDestroyMethodValidator() throws CoreException, ValidationException { // Stateful component does not contain @Destroy method assertMarkerIsCreatedForLine("src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.java", "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.3", SeamValidationMessages.STATEFUL_COMPONENT_DOES_NOT_CONTAIN_DESTROY, new Object[] {"statefulComponent"}, 16); } public void testStatefulComponentHasWrongScopeValidator() throws CoreException, ValidationException { // Stateful component has wrong scope assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.java", "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.4", SeamValidationMessages.STATEFUL_COMPONENT_WRONG_SCOPE, new Object[] {"statefulComponent"}, 16); } public void testComponentTypeValidator() throws CoreException, ValidationException { // Component class name cannot be resolved to a type assertMarkerIsCreatedForLine( "WebContent/WEB-INF/components.xml", "WebContent/WEB-INF/components.2", SeamValidationMessages.UNKNOWN_COMPONENT_CLASS_NAME, new Object[] {"org.domain.SeamWebWarTestProject.session.StateComponent"}, 15); } public void testComponentWithoutSetterValidator() throws CoreException, ValidationException { // Component class does not contain setter for property assertMarkerIsCreatedForLine( "WebContent/WEB-INF/components.xml", "WebContent/WEB-INF/components.3", SeamValidationMessages.UNKNOWN_COMPONENT_PROPERTY, new Object[] {"StatefulComponentWithAbcField", "statefulComponentWithAbcField","abc"}, 16); } public void testEntityHasWrongScopeValidator() throws CoreException, ValidationException { // Entity component has wrong scope assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/entity/abcEntity.java", "src/action/org/domain/SeamWebWarTestProject/entity/abcEntity.2", SeamValidationMessages.ENTITY_COMPONENT_WRONG_SCOPE, new Object[]{"abcEntity"}, 15); } final String TARGET_FILE_NAME = "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.java"; public void testDuplicateDestroyMethodValidator() throws CoreException, ValidationException { final String NEW_CONTENT_FILE_NAME6 = "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.6"; assertMarkerIsCreatedForLine( TARGET_FILE_NAME, NEW_CONTENT_FILE_NAME6, SeamValidationMessages.DUPLICATE_DESTROY,new Object[]{"destroyMethod"}, 34); assertMarkerIsCreatedForLine( TARGET_FILE_NAME, SeamValidationMessages.DUPLICATE_DESTROY,new Object[]{"destroyMethod2"}, 39); } public void testDuplicateCreateMethodValidator() throws CoreException, ValidationException { // Duplicate @Create method final String NEW_CONTENT_FILE_NAME7 = "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.7"; assertMarkerIsCreatedForLine( TARGET_FILE_NAME, NEW_CONTENT_FILE_NAME7, SeamValidationMessages.DUPLICATE_CREATE, new Object[]{"createMethod"},36); assertMarkerIsCreatedForLine( TARGET_FILE_NAME, SeamValidationMessages.DUPLICATE_CREATE, new Object[]{"createMethod2"}, 41); } public void testDuplicateUnwrapMethodValidator() throws CoreException, ValidationException { // Duplicate @Unwrap method final String NEW_CONTENT_FILE_NAME8 = "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.8"; assertMarkerIsCreatedForLine( TARGET_FILE_NAME, NEW_CONTENT_FILE_NAME8, SeamValidationMessages.DUPLICATE_UNWRAP, new Object[] { "unwrapMethod"}, 40); assertMarkerIsCreatedForLine( TARGET_FILE_NAME, SeamValidationMessages.DUPLICATE_UNWRAP, new Object[] { "unwrapMethod2"}, 45); } public void testOnlyJavaBeansAndStatefulSessionBeansSupportDestroyMethodValidator() throws CoreException, ValidationException { // Only JavaBeans and stateful session beans support @Destroy methods final String NEW_CONTENT_FILE_NAME9 = "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.9"; assertMarkerIsCreatedForLine( TARGET_FILE_NAME, NEW_CONTENT_FILE_NAME9, SeamValidationMessages.DESTROY_METHOD_BELONGS_TO_STATELESS_SESSION_BEAN, new Object[] {"destroyMethod"}, 25); } public void testOnlyComponentClassCanHaveCreateMethodValidator() throws CoreException, ValidationException { // Only component class can have @Create method final String NEW_CONTENT_FILE_NAME10 = "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.10"; assertMarkerIsCreatedForLine( TARGET_FILE_NAME, NEW_CONTENT_FILE_NAME10, SeamValidationMessages.CREATE_DOESNT_BELONG_TO_COMPONENT, new Object[]{"createMethod"}, 25); } public void testOnlyComponentClassCanHaveUnwrapMethodValidator() throws CoreException, ValidationException { // Only component class can have @Unwrap method final String NEW_CONTENT_FILE_NAME11 = "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.11"; assertMarkerIsCreatedForLine( TARGET_FILE_NAME, NEW_CONTENT_FILE_NAME11, SeamValidationMessages.UNWRAP_DOESNT_BELONG_TO_COMPONENT, new Object[] {"unwrapMethod"}, 26); } public void testOnlyComponentClassCanHaveObserverMethodValidator() throws CoreException, ValidationException { // Only component class can have @Observer method final String NEW_CONTENT_FILE_NAME12 = "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.12"; assertMarkerIsCreatedForLine( TARGET_FILE_NAME, NEW_CONTENT_FILE_NAME12, SeamValidationMessages.OBSERVER_DOESNT_BELONG_TO_COMPONENT, new Object[] {"observerMethod"}, 26); } public void testDuplicateRemoveMethodValidator() throws CoreException, ValidationException { // Duplicate @Remove method final String NEW_CONTENT_FILE_NAME1 = "src/action/org/domain/SeamWebWarTestProject/session/StatefulComponent.1"; assertMarkerIsCreatedForLine( TARGET_FILE_NAME, NEW_CONTENT_FILE_NAME1, SeamValidationMessages.DUPLICATE_REMOVE, new Object[] {"removeMethod1"}, 18); assertMarkerIsCreatedForLine( TARGET_FILE_NAME, SeamValidationMessages.DUPLICATE_REMOVE, new Object[]{"removeMethod2"}, 22); } /** * @param statefulComponentFile * @param string * @param i * @throws CoreException */ protected void assertMarkerIsCreated(String targetPath, String newContentPath, String pattern, int line) throws CoreException { IFile newContentFile = project.getFile(newContentPath); IFile targetFile = project.getFile(targetPath); copyContentsFile(targetFile, newContentFile); assertMarkerIsCreated(targetFile, MARKER_TYPE, pattern, line); } /** * @param statefulComponentFile * @param string * @param i * @throws CoreException */ protected void assertMarkerIsCreated(String targetPath, String pattern, int line) throws CoreException { IFile targetFile = project.getFile(targetPath); assertMarkerIsCreated(targetFile, MARKER_TYPE, pattern, line); } /** * The validator should check duplicate @Remove methods only in stateful session bean component * This method tests usual component (not stateful sessian bean) with two @Remove methods. It must not have error markers. * @throws CoreException */ public void testDuplicateRemoveMethodInComponent_Validator() throws CoreException { getSeamProject(project); IFile componentFile = project.getFile("src/action/org/domain/SeamWebWarTestProject/session/UsualComponent.java"); int number = getMarkersNumberByGroupName(componentFile, SeamValidationErrorManager.MARKED_SEAM_PROJECT_MESSAGE_GROUP); assertEquals("Problem marker was found in UsualComponent.java file", 0, number); } public void testUnknownFactoryNameValidator() throws CoreException, ValidationException { assertMarkerIsNotCreatedForFile( "src/action/org/domain/SeamWebWarTestProject/session/Component12.java", SeamValidationMessages.UNKNOWN_FACTORY_NAME, new Object[] {"messageList2"}); // Unknown factory name assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/Component12.java", "src/action/org/domain/SeamWebWarTestProject/session/Component12.2", SeamValidationMessages.UNKNOWN_FACTORY_NAME, new Object[] {"messageList2"}, 24); } public void testDuplicateFactoryNameValidator() throws CoreException, ValidationException { assertMarkerIsNotCreatedForFile( "src/action/org/domain/SeamWebWarTestProject/session/DuplicateFactory.java", SeamValidationMessages.DUPLICATE_VARIABLE_NAME, new Object[] {"testFactory1"}); assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/DuplicateFactory.java", "src/action/org/domain/SeamWebWarTestProject/session/DuplicateFactory.1", SeamValidationMessages.DUPLICATE_VARIABLE_NAME, new Object[] {"testFactory1"}, 16); assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/DuplicateFactory.java", SeamValidationMessages.DUPLICATE_VARIABLE_NAME, new Object[] {"testFactory1"}, 21); } public void testMultipleDataBinderValidator() throws CoreException, ValidationException { assertMarkerIsNotCreatedForFile( "src/action/org/domain/SeamWebWarTestProject/session/SelectionTest.java", SeamValidationMessages.MULTIPLE_DATA_BINDER, new Object[] {}); assertMarkerIsNotCreatedForFile( "src/action/org/domain/SeamWebWarTestProject/session/SelectionIndexTest.java", SeamValidationMessages.MULTIPLE_DATA_BINDER, new Object[] {}); assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/SelectionTest.java", "src/action/org/domain/SeamWebWarTestProject/session/SelectionTest.2", SeamValidationMessages.MULTIPLE_DATA_BINDER, new Object[] {}, 21); assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/SelectionTest.java", SeamValidationMessages.MULTIPLE_DATA_BINDER, new Object[] {}, 24); assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/SelectionIndexTest.java", "src/action/org/domain/SeamWebWarTestProject/session/SelectionIndexTest.2", SeamValidationMessages.MULTIPLE_DATA_BINDER, new Object[] {}, 21); assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/SelectionIndexTest.java", SeamValidationMessages.MULTIPLE_DATA_BINDER, new Object[] {}, 24); } public void testUnknownDataModelNameValidator() throws CoreException, ValidationException { IFile selectionTestFile = project.getFile("src/action/org/domain/SeamWebWarTestProject/session/SelectionTest.java"); IFile selectionIndexTestFile = project.getFile("src/action/org/domain/SeamWebWarTestProject/session/SelectionIndexTest.java"); // Unknown @DataModel/@Out name assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/SelectionTest.java", "src/action/org/domain/SeamWebWarTestProject/session/SelectionTest.3", SeamValidationMessages.UNKNOWN_DATA_MODEL, new Object[] {"messageList2"}, 27); assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/SelectionIndexTest.java", "src/action/org/domain/SeamWebWarTestProject/session/SelectionIndexTest.3", SeamValidationMessages.UNKNOWN_DATA_MODEL, new Object[] {"messageList2"}, 27); } public void testDuplicateVariableName_Validator() throws CoreException, ValidationException { modifyPreferences(); assertMarkerIsNotCreatedForFile( "src/action/org/domain/SeamWebWarTestProject/session/ContextVariableTest.java", SeamValidationMessages.DUPLICATE_VARIABLE_NAME, new Object[] {"messageList"}); assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/ContextVariableTest.java", "src/action/org/domain/SeamWebWarTestProject/session/ContextVariableTest.2", SeamValidationMessages.DUPLICATE_VARIABLE_NAME, new Object[] {"messageList"}, 36); assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/ContextVariableTest.java", SeamValidationMessages.DUPLICATE_VARIABLE_NAME, new Object[] {"messageList"}, 41); } public void testUnknownVariableNameValidator() throws CoreException, ValidationException { IFile contextVariableTestFile = project.getFile("src/action/org/domain/SeamWebWarTestProject/session/ContextVariableTest.java"); String markerText = "Unknown context variable name: \"messageList5\""; assertMarkerIsNotCreated(contextVariableTestFile, MARKER_TYPE, markerText); // Unknown variable name assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/ContextVariableTest.java", "src/action/org/domain/SeamWebWarTestProject/session/ContextVariableTest.3", SeamValidationMessages.UNKNOWN_VARIABLE_NAME, new Object[]{"messageList5"}, 22); } public void testContextVariableCannotBeResolvedValidator() throws CoreException, ValidationException { modifyPreferences(); assertMarkerIsNotCreatedForFile(new ELValidatorWrapper(project), "WebContent/abcComponent.xhtml", ELValidationMessages.UNKNOWN_EL_VARIABLE_NAME, new Object[]{"bcComponent"}); // Context variable cannot be resolved assertMarkerIsCreatedForLine(new ELValidatorWrapper(project), "WebContent/abcComponent.xhtml", "WebContent/abcComponent.2", ELValidationMessages.UNKNOWN_EL_VARIABLE_NAME, new Object[]{"bcComponent"}, 22); } public void testPropertyCannotBeResolvedValidator() throws CoreException, ValidationException { assertMarkerIsNotCreatedForFile( new ELValidatorWrapper(project), "WebContent/abcComponent.xhtml", ELValidationMessages.UNKNOWN_EL_VARIABLE_PROPERTY_NAME, new Object[]{"actionType2"}); // Property cannot be resolved assertMarkerIsCreatedForLine( new ELValidatorWrapper(project), "WebContent/abcComponent.xhtml", "WebContent/abcComponent.3", ELValidationMessages.UNKNOWN_EL_VARIABLE_PROPERTY_NAME, new Object[]{"actionType2"}, 22); } public void testPropertyHasOnlySetterValidator() throws CoreException, ValidationException { // Unpaired Getter/Setter try { enableUnpairGetterOrSetterValidation(true); String target = "src/action/org/domain/SeamWebWarTestProject/session/AbcComponent.java"; copyContentsFile( target, "src/action/org/domain/SeamWebWarTestProject/session/AbcComponent.2"); copyContentsFile( "WebContent/abcComponent.xhtml", "WebContent/abcComponent.4"); //I am not sure that we need build here. If test is stable, lets remove this. // project.build(IncrementalProjectBuilder.CLEAN_BUILD, null); // project.build(IncrementalProjectBuilder.FULL_BUILD, null); // JobUtils.waitForIdle(); IFile targetFile = project.getFile(target); ELValidatorWrapper wrapper = new ELValidatorWrapper(project); wrapper.validate(targetFile); // assertMarkerIsNotCreatedForFile( // new ELValidatorWrapper(project), // "src/action/org/domain/SeamWebWarTestProject/session/AbcComponent.java", // "src/action/org/domain/SeamWebWarTestProject/session/AbcComponent.2", // ELValidationMessages.UNPAIRED_GETTER_OR_SETTER, // new Object[] {"actionType","Setter","Getter"}, // true); assertMarkerIsCreatedForLine( wrapper, "WebContent/abcComponent.xhtml", "WebContent/abcComponent.4", ELValidationMessages.UNPAIRED_GETTER_OR_SETTER, new Object[] {"actionType","Setter","Getter"}, 22); } finally { enableUnpairGetterOrSetterValidation(false); } } public void testPropertyHasOnlyGetterValidator() throws CoreException, ValidationException { //I am not sure that we need build here. If test is stable, lets remove this. // project.build(IncrementalProjectBuilder.FULL_BUILD, null); try { enableUnpairGetterOrSetterValidation(true); String target = "src/action/org/domain/SeamWebWarTestProject/session/AbcComponent.java"; copyContentsFile( target, "src/action/org/domain/SeamWebWarTestProject/session/AbcComponent.3"); JobUtils.waitForIdle(); IFile targetFile = project.getFile(target); ELValidatorWrapper wrapper = new ELValidatorWrapper(project); wrapper.validate(targetFile); // assertMarkerIsNotCreatedForFile( // new ELValidatorWrapper(project), // "src/action/org/domain/SeamWebWarTestProject/session/AbcComponent.java", // "src/action/org/domain/SeamWebWarTestProject/session/AbcComponent.3", // ELValidationMessages.UNPAIRED_GETTER_OR_SETTER, // new Object[] {"actionType", "Getter", "Setter"}, // true); assertMarkerIsCreatedForLine( wrapper, "WebContent/abcComponent.xhtml", "WebContent/abcComponent.original", ELValidationMessages.UNPAIRED_GETTER_OR_SETTER, new Object[] {"actionType", "Getter", "Setter"}, 22); } finally { enableUnpairGetterOrSetterValidation(false); } } private void enableUnpairGetterOrSetterValidation(boolean enable) { IPreferenceStore store = WebKbPlugin.getDefault().getPreferenceStore(); store.putValue(ELSeverityPreferences.UNPAIRED_GETTER_OR_SETTER, enable?SeamPreferences.ERROR:SeamPreferences.IGNORE); if(store instanceof IPersistentPreferenceStore) { try { ((IPersistentPreferenceStore)store).save(); } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } } } public void testInheritedMethods() throws CoreException { ISeamProject seamProject = getSeamProject(project); ISeamComponent c = seamProject.getComponent("inheritedComponent"); assertNotNull("Component inheritedComponent is not found", c); Set<ISeamComponentMethod> ms = c.getMethodsByType(SeamComponentMethodType.DESTROY); assertTrue("Seam tools does not see @Destroy-annotated method declared in super class", ms.size() > 0); ms = c.getMethodsByType(SeamComponentMethodType.REMOVE); assertTrue("Seam tools does not see @Remove-annotated method declared in super class", ms.size() > 0); IFile f = project.getFile("src/action/org/domain/SeamWebWarTestProject/session/InheritedComponent.java"); int errorsCount = getMarkersNumber(f); assertEquals("Seam tools validator does not see annotated methods declared in super class", 0, errorsCount); } // See https://jira.jboss.org/jira/browse/JBIDE-4393 public void testDuplicateComponents() throws CoreException, ValidationException { assertMarkerIsCreatedForLine( "WebContent/WEB-INF/components.xml", "WebContent/WEB-INF/duplicateComponents.test", SeamValidationMessages.NONUNIQUE_COMPONENT_NAME_MESSAGE, new Object[] {"duplicateJavaAndXmlComponentName"}, 5); assertMarkerIsCreatedForLine( "WebContent/WEB-INF/components.xml", SeamValidationMessages.NONUNIQUE_COMPONENT_NAME_MESSAGE, new Object[] {"duplicateJavaAndXmlComponentName"}, 8); assertMarkerIsCreatedForLine( "src/action/org/domain/SeamWebWarTestProject/session/DuplicateComponent.java", SeamValidationMessages.NONUNIQUE_COMPONENT_NAME_MESSAGE, new Object[] {"duplicateJavaAndXmlComponentName"}, 5); } /** * See https://jira.jboss.org/browse/JBIDE-6352 * @throws CoreException * @throws ValidationException */ public void testErrorMarkerForEL() throws CoreException, ValidationException{ assertMarkerIsCreatedForLine( new ELValidatorWrapper(project), "WebContent/markerTest.xhtml", ELValidationMessages.UNKNOWN_EL_VARIABLE_NAME, new Object[] {"testtt"}, 9); } public void testErrorMarkerInPagesXML() throws CoreException, ValidationException { SeamCoreValidatorWrapper seamValidator = new SeamCoreValidatorWrapper(project); assertMarkerIsCreatedForLine( seamValidator, "WebContent/WEB-INF/pages.xml", SeamValidationMessages.UNRESOLVED_VIEW_ID, new Object[] {"/home1.xhtml"}, 14); assertMarkerIsCreatedForLine( seamValidator, "WebContent/WEB-INF/pages.xml", SeamValidationMessages.UNRESOLVED_VIEW_ID, new Object[] {"/home2.xhtml"}, 17); assertMarkerIsCreatedForLine( seamValidator, "WebContent/WEB-INF/pages.xml", SeamValidationMessages.UNRESOLVED_VIEW_ID, new Object[] {"/home1.xhtml"}, 22); assertMarkerIsCreatedForLine( seamValidator, "WebContent/WEB-INF/pages.xml", SeamValidationMessages.UNRESOLVED_VIEW_ID, new Object[] {"/home2.xhtml"}, 23); } public static int getMarkersNumber(IResource resource) { return getMarkersNumberByGroupName(resource, SeamValidationErrorManager.MARKED_SEAM_PROJECT_MESSAGE_GROUP); } private static boolean findLine(Integer[] lines, int number) { for (int i = 0; i < lines.length; i++) { if(lines[i]==number) { return true; } } return false; } private void modifyPreferences(){ IPreferenceStore store = SeamCorePlugin.getDefault().getPreferenceStore(); store.putValue(SeamPreferences.UNKNOWN_VARIABLE_NAME, SeamPreferences.ERROR); if(store instanceof IPersistentPreferenceStore) { try { ((IPersistentPreferenceStore)store).save(); } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } } store = WebKbPlugin.getDefault().getPreferenceStore(); store.putValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_NAME, SeamPreferences.ERROR); store.putValue(ELSeverityPreferences.UNKNOWN_EL_VARIABLE_PROPERTY_NAME, SeamPreferences.ERROR); //store.putValue(ELSeverityPreferences.UNPAIRED_GETTER_OR_SETTER, SeamPreferences.ERROR); store.putValue(ELSeverityPreferences.RE_VALIDATE_UNRESOLVED_EL, SeamPreferences.ENABLE); if(store instanceof IPersistentPreferenceStore) { try { ((IPersistentPreferenceStore)store).save(); } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } } } private void modifyPreference(String name, String value){ IPreferenceStore store = SeamCorePlugin.getDefault().getPreferenceStore(); if(store instanceof IPersistentPreferenceStore) { try { ((IPersistentPreferenceStore)store).save(); } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } } store = WebKbPlugin.getDefault().getPreferenceStore(); store.putValue(name, value); if(store instanceof IPersistentPreferenceStore) { try { ((IPersistentPreferenceStore)store).save(); } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } } } public static class SeamMarkerFilter implements IMarkerFilter { public boolean accept(IMarker marker) { String groupName = marker.getAttribute("groupName", null); return groupName!=null && (groupName.equals(SeamValidationErrorManager.MARKED_SEAM_PROJECT_MESSAGE_GROUP) || groupName.equals(IValidator.MARKED_RESOURCE_MESSAGE_GROUP)); } } }