View Javadoc

1   package org.apache.maven.plugin.eclipse.writers.myeclipse;
2   
3   import java.io.File;
4   import java.io.FileFilter;
5   import java.io.FileWriter;
6   import java.io.IOException;
7   import java.util.ArrayList;
8   import java.util.Collection;
9   import java.util.Collections;
10  import java.util.Iterator;
11  import java.util.Map;
12  
13  import org.apache.maven.plugin.MojoExecutionException;
14  import org.apache.maven.plugin.eclipse.Messages;
15  import org.apache.maven.plugin.eclipse.writers.AbstractEclipseWriter;
16  import org.apache.maven.plugin.ide.IdeUtils;
17  import org.codehaus.plexus.util.FileUtils;
18  import org.codehaus.plexus.util.IOUtil;
19  import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter;
20  import org.codehaus.plexus.util.xml.XMLWriter;
21  
22  /**
23   * MyEclipse .springBeans configuration file writer
24   * 
25   * @author Olivier Jacob
26   */
27  public class MyEclipseSpringBeansWriter
28      extends AbstractEclipseWriter
29  {
30      private static final String MYECLIPSE_SPRING_CONFIGURATION_FILENAME = ".springBeans";
31  
32      private static final String MYECLIPSE_SPRING_BEANS_PROJECT_DESCRIPTION = "beansProjectDescription";
33  
34      private static final String MYECLIPSE_SPRING_CONFIG_EXTENSIONS = "configExtensions";
35  
36      private static final String MYECLIPSE_SPRING_CONFIG_EXTENSION = "configExtension";
37  
38      private static final String MYECLIPSE_SPRING_CONFIGS = "configs";
39  
40      private static final String MYECLIPSE_SPRING_CONFIG = "config";
41  
42      private static final String MYECLIPSE_SPRING_CONFIGSETS = "configSets";
43  
44      private static final String MYECLIPSE_SPRING_VERSION = "springVersion";
45  
46      /**
47       * Spring configuration filenames (injected by the plugin)
48       */
49      private Map springConfig;
50  
51      /**
52       * Allow injection of Spring configuration filenames through constructor
53       * 
54       * @param springConfig a map holding Spring configuration properties
55       */
56      public MyEclipseSpringBeansWriter( Map springConfig )
57      {
58          this.springConfig = springConfig;
59      }
60  
61      /**
62       * Write MyEclipse .springBeans configuration file
63       * 
64       * @throws MojoExecutionException
65       */
66      public void write()
67          throws MojoExecutionException
68      {
69          FileWriter springFileWriter;
70          try
71          {
72              springFileWriter =
73                  new FileWriter( new File( config.getEclipseProjectDirectory(), MYECLIPSE_SPRING_CONFIGURATION_FILENAME ) );
74          }
75          catch ( IOException ex )
76          {
77              throw new MojoExecutionException( Messages.getString( "EclipsePlugin.erroropeningfile" ), ex ); //$NON-NLS-1$
78          }
79  
80          XMLWriter writer = new PrettyPrintXMLWriter( springFileWriter, "UTF-8", null );
81  
82          writer.startElement( MYECLIPSE_SPRING_BEANS_PROJECT_DESCRIPTION );
83          // Configuration extension
84          writer.startElement( MYECLIPSE_SPRING_CONFIG_EXTENSIONS );
85          writer.startElement( MYECLIPSE_SPRING_CONFIG_EXTENSION );
86          writer.writeText( "xml" );
87          writer.endElement();
88          writer.endElement();
89  
90          // Configuration files
91          writer.startElement( MYECLIPSE_SPRING_CONFIGS );
92  
93          // maven's cwd stays at the top of hierarchical projects so we
94          // do this with full path so it works as we descend through various modules (projects)
95          File basedir = config.getEclipseProjectDirectory();
96          Iterator onConfigFiles =
97              getConfigurationFilesList( new File( basedir, (String) springConfig.get( "basedir" ) ),
98                                         (String) springConfig.get( "file-pattern" ) ).iterator();
99  
100         while ( onConfigFiles.hasNext() )
101         {
102             String onConfigFileName = (String) onConfigFiles.next();
103             File onConfigFile = new File( onConfigFileName );
104             String relativeFileName = IdeUtils.toRelativeAndFixSeparator( basedir, onConfigFile, false );
105 
106             writer.startElement( MYECLIPSE_SPRING_CONFIG );
107             writer.writeText( relativeFileName );
108             writer.endElement();
109         }
110         writer.endElement();
111 
112         // Configuration sets
113         writer.startElement( MYECLIPSE_SPRING_CONFIGSETS );
114         writer.endElement();
115 
116         // Spring version
117         writer.startElement( MYECLIPSE_SPRING_VERSION );
118         writer.writeText( (String) springConfig.get( "version" ) );
119         writer.endElement();
120 
121         writer.endElement();
122 
123         IOUtil.close( springFileWriter );
124     }
125 
126     /**
127      * Retrieve the list of Spring configuration files recursively from the <code>basedir</code> directory, considering
128      * only filenames matching the <code>pattern</code> given
129      * 
130      * @param basedir the path to the base directory to search in
131      * @param pattern file include pattern
132      * @return the list of filenames matching the given pattern
133      */
134     private Collection getConfigurationFilesList( File basedir, String pattern )
135     {
136         ArrayList configFiles = new ArrayList();
137 
138         try
139         {
140             if ( basedir.exists() )
141             {
142                 log.debug( "Scanning " + basedir + " for spring definition files" );
143                 File[] subdirs = basedir.listFiles( new FileFilter()
144                 {
145                     public boolean accept( File pathname )
146                     {
147                         return pathname.isDirectory();
148                     }
149                 } );
150 
151                 if ( subdirs != null )
152                 {
153                     for ( int i = 0; i < subdirs.length; i++ )
154                     {
155                         configFiles.addAll( getConfigurationFilesList( subdirs[i], pattern ) );
156                     }
157                 }
158 
159                 configFiles.addAll( FileUtils.getFileNames( basedir, pattern, null, true ) );
160             }
161             else
162             {
163                 // This isn't fatal because sometimes we run this in a nested set of
164                 // projects where some of the projects may not have spring configuration
165                 log.warn( Messages.getString( "MyEclipseSpringBeansWriter.baseDirDoesNotExist",
166                                               new Object[] { basedir } ) );
167             }
168         }
169         catch ( IOException ioe )
170         {
171             log.error( "Error while retrieving Spring configuration files. Returning list in current state" );
172         }
173         // Sort them to have something constant
174         Collections.sort( configFiles );
175         return configFiles;
176     }
177 }