Как автоматически преобразовать все файлы javadoc package.html в файлы package-info.java?

Мы используем много старых файлов package.html в нашем проекте, и мы хотим конвертировать их в файлы package-info.java. Выполнение этого вручную не является вариантом (слишком много файлов). Есть ли способ автоматизировать это?

Мы хотим преобразовать их по нескольким причинам:

  • Из спецификаций javadoc: этот файл является новым в JDK 5.0 и предпочитается над package.html.

  • Чтобы не смешивать оба типа файлов в одной и той же кодовой базе

  • Чтобы избежать того, что сборки Intellij/Eclipse помещают эти *.html файлы в наши классы dirs (и, возможно, в двоичные двоичные разряды), они ведут себя как наши другие нормальные html-ресурсы.

Ответ 1

Вам может потребоваться изменить разделитель каталогов, если вы не используете Windows. Кроме того, преобразование - это немного взломанный, но он должен работать. Из любопытства, сколько пакетов у вас есть, это руководство не является вариантом?

public class Converter {

    public static void main(String[] args) {
        File rootDir = new File(".");
        renamePackageToPackageInfo(rootDir);
    }

    private static void renamePackageToPackageInfo(File dir) {
        File[] files = dir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return "package.html".equals(name);
            }
        });
        for (File file : files) {
            convertFile(file);
        }
        // now recursively rename all the child directories.
        File[] dirs = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory();
            }
        });
        for (File subdir : dirs) {
            renamePackageToPackageInfo(subdir);
        }
    }

    private static void convertFile(File html) {
        // determine the FQN package name
        String fqpn = getPackageName(html);

        // check if package-info.java already exists
        File packageInfo = new File(html.getParent(), "package-info.java");
        if (packageInfo.exists()) {
            System.out.println("package-info.java already exists for package: "+fqpn);
            return; 
        }

        // create the i/o streams, and start pumping the data
        try {
            PrintWriter out = new PrintWriter(packageInfo);
            BufferedReader in = new BufferedReader(new FileReader(html));
            out.println("/**");

            // skip over the headers
            while (true) {
                String line = in.readLine();
                if (line.equalsIgnoreCase("<BODY>"))
                    break;
            }
            // now pump the file into the package-info.java file
            while (true) {
                String line = in.readLine();
                if (line.equalsIgnoreCase("</BODY>"))
                    break;
                out.println(" * " + line);
            }

            out.println("*/");
            out.println("package "+fqpn+";");
            out.close();
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // queue the package.html file for deletion
        //html.deleteOnExit();
    }

    private static String getPackageName(File file) {
        StringBuilder path = new StringBuilder(file.getParent());
        // trim the first two characters (./ or .\)
        path.delete(0, 2);
        // then convert all separators into . (HACK: should use directory separator property)
        return path.toString().replaceAll("\\\\", ".");
    }

}