package com.hypnoticocelot.jaxrs.doclet; import com.hypnoticocelot.jaxrs.doclet.translator.AnnotationAwareTranslator; import com.hypnoticocelot.jaxrs.doclet.translator.FirstNotNullTranslator; import com.hypnoticocelot.jaxrs.doclet.translator.NameBasedTranslator; import com.hypnoticocelot.jaxrs.doclet.translator.Translator; import java.io.File; import java.util.ArrayList; import java.util.List; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Arrays.asList; import static java.util.Arrays.copyOfRange; public class DocletOptions { public static final String DEFAULT_SWAGGER_UI_ZIP_PATH = "n/a"; private File outputDirectory; private String docBasePath = "http://localhost:8080"; private String apiBasePath = "http://localhost:8080"; private String swaggerUiZipPath = DEFAULT_SWAGGER_UI_ZIP_PATH; private String apiVersion = "0"; private List<String> typesToTreatAsOpaque; private List<String> errorTags; private List<String> excludeAnnotationClasses; private boolean parseModels = true; private Recorder recorder = new ObjectMapperRecorder(); private Translator translator; public DocletOptions() { excludeAnnotationClasses = new ArrayList<String>(); excludeAnnotationClasses.add("javax.ws.rs.HeaderParam"); excludeAnnotationClasses.add("javax.ws.rs.core.Context"); errorTags = new ArrayList<String>(); errorTags.add("errorResponse"); // swagger 1.1 errorTags.add("responseMessage"); // swagger 1.2 typesToTreatAsOpaque = new ArrayList<String>(); typesToTreatAsOpaque.add("org.joda.time.DateTime"); typesToTreatAsOpaque.add("java.util.UUID"); translator = new FirstNotNullTranslator() .addNext(new AnnotationAwareTranslator() .ignore("javax.xml.bind.annotation.XmlTransient") .element("javax.xml.bind.annotation.XmlElement", "name") .rootElement("javax.xml.bind.annotation.XmlRootElement", "name") ) .addNext(new AnnotationAwareTranslator() .ignore("com.fasterxml.jackson.annotation.JsonIgnore") .element("com.fasterxml.jackson.annotation.JsonProperty", "value") .rootElement("com.fasterxml.jackson.annotation.JsonRootName", "value") ) .addNext(new NameBasedTranslator()); } public static DocletOptions parse(String[][] options) { DocletOptions parsedOptions = new DocletOptions(); for (String[] option : options) { if (option[0].equals("-d")) { parsedOptions.outputDirectory = new File(option[1]); checkArgument(parsedOptions.outputDirectory.isDirectory(), "Path after -d is expected to be a directory!"); } else if (option[0].equals("-docBasePath")) { parsedOptions.docBasePath = option[1]; } else if (option[0].equals("-apiBasePath")) { parsedOptions.apiBasePath = option[1]; } else if (option[0].equals("-apiVersion")) { parsedOptions.apiVersion = option[1]; } else if (option[0].equals("-swaggerUiZipPath")) { parsedOptions.swaggerUiZipPath = option[1]; } else if (option[0].equals("-excludeAnnotationClasses")) { parsedOptions.excludeAnnotationClasses.addAll(asList(copyOfRange(option, 1, option.length))); } else if (option[0].equals("-disableModels")) { parsedOptions.parseModels = false; } else if (option[0].equals("-errorTags")) { parsedOptions.errorTags.addAll(asList(copyOfRange(option, 1, option.length)));; } else if (option[0].equals("-typesToTreatAsOpaque")) { parsedOptions.typesToTreatAsOpaque.addAll(asList(copyOfRange(option, 1, option.length)));; } } return parsedOptions; } public File getOutputDirectory() { return outputDirectory; } public String getDocBasePath() { return docBasePath; } public String getApiBasePath() { return apiBasePath; } public String getApiVersion() { return apiVersion; } public String getSwaggerUiZipPath() { return swaggerUiZipPath; } public List<String> getExcludeAnnotationClasses() { return excludeAnnotationClasses; } public List<String> getErrorTags() { return errorTags; } public List<String> getTypesToTreatAsOpaque() { return typesToTreatAsOpaque; } public boolean isParseModels() { return parseModels; } public Recorder getRecorder() { return recorder; } public DocletOptions setRecorder(Recorder recorder) { this.recorder = recorder; return this; } public Translator getTranslator() { return translator; } public DocletOptions setTranslator(Translator translator) { this.translator = translator; return this; } }