You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by an...@apache.org on 2008/12/01 15:14:18 UTC

svn commit: r722077 - in /tapestry/tapestry5/trunk/tapestry-component-report/src: main/java/org/apache/tapestry/mojo/ test/conf/ test/java/ test/java/org/ test/java/org/apache/ test/java/org/apache/tapestry/ test/java/org/apache/tapestry/mojo/

Author: andyhot
Date: Mon Dec  1 06:14:16 2008
New Revision: 722077

URL: http://svn.apache.org/viewvc?rev=722077&view=rev
Log:
TAP5-390: Output links to javadoc in generated description text.

Added:
    tapestry/tapestry5/trunk/tapestry-component-report/src/test/conf/testng.xml
    tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/
    tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/
    tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/
    tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/
    tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/mojo/
    tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/mojo/ComponentReportTest.java
    tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/mojo/DoxiaXhtmlSinkDecorator.java
Modified:
    tapestry/tapestry5/trunk/tapestry-component-report/src/main/java/org/apache/tapestry/mojo/ComponentReport.java

Modified: tapestry/tapestry5/trunk/tapestry-component-report/src/main/java/org/apache/tapestry/mojo/ComponentReport.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-component-report/src/main/java/org/apache/tapestry/mojo/ComponentReport.java?rev=722077&r1=722076&r2=722077&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-component-report/src/main/java/org/apache/tapestry/mojo/ComponentReport.java (original)
+++ tapestry/tapestry5/trunk/tapestry-component-report/src/main/java/org/apache/tapestry/mojo/ComponentReport.java Mon Dec  1 06:14:16 2008
@@ -37,6 +37,8 @@
 
 import java.io.*;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * The component report generates documentation about components and parameters within the current project.
@@ -56,6 +58,7 @@
     private final static String[] PARAMETER_HEADERS = {"Name", "Type", "Flags", "Default", "Default Prefix",
             "Description"};
 
+    private static final Pattern TAPESTRY5_PATTERN = Pattern.compile("(org\\.apache\\.tapestry5[#_\\w\\.]*)");
 
     /**
      * Identifies the application root package.
@@ -118,6 +121,18 @@
      */
     private String apidocs;
 
+    /**
+     * Where to find tapestry javadocs. This is used for generating documentation links
+     * for each parameter type.
+     *
+     * By default, this is set to "http://tapestry.apache.org/tapestry5/apidocs". A relative
+     * path can also be supplied (a sensible value would be 'apidocs') and is resolved
+     * from the documentation root.
+     *
+     * @parameter default-value="http://tapestry.apache.org/tapestry5/apidocs"
+     */
+    private String tapestryJavadoc;
+
     @Override
     protected String getOutputDirectory()
     {
@@ -222,7 +237,7 @@
 
                 sink.listItem();
 
-                sink.link(toPath(className) + ".html");
+                sink.link(toHtml(toPath(className)));
 
                 sink.text(className);
                 sink.link_();
@@ -250,6 +265,24 @@
         return className.replace('.', '/');
     }
 
+    private String toHtml(String filename)
+    {
+        int pos = filename.lastIndexOf("#");
+        if (pos<0)
+            return filename + ".html";
+        else
+        {
+            return filename.substring(0, pos) + ".html" + filename.substring(pos);
+        }
+    }
+
+    private String extractSimpleName(String className)
+    {
+        int dotx = className.lastIndexOf(".");
+
+        return className.substring(dotx+1);
+    }
+
     private String extractSubpackage(String className)
     {
         int dotx = className.indexOf(".", rootPackage.length() + 1);
@@ -261,7 +294,7 @@
         return className.substring(rootPackage.length() + 1, dotx);
     }
 
