org.eclipse.m2e.tests.jdt.JavaClasspathTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.m2e.tests.jdt.JavaClasspathTest.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Sonatype, Inc.
 * 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:
 *      Sonatype, Inc. - initial API and implementation
 *******************************************************************************/

package org.eclipse.m2e.tests.jdt;

import static org.eclipse.m2e.tests.common.ClasspathHelpers.assertClasspath;
import static org.eclipse.m2e.tests.common.ClasspathHelpers.getClasspathAttribute;
import static org.eclipse.m2e.tests.common.ClasspathHelpers.getClasspathEntry;

import org.junit.Assert;

import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;

import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.project.ResolverConfiguration;
import org.eclipse.m2e.jdt.IClasspathManager;
import org.eclipse.m2e.jdt.internal.MavenClasspathHelpers;
import org.eclipse.m2e.tests.common.AbstractMavenProjectTestCase;
import org.eclipse.m2e.tests.common.WorkspaceHelpers;

public class JavaClasspathTest extends AbstractMavenProjectTestCase {

    public void testImport() throws Exception {
        IProject project = importProject("customclasspath-p001", "projects/customclasspath/p001",
                new ResolverConfiguration());
        assertNoErrors(project);

        IJavaProject javaProject = JavaCore.create(project);

        IClasspathEntry[] cp = javaProject.getRawClasspath();

        assertEquals(5, cp.length);
        assertEquals("/customclasspath-p001/src/main/java", cp[0].getPath().toPortableString()); // <= main sources
        assertEquals("/customclasspath-p001/src/main/java2", cp[1].getPath().toPortableString()); // <= custom entry
        assertEquals("org.eclipse.jdt.launching.JRE_CONTAINER", cp[2].getPath().segment(0));
        assertEquals("org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", cp[3].getPath().segment(0));
        assertEquals("/customclasspath-p001/src/test/java", cp[4].getPath().toPortableString()); // <= test sources
    }

    public void testStaleDerivedEntries() throws Exception {
        IProject project = importProject("customclasspath-p001", "projects/customclasspath/p001",
                new ResolverConfiguration());
        assertNoErrors(project);
        copyContent(project, "pom-custom-source-root.xml", "pom.xml");

        MavenPlugin.getProjectConfigurationManager().updateProjectConfiguration(project, monitor);
        waitForJobsToComplete();
        assertNoErrors(project);

        IJavaProject javaProject = JavaCore.create(project);

        IClasspathEntry[] cp = javaProject.getRawClasspath();

        assertEquals(5, cp.length);

        // stale pom-derived classpath entries are removed after new entries have been added to the classpath
        // this results in unexpected classpath order, i.e. compile sources appear *after* test sources in some cases

        assertEquals("/customclasspath-p001/src/main/java2", cp[0].getPath().toPortableString()); // <= custom entry
        assertEquals("org.eclipse.jdt.launching.JRE_CONTAINER", cp[1].getPath().segment(0));
        assertEquals("org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", cp[2].getPath().segment(0));
        assertEquals("/customclasspath-p001/src/test/java", cp[3].getPath().toPortableString()); // <= test sources
        assertEquals("/customclasspath-p001/src/main/java3", cp[4].getPath().toPortableString()); // <= main sources
    }

    public void testClasspathContainers() throws Exception {
        IProject project = importProject("customclasspath-classpath-containers",
                "projects/customclasspath/classpath-containers", new ResolverConfiguration());

        IJavaProject javaProject = JavaCore.create(project);
        IClasspathEntry[] cp = javaProject.getRawClasspath();

        assertEquals(5, cp.length);

        assertClasspath(new String[] { //
                "org.eclipse.jdt.launching.JRE_CONTAINER/.*", //
                "org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", //
                "container1", //
                "/customclasspath-classpath-containers/src/main/java", //
                "/customclasspath-classpath-containers/src/test/java" //
        }, cp);

        Assert.assertNull(
                getClasspathAttribute(getClasspathEntry(cp, "container1"), IClasspathManager.POMDERIVED_ATTRIBUTE));
    }

