o Fix html generation

o Categorize reports in "Project Info" and "Project Reports"
o Generate overview page for "Project Info" and "Project Reports" pages

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@169372 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Emmanuel Venisse 2005-05-09 22:47:34 +00:00
parent 17c195e01d
commit f3fa32eebe
10 changed files with 358 additions and 34 deletions

View File

@ -28,6 +28,7 @@ import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.StringInputStream; import org.codehaus.plexus.util.StringInputStream;
import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.StringUtils;
import java.util.ArrayList;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
@ -110,17 +111,23 @@ public class DoxiaMojo
*/ */
private List remoteRepositories; private List remoteRepositories;
private List projectInfos = new ArrayList();
private List projectReports = new ArrayList();
public void execute() public void execute()
throws MojoExecutionException throws MojoExecutionException
{ {
try try
{ {
categorizeReports();
MavenReportConfiguration config = new MavenReportConfiguration(); MavenReportConfiguration config = new MavenReportConfiguration();
config.setModel( project.getModel() ); config.setModel( project.getModel() );
config.setOutputDirectory( new File( generatedSiteDirectory ) ); config.setOutputDirectory( new File( generatedSiteDirectory ) );
//Generate reports
if ( reports != null ) if ( reports != null )
{ {
for ( Iterator i = reports.keySet().iterator(); i.hasNext(); ) for ( Iterator i = reports.keySet().iterator(); i.hasNext(); )
@ -141,8 +148,35 @@ public class DoxiaMojo
} }
} }
siteRenderer.render( siteDirectory, generatedSiteDirectory, outputDirectory, flavour, //Generate overview pages
getSiteDescriptor() ); if ( projectInfos.size() > 0 )
{
try
{
generateProjectInfoPage( getSiteDescriptor() );
}
catch ( Exception e )
{
e.printStackTrace();
throw new MojoExecutionException( "An error is occurred in project info page generation.", e );
}
}
if ( projectReports.size() > 0 )
{
try
{
generateProjectReportsPage( getSiteDescriptor() );
}
catch ( Exception e )
{
e.printStackTrace();
throw new MojoExecutionException( "An error is occurred in project reports page generation.", e );
}
}
//Generate static site
siteRenderer.render( siteDirectory, generatedSiteDirectory, outputDirectory, flavour, getSiteDescriptor() );
} }
catch ( Exception e ) catch ( Exception e )
{ {
@ -151,21 +185,67 @@ public class DoxiaMojo
} }
} }
private void categorizeReports()
throws MojoExecutionException
{
for ( Iterator i = reports.values().iterator(); i.hasNext(); )
{
MavenReport report = (MavenReport) i.next();
if ( MavenReport.CATEGORY_PROJECT_INFORMATION.equals( report.getCategoryName() ) )
{
projectInfos.add( report );
}
else if ( MavenReport.CATEGORY_PROJECT_REPORTS.equals( report.getCategoryName() ) )
{
projectReports.add( report );
}
else
{
throw new MojoExecutionException( "'" + report.getCategoryName() + "' category define for " +
report.getName() + " mojo isn't valid." );
}
}
}
private String getReportsMenu() private String getReportsMenu()
throws MojoExecutionException
{ {
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
buffer.append( "<menu name=\"Project Documentation\">\n" ); buffer.append( "<menu name=\"Project Documentation\">\n" );
buffer.append( " <item name=\"About " + project.getName() + "\" href=\"/index.html\"/>\n"); buffer.append( " <item name=\"About " + project.getName() + "\" href=\"/index.html\"/>\n");
buffer.append( " <item name=\"Project reports\" href=\"/maven-reports.html\" collapse=\"true\">\n" );
for ( Iterator i = reports.keySet().iterator(); i.hasNext(); ) if ( projectInfos.size() > 0 )
{ {
String reportKey = (String) i.next(); buffer.append( " <item name=\"" + MavenReport.CATEGORY_PROJECT_INFORMATION +
buffer.append( " <item name=\"" + reportKey + "\" href=\"/" + reportKey + ".html\"/>\n" ); "\" href=\"/project-info.html\" collapse=\"true\">\n" );
for ( Iterator i = projectInfos.iterator(); i.hasNext(); )
{
MavenReport report = (MavenReport) i.next();
buffer.append( " <item name=\"" + report.getName() + "\" href=\"/" +
report.getOutputName() + ".html\"/>\n" );
}
buffer.append( " </item>\n" );
}
if ( projectReports.size() > 0 )
{
buffer.append( " <item name=\"" + MavenReport.CATEGORY_PROJECT_REPORTS +
"\" href=\"/maven-reports.html\" collapse=\"true\">\n" );
for ( Iterator i = projectReports.iterator(); i.hasNext(); )
{
MavenReport report = (MavenReport) i.next();
buffer.append( " <item name=\"" + report.getName() + "\" href=\"/" +
report.getOutputName() + ".html\"/>\n" );
}
buffer.append( " </item>\n" );
} }
buffer.append( " </item>\n" );
buffer.append( "</menu>\n" ); buffer.append( "</menu>\n" );
return buffer.toString(); return buffer.toString();
} }
@ -198,7 +278,150 @@ public class DoxiaMojo
} }
siteDescriptorContent = StringUtils.interpolate( siteDescriptorContent, props ); siteDescriptorContent = StringUtils.interpolate( siteDescriptorContent, props );
return new StringInputStream( siteDescriptorContent ); return new StringInputStream( siteDescriptorContent );
} }
private void generateProjectInfoPage( InputStream siteDescriptor )
throws Exception
{
XhtmlSink sink = siteRenderer.createSink( new File( siteDirectory ), siteDirectory,
"project-info.html",
outputDirectory, siteDescriptor, flavour );
String title = "General Project Information";
sink.head();
sink.title();
sink.text( title );
sink.title_();
sink.head_();
sink.body();
sink.section1();
sink.sectionTitle1();
sink.text( title );
sink.sectionTitle1_();
sink.paragraph();
sink.text( "This document provides an overview of the various documents and links that are part " +
"of this project's general information. All of this content is automatically generated by ");
sink.link( "http://maven.apache.org" );
sink.text( "Maven" );
sink.link_();
sink.text( " on behalf of the project." );
sink.paragraph_();
sink.section2();
sink.sectionTitle2();
sink.text( "Overview" );
sink.sectionTitle2_();
sink.table();
sink.tableRow();
sink.tableHeaderCell();
sink.text( "Document" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( "Description" );
sink.tableHeaderCell_();
sink.tableRow_();
for ( Iterator i = projectInfos.iterator(); i.hasNext(); )
{
MavenReport report = (MavenReport) i.next();
sink.tableRow();
sink.tableCell();
sink.link( report.getOutputName() + ".html" );
sink.text( report.getName() );
sink.link_();
sink.tableCell_();
sink.tableCell();
sink.text( report.getDescription() );
sink.tableCell_();
sink.tableRow_();
}
sink.table_();
sink.section2_();
sink.section1_();
sink.body_();
}
private void generateProjectReportsPage( InputStream siteDescriptor)
throws Exception
{
XhtmlSink sink = siteRenderer.createSink( new File( siteDirectory ), siteDirectory,
"maven-reports.html",
outputDirectory, siteDescriptor, flavour );
String title = "Maven Generated Reports";
sink.head();
sink.title();
sink.text( title );
sink.title_();
sink.head_();
sink.body();
sink.section1();
sink.sectionTitle1();
sink.text( title );
sink.sectionTitle1_();
sink.paragraph();
sink.text( "This document provides an overview of the various reports that are automatically generated by " );
sink.link( "http://maven.apache.org" );
sink.text( "Maven" );
sink.link_();
sink.text( ". Each report is briefly described below." );
sink.paragraph_();
sink.section2();
sink.sectionTitle2();
sink.text( "Overview" );
sink.sectionTitle2_();
sink.table();
sink.tableRow();
sink.tableHeaderCell();
sink.text( "Document" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( "Description" );
sink.tableHeaderCell_();
sink.tableRow_();
for ( Iterator i = projectReports.iterator(); i.hasNext(); )
{
MavenReport report = (MavenReport) i.next();
sink.tableRow();
sink.tableCell();
sink.link( report.getOutputName() + ".html" );
sink.text( report.getName() );
sink.link_();
sink.tableCell_();
sink.tableCell();
sink.text( report.getDescription() );
sink.tableCell_();
sink.tableRow_();
}
sink.table_();
sink.section2_();
sink.section1_();
sink.body_();
}
} }

