All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.maven.plugin.eclipse.EclipsePlugin Maven / Gradle / Ivy

Go to download

The Eclipse Plugin is used to generate Eclipse IDE files (.project, .classpath and the .settings folder) from a POM.

There is a newer version: 2.10
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.maven.plugin.eclipse;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.model.Build;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.eclipse.reader.ReadWorkspaceLocations;
import org.apache.maven.plugin.eclipse.writers.EclipseAjdtWriter;
import org.apache.maven.plugin.eclipse.writers.EclipseClasspathWriter;
import org.apache.maven.plugin.eclipse.writers.EclipseManifestWriter;
import org.apache.maven.plugin.eclipse.writers.EclipseOSGiManifestWriter;
import org.apache.maven.plugin.eclipse.writers.EclipseProjectWriter;
import org.apache.maven.plugin.eclipse.writers.EclipseSettingsWriter;
import org.apache.maven.plugin.eclipse.writers.EclipseWriterConfig;
import org.apache.maven.plugin.eclipse.writers.wtp.EclipseWtpApplicationXMLWriter;
import org.apache.maven.plugin.eclipse.writers.wtp.EclipseWtpComponent15Writer;
import org.apache.maven.plugin.eclipse.writers.wtp.EclipseWtpComponentWriter;
import org.apache.maven.plugin.eclipse.writers.wtp.EclipseWtpFacetsWriter;
import org.apache.maven.plugin.eclipse.writers.wtp.EclipseWtpmodulesWriter;
import org.apache.maven.plugin.ide.AbstractIdeSupportMojo;
import org.apache.maven.plugin.ide.IdeDependency;
import org.apache.maven.plugin.ide.IdeUtils;
import org.apache.maven.plugin.ide.JeeUtils;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.resource.ResourceManager;
import org.codehaus.plexus.resource.loader.FileResourceLoader;
import org.codehaus.plexus.resource.loader.ResourceNotFoundException;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.Xpp3Dom;

