1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.plugin.eclipse.writers.rad;
20  
21  import java.io.File;
22  import java.util.Iterator;
23  
24  import org.apache.maven.model.Resource;
25  import org.apache.maven.plugin.MojoExecutionException;
26  import org.apache.maven.plugin.eclipse.Constants;
27  import org.apache.maven.plugin.eclipse.EclipseSourceDir;
28  import org.apache.maven.plugin.eclipse.writers.AbstractEclipseManifestWriter;
29  import org.apache.maven.plugin.ide.IdeUtils;
30  import org.apache.maven.plugin.ide.JeeUtils;
31  import org.apache.maven.project.MavenProject;
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  public class RadManifestWriter
42      extends AbstractEclipseManifestWriter
43  {
44  
45      private static final String DEFAULT_WEBAPP_RESOURCE_DIR =
46          "src" + File.separatorChar + "main" + File.separatorChar + "webapp";
47  
48      
49  
50  
51  
52  
53  
54      protected String getMetaInfBaseDirectory( MavenProject project )
55          throws MojoExecutionException
56      {
57          String metaInfBaseDirectory = null;
58  
59          if ( config.getProject().getPackaging().equals( Constants.PROJECT_PACKAGING_WAR ) )
60          {
61              
62              File warSourceDirectory =
63                  new File( IdeUtils.getPluginSetting( config.getProject(), JeeUtils.ARTIFACT_MAVEN_WAR_PLUGIN,
64                                                       "warSourceDirectory", 
65                                                       DEFAULT_WEBAPP_RESOURCE_DIR ) );
66  
67              String webContentDir =
68                  IdeUtils.toRelativeAndFixSeparator( config.getEclipseProjectDirectory(), warSourceDirectory, false );
69  
70              metaInfBaseDirectory =
71                  config.getProject().getBasedir().getAbsolutePath() + File.separatorChar + webContentDir;
72  
73              log.debug( "Attempting to use: " + metaInfBaseDirectory + " for location of META-INF in war project." );
74  
75              File metaInfDirectoryFile = new File( metaInfBaseDirectory + File.separatorChar + META_INF_DIRECTORY );
76  
77              if ( metaInfDirectoryFile.exists() && !metaInfDirectoryFile.isDirectory() )
78              {
79                  metaInfBaseDirectory = null;
80              }
81          }
82  
83          if ( metaInfBaseDirectory == null )
84          {
85              for ( Iterator iterator = project.getResources().iterator(); iterator.hasNext(); )
86              {
87                  metaInfBaseDirectory = ( (Resource) iterator.next() ).getDirectory();
88  
89                  File metaInfDirectoryFile = new File( metaInfBaseDirectory + File.separatorChar + META_INF_DIRECTORY );
90  
91                  log.debug( "Checking for existence of META-INF directory: " + metaInfDirectoryFile );
92  
93                  if ( metaInfDirectoryFile.exists() && !metaInfDirectoryFile.isDirectory() )
94                  {
95                      metaInfBaseDirectory = null;
96                  }
97              }
98          }
99  
100         return metaInfBaseDirectory;
101     }
102 
103     
104 
105 
106     public void write()
107         throws MojoExecutionException
108     {
109         super.write();
110         verifyManifestBasedirInSourceDirs( getMetaInfBaseDirectory( config.getProject() ) );
111     }
112 
113 
114 
115     
116     private void verifyManifestBasedirInSourceDirs( String metaInfBaseDirectory )
117     {
118         EclipseSourceDir[] sourceDirs = config.getSourceDirs();
119 
120         if ( sourceDirs != null )
121         {
122             boolean foundMetaInfBaseDirectory = false;
123 
124             for ( int i = 0; i < sourceDirs.length; i++ )
125             {
126                 EclipseSourceDir esd = sourceDirs[i];
127 
128                 if ( esd.getPath().equals( metaInfBaseDirectory ) )
129                 {
130                     foundMetaInfBaseDirectory = true;
131                     break;
132                 }
133             }
134 
135             if ( !foundMetaInfBaseDirectory )
136             {
137                 EclipseSourceDir dir =
138                     new EclipseSourceDir( metaInfBaseDirectory, null, true, false, null, null, false );
139 
140                 EclipseSourceDir[] newSourceDirs = new EclipseSourceDir[sourceDirs.length + 1];
141                 newSourceDirs[sourceDirs.length] = dir;
142 
143                 System.arraycopy( sourceDirs, 0, newSourceDirs, 0, sourceDirs.length );
144 
145                 config.setSourceDirs( newSourceDirs );
146             }
147         }
148     }
149 }