-    private List<File> createDocSearchPath()
+    protected List<File> createDocSearchPath()
     {
         List<File> result = CollectionFactory.newList();
 
@@ -326,8 +359,6 @@
 
         Element section = addSection(body, className);
 
-        addChild(section, "p", cd.getDescription());
-
 
         StringBuilder javadocURL = new StringBuilder(200);
 
@@ -341,7 +372,16 @@
 
         String pathToRefRoot = javadocURL.toString();
 
-        javadocURL.append("../").append(apidocs).append("/").append(toPath(className)).append(".html");
+        javadocURL.append("../");
+
+        if (!tapestryJavadoc.contains("://"))
+        {
+            tapestryJavadoc = javadocURL.toString() + tapestryJavadoc;
+        }
+
+        javadocURL.append(apidocs).append("/").append(toHtml(toPath(className)));
+
+        addChildWithJavadocs(section, "p", cd.getDescription());
 
         addLink(addChild(section, "p"), javadocURL.toString(), "[JavaDoc]");
 
@@ -357,7 +397,7 @@
 
                 Element li = addChild(ul, "li");
 
-                addLink(li, name + ".html", name);
+                addLink(li, toHtml(name), name);
 
                 container = li;
             }
@@ -398,11 +438,11 @@
                 table.appendChild(row);
 
                 addChild(row, "td", pd.getName());
-                addChild(row, "td", pd.getType());
+                addChildWithJavadocs(row, "td", pd.getType());
                 addChild(row, "td", InternalUtils.join(flags));
                 addChild(row, "td", pd.getDefaultValue());
                 addChild(row, "td", pd.getDefaultPrefix());
-                addChild(row, "td", pd.getDescription());
+                addChildWithJavadocs(row, "td", pd.getDescription());
             }
         }
 
@@ -513,7 +553,7 @@
     }
 
 
-    private Map<String, ClassDescription> runJavadoc() throws MavenReportException
+    protected Map<String, ClassDescription> runJavadoc() throws MavenReportException
     {
         getLog().info("Running JavaDoc to collect component parameter data ...");
 
@@ -845,4 +885,73 @@
 
         return child;
     }
+
+    private Element addChildWithJavadocs(Element container, String elementName, String text)
+    {
+        final String[] parts = splitWithGroup(TAPESTRY5_PATTERN, text);
+        if (parts.length<=1)
+        {
+            return addChild(container, elementName, text);
+        }
+
+        final Element element = addChild(container, elementName);
+
+        for (int i = 0; i < parts.length; i++) 
+        {
+            String part = parts[i];
+            element.appendChild(part);
+            i++;
+            if (i<parts.length)
+            {
+                part = parts[i];
+                if (part.endsWith("."))
+                {
+                    part = part.substring(0, part.length()-1);
+                    addLink(element, tapestryJavadoc + "/" + toHtml(toPath(part)), extractSimpleName(part));
+                    element.appendChild(".");
+                }
+                else
+                {
+                    addLink(element, tapestryJavadoc + "/" + toHtml(toPath(part)), extractSimpleName(part));
+                }
+            }
+        }
+        return element;
+    }
+
+    /**
+     * Splits a {@link CharSequence} using the given pattern while including
+     * after each part the matched group.<p/>
+     * Mostly copied from {@link Pattern#split(CharSequence)}. 
+     */
+    private String[] splitWithGroup(Pattern pattern, CharSequence input)
+    {
+        int index = 0;
+        List<String> matchList = newList();
+        Matcher m = pattern.matcher(input);
+
+        // Add segments before each match found
+        while(m.find())
+        {
+            String match = input.subSequence(index, m.start()).toString();
+            String group = input.subSequence(m.start(), m.end()).toString();
+            matchList.add(match);
+            matchList.add(group);
+            index = m.end();
+        }
+
+        // If no match was found, return this
+        if (index == 0)
+            return new String[] {input.toString()};
+
+        // Add remaining segment
+        matchList.add(input.subSequence(index, input.length()).toString());
+
+        // Construct result
+        int resultSize = matchList.size();
+        while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
+            resultSize--;
+        String[] result = new String[resultSize];
+        return matchList.subList(0, resultSize).toArray(result);
+    }
 }