View File

@ -74,4 +74,9 @@ public abstract class AbstractMavenReport
{ {
return sink; return sink;
} }
public String getCategoryName()
{
return CATEGORY_PROJECT_REPORTS;
}
} }

View File

@ -73,18 +73,23 @@ public abstract class AbstractMavenReportRenderer
{ {
case 1: case 1:
sink.section1(); sink.section1();
sink.sectionTitle1();
break; break;
case 2: case 2:
sink.section2(); sink.section2();
sink.sectionTitle2();
break; break;
case 3: case 3:
sink.section3(); sink.section3();
sink.sectionTitle3();
break; break;
case 4: case 4:
sink.section4(); sink.section4();
sink.sectionTitle4();
break; break;
case 5: case 5:
sink.section5(); sink.section5();
sink.sectionTitle5();
break; break;
default: default:
@ -92,11 +97,30 @@ public abstract class AbstractMavenReportRenderer
break; break;
} }
sink.sectionTitle();
sink.text( name ); sink.text( name );
sink.sectionTitle_(); switch ( section )
{
case 1:
sink.sectionTitle1_();
break;
case 2:
sink.sectionTitle2_();
break;
case 3:
sink.sectionTitle3_();
break;
case 4:
sink.sectionTitle4_();
break;
case 5:
sink.sectionTitle5_();
break;
default:
// TODO: warning - just don't start a section
break;
}
} }
protected void endSection() protected void endSection()

