blob: e182bffb98452ec905f4bcce664e3252aa952f03 [file] [log] [blame]
package org.eclipse.ajdt.core.tests;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.aspectj.asm.IProgramElement;
import org.aspectj.asm.IProgramElement.Kind;
import org.eclipse.ajdt.core.javaelements.AdviceElement;
import org.eclipse.ajdt.core.javaelements.AspectElement;
import org.eclipse.ajdt.core.javaelements.DeclareElement;
import org.eclipse.ajdt.core.javaelements.FieldIntertypeElement;
import org.eclipse.ajdt.core.javaelements.IAspectJElement;
import org.eclipse.ajdt.core.javaelements.MethodIntertypeElement;
import org.eclipse.ajdt.core.javaelements.PointcutElement;
import org.eclipse.ajdt.core.model.AJProjectModelFacade;
import org.eclipse.ajdt.core.model.AJProjectModelFactory;
import org.eclipse.ajdt.core.tests.model.AJModelTest4;
import org.eclipse.jdt.core.IInitializer;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.core.ImportContainer;
import static junit.framework.Assert.*;
import static org.aspectj.asm.IProgramElement.Kind.*;
public class HandleTestUtils {
private static Map<Kind, Class<?>> kindMap = new HashMap<IProgramElement.Kind, Class<?>>();
public static void checkAJHandle(String origAjHandle, AJProjectModelFacade model) throws JavaModelException {
if (origAjHandle.endsWith("binaries")) {
return;
}
IJavaElement origJavaElement = model.programElementToJavaElement(origAjHandle);
boolean checkExistence = !(origJavaElement instanceof ImportContainer ||
origJavaElement instanceof IInitializer);
String origJavaHandle = origJavaElement.getHandleIdentifier();
if (origJavaElement.getJavaProject().getProject().equals(model.getProject())) {
if (checkExistence) {
assertTrue("Element for AJHandle doesn't exist: "+origAjHandle,
origJavaElement.exists());
}
checkType(origJavaElement);
IProgramElement recreatedAjElement = model.javaElementToProgramElement(origJavaElement);
String recreatedAjHandle = recreatedAjElement.getHandleIdentifier();
IJavaElement recreatedJavaElement = model.programElementToJavaElement(recreatedAjHandle);
if (checkExistence) {
assertTrue("Doesn't exist: " + recreatedJavaElement.getHandleIdentifier(), recreatedJavaElement.exists());
}
checkType(recreatedJavaElement);
String recreatedJavaHandle = recreatedJavaElement.getHandleIdentifier();
assertEquals("Handle identifier of JavaElements should be equal", //$NON-NLS-1$
origJavaHandle, recreatedJavaHandle);
assertEquals("Handle identifier of ProgramElements should be equal", //$NON-NLS-1$
origAjHandle, recreatedAjHandle);
assertEquals("JavaElements should be equal", //$NON-NLS-1$
origJavaElement, recreatedJavaElement);
assertEquals("JavaElement names should be equal", //$NON-NLS-1$
origJavaElement.getElementName(), recreatedJavaElement.getElementName());
assertEquals("JavaElement types should be equal", //$NON-NLS-1$
origJavaElement.getElementType(), recreatedJavaElement.getElementType());
assertEquals("JavaElement parents should be equal", //$NON-NLS-1$
origJavaElement.getParent(), recreatedJavaElement.getParent());
assertEquals("JavaElement parents should be equal", //$NON-NLS-1$
origJavaElement.getJavaProject(), recreatedJavaElement.getJavaProject());
assertEquals("JavaElement resources should be the same", //$NON-NLS-1$
origJavaElement.getResource(), recreatedJavaElement.getResource());
} else {
// reference to another project
assertTrue("Program Element in other project should exist, but doesn't: " + origJavaHandle, //$NON-NLS-1$
origJavaElement.exists());
// check to make sure that this element is in the other model
AJProjectModelFacade otherModel = AJProjectModelFactory.getInstance().getModelForProject(origJavaElement.getJavaProject().getProject());
IProgramElement ipe = otherModel.javaElementToProgramElement(origJavaElement);
checkAJHandle(ipe.getHandleIdentifier(), otherModel);
}
}
/**
* Check whether the class of the object agrees with its AJKind. (Only doing this for select AJKinds and types now,
* but maybe we should do this for more kinds.
*
* @throws JavaModelException
*/
private static void checkType(IJavaElement javaElement) throws JavaModelException {
Kind kind = getAjKind(javaElement);
if (kind != null) {
assertEquals("The JavaElement "+javaElement+" is an instance of the wrong class", getClassForKind(kind), javaElement.getClass());
}
}
private static Class<?> getClassForKind(Kind kind) {
return kindMap.get(kind);
}
static {
//Specify what type of object is expected for a given AspectJ Kind below...
kindMap.put(ADVICE, AdviceElement.class);
kindMap.put(ASPECT, AspectElement.class);
kindMap.put(DECLARE_ERROR, DeclareElement.class);
kindMap.put(DECLARE_PARENTS, DeclareElement.class);
kindMap.put(DECLARE_SOFT, DeclareElement.class);
kindMap.put(DECLARE_ANNOTATION_AT_FIELD, DeclareElement.class);
kindMap.put(DECLARE_ANNOTATION_AT_METHOD, DeclareElement.class);
kindMap.put(DECLARE_ANNOTATION_AT_TYPE, DeclareElement.class);
kindMap.put(DECLARE_WARNING, DeclareElement.class);
kindMap.put(INTER_TYPE_FIELD, FieldIntertypeElement.class);
kindMap.put(INTER_TYPE_METHOD, MethodIntertypeElement.class);
kindMap.put(INTER_TYPE_CONSTRUCTOR, MethodIntertypeElement.class);
kindMap.put(POINTCUT, PointcutElement.class);
// TODO: specify expected class for other AJKind?
// but they are not currently covered by the tests (or we would
// be getting a test failure when they are not specified!)
//
// PROJECT, PACKAGE, FILE, FILE_JAVA, FILE_ASPECTJ, FILE_LST, IMPORT_REFERENCE, CLASS,
// INTERFACE, ENUM, ENUM_VALUE, ANNOTATION, INITIALIZER,,
// INTER_TYPE_PARENT, CONSTRUCTOR, METHOD, FIELD, DECLARE_PARENTS,
// CODE, ERROR, DECLARE_ANNOTATION_AT_CONSTRUCTOR,
// SOURCE_FOLDER,
// PACKAGE_DECLARATION }
}
/**
* Get the AJKind for given javeElement if it can be determined.
* @param javaElement
* @return null if this is not an AspectJ element, or if its kind can not be determined.
*/
private static Kind getAjKind(IJavaElement javaElement) {
if (javaElement instanceof IAspectJElement) {
try {
IAspectJElement ajElement = (IAspectJElement) javaElement;
return ajElement.getAJKind();
}
catch (JavaModelException e) {
return null;
}
}
return null;
}
public static List<String> checkJavaHandle(String origJavaHandle, AJProjectModelFacade model) {
List<String> accumulatedErrors = new ArrayList<String>();
try {
IJavaElement origJavaElement = JavaCore.create(origJavaHandle);
IProgramElement origAjElement = model.javaElementToProgramElement(origJavaElement);
String origAjHandle = origAjElement.getHandleIdentifier();
// AspectJ adds the import container always even when there are no imports
if (!origJavaElement.exists() && !(origJavaElement instanceof ImportContainer)
&& !(origJavaElement instanceof IInitializer) ) { // Bug 263310
accumulatedErrors.add("Java element " + origJavaElement.getHandleIdentifier() + " does not exist");
}
if (origJavaElement.getJavaProject().getProject().equals(model.getProject())) {
IProgramElement recreatedAjElement = model.javaElementToProgramElement(origJavaElement);
String recreatedAjHandle = recreatedAjElement.getHandleIdentifier();
IJavaElement recreatedJavaElement = model.programElementToJavaElement(recreatedAjHandle);
String recreatedJavaHandle = recreatedJavaElement.getHandleIdentifier();
if (!origJavaHandle.equals(recreatedJavaHandle)) {
accumulatedErrors.add("Handle identifier of JavaElements should be equal:\n\t" + origJavaHandle + "\n\t" + recreatedJavaHandle);
}
if (!origAjHandle.equals(recreatedAjHandle)) {
accumulatedErrors.add("Handle identifier of ProgramElements should be equal:\n\t" + origAjHandle + "\n\t" + recreatedAjHandle);
}
if (!origJavaElement.equals(recreatedJavaElement)) {
accumulatedErrors.add("JavaElements should be equal:\n\t" + origJavaElement + "\n\t" + recreatedJavaElement);
}
if (!origJavaElement.getElementName().equals(recreatedJavaElement.getElementName())) {
accumulatedErrors.add("JavaElement names should be equal:\n\t" + origJavaElement.getElementName() + "\n\t" + recreatedJavaElement.getElementName());
}
if (origJavaElement.getElementType()!= recreatedJavaElement.getElementType()) {
accumulatedErrors.add("JavaElement types should be equal:\n\t" + origJavaElement.getElementType() + "\n\t" + recreatedJavaElement.getElementType());
}
if (!origJavaElement.getParent().equals(recreatedJavaElement.getParent())) {
accumulatedErrors.add("JavaElement parents should be equal:\n\t" + origJavaElement.getParent() + "\n\t" + recreatedJavaElement.getParent());
}
if (!origJavaElement.getJavaProject().equals(recreatedJavaElement.getJavaProject())) {
accumulatedErrors.add("JavaElement projects should be equal:\n\t" + origJavaElement.getJavaProject() + "\n\t" + recreatedJavaElement.getJavaProject());
}
} else {
// reference to another project
if (!origJavaElement.exists()) {
accumulatedErrors.add("Program Element in other project should exist, but doesn't:\n\t" + origJavaHandle );
}
// check to make sure that this element is in the other model
AJProjectModelFacade otherModel = AJProjectModelFactory.getInstance().getModelForProject(origJavaElement.getJavaProject().getProject());
IProgramElement ipe = otherModel.javaElementToProgramElement(origJavaElement);
HandleTestUtils.checkAJHandle(ipe.getHandleIdentifier(), otherModel);
}
} catch (Exception e) {
accumulatedErrors.add("Error thrown on: " + origJavaHandle);
accumulatedErrors.add(e.toString());
for (int i = 0; i < e.getStackTrace().length; i++) {
accumulatedErrors.add("\t" + e.getStackTrace()[i].toString());
}
}
return accumulatedErrors;
}
}