Added: tapestry/tapestry5/trunk/tapestry-component-report/src/test/conf/testng.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-component-report/src/test/conf/testng.xml?rev=722077&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-component-report/src/test/conf/testng.xml (added)
+++ tapestry/tapestry5/trunk/tapestry-component-report/src/test/conf/testng.xml Mon Dec  1 06:14:16 2008
@@ -0,0 +1,24 @@
+<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
+<!--
+   Copyright 2008 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.
+-->
+
+<suite name="Tapestry Component Report" annotations="1.5" verbose="10">
+    <test name="Internals">
+        <packages>
+            <package name="org.apache.tapestry.mojo"/>
+        </packages>
+    </test>
+</suite>

Added: tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/mojo/ComponentReportTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/mojo/ComponentReportTest.java?rev=722077&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/mojo/ComponentReportTest.java (added)
+++ tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/mojo/ComponentReportTest.java Mon Dec  1 06:14:16 2008
@@ -0,0 +1,171 @@
+// Copyright 2008 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.
+
+package org.apache.tapestry.mojo;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.model.Model;
+import org.apache.maven.reporting.MavenReportException;
+import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
+import org.apache.maven.doxia.module.xhtml.XhtmlSink;
+import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newMap;
+import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newList;
+import org.testng.annotations.Test;
+import org.testng.annotations.DataProvider;
+import org.testng.Assert;
+import org.codehaus.plexus.util.FileUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.lang.reflect.Field;
+
+/**
+ * Tests {@link ComponentReport}.
+ */
+public class ComponentReportTest extends Assert
+{
+    @Test(dataProvider = "docData")
+    public void doc_generation(final Map<String, ClassDescription> javadocResults, String createdFile,
+                                             String[] expectedSummaryParts, String[] expectedFileParts)
+            throws MojoExecutionException, IOException, MavenReportException
+    {
+        String tempDir = System.getProperty("java.io.tmpdir");
+        final File tempFolder = new File(tempDir, "t5_tests");
+        tempFolder.mkdir();
+
+        ComponentReport report = new ComponentReport()
+        {
+            @Override
+            protected String getOutputDirectory()
+            {
+                return tempFolder.toString();
+            }
+
+            @Override
+            protected MavenProject getProject()
+            {
+                return new MavenProject(new Model());
+            }
+
+            @Override
+            protected Map<String, ClassDescription> runJavadoc() throws MavenReportException
+            {
+                return javadocResults;
+            }
+
+            @Override
+            protected List<File> createDocSearchPath()
+            {
+                return newList();
+            }
+        };
+        try
+        {
+            initializeMojo(report, ComponentReport.class,
+                    "rootPackage", "org.apache.tapestry5.corelib",
+                    "apidocs", "apidocs",
+                    "tapestryJavadoc", "http://tapestry.apache.org/tapestry5/apidocs",
+                    "generatedDocsDirectory", tempFolder
+            );
+        }
+        catch (NoSuchFieldException e)
+        {
+            fail("Cannot initialize mojo");
+        }
+        catch (IllegalAccessException e)
+        {
+            fail("Cannot initialize mojo");
+        }
+
+        StringWriter writer = new StringWriter();
+
+        RenderingContext context = new RenderingContext(tempFolder, "test.html");
+        XhtmlSink sink = new XhtmlSink(writer, context, newMap());
+
+        report.generate(new DoxiaXhtmlSinkDecorator(sink), Locale.US);
+
+        String summaryOutput = writer.toString();
+        for (String summaryPart : expectedSummaryParts)
+        {
+            assertTrue(summaryOutput.contains(summaryPart));
+        }
+
+        File formReport = new File(tempFolder, createdFile);
+        String formOutput = FileUtils.fileRead(formReport);
+
+        for (String filePart : expectedFileParts)
+        {
+            assertTrue(formOutput.contains(filePart));
+        }
+
+        FileUtils.forceDeleteOnExit(tempFolder);
+    }
+
+    private void initializeMojo(Object mojo, Class clazz, Object... propertyValues)
+            throws NoSuchFieldException, IllegalAccessException
+    {
+        for (int i = 0; i < propertyValues.length; i++)
+        {
+            String property = (String) propertyValues[i++];
+            Object value = propertyValues[i];
+
+            Field field = clazz.getDeclaredField(property);
+            field.setAccessible(true);
+
+            field.set(mojo, value);
+        }
+    }
+
+    @DataProvider(name = "docData")
+    private Object[][] testData() {
+        return new Object[][] {
+                {
+                    javadocDescriptionForForm(),
+                    "ref/org/apache/tapestry5/corelib/components/Form.xml",
+                    new String[]{"org.apache.tapestry5.corelib.components.Form"},
+                    new String[]{"<title>Component Reference: org.apache.tapestry5.corelib.components.Form</title>",
+                    "<a href=\"http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/EventConstants.html#PREPARE\">"}
+                },
+        };
+    }
+
+    private Map<String, ClassDescription> javadocDescriptionForForm()
+    {
+        Map<String, ClassDescription> results = newMap();
+        ClassDescription classDesc = new ClassDescription(
+                "org.apache.tapestry5.corelib.components.Form",
+                "java.lang.Object",
+                "When it renders, it fires a org.apache.tapestry5.EventConstants#PREPARE_FOR_RENDER\n" +
+                " notification, followed by a org.apache.tapestry5.EventConstants#PREPARE",
+                false
+        );
+
+        ParameterDescription paramDesc = new ParameterDescription(
+                "validationId", "String", "", "prop", false, false, true,
+                "Prefix value used when searching for validation messages and constraints. " +
+                "The default is the Form component's\n" +
+                " id. This is overriden by org.apache.tapestry5.corelib.components.BeanEditForm."
+        );
+        classDesc.getParameters().put(paramDesc.getName(), paramDesc);
+
+        results.put(classDesc.getClassName(), classDesc);
+
+        return results;
+    }
+}

