OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / cts / tools / signature-tools / src / signature / converter / doclet / DocletFactory.java
diff --git a/cts/tools/signature-tools/src/signature/converter/doclet/DocletFactory.java b/cts/tools/signature-tools/src/signature/converter/doclet/DocletFactory.java
new file mode 100644 (file)
index 0000000..ea757db
--- /dev/null
@@ -0,0 +1,124 @@
+/*\r
+ * Copyright (C) 2009 The Android Open Source Project\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package signature.converter.doclet;\r
+\r
+import java.io.IOException;\r
+import java.io.PrintWriter;\r
+import java.io.StringWriter;\r
+import java.lang.reflect.Constructor;\r
+import java.util.Set;\r
+\r
+import signature.converter.Visibility;\r
+import signature.io.IApiLoader;\r
+import signature.model.IApi;\r
+\r
+import com.sun.javadoc.RootDoc;\r
+import com.sun.tools.javac.util.Context;\r
+import com.sun.tools.javac.util.ListBuffer;\r
+import com.sun.tools.javac.util.Options;\r
+import com.sun.tools.javadoc.JavadocTool;\r
+import com.sun.tools.javadoc.Messager;\r
+import com.sun.tools.javadoc.ModifierFilter;\r
+import com.sun.tools.javadoc.RootDocImpl;\r
+\r
+public class DocletFactory implements IApiLoader {\r
+\r
+    public IApi loadApi(String name, Visibility visibility,\r
+            Set<String> fileNames, Set<String> packageNames) throws\r
+            IOException {\r
+        for (String packageName : packageNames) {\r
+            if (packageName.length() == 0)\r
+                throw new IllegalArgumentException(\r
+                        "default package not supported by DocletFactory");\r
+        }\r
+        StringBuffer buf = new StringBuffer();\r
+        for (String filename : fileNames) {\r
+            buf.append(filename);\r
+            buf.append(":");\r
+        }\r
+        String sourcepath = buf.substring(0, buf.length() - 1);\r
+        RootDoc root = getRootDoc(visibility, sourcepath, packageNames);\r
+        DocletToSigConverter converter = new DocletToSigConverter();\r
+        IApi api = converter.convertDocletRoot(name, root, visibility,\r
+                packageNames);\r
+        return api;\r
+    }\r
+\r
+    private static RootDoc getRootDoc(Visibility visibility, String sourcepath,\r
+            java.util.Set<String> packages) throws IOException {\r
+        long accessModifier = 0;\r
+        switch (visibility) {\r
+        case PRIVATE:\r
+            accessModifier |= com.sun.tools.javac.code.Flags.PRIVATE; // 0x2\r
+        case PACKAGE:                                              // 0x80000000\r
+            accessModifier |= com.sun.tools.javadoc.ModifierFilter.PACKAGE;\r
+        case PROTECTED:\r
+            accessModifier |= com.sun.tools.javac.code.Flags.PROTECTED; // 0x4\r
+        case PUBLIC:\r
+            accessModifier |= com.sun.tools.javac.code.Flags.PUBLIC; // 0x1\r
+        }\r
+\r
+        ModifierFilter showAccess = new ModifierFilter(accessModifier);\r
+        boolean breakiterator = false;\r
+        boolean quiet = false;\r
+        boolean legacy = false;\r
+        boolean docClasses = false;\r
+\r
+        String docLocale = "";\r
+        String encoding = null;\r
+        ListBuffer<String> javaNames = new ListBuffer<String>();\r
+        for (String p : packages)\r
+            javaNames.append(p);\r
+\r
+        ListBuffer<String[]> options = new ListBuffer<String[]>();\r
+\r
+        options.append(new String[] {"-sourcepath", sourcepath});\r
+\r
+        ListBuffer<String> subPackages = new ListBuffer<String>();\r
+        ListBuffer<String> excludedPackages = new ListBuffer<String>();\r
+\r
+        Context context = new Context();\r
+        Options compOpts = Options.instance(context);\r
+        compOpts.put("-sourcepath", sourcepath);\r
+\r
+        Constructor<Messager> c;\r
+        try {\r
+            // c = Messager.class.getDeclaredConstructor(Context.class,\r
+            // String.class);\r
+            // c.setAccessible(true);\r
+            // c.newInstance(context, "SigTest");\r
+            c = Messager.class.getDeclaredConstructor(Context.class,\r
+                    String.class, PrintWriter.class, PrintWriter.class,\r
+                    PrintWriter.class);\r
+            c.setAccessible(true);\r
+            PrintWriter err = new PrintWriter(new StringWriter());\r
+            PrintWriter warn = new PrintWriter(new StringWriter());\r
+            PrintWriter notice = new PrintWriter(new StringWriter());\r
+            c.newInstance(context, "SigTest", err, warn, notice);\r
+        } catch (Exception e) {\r
+            throw new RuntimeException(e);\r
+        }\r
+\r
+        JavadocTool comp = JavadocTool.make0(context);\r
+        RootDocImpl root = comp.getRootDocImpl(docLocale, encoding, showAccess,\r
+                javaNames.toList(), options.toList(), breakiterator,\r
+                subPackages.toList(), excludedPackages.toList(), docClasses,\r
+                legacy, quiet);\r
+        return root;\r
+    }\r
+\r
+}\r