Api xmlDocWriter: create 2 output .xml files; one contains commands in the order defined in commands.properties.in file, another - commands in alphabetical order.

This commit is contained in:
alena 2011-01-10 14:25:56 -08:00
parent c07d1be1aa
commit bc74fefe68
1 changed files with 142 additions and 87 deletions

View File

@ -28,10 +28,14 @@ import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.TreeMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@ -48,20 +52,20 @@ import com.google.gson.annotations.SerializedName;
import com.thoughtworks.xstream.XStream;
public class ApiXmlDocWriter {
public static final Logger s_logger = Logger
.getLogger(ApiXmlDocWriter.class.getName());
public static final Logger s_logger = Logger.getLogger(ApiXmlDocWriter.class.getName());
private static final short DOMAIN_ADMIN_COMMAND = 2;
private static final short USER_COMMAND = 8;
private static Properties all_api_commands = new Properties();
private static Properties domain_admin_api_commands = new Properties();
private static Properties regular_user_api_commands = new Properties();
private static LinkedHashMap<Object, String> all_api_commands = new LinkedHashMap<Object, String>();
private static LinkedHashMap<Object, String> domain_admin_api_commands = new LinkedHashMap<Object, String>();
private static LinkedHashMap<Object, String> regular_user_api_commands = new LinkedHashMap<Object, String>();
private static TreeMap<Object, String> all_api_commands_sorted = new TreeMap<Object, String>();
private static TreeMap<Object, String> domain_admin_api_commands_sorted = new TreeMap<Object, String>();
private static TreeMap<Object, String> regular_user_api_commands_sorted = new TreeMap<Object, String>();
private static String dirName="";
public static void main (String[] args) {
Properties preProcessedCommands = new Properties();
Enumeration<?> command = null;
LinkedProperties preProcessedCommands = new LinkedProperties();
String[] fileNames = null;
List<String> argsList = Arrays.asList(args);
@ -95,9 +99,11 @@ public class ApiXmlDocWriter {
}
}
Iterator<?> propertiesIterator = preProcessedCommands.keys.iterator();
//Get command classes and response object classes
for (Object key : preProcessedCommands.keySet()) {
String preProcessedCommand = preProcessedCommands.getProperty((String)key);
while (propertiesIterator.hasNext()) {
String key = (String)propertiesIterator.next();
String preProcessedCommand = preProcessedCommands.getProperty(key);
String[] commandParts = preProcessedCommand.split(";");
String commandName = commandParts[0];
all_api_commands.put(key, commandName);
@ -111,7 +117,9 @@ public class ApiXmlDocWriter {
}
}
command = all_api_commands.propertyNames();
all_api_commands_sorted.putAll(all_api_commands);
domain_admin_api_commands_sorted.putAll(domain_admin_api_commands);
regular_user_api_commands_sorted.putAll(regular_user_api_commands);
try {
//Create object writer
@ -128,101 +136,62 @@ public class ApiXmlDocWriter {
ObjectOutputStream out = xs.createObjectOutputStream(new FileWriter(dirName + "/commands.xml"), "commands");
ObjectOutputStream rootAdmin = xs.createObjectOutputStream(new FileWriter(rootAdminDirName + "/" + "rootAdminSummary.xml"), "commands");
ObjectOutputStream outDomainAdmin = xs.createObjectOutputStream(new FileWriter(domainAdminDirName + "/" + "domainAdminSummary.xml"), "commands");
ObjectOutputStream rootAdminSorted = xs.createObjectOutputStream(new FileWriter(rootAdminDirName + "/" + "rootAdminSummarySorted.xml"), "commands");
ObjectOutputStream domainAdmin = xs.createObjectOutputStream(new FileWriter(domainAdminDirName + "/" + "domainAdminSummary.xml"), "commands");
ObjectOutputStream outDomainAdminSorted = xs.createObjectOutputStream(new FileWriter(domainAdminDirName + "/" + "domainAdminSummarySorted.xml"), "commands");
ObjectOutputStream regularUser = xs.createObjectOutputStream(new FileWriter(regularUserDirName + "/regularUserSummary.xml"), "commands");
ObjectOutputStream regularUserSorted = xs.createObjectOutputStream(new FileWriter(regularUserDirName + "/regularUserSummarySorted.xml"), "commands");
while (command.hasMoreElements()) {
//Write commands in the order they are represented in commands.properties.in file
Iterator<?> it = all_api_commands.keySet().iterator();
while (it.hasNext()) {
ObjectOutputStream singleCommandOs = null;
String key = (String) command.nextElement();
Class<?> clas = Class.forName(all_api_commands.getProperty(key));
ArrayList<Argument> request = new ArrayList<Argument>();
ArrayList<Argument> response = new ArrayList<Argument>();
String key = (String)it.next();
//Create a new command, set name and description
Command apiCommand = new Command();
apiCommand.setName(key);
Implementation impl = (Implementation)clas.getAnnotation(Implementation.class);
if (impl == null)
impl = (Implementation)clas.getSuperclass().getAnnotation(Implementation.class);
String commandDescription = impl.description();
if (commandDescription != null)
apiCommand.setDescription(commandDescription);
else
System.out.println("Command " + apiCommand.getName() + " misses description");
//Get request parameters
Field[] fields = clas.getDeclaredFields();
//Get fields from superclass
Class<?> superClass = clas.getSuperclass();
String superName = superClass.getName();
if (!superName.equals(BaseCmd.class.getName()) && !superName.equals(BaseAsyncCmd.class.getName()) && !superName.equals(BaseAsyncCreateCmd.class.getName())) {
Field[] superClassFields = superClass.getDeclaredFields();
if (superClassFields != null && !superClass.getName().equals(BaseListCmd.class.getName())) {
Field[] tmpFields = new Field[fields.length + superClassFields.length];
System.arraycopy(fields, 0, tmpFields, 0, fields.length);
System.arraycopy(superClassFields, 0, tmpFields, fields.length, superClassFields.length);
fields = tmpFields;
}
superClass = superClass.getSuperclass();
}
for (Field f : fields) {
Parameter parameterAnnotation = f.getAnnotation(Parameter.class);
if (parameterAnnotation != null) {
Argument reqArg = new Argument(parameterAnnotation.name());
reqArg.setRequired(parameterAnnotation.required());
if (!parameterAnnotation.description().isEmpty() && parameterAnnotation.expose())
reqArg.setDescription(parameterAnnotation.description());
else if (parameterAnnotation.expose()) {
//System.out.println("Description is missing for the parameter " + parameterAnnotation.name() + " of the command " + apiCommand.getName() );
}
request.add(reqArg);
}
}
Class<?> responseClas = impl.responseObject();
//Get response parameters
Field[] responseFields = responseClas.getDeclaredFields();
for (Field responseField : responseFields) {
SerializedName nameAnnotation = responseField.getAnnotation(SerializedName.class);
Param descAnnotation = responseField.getAnnotation(Param.class);
Argument respArg = new Argument(nameAnnotation.value());
if (descAnnotation != null)
respArg.setDescription(descAnnotation.description());
response.add(respArg);
}
apiCommand.setRequest(request);
apiCommand.setResponse(response);
//Write command to xml file
out.writeObject(apiCommand);
rootAdmin.writeObject(apiCommand);
//Write single command to xml file
//Write admin commands
writeCommand(out, key);
writeCommand(rootAdmin, key);
//Write single commands to separate xml files
singleCommandOs = xs.createObjectOutputStream(new FileWriter(rootAdminDirName + "/" + key + ".xml"), "command");
if (domain_admin_api_commands.containsKey(key)){
outDomainAdmin.writeObject(apiCommand);
writeCommand(domainAdmin, key);
singleCommandOs = xs.createObjectOutputStream(new FileWriter(domainAdminDirName + "/" + key + ".xml"), "command");
}
if (regular_user_api_commands.containsKey(key)){
singleCommandOs = xs.createObjectOutputStream(new FileWriter(regularUserDirName + "/" + key + ".xml"), "command");
regularUser.writeObject(apiCommand);
writeCommand(regularUser, key);
}
singleCommandOs.writeObject(apiCommand);
writeCommand(singleCommandOs, key);
singleCommandOs.close();
}
//Write sorted commands
it = all_api_commands_sorted.keySet().iterator();
while (it.hasNext()) {
String key = (String)it.next();
writeCommand(rootAdminSorted, key);
if (domain_admin_api_commands.containsKey(key)){
writeCommand(outDomainAdminSorted, key);
}
if (regular_user_api_commands.containsKey(key)){
writeCommand(regularUserSorted, key);
}
}
out.close();
rootAdmin.close();
outDomainAdmin.close();
rootAdminSorted.close();
domainAdmin.close();
outDomainAdminSorted.close();
regularUser.close();
regularUserSorted.close();
//gzip directory with xml doc
zipDir(dirName + "xmldoc.zip", xmlDocDir);
@ -236,6 +205,76 @@ public class ApiXmlDocWriter {
}
}
private static void writeCommand(ObjectOutputStream out, String command) throws ClassNotFoundException, IOException{
Class<?> clas = Class.forName(all_api_commands.get(command));
ArrayList<Argument> request = new ArrayList<Argument>();
ArrayList<Argument> response = new ArrayList<Argument>();
//Create a new command, set name and description
Command apiCommand = new Command();
apiCommand.setName(command);
Implementation impl = (Implementation)clas.getAnnotation(Implementation.class);
if (impl == null)
impl = (Implementation)clas.getSuperclass().getAnnotation(Implementation.class);
String commandDescription = impl.description();
if (commandDescription != null)
apiCommand.setDescription(commandDescription);
else
System.out.println("Command " + apiCommand.getName() + " misses description");
//Get request parameters
Field[] fields = clas.getDeclaredFields();
//Get fields from superclass
Class<?> superClass = clas.getSuperclass();
String superName = superClass.getName();
if (!superName.equals(BaseCmd.class.getName()) && !superName.equals(BaseAsyncCmd.class.getName()) && !superName.equals(BaseAsyncCreateCmd.class.getName())) {
Field[] superClassFields = superClass.getDeclaredFields();
if (superClassFields != null && !superClass.getName().equals(BaseListCmd.class.getName())) {
Field[] tmpFields = new Field[fields.length + superClassFields.length];
System.arraycopy(fields, 0, tmpFields, 0, fields.length);
System.arraycopy(superClassFields, 0, tmpFields, fields.length, superClassFields.length);
fields = tmpFields;
}
superClass = superClass.getSuperclass();
}
for (Field f : fields) {
Parameter parameterAnnotation = f.getAnnotation(Parameter.class);
if (parameterAnnotation != null) {
Argument reqArg = new Argument(parameterAnnotation.name());
reqArg.setRequired(parameterAnnotation.required());
if (!parameterAnnotation.description().isEmpty() && parameterAnnotation.expose())
reqArg.setDescription(parameterAnnotation.description());
else if (parameterAnnotation.expose()) {
//System.out.println("Description is missing for the parameter " + parameterAnnotation.name() + " of the command " + apiCommand.getName() );
}
request.add(reqArg);
}
}
Class<?> responseClas = impl.responseObject();
//Get response parameters
Field[] responseFields = responseClas.getDeclaredFields();
for (Field responseField : responseFields) {
SerializedName nameAnnotation = responseField.getAnnotation(SerializedName.class);
Param descAnnotation = responseField.getAnnotation(Param.class);
Argument respArg = new Argument(nameAnnotation.value());
if (descAnnotation != null)
respArg.setDescription(descAnnotation.description());
response.add(respArg);
}
apiCommand.setRequest(request);
apiCommand.setResponse(response);
out.writeObject(apiCommand);
}
private static void zipDir(String zipFileName, String dir) throws Exception {
File dirObj = new File(dir);
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
@ -273,4 +312,20 @@ public class ApiXmlDocWriter {
}
dir.delete();
}
private static class LinkedProperties extends Properties {
private final LinkedList<Object> keys = new LinkedList<Object>();
public Enumeration<Object> keys() {
return Collections.<Object>enumeration(keys);
}
public Object put(Object key, Object value) {
//System.out.println("Adding key" + key);
keys.add(key);
return super.put(key, value);
}
}
}