2011-01-28 5 views
10

Usiamo un sacco di file legacynel nostro progetto e vogliamo convertirli in file package-info.java. Farlo manualmente non è un'opzione (troppi file). C'è un buon modo per automatizzarlo?Come posso convertire automaticamente tutti i file javadoc package.html in file package-info.java?

Vogliamo convertire loro per un paio di motivi:

  • dalle specifiche javadoc: Questo file è nuovo in JDK 5.0, ed è preferibile rispetto package.html.

  • non mescolare entrambi i tipi di file nella stessa base di codice

  • Per evitare che IntelliJ/Eclipse costruisce messo quei file * .html nelle nostre classi dirs (e, eventualmente, in un comunicato vasetti binarie) in modo da comportarsi come le altre normali risorse HTML.

risposta

7

Potrebbe essere necessario modificare il separatore di directory se non si esegue Windows. Inoltre, la conversione è un po 'un trucco, ma dovrebbe funzionare. Per curiosità, quanti pacchetti hai che il manuale non è un'opzione?

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

Non penso che sia solo un caso di ridenominazione: vedere http://download.oracle.com/javase/1.5.0/docs/tooldocs/windows/javadoc.html#packagecomment –

+0

Abbastanza vero. Dovrebbe essere facile afferrare il contenuto dall'interno del tag del corpo html, metterlo in forma indentata in un commento javadoc e aggiungere il FQN per il pacchetto. Lo metterò giù come progetto da fare la prossima settimana. – SEK

+0

Sì .... quindi sono annoiato. Ho scritto un convertitore adeguato questa volta. Aggiornato. – SEK

Problemi correlati