OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / cts / tools / signature-tools / test / signature / converter / doclet / DocletTestConverter.java
diff --git a/cts/tools/signature-tools/test/signature/converter/doclet/DocletTestConverter.java b/cts/tools/signature-tools/test/signature/converter/doclet/DocletTestConverter.java
new file mode 100644 (file)
index 0000000..8e867dd
--- /dev/null
@@ -0,0 +1,182 @@
+/*\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.File;\r
+import java.io.FileWriter;\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.HashSet;\r
+import java.util.Set;\r
+\r
+import signature.converter.Visibility;\r
+import signature.converter.doclet.DocletToSigConverter;\r
+import signature.converter.util.CompilationUnit;\r
+import signature.model.IApi;\r
+import signature.model.util.ModelUtil;\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 DocletTestConverter extends signature.converter.util.AbstractTestSourceConverter {\r
+\r
+    static String sourcepath;\r
+    static String separator;\r
+    \r
+    static {\r
+        separator = System.getProperty("file.separator");\r
+\r
+        sourcepath = System.getProperty("java.io.tmpdir");\r
+        sourcepath = sourcepath + separator + "cts" + separator;\r
+        System.out.println(">> "+sourcepath);\r
+    }\r
+\r
+    public IApi convert(Visibility visibility, Set<CompilationUnit> units) throws IOException {\r
+        try {\r
+            Set<String> packages = new HashSet<String>();\r
+            for(CompilationUnit u : units){\r
+                putSource(u);\r
+                String p = ModelUtil.getPackageName(u.getName());\r
+                assert p.length() > 0 : "default package not supported by doclets";\r
+                packages.add(p);\r
+            }\r
+            \r
+            RootDoc root = getRootDoc(visibility, packages);\r
+\r
+            DocletToSigConverter converter = new DocletToSigConverter();\r
+            \r
+            IApi api = converter.convertDocletRoot("Doclet Test", root, visibility, packages);\r
+            return api;\r
+        }\r
+        finally {\r
+            removeSources();\r
+        }\r
+    }\r
+    \r
+    public static void putSource(CompilationUnit source) throws IOException {\r
+        String directory = sourcepath;\r
+        String filename = source.getName();    // a.b.C\r
+        int pos = filename.indexOf(".");\r
+        while(pos > 0) {\r
+            directory = directory + filename.substring(0, pos) + separator;\r
+            filename = filename.substring(pos+1);\r
+            pos = filename.indexOf(".");\r
+        }\r
+        \r
+        File file = new File(directory, filename + ".java");\r
+        File parent = file.getParentFile();\r
+        parent.mkdirs();\r
+        \r
+        FileWriter wr = new FileWriter(file);\r
+        wr.write(source.getSource());\r
+        wr.close();\r
+    }\r
+\r
+    private static void removeSources() {\r
+        File file = new File(sourcepath);\r
+        removeFile(file);\r
+    }\r
+    \r
+    private static void removeFile(File file){\r
+        if(file.isDirectory()){\r
+            for(File f : file.listFiles()) removeFile(f);\r
+        }\r
+        file.delete();\r
+    }\r
+\r
+    private static RootDoc getRootDoc(Visibility visibility, java.util.Set<String> packages) throws IOException  {\r
+        long accessModifier = 0;\r
+        if(visibility == Visibility.PUBLIC){\r
+            accessModifier = \r
+                com.sun.tools.javac.code.Flags.PUBLIC;    // 0x1\r
+        }\r
+        if(visibility == Visibility.PROTECTED){\r
+            accessModifier = \r
+                com.sun.tools.javac.code.Flags.PUBLIC    // 0x1\r
+                | com.sun.tools.javac.code.Flags.PROTECTED;    // 0x4\r
+        }\r
+        if(visibility == Visibility.PACKAGE){\r
+            accessModifier = \r
+                com.sun.tools.javac.code.Flags.PUBLIC    // 0x1\r
+                | com.sun.tools.javac.code.Flags.PROTECTED    // 0x4\r
+                | com.sun.tools.javadoc.ModifierFilter.PACKAGE; // 0x80000000\r
+        }\r
+        if(visibility == Visibility.PRIVATE){\r
+            accessModifier = \r
+                com.sun.tools.javac.code.Flags.PUBLIC    // 0x1\r
+                | com.sun.tools.javac.code.Flags.PROTECTED    // 0x4\r
+                | com.sun.tools.javadoc.ModifierFilter.PACKAGE // 0x80000000\r
+                | com.sun.tools.javac.code.Flags.PRIVATE;    // 0x2\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
+        \r
+//        String sourcepath = "//D:/Documents/Projects/08_CTS/signature-tools/signature-tools/test/";\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, String.class);\r
+//            c.setAccessible(true);\r
+//            c.newInstance(context, "SigTest");\r
+            c = Messager.class.getDeclaredConstructor(Context.class, String.class, PrintWriter.class, PrintWriter.class, 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