    public void test370685_PreserveResourcesOnUpdate() throws Exception {
        IProject project = importProject("projects/370685_missingResources/pom.xml");
        //assertNoErrors(project);

        IJavaProject javaProject = JavaCore.create(project);
        IClasspathEntry[] originalCp = javaProject.getRawClasspath();

        assertEquals(5, originalCp.length);
        assertEquals("/project/src/main/java", originalCp[0].getPath().toPortableString());
        assertEquals("/project/src/main/resources", originalCp[1].getPath().toPortableString());
        assertEquals("/project/src/test/java", originalCp[2].getPath().toPortableString());
        assertEquals("org.eclipse.jdt.launching.JRE_CONTAINER", originalCp[3].getPath().segment(0));
        assertEquals("org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", originalCp[4].getPath().segment(0));

        MavenPlugin.getProjectConfigurationManager().updateProjectConfiguration(project, monitor);
        waitForJobsToComplete();
        //assertNoErrors(project);

        javaProject = JavaCore.create(project);
        IClasspathEntry[] updatedCp = javaProject.getRawClasspath();
        assertEquals("classpath changed on update", originalCp.length, updatedCp.length);
        for (int i = 0; i < originalCp.length; i++) {
            assertEquals("classpath entry changed", originalCp[i], updatedCp[i]);
        }
    }

    public void test486739_PreserveExportedOnUpdate() throws Exception {
        IProject project = importProject("projects/486739_exportedContainer/pom.xml");
        //assertNoErrors(project);

        IJavaProject javaProject = JavaCore.create(project);
        IClasspathEntry[] originalCp = javaProject.getRawClasspath();

        assertEquals(5, originalCp.length);
        assertEquals("org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", originalCp[4].getPath().segment(0));
        assertFalse(originalCp[4].isExported());

        originalCp[4] = MavenClasspathHelpers.getDefaultContainerEntry(true);
        javaProject.setRawClasspath(originalCp, monitor);

        MavenPlugin.getProjectConfigurationManager().updateProjectConfiguration(project, monitor);
        waitForJobsToComplete();
        //assertNoErrors(project);

        javaProject = JavaCore.create(project);
        IClasspathEntry[] updatedCp = javaProject.getRawClasspath();
        assertEquals("classpath changed on update", originalCp.length, updatedCp.length);
        assertEquals("org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", updatedCp[4].getPath().segment(0));
        assertTrue(updatedCp[4].isExported());
    }

    public void test398121_PreserveOrderOfClasspathContainersOnUpdate() throws Exception {
        IProject project = importProject("orderOf-classpath-containers",
                "projects/customclasspath/classpath-containers", new ResolverConfiguration());

        IJavaProject javaProject = JavaCore.create(project);
        IClasspathEntry[] cp = javaProject.getRawClasspath();

        assertEquals(5, cp.length);

        assertClasspath(new String[] { //
                "org.eclipse.jdt.launching.JRE_CONTAINER/.*", //
                "org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", //
                "container1", //
                "/orderOf-classpath-containers/src/main/java", //
                "/orderOf-classpath-containers/src/test/java" //
        }, cp);

        // Simulate user changes the order or the classpath entries. The order should be preserved during update if nothing changes in the pom.xml

        IClasspathEntry[] newOrder = new IClasspathEntry[] { cp[2], cp[3], cp[1], cp[0], cp[4] };

        javaProject.setRawClasspath(newOrder, null);

        // Update the project
        MavenPlugin.getProjectConfigurationManager().updateProjectConfiguration(project, monitor);
        waitForJobsToComplete();

        cp = javaProject.getRawClasspath();

        assertEquals(5, cp.length);

        assertClasspath(new String[] { //
                "container1", //
                "/orderOf-classpath-containers/src/main/java", //
                "org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", //
                "org.eclipse.jdt.launching.JRE_CONTAINER/.*", //
                "/orderOf-classpath-containers/src/test/java" //
        }, cp);

        // Simulate another change to the classpath

        newOrder = new IClasspathEntry[] { cp[0], cp[1], cp[3], cp[2], cp[4] };

        javaProject.setRawClasspath(newOrder, null);

        // Update the project
        MavenPlugin.getProjectConfigurationManager().updateProjectConfiguration(project, monitor);
        waitForJobsToComplete();

        cp = javaProject.getRawClasspath();

        assertEquals(5, cp.length);

        assertClasspath(new String[] { //
                "container1", //
                "/orderOf-classpath-containers/src/main/java", //
                "org.eclipse.jdt.launching.JRE_CONTAINER/.*", //
                "org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", //
                "/orderOf-classpath-containers/src/test/java" //
        }, cp);

    }

