/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.build.code; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; /** * This tool checks that for each .java file there is a package.html file, * that for each .java file there is at least one (class level) javadoc comment, * and that lines with comments are not too long. */ public class CheckJavadoc { private static final int MAX_COMMENT_LINE_SIZE = 80; private static final int MAX_SOURCE_LINE_SIZE = 120; private int errorCount; /** * This method is called when executing this application from the command * line. * * @param args the command line parameters */ public static void main(String... args) throws Exception { new CheckJavadoc().run(); } private void run() throws Exception { String baseDir = "src"; check(new File(baseDir)); if (errorCount > 0) { throw new Exception(errorCount + " errors found"); } } private int check(File file) throws Exception { String name = file.getName(); if (file.isDirectory()) { if (name.equals("CVS") || name.equals(".svn")) { return 0; } boolean foundPackageHtml = false, foundJava = false; for (File f : file.listFiles()) { int type = check(f); if (type == 1) { foundJava = true; } else if (type == 2) { foundPackageHtml = true; } } if (foundJava && !foundPackageHtml) { System.out.println("No package.html file, but a Java file found at: " + file.getAbsolutePath()); errorCount++; } } else { if (name.endsWith(".java")) { checkJavadoc(file); return 1; } else if (name.equals("package.html")) { return 2; } } return 0; } private void checkJavadoc(File file) throws IOException { RandomAccessFile in = new RandomAccessFile(file, "r"); byte[] data = new byte[(int) file.length()]; in.readFully(data); in.close(); String text = new String(data); int comment = text.indexOf("/**"); if (comment < 0) { System.out.println("No Javadoc comment: " + file.getAbsolutePath()); errorCount++; } int pos = 0; int lineNumber = 1; boolean inComment = false; while (true) { int next = text.indexOf("\n", pos); if (next < 0) { break; } String line = text.substring(pos, next).trim(); if (line.startsWith("/*")) { inComment = true; } if (inComment) { if (line.length() > MAX_COMMENT_LINE_SIZE && !line.trim().startsWith("* http://")) { System.out.println("Long line : " + file.getAbsolutePath() + " (" + file.getName() + ":" + lineNumber + ")"); errorCount++; } if (line.endsWith("*/")) { inComment = false; } } if (!inComment && line.startsWith("//") && line.length() > MAX_COMMENT_LINE_SIZE && !line.trim().startsWith("// http://")) { System.out.println("Long line: " + file.getAbsolutePath() + " (" + file.getName() + ":" + lineNumber + ")"); errorCount++; } else if (!inComment && line.length() > MAX_SOURCE_LINE_SIZE) { System.out.println("Long line: " + file.getAbsolutePath() + " (" + file.getName() + ":" + lineNumber + ")"); } lineNumber++; pos = next + 1; } } }