/**
 * Generates the following eclipse configuration files:
 * 
    *
  • .project and .classpath files
  • *
  • .setting/org.eclipse.jdt.core.prefs with project specific compiler settings
  • *
  • various configuration files for WTP (Web Tools Project), if the parameter wtpversion is set to a * valid version (WTP configuration is not generated by default)
  • *
* If this goal is run on a multiproject root, dependencies between modules will be configured as direct project * dependencies in Eclipse (unless useProjectReferences is set to false). * * @author Trygve Laugstøl * @author Fabrizio Giustina * @version $Id: EclipsePlugin.java 756392 2009-03-20 09:46:09Z baerrach $ * @goal eclipse * @execute phase="generate-resources" */ public class EclipsePlugin extends AbstractIdeSupportMojo { private static final String WEAVE_DEPENDENCY = "weaveDependency"; private static final String WEAVE_DEPENDENCIES = "weaveDependencies"; private static final String ASPECT_LIBRARY = "aspectLibrary"; private static final String ASPECT_LIBRARIES = "aspectLibraries"; private static final String ASPECT_DIRECTORY = "aspectDirectory"; private static final String TEST_ASPECT_DIRECTORY = "testAspectDirectory"; private static final String ASPECTJ_MAVEN_PLUGIN = "aspectj-maven-plugin"; private static final String ORG_CODEHAUS_MOJO = "org.codehaus.mojo"; private static final String DEFAULT_TEST_ASPECT_DIRECTORY = "src/test/aspect"; private static final String DEFAULT_ASPECT_DIRECTORY = "src/main/aspect"; private static final String NATURE_WST_FACET_CORE_NATURE = "org.eclipse.wst.common.project.facet.core.nature"; //$NON-NLS-1$ private static final String BUILDER_WST_COMPONENT_STRUCTURAL_DEPENDENCY_RESOLVER = "org.eclipse.wst.common.modulecore.ComponentStructuralBuilderDependencyResolver"; //$NON-NLS-1$ protected static final String BUILDER_WST_VALIDATION = "org.eclipse.wst.validation.validationbuilder"; //$NON-NLS-1$ private static final String BUILDER_JDT_CORE_JAVA = "org.eclipse.jdt.core.javabuilder"; //$NON-NLS-1$ private static final String BUILDER_WST_COMPONENT_STRUCTURAL = "org.eclipse.wst.common.modulecore.ComponentStructuralBuilder"; //$NON-NLS-1$ private static final String BUILDER_WST_FACET = "org.eclipse.wst.common.project.facet.core.builder"; //$NON-NLS-1$ private static final String BUILDER_PDE_MANIFEST = "org.eclipse.pde.ManifestBuilder"; //$NON-NLS-1$ private static final String BUILDER_PDE_SCHEMA = "org.eclipse.pde.SchemaBuilder"; //$NON-NLS-1$ private static final String BUILDER_AJDT_CORE_JAVA = "org.eclipse.ajdt.core.ajbuilder"; //$NON-NLS-1$ private static final String NATURE_WST_MODULE_CORE_NATURE = "org.eclipse.wst.common.modulecore.ModuleCoreNature"; //$NON-NLS-1$ private static final String NATURE_JDT_CORE_JAVA = "org.eclipse.jdt.core.javanature"; //$NON-NLS-1$ private static final String NATURE_JEM_WORKBENCH_JAVA_EMF = "org.eclipse.jem.workbench.JavaEMFNature"; //$NON-NLS-1$ private static final String NATURE_PDE_PLUGIN = "org.eclipse.pde.PluginNature"; //$NON-NLS-1$ private static final String NATURE_AJDT_CORE_JAVA = "org.eclipse.ajdt.ui.ajnature"; //$NON-NLS-1$ protected static final String COMMON_PATH_JDT_LAUNCHING_JRE_CONTAINER = "org.eclipse.jdt.launching.JRE_CONTAINER"; //$NON-NLS-1$ protected static final String ASPECTJ_RT_CONTAINER = "org.eclipse.ajdt.core.ASPECTJRT_CONTAINER"; //$NON-NLS-1$ protected static final String REQUIRED_PLUGINS_CONTAINER = "org.eclipse.pde.core.requiredPlugins"; //$NON-NLS-1$ // warning, order is important for binary search public static final String[] WTP_SUPPORTED_VERSIONS = new String[] { "1.0", "1.5", "2.0", "R7", "none" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ /** * Constant for 'artifactId' element in POM.xml. */ private static final String POM_ELT_ARTIFACT_ID = "artifactId"; //$NON-NLS-1$ /** * Constant for 'groupId' element in POM.xml. */ private static final String POM_ELT_GROUP_ID = "groupId"; //$NON-NLS-1$ /** * List of eclipse project natures. By default the org.eclipse.jdt.core.javanature nature plus the * needed WTP natures are added. Natures added using this property replace the default list. * *
     * <projectnatures>
     *    <projectnature>org.eclipse.jdt.core.javanature</projectnature>
     *    <projectnature>org.eclipse.wst.common.modulecore.ModuleCoreNature</projectnature>
     * </projectnatures>
     * 
* * @parameter */ private List projectnatures; /** * List of artifact to exclude from eclipse classpath, beeing provided by some eclipse classPathContainer * [MECLIPSE-79] * * @since 2.5 * @parameter */ private List excludes; /** * List of eclipse project natures to be added to the default ones. * *
     * <additionalProjectnatures>
     *    <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
     * </additionalProjectnatures>
     * 
* * @parameter */ private List additionalProjectnatures; /** * List of eclipse project facets to be added to the default ones. * *
     * <additionalProjectFacets>
     *    <jst.jsf>1.1<jst.jsf/>
     * </additionalProjectFacets>
     * 
* * @parameter */ private Map additionalProjectFacets; /** * List of eclipse build commands. By default the org.eclipse.jdt.core.javabuilder builder plus the * needed WTP builders are added. If you specify any configuration for this parameter, only those buildcommands * specified will be used; the defaults won't be added. Use the additionalBuildCommands parameter for * that. Configuration example: Old style: * *
     * <buildcommands>
     *    <buildcommand>org.eclipse.wst.common.modulecore.ComponentStructuralBuilder</buildcommand>
     *    <buildcommand>org.eclipse.jdt.core.javabuilder</buildcommand>
     *    <buildcommand>org.eclipse.wst.common.modulecore.ComponentStructuralBuilderDependencyResolver</buildcommand>
     * </buildcommands>
     * 
* * For new style, see additionalBuildCommands. * * @parameter */ private List buildcommands; /** * List of eclipse build commands to be added to the default ones. Old style: * *
     * <additionalBuildcommands>
     *    <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
     * </additionalBuildcommands>
     * 
* * New style: * *
     * <additionalBuildcommands>
     *    <buildCommand>
     *      <name>org.ui.externaltools.ExternalToolBuilder</name>
     *      <triggers>auto,full,incremental,</triggers>
     *      <arguments>
     *        <LaunchConfigHandle>&lt;project&gt;./externalToolBuilders/MavenBuilder.launch</LaunchConfighandle>
     *      </arguments>
     *    </buildCommand>
     * </additionalBuildcommands>
     * 
* * Note the difference between buildcommand and * buildCommand. You can mix and match old and new-style configuration entries. * * @parameter */ private List additionalBuildcommands; /** * List of container classpath entries. By default the org.eclipse.jdt.launching.JRE_CONTAINER * classpath container is added. Configuration example: * *
     * <classpathContainers>
     *    <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer>
     *    <classpathContainer>org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v5.5</classpathContainer>
     *    <classpathContainer>org.eclipse.jst.j2ee.internal.web.container/artifact</classpathContainer>
     * </classpathContainers>
     * 
* * @parameter */ private List classpathContainers; /** * Enables/disables the downloading of source attachments. Defaults to false. DEPRECATED - use downloadSources * * @parameter expression="${eclipse.downloadSources}" * @deprecated use downloadSources */ private boolean eclipseDownloadSources; /** * Eclipse workspace directory. * * @parameter expression="${eclipse.projectDir}" alias="outputDir" */ private File eclipseProjectDir; /** * When set to false, the plugin will not create sub-projects and instead reference those sub-projects using the * installed package in the local repository * * @parameter expression="${eclipse.useProjectReferences}" default-value="true" * @required */ private boolean useProjectReferences; /** * The default output directory * * @parameter expression="${outputDirectory}" alias="outputDirectory" * default-value="${project.build.outputDirectory}" * @required */ private File buildOutputDirectory; /** * The version of WTP for which configuration files will be generated. The default value is "none" (don't generate * WTP configuration), supported versions are "R7", "1.0", and "1.5" * * @parameter expression="${wtpversion}" default-value="none" */ private String wtpversion; /** * JEE context name of the WTP module. ( ex. WEB context name ). * * @parameter expression="${wtpContextName}" */ private String wtpContextName; /** * Is it an PDE project? If yes, the plugin adds the necessary natures and build commands to the .project file. * Additionally it copies all libraries to a project local directory and references them instead of referencing the * files in the local Maven repository. It also ensured that the "Bundle-Classpath" in META-INF/MANIFEST.MF is * synchronized. * * @parameter expression="${eclipse.pde}" default-value="false" */ private boolean pde; /** * Is it an AJDT project? If yes, the plugin adds the necessary natures and build commands to the .project file. */ private boolean ajdt; /** * The relative path of the manifest file * * @parameter expression="${eclipse.manifest}" default-value="${basedir}/META-INF/MANIFEST.MF" */ private File manifest; /** * Allow to configure additional generic configuration files for eclipse that will be written out to disk when * running eclipse:eclipse. FOr each file you can specify the name and the text content. * *
     * <plugin>
     *  <groupId>org.apache.maven.plugins</groupId>
     *  <artifactId>maven-eclipse-plugin</artifactId>
     *  <configuration>
     *   <additionalConfig>
     *    <file>
     *      <name>.checkstyle</name>
     *      <content>
     *        <![CDATA[<fileset-config file-format-version="1.2.0" simple-config="true">
     *          <fileset name="all" enabled="true" check-config-name="acme corporate style" local="false">
     *              <file-match-pattern match-pattern="." include-pattern="true"/>
     *          </fileset>
     *          <filter name="NonSrcDirs" enabled="true"/>
     *        </fileset-config>]]>
     *      </content>
     *    </file>
     *   </additionalConfig>
     *  </configuration>
     * </plugin>
     * 
* * Instead of the content you can also define (from version 2.5) an url to download the file : * *
     * <plugin>
     *  <groupId>org.apache.maven.plugins</groupId>
     *  <artifactId>maven-eclipse-plugin</artifactId>
     *  <configuration>
     *   <additionalConfig>
     *    <file>
     *      <name>.checkstyle</name>
     *      <url>http://some.place.org/path/to/file</url>
     *    </file>
     *   </additionalConfig>
     *  </configuration>
     * 
* * or a location : * *
     * <plugin>
     *  <groupId>org.apache.maven.plugins</groupId>
     *  <artifactId>maven-eclipse-plugin</artifactId>
     *  <configuration>
     *   <additionalConfig>
     *    <file>
     *     <name>.checkstyle</name>
     *     <location>/checkstyle-config.xml</location>
     *    </file>
     *   </additionalConfig>
     *  </configuration>
     *  <dependencies>
     *   <!-- The file defined in the location is stored in this dependency -->
     *   <dependency>
     *    <groupId>eclipsetest</groupId>
     *    <artifactId>checkstyle-config</artifactId>
     *    <version>1.0</version>
     *   </dependency>
     *  </dependencies>
     * </plugin>
     * 
* * @parameter */ private EclipseConfigFile[] additionalConfig; /** * If set to true, the version number of the artifact is appended to the name of the generated Eclipse * project. See projectNameTemplate for other options. * * @parameter expression="${eclipse.addVersionToProjectName}" default-value="false" */ private boolean addVersionToProjectName; /** * If set to true, the groupId of the artifact is appended to the name of the generated Eclipse * project. See projectNameTemplate for other options. * * @parameter expression="${eclipse.addGroupIdToProjectName}" default-value="false" */ private boolean addGroupIdToProjectName; /** * Allows configuring the name of the eclipse projects. This property if set wins over addVersionToProjectName and * addGroupIdToProjectName You can use [groupId], [artifactId] and [version] * variables. eg. [groupId].[artifactId]-[version] * * @parameter expression="${eclipse.projectNameTemplate}" */ private String projectNameTemplate; /** * Parsed wtp version. */ private float wtpVersionFloat; /** * Not a plugin parameter. Is this a java project? */ private boolean isJavaProject; /** * Must the manifest files be written for java projects so that that the jee classpath for wtp is correct. * * @parameter expression="${eclipse.wtpmanifest}" default-value="false" */ private boolean wtpmanifest; /** * Must the application files be written for ear projects in a separate directory. * * @parameter expression="${eclipse.wtpapplicationxml}" default-value="false" */ private boolean wtpapplicationxml; /** * What WTP defined server to use for deployment informations. * * @parameter expression="${eclipse.wtpdefaultserver}" */ private String wtpdefaultserver; private WorkspaceConfiguration workspaceConfiguration; /** * ResourceManager for getting additonalConfig files from resources * * @component * @required * @readonly */ private ResourceManager locator; /** * This eclipse workspace is read and all artifacts detected there will be connected as eclipse projects and will * not be linked to the jars in the local repository. Requirement is that it was created with the similar wtp * settings as the reactor projects, but the project name template my differ. The pom's in the workspace projects * may not contain variables in the artefactId, groupId and version tags. * * If workspace is not defined, then an attempt to locate it by checking up the directory hierarchy will be made. * * @since 2.5 * @parameter expression="${eclipse.workspace}" */ protected File workspace; /** * Limit the use of project references to the current workspace. No project references will be created to projects * in the reactor when they are not available in the workspace. * * @parameter expression="${eclipse.limitProjectReferencesToWorkspace}" default-value="false" */ protected boolean limitProjectReferencesToWorkspace; /** * The version of AJDT for which configuration files will be generated. The default value is "1.5", supported * versions are "none", "1.4", and "1.5". * * @parameter expression="${eclipse.ajdtVersion}" default-value="1.5" */ private String ajdtVersion; protected final boolean isJavaProject() { return isJavaProject; } protected final boolean isPdeProject() { return pde; } /** * Getter for buildcommands. * * @return Returns the buildcommands. */ public final List getBuildcommands() { return buildcommands; } /** * Setter for buildcommands. * * @param buildcommands The buildcommands to set. */ public final void setBuildcommands( List buildcommands ) { this.buildcommands = buildcommands; } /** * Getter for buildOutputDirectory. * * @return Returns the buildOutputDirectory. */ public final File getBuildOutputDirectory() { return buildOutputDirectory; } /** * Setter for buildOutputDirectory. * * @param buildOutputDirectory The buildOutputDirectory to set. */ public final void setBuildOutputDirectory( File buildOutputDirectory ) { this.buildOutputDirectory = buildOutputDirectory; } /** * Getter for classpathContainers. * * @return Returns the classpathContainers. */ public final List getClasspathContainers() { return classpathContainers; } /** * Setter for classpathContainers. * * @param classpathContainers The classpathContainers to set. */ public final void setClasspathContainers( List classpathContainers ) { this.classpathContainers = classpathContainers; } /** * Getter for eclipseProjectDir. * * @return Returns the eclipseProjectDir. */ public final File getEclipseProjectDir() { return eclipseProjectDir; } /** * Setter for eclipseProjectDir. * * @param eclipseProjectDir The eclipseProjectDir to set. */ public final void setEclipseProjectDir( File eclipseProjectDir ) { this.eclipseProjectDir = eclipseProjectDir; } /** * Getter for projectnatures. * * @return Returns the projectnatures. */ public final List getProjectnatures() { return projectnatures; } /** * Setter for projectnatures. * * @param projectnatures The projectnatures to set. */ public final void setProjectnatures( List projectnatures ) { this.projectnatures = projectnatures; } /** * Getter for useProjectReferences. * * @return Returns the useProjectReferences. */ public final boolean getUseProjectReferences() { return useProjectReferences; } /** * Setter for useProjectReferences. * * @param useProjectReferences The useProjectReferences to set. */ public final void setUseProjectReferences( boolean useProjectReferences ) { this.useProjectReferences = useProjectReferences; } /** * Getter for wtpversion. * * @return Returns the wtpversion. */ public final String getWtpversion() { return wtpversion; } /** * Setter for wtpversion. * * @param wtpversion The wtpversion to set. */ public final void setWtpversion( String wtpversion ) { this.wtpversion = wtpversion; } /** * Getter for additionalBuildcommands. * * @return Returns the additionalBuildcommands. */ public final List getAdditionalBuildcommands() { return additionalBuildcommands; } /** * Setter for additionalBuildcommands. * * @param additionalBuildcommands The additionalBuildcommands to set. */ public final void setAdditionalBuildcommands( List additionalBuildcommands ) { this.additionalBuildcommands = additionalBuildcommands; } /** * Getter for additionalProjectnatures. * * @return Returns the additionalProjectnatures. */ public final List getAdditionalProjectnatures() { return additionalProjectnatures; } /** * Setter for additionalProjectnatures. * * @param additionalProjectnatures The additionalProjectnatures to set. */ public final void setAdditionalProjectnatures( List additionalProjectnatures ) { this.additionalProjectnatures = additionalProjectnatures; } /** * Getter for addVersionToProjectName. */ public final boolean isAddVersionToProjectName() { return addVersionToProjectName; } /** * Setter for addVersionToProjectName. */ public final void setAddVersionToProjectName( boolean addVersionToProjectName ) { this.addVersionToProjectName = addVersionToProjectName; } /** * Getter for addGroupIdToProjectName. */ public final boolean isAddGroupIdToProjectName() { return addGroupIdToProjectName; } /** * Setter for addGroupIdToProjectName. */ public final void setAddGroupIdToProjectName( boolean addGroupIdToProjectName ) { this.addGroupIdToProjectName = addGroupIdToProjectName; } /** * Getter for projectNameTemplate * * @return projectNameTemplate */ public final String getProjectNameTemplate() { return projectNameTemplate; } /** * Setter for projectNameTemplate. * * @param projectNameTemplate projectNameTemplate */ public final void setProjectNameTemplate( String projectNameTemplate ) { this.projectNameTemplate = projectNameTemplate; } /** * @see org.apache.maven.plugin.Mojo#execute() */ public final boolean setup() throws MojoExecutionException { boolean ready = true; checkDeprecations(); setProjectNameTemplate( IdeUtils.calculateProjectNameTemplate( getProjectNameTemplate(), isAddVersionToProjectName(), isAddGroupIdToProjectName(), getLog() ) ); ajdt = enableAjdt( executedProject ) && !ajdtVersion.equals( "none" ); ready = validate(); // TODO: Why are we using project in some places, and executedProject in others?? ArtifactHandler artifactHandler = project.getArtifact().getArtifactHandler(); // ear projects don't contain java sources // pde projects are always java projects isJavaProject = pde || ( Constants.LANGUAGE_JAVA.equals( artifactHandler.getLanguage() ) && !Constants.PROJECT_PACKAGING_EAR.equals( packaging ) ); setupExtras(); parseConfigurationOptions(); // defaults if ( projectnatures == null ) { fillDefaultNatures( packaging ); } if ( additionalProjectnatures != null ) { projectnatures.addAll( additionalProjectnatures ); } if ( buildcommands == null ) { fillDefaultBuilders( packaging ); } else { convertBuildCommandList( buildcommands ); } if ( additionalBuildcommands != null ) { convertBuildCommandList( additionalBuildcommands ); buildcommands.addAll( additionalBuildcommands ); } if ( classpathContainers == null ) { fillDefaultClasspathContainers( packaging ); } else { verifyClasspathContainerListIsComplete(); } locator.addSearchPath( FileResourceLoader.ID, project.getFile().getParentFile().getAbsolutePath() ); locator.setOutputDirectory( new File( project.getBuild().getDirectory() ) ); // ready to start return ready; } /** * Convert any Strings in the commands List to BuildCommands. The conversion happens * in situ. * * @param commands a list of commands to convert into BuildCommand */ protected final void convertBuildCommandList( List commands ) { if ( commands != null ) { for ( ListIterator i = commands.listIterator(); i.hasNext(); ) { Object command = i.next(); if ( command instanceof String ) { command = new BuildCommand( (String) command ); i.set( command ); } } } } private void parseConfigurationOptions() { if ( "R7".equalsIgnoreCase( wtpversion ) ) //$NON-NLS-1$ { wtpVersionFloat = 0.7f; } else if ( "1.0".equalsIgnoreCase( wtpversion ) ) //$NON-NLS-1$ { wtpVersionFloat = 1.0f; } else if ( "1.5".equalsIgnoreCase( wtpversion ) ) //$NON-NLS-1$ { wtpVersionFloat = 1.5f; } else if ( "2.0".equalsIgnoreCase( wtpversion ) ) //$NON-NLS-1$ { wtpVersionFloat = 2.0f; } if ( !"none".equalsIgnoreCase( wtpversion ) ) { getLog().info( Messages.getString( "EclipsePlugin.wtpversion", wtpversion ) ); } } /** * Extension point for subclasses. *

* Called during setup. * * @throws MojoExecutionException mojo failures. */ protected void setupExtras() throws MojoExecutionException { // extension point. } private void verifyClasspathContainerListIsComplete() { boolean containsJREContainer = false; // Check if classpathContainer contains a JRE (default, alternate or // Execution Environment) for ( Iterator iter = classpathContainers.iterator(); iter.hasNext(); ) { Object classPathContainer = iter.next(); if ( classPathContainer != null && classPathContainer.toString().startsWith( COMMON_PATH_JDT_LAUNCHING_JRE_CONTAINER ) ) { containsJREContainer = true; break; } } if ( !containsJREContainer ) { getLog().warn( Messages.getString( "EclipsePlugin.missingjrecontainer" ) ); //$NON-NLS-1$ classpathContainers.add( 0, COMMON_PATH_JDT_LAUNCHING_JRE_CONTAINER ); } } private boolean validate() throws MojoExecutionException { // validate sanity of the current m2 project if ( Arrays.binarySearch( WTP_SUPPORTED_VERSIONS, wtpversion ) < 0 ) { throw new MojoExecutionException( Messages.getString( "EclipsePlugin.unsupportedwtp", new Object[] { //$NON-NLS-1$ wtpversion, StringUtils.join( WTP_SUPPORTED_VERSIONS, " " ) } ) ); //$NON-NLS-1$ } assertNotEmpty( executedProject.getGroupId(), POM_ELT_GROUP_ID ); assertNotEmpty( executedProject.getArtifactId(), POM_ELT_ARTIFACT_ID ); if ( executedProject.getFile() == null || !executedProject.getFile().exists() ) { throw new MojoExecutionException( Messages.getString( "EclipsePlugin.missingpom" ) ); //$NON-NLS-1$ } if ( "pom".equals( packaging ) && eclipseProjectDir == null ) //$NON-NLS-1$ { getLog().info( Messages.getString( "EclipsePlugin.pompackaging" ) ); //$NON-NLS-1$ return false; } if ( "eclipse-plugin".equals( packaging ) ) { pde = true; } if ( eclipseProjectDir == null ) { eclipseProjectDir = executedProject.getFile().getParentFile(); } if ( !eclipseProjectDir.exists() && !eclipseProjectDir.mkdirs() ) { throw new MojoExecutionException( Messages.getString( "EclipsePlugin.cantcreatedir", eclipseProjectDir ) ); //$NON-NLS-1$ } if ( !eclipseProjectDir.equals( executedProject.getFile().getParentFile() ) ) { if ( !eclipseProjectDir.isDirectory() ) { throw new MojoExecutionException( Messages.getString( "EclipsePlugin.notadir", eclipseProjectDir ) ); //$NON-NLS-1$ } eclipseProjectDir = new File( eclipseProjectDir, executedProject.getArtifactId() ); if ( !eclipseProjectDir.isDirectory() && !eclipseProjectDir.mkdirs() ) { throw new MojoExecutionException( Messages.getString( "EclipsePlugin.cantcreatedir", eclipseProjectDir ) ); //$NON-NLS-1$ } } validateExtras(); return true; } /** * Extension point for subclasses. *

* Called during setup and used to validate that the configuration is sane. * * @throws MojoExecutionException mojo failures. */ protected void validateExtras() throws MojoExecutionException { // provided for extension. } private void checkDeprecations() { if ( eclipseDownloadSources ) { // deprecated warning getLog().warn( Messages.getString( "EclipsePlugin.deprecatedpar", new Object[] { //$NON-NLS-1$ "eclipse.downloadSources", //$NON-NLS-1$ "downloadSources" } ) ); //$NON-NLS-1$ downloadSources = true; } checkDeprecationsExtras(); } /** * Extension point for subclasses. *

* Check for any extra deprecations and log warnings. Called during setup */ protected void checkDeprecationsExtras() { // provided for extension. } public final void writeConfiguration( IdeDependency[] deps ) throws MojoExecutionException { EclipseWriterConfig config = createEclipseWriterConfig( deps ); if ( wtpmanifest && isJavaProject() ) { EclipseManifestWriter.addManifestResource( getLog(), config ); } // NOTE: This could change the config! writeConfigurationExtras( config ); if ( wtpVersionFloat == 0.7f ) { new EclipseWtpmodulesWriter().init( getLog(), config ).write(); } if ( wtpVersionFloat >= 1.0f ) { new EclipseWtpFacetsWriter().init( getLog(), config ).write(); } if ( wtpVersionFloat == 1.0f ) { new EclipseWtpComponentWriter().init( getLog(), config ).write(); } if ( wtpVersionFloat >= 1.5 ) { new EclipseWtpComponent15Writer().init( getLog(), config ).write(); } new EclipseSettingsWriter().init( getLog(), config ).write(); if ( isJavaProject ) { new EclipseClasspathWriter().init( getLog(), config ).write(); if ( ajdt && ajdtVersion.equals( "1.4" ) ) { new EclipseAjdtWriter().init( getLog(), config ).write(); } } if ( wtpapplicationxml ) { new EclipseWtpApplicationXMLWriter().init( getLog(), config ).write(); } if ( pde ) { this.getLog().info( "The Maven Eclipse plugin runs in 'pde'-mode." ); new EclipseOSGiManifestWriter().init( getLog(), config ).write(); } // NOTE: This one MUST be after EclipseClasspathwriter, and possibly others, // since currently EclipseClasspathWriter does some magic to detect nested // output folders and modifies the configuration by adding new (Ant) builders. // So the .project file must be written AFTER those have run! new EclipseProjectWriter().init( getLog(), config ).write(); writeAdditionalConfig(); getLog().info( Messages.getString( "EclipsePlugin.wrote", new Object[] { //$NON-NLS-1$ config.getEclipseProjectName(), eclipseProjectDir.getAbsolutePath() } ) ); } private void writeAdditionalConfig() throws MojoExecutionException { if ( additionalConfig != null ) { for ( int j = 0; j < additionalConfig.length; j++ ) { EclipseConfigFile file = additionalConfig[j]; File projectRelativeFile = new File( eclipseProjectDir, file.getName() ); if ( projectRelativeFile.isDirectory() ) { // just ignore? getLog().warn( Messages.getString( "EclipsePlugin.foundadir", //$NON-NLS-1$ projectRelativeFile.getAbsolutePath() ) ); } try { projectRelativeFile.getParentFile().mkdirs(); if ( file.getContent() == null ) { InputStream inStream; if ( file.getLocation() != null ) { inStream = locator.getResourceAsInputStream( file.getLocation() ); } else { inStream = file.getURL().openConnection().getInputStream(); } OutputStream outStream = new FileOutputStream( projectRelativeFile ); try { IOUtil.copy( inStream, outStream ); } finally { inStream.close(); outStream.close(); } } else { FileUtils.fileWrite( projectRelativeFile.getAbsolutePath(), file.getContent() ); } } catch ( IOException e ) { throw new MojoExecutionException( Messages.getString( "EclipsePlugin.cantwritetofile", //$NON-NLS-1$ projectRelativeFile.getAbsolutePath() ) ); } catch ( ResourceNotFoundException e ) { throw new MojoExecutionException( Messages.getString( "EclipsePlugin.cantfindresource", //$NON-NLS-1$ file.getLocation() ) ); } } } } /** * Create the EclipseWriterConfig for the specified dependencies. * * @param deps the project dependencies * @return a configured EclipseWriterConfig * @throws MojoExecutionException mojo failures. */ protected final EclipseWriterConfig createEclipseWriterConfig( IdeDependency[] deps ) throws MojoExecutionException { File projectBaseDir = executedProject.getFile().getParentFile(); // build a list of UNIQUE source dirs (both src and resources) to be // used in classpath and wtpmodules EclipseSourceDir[] sourceDirs = buildDirectoryList( executedProject, eclipseProjectDir, buildOutputDirectory ); EclipseWriterConfig config = new EclipseWriterConfig(); config.setWorkspaceConfiguration( getWorkspaceConfiguration() ); config.setProjectNameTemplate( getProjectNameTemplate() ); String projectName = IdeUtils.getProjectName( config.getProjectNameTemplate(), project ); config.setEclipseProjectName( projectName ); config.setWtpapplicationxml( wtpapplicationxml ); config.setWtpVersion( wtpVersionFloat ); float ajdtVersionFloat; try { ajdtVersionFloat = Float.parseFloat( ajdtVersion ); } catch ( NumberFormatException e ) { ajdtVersionFloat = 0.0f; } config.setAjdtVersion( ajdtVersionFloat ); Set convertedBuildCommands = new LinkedHashSet(); if ( buildcommands != null ) { for ( Iterator it = buildcommands.iterator(); it.hasNext(); ) { Object cmd = it.next(); if ( cmd instanceof BuildCommand ) { convertedBuildCommands.add( cmd ); } else { convertedBuildCommands.add( new BuildCommand( (String) cmd ) ); } } } if ( ajdt ) { buildAjdtWeaveDeps( deps ); buildAspectjDeps( deps ); } config.setBuildCommands( new LinkedList( convertedBuildCommands ) ); config.setBuildOutputDirectory( buildOutputDirectory ); config.setClasspathContainers( classpathContainers ); config.setDeps( deps ); config.setEclipseProjectDirectory( eclipseProjectDir ); config.setLocalRepository( localRepository ); config.setOSGIManifestFile( manifest ); config.setPde( pde ); config.setProject( project ); config.setProjectBaseDir( projectBaseDir ); config.setProjectnatures( projectnatures ); config.setProjectFacets( additionalProjectFacets ); config.setSourceDirs( sourceDirs ); config.setAddVersionToProjectName( isAddVersionToProjectName() ); config.setPackaging( packaging ); collectWarContextRootsFromReactorEarConfiguration( config ); return config; } /** * If this is a war module peek into the reactor an search for an ear module that defines the context root of this * module. * * @param config config to save the context root. */ private void collectWarContextRootsFromReactorEarConfiguration( EclipseWriterConfig config ) { if ( reactorProjects != null && wtpContextName == null && Constants.PROJECT_PACKAGING_WAR.equals( project.getPackaging() ) ) { for ( Iterator iter = reactorProjects.iterator(); iter.hasNext(); ) { MavenProject reactorProject = (MavenProject) iter.next(); if ( Constants.PROJECT_PACKAGING_EAR.equals( reactorProject.getPackaging() ) ) { Xpp3Dom[] warDefinitions = IdeUtils.getPluginConfigurationDom( reactorProject, JeeUtils.ARTIFACT_MAVEN_EAR_PLUGIN, new String[] { "modules", "webModule" } ); for ( int index = 0; index < warDefinitions.length; index++ ) { Xpp3Dom groupId = warDefinitions[index].getChild( "groupId" ); Xpp3Dom artifactId = warDefinitions[index].getChild( "artifactId" ); Xpp3Dom contextRoot = warDefinitions[index].getChild( "contextRoot" ); if ( groupId != null && artifactId != null && contextRoot != null && groupId.getValue() != null && artifactId.getValue() != null && contextRoot.getValue() != null ) { getLog().info( "Found context root definition for " + groupId.getValue() + ":" + artifactId.getValue() + " " + contextRoot.getValue() ); if ( project.getArtifactId().equals( artifactId.getValue() ) && project.getGroupId().equals( groupId.getValue() ) ) { config.setContextName( contextRoot.getValue() ); } } else { getLog().info( "Found incomplete ear configuration in " + reactorProject.getGroupId() + ":" + reactorProject.getGroupId() + " found " + warDefinitions[index].toString() ); } } } } } if ( config.getContextName() == null && Constants.PROJECT_PACKAGING_WAR.equals( project.getPackaging() ) ) { if ( wtpContextName == null ) { config.setContextName( project.getArtifactId() ); } else { config.setContextName( wtpContextName ); } } } /** * Write any extra configuration information for the Eclipse project. This is an extension point, called before the * main configurations are written.
NOTE: This could change the config! * * @param config * @throws MojoExecutionException */ protected void writeConfigurationExtras( EclipseWriterConfig config ) throws MojoExecutionException { // extension point. } private void assertNotEmpty( String string, String elementName ) throws MojoExecutionException { if ( string == null ) { throw new MojoExecutionException( Messages.getString( "EclipsePlugin.missingelement", elementName ) ); //$NON-NLS-1$ } } /** * Fill getProjectnatures() with values. *

* Subclasses should call super and then calculate their own additions and insert them via * getProjectnatures().addAll(). * * @param packaging the pom's packaging */ protected void fillDefaultNatures( String packaging ) { projectnatures = new ArrayList(); if ( wtpVersionFloat >= 1.0f ) { projectnatures.add( NATURE_WST_FACET_CORE_NATURE ); // WTP 1.0 nature } if ( isJavaProject ) { if ( ajdt ) { projectnatures.add( NATURE_AJDT_CORE_JAVA ); } projectnatures.add( NATURE_JDT_CORE_JAVA ); } if ( wtpVersionFloat >= 0.7f ) { projectnatures.add( NATURE_WST_MODULE_CORE_NATURE ); // WTP 0.7/1.0 nature if ( isJavaProject ) { projectnatures.add( NATURE_JEM_WORKBENCH_JAVA_EMF ); // WTP 0.7/1.0 nature } } if ( pde ) { projectnatures.add( NATURE_PDE_PLUGIN ); } } /** * Fill getClasspathContainers() with values. *

* Subclasses should call super and then calculate their own additions and insert them via * getClasspathContainers().addAll(). * * @param packaging the pom's packaging */ protected void fillDefaultClasspathContainers( String packaging ) { classpathContainers = new ArrayList(); if ( getWorkspaceConfiguration().getDefaultClasspathContainer() != null ) { getLog().info( "Adding default classpath container: " + getWorkspaceConfiguration().getDefaultClasspathContainer() ); classpathContainers.add( getWorkspaceConfiguration().getDefaultClasspathContainer() ); } if ( pde ) { classpathContainers.add( REQUIRED_PLUGINS_CONTAINER ); } if ( ajdt ) { classpathContainers.add( ASPECTJ_RT_CONTAINER ); } } /** * Fill getBuildcommands() with values. *

* Subclasses should call super and then calculate their own additions and insert them via * getBuildcommands().addAll(). * * @param packaging the pom's packaging */ protected void fillDefaultBuilders( String packaging ) { buildcommands = new ArrayList(); if ( wtpVersionFloat == 0.7f ) { buildcommands.add( new BuildCommand( BUILDER_WST_COMPONENT_STRUCTURAL ) ); // WTP 0.7 builder } if ( isJavaProject ) { if ( ajdt ) { buildcommands.add( new BuildCommand( BUILDER_AJDT_CORE_JAVA ) ); } else { buildcommands.add( new BuildCommand( BUILDER_JDT_CORE_JAVA ) ); } } if ( wtpVersionFloat >= 1.5f ) { buildcommands.add( new BuildCommand( BUILDER_WST_FACET ) ); // WTP 1.5 builder } if ( wtpVersionFloat >= 0.7f ) { buildcommands.add( new BuildCommand( BUILDER_WST_VALIDATION ) ); // WTP 0.7/1.0 builder } if ( wtpVersionFloat == 0.7f ) { // WTP 0.7 builder buildcommands.add( new BuildCommand( BUILDER_WST_COMPONENT_STRUCTURAL_DEPENDENCY_RESOLVER ) ); } if ( pde ) { buildcommands.add( new BuildCommand( BUILDER_PDE_MANIFEST ) ); buildcommands.add( new BuildCommand( BUILDER_PDE_SCHEMA ) ); } } public final EclipseSourceDir[] buildDirectoryList( MavenProject project, File basedir, File buildOutputDirectory ) throws MojoExecutionException { File projectBaseDir = project.getFile().getParentFile(); String mainOutput = IdeUtils.toRelativeAndFixSeparator( projectBaseDir, buildOutputDirectory, false ); // If using the standard output location, don't mix the test output into it. String testOutput = null; boolean useStandardOutputDir = buildOutputDirectory.equals( new File( project.getBuild().getOutputDirectory() ) ); if ( useStandardOutputDir ) { getLog().debug( "testOutput toRelativeAndFixSeparator " + projectBaseDir + " , " + project.getBuild().getTestOutputDirectory() ); testOutput = IdeUtils.toRelativeAndFixSeparator( projectBaseDir, new File( project.getBuild().getTestOutputDirectory() ), false ); getLog().debug( "testOutput after toRelative : " + testOutput ); } Set mainDirectories = new LinkedHashSet(); extractSourceDirs( mainDirectories, project.getCompileSourceRoots(), basedir, projectBaseDir, false, null ); extractResourceDirs( mainDirectories, project.getBuild().getResources(), basedir, projectBaseDir, false, mainOutput ); Set testDirectories = new LinkedHashSet(); extractSourceDirs( testDirectories, project.getTestCompileSourceRoots(), basedir, projectBaseDir, true, testOutput ); extractResourceDirs( testDirectories, project.getBuild().getTestResources(), basedir, projectBaseDir, true, testOutput ); // avoid duplicated entries Set directories = new LinkedHashSet(); // NOTE: Since MNG-3118, test classes come before main classes boolean testBeforeMain = isMavenVersion( "[2.0.8,)" ); if ( testBeforeMain ) { directories.addAll( testDirectories ); directories.removeAll( mainDirectories ); directories.addAll( mainDirectories ); } else { directories.addAll( mainDirectories ); directories.addAll( testDirectories ); } if ( ajdt ) extractAspectDirs( directories, project, basedir, projectBaseDir, testOutput ); return (EclipseSourceDir[]) directories.toArray( new EclipseSourceDir[directories.size()] ); } private void extractSourceDirs( Set directories, List sourceRoots, File basedir, File projectBaseDir, boolean test, String output ) throws MojoExecutionException { for ( Iterator it = sourceRoots.iterator(); it.hasNext(); ) { File sourceRootFile = new File( (String) it.next() ); if ( sourceRootFile.isDirectory() ) { String sourceRoot = IdeUtils.toRelativeAndFixSeparator( projectBaseDir, sourceRootFile, !projectBaseDir.equals( basedir ) ); directories.add( new EclipseSourceDir( sourceRoot, output, false, test, null, null, false ) ); } } } final void extractResourceDirs( Set directories, List resources, File basedir, File workspaceProjectBaseDir, boolean test, final String output ) throws MojoExecutionException { for ( Iterator it = resources.iterator(); it.hasNext(); ) { Resource resource = (Resource) it.next(); getLog().debug( "Processing resource dir: " + resource.getDirectory() ); String includePattern = null; String excludePattern = null; if ( resource.getIncludes().size() != 0 ) { includePattern = StringUtils.join( resource.getIncludes().iterator(), "|" ); } if ( resource.getExcludes().size() != 0 ) { excludePattern = StringUtils.join( resource.getExcludes().iterator(), "|" ); } // TODO: figure out how to merge if the same dir is specified twice // with different in/exclude patterns. File resourceDirectory = new File( /* basedir, */resource.getDirectory() ); if ( !resourceDirectory.exists() || !resourceDirectory.isDirectory() ) { getLog().debug( "Resource dir: " + resourceDirectory + " either missing or not a directory." ); continue; } String resourceDir = IdeUtils.toRelativeAndFixSeparator( workspaceProjectBaseDir, resourceDirectory, !workspaceProjectBaseDir.equals( basedir ) ); String thisOutput = output; if ( thisOutput != null ) { // sometimes thisOutput is already an absolute path File outputFile = new File( thisOutput ); if ( !outputFile.isAbsolute() ) { outputFile = new File( workspaceProjectBaseDir, thisOutput ); } // create output dir if it doesn't exist outputFile.mkdirs(); if ( !StringUtils.isEmpty( resource.getTargetPath() ) ) { outputFile = new File( outputFile, resource.getTargetPath() ); // create output dir if it doesn't exist outputFile.mkdirs(); } getLog().debug( "Making relative and fixing separator: { " + workspaceProjectBaseDir + ", " + outputFile + ", false }." ); thisOutput = IdeUtils.toRelativeAndFixSeparator( workspaceProjectBaseDir, outputFile, false ); } getLog().debug( "Adding eclipse source dir: { " + resourceDir + ", " + thisOutput + ", true, " + test + ", " + includePattern + ", " + excludePattern + " }." ); directories.add( new EclipseSourceDir( resourceDir, thisOutput, true, test, includePattern, excludePattern, resource.isFiltering() ) ); } } private void extractAspectDirs( Set directories, MavenProject project, File basedir, File projectBaseDir, String testOutput ) throws MojoExecutionException { Xpp3Dom configuration = getAspectjConfiguration( project ); if ( configuration != null ) { String aspectDirectory = DEFAULT_ASPECT_DIRECTORY; Xpp3Dom aspectDirectoryElement = configuration.getChild( ASPECT_DIRECTORY ); if ( aspectDirectoryElement != null ) { aspectDirectory = aspectDirectoryElement.getValue(); } File aspectDirectoryFile = new File( basedir, aspectDirectory ); if ( aspectDirectoryFile.exists() && aspectDirectoryFile.isDirectory() ) { String sourceRoot = IdeUtils.toRelativeAndFixSeparator( projectBaseDir, aspectDirectoryFile, !projectBaseDir.equals( basedir ) ); directories.add( new EclipseSourceDir( sourceRoot, null, false, false, null, null, false ) ); } String testAspectDirectory = DEFAULT_TEST_ASPECT_DIRECTORY; Xpp3Dom testAspectDirectoryElement = configuration.getChild( TEST_ASPECT_DIRECTORY ); if ( testAspectDirectoryElement != null ) { testAspectDirectory = testAspectDirectoryElement.getValue(); } File testAspectDirectoryFile = new File( basedir, testAspectDirectory ); if ( testAspectDirectoryFile.exists() && testAspectDirectoryFile.isDirectory() ) { String sourceRoot = IdeUtils.toRelativeAndFixSeparator( projectBaseDir, testAspectDirectoryFile, !projectBaseDir.equals( basedir ) ); directories.add( new EclipseSourceDir( sourceRoot, testOutput, false, true, null, null, false ) ); } } } private boolean enableAjdt( MavenProject project ) { boolean enable = false; List buildPlugins = project.getBuildPlugins(); for ( Iterator it = buildPlugins.iterator(); it.hasNext(); ) { Plugin plugin = (Plugin) it.next(); if ( plugin.getGroupId().equals( ORG_CODEHAUS_MOJO ) && plugin.getArtifactId().equals( ASPECTJ_MAVEN_PLUGIN ) ) { enable = true; break; } } return enable; } private Xpp3Dom getAspectjConfiguration( MavenProject project ) { Xpp3Dom configuration = null; List buildPlugins = project.getBuildPlugins(); for ( Iterator it = buildPlugins.iterator(); it.hasNext(); ) { Plugin plugin = (Plugin) it.next(); if ( plugin.getGroupId().equals( ORG_CODEHAUS_MOJO ) && plugin.getArtifactId().equals( ASPECTJ_MAVEN_PLUGIN ) ) { configuration = (Xpp3Dom) plugin.getConfiguration(); break; } } return configuration; } private void buildAspectjDeps( IdeDependency[] deps ) throws MojoExecutionException { Xpp3Dom configuration = getAspectjConfiguration( executedProject ); if ( configuration != null ) { Xpp3Dom aspectLibrariesParent = configuration.getChild( ASPECT_LIBRARIES ); if ( aspectLibrariesParent != null ) { Xpp3Dom[] aspectLibraries = aspectLibrariesParent.getChildren( ASPECT_LIBRARY ); outerLoop: for ( int i = 0; i < aspectLibraries.length; i++ ) { String artifactId = aspectLibraries[i].getChild( POM_ELT_ARTIFACT_ID ).getValue(); String groupId = aspectLibraries[i].getChild( POM_ELT_GROUP_ID ).getValue(); for ( int j = 0; j < deps.length; j++ ) { if ( deps[j].getArtifactId().equals( artifactId ) && deps[j].getGroupId().equals( groupId ) ) { deps[j].setAjdtDependency( true ); continue outerLoop; } } throw new MojoExecutionException( "AspectLibrary is not a dependency of project" ); } } } } private void buildAjdtWeaveDeps( IdeDependency[] deps ) throws MojoExecutionException { Xpp3Dom configuration = getAspectjConfiguration( executedProject ); if ( configuration != null ) { Xpp3Dom weaveDependenciesParent = configuration.getChild( WEAVE_DEPENDENCIES ); if ( weaveDependenciesParent != null ) { Xpp3Dom[] weaveDependencies = weaveDependenciesParent.getChildren( WEAVE_DEPENDENCY ); outerLoop: for ( int i = 0; i < weaveDependencies.length; i++ ) { String artifactId = weaveDependencies[i].getChild( POM_ELT_ARTIFACT_ID ).getValue(); String groupId = weaveDependencies[i].getChild( POM_ELT_GROUP_ID ).getValue(); for ( int j = 0; j < deps.length; j++ ) { if ( deps[j].getArtifactId().equals( artifactId ) && deps[j].getGroupId().equals( groupId ) ) { deps[j].setAjdtWeaveDependency( true ); continue outerLoop; } } throw new MojoExecutionException( "WeaveDependency is not a dependency of project" ); } } } } /** * {@inheritDoc} */ public String getProjectNameForArifact( Artifact artifact ) { IdeDependency[] workspaceArtefacts = getWorkspaceArtefacts(); for ( int index = 0; workspaceArtefacts != null && index < workspaceArtefacts.length; index++ ) { IdeDependency workspaceArtefact = workspaceArtefacts[index]; if ( workspaceArtefact.isAddedToClasspath() && workspaceArtefact.getGroupId().equals( artifact.getGroupId() ) && workspaceArtefact.getArtifactId().equals( artifact.getArtifactId() ) ) { if ( workspaceArtefact.getVersion().equals( artifact.getVersion() ) ) { return workspaceArtefact.getEclipseProjectName(); } } } MavenProject reactorProject = getReactorProject( artifact ); if ( reactorProject != null ) { return IdeUtils.getProjectName( getProjectNameTemplateForMavenProject( reactorProject ), artifact ); } return IdeUtils.getProjectName( getProjectNameTemplate(), artifact ); } /** * @param mavenProject the project to get the projectNameTemplate configuration from * @return the projectNameTemplate configuration from the specified MavenProject */ private String getProjectNameTemplateForMavenProject( MavenProject mavenProject ) { String projectNameTemplate = null; boolean addVersionToProjectName = false; boolean addGroupIdToProjectName = false; Build build = mavenProject.getBuild(); if ( build != null ) { Plugin plugin = (Plugin) build.getPluginsAsMap().get( "org.apache.maven.plugins:maven-eclipse-plugin" ); if ( plugin != null ) { Xpp3Dom config = (Xpp3Dom) plugin.getConfiguration(); if ( config != null ) { Xpp3Dom projectNameTemplateNode = config.getChild( "projectNameTemplate" ); if ( projectNameTemplateNode != null ) { projectNameTemplate = projectNameTemplateNode.getValue(); } Xpp3Dom addVersionToProjectNameNode = config.getChild( "addVersionToProjectName" ); addVersionToProjectName = addVersionToProjectNameNode != null; Xpp3Dom addGroupIdToProjectNameNode = config.getChild( "addGroupIdToProjectName" ); addGroupIdToProjectName = addGroupIdToProjectNameNode != null; } } } return IdeUtils.calculateProjectNameTemplate(projectNameTemplate, addVersionToProjectName, addGroupIdToProjectName, getLog()); } /** * {@inheritDoc} */ protected final IdeDependency[] getWorkspaceArtefacts() { return getWorkspaceConfiguration().getWorkspaceArtefacts(); } public final WorkspaceConfiguration getWorkspaceConfiguration() { if ( workspaceConfiguration == null ) { workspaceConfiguration = new WorkspaceConfiguration(); locateWorkspace(); getLog().info( Messages.getString( "EclipsePlugin.workspace", workspace ) ); workspaceConfiguration.setWorkspaceDirectory( workspace ); new ReadWorkspaceLocations().init( getLog(), workspaceConfiguration, project, wtpdefaultserver ); } return workspaceConfiguration; } /** * If workspace is not defined, then attempt to locate it by checking up the directory hierarchy. */ private void locateWorkspace() { if ( workspace == null ) { File currentWorkingDirectory = new File( "." ).getAbsoluteFile(); while ( currentWorkingDirectory != null ) { File metadataDirectory = new File( currentWorkingDirectory, ".metadata" ); logger.debug( "Checking for eclipse workspace at " + currentWorkingDirectory ); if ( metadataDirectory.exists() && metadataDirectory.isDirectory() ) { logger.debug( " Found workspace at " + currentWorkingDirectory ); workspace = currentWorkingDirectory; return; } currentWorkingDirectory = currentWorkingDirectory.getParentFile(); } } } public final List getExcludes() { return excludes; } /** * Utility method that locates a project in the workspace for the given artifact. * * @param artifact the artifact a project should produce. * @return true if the artifact is produced by a reactor projectart. */ private boolean isAvailableAsAWorkspaceProject( Artifact artifact ) { IdeDependency[] workspaceArtefacts = getWorkspaceArtefacts(); for ( int index = 0; workspaceArtefacts != null && index < workspaceArtefacts.length; index++ ) { IdeDependency workspaceArtefact = workspaceArtefacts[index]; if ( workspaceArtefact.getGroupId().equals( artifact.getGroupId() ) && workspaceArtefact.getArtifactId().equals( artifact.getArtifactId() ) ) { if ( workspaceArtefact.getVersion().equals( artifact.getVersion() ) ) { workspaceArtefact.setAddedToClasspath( true ); getLog().debug( "Using workspace project: " + workspaceArtefact.getEclipseProjectName() ); return true; } else { getLog().info( "Artifact " + artifact.getId() + " already available as a workspace project, but with different version. Expected: " + artifact.getVersion() + ", found: " + workspaceArtefact.getVersion() ); } } } return false; } /** * Checks if jar has to be resolved for the given artifact * * @param art the artifact to check * @return true if resolution should happen */ protected final boolean hasToResolveJar( Artifact art ) { return !( getUseProjectReferences() && isAvailableAsAReactorProject( art ) ) || ( limitProjectReferencesToWorkspace && !( getUseProjectReferences() && isAvailableAsAWorkspaceProject( art ) ) ); } /** * Checks if a projects reference has to be used for the given artifact * * @param art the artifact to check * @return true if a project reference has to be used. */ protected final boolean useProjectReference( Artifact art ) { boolean isReactorProject = getUseProjectReferences() && isAvailableAsAReactorProject( art ); boolean isWorkspaceProject = getUseProjectReferences() && isAvailableAsAWorkspaceProject( art ); return ( isReactorProject && !limitProjectReferencesToWorkspace ) || // default ( limitProjectReferencesToWorkspace && isWorkspaceProject ) || // limitProjectReferencesToWorkspace ( !isReactorProject && isWorkspaceProject ); // default + workspace projects } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy