Author: mcconnell Date: Sat May 29 10:05:26 2004 New Revision: 20599 Added: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/XdocTask.java Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/antlib.xml avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JavacTask.java avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PrepareTask.java Log: Add xdocs task.
Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/antlib.xml ============================================================================== --- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/antlib.xml (original) +++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/antlib.xml Sat May 29 10:05:26 2004 @@ -9,4 +9,5 @@ <taskdef name="declare" classname="org.apache.avalon.tools.tasks.DeclareTask"/> <taskdef name="plugin" classname="org.apache.avalon.tools.tasks.PluginTask"/> <taskdef name="install" classname="org.apache.avalon.tools.tasks.InstallTask"/> + <taskdef name="xdoc" classname="org.apache.avalon.tools.tasks.XdocTask"/> </antlib> Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JavacTask.java ============================================================================== --- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JavacTask.java (original) +++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JavacTask.java Sat May 29 10:05:26 2004 @@ -116,7 +116,7 @@ FileSet fileset = new FileSet(); fileset.setDir( sources ); fileset.setIncludes( "**/**" ); - fileset.setExcludes( "**/_svn/**,**/*.java,**/package.html" ); + fileset.setExcludes( "**/*.java,**/package.html" ); copy.addFileset( fileset ); copy.init(); copy.execute(); Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PrepareTask.java ============================================================================== --- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PrepareTask.java (original) +++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PrepareTask.java Sat May 29 10:05:26 2004 @@ -95,12 +95,12 @@ private void copySrcToBuildWithFiltering( File target ) { - copySrcToBuild( target, true, "**/*.java,**/*.x*,**/*.properties", "**/_svn/**" ); + copySrcToBuild( target, true, "**/*.java,**/*.x*,**/*.properties", "" ); } private void copySrcToBuildWithoutFiltering( File target ) { - copySrcToBuild( target, false, "**/*.*", "**/*.java,**/*.x*,**/*.properties,**/_svn/**" ); + copySrcToBuild( target, false, "**/*.*", "**/*.java,**/*.x*,**/*.properties" ); } private void copySrcToBuild( Added: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/XdocTask.java ============================================================================== --- (empty file) +++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/XdocTask.java Sat May 29 10:05:26 2004 @@ -0,0 +1,298 @@ +package org.apache.avalon.tools.tasks; + +import java.io.File; +import java.io.FileFilter; + +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.parsers.ParserConfigurationException; + +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; + +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.apache.tools.ant.Task; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.taskdefs.Copy; +import org.apache.tools.ant.taskdefs.XSLTProcess; + +public class XdocTask extends HomeTask +{ + public static final String XDOC_TARGET_SRC_KEY = "avalon.target.src.xdoc"; + public static final String XDOC_TARGET_SRC_VALUE = + PrepareTask.TARGET_SRC + "/xdocs"; + + public static final String XDOC_TARGET_DOCS_KEY = "avalon.target.docs"; + public static final String XDOC_TARGET_DOCS_VALUE = + PrepareTask.TARGET + "/docs"; + + public static final String XDOC_THEME_KEY = "xdoc.theme.name"; + public static final String XDOC_THEME_VALUE = "avalon2"; + + public static final String XDOC_OUTPUT_FORMAT_KEY = "xdoc.output.format"; + public static final String XDOC_OUTPUT_FORMAT_VALUE = "html"; + + private File m_BaseToDir; + private File m_BaseSrcDir; + private String m_theme; + + public void setTheme( String theme ) + { + m_theme = theme; + } + + public void init() + { + super.init(); + setProjectProperty( XDOC_TARGET_SRC_KEY, XDOC_TARGET_SRC_VALUE ); + setProjectProperty( XDOC_TARGET_DOCS_KEY, XDOC_TARGET_DOCS_VALUE ); + setProjectProperty( XDOC_THEME_KEY, XDOC_THEME_VALUE ); + setProjectProperty( XDOC_OUTPUT_FORMAT_KEY, XDOC_OUTPUT_FORMAT_VALUE ); + } + + private File getThemesDirectory() + { + return new File( getHome().getHomeDirectory(), "themes" ); + } + + private File getTargetSrcXdocDirectory() + { + File basedir = getProject().getBaseDir(); + return new File( basedir, getProject().getProperty( XDOC_TARGET_SRC_KEY ) ); + } + + private File getTargetDocsDirectory() + { + File basedir = getProject().getBaseDir(); + return new File( basedir, getProject().getProperty( XDOC_TARGET_DOCS_KEY ) ); + } + + private File getTargetBuildXdocDirectory() + { + File target = PrepareTask.getTargetDirectory( getProject() ); + return new File( target, "temp/xdoc-build" ); + } + + private String getTheme() + { + if( m_theme != null ) return m_theme; + return getProject().getProperty( XDOC_THEME_KEY ); + } + + private String getOutputFormat() + { + return getProject().getProperty( XDOC_OUTPUT_FORMAT_KEY ); + } + + public void execute() + { + File srcDir = getTargetSrcXdocDirectory(); + if( !srcDir.exists() ) return; + + File destDir = getTargetBuildXdocDirectory(); + createDirectory( destDir ); + + String theme = getTheme(); + String output = getOutputFormat(); + File themeRoot = getThemesDirectory(); + File themeDir = new File( themeRoot, theme + "/" + output ); + + log( " Source: " + srcDir.getAbsolutePath() ); + log( " Dest: " + destDir.getAbsolutePath() ); + log( "Theme Dir: " + themeDir ); + + try + { + transformNavigation( themeDir, srcDir, destDir ); + copySources( srcDir, destDir ); + transformXdocs( themeDir, destDir ); + copyResources( themeDir ); + } + catch( Throwable e ) + { + log( "XSLT execution failed: " + e.getMessage() ); + throw new BuildException( e ); + } + } + + private void transformNavigation( File themeDir, File source, File dest ) + { + File xslFile = new File( themeDir, "nav-aggregate.xsl" ); + log( "Transforming navigation." ); + transformTrax( + source, dest, xslFile, + "^.*/navigation.xml$", "", ".xml", "xml" ); + } + + private void copySources( File source, File dest ) + { + copy( source, dest, "**/*", "**/navigation.xml" ); + } + + private void transformXdocs( File themeDir, File build ) + { + File xslFile = new File( themeDir, "transform.xsl" ); + String output = getOutputFormat(); + File docs = getTargetDocsDirectory(); + log( "Transforming content." ); + transformTrax( + build, docs, xslFile, + "^.*\\.xml$", "^.*/navigation.xml$", "." + output, "html" ); + } + + private void copyResources( File themeDir ) + { + File destDir = getTargetDocsDirectory(); + File toDir = new File( destDir, "resources" ); + File fromDir = new File( themeDir, "resources" ); + copy( fromDir, toDir, "**/*", "" ); + } + + private void copy( File fromDir, File toDir, String includes, String excludes ) + { + FileSet from = new FileSet(); + from.setDir( fromDir ); + from.setIncludes( includes ); + from.setExcludes( excludes ); + toDir.mkdirs(); /* ensure that the directory exists. */ + + Copy copy = (Copy) getProject().createTask( "copy" ); + copy.setTodir( toDir ); + copy.addFileset( from ); + copy.execute(); + } + + + private void transformTrax( File srcDir, File toDir, File xslFile, + String includes, String excludes, String extension, + String method ) + throws BuildException + { + try + { + TransformerFactory factory = TransformerFactory.newInstance(); + StreamSource xsl = new StreamSource( xslFile ); + Transformer transformer = factory.newTransformer( xsl ); + + RegexpFilter filter = new RegexpFilter( includes, excludes ); + + m_BaseToDir = toDir; + m_BaseSrcDir = srcDir.getAbsoluteFile(); + transform( transformer, m_BaseSrcDir, toDir, filter, extension ); + } + catch( TransformerException e ) + { + throw new BuildException( e.getMessage(), e ); + } + } + + private void transform( Transformer transformer, File srcDir, File toDir, + FileFilter filter, String extension ) + throws BuildException + { + File[] content = srcDir.listFiles( filter ); + for( int i = 0 ; i < content.length ; i++ ) + { + String base = content[i].getName(); + if( content[i].isDirectory() ) + { + File newDest = new File( toDir, base ); + newDest.mkdirs(); + transform( transformer, content[i], newDest, filter, extension ); + } + if( content[i].isFile() ) + { + String svnRoot = getProject().getProperty( "xdoc.svn.root.xdocs" ); + String svnSource = svnRoot + getRelSrcPath( srcDir ) + "/" + base; + + int pos = base.lastIndexOf( '.' ); + if( pos > 0 ) + base = base.substring( 0, pos ); + base = base + extension; + + File newDest = new File( toDir, base ); + StreamSource xml = new StreamSource( content[i] ); + StreamResult out = new StreamResult( newDest ); + transformer.clearParameters(); + + transformer.setParameter( "directory", getRelToPath( toDir ) ); + transformer.setParameter( "fullpath", getRelToPath( newDest ) ); + transformer.setParameter( "file", base ); + transformer.setParameter( + "copyright", getProject().getProperty( "xdoc.footer.copyright" ) ); + transformer.setParameter( "svn-location", svnSource ); + + try + { + transformer.transform( xml, out ); + } + catch( Exception e ) + { + log( "ERROR: " + getRelToPath( newDest ) + " : " + e.getMessage() ); + throw new BuildException( + "Unable to transform document." ); + } + } + } + } + + private String getRelToPath( File dir ) + { + String basedir = m_BaseToDir.getAbsolutePath(); + String curdir = dir.getAbsolutePath(); + return curdir.substring( basedir.length() ); + } + + private String getRelSrcPath( File dir ) + { + String basedir = m_BaseSrcDir.getAbsolutePath(); + String curdir = dir.getAbsolutePath(); + return curdir.substring( basedir.length() ); + } + + + public class RegexpFilter + implements FileFilter + { + private Pattern m_Includes; + private Pattern m_Excludes; + + public RegexpFilter( String includes, String excludes ) + { + m_Includes = Pattern.compile( includes ); + m_Excludes = Pattern.compile( excludes ); + } + + public boolean accept( File file ) + { + String basename = file.getName(); + + if( basename.equals( ".svn" ) ) + return false; + + if( basename.equals( "CVS" ) ) + return false; + + if( file.isDirectory() ) + return true; + + + String fullpath = file.getAbsolutePath().replace( '\\', '/' ); + + Matcher m = m_Includes.matcher( fullpath ); + if( ! m.matches() ) + return false; + + m = m_Excludes.matcher( fullpath ); + return ! m.matches() ; + } + } +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]