Added: tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/mojo/DoxiaXhtmlSinkDecorator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/mojo/DoxiaXhtmlSinkDecorator.java?rev=722077&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/mojo/DoxiaXhtmlSinkDecorator.java (added)
+++ tapestry/tapestry5/trunk/tapestry-component-report/src/test/java/org/apache/tapestry/mojo/DoxiaXhtmlSinkDecorator.java Mon Dec  1 06:14:16 2008
@@ -0,0 +1,408 @@
+// Copyright 2008 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.
+
+package org.apache.tapestry.mojo;
+
+import org.codehaus.doxia.sink.Sink;
+import org.apache.maven.doxia.module.xhtml.XhtmlSink;
+
+/**
+ * Decorates an {@link XhtmlSink} so that it can be used in place of a
+ * {@link Sink}.<p/>
+ * Since {@link Sink} is currently deprecated, this decoratar may not be
+ * needed in the future - this will happen when the signature of
+ * org.apache.maven.reporting.MavenReport#generate(org.codehaus.doxia.sink.Sink, java.util.Locale)
+ * (from the org.apache.maven.reporting:maven-reporting-impl artifact) changes to
+ * org.apache.maven.reporting.MavenReport#generate(org.apache.maven.doxia.Sink, java.util.Locale) 
+ */
+public class DoxiaXhtmlSinkDecorator implements Sink {
+    private XhtmlSink _xhtmlSink;
+
+    public DoxiaXhtmlSinkDecorator(XhtmlSink xhtmlSink) {
+        _xhtmlSink = xhtmlSink;
+    }
+
+    public void head() {
+        _xhtmlSink.head();
+    }
+
+    public void head_() {
+        _xhtmlSink.head_();
+    }
+
+    public void title() {
+        _xhtmlSink.title();
+    }
+
+    public void title_() {
+        _xhtmlSink.title_();
+    }
+
+    public void author_() {
+        _xhtmlSink.author_();
+    }
+
+    public void date_() {
+        _xhtmlSink.date_();
+    }
+
+    public void body() {
+        _xhtmlSink.body();
+    }
+
+    public void body_() {
+        _xhtmlSink.body_();
+    }
+
+    public void section1() {
+        _xhtmlSink.section1();
+    }
+
+    public void section2() {
+        _xhtmlSink.section2();
+    }
+
+    public void section3() {
+        _xhtmlSink.section3();
+    }
+
+    public void section4() {
+        _xhtmlSink.section4();
+    }
+
+    public void section5() {
+        _xhtmlSink.section5();
+    }
+
+    public void section1_() {
+        _xhtmlSink.section1_();
+    }
+
+    public void section2_() {
+        _xhtmlSink.section2_();
+    }
+
+    public void section3_() {
+        _xhtmlSink.section3_();
+    }
+
+    public void section4_() {
+        _xhtmlSink.section4_();
+    }
+
+    public void section5_() {
+        _xhtmlSink.section5_();
+    }
+
+    public void sectionTitle1() {
+        _xhtmlSink.sectionTitle1();
+    }
+
+    public void sectionTitle1_() {
+        _xhtmlSink.sectionTitle1_();
+    }
+
+    public void sectionTitle2() {
+        _xhtmlSink.sectionTitle2();
+    }
+
+    public void sectionTitle2_() {
+        _xhtmlSink.sectionTitle2_();
+    }
+
+    public void sectionTitle3() {
+        _xhtmlSink.sectionTitle3();
+    }
+
+    public void sectionTitle3_() {
+        _xhtmlSink.sectionTitle3_();
+    }
+
+    public void sectionTitle4() {
+        _xhtmlSink.sectionTitle4();
+    }
+
+    public void sectionTitle4_() {
+        _xhtmlSink.sectionTitle4_();
+    }
+
+    public void sectionTitle5() {
+        _xhtmlSink.sectionTitle5();
+    }
+
+    public void sectionTitle5_() {
+        _xhtmlSink.sectionTitle5_();
+    }
+
+    public void list() {
+        _xhtmlSink.list();
+    }
+
+    public void list_() {
+        _xhtmlSink.list_();
+    }
+
+    public void listItem() {
+        _xhtmlSink.listItem();
+    }
+
+    public void listItem_() {
+        _xhtmlSink.listItem_();
+    }
+
+    public void numberedList(int i) {
+        _xhtmlSink.numberedList(i);
+    }
+
+    public void numberedList_() {
+        _xhtmlSink.numberedList_();
+    }
+
+    public void numberedListItem() {
+        _xhtmlSink.numberedListItem();
+    }
+
+    public void numberedListItem_() {
+        _xhtmlSink.numberedListItem_();
+    }
+
+    public void definitionList() {
+        _xhtmlSink.definitionList();
+    }
+
+    public void definitionList_() {
+        _xhtmlSink.definitionList_();
+    }
+
+    public void definedTerm() {
+        _xhtmlSink.definedTerm();
+    }
+
+    public void definedTerm_() {
+        _xhtmlSink.definedTerm_();
+    }
+
+    public void definition() {
+        _xhtmlSink.definition();
+    }
+
+    public void definition_() {
+        _xhtmlSink.definition_();
+    }
+
+    public void paragraph() {
+        _xhtmlSink.paragraph();
+    }
+
+    public void paragraph_() {
+        _xhtmlSink.paragraph_();
+    }
+
+    public void verbatim(boolean b) {
+        _xhtmlSink.verbatim(b);
+    }
+
+    public void verbatim_() {
+        _xhtmlSink.verbatim_();
+    }
+
+    public void horizontalRule() {
+        _xhtmlSink.horizontalRule();
+    }
+
+    public void table() {
+        _xhtmlSink.table();
+    }
+
+    public void table_() {
+        _xhtmlSink.table_();
+    }
+
+    public void tableRows(int[] ints, boolean b) {
+        _xhtmlSink.tableRows(ints, b);
+    }
+
+    public void tableRows_() {
+        _xhtmlSink.tableRows_();
+    }
+
+    public void tableRow() {
+        _xhtmlSink.tableRow();
+    }
+
+    public void tableRow_() {
+        _xhtmlSink.tableRow_();
+    }
+
+    public void tableCell() {
+        _xhtmlSink.tableCell();
+    }
+
+    public void tableHeaderCell() {
+        _xhtmlSink.tableHeaderCell();
+    }
+
+    public void tableCell(boolean b) {
+        _xhtmlSink.tableCell(b);
+    }
+
+    public void tableCell(String s) {
+        _xhtmlSink.tableCell(s);
+    }
+
+    public void tableHeaderCell(String s) {
+        _xhtmlSink.tableHeaderCell(s);
+    }
+
+    public void tableCell(boolean b, String s) {
+        _xhtmlSink.tableCell(b, s);
+    }
+
+    public void tableCell_() {
+        _xhtmlSink.tableCell_();
+    }
+
+    public void tableHeaderCell_() {
+        _xhtmlSink.tableHeaderCell_();
+    }
+
+    public void tableCell_(boolean b) {
+        _xhtmlSink.tableCell_(b);
+    }
+
+    public void tableCaption() {
+        _xhtmlSink.tableCaption();
+    }
+
+    public void tableCaption_() {
+        _xhtmlSink.tableCaption_();
+    }
+
+    public void figure() {
+        _xhtmlSink.figure();
+    }
+
+    public void figure_() {
+        _xhtmlSink.figure_();
+    }
+
+    public void figureCaption() {
+        _xhtmlSink.figureCaption();
+    }
+
+    public void figureCaption_() {
+        _xhtmlSink.figureCaption_();
+    }
+
+    public void figureGraphics(String s) {
+        _xhtmlSink.figureGraphics(s);
+    }
+
+    public void anchor(String s) {
+        _xhtmlSink.anchor(s);
+    }
+
+    public void anchor_() {
+        _xhtmlSink.anchor_();
+    }
+
+    public void link(String s) {
+        _xhtmlSink.link(s);
+    }
+
+    public void link(String s, String s1) {
+        _xhtmlSink.link(s, s1);
+    }
+
+    public void link_() {
+        _xhtmlSink.rawText("</a>");
+        //_xhtmlSink.link_();
+    }
+
+    public void italic() {
+        _xhtmlSink.italic();
+    }
+
+    public void italic_() {
+        _xhtmlSink.italic_();
+    }
+
+    public void bold() {
+        _xhtmlSink.bold();
+    }
+
+    public void bold_() {
+        _xhtmlSink.bold_();
+    }
+
+    public void monospaced() {
+        _xhtmlSink.monospaced();
+    }
+
+    public void monospaced_() {
+        _xhtmlSink.monospaced_();
+    }
+
+    public void lineBreak() {
+        _xhtmlSink.lineBreak();
+    }
+
+    public void nonBreakingSpace() {
+        _xhtmlSink.nonBreakingSpace();
+    }
+
+    public void text(String s) {
+        _xhtmlSink.text(s);
+    }
+
+    public void rawText(String s) {
+        _xhtmlSink.rawText(s);
+    }
+
+    public void flush() {
+        _xhtmlSink.flush();
+    }
+
+    public void close() {
+        _xhtmlSink.close();
+    }
+
+    public void definitionListItem() {
+        _xhtmlSink.definitionListItem();
+    }
+
+    public void definitionListItem_() {
+        _xhtmlSink.definitionListItem_();
+    }
+
+    public void author() {
+        _xhtmlSink.author();
+    }
+
+    public void date() {
+        _xhtmlSink.date();
+    }
+
+    public void sectionTitle() {
+        _xhtmlSink.sectionTitle();
+    }
+
+    public void sectionTitle_() {
+        _xhtmlSink.sectionTitle_();
+    }
+
+    public void pageBreak() {
+        _xhtmlSink.pageBreak();
+    }
+}