jmitchell 2003/03/28 21:51:41 Added: contrib/tag-doc build.xml contrib/tag-doc/src/resources/taglibreport index.xsl overview-frame.xsl stylesheet.css taglib-report.xsl contrib/tag-doc/src/resources/taglibdoc all-tags.xsl index.xsl overview-frame.xsl stylesheet.css tag-frame.xsl taglib-frame.xsl taglib-summary.xsl contrib/tag-doc/src/java/org/apache/struts/taskdefs EnhMatchingTask.java TaglibDoc.java TaglibReport.java Util.java Log: Initial checkin. New contribution from Mohan Kishore. See [ANN] on struts-users list for details. Revision Changes Path 1.1 jakarta-struts/contrib/tag-doc/build.xml Index: build.xml =================================================================== <project name="TaglibDoc" default="compile" basedir="."> <!-- Load local and user build preferences --> <property file="${user.home}/build.properties"/> <property file="../build.properties"/> <property file="build.properties"/> <property name="src.dir" value="src"/> <property name="classes.dir" value="classes"/> <property name="dist.dir" value="dist"/> <property name="dist.jar" value="${dist.dir}/taglib-docs.jar"/> <property name="java.dir" value="${src.dir}/java"/> <property name="resources.dir" value="${src.dir}/resources"/> <property name="target.dir" value="target"/> <property name="taglibdoc.dir" value="${target.dir}/taglibdoc"/> <property name="taglibreport.dir" value="${target.dir}/taglibreport"/> <!-- This is the doc directoy relative to the jakarta-struts directory from here --> <property name="struts.doc.dir" value="../../doc"/> <property name="xml.dir" value="${struts.doc.dir}/userGuide"/> <!-- Compilation Classpath --> <path id="compile.classpath"> <pathelement location="${classes.dir}"/> <pathelement location="${ant.jar}"/> </path> <target name="init"> <mkdir dir="${classes.dir}"/> <mkdir dir="${dist.dir}"/> </target> <target name="compile" depends="init"> <javac srcdir="${java.dir}" destdir="${classes.dir}" > <classpath refid="compile.classpath"/> </javac> </target> <target name="dist" depends="compile"> <copy todir="${classes.dir}/resources"> <fileset dir="${resources.dir}"/> </copy> <jar jarfile="${dist.jar}" basedir="${classes.dir}" includes="**" /> </target> <target name="taglibdoc" depends="dist"> <taskdef name="taglibdoc" classname="org.apache.struts.taskdefs.TaglibDoc"> <classpath path="${dist.jar}"/> </taskdef> <taglibdoc destdir="${taglibdoc.dir}"> <fileset dir="${xml.dir}"> <include name="struts-*.xml"/> </fileset> </taglibdoc> </target> <target name="taglibreport" depends="dist"> <taskdef name="taglibreport" classname="org.apache.struts.taskdefs.TaglibReport"> <classpath path="${dist.jar}"/> </taskdef> <taglibreport destdir="${taglibreport.dir}"> <fileset dir="${xml.dir}"> <include name="struts-*.xml"/> </fileset> </taglibreport> </target> <target name="clean"> <delete dir="${classes.dir}"/> <delete dir="${dist.dir}"/> <delete dir="${taglibdoc.dir}"/> <delete dir="${taglibreport.dir}"/> </target> <target name="generate-reports" depends="taglibdoc, taglibreport"/> </project> 1.1 jakarta-struts/contrib/tag-doc/src/resources/taglibreport/index.xsl Index: index.xsl =================================================================== <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="4.0" omit-xml-declaration="yes" indent="yes" /> <xsl:template match="*"> <HTML> <HEAD> <TITLE>Taglib Documentation</TITLE> </HEAD> <FRAMESET cols="10%,80%"> <FRAME src="overview-frame.html" name="taglibListFrame"/> <FRAME src="" name="taglibFrame"/> </FRAMESET> <NOFRAMES> <H2>Frame Alert</H2> <P/> This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. <BR/> Link to <A HREF="overview-frame.html">Non-frame version.</A> </NOFRAMES> </HTML> </xsl:template> </xsl:stylesheet> 1.1 jakarta-struts/contrib/tag-doc/src/resources/taglibreport/overview-frame.xsl Index: overview-frame.xsl =================================================================== <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="4.0" omit-xml-declaration="yes" indent="yes" /> <xsl:template match="*"> <HTML> <HEAD> <TITLE>Taglib Reports</TITLE> <LINK REL="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style" /> </HEAD> <BODY> <TABLE BORDER="0" WIDTH="100%"> <TR> <TD NOWRAP="true"> <DIV CLASS="FrameHeading"> TagLibs </DIV> <BR/> <xsl:for-each select="//shortname"> <xsl:sort select="."/> <xsl:element name="A"> <xsl:attribute name="TARGET">taglibFrame</xsl:attribute> <xsl:attribute name="HREF"><xsl:value-of select="." />-report.html</xsl:attribute> <xsl:attribute name="CLASS">FrameItem</xsl:attribute> <xsl:value-of select="." /> </xsl:element> <BR/> </xsl:for-each> </TD> </TR> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet> 1.1 jakarta-struts/contrib/tag-doc/src/resources/taglibreport/stylesheet.css Index: stylesheet.css =================================================================== /* Javadoc style sheet */ /* Page background color */ body { background-color: #FFFFFF } .FrameHeading { font-weight: bold; font-size: large; text-decoration: none; } .FrameItem { text-decoration: none; } .FrameHeading:link, .FrameHeading:visited, .FrameItem:link, .FrameItem:visited { color: blue; } .FrameHeading:hover, .FrameHeading:active, .FrameItem:hover, .FrameItem:active { color: #CC3333; } .FrameTitle { font-weight: bold; font-size: large; text-decoration: none; } .TableHeadingColor { background: #CCCCFF } /* Dark mauve */ .TableRowColor { background: #FFFFFF } /* White */ .TableRowTT { background: #FFCC99 } /* Reqd. RTExprValue */ .TableRowTF { background: #FFCC99 } /* Reqd. !RTExprValue */ .TableRowFT { background: #FFFFFF } /* !Reqd. RTExprValue */ .TableRowFF { background: #FFFFFF } /* !Reqd. !RTExprValue */ 1.1 jakarta-struts/contrib/tag-doc/src/resources/taglibreport/taglib-report.xsl Index: taglib-report.xsl =================================================================== <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="4.0" omit-xml-declaration="yes" indent="yes" /> <xsl:template match="*"> <HTML> <HEAD> <LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style" /> </HEAD> <BODY> <TABLE BORDER="1" WIDTH="100%" CELLSPACING="0" CELLPADDING="0"> <TR CLASS="TableHeadingColor"> <TD> </TD> <TD NOWRAP="true"> <B>body-content</B> </TD> <xsl:for-each select="//attributes/attribute"> <xsl:sort select="."/> <TD NOWRAP="true" STYLE="width: 75px;">  <B><xsl:value-of select="."/></B>  </TD> </xsl:for-each> </TR> <!-- Add 'bodycontent' as the second column?? --> <xsl:for-each select="//taglib/tag"> <xsl:sort select="name"/> <TR> <xsl:variable name="curr_tag" select="."/> <TD CLASS="TableHeadingColor"> <B><xsl:value-of select="$curr_tag/name"/></B> </TD> <TD> <xsl:value-of select="$curr_tag/bodycontent"/> </TD> <xsl:for-each select="//attributes/attribute"> <xsl:sort select="."/> <xsl:variable name="curr_attr" select="."/> <xsl:element name="TD"> <xsl:attribute name="NOWRAP">true</xsl:attribute> <xsl:for-each select="$curr_tag/attribute"> <xsl:sort select="name"/> <xsl:if test="./name = $curr_attr"> <xsl:choose> <xsl:when test="./required = 'true'"> <xsl:attribute name="BGCOLOR">#FF9933</xsl:attribute>   </xsl:when> <xsl:otherwise> <xsl:attribute name="BGCOLOR">#FFFF66</xsl:attribute>   </xsl:otherwise> </xsl:choose> <xsl:choose> <xsl:when test="./rtexprvalue = 'true'"> RT </xsl:when> </xsl:choose> </xsl:if> </xsl:for-each>   </xsl:element> </xsl:for-each> </TR> </xsl:for-each> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet> 1.1 jakarta-struts/contrib/tag-doc/src/resources/taglibdoc/all-tags.xsl Index: all-tags.xsl =================================================================== <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="4.0" omit-xml-declaration="yes" indent="yes" /> <xsl:template match="*"> <HTML> <HEAD> <LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style" /> </HEAD> <BODY> <TABLE BORDER="0" WIDTH="100%"> <TR> <TD NOWRAP="true"> <DIV CLASS="FrameHeading"> All Tags </DIV> <BR/> <xsl:for-each select="//tag"> <xsl:sort select="name"/> <xsl:element name="A"> <xsl:attribute name="TARGET">tagFrame</xsl:attribute> <xsl:attribute name="HREF"><xsl:value-of select="taglib"/>/<xsl:value-of select="name"/>.html</xsl:attribute> <xsl:attribute name="CLASS">FrameItem</xsl:attribute> <xsl:value-of select="name" /> </xsl:element> <BR/> </xsl:for-each> </TD> </TR> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet> 1.1 jakarta-struts/contrib/tag-doc/src/resources/taglibdoc/index.xsl Index: index.xsl =================================================================== <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="4.0" omit-xml-declaration="yes" indent="yes" /> <xsl:template match="*"> <HTML> <HEAD> <TITLE>Taglib Documentation</TITLE> </HEAD> <FRAMESET cols="20%,80%"> <FRAMESET rows="30%,70%"> <FRAME src="overview-frame.html" name="taglibListFrame"/> <FRAME src="all-tags.html" name="taglibFrame"/> </FRAMESET> <FRAME src="" name="tagFrame"/> </FRAMESET> <NOFRAMES> <H2>Frame Alert</H2> <P/> This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. <BR/> Link to <A HREF="overview-frame.html">Non-frame version.</A> </NOFRAMES> </HTML> </xsl:template> </xsl:stylesheet> 1.1 jakarta-struts/contrib/tag-doc/src/resources/taglibdoc/overview-frame.xsl Index: overview-frame.xsl =================================================================== <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="4.0" omit-xml-declaration="yes" indent="yes" /> <xsl:template match="*"> <HTML> <HEAD> <TITLE>Taglib Documentation</TITLE> <LINK REL="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style" /> </HEAD> <BODY> <TABLE BORDER="0" WIDTH="100%"> <TR> <TD NOWRAP="true"> <DIV> <SPAN CLASS="FrameHeading"> TagLibs </SPAN>   (<A TARGET="taglibFrame" HREF="all-tags.html" CLASS="FrameItem">All Tags</A>) </DIV> <BR/> <xsl:for-each select="//shortname"> <xsl:sort select="."/> <xsl:element name="A"> <xsl:attribute name="TARGET">taglibFrame</xsl:attribute> <xsl:attribute name="HREF"><xsl:value-of select="." />/taglib-frame.html</xsl:attribute> <xsl:attribute name="CLASS">FrameItem</xsl:attribute> <xsl:value-of select="." /> </xsl:element> <BR/> </xsl:for-each> </TD> </TR> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet> 1.1 jakarta-struts/contrib/tag-doc/src/resources/taglibdoc/stylesheet.css Index: stylesheet.css =================================================================== /* Javadoc style sheet */ /* Page background color */ body { background-color: #FFFFFF } .FrameHeading { font-weight: bold; font-size: large; text-decoration: none; } .FrameItem { text-decoration: none; } .FrameHeading:link, .FrameHeading:visited, .FrameItem:link, .FrameItem:visited { color: blue; } .FrameHeading:hover, .FrameHeading:active, .FrameItem:hover, .FrameItem:active { color: #CC3333; } .FrameTitle { font-weight: bold; font-size: large; text-decoration: none; } .TableHeadingColor { background: #CCCCFF } /* Dark mauve */ .TableRowColor { background: #FFFFFF } /* White */ .TableRowTT { background: #FFCC99 } /* Reqd. RTExprValue */ .TableRowTF { background: #FFCC99 } /* Reqd. !RTExprValue */ .TableRowFT { background: #FFFFFF } /* !Reqd. RTExprValue */ .TableRowFF { background: #FFFFFF } /* !Reqd. !RTExprValue */ 1.1 jakarta-struts/contrib/tag-doc/src/resources/taglibdoc/tag-frame.xsl Index: tag-frame.xsl =================================================================== <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="4.0" omit-xml-declaration="yes" indent="yes" /> <xsl:template match="*"> <HTML> <HEAD> <LINK REL ="stylesheet" TYPE="text/css" HREF="../stylesheet.css" TITLE="Style" /> </HEAD> <BODY> <!-- ======== START OF TAG DATA ======== --> <A NAME="_top"><!-- --></A> <SPAN CLASS="FrameTitle"> <xsl:value-of select="taglib"/>:<xsl:value-of select="name"/> </SPAN>     ( <A HREF="#_description">description</A> ) <P/> <!-- ========== ATTRIBUTE SUMMARY =========== --> <A NAME="attribute_summary"><!-- --></A> <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> <TD COLSPAN="2"> <SPAN CLASS="FrameHeading">Attribute Summary</SPAN> </TD> </TR> <xsl:for-each select="attribute"> <xsl:sort select="required" order="descending"/> <xsl:sort select="name" order="ascending"/> <xsl:element name="TR"> <xsl:attribute name="CLASS">TableRow<xsl:value-of select="substring(required,1,1)"/> <xsl:value-of select="substring(rtexprvalue,1,1)"/> </xsl:attribute> <TD ALIGN="right" VALIGN="top" WIDTH="10%"><FONT SIZE="-1">  <xsl:if test="rtexprvalue='true'"><CODE>RTExprValue</CODE></xsl:if> </FONT></TD> <TD> <xsl:element name="A"> <xsl:attribute name="HREF">#<xsl:value-of select="name"/></xsl:attribute> <B><CODE><xsl:value-of select="name"/></CODE></B> </xsl:element> <BR/>            <xsl:value-of select="substring(info,1,80)"/> </TD> </xsl:element> </xsl:for-each> </TABLE> <P/> <!-- ============ ATTRIBUTE DETAIL ========== --> <A NAME="attribute_detail"><!-- --></A> <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> <TD COLSPAN="1"> <SPAN CLASS="FrameHeading">Attribute Detail</SPAN> </TD> </TR> </TABLE> <xsl:for-each select="attribute"> <xsl:sort select="required" order="descending"/> <xsl:sort select="name" order="ascending"/> <xsl:element name="A"> <xsl:attribute name="NAME"><xsl:value-of select="name"/></xsl:attribute> </xsl:element> <H3><xsl:value-of select="name"/></H3> <xsl:copy-of select="info"/> <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"> <TR> <TD><B>Required:</B>    </TD> <TD><xsl:value-of select="required"/></TD> </TR><TR> <TD><B>RTExprValue:</B>    </TD> <TD><xsl:value-of select="rtexprvalue"/></TD> </TR> </TABLE> <HR/> </xsl:for-each> <P/> <P/> <!-- ============ DESCRIPTION ========== --> <A NAME="_description"><!-- --></A> <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> <TD COLSPAN="1"> <SPAN CLASS="FrameHeading">Description</SPAN> </TD> </TR> </TABLE> <P/> <xsl:value-of select="summary" /> <P/> <xsl:copy-of select="info" /> <P/> <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"> <TR> <TD><B>Tag Class:</B>    </TD> <TD><xsl:value-of select="tagclass"/></TD> </TR><TR> <TD><B>Tei Class:</B>    </TD> <TD><xsl:value-of select="teiclass"/></TD> </TR><TR> <TD><B>Body Content:</B>    </TD> <TD><xsl:value-of select="bodycontent"/></TD> </TR> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet> 1.1 jakarta-struts/contrib/tag-doc/src/resources/taglibdoc/taglib-frame.xsl Index: taglib-frame.xsl =================================================================== <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="4.0" omit-xml-declaration="yes" indent="yes" /> <xsl:template match="*"> <HTML> <HEAD> <LINK REL ="stylesheet" TYPE="text/css" HREF="../stylesheet.css" TITLE="Style" /> </HEAD> <BODY> <TABLE BORDER="0" WIDTH="100%"> <TR> <TD NOWRAP="true"> <DIV> <xsl:element name="A"> <xsl:attribute name="TARGET">tagFrame</xsl:attribute> <xsl:attribute name="HREF">taglib-summary.html</xsl:attribute> <xsl:attribute name="CLASS">FrameHeading</xsl:attribute> <xsl:value-of select="//taglib/shortname" /> </xsl:element> </DIV> <BR/> <xsl:for-each select="//taglib/tag"> <xsl:sort select="name"/> <xsl:element name="A"> <xsl:attribute name="TARGET">tagFrame</xsl:attribute> <xsl:attribute name="HREF"><xsl:value-of select="name" />.html</xsl:attribute> <xsl:attribute name="CLASS">FrameItem</xsl:attribute> <xsl:value-of select="name" /> </xsl:element> <BR/> </xsl:for-each> </TD> </TR> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet> 1.1 jakarta-struts/contrib/tag-doc/src/resources/taglibdoc/taglib-summary.xsl Index: taglib-summary.xsl =================================================================== <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="4.0" omit-xml-declaration="yes" indent="yes" /> <xsl:template match="*"> <HTML> <HEAD> <LINK REL ="stylesheet" TYPE="text/css" HREF="../stylesheet.css" TITLE="Style" /> </HEAD> <BODY> <!-- ======== START OF TAG DATA ======== --> <A NAME="_top"><!-- --></A> <SPAN CLASS="FrameTitle"> <xsl:value-of select="//taglib/display-name" /> </SPAN>     ( <A HREF="#_description">description</A> ) <P/> <!-- ========== TAG SUMMARY =========== --> <A NAME="tag_summary"><!-- --></A> <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> <TD COLSPAN="2"> <SPAN CLASS="FrameHeading">Tag Summary</SPAN> </TD> </TR> <xsl:for-each select="//taglib/tag"> <xsl:sort select="name" order="ascending"/> <xsl:element name="TR"> <xsl:attribute name="CLASS">TableRow</xsl:attribute> <TD VALIGN="top" WIDTH="10%"> <xsl:element name="A"> <xsl:attribute name="HREF"><xsl:value-of select="name"/>.html</xsl:attribute> <B><CODE><xsl:value-of select="name"/></CODE></B> </xsl:element> </TD> <TD> <xsl:value-of select="summary"/> </TD> </xsl:element> </xsl:for-each> </TABLE> <P/> <P/> <!-- ============ DESCRIPTION ========== --> <A NAME="_description"><!-- --></A> <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> <TD COLSPAN="1"> <SPAN CLASS="FrameHeading">Description</SPAN> </TD> </TR> </TABLE> <P/> <xsl:copy-of select="//taglib/info" /> <P/> <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"> <TR> <TD><B>TagLib Version:</B>    </TD> <TD><xsl:value-of select="//taglib/tlibversion"/></TD> </TR><TR> <TD><B>JSP Version:</B>    </TD> <TD><xsl:value-of select="//taglib/jspversion"/></TD> </TR><TR> <TD><B>Short Name:</B>    </TD> <TD><xsl:value-of select="//taglib/shortname"/></TD> </TR><TR> <TD><B>URI:</B>    </TD> <TD> <xsl:element name="A"> <xsl:attribute name="HREF"> <xsl:value-of select="//taglib/uri"/> </xsl:attribute> <xsl:value-of select="//taglib/uri"/> </xsl:element> </TD> </TR> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet> 1.1 jakarta-struts/contrib/tag-doc/src/java/org/apache/struts/taskdefs/EnhMatchingTask.java Index: EnhMatchingTask.java =================================================================== /* * $Header: /home/cvs/jakarta-struts/contrib/tag-doc/src/java/org/apache/struts/taskdefs/EnhMatchingTask.java,v 1.1 2003/03/29 05:51:41 jmitchell Exp $ * $Revision: 1.1 $ * $Date: 2003/03/29 05:51:41 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Struts", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.struts.taskdefs; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.taskdefs.MatchingTask; import org.apache.tools.ant.types.FileSet; /** * ENHanced-MatchingTask - enhances the MatchingTask by allowing * the subclasses to act as a FileSet container as well as allowing * the implicit FileSet. * * @author <a href="mailto:[EMAIL PROTECTED]">Mohan Kishore</a> * @version $Revision: 1.1 $ $Date: 2003/03/29 05:51:41 $ */ public abstract class EnhMatchingTask extends MatchingTask { /** Base directory for implicit FileSet */ protected File dir; /** List of embeded filesets */ protected List filesets = new ArrayList(); /** * Set the base directory for the implicit FileSet * @param base directory for implicit FileSet */ public void setDir(File dir) { this.dir = dir; } /** * Adds an embeded FileSet for this task. * @param the FileSet to add */ public void addFileset(FileSet fileset) { filesets.add(fileset); } /** * Returns the combined list of Files, from both the * implicit and embeded FileSets. * @return list of File objects */ protected List getFiles() { List files = new ArrayList(); if (dir != null) { fileset.setDir(dir); files.addAll(getFiles(fileset)); } Iterator iter = filesets.iterator(); while (iter.hasNext()) { files.addAll(getFiles((FileSet) iter.next())); } return files; } private List getFiles(FileSet fs) { List files = new ArrayList(); DirectoryScanner ds = fs.getDirectoryScanner(fs.getProject()); File dir = ds.getBasedir(); String[] filenames = ds.getIncludedFiles(); for (int i = 0; i < filenames.length; i++) { File file = new File(dir, filenames[i]); files.add(file); } return files; } } 1.1 jakarta-struts/contrib/tag-doc/src/java/org/apache/struts/taskdefs/TaglibDoc.java Index: TaglibDoc.java =================================================================== /* * $Header: /home/cvs/jakarta-struts/contrib/tag-doc/src/java/org/apache/struts/taskdefs/TaglibDoc.java,v 1.1 2003/03/29 05:51:41 jmitchell Exp $ * $Revision: 1.1 $ * $Date: 2003/03/29 05:51:41 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Struts", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.struts.taskdefs; import java.io.File; import java.util.Arrays; import java.util.Iterator; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.apache.tools.ant.BuildException; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Given a list of files compatible with the Tag-Library * Descriptor (TLD) format, creates a matrix of Tags Vs * Attributes for each Tag-Library. * * @author <a href="mailto:[EMAIL PROTECTED]">Mohan Kishore</a> * @version $Revision: 1.1 $ $Date: 2003/03/29 05:51:41 $ */ public class TaglibDoc extends EnhMatchingTask { private File destdir; /** * Sets the destination directory for the generated documents. * @param destdir The destination directory */ public void setDestdir(File destdir) { this.destdir = destdir; } /** * Called by the Ant runtime. Needs to have the mandatory attribute * 'destdir' set before calling this. */ public void execute() throws BuildException { validate(); handleFiles(getFiles()); } private void validate() throws BuildException { if (destdir == null) { throw new BuildException("Need to specify the 'destdir' attribute"); } if (!destdir.exists() || !destdir.isDirectory()) { if (!destdir.mkdirs()) { throw new BuildException("Could not create the specified destdir"); } } } /** * Creates the following set of documents:<BR/> * <PRE> * DestDir * |- index.html (the frames based index page) * |- overview-frame.html (list of all tag-libraries) * |- all-tags.html (list of all tags) * |- XXX (one directory per tag library) * | |- taglib-frame.html (list of all tags in this library) * | |- taglib-summary.html (summary of this library) * | |- YYY.html (one file per Tag) * | |- ... * |- ... * </PRE> * @param files input files in TLD format. */ public void handleFiles(List files) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.newDocument(); Element overviewRoot = Util.addChildElement(doc, "overview-frame", null); doc = db.newDocument(); Element allTagsRoot = Util.addChildElement(doc, "all-tags", null); Iterator iter = files.iterator(); while (iter.hasNext()) { File file = (File) iter.next(); if (!file.exists() || !file.canRead()) { continue; } Document xmlDoc = handleFile(file); if (xmlDoc != null) { String shortname = Util.getElementValue( xmlDoc.getDocumentElement(), "body/taglib/shortname"); Util.addChildElement(overviewRoot, "shortname", shortname); List tags = Util.getElements( xmlDoc.getDocumentElement(), "body/taglib/tag"); Iterator tagIter = tags.iterator(); while (tagIter.hasNext()) { Element tag = (Element) tagIter.next(); String tagname = Util.getElementValue(tag, "name"); tag = Util.addChildElement(allTagsRoot, "tag", null); Util.addChildElement(tag, "name", tagname); Util.addChildElement(tag, "taglib", shortname); } } } Source xml = new DOMSource(overviewRoot); Source xsl = new StreamSource( this.getClass().getResourceAsStream( "/resources/taglibdoc/index.xsl")); Result out = new StreamResult(new File(destdir, "index.html")); TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(xsl); t.transform(xml, out); xsl = new StreamSource( this.getClass().getResourceAsStream( "/resources/taglibdoc/overview-frame.xsl")); out = new StreamResult(new File(destdir, "overview-frame.html")); t = tf.newTransformer(xsl); t.transform(xml, out); xml = new DOMSource(allTagsRoot); xsl = new StreamSource( this.getClass().getResourceAsStream( "/resources/taglibdoc/all-tags.xsl")); out = new StreamResult(new File(destdir, "all-tags.html")); t = tf.newTransformer(xsl); t.transform(xml, out); Util.copyFile( "/resources/taglibdoc/stylesheet.css", new File(destdir, "stylesheet.css")); } catch (Exception e) { e.printStackTrace(); } } private Document handleFile(File file) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(file); String shortname = Util.getElementValue( doc.getDocumentElement(), "body/taglib/shortname"); File dir = new File(destdir, shortname); dir.mkdir(); File taglibFrameHtml = new File(dir, "taglib-frame.html"); Source xml = new StreamSource(file); Source xsl = new StreamSource( this.getClass().getResourceAsStream( "/resources/taglibdoc/taglib-frame.xsl")); Result out = new StreamResult(taglibFrameHtml); TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(xsl); t.transform(xml, out); File taglibSummaryHtml = new File(dir, "taglib-summary.html"); xml = new StreamSource(file); xsl = new StreamSource( this.getClass().getResourceAsStream( "/resources/taglibdoc/taglib-summary.xsl")); out = new StreamResult(taglibSummaryHtml); t = tf.newTransformer(xsl); t.transform(xml, out); List tags = Util.getElements(doc.getDocumentElement(), "body/taglib/tag"); Iterator iter = tags.iterator(); xsl = new StreamSource( this.getClass().getResourceAsStream( "/resources/taglibdoc/tag-frame.xsl")); t = tf.newTransformer(xsl); while (iter.hasNext()) { Element tag = (Element) iter.next(); Util.addChildElement(tag, "taglib", shortname); String tagname = Util.getElementValue(tag, "name"); File tagHtml = new File(dir, tagname + ".html"); xml = new DOMSource(tag); out = new StreamResult(tagHtml); t.transform(xml, out); } return doc; } catch (Exception e) { e.printStackTrace(); } return null; } /** * MAIN METHOD */ public static void main(String[] args) throws Exception { if (args.length == 0) { System.out.println( "Usage: java " + TaglibDoc.class.getName() + " <file list>"); System.exit(0); } File[] files = new File[args.length]; for (int i = 0; i < files.length; i++) files[i] = new File(args[i]); TaglibDoc td = new TaglibDoc(); td.handleFiles(Arrays.asList(files)); } } 1.1 jakarta-struts/contrib/tag-doc/src/java/org/apache/struts/taskdefs/TaglibReport.java Index: TaglibReport.java =================================================================== /* * $Header: /home/cvs/jakarta-struts/contrib/tag-doc/src/java/org/apache/struts/taskdefs/TaglibReport.java,v 1.1 2003/03/29 05:51:41 jmitchell Exp $ * $Revision: 1.1 $ * $Date: 2003/03/29 05:51:41 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Struts", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.struts.taskdefs; import java.io.File; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.TreeSet; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.apache.tools.ant.BuildException; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Given a list of files compatible with the Tag-Library * Descriptor (TLD) format, creates a matrix of Tags Vs * Attributes for each Tag-Library. * * @author <a href="mailto:[EMAIL PROTECTED]">Mohan Kishore</a> * @version $Revision: 1.1 $ $Date: 2003/03/29 05:51:41 $ */ public class TaglibReport extends EnhMatchingTask { private File destdir; /** * Sets the destination directory for the generated documents. * @param destdir The destination directory */ public void setDestdir(File destdir) { this.destdir = destdir; } /** * Called by the Ant runtime. Needs to have the mandatory attribute * 'destdir' set before calling this. */ public void execute() throws BuildException { validate(); handleFiles(getFiles()); } private void validate() throws BuildException { if (destdir == null) { throw new BuildException("Need to specify the 'destdir' attribute"); } if (!destdir.exists() || !destdir.isDirectory()) { if (!destdir.mkdirs()) { throw new BuildException("Could not create the specified destdir"); } } } /** * Creates the following set of documents:<BR/> * <PRE> * DestDir * |- index.html (the frames based index page) * |- overview-frame.html (menu of all tag-libraries) * |- XXX-report.html (one file per tag-library) * |- ... * </PRE> * @param files input files in TLD format. */ public void handleFiles(List files) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.newDocument(); Element overviewRoot = Util.addChildElement(doc, "overview-frame", null); Iterator iter = files.iterator(); while (iter.hasNext()) { File file = (File) iter.next(); if (!file.exists() || !file.canRead()) { continue; } Document xmlDoc = handleFile(file); if (xmlDoc != null) { String shortname = Util.getElementValue( xmlDoc.getDocumentElement(), "body/taglib/shortname"); Util.addChildElement(overviewRoot, "shortname", shortname); File reportHtml = new File(destdir, shortname + "-report.html"); Source xml = new DOMSource(xmlDoc); Source xsl = new StreamSource( this.getClass().getResourceAsStream( "/resources/taglibreport/taglib-report.xsl")); Result out = new StreamResult(reportHtml); TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(xsl); t.transform(xml, out); } } Source xml = new DOMSource(overviewRoot); Source xsl = new StreamSource( this.getClass().getResourceAsStream( "/resources/taglibreport/index.xsl")); Result out = new StreamResult(new File(destdir, "index.html")); TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(xsl); t.transform(xml, out); xsl = new StreamSource( this.getClass().getResourceAsStream( "/resources/taglibreport/overview-frame.xsl")); out = new StreamResult(new File(destdir, "overview-frame.html")); t = tf.newTransformer(xsl); t.transform(xml, out); Util.copyFile( "/resources/taglibreport/stylesheet.css", new File(destdir, "stylesheet.css")); } catch (Exception e) { e.printStackTrace(); } } private Document handleFile(File file) { try { Set attrSet = new TreeSet(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(file); List tags = Util.getElements(doc.getDocumentElement(), "body/taglib/tag"); Iterator iter = tags.iterator(); while (iter.hasNext()) { Element tag = (Element) iter.next(); List attrList = Util.getElements(tag, "attribute"); Iterator attrIter = attrList.iterator(); while (attrIter.hasNext()) { Element attribute = (Element) attrIter.next(); String name = Util.getElementValue(attribute, "name"); attrSet.add(name); } } Element attributes = Util.addChildElement( doc.getDocumentElement(), "attributes", null); iter = attrSet.iterator(); while (iter.hasNext()) { String name = (String) iter.next(); Util.addChildElement(attributes, "attribute", name); } return doc; } catch (Exception e) { e.printStackTrace(); } return null; } /** * MAIN METHOD */ public static void main(String[] args) throws Exception { if (args.length == 0) { System.out.println( "Usage: java " + TaglibReport.class.getName() + " <file list>"); System.exit(0); } File[] files = new File[args.length]; for (int i = 0; i < files.length; i++) files[i] = new File(args[i]); TaglibDoc td = new TaglibDoc(); td.handleFiles(Arrays.asList(files)); } } 1.1 jakarta-struts/contrib/tag-doc/src/java/org/apache/struts/taskdefs/Util.java Index: Util.java =================================================================== /* * $Header: /home/cvs/jakarta-struts/contrib/tag-doc/src/java/org/apache/struts/taskdefs/Util.java,v 1.1 2003/03/29 05:51:41 jmitchell Exp $ * $Revision: 1.1 $ * $Date: 2003/03/29 05:51:41 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Struts", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.struts.taskdefs; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * General purpose utility class. * * @author <a href="mailto:[EMAIL PROTECTED]">Mohan Kishore</a> * @version $Revision: 1.1 $ $Date: 2003/03/29 05:51:41 $ */ public class Util { /** * Returns the list of named descendents. Allows the user * to specify '/' separated path to the child element. e.g. * 'a/b/c'. Note, that if 'a' has multiple child elements * named 'b', the method will go to the first 'b' element, * and return all child elements named 'c'. Returns an * empty List if the path does not return any elements. * * @param elem The parent/context element * @param path '/' separated path * @return List of elements as per the path. */ public static List getElements(Element elem, String path) { List list = new ArrayList(); if (elem == null) return list; int ndx = path.indexOf("/"); if (ndx != -1) { Element child = getElement(elem, path.substring(0, ndx)); return getElements(child, path.substring(ndx + 1)); } NodeList nl = elem.getChildNodes(); for (int i = 0, len = nl.getLength(); i < len; i++) { Node node = nl.item(i); if (node.getNodeType() == Node.ELEMENT_NODE && node.getNodeName().equals(path)) { list.add(node); } } return list; } /** * Returns the named descendent. Allows the user * to specify '/' separated path to the child element. e.g. * 'a/b/c'. Note, that in case of multiple children with the * same name, the first child is returned. Returns a null, if * the path does not map to any element. * * @param elem The parent/context element * @param path '/' separated path * @return Named element as per the path. */ public static Element getElement(Element elem, String path) { List elems = getElements(elem, path); if (elems.size() == 0) return null; else return (Element) elems.get(0); } /** * Returns the text value of the named descendent. Allows the user * to specify '/' separated path to the child element. e.g. * 'a/b/c'. Note, that in case of multiple children with the * same name, the first child is considered. The text value * is determined by concatenating all the text children. Returns * an empty String if node is not found. * * @param elem The parent/context element * @param path '/' separated path * @return Text value of the name descendent. */ public static String getElementValue(Element elem, String path) { Element child = getElement(elem, path); if (child == null) return ""; String ret = ""; NodeList nl = child.getChildNodes(); for (int i = 0, len = nl.getLength(); i < len; i++) { Node node = nl.item(i); if (node.getNodeType() == Node.TEXT_NODE) ret += node.getNodeValue(); } return ret; } /** * Adds a Child element to the parent node. If the 'value' is * not null, a Text node with the same value is appended to the * Child. * @param parent The parent node * @param tag The child element name * @param value Value of text node appended to the Child * @return the newly added Child node. */ public static Element addChildElement( Node parent, String tag, String value) { Document doc = (parent.getNodeType() == Node.DOCUMENT_NODE) ? (Document) parent : parent.getOwnerDocument(); Element child = doc.createElement(tag); if (value != null) child.appendChild(doc.createTextNode(value)); parent.appendChild(child); return child; } /** * Copies a given resource from classpath to the destination file. * Uses Util.class.getResourceAsStream(resPath) internally. * @param resPath Path to the resource * @param dstFile Destination file * @return true, if the file is copied successfully. */ public static boolean copyFile(String resPath, File dstFile) { try { BufferedInputStream bis = new BufferedInputStream( Util.class.getResourceAsStream(resPath)); FileOutputStream fos = new FileOutputStream(dstFile); int offset = 0, len = 0; byte[] buffer = new byte[2 * 1024]; while ((len = bis.read(buffer, 0, buffer.length)) != -1) { fos.write(buffer, 0, len); offset += len; } bis.close(); fos.flush(); fos.close(); return true; } catch (Exception e) { e.printStackTrace(); } return false; } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]