1   package org.apache.maven.plugins.site.descriptor;
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  import org.apache.commons.lang3.time.DateFormatUtils;
23  import org.apache.maven.doxia.site.decoration.DecorationModel;
24  import org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Writer;
25  import org.apache.maven.plugin.MojoExecutionException;
26  import org.apache.maven.plugin.MojoFailureException;
27  import org.apache.maven.plugins.annotations.Mojo;
28  import org.apache.maven.plugins.annotations.Parameter;
29  import org.codehaus.plexus.util.StringUtils;
30  import org.codehaus.plexus.util.WriterFactory;
31  import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter;
32  import org.codehaus.plexus.util.xml.XMLWriter;
33  import org.codehaus.plexus.util.xml.XmlWriterUtil;
34  
35  import java.io.File;
36  import java.io.IOException;
37  import java.io.StringWriter;
38  import java.io.Writer;
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  @Mojo( name = "effective-site", requiresReports = true )
49  public class EffectiveSiteMojo
50      extends AbstractSiteDescriptorMojo
51  {
52      
53  
54  
55  
56  
57  
58      @Parameter( property = "output" )
59      protected File output;
60  
61      
62  
63  
64      public void execute()
65          throws MojoExecutionException, MojoFailureException
66      {
67          DecorationModel decorationModel = prepareDecorationModel( getLocales().get( 0 ) );
68  
69          StringWriter w = new StringWriter();
70          XMLWriter writer =
71              new PrettyPrintXMLWriter( w, StringUtils.repeat( " ", XmlWriterUtil.DEFAULT_INDENTATION_SIZE ),
72                                        decorationModel.getModelEncoding(), null );
73  
74          writeHeader( writer );
75  
76          writeEffectiveSite( decorationModel, writer );
77  
78          String effectiveSite = w.toString();
79  
80          if ( output != null )
81          {
82              try
83              {
84                  writeXmlFile( output, effectiveSite );
85              }
86              catch ( IOException e )
87              {
88                  throw new MojoExecutionException( "Cannot write effective site descriptor to output: " + output, e );
89              }
90  
91              if ( getLog().isInfoEnabled() )
92              {
93                  getLog().info( "Effective site descriptor written to: " + output );
94              }
95          }
96          else
97          {
98              StringBuilder message = new StringBuilder();
99  
100             message.append( "\nEffective site descriptor, after inheritance and interpolation:\n\n" );
101             message.append( effectiveSite );
102             message.append( "\n" );
103 
104             if ( getLog().isInfoEnabled() )
105             {
106                 getLog().info( message.toString() );
107             }
108         }
109     }
110 
111     
112 
113 
114 
115 
116     protected static void writeHeader( XMLWriter writer )
117     {
118         XmlWriterUtil.writeCommentLineBreak( writer );
119         XmlWriterUtil.writeComment( writer, " " );
120         
121         String formattedDateTime = DateFormatUtils.ISO_DATETIME_FORMAT.format( System.currentTimeMillis() );
122         XmlWriterUtil.writeComment( writer, "Generated by Maven Site Plugin on " + formattedDateTime );
123         XmlWriterUtil.writeComment( writer, "See: http://maven.apache.org/plugins/maven-site-plugin/" );
124         XmlWriterUtil.writeComment( writer, " " );
125         XmlWriterUtil.writeCommentLineBreak( writer );
126 
127         XmlWriterUtil.writeLineBreak( writer );
128     }
129 
130     
131 
132 
133 
134 
135 
136     protected static void writeComment( XMLWriter writer, String comment )
137     {
138         XmlWriterUtil.writeCommentLineBreak( writer );
139         XmlWriterUtil.writeComment( writer, " " );
140         XmlWriterUtil.writeComment( writer, comment );
141         XmlWriterUtil.writeComment( writer, " " );
142         XmlWriterUtil.writeCommentLineBreak( writer );
143 
144         XmlWriterUtil.writeLineBreak( writer );
145     }
146 
147     private void writeEffectiveSite( DecorationModel decorationModel, XMLWriter writer )
148         throws MojoExecutionException
149     {
150         String effectiveSite;
151 
152         StringWriter sWriter = new StringWriter();
153         DecorationXpp3Writer siteWriter = new DecorationXpp3Writer();
154         try
155         {
156             siteWriter.write( sWriter, decorationModel );
157         }
158         catch ( IOException e )
159         {
160             throw new MojoExecutionException( "Cannot serialize site descriptor to XML.", e );
161         }
162 
163         effectiveSite = sWriter.toString();
164         effectiveSite = effectiveSite.substring( effectiveSite.indexOf( "<project " ) ); 
165 
166         writeComment( writer, "Effective site descriptor for project \'" + project.getId() + "\'" );
167 
168         writer.writeMarkup( effectiveSite );
169     }
170 
171     protected static void writeXmlFile( File output, String content )
172         throws IOException
173     {
174         try ( Writer out = WriterFactory.newXmlWriter( output ) )
175         {
176             output.getParentFile().mkdirs();
177 
178             out.write( content );
179         }
180     }
181 }