Home | History | Annotate | Download | only in generator
      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