--- /dev/null
+/*\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