blob: 5aac62b2a21bcc945e317d2982e96c5d86b84470 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2010, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.dev.tool.docs;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.BitSet;
import java.util.Date;
import java.util.TreeSet;
/**
* @author yumaoka
*
*/
public class CollectAPI {
private static final int MAXSTATE = APIInfo.STA_INTERNAL;
private APIData _apidata;
CollectAPI(String file) {
_apidata = APIData.read(file, true);
}
void writeHTML(String outfile, BitSet filter) throws IOException {
// collecting versions
TreeSet<String> versions = new TreeSet<String>();
for (APIInfo info : _apidata.set) {
versions.add(info.getStatusVersion());
}
FileOutputStream fos = new FileOutputStream(outfile);
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(fos, "UTF-8")));
String title = "ICU4J API Collection: " + _apidata.name;
String note = "Contents generated by CollectAPI tool on " + new Date().toString();
pw.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
pw.println("<html>");
pw.println("<head>");
pw.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">");
pw.println("<title>" + title + "</title>");
pw.println("</head>");
pw.println("<body>");
pw.println("<h1>" + title + "</h1>");
for (String ver : versions) {
boolean sawEntryForVersion = false;
for (int state = 0; state <= MAXSTATE; state++) {
if (!filter.get(state)) {
continue;
}
boolean firstInState = true;
String pack = "";
String clas = "***"; // hack - we just need a class name never used
boolean inList = false;
for (APIInfo info : _apidata.set) {
if (!info.getStatusVersion().equals(ver)) {
continue;
}
if (state != info.getVal(APIInfo.STA)) {
continue;
}
if (!sawEntryForVersion) {
pw.println("<h2>Status Version: " + ver + "</h2>");
sawEntryForVersion = true;
}
if (firstInState) {
pw.println("<h3>[" + getStatusTypeName(state) + "]</h3>");
firstInState = false;
}
String packageName = info.getPackageName();
if (!packageName.equals(pack)) {
if (inList) {
pw.println("</ul>");
inList = false;
}
pw.println("<h4>Package: " + packageName + "</h4>");
pack = packageName;
}
String className = info.getClassName();
if (className.length() == 0) {
// next class
if (inList) {
pw.println("</ul>");
inList = false;
}
pw.print("<p><span style='color:red'>Class: </span>");
info.print(pw, false, true, false);
pw.println("</p>");
clas = className;
continue;
}
if (!className.equals(clas)) {
if (inList) {
pw.println("</ul>");
inList = false;
}
pw.println("<span style='color:green'>APIs: </span>" + className);
clas = className;
}
if (!inList) {
pw.println("<ul>");
inList = true;
}
pw.print("<li>");
info.print(pw, false, true, false);
pw.println("</li>");
}
if (inList) {
pw.println("</ul>");
}
}
if (sawEntryForVersion) {
pw.println();
pw.println("<hr/>");
}
}
pw.println("<p><i><font size=\"-1\">" + note + "</font></i></p>");
pw.println("</body>");
pw.println("</html>");
pw.close();
}
public static void main(String[] args) {
String apifile = null;
String outfile = "api.html";
BitSet filter = new BitSet(MAXSTATE + 1);
// default filter
filter.set(APIInfo.STA_STABLE);
filter.set(APIInfo.STA_DRAFT);
filter.set(APIInfo.STA_DEPRECATED);
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-f")) {
if (i + 1 == args.length) {
System.out.println("Missing filter argument");
return;
}
i++;
String[] types = args[i].split(",");
filter.clear();
for (String type : types) {
if (type.equalsIgnoreCase(getStatusTypeName(APIInfo.STA_STABLE))) {
filter.set(APIInfo.STA_STABLE);
} else if (type.equalsIgnoreCase(getStatusTypeName(APIInfo.STA_DRAFT))) {
filter.set(APIInfo.STA_DRAFT);
} else if (type.equalsIgnoreCase(getStatusTypeName(APIInfo.STA_DEPRECATED))) {
filter.set(APIInfo.STA_DEPRECATED);
} else if (type.equalsIgnoreCase(getStatusTypeName(APIInfo.STA_OBSOLETE))) {
filter.set(APIInfo.STA_OBSOLETE);
} else if (type.equalsIgnoreCase(getStatusTypeName(APIInfo.STA_INTERNAL))) {
filter.set(APIInfo.STA_INTERNAL);
} else {
System.out.println("Bad filter type " + type);
return;
}
}
} else if (args[i].equals("-o")) {
if (i + 1 == args.length) {
System.out.println("Missing filter argument");
return;
}
i++;
outfile = args[i];
} else {
apifile = args[i];
if (i + 1 != args.length) {
System.out.println("Too many arguments");
return;
}
}
}
if (apifile == null) {
System.out.println("No API file specified");
return;
}
CollectAPI collection = new CollectAPI(apifile);
try {
collection.writeHTML(outfile, filter);
} catch (IOException e) {
e.printStackTrace();
}
}
private static String getStatusTypeName(int status) {
String name = null;
switch (status) {
case APIInfo.STA_STABLE:
name = "Stable";
break;
case APIInfo.STA_DRAFT:
name = "Draft";
break;
case APIInfo.STA_DEPRECATED:
name = "Deprecated";
break;
case APIInfo.STA_OBSOLETE:
name = "Obsolete";
break;
case APIInfo.STA_INTERNAL:
name = "Internal";
break;
default:
throw new IllegalArgumentException("Bad API status type " + status);
}
return name;
}
}