/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.apidocs.tools; import com.emc.apidocs.DocReporter; import com.emc.apidocs.KnownPaths; import com.emc.apidocs.model.ApiMethod; import com.emc.apidocs.model.ApiService; import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.apache.commons.io.IOUtils; import java.io.*; import java.util.List; public class MetaData { private static Gson gson = new GsonBuilder().setPrettyPrinting().create(); private final OutputStream outputStream; public static void save(File file, List<ApiService> apiServices) { try (FileOutputStream metadataFile = new FileOutputStream(file)) { save(metadataFile, apiServices); } catch (IOException e) { DocReporter.printError("Error loading MetaData from " + file); throw new RuntimeException(e); } } public static void save(OutputStream outputStream, List<ApiService> apiServices) { try { removeApiServiceLink(apiServices); String asJson = gson.toJson(apiServices); IOUtils.write(asJson.getBytes(), outputStream); DocReporter.printWarning("Written Meta Data to " + KnownPaths.getOutputFile("meta_data.json")); } catch (IOException e) { DocReporter.printError("Error Dumping Meta Data " + e.getMessage()); throw new RuntimeException(e); } finally { addApiServiceLink(apiServices); } } public static List<ApiService> load(File file) { try { return load(new FileInputStream(file)); } catch (FileNotFoundException e) { DocReporter.printError("Error loading MetaData from InputStream " + e.getMessage()); throw new RuntimeException(e); } } public static List<ApiService> load(InputStream inputStream) { ApiService[] services = gson.fromJson(new InputStreamReader(inputStream), ApiService[].class); List<ApiService> apiServices = Lists.newArrayList(services); addApiServiceLink(apiServices); return apiServices; } public MetaData(OutputStream outputStream) { this.outputStream = outputStream; } // ApiMethods contain a link to the parent service, but this causes cyclic issues with JSON // These methods should be used with caution as they modify the actual service information private static void removeApiServiceLink(List<ApiService> apiServices) { for (ApiService service : apiServices) { for (ApiMethod method : service.methods) { method.apiService = null; } } } private static void addApiServiceLink(List<ApiService> apiServices) { for (ApiService apiService : apiServices) { for (ApiMethod method : apiService.methods) { method.apiService = apiService; } } } }