1 package de.java2html.anttasks; 2 3 import java.io.File ; 4 import java.io.FileWriter ; 5 import java.io.IOException ; 6 import java.io.Writer ; 7 8 import de.java2html.converter.IJavaSourceConverter; 9 import de.java2html.converter.JavaSourceConverterProvider; 10 import de.java2html.javasource.JavaSource; 11 import de.java2html.javasource.JavaSourceParser; 12 import de.java2html.options.ConversionOptionsUtilities; 13 import de.java2html.options.HorizontalAlignment; 14 import de.java2html.options.JavaSourceConversionOptions; 15 import de.java2html.options.JavaSourceStyleTable; 16 import de.java2html.util.IoUtilities; 17 18 import org.apache.tools.ant.BuildException; 19 import org.apache.tools.ant.DirectoryScanner; 20 import org.apache.tools.ant.Project; 21 import org.apache.tools.ant.taskdefs.MatchingTask; 22 import org.apache.tools.ant.util.FileNameMapper; 23 import org.apache.tools.ant.util.GlobPatternMapper; 24 import org.apache.tools.ant.util.SourceFileScanner; 25 26 40 public class Java2HtmlTask extends MatchingTask { 41 private String style = JavaSourceConversionOptions.getDefault().getStyleTable().getName(); 42 private File srcDir; 43 private File destDir; 44 private boolean overwrite = false; 45 private String outputFormat = JavaSourceConverterProvider.getDefaultConverterName(); 46 private int tabs = JavaSourceConversionOptions.getDefault().getTabSize(); 47 private boolean showLineNumbers = JavaSourceConversionOptions.getDefault().isShowLineNumbers(); 48 private boolean showDefaultTitle = false; 49 private boolean addLineAnchors = false; 50 private String lineAnchorPrefix = ""; 51 private boolean showTableBorder = false; 52 private boolean showFileName = false; 53 private boolean includeDocumentHeader = true; 54 private boolean includeDocumentFooter = true; 55 private boolean useShortFileName = false; 56 private String horizontalAlignment = JavaSourceConversionOptions 57 .getDefault().getHorizontalAlignment().getName(); 58 59 60 66 public void setSrcDir(File srcDir) { 67 this.srcDir = srcDir; 68 } 69 70 76 public void setDestDir(File destDir) { 77 this.destDir = destDir; 78 } 79 80 86 public void setOutputFormat(String outputFormat) { 87 this.outputFormat = outputFormat; 88 } 89 90 93 public void execute() throws BuildException { 94 if (srcDir == null) { 95 srcDir = project.resolveFile("."); 98 } 99 100 DirectoryScanner dirScanner = getDirectoryScanner(srcDir); 102 103 String [] allSourceFiles = dirScanner.getIncludedFiles(); 105 106 IJavaSourceConverter converter = getConverter(); 107 JavaSourceConversionOptions options = getConversionOptions(); 108 SourceFileScanner sourceScanner = new SourceFileScanner(this); 109 110 String [] sourceFilesToProcess; 111 if (isOverwrite()) { 112 sourceFilesToProcess = allSourceFiles; 113 } 114 else { 115 FileNameMapper sourceToOutMapper = new GlobPatternMapper(); 116 sourceToOutMapper.setFrom("*"); 117 sourceToOutMapper.setTo("*." + converter.getMetaData().getDefaultFileExtension()); 118 sourceFilesToProcess = sourceScanner.restrict(allSourceFiles, srcDir, destDir, sourceToOutMapper); 119 } 120 121 if (sourceFilesToProcess.length > 0) { 122 String files = (sourceFilesToProcess.length == 1 ? " file" : " files"); 123 log("Converting " + sourceFilesToProcess.length + files, Project.MSG_INFO); 124 } 125 126 for (int i = 0; i < sourceFilesToProcess.length; ++i) { 127 process(sourceFilesToProcess[i], options, converter); 128 } 129 } 130 131 136 private JavaSourceConversionOptions getConversionOptions() { 137 JavaSourceConversionOptions options = JavaSourceConversionOptions.getDefault(); 138 options.setTabSize(tabs); 139 options.setShowFileName(isShowFileName()); 140 options.setShowTableBorder(isShowTableBorder()); 141 options.setShowLineNumbers(isShowLineNumbers()); 142 options.setAddLineAnchors(isAddLineAnchors()); 143 options.setLineAnchorPrefix(lineAnchorPrefix); 144 145 JavaSourceStyleTable table = JavaSourceStyleTable.getPredefinedTable(style); 146 if (table == null) { 147 throw new BuildException("Specified style table '" 148 + style 149 + "' does not exist " 150 + " - valid values are: " 151 + ConversionOptionsUtilities.getPredefinedStyleTableNameString()); 152 } 153 options.setStyleTable(table); 154 155 HorizontalAlignment alignment = HorizontalAlignment.getByName(horizontalAlignment); 156 if (alignment == null) { 157 throw new BuildException("Specified alignment '" + horizontalAlignment 159 + "'does not exist - valid values are: " + ConversionOptionsUtilities.getAvailableHorizontalAlignmentNames()); 161 } 162 options.setHorizontalAlignment(alignment); 163 164 return options; 165 } 166 167 private IJavaSourceConverter getConverter() throws BuildException { 168 IJavaSourceConverter converter = JavaSourceConverterProvider.getJavaSourceConverterByName(outputFormat); 169 if (converter == null) { 170 throw new BuildException("unknown output file format: " + outputFormat); } 172 return converter; 173 } 174 175 185 private void process(String sourcefileName, JavaSourceConversionOptions options, IJavaSourceConverter converter) 186 throws BuildException { 187 log("Converting '" + sourcefileName + "'", Project.MSG_VERBOSE); JavaSourceParser parser = new JavaSourceParser(options); 189 JavaSource source; 190 File inFile = new File (srcDir, sourcefileName); 191 try { 192 source = parser.parse(inFile); 193 } 194 catch (IOException e1) { 195 throw new BuildException("Unable to parse file " + inFile.getName(), e1); } 197 198 File outFile = createOutputFile(sourcefileName, converter); 199 ensureDirectoryFor(outFile); 200 Writer writer = null; 201 try { 202 writer = new FileWriter (outFile); 203 } 204 catch (Exception e) { 205 throw new BuildException("Error opening output file " + outFile.getName(), e); } 207 208 String title = ""; if (isShowDefaultTitle()) { 210 title = sourcefileName.replace('\\', '/'); 211 } 212 try { 213 if (isIncludeDocumentHeader()) { 214 converter.writeDocumentHeader(writer, options, title); 215 } 216 converter.convert(source, options, writer); 217 if (isIncludeDocumentFooter()) { 218 converter.writeDocumentFooter(writer, options); 219 } 220 } 221 catch (Exception e) { 222 throw new BuildException("Error writing output to " + outFile.getName(), e); } 224 finally { 225 IoUtilities.close(writer); 226 } 227 228 log("Output: " + outFile, Project.MSG_VERBOSE); } 230 231 private File createOutputFile(String sourcefileName, IJavaSourceConverter converter) { 232 String fileNamePrefix = sourcefileName; 233 if (isUseShortFileName()) { 234 int index = sourcefileName.lastIndexOf('.'); 235 if (index != -1) { 236 fileNamePrefix = sourcefileName.substring(0, index); 237 } 238 } 239 return new File (destDir, fileNamePrefix + "." + converter.getMetaData().getDefaultFileExtension()); 240 } 241 242 247 public void setTabs(int tabs) { 248 this.tabs = tabs; 249 } 250 251 256 public void setStyle(String style) { 257 this.style = style; 258 } 259 260 268 private void ensureDirectoryFor(File targetFile) throws BuildException { 269 File directory = new File (targetFile.getParent()); 270 if (!directory.exists()) { 271 if (!directory.mkdirs()) { 272 throw new BuildException("Unable to create directory: " + directory.getAbsolutePath()); 273 } 274 } 275 } 276 277 private boolean isShowFileName() { 278 return showFileName; 279 } 280 281 private boolean isShowLineNumbers() { 282 return showLineNumbers; 283 } 284 285 private boolean isShowDefaultTitle() { 286 return showDefaultTitle; 287 } 288 289 private boolean isShowTableBorder() { 290 return showTableBorder; 291 } 292 293 public void setShowFileName(boolean showFileName) { 294 this.showFileName = showFileName; 295 } 296 297 public void setShowLineNumbers(boolean showLineNumbers) { 298 this.showLineNumbers = showLineNumbers; 299 } 300 301 public void setShowDefaultTitle(boolean showDefaultTitle) { 302 this.showDefaultTitle = showDefaultTitle; 303 } 304 305 public void setShowTableBorder(boolean showTableBorder) { 306 this.showTableBorder = showTableBorder; 307 } 308 309 private boolean isIncludeDocumentFooter() { 310 return includeDocumentFooter; 311 } 312 313 private boolean isIncludeDocumentHeader() { 314 return includeDocumentHeader; 315 } 316 317 public void setIncludeDocumentFooter(boolean includeDocumentFooter) { 318 this.includeDocumentFooter = includeDocumentFooter; 319 } 320 321 public void setIncludeDocumentHeader(boolean includeDocumentHeader) { 322 this.includeDocumentHeader = includeDocumentHeader; 323 } 324 325 private boolean isAddLineAnchors() { 326 return addLineAnchors; 327 } 328 329 public void setAddLineAnchors(boolean addLineAnchors) { 330 this.addLineAnchors = addLineAnchors; 331 } 332 333 public void setLineAnchorPrefix(String string) { 334 lineAnchorPrefix = string; 335 } 336 337 public void setHorizontalAlignment(String horizontalAlignment) { 338 this.horizontalAlignment = horizontalAlignment; 339 } 340 341 private boolean isUseShortFileName() { 342 return useShortFileName; 343 } 344 345 public void setUseShortFileName(boolean useShortFileName) { 346 this.useShortFileName = useShortFileName; 347 } 348 349 private boolean isOverwrite() { 350 return overwrite; 351 } 352 353 public void setOverwrite(boolean overwrite) { 354 this.overwrite = overwrite; 355 } 356 } | Popular Tags |