View File

@ -32,6 +32,10 @@ public interface MavenReport
{ {
String ROLE = MavenReport.class.getName(); String ROLE = MavenReport.class.getName();
String CATEGORY_PROJECT_INFORMATION = "Project Info";
String CATEGORY_PROJECT_REPORTS = "Project Reports";
MavenReportConfiguration getConfiguration(); MavenReportConfiguration getConfiguration();
void setConfiguration( MavenReportConfiguration config ); void setConfiguration( MavenReportConfiguration config );
@ -41,6 +45,12 @@ public interface MavenReport
String getOutputName(); String getOutputName();
String getName();
String getCategoryName();
String getDescription();
Sink getSink() Sink getSink()
throws IOException; throws IOException;
} }

View File

@ -76,6 +76,16 @@ public class CheckstyleReport
private boolean failedOnError = false; private boolean failedOnError = false;
public String getName()
{
return "Checkstyle";
}
public String getDescription()
{
return "Report on coding style conventions.";
}
public void execute() public void execute()
throws MavenReportException throws MavenReportException
{ {
@ -91,6 +101,8 @@ public class CheckstyleReport
File resultFile = new File( getConfiguration().getOutputDirectory(), resultFileName ); File resultFile = new File( getConfiguration().getOutputDirectory(), resultFileName );
try try
{ {
File parentFile = resultFile.getParentFile();
parentFile.mkdirs();
out = new FileOutputStream( resultFile ); out = new FileOutputStream( resultFile );
} }
catch( IOException e ) catch( IOException e )

View File

@ -59,9 +59,9 @@ public class CheckstyleReportListener
sink.body(); sink.body();
sink.section1(); sink.section1();
sink.sectionTitle(); sink.sectionTitle1();
sink.text( TITLE ); sink.text( TITLE );
sink.sectionTitle_(); sink.sectionTitle1_();
sink.paragraph(); sink.paragraph();
sink.text( "The following document contains the results of " ); sink.text( "The following document contains the results of " );
@ -73,9 +73,9 @@ public class CheckstyleReportListener
// TODO overall summary // TODO overall summary
sink.section1_(); sink.section1_();
sink.sectionTitle(); sink.sectionTitle1();
sink.text( "Files" ); sink.text( "Files" );
sink.sectionTitle_(); sink.sectionTitle1_();
// TODO files summary // TODO files summary
} }
@ -109,9 +109,9 @@ public class CheckstyleReportListener
if ( !fileInitialized ) if ( !fileInitialized )
{ {
sink.section2(); sink.section2();
sink.sectionTitle(); sink.sectionTitle2();
sink.text( currentFilename ); sink.text( currentFilename );
sink.sectionTitle_(); sink.sectionTitle2_();
sink.table(); sink.table();
sink.tableRow(); sink.tableRow();

View File

@ -63,6 +63,16 @@ public class PmdReport
// Mac // Mac
"**/.DS_Store"}; "**/.DS_Store"};
public String getName()
{
return "PMD report";
}
public String getDescription()
{
return "Verification of coding rules.";
}
public void execute() public void execute()
throws MavenReportException throws MavenReportException
{ {

View File

@ -69,9 +69,9 @@ public class PmdReportListener
sink.body(); sink.body();
sink.section1(); sink.section1();
sink.sectionTitle(); sink.sectionTitle1();
sink.text( TITLE ); sink.text( TITLE );
sink.sectionTitle_(); sink.sectionTitle1_();
sink.paragraph(); sink.paragraph();
sink.text( "The following document contains the results of " ); sink.text( "The following document contains the results of " );
@ -83,9 +83,9 @@ public class PmdReportListener
// TODO overall summary // TODO overall summary
sink.section1_(); sink.section1_();
sink.sectionTitle(); sink.sectionTitle1();
sink.text( "Files" ); sink.text( "Files" );
sink.sectionTitle_(); sink.sectionTitle1_();
// TODO files summary // TODO files summary
} }
@ -93,9 +93,9 @@ public class PmdReportListener
public void beginFile( File file ) public void beginFile( File file )
{ {
sink.section2(); sink.section2();
sink.sectionTitle(); sink.sectionTitle2();
sink.text( file.getPath() ); sink.text( file.getPath() );
sink.sectionTitle_(); sink.sectionTitle2_();
sink.table(); sink.table();
sink.tableRow(); sink.tableRow();

View File

@ -34,6 +34,21 @@ import java.util.Iterator;
public class DependenciesReport public class DependenciesReport
extends AbstractMavenReport extends AbstractMavenReport
{ {
public String getName()
{
return "Dependencies";
}
public String getCategoryName()
{
return CATEGORY_PROJECT_INFORMATION;
}
public String getDescription()
{
return "This document lists the projects dependencies and provides information on each dependency.";
}
public void execute() public void execute()
throws MavenReportException throws MavenReportException
{ {
@ -76,20 +91,30 @@ public class DependenciesReport
{ {
startSection( getTitle() ); startSection( getTitle() );
startTable(); if ( model.getDependencies().isEmpty() )
tableCaption( "Declared Dependencies" );
tableHeader( new String[]{"GroupId", "ArtifactId", "Version"} );
for ( Iterator i = model.getDependencies().iterator(); i.hasNext(); )
{ {
Dependency d = (Dependency) i.next(); // TODO: should the report just be excluded?
paragraph( "There are no dependencies for this project. It is a standalone " +
tableRow( new String[]{d.getGroupId(), d.getArtifactId(), d.getVersion()} ); "application that does not depend on any other project." );
} }
else
{
startTable();
endTable(); tableCaption( "The following is a list of dependencies for this project. These dependencies " +
"are required to compile and run the application:" );
tableHeader( new String[]{"GroupId", "ArtifactId", "Version"} );
for ( Iterator i = model.getDependencies().iterator(); i.hasNext(); )
{
Dependency d = (Dependency) i.next();
tableRow( new String[]{d.getGroupId(), d.getArtifactId(), d.getVersion()} );
}
endTable();
}
endSection(); endSection();
} }

View File

@ -33,6 +33,21 @@ import java.util.Iterator;
public class MailingListsReport public class MailingListsReport
extends AbstractMavenReport extends AbstractMavenReport
{ {
public String getName()
{
return "Mailing Lists";
}
public String getCategoryName()
{
return CATEGORY_PROJECT_INFORMATION;
}
public String getDescription()
{
return "This document provides subscription and archive information for this project's mailing lists.";
}
public void execute() public void execute()
throws MavenReportException throws MavenReportException
{ {