Author: brett
Date: Sun Mar 12 21:16:54 2006
New Revision: 385427
URL: http://svn.apache.org/viewcvs?rev=385427&view=rev
Log:
[MSITE-80] clean up site and push features into Doxia site renderer
Modified:
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/Renderer.java
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
maven/doxia/trunk/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
Modified:
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java
URL:
http://svn.apache.org/viewcvs/maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java?rev=385427&r1=385426&r2=385427&view=diff
==============================================================================
---
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java
(original)
+++
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java
Sun Mar 12 21:16:54 2006
@@ -20,6 +20,7 @@
import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
import org.apache.maven.doxia.parser.ParseException;
import org.apache.maven.doxia.parser.manager.ParserNotFoundException;
+import org.apache.maven.doxia.site.decoration.DecorationModel;
import org.apache.maven.doxia.site.module.SiteModule;
import org.apache.maven.doxia.site.module.manager.SiteModuleManager;
import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
@@ -28,6 +29,7 @@
import org.apache.velocity.context.Context;
import org.codehaus.plexus.i18n.I18N;
import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.util.DirectoryScanner;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.PathTool;
@@ -38,13 +40,24 @@
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
-import java.text.SimpleDateFormat;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.text.DateFormat;
+import java.util.Arrays;
import java.util.Date;
+import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
/**
* @author <a href="mailto:[EMAIL PROTECTED]">Emmanuel Venisse</a>
@@ -82,6 +95,12 @@
*/
private I18N i18n;
+ private static final String RESOURCE_DIR = "org/apache/maven/plugins/site";
+
+ private static final String DEFAULT_TEMPLATE = RESOURCE_DIR +
"/default-site.vm";
+
+ private static final String SKIN_TEMPLATE_LOCATION =
"META-INF/maven/site.vm";
+
// ----------------------------------------------------------------------
// Renderer implementation
// ----------------------------------------------------------------------
@@ -103,60 +122,19 @@
if ( moduleBasedir.exists() )
{
- List docs = FileUtils.getFileNames( moduleBasedir, "**/*." +
module.getExtension(), null, false );
-
- for ( Iterator j = docs.iterator(); j.hasNext(); )
- {
- String doc = (String) j.next();
-
- String outputName = doc.substring( 0, doc.indexOf( "." ) +
1 ) + "html";
-
- String fullPathDoc = new File( moduleBasedir, doc
).getPath();
-
- SiteRendererSink sink = createSink( moduleBasedir,
outputName );
-
- try
- {
- FileReader reader = new FileReader( fullPathDoc );
-
- doxia.parse( reader, module.getParserId(), sink );
-
- File outputFile = new File( outputDirectory,
outputName );
-
- if ( !outputFile.getParentFile().exists() )
- {
- outputFile.getParentFile().mkdirs();
- }
-
- generateDocument( new OutputStreamWriter( new
FileOutputStream( outputFile ), outputEncoding ),
- sink, context );
- }
- catch ( ParserNotFoundException e )
- {
- throw new RendererException(
- "Error getting a parser for " + fullPathDoc + ": "
+ e.getMessage() );
- }
- catch ( ParseException e )
- {
- getLogger().error( "Error parsing " + fullPathDoc + ":
" + e.getMessage(), e );
- }
- finally
- {
- sink.flush();
-
- sink.close();
- }
- }
+ renderModule( moduleBasedir, module.getExtension(),
module.getParserId(), outputDirectory,
+ outputEncoding, context );
}
}
+
+ copyResources( outputDirectory, context );
}
- // per module renderer
- public void render( File siteDirectory, File outputDirectory, String
module, String moduleExtension,
- String moduleParserId, SiteRenderingContext context,
String outputEncoding )
- throws RendererException, IOException
+ private void renderModule( File moduleBasedir, String moduleExtension,
String moduleParserId, File outputDirectory,
+ String outputEncoding, SiteRenderingContext
context )
+ throws IOException, RendererException
{
- List docs = FileUtils.getFileNames( siteDirectory, "**/*." +
moduleExtension, null, false );
+ List docs = FileUtils.getFileNames( moduleBasedir, "**/*." +
moduleExtension, null, false );
for ( Iterator j = docs.iterator(); j.hasNext(); )
{
@@ -164,9 +142,9 @@
String outputName = doc.substring( 0, doc.indexOf( "." ) + 1 ) +
"html";
- String fullPathDoc = new File( siteDirectory, doc ).getPath();
+ String fullPathDoc = new File( moduleBasedir, doc ).getPath();
- SiteRendererSink sink = createSink( siteDirectory, outputName );
+ SiteRendererSink sink = createSink( moduleBasedir, outputName );
try
{
@@ -180,6 +158,7 @@
{
outputFile.getParentFile().mkdirs();
}
+
generateDocument( new OutputStreamWriter( new
FileOutputStream( outputFile ), outputEncoding ), sink,
context );
}
@@ -200,6 +179,15 @@
}
}
+ public void render( File moduleBasedir, File outputDirectory, String
module, String moduleExtension,
+ String moduleParserId, SiteRenderingContext context,
String outputEncoding )
+ throws RendererException, IOException
+ {
+ renderModule( moduleBasedir, moduleExtension, moduleParserId,
outputDirectory, outputEncoding, context );
+
+ copyResources( outputDirectory, context );
+ }
+
public void generateDocument( Writer writer, SiteRendererSink sink,
SiteRenderingContext siteContext )
throws RendererException
{
@@ -240,7 +228,7 @@
context.put( "currentDate", new Date() );
- context.put( "dateFormat", new SimpleDateFormat() );
+ context.put( "dateFormat", DateFormat.getDateInstance(
DateFormat.DEFAULT, siteContext.getLocale() ) );
String currentFileName = PathTool.calculateLink(
renderingContext.getOutputName(), relativePath );
currentFileName = currentFileName.replace( '\\', '/' );
@@ -277,15 +265,15 @@
//
//
----------------------------------------------------------------------
- writeTemplate( siteContext.getTemplate(), writer, context,
siteContext.getTemplateClassLoader() );
+ writeTemplate( writer, context, siteContext );
}
- private void writeTemplate( String templateName, Writer writer, Context
context, ClassLoader templateClassLoader )
+ private void writeTemplate( Writer writer, Context context,
SiteRenderingContext siteContext )
throws RendererException
{
ClassLoader old = null;
- if ( templateClassLoader != null )
+ if ( siteContext.getTemplateClassLoader() != null )
{
//
-------------------------------------------------------------------------
// If no template classloader was set we'll just use the context
classloader
@@ -293,12 +281,12 @@
old = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader( templateClassLoader
);
+ Thread.currentThread().setContextClassLoader(
siteContext.getTemplateClassLoader() );
}
try
{
- processTemplate( templateName, context, writer );
+ processTemplate( siteContext.getTemplateName(), context, writer );
}
finally
{
@@ -341,6 +329,215 @@
public SiteRendererSink createSink( File moduleBaseDir, String document )
{
return new SiteRendererSink( new RenderingContext( moduleBaseDir,
document ) );
+ }
+
+ public SiteRenderingContext createContextForSkin( File skinFile, Map
attributes, DecorationModel decoration,
+ Locale locale, String
defaultWindowTitle,
+ File resourcesDirectory )
+ throws IOException
+ {
+ SiteRenderingContext context = new SiteRenderingContext();
+
+ // TODO: plexus-archiver, if it could do the excludes
+ ZipFile zipFile = new ZipFile( skinFile );
+ try
+ {
+ if ( zipFile.getEntry( SKIN_TEMPLATE_LOCATION ) != null )
+ {
+ context.setTemplateName( SKIN_TEMPLATE_LOCATION );
+ context.setTemplateClassLoader( new URLClassLoader( new
URL[]{skinFile.toURL()} ) );
+ }
+ else
+ {
+ context.setTemplateName( DEFAULT_TEMPLATE );
+ context.setTemplateClassLoader( getClass().getClassLoader() );
+ context.setUsingDefaultTemplate( true );
+ }
+ }
+ finally
+ {
+ closeZipFile( zipFile );
+ }
+
+ context.setTemplateProperties( attributes );
+ context.setLocale( locale );
+ context.setDecoration( decoration );
+ context.setDefaultWindowTitle( defaultWindowTitle );
+ context.setSkinJarFile( skinFile );
+ context.setResourcesDirectory( resourcesDirectory );
+
+ return context;
+ }
+
+ public SiteRenderingContext createContextForTemplate( File templateFile,
Map attributes, DecorationModel decoration,
+ Locale locale,
String defaultWindowTitle, File skinFile,
+ File
resourcesDirectory )
+ throws MalformedURLException
+ {
+ SiteRenderingContext context = new SiteRenderingContext();
+
+ context.setTemplateName( templateFile.getName() );
+ context.setTemplateClassLoader( new URLClassLoader( new
URL[]{templateFile.getParentFile().toURL()} ) );
+
+ context.setTemplateProperties( attributes );
+ context.setLocale( locale );
+ context.setDecoration( decoration );
+ context.setDefaultWindowTitle( defaultWindowTitle );
+ context.setSkinJarFile( skinFile );
+ context.setResourcesDirectory( resourcesDirectory );
+
+ return context;
+ }
+
+ private void closeZipFile( ZipFile zipFile )
+ {
+ // TODO: move to plexus utils
+ try
+ {
+ zipFile.close();
+ }
+ catch ( IOException e )
+ {
+ // ignore
+ }
+ }
+
+ /**
+ * Copy Resources
+ *
+ * @param outputDir the output directory
+ * @throws java.io.IOException if any
+ */
+ public void copyResources( File outputDir, SiteRenderingContext
siteContext )
+ throws IOException
+ {
+ // TODO: plexus-archiver, if it could do the excludes
+ ZipFile file = new ZipFile( siteContext.getSkinJarFile() );
+ try
+ {
+ for ( Enumeration e = file.entries(); e.hasMoreElements(); )
+ {
+ ZipEntry entry = (ZipEntry) e.nextElement();
+
+ if ( !entry.getName().startsWith( "META-INF/" ) )
+ {
+ File destFile = new File( outputDir, entry.getName() );
+ if ( !entry.isDirectory() )
+ {
+ destFile.getParentFile().mkdirs();
+
+ FileOutputStream fos = new FileOutputStream( destFile
);
+
+ try
+ {
+ IOUtil.copy( file.getInputStream( entry ), fos );
+ }
+ finally
+ {
+ IOUtil.close( fos );
+ }
+ }
+ else
+ {
+ destFile.mkdirs();
+ }
+ }
+ }
+ }
+ finally
+ {
+ file.close();
+ }
+
+ if ( siteContext.isUsingDefaultTemplate() )
+ {
+ InputStream resourceList =
+ getClass().getClassLoader().getResourceAsStream( RESOURCE_DIR
+ "/resources.txt" );
+
+ if ( resourceList != null )
+ {
+ LineNumberReader reader = new LineNumberReader( new
InputStreamReader( resourceList ) );
+
+ String line = reader.readLine();
+
+ while ( line != null )
+ {
+ InputStream is =
getClass().getClassLoader().getResourceAsStream( RESOURCE_DIR + "/" + line );
+
+ if ( is == null )
+ {
+ throw new IOException( "The resource " + line + "
doesn't exist." );
+ }
+
+ File outputFile = new File( outputDir, line );
+
+ if ( !outputFile.getParentFile().exists() )
+ {
+ outputFile.getParentFile().mkdirs();
+ }
+
+ FileOutputStream w = new FileOutputStream( outputFile );
+
+ IOUtil.copy( is, w );
+
+ IOUtil.close( is );
+
+ IOUtil.close( w );
+
+ line = reader.readLine();
+ }
+ }
+ }
+
+ File resourcesDirectory = siteContext.getResourcesDirectory();
+
+ // Copy extra site resources
+ // TODO: this should be accommodating locale
+ // TODO: this should be automatically looking into
${siteDirectory}/resources
+ if ( resourcesDirectory != null && resourcesDirectory.exists() )
+ {
+ copyDirectory( resourcesDirectory, outputDir );
+ }
+
+ }
+
+ /**
+ * Copy the directory
+ *
+ * @param source source file to be copied
+ * @param destination destination file
+ * @throws java.io.IOException if any
+ */
+ protected void copyDirectory( File source, File destination )
+ throws IOException
+ {
+ if ( source.exists() )
+ {
+ DirectoryScanner scanner = new DirectoryScanner();
+
+ String[] includedResources = {"**/**"};
+
+ scanner.setIncludes( includedResources );
+
+ scanner.addDefaultExcludes();
+
+ scanner.setBasedir( source );
+
+ scanner.scan();
+
+ List includedFiles = Arrays.asList( scanner.getIncludedFiles() );
+
+ for ( Iterator j = includedFiles.iterator(); j.hasNext(); )
+ {
+ String name = (String) j.next();
+
+ File sourceFile = new File( source, name );
+
+ File destinationFile = new File( destination, name );
+
+ FileUtils.copyFile( sourceFile, destinationFile );
+ }
+ }
}
}
Modified:
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/Renderer.java
URL:
http://svn.apache.org/viewcvs/maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/Renderer.java?rev=385427&r1=385426&r2=385427&view=diff
==============================================================================
---
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/Renderer.java
(original)
+++
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/Renderer.java
Sun Mar 12 21:16:54 2006
@@ -16,11 +16,15 @@
* limitations under the License.
*/
+import org.apache.maven.doxia.site.decoration.DecorationModel;
import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
+import java.net.MalformedURLException;
+import java.util.Locale;
+import java.util.Map;
/**
* @author <a href="mailto:[EMAIL PROTECTED]>Emmanuel Venisse</a>
@@ -36,7 +40,7 @@
void render( File siteDirectory, File outputDirectory,
SiteRenderingContext context, String outputEncoding )
throws RendererException, IOException;
- void render( File siteDirectory, File outputDirectory, String module,
String moduleExtension, String moduleParserId,
+ void render( File moduleBasedir, File outputDirectory, String module,
String moduleExtension, String moduleParserId,
SiteRenderingContext context, String outputEncoding )
throws RendererException, IOException;
@@ -46,4 +50,15 @@
SiteRendererSink createSink( File moduleBaseDir, String document )
throws RendererException, IOException;
+ SiteRenderingContext createContextForSkin( File skinFile, Map attributes,
DecorationModel decoration, Locale locale,
+ String defaultWindowTitle, File
resourcesDirectory )
+ throws IOException;
+
+ SiteRenderingContext createContextForTemplate( File templateFile, Map
attributes, DecorationModel decoration,
+ Locale locale, String
defaultWindowTitle, File skinFile,
+ File resourcesDirectory )
+ throws MalformedURLException;
+
+ void copyResources( File outputDirectory, SiteRenderingContext siteContext
)
+ throws IOException;
}
Modified:
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
URL:
http://svn.apache.org/viewcvs/maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java?rev=385427&r1=385426&r2=385427&view=diff
==============================================================================
---
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
(original)
+++
maven/doxia/trunk/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
Sun Mar 12 21:16:54 2006
@@ -18,6 +18,7 @@
import org.apache.maven.doxia.site.decoration.DecorationModel;
+import java.io.File;
import java.util.Locale;
import java.util.Map;
@@ -27,36 +28,27 @@
*/
public class SiteRenderingContext
{
- private String template;
-
- private Map templateProperties;
+ private String templateName;
private ClassLoader templateClassLoader;
+ private Map templateProperties;
+
private Locale locale = Locale.getDefault();
private DecorationModel decoration;
private String defaultWindowTitle;
- public String getTemplate()
- {
- return template;
- }
+ private File skinJarFile;
- public void setTemplate( String template )
- {
- this.template = template;
- }
+ private boolean usingDefaultTemplate;
- public Map getTemplateProperties()
- {
- return templateProperties;
- }
+ private File resourcesDirectory;
- public void setTemplateProperties( Map templateProperties )
+ public String getTemplateName()
{
- this.templateProperties = templateProperties;
+ return templateName;
}
public ClassLoader getTemplateClassLoader()
@@ -69,6 +61,16 @@
this.templateClassLoader = templateClassLoader;
}
+ public Map getTemplateProperties()
+ {
+ return templateProperties;
+ }
+
+ public void setTemplateProperties( Map templateProperties )
+ {
+ this.templateProperties = templateProperties;
+ }
+
public Locale getLocale()
{
return locale;
@@ -97,5 +99,40 @@
public String getDefaultWindowTitle()
{
return defaultWindowTitle;
+ }
+
+ public File getSkinJarFile()
+ {
+ return skinJarFile;
+ }
+
+ public void setSkinJarFile( File skinJarFile )
+ {
+ this.skinJarFile = skinJarFile;
+ }
+
+ public void setTemplateName( String templateName )
+ {
+ this.templateName = templateName;
+ }
+
+ public void setUsingDefaultTemplate( boolean usingDefaultTemplate )
+ {
+ this.usingDefaultTemplate = usingDefaultTemplate;
+ }
+
+ public boolean isUsingDefaultTemplate()
+ {
+ return usingDefaultTemplate;
+ }
+
+ public void setResourcesDirectory( File resourcesDirectory )
+ {
+ this.resourcesDirectory = resourcesDirectory;
+ }
+
+ public File getResourcesDirectory()
+ {
+ return resourcesDirectory;
}
}
Modified:
maven/doxia/trunk/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
URL:
http://svn.apache.org/viewcvs/maven/doxia/trunk/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java?rev=385427&r1=385426&r2=385427&view=diff
==============================================================================
---
maven/doxia/trunk/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
(original)
+++
maven/doxia/trunk/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
Sun Mar 12 21:16:54 2006
@@ -59,7 +59,7 @@
DecorationModel decoration =
new DecorationXpp3Reader().read( new FileReader( getTestFile(
"src/test/site/site.xml" ) ) );
SiteRenderingContext context = new SiteRenderingContext();
- context.setTemplate( "default-site.vm" );
+ context.setTemplateName( "default-site.vm" );
context.setTemplateClassLoader( getClassLoader() );
context.setDecoration( decoration );
renderer.render( getTestFile( "src/test/site" ), getTestFile(
"target/output" ), context );