/* * Copyright (c) 2005, Rob Gordon. */ package org.oddjob.doclet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import org.oddjob.arooa.ConfiguredHow; import org.oddjob.arooa.beandocs.BeanDoc; import org.oddjob.arooa.beandocs.ExampleDoc; import org.oddjob.arooa.beandocs.PropertyDoc; /** * Creates the reference files. * * @author Rob Gordon. */ public class ManualWriter { public static final String COPYWRITE = "(c) Rob Gordon 2005 - 2016"; private final File directory; private final String title; public ManualWriter(String directory, String title) { this.directory = new File(directory); this.title = title == null ? "Oddjob Reference" : title; } /** * Write a single reference page. * * @param beanDoc */ public void writePage(BeanDoc beanDoc) { PrintWriter out = null; try { File file = new File(directory, getFileName(beanDoc.getClassName())); file.getParentFile().mkdirs(); out = new PrintWriter( new FileOutputStream(file)); } catch (IOException e) { throw new RuntimeException(e); } out.println("<html>"); out.println(" <head>"); out.println(" <title>" + title + " - " + beanDoc.getName() + "</title>"); out.println(" </head>"); out.println(" <body>"); out.println(" [<a href=\"" + getIndexFile(beanDoc.getClassName()) + "\">Index</a>]"); out.println(" <h1>" + beanDoc.getName() + "</h1>"); if (beanDoc.getAllText() != null) { out.println(" <hr/>"); out.println(beanDoc.getAllText()); } PropertyDoc[] propertyDocs = beanDoc.getPropertyDocs(); if (propertyDocs.length > 0) { out.println(" <hr/>"); out.println(" <h3>Property Summary</h3>"); out.println(" <table width='100%' border='1'" + " cellpadding='3' cellspacing='0'>"); int i = 0; for (PropertyDoc elem : propertyDocs ) { if (ConfiguredHow.HIDDEN == elem.getConfiguredHow()) { continue; } out.println(" <tr>"); out.println(" <td><a href='#property" + ++i + "'>" + elem.getPropertyName() + "</a></td>"); out.println(" <td>" + (elem.getFirstSentence() == null ? " " : elem.getFirstSentence()) + "</td>"); out.println(" </tr>"); } out.println(" </table>"); } ExampleDoc[] exampleDocs = beanDoc.getExampleDocs(); if (exampleDocs.length > 0) { out.println(" <hr/>"); out.println(" <h3>Example Summary</h3>"); out.println(" <table width='100%' border='1'" + " cellpadding='3' cellspacing='0'>"); int i = 0; for (ExampleDoc elem : exampleDocs ) { out.println(" <tr>"); out.println(" <td><a href='#example" + ++i + "'>Example " + i + "</a></td>"); out.println(" <td>" + (elem.getFirstSentence() == null ? " " : elem.getFirstSentence()) + "</td>"); out.println(" </tr>"); } out.println(" </table>"); } if (propertyDocs.length > 0) { out.println(" <hr/>"); out.println(" <h3>Property Detail</h3>"); int i = 0; for (PropertyDoc elem : propertyDocs ) { if (ConfiguredHow.HIDDEN == elem.getConfiguredHow()) { continue; } out.println(" <a name='property" + ++i + "'><h4>" + elem.getPropertyName() + "</h4></a>"); out.println(" <table style='font-size:smaller'>"); if (elem.getAccess() != PropertyDoc.Access.READ_ONLY) { out.println(" <tr><td><i>Configured By</i></td><td>" + elem.getConfiguredHow() + "</td></tr>"); } out.println(" <tr><td><i>Access</i></td><td>" + elem.getAccess() + "</td></tr>"); String required = elem.getRequired(); if (required != null) { out.println(" <tr><td><i>Required</i></td><td>" + required + "</td></tr>"); } out.println(" </table>"); out.println(" <p>"); out.println(elem.getAllText() == null ? "" : elem.getAllText()); out.println(" </p>"); } } if (exampleDocs.length > 0) { out.println(" <hr/>"); out.println(" <h3>Examples</h3>"); int i = 0; for (ExampleDoc example : exampleDocs) { out.println(" <a name='example" + ++i + "'><h4>Example " + i + "</h4></a>"); out.println(" <p>"); out.println(example.getAllText()); out.println(" </p>"); } } out.println(" <hr/>"); out.println(" <font size='-1' align='center'>" + COPYWRITE + "</font>"); out.println(" </body>"); out.println(" </html>"); out.close(); } /** * Create the index. * * @param jobs * @param types */ public void writeIndex(IndexLine[] jobs, IndexLine[] types) { PrintWriter out = null; try { out = new PrintWriter( new FileOutputStream( new File(directory, "index.html"))); } catch (IOException e) { throw new RuntimeException(e); } out.println("<html>"); out.println(" <head>"); out.println(" [<a href=\"../index.html\">Home</a>]"); out.println(" <title>" + title + " - Contents</title>"); out.println(" </head>"); out.println(" <body>"); out.println(" <h2>" + title + "</h2>"); out.println(" <ul>"); out.println(" <li>Jobs"); out.println(" <ul>"); for (int i = 0; i < jobs.length; ++i) { IndexLine beanDoc = jobs[i]; out.println(" <li>"); out.println(" <a href='" + getFileName( beanDoc.getClassName()) + "'>" + beanDoc.getName() + "</a> - " + beanDoc.getFirstSentence()); out.println(" </li>"); } out.println(" </ul></li>"); out.println(" <li>Types"); out.println(" <ul>"); for (int i = 0; i < types.length; ++i) { IndexLine beanDoc = types[i]; out.println(" <li>"); out.println(" <a href='" + getFileName( beanDoc.getClassName()) + "'>" + beanDoc.getName() + "</a> - " + beanDoc.getFirstSentence()); out.println(" </li>"); } out.println(" </ul></li>"); out.println(" </ul>"); out.println(" <hr/>"); out.println(" <font size='-1' align='center'>" + COPYWRITE + "</font>"); out.println(" </body>"); out.println(" </html>"); out.close(); } public void writeAll(Iterable<? extends BeanDoc> all) { for (BeanDoc beanDoc : all ) { writePage(beanDoc); } } public void createManual(Archiver archiver) { writeIndex(archiver.getJobData(), archiver.getTypeData()); writeAll(archiver.getAll()); } /** * Get the file name the page data should be created in. * * @return The file name. */ public String getFileName(String className) { return className.replace('.', '/') + ".html"; } /** * Get the index file. This is a reference back and will depend * on the package depth. * * @return The file name. */ public static String getIndexFile(String className) { String path = ""; int start = 0; while ((start = className.indexOf('.', start) + 1) > 0) { path = path + "../"; } return path + "index.html"; } }