1 package org.robolectric.annotation.processing.generator; 2 3 import static java.nio.charset.StandardCharsets.UTF_8; 4 5 import com.google.gson.Gson; 6 import com.google.gson.GsonBuilder; 7 import java.io.BufferedWriter; 8 import java.io.File; 9 import java.io.IOException; 10 import java.nio.file.Files; 11 import java.util.HashMap; 12 import java.util.Map; 13 import javax.annotation.processing.Messager; 14 import javax.annotation.processing.ProcessingEnvironment; 15 import javax.lang.model.element.TypeElement; 16 import javax.tools.Diagnostic; 17 import org.robolectric.annotation.processing.DocumentedPackage; 18 import org.robolectric.annotation.processing.DocumentedType; 19 import org.robolectric.annotation.processing.RobolectricModel; 20 21 public class JavadocJsonGenerator extends Generator { 22 23 private final RobolectricModel model; 24 private final Messager messager; 25 private final Gson gson; 26 27 public JavadocJsonGenerator(RobolectricModel model, ProcessingEnvironment environment) { 28 super(); 29 30 this.model = model; 31 this.messager = environment.getMessager(); 32 gson = new GsonBuilder() 33 .setPrettyPrinting() 34 .create(); 35 } 36 37 @Override 38 public void generate() { 39 Map<String, String> shadowedTypes = new HashMap<>(); 40 for (Map.Entry<TypeElement, TypeElement> entry : model.getShadowOfMap().entrySet()) { 41 String shadowType = entry.getKey().getQualifiedName().toString(); 42 String shadowedType = entry.getValue().getQualifiedName().toString(); 43 shadowedTypes.put(shadowType, shadowedType); 44 } 45 46 for (Map.Entry<String, String> entry : model.getExtraShadowTypes().entrySet()) { 47 String shadowType = entry.getKey(); 48 String shadowedType = entry.getValue(); 49 shadowedTypes.put(shadowType, shadowedType); 50 } 51 52 File docs = new File("build/docs/json"); 53 54 for (DocumentedPackage documentedPackage : model.getDocumentedPackages()) { 55 for (DocumentedType documentedType : documentedPackage.getDocumentedTypes()) { 56 String shadowedType = shadowedTypes.get(documentedType.getName()); 57 writeJson(documentedType, new File(docs, shadowedType + ".json")); 58 } 59 } 60 } 61 62 private void writeJson(Object object, File file) { 63 file.getParentFile().mkdirs(); 64 65 try (BufferedWriter writer = Files.newBufferedWriter(file.toPath(), UTF_8)) { 66 gson.toJson(object, writer); 67 } catch (IOException e) { 68 messager.printMessage(Diagnostic.Kind.ERROR, "Failed to write javadoc JSON file: " + e); 69 throw new RuntimeException(e); 70 } 71 } 72 73 } 74