    public void test394042_ClasspathEntry4() throws Exception {
        IProject project = importProject("projects/394042_ClasspathEntry4/pom.xml");
        assertNoErrors(project);

        IJavaProject javaProject = JavaCore.create(project);

        IClasspathEntry[] cp = javaProject.getRawClasspath();

        assertEquals(cp.toString(), 5, cp.length);

        assertClasspath(new String[] { //
                "M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar", //
                "org.eclipse.jdt.launching.JRE_CONTAINER/.*", //
                "/394042_ClasspathEntry4/src/main/java", //
                "/394042_ClasspathEntry4/src/test/java", //
                "org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER",//
        }, cp);

        //Check Variable classpath entry attributes/accessrules are preserved
        IClasspathEntry junit = cp[0];

        assertEquals("/foo/bar/sources.jar", junit.getSourceAttachmentPath().toPortableString());

        assertEquals(2, junit.getExtraAttributes().length);
        assertEquals("file:/foo/bar/javadoc/", getClasspathAttribute(junit, "javadoc_location").getValue());
        assertEquals("UTF-8", getClasspathAttribute(junit, "source_encoding").getValue());

        assertEquals(1, junit.getAccessRules().length);
        assertEquals("foo/bar/**", junit.getAccessRules()[0].getPattern().toPortableString());
    }

    public void test466518_classpathJREOrder() throws Exception {
        IProject project = importProject("projects/466518_classpathJREOrder/pom.xml");
        WorkspaceHelpers.assertNoErrors(project);

        IClasspathEntry[] cp = JavaCore.create(project).getRawClasspath();

        assertClasspath(new String[] { //
                "/466518-project/src/main/java", //
                "/466518-project/src/test/java", //
                "org.eclipse.jdt.launching.JRE_CONTAINER/.*", //
                "org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER",//
        }, cp);

        copyContent(project, "pom_changed.xml", "pom.xml");
        MavenPlugin.getProjectConfigurationManager().updateProjectConfiguration(project, monitor);
        waitForJobsToComplete();
        WorkspaceHelpers.assertNoErrors(project);

        cp = JavaCore.create(project).getRawClasspath();

        assertClasspath(new String[] { //
                "/466518-project/src/main/java", //
                "/466518-project/src/test/java", //
                "org.eclipse.jdt.launching.JRE_CONTAINER/.*", //
                "org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER",//
        }, cp);
    }

    public void test388541_KeepClasspathAttributes() throws Exception {
        IProject project = importProject("projects/388541/pom.xml");
        assertNoErrors(project);

        IJavaProject javaProject = JavaCore.create(project);

        IClasspathEntry[] cp = javaProject.getRawClasspath();

        assertEquals(cp.toString(), 5, cp.length);

        assertClasspath(new String[] { //
                "M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar", //
                "org.eclipse.jdt.launching.JRE_CONTAINER/.*", //
                "/388541/src/main/java", //
                "/388541/src/test/java", //
                "org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER",//
        }, cp);

        //Check Variable classpath entry attributes/accessrules are preserved
        IClasspathEntry javaSource = cp[2];

        assertEquals("foo value should not change", "bar", getClasspathAttribute(javaSource, "foo").getValue());
        assertEquals("ignore_option_problems value should not change", "true",
                getClasspathAttribute(javaSource, "ignore_option_problems").getValue());
        assertEquals("maven.pomderived value should change", "true",
                getClasspathAttribute(javaSource, "maven.pomderived").getValue());
        assertNull("foobar value should have been removed", getClasspathAttribute(javaSource, "foobar"));

    }

    public void test480137_addingResourceFoldersAreNotRemovedDuringConfigurationUpdate() throws Exception {
        IProject project = importProject("480137_addingResourceFoldersUnstable",
                "projects/480137_addingResourceFoldersUnstable", new ResolverConfiguration());
        assertNoErrors(project);

        IJavaProject javaProject = JavaCore.create(project);

        assertClasspath(new String[] { //
                "/480137_addingResourceFoldersUnstable/src/main/java", //
                "/480137_addingResourceFoldersUnstable/src/main/js", //
                "/480137_addingResourceFoldersUnstable/src/test/java", //
                "/480137_addingResourceFoldersUnstable/src/test/js", //
                "org.eclipse.jdt.launching.JRE_CONTAINER/.*", //
                "org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", //
        }, //
                javaProject.getRawClasspath());

        MavenPlugin.getProjectConfigurationManager().updateProjectConfiguration(project, monitor);

        assertClasspath(new String[] { //
                "/480137_addingResourceFoldersUnstable/src/main/java", //
                "/480137_addingResourceFoldersUnstable/src/main/js", //
                "/480137_addingResourceFoldersUnstable/src/test/java", //
                "/480137_addingResourceFoldersUnstable/src/test/js", //
                "org.eclipse.jdt.launching.JRE_CONTAINER/.*", //
                "org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", //
        }, //
                javaProject.getRawClasspath());
    }
}