View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.plugin.eclipse.writers.rad;
20  
21  import java.io.File;
22  import java.io.IOException;
23  
24  import org.apache.maven.artifact.Artifact;
25  import org.apache.maven.plugin.MojoExecutionException;
26  import org.apache.maven.plugin.eclipse.Constants;
27  import org.apache.maven.plugin.eclipse.Messages;
28  import org.apache.maven.plugin.eclipse.writers.AbstractEclipseWriter;
29  import org.apache.maven.plugin.ide.IdeDependency;
30  import org.apache.maven.plugin.ide.IdeUtils;
31  import org.apache.maven.plugin.ide.JeeUtils;
32  import org.apache.maven.plugin.logging.Log;
33  import org.codehaus.plexus.util.FileUtils;
34  
35  /**
36   * Copy all dependent jar in the directorys where RAD6 needs then to use the runtime enviorment in RAD6. so all
37   * dependent jars in the EAR rootdirectory and all dependend jars in the WAR WEB-INF/lib directory
38   * 
39   * @author <a href="mailto:nir@cfc.at">Richard van Nieuwenhoven</a>
40   */
41  public class RadLibCopier
42      extends AbstractEclipseWriter
43  {
44  
45      /**
46       * copy the jars in the apropreate directorys.
47       * 
48       * @throws MojoExecutionException when writing the config files was not possible
49       */
50      public void write()
51          throws MojoExecutionException
52      {
53          IdeDependency[] deps = config.getDeps();
54  
55          String packaging = config.getPackaging();
56          if ( Constants.PROJECT_PACKAGING_EAR.equals( packaging ) )
57          {
58              handleEarLibs( deps );
59          }
60          else if ( Constants.PROJECT_PACKAGING_WAR.equals( packaging ) )
61          {
62              handleWarLibs( deps );
63          }
64      }
65  
66      /**
67       * Copies the Artifact after building the destination file name if overridden. This method also checks if the
68       * classifier is set and adds it to the destination file name if needed.
69       * 
70       * @param deps representing the dependencies to be copied.
71       * @param destDir where should the atifact go.
72       * @throws MojoExecutionException with a message if an error occurs.
73       * @see DependencyUtil#copyFile(File, File, Log)
74       * @see DependencyUtil#getFormattedFileName(Artifact, boolean)
75       */
76      private void copyArtifact( IdeDependency[] deps, File destDir )
77          throws MojoExecutionException
78      {
79          String[] oldFiles =
80              FileUtils.getFilesFromExtension( destDir.getAbsolutePath(),
81                                               new String[] { Constants.PROJECT_PACKAGING_JAR } );
82          for (String oldFile : oldFiles) {
83              if (!new File(oldFile).delete()) {
84                  log.error(Messages.getString("Rad6LibCopier.cantdeletefile", new Object[]{oldFile}));
85              }
86          }
87          for (IdeDependency dep : deps) {
88              if (!dep.isTestDependency() && !dep.isProvided() && !dep.isReferencedProject()
89                      && !dep.isSystemScoped()) {
90                  copyFile(dep.getFile(), new File(destDir, dep.getFile().getName()), log);
91              }
92          }
93      }
94  
95      /**
96       * Does the actual copy of the file and logging.
97       * 
98       * @param artifact represents the file to copy.
99       * @param destFile file name of destination file.
100      * @param log to use for output.
101      * @throws MojoExecutionException with a message if an error occurs.
102      */
103     private void copyFile( File artifact, File destFile, Log log )
104         throws MojoExecutionException
105     {
106         try
107         {
108             log.info( "Copying " + artifact.getAbsolutePath() + " to " + destFile );
109             FileUtils.copyFile( artifact, destFile );
110         }
111         catch ( IOException e )
112         {
113             throw new MojoExecutionException( "Error copying artifact from " + artifact + " to " + destFile, e );
114         }
115     }
116 
117     /**
118      * EARs need the jars in the root directory.
119      * 
120      * @param deps dependencys to include
121      * @throws MojoExecutionException if the copying fails
122      */
123     private void handleEarLibs( IdeDependency[] deps )
124         throws MojoExecutionException
125     {
126         File targetDir = config.getProject().getBasedir();
127         copyArtifact( deps, targetDir );
128     }
129 
130     /**
131      * WARs need the jars in the WEB-INF/lib directory.
132      * 
133      * @param deps dependencys to include
134      * @throws MojoExecutionException if the copying fails
135      */
136     private void handleWarLibs( IdeDependency[] deps )
137         throws MojoExecutionException
138     {
139         File basedir = config.getProject().getBasedir();
140 
141         // Generating web content settings based on war plug-in warSourceDirectory property
142         File warSourceDirectory =
143             new File( IdeUtils.getPluginSetting( config.getProject(), JeeUtils.ARTIFACT_MAVEN_WAR_PLUGIN,
144                                                  "warSourceDirectory", //$NON-NLS-1$
145                                                  "src/main/webapp" ) ); //$NON-NLS-1$
146         String webContentDir =
147             IdeUtils.toRelativeAndFixSeparator( config.getEclipseProjectDirectory(), warSourceDirectory, false );
148 
149         String srcMainWebappWebInfLibDirName =
150             basedir.getAbsolutePath() + File.separatorChar + webContentDir + File.separatorChar + "WEB-INF"
151                 + File.separatorChar + "lib";
152 
153         File srcMainWebappWebInfLibDir = new File( srcMainWebappWebInfLibDirName );
154         srcMainWebappWebInfLibDir.mkdirs();
155 
156         copyArtifact( deps, srcMainWebappWebInfLibDir );
157     }
158 
159 }