From 797afe9d15bd5b2ca9bd4d029f79567e0dd9a498 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Sat, 6 Aug 2016 16:54:50 -0400 Subject: [PATCH 1/2] [csharp] PropertyChanged support .NET 4.x+ --- bin/csharp-petstore.sh | 2 +- .../io/swagger/codegen/CodegenConstants.java | 3 ++ .../languages/CSharpClientCodegen.java | 29 +++++++++++-------- .../src/main/resources/csharp/FodyWeavers.xml | 4 +++ .../main/resources/csharp/Project.mustache | 8 ++++- .../src/main/resources/csharp/model.mustache | 2 ++ .../resources/csharp/modelGeneric.mustache | 15 +++++++++- .../resources/csharp/packages.config.mustache | 2 ++ .../csharp/CSharpClientOptionsTest.java | 2 ++ .../options/CSharpClientOptionsProvider.java | 1 + 10 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/csharp/FodyWeavers.xml diff --git a/bin/csharp-petstore.sh b/bin/csharp-petstore.sh index a82efa9af10..b9e8feabae6 100755 --- a/bin/csharp-petstore.sh +++ b/bin/csharp-petstore.sh @@ -26,6 +26,6 @@ fi # if you've executed sbt assembly previously it will use that instead. export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" -ags="$@ generate -i modules/swagger-codegen/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -l csharp -o samples/client/petstore/csharp/SwaggerClient" +ags="generate $@ -i modules/swagger-codegen/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -l csharp -o samples/client/petstore/csharp/SwaggerClient" java $JAVA_OPTS -jar $executable $ags diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java index df62dcc1937..60c2e969152 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java @@ -127,4 +127,7 @@ public class CodegenConstants { public static final String GENERATE_MODEL_TESTS = "generateModelTests"; public static final String GENERATE_MODEL_TESTS_DESC = "Specifies that model tests are to be generated."; + public static final String GENERATE_PROPERTY_CHANGED = "generatePropertyChanged"; + public static final String GENERATE_PROPERTY_CHANGED_DESC = "Specifies that models support raising property changed events."; + } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java index c898ee4ebe5..6d9db97238f 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java @@ -1,32 +1,20 @@ package io.swagger.codegen.languages; -import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableMap; -import io.swagger.codegen.CodegenConfig; import io.swagger.codegen.CodegenConstants; import io.swagger.codegen.CodegenType; import io.swagger.codegen.CodegenModel; -import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; import io.swagger.codegen.CodegenProperty; -import io.swagger.codegen.CodegenModel; import io.swagger.codegen.CodegenOperation; -import io.swagger.codegen.CodegenParameter; -import io.swagger.models.properties.*; import io.swagger.codegen.CliOption; import io.swagger.models.Model; import java.io.File; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.ArrayList; import java.util.Iterator; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.text.WordUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,6 +36,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { protected String targetFrameworkNuget = "net45"; protected boolean supportsAsync = Boolean.TRUE; protected boolean supportsUWP = Boolean.FALSE; + protected boolean generatePropertyChanged = Boolean.FALSE; protected final Map frameworks; @@ -173,6 +162,14 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { additionalProperties.put("supportsAsync", this.supportsAsync); } + if(additionalProperties.containsKey(CodegenConstants.GENERATE_PROPERTY_CHANGED)) { + if(NET35.equals(targetFramework)) { + LOGGER.warn(CodegenConstants.GENERATE_PROPERTY_CHANGED + " is only supported by generated code for .NET 4+."); + } else { + setGeneratePropertyChanged(Boolean.valueOf(additionalProperties.get(CodegenConstants.GENERATE_PROPERTY_CHANGED).toString())); + } + } + additionalProperties.put("targetFrameworkNuget", this.targetFrameworkNuget); if (additionalProperties.containsKey(CodegenConstants.OPTIONAL_PROJECT_FILE)) { @@ -239,6 +236,10 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { supportingFiles.add(new SupportingFile("packages_test.config.mustache", testPackageFolder + File.separator, "packages.config")); } + if(Boolean.TRUE.equals(generatePropertyChanged)) { + supportingFiles.add(new SupportingFile("FodyWeavers.xml", "", "FodyWeavers.xml")); + } + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh")); supportingFiles.add(new SupportingFile("gitignore.mustache", "", ".gitignore")); @@ -446,6 +447,10 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { this.supportsUWP = supportsUWP; } + public void setGeneratePropertyChanged(final Boolean generatePropertyChanged){ + this.generatePropertyChanged = generatePropertyChanged; + } + @Override public String toModelDocFilename(String name) { return toModelFilename(name); diff --git a/modules/swagger-codegen/src/main/resources/csharp/FodyWeavers.xml b/modules/swagger-codegen/src/main/resources/csharp/FodyWeavers.xml new file mode 100644 index 00000000000..a1637ce893a --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/FodyWeavers.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/csharp/Project.mustache b/modules/swagger-codegen/src/main/resources/csharp/Project.mustache index 2334e53d0c9..a8f88ea471f 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Project.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Project.mustache @@ -82,13 +82,19 @@ limitations under the License. ..\..\packages\RestSharp.105.1.0\lib\{{targetFrameworkNuget}}\RestSharp.dll {{binRelativePath}}\RestSharp.105.1.0\lib\{{targetFrameworkNuget}}\RestSharp.dll + {{#generatePropertyChanged}} + ..\..\packages\PropertyChanged.Fody.1.51.3\Lib\portable-net4+sl4+wp8+win8+wpa81+MonoAndroid16+MonoTouch40\PropertyChanged.dll + {{/generatePropertyChanged}} + {{#generatePropertyChanged}}{{/generatePropertyChanged}} - + {{#generatePropertyChanged}} + + {{/generatePropertyChanged}} diff --git a/modules/swagger-codegen/src/main/resources/csharp/model.mustache b/modules/swagger-codegen/src/main/resources/csharp/model.mustache index 863d7ba93ef..931ba0b63e7 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/model.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/model.mustache @@ -9,6 +9,8 @@ using System.Collections.ObjectModel; using System.Runtime.Serialization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; +{{#generatePropertyChanged}}using PropertyChanged; +using System.ComponentModel;{{/generatePropertyChanged}} {{#models}} {{#model}} diff --git a/modules/swagger-codegen/src/main/resources/csharp/modelGeneric.mustache b/modules/swagger-codegen/src/main/resources/csharp/modelGeneric.mustache index aaf6df8cf2e..caa4bbbc7dc 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/modelGeneric.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/modelGeneric.mustache @@ -1,7 +1,8 @@ /// /// {{#description}}{{.}}{{/description}}{{^description}}{{classname}}{{/description}} /// - [DataContract] + [DataContract]{{#generatePropertyChanged}} + [ImplementPropertyChanged]{{/generatePropertyChanged}} public partial class {{classname}} : {{#parent}}{{{parent}}}, {{/parent}} IEquatable<{{classname}}> { {{#vars}} @@ -169,4 +170,16 @@ this.{{name}} = {{name}}; return hash; } } + {{#generatePropertyChanged}} + public event PropertyChangedEventHandler PropertyChanged; + public virtual void OnPropertyChanged(string propertyName) + { + // NOTE: property changed is handled via "code weaving" using Fody. + // Properties with setters are modified at compile time to notify of changes. + var propertyChanged = PropertyChanged; + if (propertyChanged != null) + { + propertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + }{{/generatePropertyChanged}} } diff --git a/modules/swagger-codegen/src/main/resources/csharp/packages.config.mustache b/modules/swagger-codegen/src/main/resources/csharp/packages.config.mustache index d9e5dea7d9f..9ab616089ac 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/packages.config.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/packages.config.mustache @@ -2,4 +2,6 @@ + {{#generatePropertyChanged}} + {{/generatePropertyChanged}} diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java index 71975fcee66..f53ac5e0626 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java @@ -48,6 +48,8 @@ public class CSharpClientOptionsTest extends AbstractOptionsTest { times = 1; clientCodegen.setOptionalEmitDefaultValue(true); times = 1; + clientCodegen.setGeneratePropertyChanged(true); + times = 1; }}; } } diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java index 5f43f5cf155..0f70579d20f 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java @@ -33,6 +33,7 @@ public class CSharpClientOptionsProvider implements OptionsProvider { .put(CodegenConstants.OPTIONAL_PROJECT_GUID, PACKAGE_GUID_VALUE) .put(CodegenConstants.DOTNET_FRAMEWORK, "4.x") .put(CodegenConstants.OPTIONAL_EMIT_DEFAULT_VALUES, "true") + .put(CodegenConstants.GENERATE_PROPERTY_CHANGED, "true") .build(); } From 3d7f6ad09995058c1def83cb1977717c378b79e0 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Sat, 6 Aug 2016 21:38:52 -0400 Subject: [PATCH 2/2] [csharp] documented help switch for generating property change --- .../io/swagger/codegen/languages/CSharpClientCodegen.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java index 6d9db97238f..b06d0ef7ca9 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java @@ -116,6 +116,10 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { addSwitch(CodegenConstants.OPTIONAL_EMIT_DEFAULT_VALUES, CodegenConstants.OPTIONAL_EMIT_DEFAULT_VALUES_DESC, this.optionalEmitDefaultValue); + + addSwitch(CodegenConstants.GENERATE_PROPERTY_CHANGED, + CodegenConstants.PACKAGE_DESCRIPTION_DESC, + this.generatePropertyChanged); } @Override