2011-01-28 11 views
10

हम अपनी परियोजना में कई विरासत package.html फ़ाइलों का उपयोग करते हैं और हम उन्हें package-info.java फ़ाइलों में कनवर्ट करना चाहते हैं। ऐसा करना मैन्युअल रूप से एक विकल्प नहीं है (रास्ता बहुत अधिक फाइलें)। क्या इसे स्वचालित करने का कोई अच्छा तरीका है?मैं स्वचालित रूप से सभी javadoc package.html फ़ाइलों को package-info.java फ़ाइलों में कैसे परिवर्तित करूं?

हम उन्हें कारणों की एक जोड़ी के लिए कनवर्ट करना चाहते हैं:

  • जावाडोक चश्मा से: इस फ़ाइल में JDK 5.0 में नया है, और package.html से अधिक पसंद किया जाता है।

  • एक ही codebase

  • में फ़ाइलों के दोनों प्रकार के मिश्रण नहीं करने के लिए से बचने के लिए कि Intellij/ग्रहण उन * .html फ़ाइलें हमारे कक्षाओं dirs में (एक विज्ञप्ति में द्विआधारी जार और संभवतः) डाल बनाता है तो वे हमारे अन्य सामान्य एचटीएमएल संसाधनों की तरह व्यवहार करें।

उत्तर

7

यदि आप विंडोज़ नहीं चला रहे हैं तो आपको निर्देशिका विभाजक को बदलने की आवश्यकता हो सकती है। साथ ही, रूपांतरण एक हैक का थोड़ा सा है, लेकिन यह काम करना चाहिए। जिज्ञासा से, आपके पास कितने पैकेज हैं जो मैनुअल एक विकल्प नहीं है?

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

मुझे नहीं लगता कि यह सिर्फ नामकरण का मामला है - देखें http://download.oracle.com/javase/1.5.0/docs/tooldocs/windows/javadoc.html#packagecomment –

+0

काफी सच है। एचटीएमएल बॉडी टैग के अंदर से सामग्री को पकड़ना आसान होना चाहिए, इसे इंडेंट किए गए फॉर्म में जवाडोक टिप्पणी में डाल दें, और पैकेज के लिए एफक्यूएन संलग्न करें। मैं अगले हफ्ते में एक परियोजना के रूप में इसे नीचे रखूंगा। – SEK

+0

हाँ .... तो मैं ऊब गया हूँ। मैंने इस बार एक उचित कनवर्टर लिखा था। अपडेट किया गया। – SEK

0

इंटेलिजे लोगों ने an intention to do this for all files बनाया है। इसे हल किया गया है और शायद अगले इंटेलिज रिलीज में रिलीज़ किया जाएगा।

संबंधित मुद्दे