--- /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.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