• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2 *******************************************************************************
3 * Copyright (C) 2004-2015, International Business Machines Corporation and    *
4 * others. All Rights Reserved.                                                *
5 *******************************************************************************
6 */
7 
8 /**
9  * Represent a file of APIInfo records.
10  */
11 
12 package com.ibm.icu.dev.tool.docs;
13 
14 import java.io.BufferedReader;
15 import java.io.File;
16 import java.io.FileInputStream;
17 import java.io.IOException;
18 import java.io.InputStream;
19 import java.io.InputStreamReader;
20 import java.io.PrintWriter;
21 import java.util.Collections;
22 import java.util.Enumeration;
23 import java.util.Iterator;
24 import java.util.Set;
25 import java.util.TreeSet;
26 import java.util.zip.GZIPInputStream;
27 import java.util.zip.ZipEntry;
28 import java.util.zip.ZipFile;
29 
30 public final class APIData {
31     int version;
32     String name;
33     String base;
34     TreeSet<APIInfo> set;
35 
read(BufferedReader br, boolean internal)36     static APIData read(BufferedReader br, boolean internal) {
37         try {
38             APIData data = new APIData();
39 
40             data.version = Integer.parseInt(APIInfo.readToken(br)); // version
41             if (data.version > APIInfo.VERSION) {
42                 throw new IllegalArgumentException(
43                     "data version " + data.version
44                     + " is newer than current version (" + APIInfo.VERSION + ")");
45             }
46             data.name = APIInfo.readToken(br);
47             data.base = APIInfo.readToken(br); // base
48             br.readLine();
49 
50             data.set = new TreeSet(APIInfo.defaultComparator());
51             for (APIInfo info = new APIInfo(); info.read(br); info = new APIInfo()) {
52                 if (internal || !info.isInternal()) {
53                     data.set.add(info);
54                 }
55             }
56             // System.out.println("read " + data.set.size() + " record(s)");
57             return data;
58         }
59         catch (IOException e) {
60             RuntimeException re = new RuntimeException("error reading api data");
61             re.initCause(e);
62             throw re;
63         }
64     }
65 
read(File file, boolean internal)66     public static APIData read(File file, boolean internal) {
67         String fileName = file.getName();
68         ZipFile zf = null;
69         try {
70             InputStream is;
71             if (fileName.endsWith(".zip")) {
72                 zf = new ZipFile(file);
73                 Enumeration entryEnum = zf.entries();
74                 if (entryEnum.hasMoreElements()) {
75                     ZipEntry entry = (ZipEntry)entryEnum.nextElement();
76                     is = zf.getInputStream(entry);
77                     // we only handle one!!!
78                 } else {
79                     throw new IOException("zip file is empty");
80                 }
81             } else {
82                 is = new FileInputStream(file);
83                 if (fileName.endsWith(".gz")) {
84                     is = new GZIPInputStream(is);
85                 }
86             }
87             InputStreamReader isr = new InputStreamReader(is);
88             return read(new BufferedReader(isr), internal);
89         } catch (IOException e) {
90             RuntimeException re = new RuntimeException("error getting info stream: " + fileName);
91             re.initCause(e);
92             throw re;
93         } finally {
94             if (zf != null) {
95                 try {
96                     zf.close();
97                 } catch (IOException e) {
98                     RuntimeException re = new RuntimeException("failed to close the zip file: " + fileName);
99                     re.initCause(e);
100                     throw re;
101                 }
102             }
103         }
104     }
105 
read(String fileName, boolean internal)106     static APIData read(String fileName, boolean internal) {
107         return read(new File(fileName), internal);
108     }
109 
110     private static final String[] stanames = {
111         "draft", "stable", "deprecated", "obsolete", "internal"
112     };
113     private static final String[] catnames = {
114         "classes", "fields", "constructors", "methods"
115     };
116 
printStats(PrintWriter pw)117     public void printStats(PrintWriter pw) {
118         // classes, methods, fields
119         // draft, stable, other
120 
121         int[] stats = new int[catnames.length * stanames.length];
122 
123         Iterator iter = set.iterator();
124         while (iter.hasNext()) {
125             APIInfo info = (APIInfo)iter.next();
126 
127             if (info.isPublic() || info.isProtected()) {
128                 int sta = info.getVal(APIInfo.STA);
129                 int cat = info.getVal(APIInfo.CAT);
130                 stats[cat * stanames.length + sta] += 1;
131             }
132         }
133 
134         int tt = 0;
135         for (int cat = 0; cat < catnames.length; ++cat) {
136             pw.println(catnames[cat]);
137             int t = 0;
138             for (int sta = 0; sta < stanames.length; ++sta) {
139                 int v = stats[cat * stanames.length + sta];
140                 t += v;
141                 pw.println("   " + stanames[sta] + ": " + v);
142             }
143             tt += t;
144             pw.println("total: " + t);
145             pw.println();
146         }
147         pw.println("total apis: " + tt);
148     }
149 
getAPIInfoSet()150     public Set<APIInfo> getAPIInfoSet() {
151         return Collections.unmodifiableSet(set);
152     }
153 
main(String[] args)154     public static void main(String[] args) {
155         PrintWriter pw = new PrintWriter(System.out);
156 
157         boolean internal = false;
158         String path = "src/com/ibm/icu/dev/tool/docs/";
159 
160         String fn = "icu4j52.api3.gz";
161         if (args.length == 0) {
162             args = new String[] { "-file", fn };
163         }
164 
165         for (int i = 0; i < args.length; ++i) {
166             String arg = args[i];
167             if (arg.equals("-path:")) {
168                 path = args[++i];
169             } else if (arg.equals("-internal:")) {
170                 internal = args[++i].toLowerCase().charAt(0) == 't';
171             } else if (arg.equals("-file")) {
172                 fn = args[++i];
173 
174                 File f = new File(path, fn);
175                 read(f,internal).printStats(pw);
176                 pw.flush();
177             }
178         }
179     }
180 }
181