/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.apidocs; import com.emc.apidocs.model.ApiClass; import com.emc.apidocs.model.ApiField; import com.emc.apidocs.model.ApiMethod; import com.google.common.collect.Sets; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonParser; import java.util.Set; /** * A collection of common Utilities */ public class Utils { private static String XML_START = "<"; private static String XML_END = ">"; private static String NEW_LINE = "\n"; public static String splitCamelCase(String s) { return s.replaceAll( String.format("%s|%s|%s", "(?<=[A-Z])(?=[A-Z][a-z])", "(?<=[^A-Z])(?=[A-Z])", "(?<=[A-Za-z])(?=[^A-Za-z])" ), " " ); } public static String upperCaseFirstChar(String string) { if (string == null || string.equals("")) { return string; } return Character.toUpperCase(string.charAt(0)) + string.substring(1); } public static String lowerCaseFirstChar(String string) { if (string == null || string.equals("")) { return string; } return Character.toLowerCase(string.charAt(0)) + string.substring(1); } public static String mergePaths(String part1, String part2) { if (part1.endsWith("/")) { if (part2.startsWith("/")) { return part1 + part2.substring(1); } else { return part1 + part2; } } else { if (part2.startsWith("/")) { return part1 + part2; } else { return part1 + (part2.equals("") ? "" : "/") + part2; } } } public static String dedupeWords(String input) { Set<String> deduped = Sets.newHashSet(input.split(" ")); StringBuffer output = new StringBuffer(); for (String word : deduped) { output.append(word + " "); } return output.toString(); } public static StringBuffer addSpaces(int number, StringBuffer buffer) { String response = ""; for (int i = 0; i < number; i++) { buffer.append(" "); } return buffer; } public static String repeatSpace(int number) { String response = ""; for (int i = 0; i < number; i++) { response = response + " "; } return response; } public static String generateJson(ApiClass element) { StringBuffer buffer = new StringBuffer(); generateJSON(element, buffer); try { GsonBuilder builder = new GsonBuilder().setPrettyPrinting(); Gson g = builder.create(); JsonParser parser = new JsonParser(); JsonElement el = parser.parse(buffer.toString()); return g.toJson(el); } catch (Exception e) { throw new RuntimeException(buffer.toString(), e); } } public static String generateJSON(ApiClass element, StringBuffer buffer) { buffer.append("{\n"); int counter = 0; for (ApiField field : element.fields) { generateJSON(field, buffer); counter++; if (counter < element.fields.size()) { buffer.append(",\n"); } } buffer.append("}"); return buffer.toString(); } public static void generateJSON(ApiField field, StringBuffer buffer) { String name = field.jsonName; if (name == null) { name = !field.wrapperName.equals("") ? field.wrapperName : field.name; } buffer.append("\"") .append(name); buffer.append("\": "); if (field.collection) { if (field.hasChildElements()) { buffer.append("[\n"); generateJSON(field.type, buffer); buffer.append("]"); } else { buffer.append("[\"\"]"); } } else { if (field.hasChildElements()) { generateJSON(field.type, buffer); } else { buffer.append("\"\""); } } } /** * Returns an XML Payload format for the given Api Class */ public static String generateXml(ApiClass element) { StringBuffer buffer = new StringBuffer(XML_START + element.name + XML_END + "\n"); for (ApiField field : element.fields) { generateXml(field, 1, buffer); } buffer.append(XML_START).append("/").append(element.name).append(XML_END); return buffer.toString(); } private static void generateXml(ApiField element, int level, StringBuffer response) { if (!element.wrapperName.equals("")) { // Output <WRAPPER> response.append(repeatSpace(level)); response.append(XML_START).append(element.wrapperName).append(XML_END).append(NEW_LINE); level = level + 1; } if (!element.hasChildElements()) { // Output as <name></name> response.append(repeatSpace(level)); response.append(XML_START).append(element.name); addAttributes(element.type, response); response.append(XML_END); response.append(XML_START).append("/").append(element.name).append(XML_END).append(NEW_LINE); } else { response.append(repeatSpace(level)); response.append(XML_START).append(element.name).append(XML_END).append(NEW_LINE); addAttributes(element.type, response); for (ApiField field : element.type.fields) { generateXml(field, level + 1, response); } response.append(repeatSpace(level)); response.append(XML_START).append("/").append(element.name).append(XML_END).append(NEW_LINE); } if (!element.wrapperName.equals("")) { // OUTPUT </WRAPPER> level = level - 1; response.append(repeatSpace(level)); response.append(XML_START).append("/").append(element.wrapperName).append(XML_END).append(NEW_LINE); } } private static void addAttributes(ApiClass element, StringBuffer response) { if (element == null || element.attributes == null) { return; } for (ApiField attribute : element.attributes) { response.append(" " + attribute.name + "=\"\""); } } public static void dump(ApiMethod apiMethod) { System.out.println("================================="); System.out.println(apiMethod.httpMethod + " " + apiMethod.path); System.out.println("JavaMethod:" + apiMethod.javaMethodName); System.out.println("Brief: " + apiMethod.brief); System.out.println("Description:" + apiMethod.description); System.out.println("\nPATH PARAMETERS:"); for (ApiField param : apiMethod.pathParameters) { System.out.println("- [" + param.name + "] " + param.description); } System.out.println("\nQUERY PARAMETERS"); for (ApiField param : apiMethod.queryParameters) { System.out.println("- [" + param.name + "] " + param.description); } System.out.println("\nROLES:"); for (String role : apiMethod.roles) { System.out.println("- " + role); } System.out.println("\nACLS:"); for (String acl : apiMethod.acls) { System.out.println("- " + acl); } if (apiMethod.input != null) { System.out.println("INPUT: " + apiMethod.input.name); } if (apiMethod.output != null) { System.out.println("OUTPUT: " + apiMethod.output.name); dumpAsXml(apiMethod.output, 0); } } public static void dumpAsXml(ApiClass apiClass, int level) { printTabs(level); System.out.print("<" + apiClass.name); for (ApiField attribute : apiClass.attributes) { System.out.print(" " + attribute.name + "=\"\""); } if (apiClass.fields.isEmpty()) { System.out.println("/>"); } else { System.out.println(">"); } for (ApiField element : apiClass.fields) { if (element.isPrimitive()) { printTabs(level + 1); System.out.println("<" + element.name + "/> " + element.primitiveType + " [" + element.description + "]"); } else { printTabs(level + 1); System.out.println("<" + element.name + "> " + element.description + (element.collection ? "MANY" : "")); dumpAsXml(element.type, level + 2); printTabs(level + 1); System.out.println("</" + element.name + ">"); } } if (!apiClass.fields.isEmpty()) { printTabs(level); System.out.println("</" + apiClass.name + ">"); } } public static void printTabs(int times) { for (int i = 0; i < times; i++) { System.out.print("\t"); } } }