org.eclipse.ajdt.core.tests.model.AJModelTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ajdt.core.tests.model.AJModelTest.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2005 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.model;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.aspectj.asm.AsmManager;
import org.aspectj.asm.IProgramElement;
import org.eclipse.ajdt.core.AspectJPlugin;
import org.eclipse.ajdt.core.javaelements.AJCompilationUnitManager;
import org.eclipse.ajdt.core.model.AJProjectModelFacade;
import org.eclipse.ajdt.core.model.AJProjectModelFactory;
import org.eclipse.ajdt.core.tests.AJDTCoreTestCase;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaCore;

/**
 * Tests for mapping between IProgramElement and IJavaElements
 * 
 */
public class AJModelTest extends AJDTCoreTestCase {

    public void testProgramElementToJavaElementDemo() throws Exception {
        IProject project = createPredefinedProject("MarkersTest"); //$NON-NLS-1$
        String filename = "src/tjp/Demo.java"; //$NON-NLS-1$
        String[][] results = { { "Demo", "Demo" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "main(String[])", "main" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "go()", "go" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "field-set(int tjp.Demo.x)", "field-set(int tjp.Demo.x)" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "foo(int,Object)", "foo" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "exception-handler(void tjp.Demo.<catch>(tjp.DemoException))", //$NON-NLS-1$
                        "exception-handler(void tjp.Demo.<catch>(tjp.DemoException))" }, //$NON-NLS-1$
                { "bar(Integer)", "bar" } //$NON-NLS-1$ //$NON-NLS-2$
        };
        mappingTestForFile(project, filename, results);
    }

    public void testProgramElementToJavaElementGetInfo() throws Exception {
        IProject project = createPredefinedProject("MarkersTest"); //$NON-NLS-1$
        String filename = "src/tjp/GetInfo.aj"; //$NON-NLS-1$
        String[][] results = { { "declare warning: \"field set\"", "declare warning" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "declare parents: implements Serializable", "declare parents" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "declare soft: tjp.DemoException", "declare soft" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "Demo.itd(int)", "Demo.itd" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "Demo.f", "Demo.f" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "before(): <anonymous pointcut>", "before" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "before(): demoExecs..", "before" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "before(): <anonymous pointcut>..", "before" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "after(): fieldSet..", "after" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "around(): demoExecs()..", "around" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "after(): <anonymous pointcut>", "after" }, //$NON-NLS-1$ //$NON-NLS-2$
                { "printParameters(JoinPoint)", "printParameters" } //$NON-NLS-1$ //$NON-NLS-2$
        };
        mappingTestForFile(project, filename, results);
    }

    private void mappingTestForFile(IProject project, String filename, String[][] results) {
        IFile file = (IFile) project.findMember(filename);
        if (file == null)
            fail("Required file not found: " + filename); //$NON-NLS-1$

        String path = file.getRawLocation().toOSString();

        AsmManager asm = AspectJPlugin.getDefault().getCompilerFactory().getCompilerForProject(project.getProject())
                .getModel();
        Map annotationsMap = asm.getInlineAnnotations(path, true, true);

        assertNotNull("Didn't get annotations map for file: " + path, annotationsMap); //$NON-NLS-1$

        ICompilationUnit unit = AJCompilationUnitManager.INSTANCE.getAJCompilationUnit(file);
        if (unit == null) {
            unit = JavaCore.createCompilationUnitFrom(file);
        }

        assertNotNull("Didn't get a compilation unit from file: " + path, unit); //$NON-NLS-1$

        List toFind = new ArrayList();
        List toMatch = new ArrayList();
        for (int i = 0; i < results.length; i++) {
            toFind.add(results[i][0].intern());
            toMatch.add(results[i][1].intern());
        }

        AJProjectModelFacade model = AJProjectModelFactory.getInstance().getModelForProject(project);
        Set keys = annotationsMap.keySet();
        for (Iterator it = keys.iterator(); it.hasNext();) {
            Object key = it.next();
            List annotations = (List) annotationsMap.get(key);
            for (Iterator it2 = annotations.iterator(); it2.hasNext();) {
                IProgramElement node = (IProgramElement) it2.next();
                String peName = node.toLabelString(false).intern();

                IJavaElement je = model.programElementToJavaElement(node);
                if (je == null) {
                    System.out.println("je is null"); //$NON-NLS-1$
                    continue;
                }
                String jaName = je.getElementName().intern();
                int index = toFind.indexOf(peName);
                if (index == -1) {
                    fail("Unexpected additional IProgramElement name found: " + peName); //$NON-NLS-1$
                } else {
                    String expected = (String) toMatch.get(index);
                    if (expected.equals(jaName)) {
                        toFind.remove(index);
                        toMatch.remove(index);
                    } else {
                        fail("Incorrect corresponding Java element. Found: " + jaName + " Expected: " + expected); //$NON-NLS-1$ //$NON-NLS-2$
                    }
                }
            }
        }

        // check that we found everything we were looking for
        if (toFind.size() > 0) {
            String missing = ""; //$NON-NLS-1$
            for (int j = 0; j < toFind.size(); j++) {
                missing += System.getProperty("line.separator"); //$NON-NLS-1$
                missing += (String) toFind.get(j);
            }
            fail("Did not find all expected IProgramElement names. Missing: " + missing); //$NON-NLS-1$
        }
    }
}