blob: 341eed5b4efc8e997624980b11f4e650f42478ec [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* IBM Corporation - initial API and implementation
* Matt Chapman - initial version
*******************************************************************************/
package org.eclipse.ajdt.core.tests;
import java.util.Iterator;
import java.util.List;
import org.aspectj.asm.IProgramElement.Kind;
import org.aspectj.asm.IRelationship;
import org.aspectj.org.eclipse.jdt.internal.core.LocalVariable;
import org.eclipse.ajdt.core.AspectJCore;
import org.eclipse.ajdt.core.javaelements.AdviceElement;
import org.eclipse.ajdt.core.javaelements.AspectElement;
import org.eclipse.ajdt.core.javaelements.AspectJMemberElementInfo;
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.IntertypeElement;
import org.eclipse.ajdt.core.javaelements.MethodIntertypeElement;
import org.eclipse.ajdt.core.model.AJProjectModelFacade;
import org.eclipse.ajdt.core.model.AJProjectModelFactory;
import org.eclipse.ajdt.core.model.AJRelationshipManager;
import org.eclipse.ajdt.core.model.AJRelationshipType;
import org.eclipse.contribution.jdt.IsWovenTester;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.core.JavaElement;
import static org.aspectj.asm.IProgramElement.Kind.*;
/**
* Tests for AspectJCore.create()
*/
public class AJCoreTest extends AJDTCoreTestCase {
/**
* Test that AspectJCore.create() can form appropriate Java elements from a
* variety of handle identifiers
*
* @throws Exception
*/
public void testCreateElementFromHandle() throws Exception {
if (!IsWovenTester.isWeavingActive()) {
fail("This test requires JDT Weaving service to be enabled");
}
createPredefinedProject("TJP Example"); //$NON-NLS-1$
// each entry in the array contains:
// <handle> <name of element> <containing resource> <class name of
// element>
// note that the elements referred to by the handles need to exist
// in the workspace
String[][] testHandles = {
{ "=TJP Example/src<tjp{Demo.java", "Demo.java", //$NON-NLS-1$ //$NON-NLS-2$
"Demo.java", "CompilationUnit" }, //$NON-NLS-1$ //$NON-NLS-2$
{ "=TJP Example/src<tjp{Demo.java[Demo~main", "main", //$NON-NLS-1$ //$NON-NLS-2$
"Demo.java", "SourceMethod" }, //$NON-NLS-1$ //$NON-NLS-2$
{ "=TJP Example/src<tjp{GetInfo.aj", "GetInfo.aj", //$NON-NLS-1$ //$NON-NLS-2$
"GetInfo.aj", "AJCompilationUnit" }, //$NON-NLS-1$ //$NON-NLS-2$
{ "=TJP Example/src<tjp{GetInfo.aj'GetInfo", "GetInfo", //$NON-NLS-1$ //$NON-NLS-2$
"GetInfo.aj", "AspectElement" }, //$NON-NLS-1$ //$NON-NLS-2$
{ "=TJP Example/src<tjp{GetInfo.aj'GetInfo~println", //$NON-NLS-1$
"println", "GetInfo.aj", "SourceMethod" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
{ "=TJP Example/src<tjp{GetInfo.aj'GetInfo&around", //$NON-NLS-1$
"around", "GetInfo.aj", "AdviceElement" } }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
compareWithHandles(testHandles);
}
/**
* Test that AspectJCore.create() can form appropriate Java elements from a
* variety of handle identifiers
*
* @throws Exception
*/
public void testCreateElementFromHandle2() throws Exception {
if (!IsWovenTester.isWeavingActive()) {
fail("This test requires JDT Weaving service to be enabled");
}
createPredefinedProject("Bean Example"); //$NON-NLS-1$
String methodHandle = "=Bean Example/src<bean{Demo.java[Demo~main~\\[QString;?method-call(void bean.Point.setX(int))!0!0!0!0!I!0!false"; //$NON-NLS-1$
// each entry in the array contains:
// <handle> <name of element> <containing resource> <class name of
// element>
// note that the elements referred to by the handles need to exist
// in the workspace
String[][] testHandles = {
{ methodHandle, "method-call(void bean.Point.setX(int))", //$NON-NLS-1$
"Demo.java", "AJCodeElement" }, //$NON-NLS-1$ //$NON-NLS-2$
{
"=Bean Example/src<bean{BoundPoint.aj'BoundPoint&around&QPoint;", //$NON-NLS-1$
"around", "BoundPoint.aj", "AdviceElement" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
{
"=Bean Example/src<bean{BoundPoint.aj'BoundPoint)Point.hasListeners)QString;", //$NON-NLS-1$
"Point.hasListeners", "BoundPoint.aj", //$NON-NLS-1$ //$NON-NLS-2$
"MethodIntertypeElement" }, //$NON-NLS-1$
{
"=Bean Example/src<bean{BoundPoint.aj'BoundPoint,Point.support", //$NON-NLS-1$
"Point.support", "BoundPoint.aj", //$NON-NLS-1$ //$NON-NLS-2$
"FieldIntertypeElement" }, //$NON-NLS-1$
{
"=Bean Example/src<bean{BoundPoint.aj'BoundPoint`declare parents", //$NON-NLS-1$
"declare parents", "BoundPoint.aj", //$NON-NLS-1$ //$NON-NLS-2$
"DeclareElement" }, //$NON-NLS-1$
{
"=Bean Example/src<bean{BoundPoint.aj'BoundPoint`declare parents!2", //$NON-NLS-1$
"declare parents", "BoundPoint.aj", //$NON-NLS-1$ //$NON-NLS-2$
"DeclareElement" } //$NON-NLS-1$
};
compareWithHandles(testHandles);
}
/**
* Test that AspectJCore.create() can form appropriate Java elements from a
* variety of handle identifiers
*
* @throws Exception
*/
public void testCreateElementFromHandle3() throws Exception {
if (!IsWovenTester.isWeavingActive()) {
fail("This test requires JDT Weaving service to be enabled");
}
createPredefinedProject("Spacewar Example"); //$NON-NLS-1$
// each entry in the array contains:
// <handle> <name of element> <containing resource> <class name of
// element>
// note that the elements referred to by the handles need to exist
// in the workspace
String[][] testHandles = { {
"=Spacewar Example/src<spacewar{Ship.aj[Ship\"helmCommandsCut\"QShip;", "helmCommandsCut", //$NON-NLS-1$ //$NON-NLS-2$
"Ship.aj", "PointcutElement" }, //$NON-NLS-1$ //$NON-NLS-2$
};
compareWithHandles(testHandles);
}
/**
* Test that going from an IJavaElement to its handle identifier then back
* to an IJavaElement using AspectJCore.create() results in a element that
* is equivalent to the original (not necessarily identical).
*
* @throws Exception
*/
public void testHandleCreateRoundtrip() throws Exception {
IProject project = createPredefinedProject14("TJP Example"); //$NON-NLS-1$
AJRelationshipType[] rels = new AJRelationshipType[] {
AJRelationshipManager.ADVISED_BY, AJRelationshipManager.ADVISES };
compareElementsFromRelationships(rels, project);
}
/**
* Test that going from an IJavaElement to its handle identifier then back
* to an IJavaElement using AspectJCore.create() results in a element that
* is equivalent to the original (not necessarily identical).
*
* @throws Exception
*/
public void testHandleCreateRoundtrip2() throws Exception {
IProject project = createPredefinedProject("Bean Example"); //$NON-NLS-1$
AJRelationshipType[] rels = new AJRelationshipType[] {
AJRelationshipManager.ADVISED_BY,
AJRelationshipManager.ADVISES,
AJRelationshipManager.DECLARED_ON,
AJRelationshipManager.ASPECT_DECLARATIONS };
compareElementsFromRelationships(rels, project);
}
/**
* Test that going from an IJavaElement to its handle identifier then back
* to an IJavaElement using AspectJCore.create() results in a element that
* is equivalent to the original (not necessarily identical).
*
* @throws Exception
*/
public void testHandleCreateRoundtrip3() throws Exception {
IProject project = createPredefinedProject("MarkersTest",true); //$NON-NLS-1$
AJRelationshipType[] rels = new AJRelationshipType[] {
AJRelationshipManager.ADVISED_BY,
AJRelationshipManager.ADVISES,
AJRelationshipManager.DECLARED_ON,
AJRelationshipManager.ASPECT_DECLARATIONS,
AJRelationshipManager.MATCHED_BY,
AJRelationshipManager.MATCHES_DECLARE };
compareElementsFromRelationships(rels, project);
}
/**
* Test that going from an IJavaElement to its handle identifier then back
* to an IJavaElement using AspectJCore.create() results in a element that
* is equivalent to the original (not necessarily identical).
*
* @throws Exception
*/
public void testHandleCreateRoundtrip4() throws Exception {
IProject project = createPredefinedProject("Spacewar Example"); //$NON-NLS-1$
AJRelationshipType[] rels = new AJRelationshipType[] {
AJRelationshipManager.ADVISED_BY,
AJRelationshipManager.ADVISES,
AJRelationshipManager.DECLARED_ON,
AJRelationshipManager.ASPECT_DECLARATIONS,
AJRelationshipManager.MATCHED_BY,
AJRelationshipManager.MATCHES_DECLARE };
compareElementsFromRelationships(rels, project);
}
/**
* Test that going from an IJavaElement to its handle identifier then back
* to an IJavaElement using AspectJCore.create() results in a element that
* is equivalent to the original (not necessarily identical).
*
* @throws Exception
*/
public void testHandleCreateRoundtrip5() throws Exception {
IProject libProject = (IProject) getWorkspaceRoot().findMember(
"MyAspectLibrary"); //$NON-NLS-1$
if (libProject == null) {
libProject = createPredefinedProject14("MyAspectLibrary"); //$NON-NLS-1$
}
IProject weaveMeProject = createPredefinedProject("WeaveMe"); //$NON-NLS-1$
AJRelationshipType[] rels = new AJRelationshipType[] { AJRelationshipManager.ADVISED_BY };
compareElementsFromRelationships(rels, weaveMeProject);
}
/**
* Test that going from an IJavaElement to its handle identifier then back
* to an IJavaElement using AspectJCore.create() results in a element that
* is equivalent to the original (not necessarily identical).
*
* @throws Exception
*/
public void testHandleCreateRoundtripBug94107() throws Exception {
IProject project = createPredefinedProject("bug94107"); //$NON-NLS-1$
AJRelationshipType[] rels = new AJRelationshipType[] { AJRelationshipManager.ADVISED_BY };
compareElementsFromRelationships(rels, project);
}
private static String getSimpleClassName(Object obj) {
String longName = obj.getClass().getName();
int index = longName.lastIndexOf('.');
if (index == -1) {
return longName;
}
return longName.substring(index + 1);
}
static void compareElementsFromRelationships(AJRelationshipType[] rels,
IProject project) throws JavaModelException {
IJavaProject jProject = JavaCore.create(project);
AJProjectModelFacade model = AJProjectModelFactory.getInstance().getModelForProject(jProject.getProject());
List allRels = model.getRelationshipsForProject(rels);
if (!model.hasModel() || allRels.size() == 0) {
// if the project or model didn't build properly we'd get no
// relationships
// and the test would blindly pass without this check
fail("No relationships found for project " + project.getName()); //$NON-NLS-1$
}
for (Iterator iter = allRels.iterator(); iter.hasNext();) {
IRelationship rel = (IRelationship) iter.next();
HandleTestUtils.checkAJHandle(rel.getSourceHandle(), model);
for (Iterator targetIter = rel.getTargets().iterator(); targetIter.hasNext();) {
String handle = (String) targetIter.next();
HandleTestUtils.checkAJHandle(handle, model);
}
}
}
private void compareWithHandles(String[][] testHandles) {
for (int i = 0; i < testHandles.length; i++) {
IJavaElement el = AspectJCore.create(testHandles[i][0]);
assertEquals(
"Handle identifier of created element doesn't match original", //$NON-NLS-1$
testHandles[i][0], el.getHandleIdentifier());
assertEquals("Name of created element doesn't match expected", //$NON-NLS-1$
testHandles[i][1], el.getElementName());
assertEquals(
"Name of created element resource doesn't match expected", //$NON-NLS-1$
testHandles[i][2], el.getResource().getName());
assertEquals("Created element is not of the expected class type", //$NON-NLS-1$
testHandles[i][3], getSimpleClassName(el));
}
}
}