From f4424a5eae173aab5b946ead6faff3b3e4ee88f6 Mon Sep 17 00:00:00 2001 From: Martin Ehrnhoefer Date: Sat, 6 Dec 2014 16:07:45 +0100 Subject: [PATCH 1/2] Introduced a factory for codegen data containers This enables users to extend the Codegen* classes and add their own methods there (which then can be accessed from the mustache templates) --- .../swagger/codegen/CodegenModelFactory.java | 37 +++++++++++++++++++ .../swagger/codegen/CodegenModelType.java | 17 +++++++++ .../swagger/codegen/DefaultCodegen.java | 7 ++-- 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java create mode 100644 src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java 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 000000000000..a24e1ed4acad --- /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 000000000000..ac4ba15cd643 --- /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 607038aaa3ab..8039853d737e 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(); From 0eb467e46e7a700f8a53c3b17605ca689eff06b8 Mon Sep 17 00:00:00 2001 From: Martin Ehrnhoefer Date: Sun, 7 Dec 2014 09:52:52 +0100 Subject: [PATCH 2/2] Introduced a factory for codegen data containers implementation completed --- .../com/wordnik/swagger/codegen/CodegenModelFactory.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java b/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java index a24e1ed4acad..b369623f37c7 100644 --- a/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java +++ b/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java @@ -24,10 +24,11 @@ public final class CodegenModelFactory { typeMapping.put(type, implementation); } + @SuppressWarnings("unchecked") public static T newInstance(CodegenModelType type) { - @SuppressWarnings("unchecked") Class classType = (Class) typeMapping.get(type); + Class classType = typeMapping.get(type); try { - return classType.newInstance(); + return (T) (classType != null ? classType : type.getDefaultImplementation()).newInstance(); } catch (InstantiationException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) {