Author: niclas Date: Tue Sep 21 08:34:01 2004 New Revision: 46985 Added: avalon/trunk/tools/spells/xdoc/ avalon/trunk/tools/spells/xdoc/build.xml (contents, props changed) avalon/trunk/tools/spells/xdoc/src/ avalon/trunk/tools/spells/xdoc/src/main/ avalon/trunk/tools/spells/xdoc/src/main/org/ avalon/trunk/tools/spells/xdoc/src/main/org/apache/ avalon/trunk/tools/spells/xdoc/src/main/org/apache/metro/ avalon/trunk/tools/spells/xdoc/src/main/org/apache/metro/magic/ avalon/trunk/tools/spells/xdoc/src/main/org/apache/metro/magic/spells/ avalon/trunk/tools/spells/xdoc/src/main/org/apache/metro/magic/spells/xdoc/ avalon/trunk/tools/spells/xdoc/src/main/org/apache/metro/magic/spells/xdoc/XdocTask.java (contents, props changed) Removed: avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/XdocTask.java Modified: avalon/trunk/tools/index.xml avalon/trunk/tools/magic/etc/deliverables/templates/standard.xml avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/antlib.xml Log: Moved the XDocTask out into its own plugin, so it can depend on Saxon to solve a JDK1.5 problem.
Modified: avalon/trunk/tools/index.xml ============================================================================== --- avalon/trunk/tools/index.xml (original) +++ avalon/trunk/tools/index.xml Tue Sep 21 08:34:01 2004 @@ -135,6 +135,15 @@ </gump> </resource> + <resource> + <info> + <group>saxon</group> + <name>saxon</name> + <version>6.5.3</version> + <type>jar</type> + </info> + </resource> + <!-- Avalon Tools. --> @@ -175,6 +184,21 @@ </dependencies> <tasks> <taskdef name="checkstyle" class="com.puppycrawl.tools.checkstyle.CheckStyleTask"/> + </tasks> + </plugin> + + <plugin basedir="spells/xdoc"> + <info> + <group>avalon/tools</group> + <name>magic-xdoc-plugin</name> + <type>plugin</type> + </info> + <dependencies> + <include key="avalon-tools-magic"/> + <include key="saxon" runtime="true" build="false" test="false" /> + </dependencies> + <tasks> + <taskdef name="xdoc" class="org.apache.metro.magic.spells.xdoc.XdocTask"/> </tasks> </plugin> Modified: avalon/trunk/tools/magic/etc/deliverables/templates/standard.xml ============================================================================== --- avalon/trunk/tools/magic/etc/deliverables/templates/standard.xml (original) +++ avalon/trunk/tools/magic/etc/deliverables/templates/standard.xml Tue Sep 21 08:34:01 2004 @@ -55,7 +55,8 @@ </target> <target name="xdoc" depends="prepare"> - <x:xdoc theme="modern"/> + <x:plugin name="xdoc" uri="plugin:avalon/tools/magic-xdoc-plugin"/> + <xdoc theme="modern"/> </target> <target name="site" depends="javadoc,xdoc"/> Modified: avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/antlib.xml ============================================================================== --- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/antlib.xml (original) +++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/antlib.xml Tue Sep 21 08:34:01 2004 @@ -11,7 +11,6 @@ <taskdef name="declare" classname="org.apache.avalon.tools.tasks.DeclareTask"/> <taskdef name="install" classname="org.apache.avalon.tools.tasks.InstallTask"/> <taskdef name="plugin" classname="org.apache.avalon.tools.tasks.PluginTask"/> - <taskdef name="xdoc" classname="org.apache.avalon.tools.tasks.XdocTask"/> <taskdef name="reactor" classname="org.apache.avalon.tools.tasks.ReactorTask"/> <taskdef name="filter" classname="org.apache.avalon.tools.tasks.FilterTask"/> <taskdef name="info" classname="org.apache.avalon.tools.tasks.AnnounceTask"/> @@ -24,6 +23,7 @@ <taskdef name="replicate" classname="org.apache.avalon.tools.tasks.ReplicateTask"/> <taskdef name="block" classname="org.apache.avalon.tools.tasks.BlockTask"/> <taskdef name="gump" classname="org.apache.avalon.tools.tasks.GumpTask"/> + <taskdef name="new" classname="org.apache.avalon.tools.tasks.NewTask"/> + <typedef name="path" classname="org.apache.avalon.tools.model.MagicPath"/> - <typedef name="new" classname="org.apache.avalon.tools.tasks.NewTask"/> </antlib> Added: avalon/trunk/tools/spells/xdoc/build.xml ============================================================================== --- (empty file) +++ avalon/trunk/tools/spells/xdoc/build.xml Tue Sep 21 08:34:01 2004 @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<project name="magic-xdoc-plugin" default="install" basedir="." + xmlns:x="antlib:org.apache.avalon.tools"> + + <x:home/> + <import file="${magic.templates}/standard.xml"/> + <target name="build" depends="standard.build"> + <x:declare/> + </target> + +</project> Added: avalon/trunk/tools/spells/xdoc/src/main/org/apache/metro/magic/spells/xdoc/XdocTask.java ============================================================================== --- (empty file) +++ avalon/trunk/tools/spells/xdoc/src/main/org/apache/metro/magic/spells/xdoc/XdocTask.java Tue Sep 21 08:34:01 2004 @@ -0,0 +1,433 @@ +/* + * Copyright 2004 Apache Software Foundation + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.metro.magic.spells.xdoc; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.taskdefs.Copy; +import org.apache.tools.ant.types.FileSet; + +import org.apache.avalon.tools.tasks.SystemTask; + +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 java.io.File; +import java.io.FileFilter; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; + +import java.util.Calendar; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class XdocTask extends SystemTask +{ + public static final String ORG_NAME_KEY = "project.organization.name"; + public static final String ORG_NAME_VALUE = "The Apache Software Foundation"; + + public static final String XDOC_TEMP_KEY = "project.target.temp.xdocs"; + public static final String XDOC_TEMP_VALUE = "xdocs"; + + public static final String XDOC_SRC_KEY = "project.xdocs.src"; + public static final String XDOC_SRC_VALUE = "xdocs"; + + public static final String XDOC_RESOURCES_KEY = "project.xdocs.resources"; + public static final String XDOC_RESOURCES_VALUE = "resources"; + + public static final String XDOC_THEME_KEY = "project.xdoc.theme"; + public static final String XDOC_THEME_VALUE = "modern"; + + public static final String XDOC_FORMAT_KEY = "project.xdoc.output.format"; + public static final String XDOC_FORMAT_VALUE = "html"; + + public static final String XDOC_LOGO_RIGHT_FILE_KEY = "project.xdoc.logo.right.file"; + public static final String XDOC_LOGO_RIGHT_FILE_VALUE = ""; + + public static final String XDOC_LOGO_RIGHT_URL_KEY = "project.xdoc.logo.right.url"; + public static final String XDOC_LOGO_RIGHT_URL_VALUE = ""; + + public static final String XDOC_LOGO_LEFT_FILE_KEY = "project.xdoc.logo.left.file"; + public static final String XDOC_LOGO_LEFT_FILE_VALUE = ""; + + public static final String XDOC_LOGO_LEFT_URL_KEY = "project.xdoc.logo.left.url"; + public static final String XDOC_LOGO_LEFT_URL_VALUE = ""; + + public static final String XDOC_LOGO_MIDDLE_FILE_KEY = "project.xdoc.logo.middle.file"; + public static final String XDOC_LOGO_MIDDLE_FILE_VALUE = ""; + + public static final String XDOC_LOGO_MIDDLE_URL_KEY = "project.xdoc.logo.middle.url"; + public static final String XDOC_LOGO_MIDDLE_URL_VALUE = ""; + + public static final String XDOC_BRAND_NAME_KEY = "project.xdoc.brand.name"; + public static final String XDOC_BRAND_NAME_VALUE = "Avalon"; + + public static final String XDOC_ANCHOR_URL_KEY = "project.xdoc.anchor.url"; + + private String m_theme; + private File m_BaseToDir; + private File m_BaseSrcDir; + + public String getTheme() + { + if( m_theme != null ) + return m_theme; + return getProject().getProperty( XDOC_THEME_KEY ); + } + + public void setTheme( final String theme ) + { + m_theme = theme; + } + + public void init() throws BuildException + { + if( !isInitialized() ) + { + super.init(); + final Project project = getProject(); + project.setNewProperty( ORG_NAME_KEY, ORG_NAME_VALUE ); + project.setNewProperty( XDOC_SRC_KEY, XDOC_SRC_VALUE ); + project.setNewProperty( XDOC_RESOURCES_KEY, XDOC_RESOURCES_VALUE ); + project.setNewProperty( XDOC_THEME_KEY, XDOC_THEME_VALUE ); + project.setNewProperty( XDOC_FORMAT_KEY, XDOC_FORMAT_VALUE ); + project.setNewProperty( XDOC_TEMP_KEY, XDOC_TEMP_VALUE ); + project.setNewProperty( XDOC_LOGO_RIGHT_FILE_KEY, XDOC_LOGO_RIGHT_FILE_VALUE ); + project.setNewProperty( XDOC_LOGO_RIGHT_URL_KEY, XDOC_LOGO_RIGHT_URL_VALUE ); + project.setNewProperty( XDOC_LOGO_LEFT_FILE_KEY, XDOC_LOGO_LEFT_FILE_VALUE ); + project.setNewProperty( XDOC_LOGO_LEFT_URL_KEY, XDOC_LOGO_LEFT_URL_VALUE ); + project.setNewProperty( XDOC_LOGO_MIDDLE_FILE_KEY, XDOC_LOGO_MIDDLE_FILE_VALUE ); + project.setNewProperty( XDOC_LOGO_MIDDLE_URL_KEY, XDOC_LOGO_MIDDLE_URL_VALUE ); + project.setNewProperty( XDOC_BRAND_NAME_KEY, XDOC_BRAND_NAME_VALUE ); + } + } + + private File getThemesDirectory() + { + final File cache = getHome().getRepository().getCacheDirectory(); + return new File( cache, "avalon/tools/themes" ); + } + + private String getOutputFormat() + { + return getProject().getProperty( XDOC_FORMAT_KEY ); + } + + public void execute() + { + final Project project = getProject(); + final File docs = getContext().getDocsDirectory(); + + // + // get the directory containing the filtered xdocs source files + // (normally target/src/xdocs) + // + + final File build = getContext().getBuildDirectory(); + final String xdocsPath = project.getProperty( XDOC_SRC_KEY ); + if( null == xdocsPath ) + { + final String message = + "Cannot continue as xdoc src directory not defined."; + log( message ); + return; + } + + final File srcDir = new File( build, xdocsPath ); + if( !srcDir.exists() ) return; + log( "Filtered source: " + srcDir.getAbsolutePath() ); + + // + // create the temporary directory into which we generate the + // navigation structure (normally target/temp/xdocs) + // + + final File temp = getContext().getTempDirectory(); + final String tempPath = project.getProperty( XDOC_TEMP_KEY ); + final File destDir = new File( temp, tempPath ); + mkDir( destDir ); + + // + // get the theme, output formats, etc. + // + + log( "Destination: " + docs.getAbsolutePath() ); + mkDir( docs ); + + final String theme = getTheme(); + final String output = getOutputFormat(); + final File themeRoot = getThemesDirectory(); + final File themeDir = new File( themeRoot, theme + "/" + output ); + + final String resourcesPath = project.getProperty( XDOC_RESOURCES_KEY ); + final File resources = new File( build, resourcesPath ); + + log( "Year: " + getYear() ); + log( "Theme: " + themeDir ); + + // + // initiate the transformation starting with the generation of + // the navigation structure based on the src directory content + // into the temporary destingation directory, copy the content + // sources to to the temp directory, transform the content and + // generated navigation in the temp dir using the selected them + // into the final docs directory, and copy over resources to + // the final docs directory + // + + try + { + transformNavigation( themeDir, srcDir, destDir ); + copySources( srcDir, destDir ); + transformXdocs( themeDir, destDir, docs ); + copyThemeResources( themeDir, docs ); + copySrcResources( resources, docs ); + } + catch( Throwable e ) + { + log( "XSLT execution failed: " + e.getMessage() ); + throw new BuildException( e ); + } + } + + private void transformNavigation( final File themeDir, final File source, final File dest ) + { + final File xslFile = new File( themeDir, "nav-aggregate.xsl" ); + log( "Transforming navigation." ); + transformTrax( + source, dest, xslFile, + "^.*/navigation.xml$", "", ".xml" ); + } + + private void copySources( final File source, final File dest ) + { + copy( source, dest, "**/*", "**/navigation.xml" ); + } + + private void transformXdocs( final File themeDir, final File build, final File docs ) + { + final File xslFile = new File( themeDir, "transform.xsl" ); + final String output = getOutputFormat(); + log( "Transforming content." ); + transformTrax( + build, docs, xslFile, + "^.*\\.xml$", "^.*/navigation.xml$", "." + output ); + } + + private void copySrcResources( final File resources, final File docs ) + { + copy( resources, docs, "**/*", "" ); + } + + private void copyThemeResources( final File themeDir, final File docs ) + { + final File fromDir = new File( themeDir, "resources" ); + copy( fromDir, docs, "**/*", "" ); + } + + private void copy( final File fromDir, final File toDir, final String includes, final String excludes ) + { + final FileSet from = new FileSet(); + from.setDir( fromDir ); + from.setIncludes( includes ); + from.setExcludes( excludes ); + + mkDir( toDir ); + + final Copy copy = (Copy) getProject().createTask( "copy" ); + copy.setTodir( toDir ); + copy.addFileset( from ); + copy.setPreserveLastModified( true ); + copy.execute(); + } + + + private void transformTrax( + final File srcDir, final File toDir, final File xslFile, + final String includes, final String excludes, final String extension ) + throws BuildException + { + try + { + final TransformerFactory factory = TransformerFactory.newInstance(); + final StreamSource xsl = new StreamSource( xslFile ); + final Transformer transformer = factory.newTransformer( xsl ); + + final 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( final Transformer transformer, final File srcDir, final File toDir, + final FileFilter filter, final String extension ) + throws BuildException + { + final String year = getYear(); + final String org = getOrganization(); + final String copyright = + "Copyright " + year + ", " + org + " All rights reserved."; + + + final File[] content = srcDir.listFiles( filter ); + for( int i = 0 ; i < content.length ; i++ ) + { + String base = content[i].getName(); + if( content[i].isDirectory() ) + { + final File newDest = new File( toDir, base ); + newDest.mkdirs(); + transform( transformer, content[i], newDest, filter, extension ); + } + if( content[i].isFile() ) + { + final String svnRoot = getProject().getProperty( XDOC_ANCHOR_URL_KEY ); + final String svnSource = svnRoot + getRelSrcPath( srcDir ) + "/" + base; + + final int pos = base.lastIndexOf( '.' ); + if( pos > 0 ) + base = base.substring( 0, pos ); + base = base + extension; + + final File newDest = new File( toDir, base ); + final StreamSource xml = new StreamSource( content[i] ); + final StreamResult out = new StreamResult( newDest ); + + transformer.clearParameters(); + + transformer.setParameter( "directory", getRelToPath( toDir ) ); + transformer.setParameter( "fullpath", getRelToPath( newDest ) ); + transformer.setParameter( "file", base ); + transformer.setParameter( "svn-location", svnSource ); + + transformer.setParameter( "copyright", copyright ); + transformer.setParameter( + "logoright_file", + getProject().getProperty( XDOC_LOGO_RIGHT_FILE_KEY ).trim() ); + transformer.setParameter( + "logoright_url", + getProject().getProperty( XDOC_LOGO_RIGHT_URL_KEY).trim() ); + transformer.setParameter( + "logoleft_file", + getProject().getProperty( XDOC_LOGO_LEFT_FILE_KEY ).trim() ); + transformer.setParameter( + "logoleft_url", + getProject().getProperty( XDOC_LOGO_LEFT_URL_KEY ).trim() ); + transformer.setParameter( + "logomiddle_file", + getProject().getProperty( XDOC_LOGO_MIDDLE_FILE_KEY ).trim() ); + transformer.setParameter( + "logomiddle_url", + getProject().getProperty( XDOC_LOGO_MIDDLE_URL_KEY ).trim() ); + transformer.setParameter( + "brand_name", + getProject().getProperty( XDOC_BRAND_NAME_KEY ).trim() ); + try + { + transformer.transform( xml, out ); + } + catch( Exception e ) + { + log( "ERROR: " + getRelToPath( newDest ) + " : " + e.getMessage() ); + throw new BuildException( + "Unable to transform document." ); + } + } + } + } + + private String getRelToPath( final File dir ) + { + final String basedir = m_BaseToDir.getAbsolutePath(); + final String curdir = dir.getAbsolutePath(); + return curdir.substring( basedir.length() ); + } + + private String getRelSrcPath( final File dir ) + { + final String basedir = m_BaseSrcDir.getAbsolutePath(); + final String curdir = dir.getAbsolutePath(); + return curdir.substring( basedir.length() ); + } + + + public class RegexpFilter + implements FileFilter + { + private Pattern m_Includes; + private Pattern m_Excludes; + + public RegexpFilter( final String includes, final String excludes ) + { + m_Includes = Pattern.compile( includes ); + m_Excludes = Pattern.compile( excludes ); + } + + public boolean accept( final File file ) + { + final String basename = file.getName(); + + if( basename.equals( ".svn" ) ) + return false; + + if( basename.equals( "CVS" ) ) + return false; + + if( file.isDirectory() ) + return true; + + final String fullpath = file.getAbsolutePath().replace( '\\', '/' ); + + Matcher m = m_Includes.matcher( fullpath ); + if( ! m.matches() ) + return false; + + m = m_Excludes.matcher( fullpath ); + return ! m.matches() ; + } + } + + private String getYear() + { + String year = getProject().getProperty( "magic.year" ); + if( year != null ) + { + return year; + } + else + { + Calendar cal = Calendar.getInstance(); + return Integer.toString( cal.get( Calendar.YEAR ) ); + } + } + + private String getOrganization() + { + return getProject().getProperty( ORG_NAME_KEY ); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]