2011-01-28 8 views
10

Utilizamos un montón de archivos package.html heredados en nuestro proyecto y queremos convertirlos a archivos package-info.java. Hacer eso manualmente no es una opción (demasiados archivos). ¿Hay una buena manera de automatizar eso?¿Cómo convierto automáticamente todos los archivos javadoc package.html en archivos package-info.java?

Queremos convertirlos por un par de razones:

  • De las especificaciones javadoc: Este archivo es nuevo en el JDK 5.0, es preferible y más package.html.

  • no mezclar ambos tipos de archivos en la misma base de código

  • Para evitar que Intellij/Eclipse construye poner esos archivos * .html en nuestros directorios clases (y, posiblemente, en un comunicado de frascos binarios) para que comportarse como nuestros otros recursos html normales.

Respuesta

7

Es posible que tenga que cambiar el separador de directorios si no está ejecutando Windows. Además, la conversión es un poco un truco, pero debería funcionar. Por curiosidad, ¿cuántos paquetes tienes ese manual no es una opción?

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("\\\\", "."); 
    } 

} 
+1

No creo que sea solo un caso de cambio de nombre - vea http://download.oracle.com/javase/1.5.0/docs/tooldocs/windows/javadoc.html#packagecomment –

+0

Muy cierto. Debería ser fácil tomar el contenido del interior de la etiqueta del cuerpo html, ponerlo en forma de sangrado en un comentario de javadoc y anexar el FQN para el paquete. Lo dejaré como un proyecto para hacer durante la próxima semana. – SEK

+0

Sí ... así que estoy aburrido. Escribí un convertidor apropiado esta vez. Actualizado. – SEK

Cuestiones relacionadas