package x10doc.doc; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import com.sun.javadoc.AnnotationDesc; import com.sun.javadoc.AnnotationTypeDoc; import com.sun.javadoc.ClassDoc; import com.sun.javadoc.PackageDoc; public class X10PackageDoc extends X10Doc implements PackageDoc { String name; String path; ArrayList<X10ClassDoc> classes; X10RootDoc rootDoc; boolean included; X10ClassDoc[] includedClasses; public X10PackageDoc(String name, String path) { //super(""); this.name = name; this.path = path; this.rootDoc = X10RootDoc.getRootDoc(); this.classes = new ArrayList<X10ClassDoc>(); this.included = false; // defn of included: set of entities (classes/packages) that are specified on the // command-line and that pass through the access modifier filter; at present, x10doc // does not handle command-line specified packages, so X10PackageDoc.included is // false for all packages super.processComment(getComment()); } public void addClass(X10ClassDoc cd) { classes.add(cd); /* if (!included && cd.isIncluded()) { included = true; // rootDoc.makePackageIncluded(name); } */ } @Override public String name() { return name; } public boolean isIncluded() { return included; } // returns all *included* classes and interfaces, as per definition public ClassDoc[] allClasses() { // System.out.println("PackageDoc.allClasses() called."); // return classes.toArray(new X10ClassDoc[0]); if (includedClasses != null) { return includedClasses; } int size = 0; for (X10ClassDoc cd: classes) { if (cd.isIncluded()) { size++; } } includedClasses = new X10ClassDoc[size]; int i = 0; for (X10ClassDoc cd: classes) { if (cd.isIncluded()) { includedClasses[i++] = cd; } } Comparator<X10ClassDoc> cmp = new Comparator<X10ClassDoc>() { public int compare(X10ClassDoc first, X10ClassDoc second) { return first.name().compareTo(second.name()); } public boolean equals(Object other) { return false; } }; Arrays.sort(includedClasses, cmp); return includedClasses; } public ClassDoc[] allClasses(boolean arg0) { System.out.println("PackageDoc.allClasses(boolean) called."); return allClasses(); /* if (arg0) { return allClasses(); } return classes.toArray(new X10ClassDoc[0]); */ } public AnnotationTypeDoc[] annotationTypes() { // TODO Auto-generated method stub System.out.println("PackageDoc.annotationTypes() called."); return new AnnotationTypeDoc[0]; } public AnnotationDesc[] annotations() { // TODO Auto-generated method stub // System.out.println("PackageDoc.annotations() called."); return new AnnotationDesc[0]; } public ClassDoc[] enums() { // TODO Auto-generated method stub System.out.println("PackageDoc.enums() called."); return new ClassDoc[0]; } public ClassDoc[] errors() { // TODO Auto-generated method stub System.out.println("PackageDoc.errors() called."); return new ClassDoc[0]; } public ClassDoc[] exceptions() { // TODO Auto-generated method stub System.out.println("PackageDoc.exceptions() called."); return new ClassDoc[0]; } public ClassDoc findClass(String arg0) { // TODO Auto-generated method stub System.out.println("PackageDoc.findClass() called."); return null; } public ClassDoc[] interfaces() { // TODO Auto-generated method stub System.out.println("PackageDoc.interfaces() called."); return new ClassDoc[0]; } public ClassDoc[] ordinaryClasses() { // TODO Auto-generated method stub System.out.println("PackageDoc.ordinaryClasses() called."); return allClasses(); } private String getComment() { FileChannel fc; BufferedReader br; try { File file = new File(path + "package.html"); if (file.exists()) { StringBuilder builder = new StringBuilder(); fc = new FileInputStream(file).getChannel(); br = new BufferedReader(Channels.newReader(fc, "UTF-8")); String delim = System.getProperty("line.separator"); String line = ""; while ((line = br.readLine()) != null) { builder.append(line); builder.append(delim); } String html = builder.toString(); int start = html.toLowerCase().indexOf("<body"); start = html.indexOf(">", start) + 1; int end = html.toLowerCase().indexOf("</body>", start); String body = html.substring(start, end); br.close(); fc.close(); return "/**" + body + "*/"; } } catch (Exception e) { // fall through } return ""; } public X10ClassDoc classDocForName(String name) { for(X10ClassDoc cd: classes) { if (cd.simpleTypeName().equals(name)) { return cd; } } return null; } }