dion 2004/07/18 07:20:03
Modified: plugin/src/plugin-test maven.xml plugin.jelly
plugin/xdocs navigation.xml
plugin project.xml plugin.jelly
Added: plugin/xdocs tags.xml
plugin/src/main/org/apache/maven/plugin PluginToTags.java
plugin/src/test plugin.jelly
plugin/src/test/org/apache/maven/plugin
PluginToTagsTest.java
Log:
Add the ability to generate a skeletal doc on the taglib(s) provided by plugins
Revision Changes Path
1.4 +1 -1 maven-plugins/plugin/src/plugin-test/maven.xml
Index: maven.xml
===================================================================
RCS file: /home/cvs/maven-plugins/plugin/src/plugin-test/maven.xml,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- maven.xml 6 Jul 2004 22:22:36 -0000 1.3
+++ maven.xml 18 Jul 2004 14:20:03 -0000 1.4
@@ -28,7 +28,7 @@
<assert:assertFileExists file="${maven.docs.src}"/>
- <u:tokenize var="fileList" delim=",">navigation.xml,goals.xml</u:tokenize>
+ <u:tokenize var="fileList"
delim=",">navigation.xml,goals.xml,properties.xml,tags.xml</u:tokenize>
<j:forEach var="file" items="${fileList}">
<assert:assertFileExists file="${maven.docs.src}/${file}"/>
1.4 +1 -0 maven-plugins/plugin/src/plugin-test/plugin.jelly
Index: plugin.jelly
===================================================================
RCS file: /home/cvs/maven-plugins/plugin/src/plugin-test/plugin.jelly,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- plugin.jelly 1 May 2004 17:15:33 -0000 1.3
+++ plugin.jelly 18 Jul 2004 14:20:03 -0000 1.4
@@ -20,6 +20,7 @@
<project>
+
<goal name="goal1"
description="Build a plugin jar and install to the maven.repo.local">
1.5 +1 -0 maven-plugins/plugin/xdocs/navigation.xml
Index: navigation.xml
===================================================================
RCS file: /home/cvs/maven-plugins/plugin/xdocs/navigation.xml,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- navigation.xml 1 May 2004 17:15:06 -0000 1.4
+++ navigation.xml 18 Jul 2004 14:20:03 -0000 1.5
@@ -27,6 +27,7 @@
<menu name="Overview">
<item href="/goals.html" name="Goals"/>
<item href="/properties.html" name="Properties"/>
+ <item href="/tags.html" name="Tags"/>
</menu>
</body>
</project>
1.1 maven-plugins/plugin/xdocs/tags.xml
Index: tags.xml
===================================================================
<document>
<properties>
<title>Plugin tags</title>
<author email="[EMAIL PROTECTED]">dIon Gillard</author>
</properties>
<body>
<section name='Overview'>
<p>The following tag libraries and tags are provided by this plugin.</p>
<ol>
<li><a href='#plugin_Tag_Library'>plugin</a>
<ol>
<li><a href='#uninstall_Tag'>uninstall</a></li>
<li><a href='#clearCache_Tag'>clearCache</a></li>
</ol>
</li>
<li><a href='#assert_Tag_Library'>assert</a>
<ol>
<li><a href='#assertFileExists_Tag'>assertFileExists</a></li>
<li><a href='#assertFileNotFound_Tag'>assertFileNotFound</a></li>
<li><a href='#assertEquals_Tag'>assertEquals</a></li>
</ol>
</li>
</ol>
</section>
<section name='plugin Tag Library'>
<subsection name='uninstall Tag'>
<p>
A tag to uninstall a given plugin from the various plugin directories,
including
<ol>
<li><code>${maven.plugin.dir}</code></li>
<li><code>${maven.plugin.user.dir}</code></li>
<li><code>${maven.plugin.unpacked.dir}</code></li>
</ol>
</p>
<table>
<tr><th>Attribute</th><th>Optional?</th><th>Description</th></tr>
<tr>
<td>name</td>
<td>No</td>
<td>Usually this is <code>${pom.artifactId}</code></td>
</tr>
</table>
</subsection>
<subsection name='clearCache Tag'>
<p>
Clears the files used for caching plugin goals, dependencies and
tag libraries from <code>${maven.plugin.unpacked.dir}</code>
</p>
<p>There are no attributes for this tag</p>
</subsection>
</section>
<section name='assert Tag Library'>
<p>
This tag library is typically used in testing plugins. And are
similar in usage to the assert methods in a JUnit test case.
</p>
<subsection name='assertFileExists Tag'>
<p>Fails the build if the given file does not exist, otherwise no effect.</p>
<table>
<tr><th>Attribute</th><th>Optional?</th><th>Description</th></tr>
<tr>
<td>file</td>
<td>No</td>
<td>The path of the file to be checked</td>
</tr>
<tr>
<td>msg</td>
<td>Yes</td>
<td>A message to be displayed when the file doesn't exist</td>
</tr>
</table>
</subsection>
<subsection name='assertFileNotFound Tag'>
<p>Fails the build if the given file does exist, otherwise no effect.</p>
<table>
<tr><th>Attribute</th><th>Optional?</th><th>Description</th></tr>
<tr>
<td>file</td>
<td>No</td>
<td>The path of the file to be checked</td>
</tr>
<tr>
<td>msg</td>
<td>Yes</td>
<td>A message to be displayed when the file doesn't exist</td>
</tr>
</table>
</subsection>
<subsection name='assertEquals Tag'>
<p>Fails the build if the two values are not equal, otherwise no effect.</p>
<table>
<tr><th>Attribute</th><th>Optional?</th><th>Description</th></tr>
<tr>
<td>expected</td>
<td>No</td>
<td>The expected value</td>
</tr>
<tr>
<td>value</td>
<td>No</td>
<td>The actual value</td>
</tr>
<tr>
<td>msg</td>
<td>Yes</td>
<td>A message to be displayed when the values aren't equal.</td>
</tr>
</table>
</subsection>
</section>
</body>
</document>
1.1
maven-plugins/plugin/src/main/org/apache/maven/plugin/PluginToTags.java
Index: PluginToTags.java
===================================================================
package org.apache.maven.plugin;
/*
* ====================================================================
* Copyright 2001-2004 The 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.
* ====================================================================
*/
import org.apache.commons.lang.StringUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class PluginToTags
{
/** plugin script */
private String pluginScript;
/** output file */
private String xdoc;
/**
* @return Returns the outputFile.
*/
public String getXdoc()
{
return xdoc;
}
/**
* @param outputFile
* The outputFile to set.
*/
public void setXdoc(String outputFile)
{
this.xdoc = outputFile;
}
/**
* @return Returns the pluginScript.
*/
public String getPluginScript()
{
return pluginScript;
}
/**
* @param pluginScript
* The plugin script to generate the docs from.
*/
public void setPluginScript(String pluginScript)
{
this.pluginScript = pluginScript;
}
/**
* Transform the plugin script to the output file. The output file will be
* in xdoc format.
*
* @throws IOException reading files
* @throws JDOMException on xml
*/
public void transform() throws JDOMException, IOException
{
File output = new File(getXdoc());
BufferedWriter bw = new BufferedWriter(new FileWriter((output)));
bw.write("<document>\n");
bw.write(" <properties>\n");
bw.write(" <title>Plugin tags</title>\n");
bw.write(" </properties>\n");
bw.write(" <body>\n");
List taglibs = getTaglibs();
writeOverview(bw, taglibs);
writeTaglibs(bw, taglibs);
bw.write(" </body>\n");
bw.write("</document>\n");
bw.close();
}
/**
* Write xdoc sections to the given writer for each taglib
* @param bw the writer
* @param taglibs a list of taglibs to output
* @throws IOException when there are errors writing
*/
private void writeTaglibs(BufferedWriter bw, List taglibs) throws IOException
{
for (Iterator taglibIter = taglibs.iterator(); taglibIter.hasNext();)
{
Map taglib = (Map) taglibIter.next();
bw.write(" <section name='" + taglib.get("uri") + " Tag Library'>\n");
List tagNames = (List)taglib.get("tagNames");
// write out subsection with name, description, attr, desc etc....
for (Iterator tagIter = tagNames.iterator(); tagIter.hasNext();)
{
String name = (String) tagIter.next();
bw.write(" <subsection name='" + name + " Tag'>\n");
bw.write(" <p>No description</p>\n");
bw.write(" <table>\n");
bw.write("
<tr><th>Attribute</th><th>Optional?</th><th>Description</th></tr>\n");
bw.write(" </table>\n");
bw.write(" </subsection>\n");
}
bw.write(" </section>\n");
}
}
/**
* Write an xdoc overview section for all taglibs
* @param bw the writer for output
* @param taglibs the taglibs to output
* @throws IOException when writing fails
*/
private void writeOverview(BufferedWriter bw, List taglibs) throws IOException
{
bw.write(" <section name='Overview'>\n");
bw.write(" <p>The following tag libraries and tags are provided by this
plugin.</p>\n");
bw.write(" <ol>\n");
for (Iterator taglibIter = taglibs.iterator(); taglibIter.hasNext();)
{
Map taglib = (Map) taglibIter.next();
String title = taglib.get("uri") + " Tag Library";
String linkStart = "<a href='#" + StringUtils.replace(title, " ", "_")
+ "'>";
bw.write(" <li>" + linkStart + taglib.get("uri") + "</a>\n");
bw.write(" <ol>\n");
List tagNames = (List)taglib.get("tagNames");
for (Iterator tagIter = tagNames.iterator(); tagIter.hasNext();)
{
String name = (String) tagIter.next();
bw.write(" <li><a href='#" + name + "_Tag'>" + name +
"</a></li>\n");
}
bw.write(" </ol>\n");
bw.write(" </li>\n");
}
bw.write(" </ol>\n");
bw.write(" </section>\n");
}
/**
* @return a list of tag libraries. Each element in the list
* is a [EMAIL PROTECTED] Map}. Each map contains an entry for "uri" (as a
String)
* and one for tagNames (as a List).
*
* @throws IOException reading files
* @throws JDOMException on xml
*/
public List getTaglibs() throws JDOMException, IOException
{
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File(getPluginScript()));
XPath xpath = XPath.newInstance("/project/define:taglib");
List taglibElements = xpath.selectNodes(doc);
List taglibs = new LinkedList();
for (Iterator iter = taglibElements.iterator(); iter.hasNext();)
{
Element element = (Element) iter.next();
Map taglib = new HashMap();
taglib.put("uri", element.getAttributeValue("uri"));
taglib.put("tagNames", new LinkedList());
XPath tagsXp = XPath.newInstance("define:tag|define:jellybean");
List tagsElements = tagsXp.selectNodes(element);
for (Iterator tagsIter = tagsElements.iterator(); tagsIter.hasNext();)
{
Element tagsElement = (Element) tagsIter.next();
((List)
taglib.get("tagNames")).add(tagsElement.getAttributeValue("name"));
}
taglibs.add(taglib);
}
return taglibs;
}
}
1.1 maven-plugins/plugin/src/test/plugin.jelly
Index: plugin.jelly
===================================================================
<?xml version="1.0"?>
<!--
/*
* Copyright 2001-2004 The 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.
*/
-->
<project xmlns:define="jelly:define"
xmlns:j="jelly:core"
xmlns:jsl="jelly:jsl"
xmlns:log="jelly:log"
xmlns:maven="jelly:maven"
xmlns:pom="pom"
xmlns:util="jelly:util"
xmlns:x="jelly:xml"
xmlns:velocity="jelly:velocity"
xmlns:doc="doc">
<j:new var="reports" className="java.util.ArrayList"/>
<define:taglib uri="doc">
<define:tag name="deregisterReport">
<!-- @name : Report to deregister, must be same as name used to register -->
<maven:pluginVar var="reports" plugin="maven-xdoc-plugin" property="reports" />
<j:set var="removeRpt" value="null"/>
<j:forEach var="rpt" items="${reports}">
<j:if test="${rpt.get('name').equals(name)}">
<j:set var="removeRpt" value="${rpt}"/>
</j:if>
</j:forEach>
<j:if test="${removeRpt != null}">
<j:set var="dummy" value="${reports.remove(removeRpt)}"/>
</j:if>
</define:tag>
<define:tag name="registerReport">
<!--
@name the name of this report. Used for navigation items
@pluginName the name of the plugin. @plugin:report goal must exist
@description text description of report
@link the nav-bar link for this report
@target the target for the new page (_self, _blank, ...)
-->
<maven:pluginVar var="reports" plugin="maven-xdoc-plugin" property="reports" />
<!-- check if the given name is in the list already -->
<j:set var="add" value="true"/>
<j:forEach var="rpt" items="${reports}">
<j:if test="${rpt.get('name').equals(name)}">
<j:set var="add" value="false"/>
</j:if>
</j:forEach>
<j:if test="${add.equals('true')}">
<j:new var="report" className="java.util.HashMap"/>
<j:set var="dummy">
${report.put('name', name)}
${report.put('pluginName', pluginName)}
${report.put('description', description)}
${report.put('link', link)}
${report.put('externalLink', externalLink)}
${report.put('target', target)}
${reports.add(report)}
</j:set>
</j:if>
</define:tag>
<define:tag name="formatAsNumber">
<!--
| @string
| @pattern
-->
<!-- This appears to need to be here which is no good. Need
more of a global tool box.
-->
<j:useBean var="formatter" class="org.apache.maven.util.DVSLFormatter"/>
${formatter.formatNumber(string,pattern)}
</define:tag>
<define:tag name="jslFile">
<!--
| Basic tag for performing arbitrary jsl transformations
| on arbitrary jsl inputs.
| @input (optional)
| @output
| @stylesheet
| @encoding
| @omitXmlDeclaration
| @outputMode
| @prettyPrint
-->
<!-- Set default encoding if not set. -->
<j:if test="${encoding == null}">
<j:set var="encoding"
value="${plugin.getVariable('maven.docs.outputencoding')}"/>
</j:if>
<j:if test="${input != null}">
<util:file name="${input}" var="inputFile" />
<x:parse var="doc" xml="${inputFile}"/>
</j:if>
<j:set var="stylesheetURI" value="file:${stylesheet}"/>
<j:file
name="${output}"
encoding="${encoding}"
omitXmlDeclaration="${omitXmlDeclaration}"
outputMode="${outputMode}"
prettyPrint="${prettyPrint}">
<j:include uri="${stylesheetURI.toString()}"/>
</j:file>
</define:tag>
<define:tag name="jsl">
<!--
| This tag has a lot of defaults suitable for transforming
| documents easily. See jslCore for a tag suitable for
| transforming documents how you want.
| @input
| @outputDirectory - Will be placed under ${maven.gen.docs}
| @stylesheet
| @encoding - defaults to ${maven.docs.outputencoding}
| @omitXmlDeclaration - defaults to ${maven.docs.omitXmlDeclaration}
| @outputMode
| @prettyPrint
-->
<!--
@todo make sure the output directory exists.
-->
<!-- Set default outputDirectory if not set. -->
<j:if test="${empty(outputDirectory)}">
<j:set var="outputDirectory" value="${maven.gen.docs}"
/>
</j:if>
<!-- Set default encoding if not set. -->
<j:if test="${encoding == null}">
<j:set var="encoding" value="${maven.docs.outputencoding}" />
</j:if>
<j:if test="${omitXmlDeclaration == null}">
<j:set var="omitXmlDeclaration" value="${maven.docs.omitXmlDeclaration}"/>
</j:if>
<mkdir dir="${outputDirectory}"/>
<doc:jslFile
input="${input}"
output="${outputDirectory}/${output}"
stylesheet="${stylesheet}"
encoding="${encoding}"
omitXmlDeclaration="${omitXmlDeclaration}"
outputMode="${outputMode}"
prettyPrint="${prettyPrint}"/>
</define:tag>
<!--
@link
@relativePath
@name
@img
@state - expanded / collapsed / none
@target
-->
<define:tag name="itemLink">
<x:element name="a">
<x:attribute
name="href">${pathTool.calculateLink(link,relativePath)}</x:attribute>
<j:choose>
<j:when test="${target != null and target.equals('_blank')}">
<x:attribute name="class">newWindow</x:attribute>
<x:attribute name="title">New Window</x:attribute>
</j:when>
<j:when test="${link.startsWith('http')}">
<x:attribute name="class">externalLink</x:attribute>
<x:attribute name="title">External Link</x:attribute>
</j:when>
</j:choose>
<j:if test="${!empty(target)}">
<x:attribute name="target">${target}</x:attribute>
</j:if>
<j:if test="${empty(state)}"><j:set var="state" value="none"/></j:if>
<j:if test="${empty(img)}">${name}</j:if>
<j:if test="${!empty(img)}"><img style="border: 1px"
src="${pathTool.calculateLink(img,relativePath)}" title="${name}"
alt="${name}"/></j:if>
</x:element>
</define:tag>
<define:tag name="text-xdoc">
<!--
@output - The output file
@title - Title for page
@section - Section heading
@encoding - The XML encoding
@preamble - Placed in paragraph block prior to text
@inputText - Will be wrapped in a CDATA, will not escape CDATA tags (as yet)
@inputFile - Will be read in and wrapped in CDATA. Overrides inputText if set
-->
<j:set var="inputFile">${inputFile}</j:set>
<j:if test="${inputFile != ''}">
<util:file name="${inputFile}" var="inputFileObject"/>
<util:loadText var="inputText" file="${inputFileObject}"/>
</j:if>
<!-- Set default encoding if not set. -->
<j:if test="${encoding == null}">
<j:set var="encoding"
value="${plugin.getVariable('maven.docs.outputencoding')}"/>
</j:if>
<j:file name="${output}" prettyPrint="false" encoding="${encoding}">
<document>
<properties><title>${title}</title></properties>
<body>
<section name="${section}">
<p>${preamble}</p>
<source>
<![CDATA[${inputText}]]>
</source>
</section>
</body>
</document>
</j:file>
</define:tag>
<!-- Alternator for row style in a table -->
<define:tag name="printRow">
<j:if test="${(count % 2) gt 0}">
<x:element name="tr">
<x:attribute name="class">a</x:attribute>
</x:element>
</j:if>
<j:if test="${(count % 2) le 0}">
<x:element name="tr">
<x:attribute name="class">b</x:attribute>
</x:element>
</j:if>
</define:tag>
<!-- Generates the JSL files on the given srcdir attribute -->
<define:tag name="performJSL">
<util:file var="srcdirFile" name="${srcdir}"/>
<j:set var="srcdir" value="${srcdirFile.getCanonicalPath()}"/>
<util:file var="destdirFile" name="${destdir}"/>
<j:set var="destdir" value="${destdirFile.getCanonicalPath()}"/>
<util:replace var="fromPattern" oldChar="\" newChar="/"
value="${srcdir}/*.xml"/>
<util:replace var="toPattern" oldChar="\" newChar="/"
value="${destdir}/*.html"/>
<j:if test="${mapper == null}">
<j:new var="mapper"
className="org.apache.maven.util.CaseInsensitiveGlobPatternMapper"/>
</j:if>
<j:setProperties object="${mapper}" from="${fromPattern}" to="${toPattern}"/>
<util:replace var="fromDirPattern" oldChar="\" newChar="/" value="${srcdir}*"/>
<util:replace var="toDirPattern" oldChar="\" newChar="/" value="${destdir}*"/>
<j:new var="dirMapper"
className="org.apache.maven.util.CaseInsensitiveGlobPatternMapper"/>
<j:setProperties object="${dirMapper}" from="${fromDirPattern}"
to="${toDirPattern}"/>
<fileScanner var="docFiles">
<fileset dir="${srcdir}">
<patternset>
<exclude name="**/project.xml"/>
<exclude name="**/template.xml"/>
<exclude name="**/navigation.xml"/>
<exclude name="changes.xml"/>
<include name="**/*.xml"/>
</patternset>
</fileset>
</fileScanner>
<!-- determine nav file to be used:- 1. check for sitewide nav files -->
<!-- supplied nav file as project.xml in stylesheets dir -->
<util:available file="${maven.docs.src}/stylesheets/project.xml">
<util:file var="siteNavFile"
name="${maven.docs.src}/stylesheets/project.xml"/>
</util:available>
<!-- supplied nav file as project.xml in root of xdocs source tree -->
<util:available file="${maven.docs.src}/project.xml">
<util:file var="siteNavFile" name="${maven.docs.src}/project.xml"/>
</util:available>
<!-- supplied navigation file in root of xdocs source tree -->
<util:available file="${maven.docs.src}/navigation.xml">
<util:file var="siteNavFile" name="${maven.docs.src}/navigation.xml"/>
</util:available>
<!-- navigation file that was generated -->
<util:available file="${maven.gen.docs}/navigation.xml">
<util:file var="siteNavFile" name="${maven.gen.docs}/navigation.xml"/>
</util:available>
<!-- hold onto maven.docs.src for later -->
<util:file var="docsSrcFile" name="${maven.docs.src}"/>
<!-- parse the project nav. Someone jellier than me can remove the temp file
requirement -->
<maven:pluginVar var="reports" plugin="maven-xdoc-plugin" property="reports" />
<util:file var="tempnav" name="${maven.build.dir}/project-nav.xml"/>
<j:file name="${tempnav.toString()}" outputMode="xml">
<j:import file="${plugin.resources}/navigation.jelly" inherit="true"/>
</j:file>
<x:parse var="projectNavRoot" xml="${tempnav}"/>
<x:set var="projectNav" select="$projectNavRoot/project"/>
<j:forEach var="file" items="${docFiles.iterator()}">
<util:replace var="inDirForward" oldChar="\" newChar="/"
value="${file.parent}"/>
<j:set var="outDir" value="${dirMapper.mapFileName(inDirForward).0}"/>
<mkdir dir="${outDir}"/>
<!-- generate output file name -->
<util:replace var="outFileForward" oldChar="\" newChar="/"
value="${file.toString()}"/>
<j:set var="outFile" value="${mapper.mapFileName(outFileForward).0}"/>
<echo>Generating ${outFile} from ${file}</echo>
<!-- work out relative path -->
<util:replace var="docsForward" oldChar="\" newChar="/" value="${srcdir}"/>
<j:if test="${pathTool == null}">
<j:useBean var="pathTool" class="org.apache.maven.util.DVSLPathTool"/>
</j:if>
<j:set var="relativePath" value="${pathTool.getRelativePath(docsForward,
outFileForward)}"/>
<!-- determine nav file to be used: 2. check for nav file -->
<!-- in the same directory as xml file being processed -->
<!-- if no such nav file available use sitewide nav file -->
<j:set var="navFile" value="${siteNavFile}" />
<util:available file="${file.parentFile.absoluteFile}/navigation.xml">
<!-- dont use current directory navigation.xml if it's in maven.docs.src
-->
<j:if test="${!(file.parentFile.equals(docsSrcFile))}">
<util:file var="navFile"
name="${file.parentFile.absoluteFile}/navigation.xml"/>
</j:if>
</util:available>
<!-- parse nav and make it available to the stylesheet -->
<x:parse var="navXML" xml="${navFile}"/>
<x:set var="nav" select="$navXML/project"/>
<!-- parse the doc and pass it to the stylesheet -->
<x:parse var="doc" xml="${file}"/>
<j:file name="${outFile}" encoding="${outputencoding}"
omitXmlDeclaration="true" outputMode="xml"
prettyPrint="no">
<j:include uri="${stylesheet.toString()}"/>
</j:file>
</j:forEach>
</define:tag>
<define:tag name="jslToSite">
<!--
| transforms files in the given dir using the site stylesheet and
navigation and place them
| in maven.docs.dest (typically target/docs)
| @srcdir source directory
-->
<maven:param-check value="${srcdir}" fail="true" message="'srcdir' must be
specified"/>
<maven:pluginVar var="maven.xdoc.jsl"
plugin='maven-xdoc-plugin' property='maven.xdoc.jsl' />
<!-- copy old value for restoring it later -->
<j:set var="previous.plugin.resources" value="${plugin.resources}" />
<maven:pluginVar var="plugin.resources"
plugin='maven-xdoc-plugin' property='plugin.resources' />
<maven:pluginVar var="includeProjectDocumentation"
plugin='maven-xdoc-plugin' property='maven.xdoc.includeProjectDocumentation'
/>
<maven:pluginVar var="maven.xdoc.poweredby.image"
plugin='maven-xdoc-plugin' property='maven.xdoc.poweredby.image' />
<maven:pluginVar var="maven.xdoc.poweredby.title"
plugin='maven-xdoc-plugin' property='maven.xdoc.poweredby.title' />
<maven:pluginVar var="maven.xdoc.poweredby.url"
plugin='maven-xdoc-plugin' property='maven.xdoc.poweredby.url' />
<maven:pluginVar var="maven.xdoc.crumb.separator"
plugin='maven-xdoc-plugin' property='maven.xdoc.crumb.separator' />
<j:set var="outputDirectory" value="${maven.gen.docs}" />
<j:set var="stylesheet" value="file:${plugin.resources}/site.jsl" />
<j:set var="outputencoding" value="${maven.docs.outputencoding}" />
<doc:performJSL srcdir="${srcdir}" destdir="${maven.docs.dest}" />
<!-- restore plugin.resources -->
<j:set var="plugin.resources" value="${previous.plugin.resources}" />
</define:tag>
<!--
| escapes a string for generating a valid name token (need for "name" attribute
in html anchors)
| @value given token
-->
<define:tag name="escapeNameToken">
<j:invokeStatic var="escapedtoken"
className="org.apache.commons.lang.StringUtils" method="replaceChars">
<j:arg type="java.lang.String" value="${value}"
useContextClassLoader="true"/>
<j:arg type="java.lang.String" value=" .,;!?/'\()[]{}+*°"
useContextClassLoader="true"/>
<j:arg type="java.lang.String" value="__________________"
useContextClassLoader="true"/>
</j:invokeStatic>${escapedtoken}</define:tag>
</define:taglib>
<!-- ================================================================== -->
<!-- P R O J E C T D O C U M E N T A T I O N -->
<!-- ================================================================== -->
<goal name="xdoc"
prereqs="xdoc:generate-from-pom, xdoc:transform"
description="Generate html project documentation xdoc sources"/>
<goal name="xdoc:init"
description="Generates the directory structure required for xdocs">
<mkdir dir="${maven.gen.docs}"/>
<mkdir dir="${maven.docs.dest}"/>
</goal>
<goal
name="xdoc:generate-from-pom"
prereqs="xdoc:init, xdoc:register-reports"
description="Generates xdocs for site based on project descriptor">
<echo>Generating xdocs from POM ... </echo>
<util:tokenize var="pomDocuments"
delim=",">${maven.xdoc.pomDocuments}</util:tokenize>
<!-- All the templates use $project for now. -->
<j:set var="project" value="${pom}"/>
<maven:pluginVar var="reports" plugin="maven-xdoc-plugin" property="reports" />
<!-- Does the user want the maven-generated docs on their site? -->
<j:set
var="includeProjectDocumentation"
value="${maven.xdoc.includeProjectDocumentation}"/>
<!-- Need the escaper to html output. -->
<j:useBean var="escape" class="org.apache.velocity.anakia.Escape"/>
<j:useBean var="files" class="org.apache.velocity.texen.util.FileUtil"/>
<!-- Need to enrich information about dependency by taking some information from
its POM. -->
<j:useBean var="dependencyDescriber"
class="org.apache.maven.DependencyDescriberBean"/>
${dependencyDescriber.build(pom)}
<j:if test="${encoding == null}">
<j:set
var="encoding"
value="${maven.docs.outputencoding}"
/>
</j:if>
<j:forEach var="pomDocument" items="${pomDocuments}">
<!-- If the template ends with ".xml" use velocity to generate the
HTML. If it ends with ".jelly" use JSL. -->
<j:choose>
<j:when test="${pomDocument.endsWith('.xml')}">
<velocity:merge
name="${maven.gen.docs}/${pomDocument}"
basedir="${plugin.resources}/templates"
template="${pomDocument}"
inputEncoding="${encoding}"
outputEncoding="${encoding}"
/>
</j:when>
<j:when test="${pomDocument.endsWith('.jelly')}">
<doc:jslFile
output="${maven.gen.docs}/${pomDocument.substring(0,pomDocument.indexOf('.jelly'))}.xml"
stylesheet="${plugin.resources}/templates/${pomDocument}"
outputMode="xml"
prettyPrint="true"/>
</j:when>
<j:otherwise>
<fail>Unknown report format for report [${pomDocument}].</fail>
</j:otherwise>
</j:choose>
</j:forEach>
</goal>
<!-- ================================================================== -->
<!-- V A L I D A T E X D O C S -->
<!-- ================================================================== -->
<!-- validate xdocs -->
<goal name="xdoc:validate" prereqs="pom:taglib"
description="Validate xdocs match the schema">
<available file="${maven.docs.src}" type="dir"
property="maven.docs.src.available"/>
<j:if test="${maven.docs.src.available}">
<fileScanner var="navFiles">
<fileset dir="${maven.docs.src}">
<patternset>
<include name="**/navigation.xml"/>
</patternset>
</fileset>
</fileScanner>
<j:forEach var="file" items="${navFiles.iterator()}">
<echo>Validating ${file}</echo>
<pom:validate validator="${maven.home}/maven-navigation-1.0.xsd"
projectDescriptor="${file}"/>
</j:forEach>
</j:if>
</goal>
<!-- ================================================================== -->
<!-- C O P Y R E S O U R C E S -->
<!-- ================================================================== -->
<!-- copy resources needed for xdocs -->
<goal name="xdoc:copy-resources"
prereqs="xdoc:init"
description="copy static resources for use in xdocs generated html">
<!-- Read in the ui properties. -->
<util:properties uri="file:${plugin.resources}/ui.properties"
var="uiProperties"/>
<!-- Copy maven supplied stylesheets. -->
<copy todir="${maven.docs.dest}/style" overwrite="yes" filtering="yes">
<fileset dir="${plugin.resources}/css">
<include name="**/*.css"/>
</fileset>
<filterset>
<j:forEach var="uiProperty" items="${uiProperties.keys()}">
<util:replace var="token" oldChar="." newChar="_" value="${uiProperty}"/>
<j:set var="token" value="${token.substring(6).toUpperCase()}"/>
<!-- Check if User has overidden this property -->
<j:set var="propertyName" value="${uiProperty}" />
<j:set var="propertyValue" value="${context.getVariable(propertyName)}"/>
<j:choose>
<j:when test="${propertyValue != null}">
<!-- Use user's properties -->
<filter token="${token}" value="${propertyValue}"/>
</j:when>
<j:otherwise>
<!-- Use plugin's default properties -->
<filter token="${token}"
value="${uiProperties.getProperty(uiProperty)}"/>
</j:otherwise>
</j:choose>
</j:forEach>
</filterset>
</copy>
<!-- Copy maven supplied images. -->
<copy todir="${maven.docs.dest}/images" overwrite="yes" filtering="no">
<fileset dir="${plugin.resources}/images">
<include name="**/*.gif"/>
<include name="**/*.jpeg"/>
<include name="**/*.jpg"/>
<include name="**/*.png"/>
</fileset>
</copy>
</goal>
<!-- ================================================================== -->
<!-- C O P Y U S E R S U P P L I E D R E S O U R C E S -->
<!-- ================================================================== -->
<!-- copy user resources -->
<goal name="xdoc:copy-user-resources"
prereqs="xdoc:init"
description="Copy user provided resources to docs destination">
<j:if test="${maven.docs.src.available}">
<!-- Copy user supplied resources -->
<copy todir="${maven.docs.dest}" filtering="no">
<fileset dir="${maven.docs.src}">
<exclude name="**/*.xml"/>
<exclude name="**/*.fml"/>
<exclude name="**/CVS/*"/>
<exclude name="stylesheets/*"/>
</fileset>
<!-- copy file in generated docs folder: this allows for reporting plugins
to add images -->
<fileset dir="${maven.gen.docs}">
<exclude name="**/*.xml"/>
<exclude name="**/CVS/*"/>
<exclude name="stylesheets/*"/>
</fileset>
</copy>
<util:available file="${maven.docs.src}/stylesheets">
<!-- Copy user supplied stylesheets, can override maven -->
<copy todir="${maven.docs.dest}/style" overwrite="true" filtering="no">
<fileset dir="${maven.docs.src}/stylesheets">
<include name="**/*.css"/>
</fileset>
</copy>
</util:available>
</j:if>
</goal>
<!-- ================================================================== -->
<!-- D V S L D O C U M E N T A T I O N -->
<!-- ================================================================== -->
<goal name="xdoc:transform"
prereqs="xdoc:init"
description="Generate html project documentation xdoc sources">
<tstamp>
<format property="mavenCurrentYear" pattern="yyyy"/>
</tstamp>
<!-- Use jelly utils here -->
<available
file="${maven.gen.docs}"
type="dir"
property="maven.gen.docs.available"
/>
<available
file="${maven.docs.src}"
type="dir"
property="maven.docs.src.available"
/>
<!-- use JSL in Jelly to build the documenation -->
<attainGoal name="xdoc:copy-resources"/>
<attainGoal name="xdoc:copy-user-resources"/>
<attainGoal name="xdoc:jelly-transform"/>
</goal>
<!-- ================================================================== -->
<!-- J E L L Y D O C U M E N T A T I O N -->
<!-- ================================================================== -->
<goal name="xdoc:jelly-init" description="Set up jelly xdoc requirements">
<!-- moving here temporarily -->
<tstamp>
<format property="mavenCurrentYear" pattern="yyyy"/>
</tstamp>
<tstamp>
<format property="build.date" pattern="${maven.xdoc.date.format}"
locale="${maven.xdoc.date.locale}"/>
</tstamp>
</goal>
<goal name="xdoc:register-reports">
<!--
| We need to have each <report> register itself with us so we can
| build up our navbar. To do this, we call the plugin:register
| goal on each report plugin.
|-->
<j:if test="${!pom.reports.isEmpty()}">
<j:forEach var="report" items="${pom.reports}">
<attainGoal name="${report}:register"/>
</j:forEach>
</j:if>
<!-- If the descriptor is empty, use these as defaults -->
<j:if test="${pom.reports.isEmpty()}">
<attainGoal name="maven-jdepend-plugin:register"/>
<attainGoal name="maven-checkstyle-plugin:register"/>
<attainGoal name="maven-changes-plugin:register"/>
<attainGoal name="maven-changelog-plugin:register"/>
<attainGoal name="maven-developer-activity-plugin:register"/>
<attainGoal name="maven-file-activity-plugin:register"/>
<attainGoal name="maven-license-plugin:register"/>
<attainGoal name="maven-javadoc-plugin:register"/>
<attainGoal name="maven-jxr-plugin:register"/>
<attainGoal name="maven-junit-report-plugin:register"/>
<attainGoal name="maven-linkcheck-plugin:register"/>
<attainGoal name="maven-tasklist-plugin:register"/>
</j:if>
</goal>
<goal name="xdoc:jelly-transform"
prereqs="xdoc:init, xdoc:jelly-init, xdoc:register-reports"
description="transform xdocs using jelly/jsl rather than dvsl">
<j:set var="destdir" value="${maven.docs.dest}"/>
<j:set var="outputencoding" value="${maven.docs.outputencoding}"/>
<!-- need to parse navigation into $nav -->
<!-- mapper for determining output file name -->
<j:new var="mapper"
className="org.apache.maven.util.CaseInsensitiveGlobPatternMapper"/>
<!-- path tool for relative processing -->
<j:useBean var="pathTool" class="org.apache.maven.util.DVSLPathTool"/>
<!-- tool for loading resources from the class loader -->
<j:useBean class="org.apache.maven.util.ResourceBean" var="resourceTool"/>
<!-- determine which stylesheet to use -->
<j:set var="stylesheet" value="${maven.xdoc.jsl}"/>
<j:if test="${empty(stylesheet)}">
<j:set var="stylesheet"
value="${resourceTool.findResource('plugin-resources/site.jsl')}"/>
<j:if test="${empty(stylesheet)}">
<log:warn>Could not load the JSL stylesheet 'site.jsl' on the
classpath</log:warn>
<j:set var="stylesheet" value="./site.jsl"/>
</j:if>
</j:if>
<util:available file="${maven.gen.docs}">
<log:info>About to use JSL stylesheet ${stylesheet}</log:info>
<!-- perform JSL on generated docs -->
<doc:performJSL srcdir="${maven.gen.docs}" destdir="${maven.docs.dest}"/>
</util:available>
<!-- perform JSL on user provided docs -->
<j:if test="${maven.docs.src.available}">
<log:info>
Transforming user supplied documentation.
</log:info>
<doc:performJSL srcdir="${maven.docs.src}" destdir="${maven.docs.dest}"/>
</j:if>
</goal>
<!--
! This is required as the linkchecker runs as a final pass over the generated
! document tree.
! FIXME: Why isn't this in linkcheck?
!-->
<goal name="xdoc:performJSL"
description="Allows the LinkCheck plugin to xdoc a single directory">
<maven:pluginVar var="maven.xdoc.src" plugin="maven-linkcheck-plugin"
property="maven.xdoc.src" />
<doc:performJSL
srcdir="${maven.xdoc.src}"
destdir="${maven.docs.dest}"/>
</goal>
<goal name="xdoc:dump-report-settings">
<echo>Dumping report settings</echo>
<maven:pluginVar var="reports" plugin="maven-xdoc-plugin" property="reports" />
<j:forEach var="report" items="${reports}">
<echo>Report: ${report}</echo>
</j:forEach>
</goal>
</project>
1.45 +33 -0 maven-plugins/plugin/project.xml
Index: project.xml
===================================================================
RCS file: /home/cvs/maven-plugins/plugin/project.xml,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -r1.44 -r1.45
--- project.xml 15 Jul 2004 00:17:52 -0000 1.44
+++ project.xml 18 Jul 2004 14:20:03 -0000 1.45
@@ -92,6 +92,12 @@
</developers>
<dependencies>
<dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.0</version>
+ <url>http://jakarta.apache.org/commons/lang/</url>
+ </dependency>
+ <dependency>
<groupId>commons-jelly</groupId>
<artifactId>commons-jelly-tags-xml</artifactId>
<version>20040613.030723</version>
@@ -102,5 +108,32 @@
<artifactId>commons-jelly-tags-interaction</artifactId>
<version>20030211.143817</version>
</dependency>
+ <dependency>
+ <groupId>jdom</groupId>
+ <artifactId>jdom</artifactId>
+ <version>b10</version>
+ </dependency>
+ <dependency>
+ <groupId>saxpath</groupId>
+ <artifactId>saxpath</artifactId>
+ <version>1.0-FCS</version>
+ </dependency>
+ <dependency>
+ <groupId>jaxen</groupId>
+ <artifactId>jaxen</artifactId>
+ <version>1.0-FCS-full</version>
+ </dependency>
+ <dependency>
+ <groupId>xml-apis</groupId>
+ <artifactId>xml-apis</artifactId>
+ <version>1.0.b2</version>
+ <url>http://xml.apache.org/xerces2-j/</url>
+ </dependency>
+ <dependency>
+ <id>xerces</id>
+ <version>2.4.0</version>
+ <url>http://xml.apache.org/xerces2-j/</url>
+ </dependency>
</dependencies>
</project>
+
1.43 +38 -0 maven-plugins/plugin/plugin.jelly
Index: plugin.jelly
===================================================================
RCS file: /home/cvs/maven-plugins/plugin/plugin.jelly,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -r1.42 -r1.43
--- plugin.jelly 11 Jul 2004 00:57:59 -0000 1.42
+++ plugin.jelly 18 Jul 2004 14:20:03 -0000 1.43
@@ -93,6 +93,7 @@
<attainGoal name="plugin:generate-navigation" />
<attainGoal name="plugin:generate-goals" />
<attainGoal name="plugin:generate-properties" />
+ <attainGoal name="plugin:generate-tags" />
</goal>
<!-- generate a skeletal navigation.xml for the plugin specified
@@ -198,6 +199,43 @@
</j:if>
</goal>
+ <!-- generate a skeletal tags.xml for the plugin specified -->
+ <goal name="plugin:generate-tags"
+ description="Generate tags.xml for the plugin">
+
+ <j:set var="skip" value="false" />
+ <j:set var="fileName">${maven.docs.src}/tags.xml</j:set>
+ <u:available file="${fileName}">
+ <echo>Skipping file as '${fileName}' already exists</echo>
+ <j:set var="skip" value="true" />
+ </u:available>
+
+ <j:if test="${!skip}">
+ <j:set var="pluginScript" value="false" />
+ <u:available file="${basedir}/plugin.jelly">
+ <j:set var="pluginScript" value="true" />
+ </u:available>
+
+ <mkdir dir="${maven.docs.src}" />
+
+ <j:if test="${!pluginScript}">
+ <!-- no plugin.jelly - generate a file for empty goals -->
+ <echo>No plugin.jelly, not generating tags.xml</echo>
+ </j:if>
+
+ <j:if test="${pluginScript}">
+ <echo>Generating file '${fileName}'</echo>
+ <!-- generate docs based on plugin.jelly -->
+ <j:useBean class="org.apache.maven.plugin.PluginToTags"
+ pluginScript="${basedir}/plugin.jelly"
+ xdoc="${fileName}"
+ var="xformer"/>
+ ${xformer.transform()}
+ </j:if>
+
+ </j:if>
+ </goal>
+
<goal name="plugin:download" description="download and install a plugin from a
remote repo" prereqs="plugin:download-artifact">
<plugin:uninstall name="${artifactId}" />
<u:file var="localPlugin"
name="${maven.plugin.dir}/${artifactId}-${version}.jar" />
1.1
maven-plugins/plugin/src/test/org/apache/maven/plugin/PluginToTagsTest.java
Index: PluginToTagsTest.java
===================================================================
package org.apache.maven.plugin;
/*
* ====================================================================
* Copyright 2001-2004 The 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.
* ====================================================================
*/
import junit.framework.TestCase;
import org.jdom.JDOMException;
import java.io.File;
import java.io.IOException;
import java.util.Map;
/**
* @author Dion Gillard
*/
public class PluginToTagsTest extends TestCase
{
private static final String basedir = System.getProperty("basedir");
/**
* test the right taglibs are found
* @throws JDOMException
* @throws IOException
*/
public void testTaglibs() throws JDOMException, IOException
{
PluginToTags instance = new PluginToTags();
testBasedir();
instance.setPluginScript(basedir + "/src/test/plugin.jelly");
assertEquals("wrong number of taglibs", 1, instance.getTaglibs().size());
Map taglib = (Map)instance.getTaglibs().get(0);
assertEquals("bad taglib uri", "doc", taglib.get("uri"));
}
/**
* test that basedir is passed in
*/
public void testBasedir()
{
assertNotNull("no basedir", basedir);
}
/**
* test the taglibs are written as a file
* @throws JDOMException
* @throws IOException
*/
public void testTransform() throws JDOMException, IOException
{
PluginToTags instance = new PluginToTags();
testBasedir();
instance.setPluginScript(basedir + "/src/test/plugin.jelly");
instance.setXdoc(basedir + "/target/tags.xml");
instance.transform();
File outputFile = new File(instance.getXdoc());
assertTrue("xdoc not generated", outputFile.exists());
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]