1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package signature.converter.doclet; 18 19 import java.io.IOException; 20 import java.io.PrintWriter; 21 import java.io.StringWriter; 22 import java.lang.reflect.Constructor; 23 import java.util.Set; 24 25 import signature.converter.Visibility; 26 import signature.io.IApiLoader; 27 import signature.model.IApi; 28 29 import com.sun.javadoc.RootDoc; 30 import com.sun.tools.javac.util.Context; 31 import com.sun.tools.javac.util.ListBuffer; 32 import com.sun.tools.javac.util.Options; 33 import com.sun.tools.javadoc.JavadocTool; 34 import com.sun.tools.javadoc.Messager; 35 import com.sun.tools.javadoc.ModifierFilter; 36 import com.sun.tools.javadoc.RootDocImpl; 37 38 public class DocletFactory implements IApiLoader { 39 40 public IApi loadApi(String name, Visibility visibility, 41 Set<String> fileNames, Set<String> packageNames) throws 42 IOException { 43 for (String packageName : packageNames) { 44 if (packageName.length() == 0) 45 throw new IllegalArgumentException( 46 "default package not supported by DocletFactory"); 47 } 48 StringBuffer buf = new StringBuffer(); 49 for (String filename : fileNames) { 50 buf.append(filename); 51 buf.append(":"); 52 } 53 String sourcepath = buf.substring(0, buf.length() - 1); 54 RootDoc root = getRootDoc(visibility, sourcepath, packageNames); 55 DocletToSigConverter converter = new DocletToSigConverter(); 56 IApi api = converter.convertDocletRoot(name, root, visibility, 57 packageNames); 58 return api; 59 } 60 61 private static RootDoc getRootDoc(Visibility visibility, String sourcepath, 62 java.util.Set<String> packages) throws IOException { 63 long accessModifier = 0; 64 switch (visibility) { 65 case PRIVATE: 66 accessModifier |= com.sun.tools.javac.code.Flags.PRIVATE; // 0x2 67 case PACKAGE: // 0x80000000 68 accessModifier |= com.sun.tools.javadoc.ModifierFilter.PACKAGE; 69 case PROTECTED: 70 accessModifier |= com.sun.tools.javac.code.Flags.PROTECTED; // 0x4 71 case PUBLIC: 72 accessModifier |= com.sun.tools.javac.code.Flags.PUBLIC; // 0x1 73 } 74 75 ModifierFilter showAccess = new ModifierFilter(accessModifier); 76 boolean breakiterator = false; 77 boolean quiet = false; 78 boolean legacy = false; 79 boolean docClasses = false; 80 81 String docLocale = ""; 82 String encoding = null; 83 ListBuffer<String> javaNames = new ListBuffer<String>(); 84 for (String p : packages) 85 javaNames.append(p); 86 87 ListBuffer<String[]> options = new ListBuffer<String[]>(); 88 89 options.append(new String[] {"-sourcepath", sourcepath}); 90 91 ListBuffer<String> subPackages = new ListBuffer<String>(); 92 ListBuffer<String> excludedPackages = new ListBuffer<String>(); 93 94 Context context = new Context(); 95 Options compOpts = Options.instance(context); 96 compOpts.put("-sourcepath", sourcepath); 97 98 Constructor<Messager> c; 99 try { 100 // c = Messager.class.getDeclaredConstructor(Context.class, 101 // String.class); 102 // c.setAccessible(true); 103 // c.newInstance(context, "SigTest"); 104 c = Messager.class.getDeclaredConstructor(Context.class, 105 String.class, PrintWriter.class, PrintWriter.class, 106 PrintWriter.class); 107 c.setAccessible(true); 108 PrintWriter err = new PrintWriter(new StringWriter()); 109 PrintWriter warn = new PrintWriter(new StringWriter()); 110 PrintWriter notice = new PrintWriter(new StringWriter()); 111 c.newInstance(context, "SigTest", err, warn, notice); 112 } catch (Exception e) { 113 throw new RuntimeException(e); 114 } 115 116 JavadocTool comp = JavadocTool.make0(context); 117 RootDocImpl root = comp.getRootDocImpl(docLocale, encoding, showAccess, 118 javaNames.toList(), options.toList(), breakiterator, 119 subPackages.toList(), excludedPackages.toList(), docClasses, 120 legacy, quiet); 121 return root; 122 } 123 124 } 125