diff --git a/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java b/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java new file mode 100644 index 00000000000..a24e1ed4aca --- /dev/null +++ b/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java @@ -0,0 +1,37 @@ +package com.wordnik.swagger.codegen; + +import java.util.HashMap; +import java.util.Map; + +public final class CodegenModelFactory { + + private static final Map> typeMapping = new HashMap>(); + + /** + * Configure a different implementation class. + * @param type the type that shall be replaced + * @param implementation the implementation class must extend the default class and must provide a public no-arg constructor + */ + public static void setTypeMapping(CodegenModelType type, Class implementation) { + if (!type.getDefaultImplementation().isAssignableFrom(implementation)) { + throw new IllegalArgumentException(implementation.getSimpleName() + " doesn't extend " + type.getDefaultImplementation().getSimpleName()); + } + try { + implementation.newInstance(); + } catch (Exception e) { + throw new IllegalArgumentException(e); + } + typeMapping.put(type, implementation); + } + + public static T newInstance(CodegenModelType type) { + @SuppressWarnings("unchecked") Class classType = (Class) typeMapping.get(type); + try { + return classType.newInstance(); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java b/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java new file mode 100644 index 00000000000..ac4ba15cd64 --- /dev/null +++ b/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java @@ -0,0 +1,17 @@ +package com.wordnik.swagger.codegen; + +public enum CodegenModelType { + + PARAMETER(CodegenParameter.class), + OPERATION(CodegenOperation.class); + + private final Class defaultImplementation; + + private CodegenModelType(Class defaultImplementation) { + this.defaultImplementation = defaultImplementation; + } + + public Class getDefaultImplementation() { + return defaultImplementation; + } +} diff --git a/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java b/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java index 607038aaa3a..8039853d737 100644 --- a/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java +++ b/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java @@ -1,13 +1,12 @@ package com.wordnik.swagger.codegen; -import com.wordnik.swagger.util.Json; import com.wordnik.swagger.models.*; import com.wordnik.swagger.models.parameters.*; import com.wordnik.swagger.models.properties.*; +import com.wordnik.swagger.util.Json; import org.apache.commons.lang.StringUtils; import java.util.*; -import java.io.File; public class DefaultCodegen { protected String outputFolder = ""; @@ -513,7 +512,7 @@ public class DefaultCodegen { } public CodegenOperation fromOperation(String path, String httpMethod, Operation operation){ - CodegenOperation op = new CodegenOperation(); + CodegenOperation op = CodegenModelFactory.newInstance(CodegenModelType.OPERATION); Set imports = new HashSet(); String operationId = operation.getOperationId(); @@ -656,7 +655,7 @@ public class DefaultCodegen { if(parameters != null) { for(Parameter param : parameters) { - CodegenParameter p = new CodegenParameter(); + CodegenParameter p = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER); p.baseName = param.getName(); p.description = param.getDescription(); p.required = param.getRequired();