Java tutorial
/******************************************************************************* * 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)); } } }