/*******************************************************************************
* Copyright (c) 2011 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.cdi.core.test.tck.validation;
import java.io.ByteArrayInputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.HashMap;
import junit.framework.TestCase;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.wst.validation.ValidationFramework;
import org.eclipse.wst.validation.internal.ConfigurationManager;
import org.eclipse.wst.validation.internal.FilterUtil;
import org.eclipse.wst.validation.internal.InternalValidatorManager;
import org.eclipse.wst.validation.internal.ProjectConfiguration;
import org.eclipse.wst.validation.internal.RegistryConstants;
import org.eclipse.wst.validation.internal.operations.ValidatorSubsetOperation;
import org.jboss.tools.cdi.core.CDICoreBuilder;
import org.jboss.tools.cdi.core.CDICorePlugin;
import org.jboss.tools.cdi.core.IBean;
import org.jboss.tools.cdi.core.IInjectionPointField;
import org.jboss.tools.cdi.internal.core.impl.CDIProject;
import org.jboss.tools.cdi.internal.core.validation.CDIValidationMessages;
import org.jboss.tools.common.base.test.validation.TestUtil;
import org.jboss.tools.common.java.IAnnotationDeclaration;
import org.jboss.tools.common.util.FileUtils;
import org.jboss.tools.test.util.ResourcesUtils;
import org.jboss.tools.tests.AbstractResourceMarkerTest;
/**
* @author Alexey Kazakov
*/
public class IncrementalValidationTest extends ValidationTest {
/**
* See https://issues.jboss.org/browse/JBIDE-8325
* @throws Exception
*/
public void testInjectionPointRevalidation() throws Exception {
boolean saveAutoBuild = ResourcesUtils.setBuildAutomatically(false);
try {
IFile testInjection = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/revalidation/TestBeanBroken.java");
AbstractResourceMarkerTest.assertMarkerIsNotCreated(testInjection, CDIValidationMessages.AMBIGUOUS_INJECTION_POINTS[getVersionIndex()], 7);
AbstractResourceMarkerTest.assertMarkerIsNotCreated(testInjection, CDIValidationMessages.UNSATISFIED_INJECTION_POINTS[getVersionIndex()], 7);
IFile testBean = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/revalidation/TestBeanImpl2.java");
IFile testBeanImpl = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/revalidation/TestBeanImpl2.validation");
testBean.setContents(testBeanImpl.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(testBean);
AbstractResourceMarkerTest.assertMarkerIsCreated(testInjection, CDIValidationMessages.AMBIGUOUS_INJECTION_POINTS[getVersionIndex()], 7);
testBeanImpl = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/revalidation/TestBeanImpl2.java");
testBean = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/revalidation/TestBeanImpl2Original.validation");
testBeanImpl.setContents(testBean.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(testBeanImpl);
AbstractResourceMarkerTest.assertMarkerIsNotCreated(testInjection, CDIValidationMessages.AMBIGUOUS_INJECTION_POINTS[getVersionIndex()], 7);
AbstractResourceMarkerTest.assertMarkerIsNotCreated(testInjection, CDIValidationMessages.UNSATISFIED_INJECTION_POINTS[getVersionIndex()], 7);
} finally {
ResourcesUtils.setBuildAutomatically(saveAutoBuild);
}
}
/**
* See https://issues.jboss.org/browse/JBIDE-9071
* @throws Exception
*/
public void testInjectionPointResolvedToProducerRevalidation() throws Exception {
boolean saveAutoBuild = ResourcesUtils.setBuildAutomatically(false);
try {
IFile testInjection = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/revalidation/TestBeanForProducerBroken.java");
AbstractResourceMarkerTest.assertMarkerIsNotCreated(testInjection, CDIValidationMessages.AMBIGUOUS_INJECTION_POINTS[getVersionIndex()], 7);
AbstractResourceMarkerTest.assertMarkerIsNotCreated(testInjection, CDIValidationMessages.UNSATISFIED_INJECTION_POINTS[getVersionIndex()], 7);
IFile testBean = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/revalidation/MarketPlace.java");
IFile testBeanImpl = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/revalidation/MarketPlace.validation");
testBean.setContents(testBeanImpl.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(testBean);
AbstractResourceMarkerTest.assertMarkerIsCreated(testInjection, CDIValidationMessages.AMBIGUOUS_INJECTION_POINTS[getVersionIndex()], 7);
testBeanImpl = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/revalidation/MarketPlace.java");
testBean = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/revalidation/MarketPlaceOriginal.validation");
testBeanImpl.setContents(testBean.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(testBeanImpl);
AbstractResourceMarkerTest.assertMarkerIsNotCreated(testInjection, CDIValidationMessages.AMBIGUOUS_INJECTION_POINTS[getVersionIndex()], 7);
AbstractResourceMarkerTest.assertMarkerIsNotCreated(testInjection, CDIValidationMessages.UNSATISFIED_INJECTION_POINTS[getVersionIndex()], 7);
} finally {
ResourcesUtils.setBuildAutomatically(saveAutoBuild);
}
}
/**
* See https://issues.jboss.org/browse/JBIDE-9306
* @throws Exception
*/
public void testAlternativesInBeansXml() throws Exception {
boolean saveAutoBuild = ResourcesUtils.setBuildAutomatically(false);
try {
IFile bean = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/beansxml/incremental/Test3.java");
AbstractResourceMarkerTest.assertMarkerIsNotCreated(bean, CDIValidationMessages.UNSATISFIED_INJECTION_POINTS[getVersionIndex()], 8);
IFile beansXml = tckProject.getFile("JavaSource/META-INF/beans.xml");
IFile emptyBeansXml = tckProject.getFile("JavaSource/META-INF/beans.xml.empty");
beansXml.setContents(emptyBeansXml.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(beansXml);
AbstractResourceMarkerTest.assertMarkerIsCreated(bean, CDIValidationMessages.UNSATISFIED_INJECTION_POINTS[getVersionIndex()], 8);
IFile beansXmlWithAlternative = tckProject.getFile("JavaSource/META-INF/beans.xml.with.alternative");
beansXml.setContents(beansXmlWithAlternative.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(beansXml);
AbstractResourceMarkerTest.assertMarkerIsNotCreated(bean, CDIValidationMessages.UNSATISFIED_INJECTION_POINTS[getVersionIndex()], 8);
} finally {
IFile beansXml = tckProject.getFile("JavaSource/META-INF/beans.xml");
IFile beansXmlWithAlternative = tckProject.getFile("JavaSource/META-INF/beans.xml.with.alternative");
beansXml.setContents(beansXmlWithAlternative.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(beansXml);
ResourcesUtils.setBuildAutomatically(saveAutoBuild);
}
}
/**
* See https://issues.jboss.org/browse/JBIDE-12503
* @throws Exception
*/
public void testRestrictedType() throws Exception {
boolean saveAutoBuild = ResourcesUtils.setBuildAutomatically(false);
try {
IFile bean = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/typed/NewBean.java");
AbstractResourceMarkerTest.assertMarkerIsCreated(bean, CDIValidationMessages.ILLEGAL_TYPE_IN_TYPED_DECLARATION[getVersionIndex()], 5);
IFile interfaceFile = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/typed/LocalExtendedBean.java");
IFile modifiedFile = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/typed/LocalExtendedBean.changed");
interfaceFile.setContents(modifiedFile.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(interfaceFile);
AbstractResourceMarkerTest.assertMarkerIsNotCreated(bean, CDIValidationMessages.ILLEGAL_TYPE_IN_TYPED_DECLARATION[getVersionIndex()], 5);
IFile originalFile = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/typed/LocalExtendedBean.original");
interfaceFile.setContents(originalFile.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(interfaceFile);
AbstractResourceMarkerTest.assertMarkerIsCreated(bean, CDIValidationMessages.ILLEGAL_TYPE_IN_TYPED_DECLARATION[getVersionIndex()], 5);
} finally {
ResourcesUtils.setBuildAutomatically(saveAutoBuild);
}
}
/**
* See https://issues.jboss.org/browse/JBIDE-12503
* @throws Exception
*/
public void testInjectionsWithInterface() throws Exception {
boolean saveAutoBuild = ResourcesUtils.setBuildAutomatically(false);
try {
IFile bean = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/ExtensionManager.java");
AbstractResourceMarkerTest.assertMarkerIsNotCreated(bean, CDIValidationMessages.UNSATISFIED_INJECTION_POINTS[getVersionIndex()], 7);
IFile interfaceFile = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/IExtension.java");
IFile modifiedFile = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/IExtension.changed");
interfaceFile.setContents(modifiedFile.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(interfaceFile);
AbstractResourceMarkerTest.assertMarkerIsCreated(bean, CDIValidationMessages.UNSATISFIED_INJECTION_POINTS[getVersionIndex()], 7);
IFile originalFile = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/IExtension.original");
interfaceFile.setContents(originalFile.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(interfaceFile);
AbstractResourceMarkerTest.assertMarkerIsNotCreated(bean, CDIValidationMessages.UNSATISFIED_INJECTION_POINTS[getVersionIndex()], 7);
} finally {
ResourcesUtils.setBuildAutomatically(saveAutoBuild);
}
}
public void testPackageInfoJavaFile() throws Exception {
boolean saveAutoBuild = ResourcesUtils.setBuildAutomatically(false);
try {
IFile bean = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/packageinfo/zoo/Zoo.java");
AbstractResourceMarkerTest.assertMarkerIsCreated(bean, CDIValidationMessages.AMBIGUOUS_INJECTION_POINTS[getVersionIndex()], 7);
IFile packageInfoFile = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/packageinfo/pet/package-info.java");
IFile packageInfoFileWExclude = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/packageinfo/pet/package-info.changed");
packageInfoFile.setContents(packageInfoFileWExclude.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(packageInfoFile);
AbstractResourceMarkerTest.assertMarkerIsNotCreated(bean, CDIValidationMessages.AMBIGUOUS_INJECTION_POINTS[getVersionIndex()], 7);
IFile originalFile = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/packageinfo/pet/package-info.original");
packageInfoFile.setContents(originalFile.getContents(), IFile.FORCE, new NullProgressMonitor());
TestUtil.validate(packageInfoFile);
AbstractResourceMarkerTest.assertMarkerIsCreated(bean, CDIValidationMessages.AMBIGUOUS_INJECTION_POINTS[getVersionIndex()], 7);
} finally {
ResourcesUtils.setBuildAutomatically(saveAutoBuild);
}
}
public void testRemovingType() throws Exception {
boolean saveAutoBuild = ResourcesUtils.setBuildAutomatically(false);
try {
IFile hibernationFile = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/removingtype/Hibernation.java");
IFile denFile = tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/removingtype/Den.java");
//1. First check that we do have an injection to test.
IInjectionPointField point = getInjectionPointField("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/removingtype/Den.java", "bear");
assertNotNull(point);
Collection<IBean> bs = point.getCDIProject().getBeans(false, point);
assertEquals(bs.size(), 1);
//2. Next destroy qualifier type.
String content = FileUtils.readStream(hibernationFile);
hibernationFile.setContents(new ByteArrayInputStream("".getBytes()), true, false, new NullProgressMonitor());
//3. Validate after Java build but without CDI build.
//Exception will be caught by ValidationManager and ValidationExceptionTest
//will fail reporting it.
validateAfterJavaBuild(denFile);
//4. Check that CDI model has not changed but the qualifier declaration cannot find Java type.
point = getInjectionPointField("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/inject/incremental/removingtype/Den.java", "bear");
IAnnotationDeclaration d = point.getAnnotation("org.jboss.jsr299.tck.tests.jbt.validation.inject.incremental.removingtype.Hibernation");
assertNotNull(d); //because CDI builder has not been invoked.
assertNull(d.getType()); //because Java builder has been invoked.
//5. direct check of fix of JBIDE-18491
try {
CDIProject.getAnnotationDeclarationKey(d);
} catch (NullPointerException e) {
TestCase.fail("CDIProject.getAnnotationDeclarationKey fails with obsolete type.");
}
//6. Rebuild/revalidate and restore the qualifier type.
TestUtil.validate(denFile);
hibernationFile.setContents(new ByteArrayInputStream(content.getBytes()), true, false, new NullProgressMonitor());
TestUtil.validate(denFile);
} finally {
ResourcesUtils.setBuildAutomatically(saveAutoBuild);
}
}
public static void validateAfterJavaBuild(IResource resource) throws CoreException {
ValidationFramework.getDefault().suspendAllValidation(true);
resource.getProject().build(IncrementalProjectBuilder.INCREMENTAL_BUILD, JavaCore.BUILDER_ID, new HashMap<String, String>(), new NullProgressMonitor());
ValidationFramework.getDefault().suspendAllValidation(false);
try {
new IncrementalValidatorOperation(resource.getProject(), new Object[]{resource}).run(new NullProgressMonitor());
} catch (OperationCanceledException e) {
e.printStackTrace();
TestCase.fail(e.getMessage());
} catch (InvocationTargetException e) {
e.printStackTrace();
TestCase.fail(e.getMessage());
} finally {
ValidationFramework.getDefault().suspendAllValidation(true);
}
}
private static class IncrementalValidatorOperation extends ValidatorSubsetOperation {
public IncrementalValidatorOperation(IProject project, Object[] changedResources) throws InvocationTargetException {
super(project, shouldForce(changedResources), RegistryConstants.ATT_RULE_GROUP_DEFAULT, false);
ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
setEnabledValidators(InternalValidatorManager.wrapInSet(prjp.getEnabledIncrementalValidators(true)));
setFileDeltas(FilterUtil.getFileDeltas(getEnabledValidators(), changedResources, false));
}
}
}