1 package com.android.class2greylist; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.PrintStream; 7 import java.util.ArrayList; 8 import java.util.Comparator; 9 import java.util.HashMap; 10 import java.util.HashSet; 11 import java.util.List; 12 import java.util.Map; 13 import java.util.Set; 14 import java.util.stream.Collectors; 15 16 public class AnnotationPropertyWriter implements AnnotationConsumer { 17 18 private final PrintStream mOutput; 19 private final List<Map<String, String>> mContents; 20 private final Set<String> mColumns; 21 22 public AnnotationPropertyWriter(String csvFile) throws FileNotFoundException { 23 mOutput = new PrintStream(new FileOutputStream(new File(csvFile))); 24 mContents = new ArrayList<>(); 25 mColumns = new HashSet<>(); 26 } 27 28 public void consume(String apiSignature, Map<String, String> annotationProperties, 29 Set<String> parsedFlags) { 30 // Clone properties map. 31 Map<String, String> contents = new HashMap(annotationProperties); 32 33 // Append the member signature. 34 contents.put("signature", apiSignature); 35 36 // Store data. 37 mColumns.addAll(contents.keySet()); 38 mContents.add(contents); 39 } 40 41 public void close() { 42 // Sort columns by name and print header row. 43 List<String> columns = new ArrayList<>(mColumns); 44 columns.sort(Comparator.naturalOrder()); 45 mOutput.println(columns.stream().collect(Collectors.joining(","))); 46 47 // Sort contents according to columns and print. 48 for (Map<String, String> row : mContents) { 49 mOutput.println(columns.stream().map(column -> row.getOrDefault(column, "")) 50 .collect(Collectors.joining(","))); 51 } 52 53 // Close output. 54 mOutput.close(); 55 } 56 } 57