From 97bfc2852d4dd84c9c0f3f4a6fbab06a12e2b7c6 Mon Sep 17 00:00:00 2001 From: "Xiaofei Cao (from Dev Box)" Date: Wed, 2 Sep 2026 17:54:25 +0800 Subject: [PATCH 01/12] fix(http-client-java): deduplicate inherited discriminators Merge redundant leaf discriminator declarations with propagated parent discriminators and preserve fixed discriminator fields as final. Fixes #11802 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 54b93dc2-48ce-4250-a6ea-5bd9b9a7ab2b --- ...ava-duplicate-discriminators-2026-09-02.md | 7 +++++ .../PolymorphicDiscriminatorHandler.java | 6 +++- .../generator/core/mapper/ModelMapper.java | 30 ++++++++++++++++++- .../models/GoblinShark.java | 2 +- .../models/SawShark.java | 6 ++-- .../enumnesteddiscriminator/models/Shark.java | 2 +- ...test-enumnesteddiscriminator_metadata.json | 2 +- .../tsp/nested-enum-discriminator.tsp | 1 + 8 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 .chronus/changes/fix-java-duplicate-discriminators-2026-09-02.md diff --git a/.chronus/changes/fix-java-duplicate-discriminators-2026-09-02.md b/.chronus/changes/fix-java-duplicate-discriminators-2026-09-02.md new file mode 100644 index 00000000000..ceede7bf0f2 --- /dev/null +++ b/.chronus/changes/fix-java-duplicate-discriminators-2026-09-02.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/http-client-java" +--- + +Prevent duplicate Java fields and accessors when a model redeclares an inherited fixed discriminator. diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java index 7f212bafd50..28878c44da0 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java @@ -116,7 +116,11 @@ private static void declareFieldInternal(ClientModelProperty discriminator, Clie && settings.isShareJsonSerializableCode()) { classBlock.memberVariable(JavaVisibility.PackagePrivate, fieldSignature); } else if (!allPolymorphicModelsInSamePackage || !settings.isShareJsonSerializableCode()) { - classBlock.privateMemberVariable(fieldSignature); + if (discriminator.isConstant()) { + classBlock.privateFinalMemberVariable(fieldSignature); + } else { + classBlock.privateMemberVariable(fieldSignature); + } } } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java index 068a9e19d6a..f72637e4457 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java @@ -363,11 +363,13 @@ public ClientModel map(ObjectSchema compositeType) { // the correct serialization in multi-level polymorphic structures. for (ClientModel derivedType : derivedTypes) { if (!Objects.equals(polymorphicDiscriminator, derivedType.getPolymorphicDiscriminatorName())) { + // The child hierarchy stays in one fixed parent discriminator branch. ClientModelProperty parentDiscriminator = result.getPolymorphicDiscriminator() .newBuilder() .defaultValue(result.getPolymorphicDiscriminator() .getClientType() .defaultValueExpression(derivedType.getSerializedName())) + .constant(true) .build(); passPolymorphicDiscriminatorToChildren(parentDiscriminator, derivedType); @@ -389,7 +391,33 @@ private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty p // discriminator kind, and model #3 is a child of model #3 with discriminator form. The order if this running // will have model #2 add its discriminator to model #3 before model #1 runs adding its discriminator to #2 and // #3. We want #3 to have the ordering of [type, kind], to represent the ordering of the parent models. - child.getParentPolymorphicDiscriminators().add(0, parentDiscriminator); + // Merge a matching child declaration to avoid emitting the inherited discriminator twice. + ClientModelProperty discriminatorForChild = parentDiscriminator; + for (int i = 0; i < child.getProperties().size(); i++) { + ClientModelProperty childProperty = child.getProperties().get(i); + if (!Objects.equals(parentDiscriminator.getSerializedName(), childProperty.getSerializedName())) { + continue; + } + + if (!childProperty.isConstant() + || !Objects.equals(parentDiscriminator.getWireType(), childProperty.getWireType()) + || !Objects.equals(parentDiscriminator.getClientType(), childProperty.getClientType()) + || !Objects.equals(parentDiscriminator.getDefaultValue(), childProperty.getDefaultValue())) { + throw new IllegalStateException("Property '" + childProperty.getSerializedName() + "' on model '" + + child.getName() + "' does not match its inherited polymorphic discriminator."); + } + + discriminatorForChild = childProperty.newBuilder() + .name(parentDiscriminator.getName()) + .readOnly(true) + .required(false) + .polymorphicDiscriminator(true) + .build(); + child.getProperties().remove(i); + break; + } + + child.getParentPolymorphicDiscriminators().add(0, discriminatorForChild); for (ClientModel derived : child.getDerivedModels()) { passPolymorphicDiscriminatorToChildren(parentDiscriminator, derived); diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/GoblinShark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/GoblinShark.java index 323da63dc43..47d04cfc429 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/GoblinShark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/GoblinShark.java @@ -20,7 +20,7 @@ public final class GoblinShark extends Shark { * discriminator property */ @Generated - private FishKind kind = FishKind.SHARK; + private final FishKind kind = FishKind.SHARK; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java index f8225d9fc6e..ec946111a85 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java @@ -17,10 +17,10 @@ @Immutable public final class SawShark extends Shark { /* - * discriminator property + * The kind property. */ @Generated - private FishKind kind = FishKind.SHARK; + private final FishKind kind = FishKind.SHARK; /* * The sharktype property. @@ -39,7 +39,7 @@ public SawShark(int age) { } /** - * Get the kind property: discriminator property. + * Get the kind property: The kind property. * * @return the kind value. */ diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/Shark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/Shark.java index f149c82c31b..2c611473348 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/Shark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/Shark.java @@ -20,7 +20,7 @@ public class Shark extends Fish { * discriminator property */ @Generated - private FishKind kind = FishKind.SHARK; + private final FishKind kind = FishKind.SHARK; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-enumnesteddiscriminator_metadata.json b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-enumnesteddiscriminator_metadata.json index e4fc7bb99c7..1d72f990090 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-enumnesteddiscriminator_metadata.json +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-enumnesteddiscriminator_metadata.json @@ -1 +1 @@ -{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.EnumNestedDiscriminator","crossLanguageVersion":"a7268a26bdc4","crossLanguageDefinitions":{"tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getMissingDiscriminator":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getMissingDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getModel":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getModelWithResponse":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getRecursiveModel":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getWrongDiscriminator":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getWrongDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putModel":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putModelWithResponse":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putRecursiveModel":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getMissingDiscriminator":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getMissingDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getModel":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getModelWithResponse":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getRecursiveModel":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getWrongDiscriminator":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getWrongDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putModel":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putModelWithResponse":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putRecursiveModel":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClientBuilder":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.models.Fish":"TspTest.EnumNestedDiscriminator.Fish","tsptest.enumnesteddiscriminator.models.FishKind":"TspTest.EnumNestedDiscriminator.FishKind","tsptest.enumnesteddiscriminator.models.GoblinShark":"TspTest.EnumNestedDiscriminator.GoblinShark","tsptest.enumnesteddiscriminator.models.Salmon":"TspTest.EnumNestedDiscriminator.Salmon","tsptest.enumnesteddiscriminator.models.SawShark":"TspTest.EnumNestedDiscriminator.SawShark","tsptest.enumnesteddiscriminator.models.Shark":"TspTest.EnumNestedDiscriminator.Shark","tsptest.enumnesteddiscriminator.models.SharkKind":"TspTest.EnumNestedDiscriminator.SharkKind"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorAsyncClient.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorClient.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorClientBuilder.java","src/main/java/tsptest/enumnesteddiscriminator/implementation/EnumNestedDiscriminatorClientImpl.java","src/main/java/tsptest/enumnesteddiscriminator/implementation/package-info.java","src/main/java/tsptest/enumnesteddiscriminator/models/Fish.java","src/main/java/tsptest/enumnesteddiscriminator/models/FishKind.java","src/main/java/tsptest/enumnesteddiscriminator/models/GoblinShark.java","src/main/java/tsptest/enumnesteddiscriminator/models/Salmon.java","src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java","src/main/java/tsptest/enumnesteddiscriminator/models/Shark.java","src/main/java/tsptest/enumnesteddiscriminator/models/SharkKind.java","src/main/java/tsptest/enumnesteddiscriminator/models/package-info.java","src/main/java/tsptest/enumnesteddiscriminator/package-info.java"]} \ No newline at end of file +{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.EnumNestedDiscriminator","crossLanguageVersion":"e2c89125d0a8","crossLanguageDefinitions":{"tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getMissingDiscriminator":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getMissingDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getModel":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getModelWithResponse":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getRecursiveModel":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getWrongDiscriminator":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getWrongDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putModel":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putModelWithResponse":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putRecursiveModel":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getMissingDiscriminator":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getMissingDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getModel":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getModelWithResponse":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getRecursiveModel":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getWrongDiscriminator":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getWrongDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putModel":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putModelWithResponse":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putRecursiveModel":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClientBuilder":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.models.Fish":"TspTest.EnumNestedDiscriminator.Fish","tsptest.enumnesteddiscriminator.models.FishKind":"TspTest.EnumNestedDiscriminator.FishKind","tsptest.enumnesteddiscriminator.models.GoblinShark":"TspTest.EnumNestedDiscriminator.GoblinShark","tsptest.enumnesteddiscriminator.models.Salmon":"TspTest.EnumNestedDiscriminator.Salmon","tsptest.enumnesteddiscriminator.models.SawShark":"TspTest.EnumNestedDiscriminator.SawShark","tsptest.enumnesteddiscriminator.models.Shark":"TspTest.EnumNestedDiscriminator.Shark","tsptest.enumnesteddiscriminator.models.SharkKind":"TspTest.EnumNestedDiscriminator.SharkKind"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorAsyncClient.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorClient.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorClientBuilder.java","src/main/java/tsptest/enumnesteddiscriminator/implementation/EnumNestedDiscriminatorClientImpl.java","src/main/java/tsptest/enumnesteddiscriminator/implementation/package-info.java","src/main/java/tsptest/enumnesteddiscriminator/models/Fish.java","src/main/java/tsptest/enumnesteddiscriminator/models/FishKind.java","src/main/java/tsptest/enumnesteddiscriminator/models/GoblinShark.java","src/main/java/tsptest/enumnesteddiscriminator/models/Salmon.java","src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java","src/main/java/tsptest/enumnesteddiscriminator/models/Shark.java","src/main/java/tsptest/enumnesteddiscriminator/models/SharkKind.java","src/main/java/tsptest/enumnesteddiscriminator/models/package-info.java","src/main/java/tsptest/enumnesteddiscriminator/package-info.java"]} \ No newline at end of file diff --git a/packages/http-client-java/generator/http-client-generator-test/tsp/nested-enum-discriminator.tsp b/packages/http-client-java/generator/http-client-generator-test/tsp/nested-enum-discriminator.tsp index 077c08f9672..c2d7b36318a 100644 --- a/packages/http-client-java/generator/http-client-generator-test/tsp/nested-enum-discriminator.tsp +++ b/packages/http-client-java/generator/http-client-generator-test/tsp/nested-enum-discriminator.tsp @@ -55,6 +55,7 @@ model Salmon extends Fish { @doc("The third level model SawShark in polymorphic multiple levels inheritance.") model SawShark extends Shark { + kind: FishKind.Shark; sharktype: SharkKind.Saw; } From 58badce2ffb46a1d0ec9f7909b2078c5ae7cd86d Mon Sep 17 00:00:00 2001 From: "Xiaofei Cao (from Dev Box)" Date: Thu, 3 Sep 2026 11:13:45 +0800 Subject: [PATCH 02/12] test(http-client-java): regenerate discriminator models Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 54b93dc2-48ce-4250-a6ea-5bd9b9a7ab2b --- .../type/model/inheritance/nesteddiscriminator/GoblinShark.java | 2 +- .../type/model/inheritance/nesteddiscriminator/SawShark.java | 2 +- .../java/type/model/inheritance/nesteddiscriminator/Shark.java | 2 +- .../clientgenerator/core/hierarchybuilding/models/Dog.java | 2 +- .../clientgenerator/core/hierarchybuilding/models/Pet.java | 2 +- .../tsptest/armstreamstyleserialization/models/GoblinShark.java | 2 +- .../tsptest/armstreamstyleserialization/models/SawShark.java | 2 +- .../java/tsptest/armstreamstyleserialization/models/Shark.java | 2 +- .../src/main/java/tsptest/patch/models/SawShark.java | 2 +- .../src/main/java/tsptest/patch/models/Shark.java | 2 +- .../inheritance/nesteddiscriminator/models/GoblinShark.java | 2 +- .../model/inheritance/nesteddiscriminator/models/SawShark.java | 2 +- .../model/inheritance/nesteddiscriminator/models/Shark.java | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/GoblinShark.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/GoblinShark.java index 9a1a50089f8..f99fea4f3fd 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/GoblinShark.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/GoblinShark.java @@ -16,7 +16,7 @@ public final class GoblinShark extends Shark { * Discriminator property for Fish. */ @Metadata(properties = { MetadataProperties.GENERATED }) - private String kind = "shark"; + private final String kind = "shark"; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/SawShark.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/SawShark.java index e98a415de70..41df495e8c2 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/SawShark.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/SawShark.java @@ -16,7 +16,7 @@ public final class SawShark extends Shark { * Discriminator property for Fish. */ @Metadata(properties = { MetadataProperties.GENERATED }) - private String kind = "shark"; + private final String kind = "shark"; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/Shark.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/Shark.java index 55e73652485..6b42d9c1ccb 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/Shark.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/Shark.java @@ -16,7 +16,7 @@ public class Shark extends Fish { * Discriminator property for Fish. */ @Metadata(properties = { MetadataProperties.GENERATED }) - private String kind = "shark"; + private final String kind = "shark"; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Dog.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Dog.java index e4022f5e308..ea0af961ba2 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Dog.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Dog.java @@ -20,7 +20,7 @@ public final class Dog extends Pet { * The kind property. */ @Generated - private String kind = "dog"; + private final String kind = "dog"; /* * The breed of the dog diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Pet.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Pet.java index 5b834dd247d..416a1a21789 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Pet.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Pet.java @@ -20,7 +20,7 @@ public class Pet extends Animal { * The kind property. */ @Generated - private String kind = "pet"; + private final String kind = "pet"; /* * Whether the pet is trained diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/GoblinShark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/GoblinShark.java index e1645e48e6d..a5e522627f7 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/GoblinShark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/GoblinShark.java @@ -21,7 +21,7 @@ public final class GoblinShark extends Shark { /* * Discriminator property for Fish. */ - private String kind = "shark"; + private final String kind = "shark"; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/SawShark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/SawShark.java index 49590e9c112..f5231b952cc 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/SawShark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/SawShark.java @@ -21,7 +21,7 @@ public final class SawShark extends Shark { /* * Discriminator property for Fish. */ - private String kind = "shark"; + private final String kind = "shark"; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/Shark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/Shark.java index 556d445d45b..4a970c53a8e 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/Shark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/Shark.java @@ -22,7 +22,7 @@ public class Shark extends FishInner { /* * Discriminator property for Fish. */ - private String kind = "shark"; + private final String kind = "shark"; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/patch/models/SawShark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/patch/models/SawShark.java index 55a2e636f98..8188419c604 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/patch/models/SawShark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/patch/models/SawShark.java @@ -23,7 +23,7 @@ public final class SawShark extends Shark { * Discriminator property for Fish. */ @Generated - private String kind = "shark"; + private final String kind = "shark"; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/patch/models/Shark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/patch/models/Shark.java index 65ce4de7ffc..1a7926bc2a5 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/patch/models/Shark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/patch/models/Shark.java @@ -23,7 +23,7 @@ public class Shark extends Fish { * Discriminator property for Fish. */ @Generated - private String kind = "shark"; + private final String kind = "shark"; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/GoblinShark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/GoblinShark.java index c852ed3cb50..a17b47eb4f8 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/GoblinShark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/GoblinShark.java @@ -20,7 +20,7 @@ public final class GoblinShark extends Shark { * Discriminator property for Fish. */ @Generated - private String kind = "shark"; + private final String kind = "shark"; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/SawShark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/SawShark.java index a1f4a21c76d..ddf9f42ab29 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/SawShark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/SawShark.java @@ -20,7 +20,7 @@ public final class SawShark extends Shark { * Discriminator property for Fish. */ @Generated - private String kind = "shark"; + private final String kind = "shark"; /* * The sharktype property. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/Shark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/Shark.java index 3b9f02f8e18..964024ad7c8 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/Shark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/Shark.java @@ -20,7 +20,7 @@ public class Shark extends Fish { * Discriminator property for Fish. */ @Generated - private String kind = "shark"; + private final String kind = "shark"; /* * The sharktype property. From 5147153cbcf75eff94ee77271f1a603ed38373cd Mon Sep 17 00:00:00 2001 From: "Xiaofei Cao (from Dev Box)" Date: Thu, 3 Sep 2026 14:37:26 +0800 Subject: [PATCH 03/12] fix(http-client-java): preserve active discriminator mutability Keep active discriminators mutable so unknown values can round-trip through fallback deserialization, while fixed ancestor branch discriminators remain final. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 54b93dc2-48ce-4250-a6ea-5bd9b9a7ab2b --- .../core/implementation/PolymorphicDiscriminatorHandler.java | 5 ++++- .../clientgenerator/core/hierarchybuilding/models/Dog.java | 2 +- .../clientgenerator/core/hierarchybuilding/models/Pet.java | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java index 28878c44da0..3be6e0e3102 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java @@ -12,6 +12,7 @@ import com.microsoft.typespec.http.client.generator.core.model.javamodel.JavaFile; import com.microsoft.typespec.http.client.generator.core.model.javamodel.JavaVisibility; import com.microsoft.typespec.http.client.generator.core.util.ClientModelUtil; +import java.util.Objects; import java.util.function.Consumer; import java.util.function.Function; @@ -116,7 +117,9 @@ private static void declareFieldInternal(ClientModelProperty discriminator, Clie && settings.isShareJsonSerializableCode()) { classBlock.memberVariable(JavaVisibility.PackagePrivate, fieldSignature); } else if (!allPolymorphicModelsInSamePackage || !settings.isShareJsonSerializableCode()) { - if (discriminator.isConstant()) { + // Active discriminators stay mutable to preserve unknown values during fallback deserialization. + if (discriminator.isConstant() + && !Objects.equals(discriminator.getSerializedName(), model.getPolymorphicDiscriminatorName())) { classBlock.privateFinalMemberVariable(fieldSignature); } else { classBlock.privateMemberVariable(fieldSignature); diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Dog.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Dog.java index ea0af961ba2..e4022f5e308 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Dog.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Dog.java @@ -20,7 +20,7 @@ public final class Dog extends Pet { * The kind property. */ @Generated - private final String kind = "dog"; + private String kind = "dog"; /* * The breed of the dog diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Pet.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Pet.java index 416a1a21789..5b834dd247d 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Pet.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/clientgenerator/core/hierarchybuilding/models/Pet.java @@ -20,7 +20,7 @@ public class Pet extends Animal { * The kind property. */ @Generated - private final String kind = "pet"; + private String kind = "pet"; /* * Whether the pet is trained From 627bdaa7580986023ef508061e91cff88e663be2 Mon Sep 17 00:00:00 2001 From: "Xiaofei Cao (from Dev Box)" Date: Fri, 4 Sep 2026 09:48:37 +0800 Subject: [PATCH 04/12] fix(http-client-java): preserve merged discriminator masking Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 54b93dc2-48ce-4250-a6ea-5bd9b9a7ab2b --- .../ClientModelPropertiesManager.java | 8 +- .../core/template/ModelTemplate.java | 12 +- ...ldWithRequiredPropertyAsDiscriminator.java | 2 + .../GrandChildWithNestedDiscriminator.java | 139 ++++++++++++++++++ ...tGrandChildWithDuplicateDiscriminator.java | 114 ++++++++++++++ .../models/SawShark.java | 4 +- ...ptest-discriminatoredgecases_metadata.json | 2 +- ...test-enumnesteddiscriminator_metadata.json | 2 +- .../tsp/discriminator-edge-cases.tsp | 15 ++ .../tsp/nested-enum-discriminator.tsp | 1 - 10 files changed, 285 insertions(+), 14 deletions(-) create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java index 4f29e64c65e..948053d4ada 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java @@ -22,6 +22,7 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Manages metadata about properties in a {@link ClientModel} and how they correlate with model class generation. @@ -124,10 +125,11 @@ public ClientModelPropertiesManager(ClientModel model, JavaSettings settings) { xmlRootElementNamespace = model.getXmlNamespace(); } - Set thisModelPropertySerializeNames = model.getProperties() - .stream() + Set thisModelPropertySerializeNames = Stream.concat( // discriminator property is known to be redefined in subclass - .filter(property -> !property.isPolymorphicDiscriminator()) + model.getProperties().stream().filter(property -> !property.isPolymorphicDiscriminator()), + // Merged discriminators are removed from model properties but still mask same-named ancestor properties. + model.getParentPolymorphicDiscriminators().stream()) .map(ClientModelProperty::getSerializedName) .filter(name -> Objects.nonNull(name) && !name.isEmpty()) .collect(Collectors.toSet()); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java index 69dac758321..59b1f2527f9 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java @@ -886,18 +886,18 @@ private void addModelConstructor(ClientModel model, ClientModelPropertiesManager * * we use the property in this model to initiate the superclass */ - ClientModelProperty propertyInThisModel = model.getProperties() - .stream() + ClientModelProperty overridingProperty = Stream + .concat(model.getProperties().stream(), model.getParentPolymorphicDiscriminators().stream()) .filter(p -> Objects.equals(p.getSerializedName(), property.getSerializedName())) .findFirst() .orElse(null); - if (propertyInThisModel != null) { - if (propertyInThisModel.isConstant() && !property.isConstant()) { + if (overridingProperty != null) { + if (overridingProperty.isConstant() && !property.isConstant()) { // property changed to constant in this model, use constant value to initiate super // class - superProperties.append(propertyInThisModel.getDefaultValue()); + superProperties.append(overridingProperty.getDefaultValue()); } else { - superProperties.append(propertyInThisModel.getName()); + superProperties.append(overridingProperty.getName()); } } else { // this should not happen diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java index e0b4fb1f882..da52b57562c 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java @@ -103,6 +103,8 @@ public static ChildWithRequiredPropertyAsDiscriminator fromJson(JsonReader jsonR // Use the discriminator value to determine which subtype should be deserialized. if ("aValue".equals(discriminatorValue)) { return GrandChildWithRequiredProperty.fromJson(readerToUse.reset()); + } else if ("nested".equals(discriminatorValue)) { + return GrandChildWithNestedDiscriminator.fromJson(readerToUse.reset()); } else { return fromJsonKnownDiscriminator(readerToUse.reset()); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java new file mode 100644 index 00000000000..7f82ab64f31 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java @@ -0,0 +1,139 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The GrandChildWithNestedDiscriminator model. + */ +@Immutable +public class GrandChildWithNestedDiscriminator extends ChildWithRequiredPropertyAsDiscriminator { + /* + * Discriminator property for ChildWithRequiredPropertyAsDiscriminator. + */ + @Generated + private final String discriminator = "nested"; + + /* + * The nestedDiscriminator property. + */ + @Generated + private String nestedDiscriminator = "nested"; + + /** + * Creates an instance of GrandChildWithNestedDiscriminator class. + * + * @param aProperty the aProperty value to set. + * @param anotherProperty the anotherProperty value to set. + */ + @Generated + protected GrandChildWithNestedDiscriminator(String aProperty, String anotherProperty) { + super("nested", aProperty, anotherProperty); + } + + /** + * Get the discriminator property: Discriminator property for ChildWithRequiredPropertyAsDiscriminator. + * + * @return the discriminator value. + */ + @Generated + @Override + public String getDiscriminator() { + return this.discriminator; + } + + /** + * Get the nestedDiscriminator property: The nestedDiscriminator property. + * + * @return the nestedDiscriminator value. + */ + @Generated + public String getNestedDiscriminator() { + return this.nestedDiscriminator; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("discriminator", this.discriminator); + jsonWriter.writeStringField("aProperty", getAProperty()); + jsonWriter.writeStringField("anotherProperty", getAnotherProperty()); + jsonWriter.writeStringField("nestedDiscriminator", this.nestedDiscriminator); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of GrandChildWithNestedDiscriminator from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of GrandChildWithNestedDiscriminator if the JsonReader was pointing to an instance of it, or + * null if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the GrandChildWithNestedDiscriminator. + */ + @Generated + public static GrandChildWithNestedDiscriminator fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String discriminatorValue = null; + try (JsonReader readerToUse = reader.bufferObject()) { + readerToUse.nextToken(); // Prepare for reading + while (readerToUse.nextToken() != JsonToken.END_OBJECT) { + String fieldName = readerToUse.getFieldName(); + readerToUse.nextToken(); + if ("nestedDiscriminator".equals(fieldName)) { + discriminatorValue = readerToUse.getString(); + break; + } else { + readerToUse.skipChildren(); + } + } + // Use the discriminator value to determine which subtype should be deserialized. + if ("leaf".equals(discriminatorValue)) { + return GreatGrandChildWithDuplicateDiscriminator.fromJson(readerToUse.reset()); + } else { + return fromJsonKnownDiscriminator(readerToUse.reset()); + } + } + }); + } + + @Generated + static GrandChildWithNestedDiscriminator fromJsonKnownDiscriminator(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String aProperty = null; + String anotherProperty = null; + String nestedDiscriminator = "nested"; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + + if ("aProperty".equals(fieldName)) { + aProperty = reader.getString(); + } else if ("anotherProperty".equals(fieldName)) { + anotherProperty = reader.getString(); + } else if ("nestedDiscriminator".equals(fieldName)) { + nestedDiscriminator = reader.getString(); + } else { + reader.skipChildren(); + } + } + GrandChildWithNestedDiscriminator deserializedGrandChildWithNestedDiscriminator + = new GrandChildWithNestedDiscriminator(aProperty, anotherProperty); + deserializedGrandChildWithNestedDiscriminator.nestedDiscriminator = nestedDiscriminator; + + return deserializedGrandChildWithNestedDiscriminator; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java new file mode 100644 index 00000000000..2ca425572e7 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java @@ -0,0 +1,114 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The GreatGrandChildWithDuplicateDiscriminator model. + */ +@Immutable +public final class GreatGrandChildWithDuplicateDiscriminator extends GrandChildWithNestedDiscriminator { + /* + * The discriminator property. + */ + @Generated + private final String discriminator = "nested"; + + /* + * The nestedDiscriminator property. + */ + @Generated + private String nestedDiscriminator = "leaf"; + + /** + * Creates an instance of GreatGrandChildWithDuplicateDiscriminator class. + * + * @param aProperty the aProperty value to set. + * @param anotherProperty the anotherProperty value to set. + */ + @Generated + private GreatGrandChildWithDuplicateDiscriminator(String aProperty, String anotherProperty) { + super(aProperty, anotherProperty); + } + + /** + * Get the discriminator property: The discriminator property. + * + * @return the discriminator value. + */ + @Generated + @Override + public String getDiscriminator() { + return this.discriminator; + } + + /** + * Get the nestedDiscriminator property: The nestedDiscriminator property. + * + * @return the nestedDiscriminator value. + */ + @Generated + @Override + public String getNestedDiscriminator() { + return this.nestedDiscriminator; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("discriminator", this.discriminator); + jsonWriter.writeStringField("aProperty", getAProperty()); + jsonWriter.writeStringField("anotherProperty", getAnotherProperty()); + jsonWriter.writeStringField("nestedDiscriminator", this.nestedDiscriminator); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of GreatGrandChildWithDuplicateDiscriminator from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of GreatGrandChildWithDuplicateDiscriminator if the JsonReader was pointing to an instance of + * it, or null if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the GreatGrandChildWithDuplicateDiscriminator. + */ + @Generated + public static GreatGrandChildWithDuplicateDiscriminator fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String aProperty = null; + String anotherProperty = null; + String nestedDiscriminator = "leaf"; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + + if ("aProperty".equals(fieldName)) { + aProperty = reader.getString(); + } else if ("anotherProperty".equals(fieldName)) { + anotherProperty = reader.getString(); + } else if ("nestedDiscriminator".equals(fieldName)) { + nestedDiscriminator = reader.getString(); + } else { + reader.skipChildren(); + } + } + GreatGrandChildWithDuplicateDiscriminator deserializedGreatGrandChildWithDuplicateDiscriminator + = new GreatGrandChildWithDuplicateDiscriminator(aProperty, anotherProperty); + deserializedGreatGrandChildWithDuplicateDiscriminator.nestedDiscriminator = nestedDiscriminator; + + return deserializedGreatGrandChildWithDuplicateDiscriminator; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java index ec946111a85..73bd60c3712 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java @@ -17,7 +17,7 @@ @Immutable public final class SawShark extends Shark { /* - * The kind property. + * discriminator property */ @Generated private final FishKind kind = FishKind.SHARK; @@ -39,7 +39,7 @@ public SawShark(int age) { } /** - * Get the kind property: The kind property. + * Get the kind property: discriminator property. * * @return the kind value. */ diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json index 21ae133f1dc..688c158759b 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json @@ -1 +1 @@ -{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.DiscriminatorEdgeCases","crossLanguageVersion":"c89ca21b286d","crossLanguageDefinitions":{"tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClientBuilder":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.models.ChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.ChildWithRequiredPropertyAsDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithRequiredPropertyAsDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.GrandChildWithRequiredProperty","tsptest.discriminatoredgecases.models.ModelWithDiscriminatorNoSubtypes":"TspTest.DiscriminatorEdgeCases.ModelWithDiscriminatorNoSubtypes","tsptest.discriminatoredgecases.models.ParentWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.ParentWithRequiredProperty"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesAsyncClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClientBuilder.java","src/main/java/tsptest/discriminatoredgecases/implementation/DiscriminatorEdgeCasesClientImpl.java","src/main/java/tsptest/discriminatoredgecases/implementation/package-info.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/ModelWithDiscriminatorNoSubtypes.java","src/main/java/tsptest/discriminatoredgecases/models/ParentWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/package-info.java","src/main/java/tsptest/discriminatoredgecases/package-info.java"]} \ No newline at end of file +{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.DiscriminatorEdgeCases","crossLanguageVersion":"48129d44991b","crossLanguageDefinitions":{"tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClientBuilder":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.models.ChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.ChildWithRequiredPropertyAsDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithRequiredPropertyAsDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithNestedDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithNestedDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.GrandChildWithRequiredProperty","tsptest.discriminatoredgecases.models.GreatGrandChildWithDuplicateDiscriminator":"TspTest.DiscriminatorEdgeCases.GreatGrandChildWithDuplicateDiscriminator","tsptest.discriminatoredgecases.models.ModelWithDiscriminatorNoSubtypes":"TspTest.DiscriminatorEdgeCases.ModelWithDiscriminatorNoSubtypes","tsptest.discriminatoredgecases.models.ParentWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.ParentWithRequiredProperty"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesAsyncClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClientBuilder.java","src/main/java/tsptest/discriminatoredgecases/implementation/DiscriminatorEdgeCasesClientImpl.java","src/main/java/tsptest/discriminatoredgecases/implementation/package-info.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ModelWithDiscriminatorNoSubtypes.java","src/main/java/tsptest/discriminatoredgecases/models/ParentWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/package-info.java","src/main/java/tsptest/discriminatoredgecases/package-info.java"]} \ No newline at end of file diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-enumnesteddiscriminator_metadata.json b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-enumnesteddiscriminator_metadata.json index 1d72f990090..e4fc7bb99c7 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-enumnesteddiscriminator_metadata.json +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-enumnesteddiscriminator_metadata.json @@ -1 +1 @@ -{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.EnumNestedDiscriminator","crossLanguageVersion":"e2c89125d0a8","crossLanguageDefinitions":{"tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getMissingDiscriminator":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getMissingDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getModel":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getModelWithResponse":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getRecursiveModel":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getWrongDiscriminator":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getWrongDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putModel":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putModelWithResponse":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putRecursiveModel":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getMissingDiscriminator":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getMissingDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getModel":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getModelWithResponse":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getRecursiveModel":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getWrongDiscriminator":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getWrongDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putModel":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putModelWithResponse":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putRecursiveModel":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClientBuilder":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.models.Fish":"TspTest.EnumNestedDiscriminator.Fish","tsptest.enumnesteddiscriminator.models.FishKind":"TspTest.EnumNestedDiscriminator.FishKind","tsptest.enumnesteddiscriminator.models.GoblinShark":"TspTest.EnumNestedDiscriminator.GoblinShark","tsptest.enumnesteddiscriminator.models.Salmon":"TspTest.EnumNestedDiscriminator.Salmon","tsptest.enumnesteddiscriminator.models.SawShark":"TspTest.EnumNestedDiscriminator.SawShark","tsptest.enumnesteddiscriminator.models.Shark":"TspTest.EnumNestedDiscriminator.Shark","tsptest.enumnesteddiscriminator.models.SharkKind":"TspTest.EnumNestedDiscriminator.SharkKind"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorAsyncClient.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorClient.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorClientBuilder.java","src/main/java/tsptest/enumnesteddiscriminator/implementation/EnumNestedDiscriminatorClientImpl.java","src/main/java/tsptest/enumnesteddiscriminator/implementation/package-info.java","src/main/java/tsptest/enumnesteddiscriminator/models/Fish.java","src/main/java/tsptest/enumnesteddiscriminator/models/FishKind.java","src/main/java/tsptest/enumnesteddiscriminator/models/GoblinShark.java","src/main/java/tsptest/enumnesteddiscriminator/models/Salmon.java","src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java","src/main/java/tsptest/enumnesteddiscriminator/models/Shark.java","src/main/java/tsptest/enumnesteddiscriminator/models/SharkKind.java","src/main/java/tsptest/enumnesteddiscriminator/models/package-info.java","src/main/java/tsptest/enumnesteddiscriminator/package-info.java"]} \ No newline at end of file +{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.EnumNestedDiscriminator","crossLanguageVersion":"a7268a26bdc4","crossLanguageDefinitions":{"tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getMissingDiscriminator":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getMissingDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getModel":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getModelWithResponse":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getRecursiveModel":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getWrongDiscriminator":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.getWrongDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putModel":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putModelWithResponse":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putRecursiveModel":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorAsyncClient.putRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getMissingDiscriminator":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getMissingDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getMissingDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getModel":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getModelWithResponse":"TspTest.EnumNestedDiscriminator.getModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getRecursiveModel":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.getRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getWrongDiscriminator":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.getWrongDiscriminatorWithResponse":"TspTest.EnumNestedDiscriminator.getWrongDiscriminator","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putModel":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putModelWithResponse":"TspTest.EnumNestedDiscriminator.putModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putRecursiveModel":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClient.putRecursiveModelWithResponse":"TspTest.EnumNestedDiscriminator.putRecursiveModel","tsptest.enumnesteddiscriminator.EnumNestedDiscriminatorClientBuilder":"TspTest.EnumNestedDiscriminator","tsptest.enumnesteddiscriminator.models.Fish":"TspTest.EnumNestedDiscriminator.Fish","tsptest.enumnesteddiscriminator.models.FishKind":"TspTest.EnumNestedDiscriminator.FishKind","tsptest.enumnesteddiscriminator.models.GoblinShark":"TspTest.EnumNestedDiscriminator.GoblinShark","tsptest.enumnesteddiscriminator.models.Salmon":"TspTest.EnumNestedDiscriminator.Salmon","tsptest.enumnesteddiscriminator.models.SawShark":"TspTest.EnumNestedDiscriminator.SawShark","tsptest.enumnesteddiscriminator.models.Shark":"TspTest.EnumNestedDiscriminator.Shark","tsptest.enumnesteddiscriminator.models.SharkKind":"TspTest.EnumNestedDiscriminator.SharkKind"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorAsyncClient.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorClient.java","src/main/java/tsptest/enumnesteddiscriminator/EnumNestedDiscriminatorClientBuilder.java","src/main/java/tsptest/enumnesteddiscriminator/implementation/EnumNestedDiscriminatorClientImpl.java","src/main/java/tsptest/enumnesteddiscriminator/implementation/package-info.java","src/main/java/tsptest/enumnesteddiscriminator/models/Fish.java","src/main/java/tsptest/enumnesteddiscriminator/models/FishKind.java","src/main/java/tsptest/enumnesteddiscriminator/models/GoblinShark.java","src/main/java/tsptest/enumnesteddiscriminator/models/Salmon.java","src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java","src/main/java/tsptest/enumnesteddiscriminator/models/Shark.java","src/main/java/tsptest/enumnesteddiscriminator/models/SharkKind.java","src/main/java/tsptest/enumnesteddiscriminator/models/package-info.java","src/main/java/tsptest/enumnesteddiscriminator/package-info.java"]} \ No newline at end of file diff --git a/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp b/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp index bb8982abd9e..781520f372c 100644 --- a/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp +++ b/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp @@ -28,6 +28,21 @@ model GrandChildWithRequiredProperty extends ChildWithRequiredPropertyAsDiscrimi discriminator: "aValue"; } +@discriminator("nestedDiscriminator") +model GrandChildWithNestedDiscriminator extends ChildWithRequiredPropertyAsDiscriminator { + discriminator: "nested"; + + // Activates a nested hierarchy so the outer discriminator is propagated and masks the base property. + nestedDiscriminator: string; +} + +model GreatGrandChildWithDuplicateDiscriminator extends GrandChildWithNestedDiscriminator { + // Repeats the propagated outer discriminator to exercise duplicate merging. + discriminator: "nested"; + + nestedDiscriminator: "leaf"; +} + model GrandChildWithAnotherDiscriminator extends ChildWithAnotherDiscriminator { differentDiscriminator: "anotherValue"; } diff --git a/packages/http-client-java/generator/http-client-generator-test/tsp/nested-enum-discriminator.tsp b/packages/http-client-java/generator/http-client-generator-test/tsp/nested-enum-discriminator.tsp index c2d7b36318a..077c08f9672 100644 --- a/packages/http-client-java/generator/http-client-generator-test/tsp/nested-enum-discriminator.tsp +++ b/packages/http-client-java/generator/http-client-generator-test/tsp/nested-enum-discriminator.tsp @@ -55,7 +55,6 @@ model Salmon extends Fish { @doc("The third level model SawShark in polymorphic multiple levels inheritance.") model SawShark extends Shark { - kind: FishKind.Shark; sharktype: SharkKind.Saw; } From 01a8261626d175f539fa15221ee65270525cf472 Mon Sep 17 00:00:00 2001 From: Xiaofei Cao <92354331+XiaofeiCao@users.noreply.github.com> Date: Fri, 4 Sep 2026 10:33:08 +0800 Subject: [PATCH 05/12] Enhance error message for polymorphic discriminator mismatch Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../http/client/generator/core/mapper/ModelMapper.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java index f72637e4457..4e1ae3d094a 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java @@ -403,9 +403,11 @@ private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty p || !Objects.equals(parentDiscriminator.getWireType(), childProperty.getWireType()) || !Objects.equals(parentDiscriminator.getClientType(), childProperty.getClientType()) || !Objects.equals(parentDiscriminator.getDefaultValue(), childProperty.getDefaultValue())) { - throw new IllegalStateException("Property '" + childProperty.getSerializedName() + "' on model '" - + child.getName() + "' does not match its inherited polymorphic discriminator."); - } +throw new IllegalStateException("Property '" + childProperty.getSerializedName() + "' on model '" + child.getName() + + "' does not match its inherited polymorphic discriminator. Expected (type=" + + parentDiscriminator.getClientType() + ", value=" + String.valueOf(parentDiscriminator.getDefaultValue()) + + "), but found (type=" + childProperty.getClientType() + ", value=" + + String.valueOf(childProperty.getDefaultValue()) + ")."); discriminatorForChild = childProperty.newBuilder() .name(parentDiscriminator.getName()) From 65275511eb2f3602e3985584465d246f424b7e2d Mon Sep 17 00:00:00 2001 From: "Xiaofei Cao (from Dev Box)" Date: Fri, 4 Sep 2026 12:43:38 +0800 Subject: [PATCH 06/12] fix(http-client-java): preserve XML discriminators Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 00e7fd30-d342-4b5a-ad7e-f16198c7dbde --- ...ava-duplicate-discriminators-2026-09-02.md | 2 +- .../ClientModelPropertiesManager.java | 8 +- .../generator/core/mapper/ModelMapper.java | 44 +++--- .../core/template/ModelTemplate.java | 12 +- .../StreamSerializationModelTemplate.java | 32 +++- ...ldWithRequiredPropertyAsDiscriminator.java | 2 - .../GrandChildWithNestedDiscriminator.java | 139 ------------------ ...tGrandChildWithDuplicateDiscriminator.java | 114 -------------- .../models/NestedDiscriminatorAssistant.java | 122 +++++++++++++++ .../models/NestedDiscriminatorBase.java | 116 +++++++++++++++ .../models/NestedDiscriminatorMessage.java | 133 +++++++++++++++++ ...ptest-discriminatoredgecases_metadata.json | 2 +- .../tsp/discriminator-edge-cases.tsp | 28 ++-- 13 files changed, 443 insertions(+), 311 deletions(-) delete mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java delete mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorBase.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorMessage.java diff --git a/.chronus/changes/fix-java-duplicate-discriminators-2026-09-02.md b/.chronus/changes/fix-java-duplicate-discriminators-2026-09-02.md index ceede7bf0f2..6acbebea6c0 100644 --- a/.chronus/changes/fix-java-duplicate-discriminators-2026-09-02.md +++ b/.chronus/changes/fix-java-duplicate-discriminators-2026-09-02.md @@ -4,4 +4,4 @@ packages: - "@typespec/http-client-java" --- -Prevent duplicate Java fields and accessors when a model redeclares an inherited fixed discriminator. +Prevent duplicate Java discriminator members while preserving inherited discriminators in stream-style XML serialization. diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java index 948053d4ada..4f29e64c65e 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java @@ -22,7 +22,6 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.stream.Collectors; -import java.util.stream.Stream; /** * Manages metadata about properties in a {@link ClientModel} and how they correlate with model class generation. @@ -125,11 +124,10 @@ public ClientModelPropertiesManager(ClientModel model, JavaSettings settings) { xmlRootElementNamespace = model.getXmlNamespace(); } - Set thisModelPropertySerializeNames = Stream.concat( + Set thisModelPropertySerializeNames = model.getProperties() + .stream() // discriminator property is known to be redefined in subclass - model.getProperties().stream().filter(property -> !property.isPolymorphicDiscriminator()), - // Merged discriminators are removed from model properties but still mask same-named ancestor properties. - model.getParentPolymorphicDiscriminators().stream()) + .filter(property -> !property.isPolymorphicDiscriminator()) .map(ClientModelProperty::getSerializedName) .filter(name -> Objects.nonNull(name) && !name.isEmpty()) .collect(Collectors.toSet()); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java index 4e1ae3d094a..261bd1430f0 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java @@ -363,7 +363,6 @@ public ClientModel map(ObjectSchema compositeType) { // the correct serialization in multi-level polymorphic structures. for (ClientModel derivedType : derivedTypes) { if (!Objects.equals(polymorphicDiscriminator, derivedType.getPolymorphicDiscriminatorName())) { - // The child hierarchy stays in one fixed parent discriminator branch. ClientModelProperty parentDiscriminator = result.getPolymorphicDiscriminator() .newBuilder() .defaultValue(result.getPolymorphicDiscriminator() @@ -385,16 +384,7 @@ public ClientModel map(ObjectSchema compositeType) { private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty parentDiscriminator, ClientModel child) { - // Due to the execution order of ModelMapper, where children models complete mapping before the parent model, - // the parent polymorphic discriminator needs to be added at index 0. Reason, given an example where there are - // three models, where model #1 is the root parent with discriminator type, model #2 is a child of model #2 with - // discriminator kind, and model #3 is a child of model #3 with discriminator form. The order if this running - // will have model #2 add its discriminator to model #3 before model #1 runs adding its discriminator to #2 and - // #3. We want #3 to have the ordering of [type, kind], to represent the ordering of the parent models. - // Merge a matching child declaration to avoid emitting the inherited discriminator twice. - ClientModelProperty discriminatorForChild = parentDiscriminator; - for (int i = 0; i < child.getProperties().size(); i++) { - ClientModelProperty childProperty = child.getProperties().get(i); + for (ClientModelProperty childProperty : child.getProperties()) { if (!Objects.equals(parentDiscriminator.getSerializedName(), childProperty.getSerializedName())) { continue; } @@ -403,23 +393,25 @@ private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty p || !Objects.equals(parentDiscriminator.getWireType(), childProperty.getWireType()) || !Objects.equals(parentDiscriminator.getClientType(), childProperty.getClientType()) || !Objects.equals(parentDiscriminator.getDefaultValue(), childProperty.getDefaultValue())) { -throw new IllegalStateException("Property '" + childProperty.getSerializedName() + "' on model '" + child.getName() - + "' does not match its inherited polymorphic discriminator. Expected (type=" - + parentDiscriminator.getClientType() + ", value=" + String.valueOf(parentDiscriminator.getDefaultValue()) - + "), but found (type=" + childProperty.getClientType() + ", value=" - + String.valueOf(childProperty.getDefaultValue()) + ")."); - - discriminatorForChild = childProperty.newBuilder() - .name(parentDiscriminator.getName()) - .readOnly(true) - .required(false) - .polymorphicDiscriminator(true) - .build(); - child.getProperties().remove(i); - break; + throw new IllegalStateException("Property '" + childProperty.getSerializedName() + "' on model '" + + child.getName() + "' does not match its inherited polymorphic discriminator. Expected (type=" + + parentDiscriminator.getClientType() + ", value=" + + String.valueOf(parentDiscriminator.getDefaultValue()) + "), but found (type=" + + childProperty.getClientType() + ", value=" + String.valueOf(childProperty.getDefaultValue()) + + ")."); + } + + // The declared constant owns the fixed discriminator value for this entire branch. + return; } - child.getParentPolymorphicDiscriminators().add(0, discriminatorForChild); + // Due to the execution order of ModelMapper, where children models complete mapping before the parent model, + // the parent polymorphic discriminator needs to be added at index 0. Reason, given an example where there are + // three models, where model #1 is the root parent with discriminator type, model #2 is a child of model #2 with + // discriminator kind, and model #3 is a child of model #3 with discriminator form. The order if this running + // will have model #2 add its discriminator to model #3 before model #1 runs adding its discriminator to #2 and + // #3. We want #3 to have the ordering of [type, kind], to represent the ordering of the parent models. + child.getParentPolymorphicDiscriminators().add(0, parentDiscriminator); for (ClientModel derived : child.getDerivedModels()) { passPolymorphicDiscriminatorToChildren(parentDiscriminator, derived); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java index 59b1f2527f9..69dac758321 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java @@ -886,18 +886,18 @@ private void addModelConstructor(ClientModel model, ClientModelPropertiesManager * * we use the property in this model to initiate the superclass */ - ClientModelProperty overridingProperty = Stream - .concat(model.getProperties().stream(), model.getParentPolymorphicDiscriminators().stream()) + ClientModelProperty propertyInThisModel = model.getProperties() + .stream() .filter(p -> Objects.equals(p.getSerializedName(), property.getSerializedName())) .findFirst() .orElse(null); - if (overridingProperty != null) { - if (overridingProperty.isConstant() && !property.isConstant()) { + if (propertyInThisModel != null) { + if (propertyInThisModel.isConstant() && !property.isConstant()) { // property changed to constant in this model, use constant value to initiate super // class - superProperties.append(overridingProperty.getDefaultValue()); + superProperties.append(propertyInThisModel.getDefaultValue()); } else { - superProperties.append(overridingProperty.getName()); + superProperties.append(propertyInThisModel.getName()); } } else { // this should not happen diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java index 49f72130dcc..e30051536ab 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java @@ -2059,8 +2059,16 @@ private void writeToXml(JavaClass classBlock) { + propertiesManager.getXmlNamespaceConstant(namespace) + ");")); // Assumption for XML is polymorphic discriminators are attributes. - if (propertiesManager.getDiscriminatorProperty() != null) { - serializeXml(methodBlock, propertiesManager.getDiscriminatorProperty().getProperty(), false); + ClientModelPropertyWithMetadata discriminatorProperty + = propertiesManager.getDiscriminatorProperty(); + model.getParentPolymorphicDiscriminators() + .stream() + .filter(discriminator -> discriminatorProperty == null + || !Objects.equals(discriminator.getSerializedName(), + discriminatorProperty.getProperty().getSerializedName())) + .forEach(discriminator -> serializeXml(methodBlock, discriminator, false)); + if (discriminatorProperty != null) { + serializeXml(methodBlock, discriminatorProperty.getProperty(), false); } propertiesManager.forEachSuperXmlAttribute(property -> serializeXml(methodBlock, property, true)); @@ -2214,7 +2222,7 @@ private void writeSuperTypeFromXml(JavaClass classBlock) { + propertiesManager.getXmlNamespaceConstant(discriminatorProperty.getXmlNamespace()) + ", " + "\"" + discriminatorProperty.getSerializedName() + "\");"); } else { - methodBlock.line("String discriminatorValue = reader.getStringAttribute(" + "\"" + methodBlock.line("String discriminatorValue = reader.getStringAttribute(null, " + "\"" + discriminatorProperty.getSerializedName() + "\");"); } @@ -2226,12 +2234,18 @@ private void writeSuperTypeFromXml(JavaClass classBlock) { // Add deserialization for all child types. List childTypes = getAllChildTypes(model, new ArrayList<>()); for (ClientModel childType : childTypes) { + boolean sameDiscriminator = Objects.equals(childType.getPolymorphicDiscriminatorName(), + model.getPolymorphicDiscriminatorName()); + if (!sameDiscriminator && !Objects.equals(childType.getParentModelName(), model.getName())) { + continue; + } + + String deserializationMethod = (isSuperTypeWithDiscriminator(childType) && sameDiscriminator) + ? ".fromXmlInternal(reader, finalRootElementName)" + : ".fromXml(reader, finalRootElementName)"; ifBlock = ifOrElseIf(methodBlock, ifBlock, "\"" + childType.getSerializedName() + "\".equals(discriminatorValue)", - ifStatement -> ifStatement - .methodReturn(childType.getName() + (isSuperTypeWithDiscriminator(childType) - ? ".fromXmlInternal(reader, finalRootElementName)" - : ".fromXml(reader, finalRootElementName)"))); + ifStatement -> ifStatement.methodReturn(childType.getName() + deserializationMethod)); } if (ifBlock == null) { @@ -2439,6 +2453,10 @@ private void writeFromXmlDeserialization(JavaBlock methodBlock) { } private void deserializeXmlAttribute(JavaBlock methodBlock, ClientModelProperty attribute, boolean fromSuper) { + if (attribute.isRequired() && attribute.isConstant() && !attribute.isPolymorphicDiscriminator()) { + return; + } + String xmlAttributeDeserialization = getSimpleXmlDeserialization(attribute.getWireType(), null, attribute.getXmlName(), propertiesManager.getXmlNamespaceConstant(attribute.getXmlNamespace()), true); diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java index da52b57562c..e0b4fb1f882 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java @@ -103,8 +103,6 @@ public static ChildWithRequiredPropertyAsDiscriminator fromJson(JsonReader jsonR // Use the discriminator value to determine which subtype should be deserialized. if ("aValue".equals(discriminatorValue)) { return GrandChildWithRequiredProperty.fromJson(readerToUse.reset()); - } else if ("nested".equals(discriminatorValue)) { - return GrandChildWithNestedDiscriminator.fromJson(readerToUse.reset()); } else { return fromJsonKnownDiscriminator(readerToUse.reset()); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java deleted file mode 100644 index 7f82ab64f31..00000000000 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. - -package tsptest.discriminatoredgecases.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.azure.json.JsonReader; -import com.azure.json.JsonToken; -import com.azure.json.JsonWriter; -import java.io.IOException; - -/** - * The GrandChildWithNestedDiscriminator model. - */ -@Immutable -public class GrandChildWithNestedDiscriminator extends ChildWithRequiredPropertyAsDiscriminator { - /* - * Discriminator property for ChildWithRequiredPropertyAsDiscriminator. - */ - @Generated - private final String discriminator = "nested"; - - /* - * The nestedDiscriminator property. - */ - @Generated - private String nestedDiscriminator = "nested"; - - /** - * Creates an instance of GrandChildWithNestedDiscriminator class. - * - * @param aProperty the aProperty value to set. - * @param anotherProperty the anotherProperty value to set. - */ - @Generated - protected GrandChildWithNestedDiscriminator(String aProperty, String anotherProperty) { - super("nested", aProperty, anotherProperty); - } - - /** - * Get the discriminator property: Discriminator property for ChildWithRequiredPropertyAsDiscriminator. - * - * @return the discriminator value. - */ - @Generated - @Override - public String getDiscriminator() { - return this.discriminator; - } - - /** - * Get the nestedDiscriminator property: The nestedDiscriminator property. - * - * @return the nestedDiscriminator value. - */ - @Generated - public String getNestedDiscriminator() { - return this.nestedDiscriminator; - } - - /** - * {@inheritDoc} - */ - @Generated - @Override - public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { - jsonWriter.writeStartObject(); - jsonWriter.writeStringField("discriminator", this.discriminator); - jsonWriter.writeStringField("aProperty", getAProperty()); - jsonWriter.writeStringField("anotherProperty", getAnotherProperty()); - jsonWriter.writeStringField("nestedDiscriminator", this.nestedDiscriminator); - return jsonWriter.writeEndObject(); - } - - /** - * Reads an instance of GrandChildWithNestedDiscriminator from the JsonReader. - * - * @param jsonReader The JsonReader being read. - * @return An instance of GrandChildWithNestedDiscriminator if the JsonReader was pointing to an instance of it, or - * null if it was pointing to JSON null. - * @throws IllegalStateException If the deserialized JSON object was missing any required properties. - * @throws IOException If an error occurs while reading the GrandChildWithNestedDiscriminator. - */ - @Generated - public static GrandChildWithNestedDiscriminator fromJson(JsonReader jsonReader) throws IOException { - return jsonReader.readObject(reader -> { - String discriminatorValue = null; - try (JsonReader readerToUse = reader.bufferObject()) { - readerToUse.nextToken(); // Prepare for reading - while (readerToUse.nextToken() != JsonToken.END_OBJECT) { - String fieldName = readerToUse.getFieldName(); - readerToUse.nextToken(); - if ("nestedDiscriminator".equals(fieldName)) { - discriminatorValue = readerToUse.getString(); - break; - } else { - readerToUse.skipChildren(); - } - } - // Use the discriminator value to determine which subtype should be deserialized. - if ("leaf".equals(discriminatorValue)) { - return GreatGrandChildWithDuplicateDiscriminator.fromJson(readerToUse.reset()); - } else { - return fromJsonKnownDiscriminator(readerToUse.reset()); - } - } - }); - } - - @Generated - static GrandChildWithNestedDiscriminator fromJsonKnownDiscriminator(JsonReader jsonReader) throws IOException { - return jsonReader.readObject(reader -> { - String aProperty = null; - String anotherProperty = null; - String nestedDiscriminator = "nested"; - while (reader.nextToken() != JsonToken.END_OBJECT) { - String fieldName = reader.getFieldName(); - reader.nextToken(); - - if ("aProperty".equals(fieldName)) { - aProperty = reader.getString(); - } else if ("anotherProperty".equals(fieldName)) { - anotherProperty = reader.getString(); - } else if ("nestedDiscriminator".equals(fieldName)) { - nestedDiscriminator = reader.getString(); - } else { - reader.skipChildren(); - } - } - GrandChildWithNestedDiscriminator deserializedGrandChildWithNestedDiscriminator - = new GrandChildWithNestedDiscriminator(aProperty, anotherProperty); - deserializedGrandChildWithNestedDiscriminator.nestedDiscriminator = nestedDiscriminator; - - return deserializedGrandChildWithNestedDiscriminator; - }); - } -} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java deleted file mode 100644 index 2ca425572e7..00000000000 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. - -package tsptest.discriminatoredgecases.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.azure.json.JsonReader; -import com.azure.json.JsonToken; -import com.azure.json.JsonWriter; -import java.io.IOException; - -/** - * The GreatGrandChildWithDuplicateDiscriminator model. - */ -@Immutable -public final class GreatGrandChildWithDuplicateDiscriminator extends GrandChildWithNestedDiscriminator { - /* - * The discriminator property. - */ - @Generated - private final String discriminator = "nested"; - - /* - * The nestedDiscriminator property. - */ - @Generated - private String nestedDiscriminator = "leaf"; - - /** - * Creates an instance of GreatGrandChildWithDuplicateDiscriminator class. - * - * @param aProperty the aProperty value to set. - * @param anotherProperty the anotherProperty value to set. - */ - @Generated - private GreatGrandChildWithDuplicateDiscriminator(String aProperty, String anotherProperty) { - super(aProperty, anotherProperty); - } - - /** - * Get the discriminator property: The discriminator property. - * - * @return the discriminator value. - */ - @Generated - @Override - public String getDiscriminator() { - return this.discriminator; - } - - /** - * Get the nestedDiscriminator property: The nestedDiscriminator property. - * - * @return the nestedDiscriminator value. - */ - @Generated - @Override - public String getNestedDiscriminator() { - return this.nestedDiscriminator; - } - - /** - * {@inheritDoc} - */ - @Generated - @Override - public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { - jsonWriter.writeStartObject(); - jsonWriter.writeStringField("discriminator", this.discriminator); - jsonWriter.writeStringField("aProperty", getAProperty()); - jsonWriter.writeStringField("anotherProperty", getAnotherProperty()); - jsonWriter.writeStringField("nestedDiscriminator", this.nestedDiscriminator); - return jsonWriter.writeEndObject(); - } - - /** - * Reads an instance of GreatGrandChildWithDuplicateDiscriminator from the JsonReader. - * - * @param jsonReader The JsonReader being read. - * @return An instance of GreatGrandChildWithDuplicateDiscriminator if the JsonReader was pointing to an instance of - * it, or null if it was pointing to JSON null. - * @throws IllegalStateException If the deserialized JSON object was missing any required properties. - * @throws IOException If an error occurs while reading the GreatGrandChildWithDuplicateDiscriminator. - */ - @Generated - public static GreatGrandChildWithDuplicateDiscriminator fromJson(JsonReader jsonReader) throws IOException { - return jsonReader.readObject(reader -> { - String aProperty = null; - String anotherProperty = null; - String nestedDiscriminator = "leaf"; - while (reader.nextToken() != JsonToken.END_OBJECT) { - String fieldName = reader.getFieldName(); - reader.nextToken(); - - if ("aProperty".equals(fieldName)) { - aProperty = reader.getString(); - } else if ("anotherProperty".equals(fieldName)) { - anotherProperty = reader.getString(); - } else if ("nestedDiscriminator".equals(fieldName)) { - nestedDiscriminator = reader.getString(); - } else { - reader.skipChildren(); - } - } - GreatGrandChildWithDuplicateDiscriminator deserializedGreatGrandChildWithDuplicateDiscriminator - = new GreatGrandChildWithDuplicateDiscriminator(aProperty, anotherProperty); - deserializedGreatGrandChildWithDuplicateDiscriminator.nestedDiscriminator = nestedDiscriminator; - - return deserializedGreatGrandChildWithDuplicateDiscriminator; - }); - } -} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java new file mode 100644 index 00000000000..867660970a3 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java @@ -0,0 +1,122 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.xml.XmlReader; +import com.azure.xml.XmlToken; +import com.azure.xml.XmlWriter; +import javax.xml.stream.XMLStreamException; + +/** + * The NestedDiscriminatorAssistant model. + */ +@Immutable +public final class NestedDiscriminatorAssistant extends NestedDiscriminatorMessage { + /* + * The role property. + */ + @Generated + private String role = "assistant"; + + /* + * The type property. + */ + @Generated + private final String type = "message"; + + /** + * Creates an instance of NestedDiscriminatorAssistant class. + */ + @Generated + private NestedDiscriminatorAssistant() { + } + + /** + * Get the role property: The role property. + * + * @return the role value. + */ + @Generated + @Override + public String getRole() { + return this.role; + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + public String getType() { + return this.type; + } + + @Generated + @Override + public XmlWriter toXml(XmlWriter xmlWriter) throws XMLStreamException { + return toXml(xmlWriter, null); + } + + @Generated + @Override + public XmlWriter toXml(XmlWriter xmlWriter, String rootElementName) throws XMLStreamException { + rootElementName + = rootElementName == null || rootElementName.isEmpty() ? "NestedDiscriminatorBase" : rootElementName; + xmlWriter.writeStartElement(rootElementName); + xmlWriter.writeStringAttribute("role", this.role); + xmlWriter.writeStringAttribute("type", this.type); + return xmlWriter.writeEndElement(); + } + + /** + * Reads an instance of NestedDiscriminatorAssistant from the XmlReader. + * + * @param xmlReader The XmlReader being read. + * @return An instance of NestedDiscriminatorAssistant if the XmlReader was pointing to an instance of it, or null + * if it was pointing to XML null. + * @throws IllegalStateException If the deserialized XML object has an invalid polymorphic discriminator value. + * @throws XMLStreamException If an error occurs while reading the NestedDiscriminatorAssistant. + */ + @Generated + public static NestedDiscriminatorAssistant fromXml(XmlReader xmlReader) throws XMLStreamException { + return fromXml(xmlReader, null); + } + + /** + * Reads an instance of NestedDiscriminatorAssistant from the XmlReader. + * + * @param xmlReader The XmlReader being read. + * @param rootElementName Optional root element name to override the default defined by the model. Used to support + * cases where the model can deserialize from different root element names. + * @return An instance of NestedDiscriminatorAssistant if the XmlReader was pointing to an instance of it, or null + * if it was pointing to XML null. + * @throws IllegalStateException If the deserialized XML object has an invalid polymorphic discriminator value. + * @throws XMLStreamException If an error occurs while reading the NestedDiscriminatorAssistant. + */ + @Generated + public static NestedDiscriminatorAssistant fromXml(XmlReader xmlReader, String rootElementName) + throws XMLStreamException { + String finalRootElementName + = rootElementName == null || rootElementName.isEmpty() ? "NestedDiscriminatorBase" : rootElementName; + return xmlReader.readObject(finalRootElementName, reader -> { + NestedDiscriminatorAssistant deserializedNestedDiscriminatorAssistant = new NestedDiscriminatorAssistant(); + String discriminatorValue = reader.getStringAttribute(null, "role"); + if (!"assistant".equals(discriminatorValue)) { + throw new IllegalStateException( + "'role' was expected to be non-null and equal to 'assistant'. The found 'role' was '" + + discriminatorValue + "'."); + } + deserializedNestedDiscriminatorAssistant.role = discriminatorValue; + while (reader.nextElement() != XmlToken.END_ELEMENT) { + reader.skipElement(); + } + + return deserializedNestedDiscriminatorAssistant; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorBase.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorBase.java new file mode 100644 index 00000000000..62bc785739a --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorBase.java @@ -0,0 +1,116 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.xml.XmlReader; +import com.azure.xml.XmlSerializable; +import com.azure.xml.XmlToken; +import com.azure.xml.XmlWriter; +import javax.xml.stream.XMLStreamException; + +/** + * The NestedDiscriminatorBase model. + */ +@Immutable +public class NestedDiscriminatorBase implements XmlSerializable { + /* + * The type property. + */ + @Generated + private String type = "NestedDiscriminatorBase"; + + /** + * Creates an instance of NestedDiscriminatorBase class. + */ + @Generated + protected NestedDiscriminatorBase() { + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + public String getType() { + return this.type; + } + + @Generated + @Override + public XmlWriter toXml(XmlWriter xmlWriter) throws XMLStreamException { + return toXml(xmlWriter, null); + } + + @Generated + @Override + public XmlWriter toXml(XmlWriter xmlWriter, String rootElementName) throws XMLStreamException { + rootElementName + = rootElementName == null || rootElementName.isEmpty() ? "NestedDiscriminatorBase" : rootElementName; + xmlWriter.writeStartElement(rootElementName); + xmlWriter.writeStringAttribute("type", this.type); + return xmlWriter.writeEndElement(); + } + + /** + * Reads an instance of NestedDiscriminatorBase from the XmlReader. + * + * @param xmlReader The XmlReader being read. + * @return An instance of NestedDiscriminatorBase if the XmlReader was pointing to an instance of it, or null if it + * was pointing to XML null. + * @throws IllegalStateException If the deserialized XML object has an invalid polymorphic discriminator value. + * @throws XMLStreamException If an error occurs while reading the NestedDiscriminatorBase. + */ + @Generated + public static NestedDiscriminatorBase fromXml(XmlReader xmlReader) throws XMLStreamException { + return fromXml(xmlReader, null); + } + + /** + * Reads an instance of NestedDiscriminatorBase from the XmlReader. + * + * @param xmlReader The XmlReader being read. + * @param rootElementName Optional root element name to override the default defined by the model. Used to support + * cases where the model can deserialize from different root element names. + * @return An instance of NestedDiscriminatorBase if the XmlReader was pointing to an instance of it, or null if it + * was pointing to XML null. + * @throws IllegalStateException If the deserialized XML object has an invalid polymorphic discriminator value. + * @throws XMLStreamException If an error occurs while reading the NestedDiscriminatorBase. + */ + @Generated + public static NestedDiscriminatorBase fromXml(XmlReader xmlReader, String rootElementName) + throws XMLStreamException { + String finalRootElementName + = rootElementName == null || rootElementName.isEmpty() ? "NestedDiscriminatorBase" : rootElementName; + return xmlReader.readObject(finalRootElementName, reader -> { + // Get the XML discriminator attribute. + String discriminatorValue = reader.getStringAttribute(null, "type"); + // Use the discriminator value to determine which subtype should be deserialized. + if ("message".equals(discriminatorValue)) { + return NestedDiscriminatorMessage.fromXml(reader, finalRootElementName); + } else { + return fromXmlInternal(reader, finalRootElementName); + } + }); + } + + @Generated + static NestedDiscriminatorBase fromXmlInternal(XmlReader xmlReader, String rootElementName) + throws XMLStreamException { + String finalRootElementName + = rootElementName == null || rootElementName.isEmpty() ? "NestedDiscriminatorBase" : rootElementName; + return xmlReader.readObject(finalRootElementName, reader -> { + NestedDiscriminatorBase deserializedNestedDiscriminatorBase = new NestedDiscriminatorBase(); + deserializedNestedDiscriminatorBase.type = reader.getStringAttribute(null, "type"); + while (reader.nextElement() != XmlToken.END_ELEMENT) { + reader.skipElement(); + } + + return deserializedNestedDiscriminatorBase; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorMessage.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorMessage.java new file mode 100644 index 00000000000..7a44887afaa --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorMessage.java @@ -0,0 +1,133 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.xml.XmlReader; +import com.azure.xml.XmlToken; +import com.azure.xml.XmlWriter; +import javax.xml.stream.XMLStreamException; + +/** + * The NestedDiscriminatorMessage model. + */ +@Immutable +public class NestedDiscriminatorMessage extends NestedDiscriminatorBase { + /* + * The type property. + */ + @Generated + private final String type = "message"; + + /* + * The role property. + */ + @Generated + private String role = "message"; + + /** + * Creates an instance of NestedDiscriminatorMessage class. + */ + @Generated + protected NestedDiscriminatorMessage() { + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + @Override + public String getType() { + return this.type; + } + + /** + * Get the role property: The role property. + * + * @return the role value. + */ + @Generated + public String getRole() { + return this.role; + } + + @Generated + @Override + public XmlWriter toXml(XmlWriter xmlWriter) throws XMLStreamException { + return toXml(xmlWriter, null); + } + + @Generated + @Override + public XmlWriter toXml(XmlWriter xmlWriter, String rootElementName) throws XMLStreamException { + rootElementName + = rootElementName == null || rootElementName.isEmpty() ? "NestedDiscriminatorBase" : rootElementName; + xmlWriter.writeStartElement(rootElementName); + xmlWriter.writeStringAttribute("type", this.type); + xmlWriter.writeStringAttribute("role", this.role); + return xmlWriter.writeEndElement(); + } + + /** + * Reads an instance of NestedDiscriminatorMessage from the XmlReader. + * + * @param xmlReader The XmlReader being read. + * @return An instance of NestedDiscriminatorMessage if the XmlReader was pointing to an instance of it, or null if + * it was pointing to XML null. + * @throws IllegalStateException If the deserialized XML object has an invalid polymorphic discriminator value. + * @throws XMLStreamException If an error occurs while reading the NestedDiscriminatorMessage. + */ + @Generated + public static NestedDiscriminatorMessage fromXml(XmlReader xmlReader) throws XMLStreamException { + return fromXml(xmlReader, null); + } + + /** + * Reads an instance of NestedDiscriminatorMessage from the XmlReader. + * + * @param xmlReader The XmlReader being read. + * @param rootElementName Optional root element name to override the default defined by the model. Used to support + * cases where the model can deserialize from different root element names. + * @return An instance of NestedDiscriminatorMessage if the XmlReader was pointing to an instance of it, or null if + * it was pointing to XML null. + * @throws IllegalStateException If the deserialized XML object has an invalid polymorphic discriminator value. + * @throws XMLStreamException If an error occurs while reading the NestedDiscriminatorMessage. + */ + @Generated + public static NestedDiscriminatorMessage fromXml(XmlReader xmlReader, String rootElementName) + throws XMLStreamException { + String finalRootElementName + = rootElementName == null || rootElementName.isEmpty() ? "NestedDiscriminatorBase" : rootElementName; + return xmlReader.readObject(finalRootElementName, reader -> { + // Get the XML discriminator attribute. + String discriminatorValue = reader.getStringAttribute(null, "role"); + // Use the discriminator value to determine which subtype should be deserialized. + if ("assistant".equals(discriminatorValue)) { + return NestedDiscriminatorAssistant.fromXml(reader, finalRootElementName); + } else { + return fromXmlInternal(reader, finalRootElementName); + } + }); + } + + @Generated + static NestedDiscriminatorMessage fromXmlInternal(XmlReader xmlReader, String rootElementName) + throws XMLStreamException { + String finalRootElementName + = rootElementName == null || rootElementName.isEmpty() ? "NestedDiscriminatorBase" : rootElementName; + return xmlReader.readObject(finalRootElementName, reader -> { + NestedDiscriminatorMessage deserializedNestedDiscriminatorMessage = new NestedDiscriminatorMessage(); + deserializedNestedDiscriminatorMessage.role = reader.getStringAttribute(null, "role"); + while (reader.nextElement() != XmlToken.END_ELEMENT) { + reader.skipElement(); + } + + return deserializedNestedDiscriminatorMessage; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json index 688c158759b..f9ae503792f 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json @@ -1 +1 @@ -{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.DiscriminatorEdgeCases","crossLanguageVersion":"48129d44991b","crossLanguageDefinitions":{"tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClientBuilder":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.models.ChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.ChildWithRequiredPropertyAsDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithRequiredPropertyAsDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithNestedDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithNestedDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.GrandChildWithRequiredProperty","tsptest.discriminatoredgecases.models.GreatGrandChildWithDuplicateDiscriminator":"TspTest.DiscriminatorEdgeCases.GreatGrandChildWithDuplicateDiscriminator","tsptest.discriminatoredgecases.models.ModelWithDiscriminatorNoSubtypes":"TspTest.DiscriminatorEdgeCases.ModelWithDiscriminatorNoSubtypes","tsptest.discriminatoredgecases.models.ParentWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.ParentWithRequiredProperty"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesAsyncClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClientBuilder.java","src/main/java/tsptest/discriminatoredgecases/implementation/DiscriminatorEdgeCasesClientImpl.java","src/main/java/tsptest/discriminatoredgecases/implementation/package-info.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ModelWithDiscriminatorNoSubtypes.java","src/main/java/tsptest/discriminatoredgecases/models/ParentWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/package-info.java","src/main/java/tsptest/discriminatoredgecases/package-info.java"]} \ No newline at end of file +{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.DiscriminatorEdgeCases","crossLanguageVersion":"22754e1f7b5a","crossLanguageDefinitions":{"tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClientBuilder":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.models.ChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.ChildWithRequiredPropertyAsDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithRequiredPropertyAsDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.GrandChildWithRequiredProperty","tsptest.discriminatoredgecases.models.ModelWithDiscriminatorNoSubtypes":"TspTest.DiscriminatorEdgeCases.ModelWithDiscriminatorNoSubtypes","tsptest.discriminatoredgecases.models.NestedDiscriminatorAssistant":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorAssistant","tsptest.discriminatoredgecases.models.NestedDiscriminatorBase":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorBase","tsptest.discriminatoredgecases.models.NestedDiscriminatorMessage":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorMessage","tsptest.discriminatoredgecases.models.ParentWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.ParentWithRequiredProperty"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesAsyncClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClientBuilder.java","src/main/java/tsptest/discriminatoredgecases/implementation/DiscriminatorEdgeCasesClientImpl.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializer.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializerProviders.java","src/main/java/tsptest/discriminatoredgecases/implementation/package-info.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/ModelWithDiscriminatorNoSubtypes.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorBase.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorMessage.java","src/main/java/tsptest/discriminatoredgecases/models/ParentWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/package-info.java","src/main/java/tsptest/discriminatoredgecases/package-info.java"]} \ No newline at end of file diff --git a/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp b/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp index 781520f372c..8e7dc92f040 100644 --- a/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp +++ b/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp @@ -1,8 +1,10 @@ import "@typespec/rest"; +import "@typespec/xml"; import "@azure-tools/typespec-azure-core"; import "@azure-tools/typespec-client-generator-core"; using TypeSpec.Http; +using TypeSpec.Xml; using Azure.Core; using Azure.ClientGenerator.Core; @@ -28,19 +30,25 @@ model GrandChildWithRequiredProperty extends ChildWithRequiredPropertyAsDiscrimi discriminator: "aValue"; } -@discriminator("nestedDiscriminator") -model GrandChildWithNestedDiscriminator extends ChildWithRequiredPropertyAsDiscriminator { - discriminator: "nested"; - - // Activates a nested hierarchy so the outer discriminator is propagated and masks the base property. - nestedDiscriminator: string; +@usage(Usage.output) +@access(Access.public) +@name("NestedDiscriminatorBase") +@discriminator("type") +model NestedDiscriminatorBase { + @attribute type: string; } -model GreatGrandChildWithDuplicateDiscriminator extends GrandChildWithNestedDiscriminator { - // Repeats the propagated outer discriminator to exercise duplicate merging. - discriminator: "nested"; +@name("NestedDiscriminatorMessage") +@discriminator("role") +model NestedDiscriminatorMessage extends NestedDiscriminatorBase { + @attribute type: "message"; + @attribute role: string; +} - nestedDiscriminator: "leaf"; +@name("NestedDiscriminatorAssistant") +model NestedDiscriminatorAssistant extends NestedDiscriminatorMessage { + @attribute type: "message"; + @attribute role: "assistant"; } model GrandChildWithAnotherDiscriminator extends ChildWithAnotherDiscriminator { From a9044e57522bc213f38893a035a6f645afb91bf8 Mon Sep 17 00:00:00 2001 From: "Xiaofei Cao (from Dev Box)" Date: Fri, 4 Sep 2026 16:05:10 +0800 Subject: [PATCH 07/12] fix(http-client-java): restore propagated discriminators Keep merged fixed discriminators in parentPolymorphicDiscriminators so JSON, constructors, and XML share one canonical representation. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 00e7fd30-d342-4b5a-ad7e-f16198c7dbde --- .../ClientModelPropertiesManager.java | 8 +- .../generator/core/mapper/ModelMapper.java | 30 ++-- .../core/template/ModelTemplate.java | 12 +- ...ldWithRequiredPropertyAsDiscriminator.java | 2 + .../GrandChildWithNestedDiscriminator.java | 139 ++++++++++++++++++ ...tGrandChildWithDuplicateDiscriminator.java | 114 ++++++++++++++ .../models/NestedDiscriminatorAssistant.java | 27 ++-- ...ptest-discriminatoredgecases_metadata.json | 2 +- .../tsp/discriminator-edge-cases.tsp | 15 ++ 9 files changed, 316 insertions(+), 33 deletions(-) create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java index 4f29e64c65e..948053d4ada 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java @@ -22,6 +22,7 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Manages metadata about properties in a {@link ClientModel} and how they correlate with model class generation. @@ -124,10 +125,11 @@ public ClientModelPropertiesManager(ClientModel model, JavaSettings settings) { xmlRootElementNamespace = model.getXmlNamespace(); } - Set thisModelPropertySerializeNames = model.getProperties() - .stream() + Set thisModelPropertySerializeNames = Stream.concat( // discriminator property is known to be redefined in subclass - .filter(property -> !property.isPolymorphicDiscriminator()) + model.getProperties().stream().filter(property -> !property.isPolymorphicDiscriminator()), + // Merged discriminators are removed from model properties but still mask same-named ancestor properties. + model.getParentPolymorphicDiscriminators().stream()) .map(ClientModelProperty::getSerializedName) .filter(name -> Objects.nonNull(name) && !name.isEmpty()) .collect(Collectors.toSet()); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java index 261bd1430f0..1031fb5b67c 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java @@ -363,6 +363,7 @@ public ClientModel map(ObjectSchema compositeType) { // the correct serialization in multi-level polymorphic structures. for (ClientModel derivedType : derivedTypes) { if (!Objects.equals(polymorphicDiscriminator, derivedType.getPolymorphicDiscriminatorName())) { + // The child hierarchy stays in one fixed parent discriminator branch. ClientModelProperty parentDiscriminator = result.getPolymorphicDiscriminator() .newBuilder() .defaultValue(result.getPolymorphicDiscriminator() @@ -384,7 +385,16 @@ public ClientModel map(ObjectSchema compositeType) { private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty parentDiscriminator, ClientModel child) { - for (ClientModelProperty childProperty : child.getProperties()) { + // Due to the execution order of ModelMapper, where children models complete mapping before the parent model, + // the parent polymorphic discriminator needs to be added at index 0. Reason, given an example where there are + // three models, where model #1 is the root parent with discriminator type, model #2 is a child of model #2 with + // discriminator kind, and model #3 is a child of model #3 with discriminator form. The order if this running + // will have model #2 add its discriminator to model #3 before model #1 runs adding its discriminator to #2 and + // #3. We want #3 to have the ordering of [type, kind], to represent the ordering of the parent models. + // Merge a matching child declaration to avoid emitting the inherited discriminator twice. + ClientModelProperty discriminatorForChild = parentDiscriminator; + for (int i = 0; i < child.getProperties().size(); i++) { + ClientModelProperty childProperty = child.getProperties().get(i); if (!Objects.equals(parentDiscriminator.getSerializedName(), childProperty.getSerializedName())) { continue; } @@ -401,17 +411,17 @@ private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty p + ")."); } - // The declared constant owns the fixed discriminator value for this entire branch. - return; + discriminatorForChild = childProperty.newBuilder() + .name(parentDiscriminator.getName()) + .readOnly(true) + .required(false) + .polymorphicDiscriminator(true) + .build(); + child.getProperties().remove(i); + break; } - // Due to the execution order of ModelMapper, where children models complete mapping before the parent model, - // the parent polymorphic discriminator needs to be added at index 0. Reason, given an example where there are - // three models, where model #1 is the root parent with discriminator type, model #2 is a child of model #2 with - // discriminator kind, and model #3 is a child of model #3 with discriminator form. The order if this running - // will have model #2 add its discriminator to model #3 before model #1 runs adding its discriminator to #2 and - // #3. We want #3 to have the ordering of [type, kind], to represent the ordering of the parent models. - child.getParentPolymorphicDiscriminators().add(0, parentDiscriminator); + child.getParentPolymorphicDiscriminators().add(0, discriminatorForChild); for (ClientModel derived : child.getDerivedModels()) { passPolymorphicDiscriminatorToChildren(parentDiscriminator, derived); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java index 69dac758321..59b1f2527f9 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java @@ -886,18 +886,18 @@ private void addModelConstructor(ClientModel model, ClientModelPropertiesManager * * we use the property in this model to initiate the superclass */ - ClientModelProperty propertyInThisModel = model.getProperties() - .stream() + ClientModelProperty overridingProperty = Stream + .concat(model.getProperties().stream(), model.getParentPolymorphicDiscriminators().stream()) .filter(p -> Objects.equals(p.getSerializedName(), property.getSerializedName())) .findFirst() .orElse(null); - if (propertyInThisModel != null) { - if (propertyInThisModel.isConstant() && !property.isConstant()) { + if (overridingProperty != null) { + if (overridingProperty.isConstant() && !property.isConstant()) { // property changed to constant in this model, use constant value to initiate super // class - superProperties.append(propertyInThisModel.getDefaultValue()); + superProperties.append(overridingProperty.getDefaultValue()); } else { - superProperties.append(propertyInThisModel.getName()); + superProperties.append(overridingProperty.getName()); } } else { // this should not happen diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java index e0b4fb1f882..da52b57562c 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java @@ -103,6 +103,8 @@ public static ChildWithRequiredPropertyAsDiscriminator fromJson(JsonReader jsonR // Use the discriminator value to determine which subtype should be deserialized. if ("aValue".equals(discriminatorValue)) { return GrandChildWithRequiredProperty.fromJson(readerToUse.reset()); + } else if ("nested".equals(discriminatorValue)) { + return GrandChildWithNestedDiscriminator.fromJson(readerToUse.reset()); } else { return fromJsonKnownDiscriminator(readerToUse.reset()); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java new file mode 100644 index 00000000000..c023265b5e6 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java @@ -0,0 +1,139 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The GrandChildWithNestedDiscriminator model. + */ +@Immutable +public class GrandChildWithNestedDiscriminator extends ChildWithRequiredPropertyAsDiscriminator { + /* + * Discriminator property for ChildWithRequiredPropertyAsDiscriminator. + */ + @Generated + private final String discriminator = "nested"; + + /* + * The nestedDiscriminator property. + */ + @Generated + private String nestedDiscriminator = "nested"; + + /** + * Creates an instance of GrandChildWithNestedDiscriminator class. + * + * @param aProperty the aProperty value to set. + * @param anotherProperty the anotherProperty value to set. + */ + @Generated + protected GrandChildWithNestedDiscriminator(String aProperty, String anotherProperty) { + super("nested", aProperty, anotherProperty); + } + + /** + * Get the discriminator property: Discriminator property for ChildWithRequiredPropertyAsDiscriminator. + * + * @return the discriminator value. + */ + @Generated + @Override + public String getDiscriminator() { + return this.discriminator; + } + + /** + * Get the nestedDiscriminator property: The nestedDiscriminator property. + * + * @return the nestedDiscriminator value. + */ + @Generated + public String getNestedDiscriminator() { + return this.nestedDiscriminator; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("discriminator", this.discriminator); + jsonWriter.writeStringField("aProperty", getAProperty()); + jsonWriter.writeStringField("anotherProperty", getAnotherProperty()); + jsonWriter.writeStringField("nestedDiscriminator", this.nestedDiscriminator); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of GrandChildWithNestedDiscriminator from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of GrandChildWithNestedDiscriminator if the JsonReader was pointing to an instance of it, or + * null if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the GrandChildWithNestedDiscriminator. + */ + @Generated + public static GrandChildWithNestedDiscriminator fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String discriminatorValue = null; + try (JsonReader readerToUse = reader.bufferObject()) { + readerToUse.nextToken(); // Prepare for reading + while (readerToUse.nextToken() != JsonToken.END_OBJECT) { + String fieldName = readerToUse.getFieldName(); + readerToUse.nextToken(); + if ("nestedDiscriminator".equals(fieldName)) { + discriminatorValue = readerToUse.getString(); + break; + } else { + readerToUse.skipChildren(); + } + } + // Use the discriminator value to determine which subtype should be deserialized. + if ("leaf".equals(discriminatorValue)) { + return GreatGrandChildWithDuplicateDiscriminator.fromJson(readerToUse.reset()); + } else { + return fromJsonKnownDiscriminator(readerToUse.reset()); + } + } + }); + } + + @Generated + static GrandChildWithNestedDiscriminator fromJsonKnownDiscriminator(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String aProperty = null; + String anotherProperty = null; + String nestedDiscriminator = "nested"; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + + if ("aProperty".equals(fieldName)) { + aProperty = reader.getString(); + } else if ("anotherProperty".equals(fieldName)) { + anotherProperty = reader.getString(); + } else if ("nestedDiscriminator".equals(fieldName)) { + nestedDiscriminator = reader.getString(); + } else { + reader.skipChildren(); + } + } + GrandChildWithNestedDiscriminator deserializedGrandChildWithNestedDiscriminator + = new GrandChildWithNestedDiscriminator(aProperty, anotherProperty); + deserializedGrandChildWithNestedDiscriminator.nestedDiscriminator = nestedDiscriminator; + + return deserializedGrandChildWithNestedDiscriminator; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java new file mode 100644 index 00000000000..fcf9aff8124 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java @@ -0,0 +1,114 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The GreatGrandChildWithDuplicateDiscriminator model. + */ +@Immutable +public final class GreatGrandChildWithDuplicateDiscriminator extends GrandChildWithNestedDiscriminator { + /* + * The discriminator property. + */ + @Generated + private final String discriminator = "nested"; + + /* + * The nestedDiscriminator property. + */ + @Generated + private String nestedDiscriminator = "leaf"; + + /** + * Creates an instance of GreatGrandChildWithDuplicateDiscriminator class. + * + * @param aProperty the aProperty value to set. + * @param anotherProperty the anotherProperty value to set. + */ + @Generated + private GreatGrandChildWithDuplicateDiscriminator(String aProperty, String anotherProperty) { + super(aProperty, anotherProperty); + } + + /** + * Get the discriminator property: The discriminator property. + * + * @return the discriminator value. + */ + @Generated + @Override + public String getDiscriminator() { + return this.discriminator; + } + + /** + * Get the nestedDiscriminator property: The nestedDiscriminator property. + * + * @return the nestedDiscriminator value. + */ + @Generated + @Override + public String getNestedDiscriminator() { + return this.nestedDiscriminator; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("discriminator", this.discriminator); + jsonWriter.writeStringField("aProperty", getAProperty()); + jsonWriter.writeStringField("anotherProperty", getAnotherProperty()); + jsonWriter.writeStringField("nestedDiscriminator", this.nestedDiscriminator); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of GreatGrandChildWithDuplicateDiscriminator from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of GreatGrandChildWithDuplicateDiscriminator if the JsonReader was pointing to an instance of + * it, or null if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the GreatGrandChildWithDuplicateDiscriminator. + */ + @Generated + public static GreatGrandChildWithDuplicateDiscriminator fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String aProperty = null; + String anotherProperty = null; + String nestedDiscriminator = "leaf"; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + + if ("aProperty".equals(fieldName)) { + aProperty = reader.getString(); + } else if ("anotherProperty".equals(fieldName)) { + anotherProperty = reader.getString(); + } else if ("nestedDiscriminator".equals(fieldName)) { + nestedDiscriminator = reader.getString(); + } else { + reader.skipChildren(); + } + } + GreatGrandChildWithDuplicateDiscriminator deserializedGreatGrandChildWithDuplicateDiscriminator + = new GreatGrandChildWithDuplicateDiscriminator(aProperty, anotherProperty); + deserializedGreatGrandChildWithDuplicateDiscriminator.nestedDiscriminator = nestedDiscriminator; + + return deserializedGreatGrandChildWithDuplicateDiscriminator; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java index 867660970a3..78ab5dba285 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java @@ -17,16 +17,16 @@ @Immutable public final class NestedDiscriminatorAssistant extends NestedDiscriminatorMessage { /* - * The role property. + * The type property. */ @Generated - private String role = "assistant"; + private final String type = "message"; /* - * The type property. + * The role property. */ @Generated - private final String type = "message"; + private String role = "assistant"; /** * Creates an instance of NestedDiscriminatorAssistant class. @@ -36,24 +36,25 @@ private NestedDiscriminatorAssistant() { } /** - * Get the role property: The role property. + * Get the type property: The type property. * - * @return the role value. + * @return the type value. */ @Generated @Override - public String getRole() { - return this.role; + public String getType() { + return this.type; } /** - * Get the type property: The type property. + * Get the role property: The role property. * - * @return the type value. + * @return the role value. */ @Generated - public String getType() { - return this.type; + @Override + public String getRole() { + return this.role; } @Generated @@ -68,8 +69,8 @@ public XmlWriter toXml(XmlWriter xmlWriter, String rootElementName) throws XMLSt rootElementName = rootElementName == null || rootElementName.isEmpty() ? "NestedDiscriminatorBase" : rootElementName; xmlWriter.writeStartElement(rootElementName); - xmlWriter.writeStringAttribute("role", this.role); xmlWriter.writeStringAttribute("type", this.type); + xmlWriter.writeStringAttribute("role", this.role); return xmlWriter.writeEndElement(); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json index f9ae503792f..4f0daf02fcc 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json @@ -1 +1 @@ -{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.DiscriminatorEdgeCases","crossLanguageVersion":"22754e1f7b5a","crossLanguageDefinitions":{"tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClientBuilder":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.models.ChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.ChildWithRequiredPropertyAsDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithRequiredPropertyAsDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.GrandChildWithRequiredProperty","tsptest.discriminatoredgecases.models.ModelWithDiscriminatorNoSubtypes":"TspTest.DiscriminatorEdgeCases.ModelWithDiscriminatorNoSubtypes","tsptest.discriminatoredgecases.models.NestedDiscriminatorAssistant":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorAssistant","tsptest.discriminatoredgecases.models.NestedDiscriminatorBase":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorBase","tsptest.discriminatoredgecases.models.NestedDiscriminatorMessage":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorMessage","tsptest.discriminatoredgecases.models.ParentWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.ParentWithRequiredProperty"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesAsyncClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClientBuilder.java","src/main/java/tsptest/discriminatoredgecases/implementation/DiscriminatorEdgeCasesClientImpl.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializer.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializerProviders.java","src/main/java/tsptest/discriminatoredgecases/implementation/package-info.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/ModelWithDiscriminatorNoSubtypes.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorBase.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorMessage.java","src/main/java/tsptest/discriminatoredgecases/models/ParentWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/package-info.java","src/main/java/tsptest/discriminatoredgecases/package-info.java"]} \ No newline at end of file +{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.DiscriminatorEdgeCases","crossLanguageVersion":"f7a3bf40b2af","crossLanguageDefinitions":{"tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClientBuilder":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.models.ChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.ChildWithRequiredPropertyAsDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithRequiredPropertyAsDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithNestedDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithNestedDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.GrandChildWithRequiredProperty","tsptest.discriminatoredgecases.models.GreatGrandChildWithDuplicateDiscriminator":"TspTest.DiscriminatorEdgeCases.GreatGrandChildWithDuplicateDiscriminator","tsptest.discriminatoredgecases.models.ModelWithDiscriminatorNoSubtypes":"TspTest.DiscriminatorEdgeCases.ModelWithDiscriminatorNoSubtypes","tsptest.discriminatoredgecases.models.NestedDiscriminatorAssistant":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorAssistant","tsptest.discriminatoredgecases.models.NestedDiscriminatorBase":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorBase","tsptest.discriminatoredgecases.models.NestedDiscriminatorMessage":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorMessage","tsptest.discriminatoredgecases.models.ParentWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.ParentWithRequiredProperty"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesAsyncClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClientBuilder.java","src/main/java/tsptest/discriminatoredgecases/implementation/DiscriminatorEdgeCasesClientImpl.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializer.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializerProviders.java","src/main/java/tsptest/discriminatoredgecases/implementation/package-info.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ModelWithDiscriminatorNoSubtypes.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorBase.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorMessage.java","src/main/java/tsptest/discriminatoredgecases/models/ParentWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/package-info.java","src/main/java/tsptest/discriminatoredgecases/package-info.java"]} \ No newline at end of file diff --git a/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp b/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp index 8e7dc92f040..ce8a79150f4 100644 --- a/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp +++ b/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp @@ -30,6 +30,21 @@ model GrandChildWithRequiredProperty extends ChildWithRequiredPropertyAsDiscrimi discriminator: "aValue"; } +@discriminator("nestedDiscriminator") +model GrandChildWithNestedDiscriminator extends ChildWithRequiredPropertyAsDiscriminator { + discriminator: "nested"; + + // Activates a nested hierarchy so the outer discriminator is propagated and masks the base property. + nestedDiscriminator: string; +} + +model GreatGrandChildWithDuplicateDiscriminator extends GrandChildWithNestedDiscriminator { + // Repeats the propagated outer discriminator to exercise duplicate merging. + discriminator: "nested"; + + nestedDiscriminator: "leaf"; +} + @usage(Usage.output) @access(Access.public) @name("NestedDiscriminatorBase") From da5ae998debdd99e7b31a77c4db86d9f94f0fb6a Mon Sep 17 00:00:00 2001 From: "Xiaofei Cao (from Dev Box)" Date: Mon, 7 Sep 2026 14:04:00 +0800 Subject: [PATCH 08/12] docs(http-client-java): clarify discriminator propagation Explain nested discriminator propagation with a concrete type and role example, including why matching child properties are removed from normal model properties. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e6933b7d-0cee-4855-a585-2e15b24c70c5 --- .../ClientModelPropertiesManager.java | 4 +++- .../generator/core/mapper/ModelMapper.java | 18 +++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java index 948053d4ada..2278c272192 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java @@ -128,7 +128,9 @@ public ClientModelPropertiesManager(ClientModel model, JavaSettings settings) { Set thisModelPropertySerializeNames = Stream.concat( // discriminator property is known to be redefined in subclass model.getProperties().stream().filter(property -> !property.isPolymorphicDiscriminator()), - // Merged discriminators are removed from model properties but still mask same-named ancestor properties. + // For example, after a child's fixed "type" property is removed from model.getProperties(), the fixed + // "type" entry in model.getParentPolymorphicDiscriminators() is included here so the inherited parent + // "type" property is masked. Otherwise, the generated child has two "type" members. model.getParentPolymorphicDiscriminators().stream()) .map(ClientModelProperty::getSerializedName) .filter(name -> Objects.nonNull(name) && !name.isEmpty()) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java index 1031fb5b67c..21d26276009 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java @@ -385,13 +385,15 @@ public ClientModel map(ObjectSchema compositeType) { private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty parentDiscriminator, ClientModel child) { - // Due to the execution order of ModelMapper, where children models complete mapping before the parent model, - // the parent polymorphic discriminator needs to be added at index 0. Reason, given an example where there are - // three models, where model #1 is the root parent with discriminator type, model #2 is a child of model #2 with - // discriminator kind, and model #3 is a child of model #3 with discriminator form. The order if this running - // will have model #2 add its discriminator to model #3 before model #1 runs adding its discriminator to #2 and - // #3. We want #3 to have the ordering of [type, kind], to represent the ordering of the parent models. - // Merge a matching child declaration to avoid emitting the inherited discriminator twice. + // A child that introduces a different discriminator still needs the fixed discriminator value selected by the + // parent hierarchy. For example, a parent may discriminate on "type", while a child fixes type="message" and + // discriminates its children on "role". The child branch must retain type="message" while dispatching by + // "role". + // + // If child.getProperties() contains a fixed property with the same serialized name and value as + // parentDiscriminator, use the matching property to build the parent discriminator entry. Then remove the + // matching property from child.getProperties() so the generated model does not contain "type" as both a normal + // property and a parent discriminator. ClientModelProperty discriminatorForChild = parentDiscriminator; for (int i = 0; i < child.getProperties().size(); i++) { ClientModelProperty childProperty = child.getProperties().get(i); @@ -421,6 +423,8 @@ private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty p break; } + // Children are mapped before their parents, so insert at index 0 to preserve outer-to-inner discriminator + // order. child.getParentPolymorphicDiscriminators().add(0, discriminatorForChild); for (ClientModel derived : child.getDerivedModels()) { From ac026a9d0d00f7fcf5c865a0a613da16b2943db4 Mon Sep 17 00:00:00 2001 From: "Xiaofei Cao (from Dev Box)" Date: Mon, 7 Sep 2026 18:44:04 +0800 Subject: [PATCH 09/12] test(http-client-java): document inherited discriminator regressions Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d4e8259f-d938-4448-9321-8eaf17f8b53d --- .../ClientModelPropertiesManager.java | 4 +- .../PolymorphicDiscriminatorHandler.java | 2 +- .../generator/core/mapper/ModelMapper.java | 46 +++--- .../core/template/ModelTemplate.java | 14 +- ...ldWithRequiredPropertyAsDiscriminator.java | 17 +-- .../GrandChildWithNestedDiscriminator.java | 139 ------------------ ...tGrandChildWithDuplicateDiscriminator.java | 114 -------------- ...estorOrdinaryPropertyMaskingAssistant.java | 99 +++++++++++++ ...onAncestorOrdinaryPropertyMaskingBase.java | 107 ++++++++++++++ ...ncestorOrdinaryPropertyMaskingMessage.java | 124 ++++++++++++++++ ...onAncestorOrdinaryPropertyMaskingRoot.java | 92 ++++++++++++ ...peatedInheritedDiscriminatorAssistant.java | 100 +++++++++++++ ...ateRepeatedInheritedDiscriminatorBase.java | 109 ++++++++++++++ ...RepeatedInheritedDiscriminatorMessage.java | 127 ++++++++++++++++ ...ssionStreamStyleJsonDispatchAssistant.java | 97 ++++++++++++ ...RegressionStreamStyleJsonDispatchBase.java | 106 +++++++++++++ ...ressionStreamStyleJsonDispatchMessage.java | 124 ++++++++++++++++ ...rclassConstructorPropagationAssistant.java | 99 +++++++++++++ ...nSuperclassConstructorPropagationBase.java | 113 ++++++++++++++ ...perclassConstructorPropagationMessage.java | 125 ++++++++++++++++ ...nSuperclassConstructorPropagationRoot.java | 83 +++++++++++ ...ptest-discriminatoredgecases_metadata.json | 2 +- .../DiscriminatorRegressionTests.java | 63 ++++++++ .../tsp/discriminator-edge-cases.tsp | 84 +++++++++-- 24 files changed, 1682 insertions(+), 308 deletions(-) delete mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java delete mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchAssistant.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchBase.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchMessage.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/discriminatoredgecases/DiscriminatorRegressionTests.java diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java index 2278c272192..5307da97b27 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java @@ -128,9 +128,7 @@ public ClientModelPropertiesManager(ClientModel model, JavaSettings settings) { Set thisModelPropertySerializeNames = Stream.concat( // discriminator property is known to be redefined in subclass model.getProperties().stream().filter(property -> !property.isPolymorphicDiscriminator()), - // For example, after a child's fixed "type" property is removed from model.getProperties(), the fixed - // "type" entry in model.getParentPolymorphicDiscriminators() is included here so the inherited parent - // "type" property is masked. Otherwise, the generated child has two "type" members. + // Canonicalized parent discriminators mask inherited ordinary properties with the same wire name. model.getParentPolymorphicDiscriminators().stream()) .map(ClientModelProperty::getSerializedName) .filter(name -> Objects.nonNull(name) && !name.isEmpty()) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java index 3be6e0e3102..55f39145ee7 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java @@ -117,7 +117,7 @@ private static void declareFieldInternal(ClientModelProperty discriminator, Clie && settings.isShareJsonSerializableCode()) { classBlock.memberVariable(JavaVisibility.PackagePrivate, fieldSignature); } else if (!allPolymorphicModelsInSamePackage || !settings.isShareJsonSerializableCode()) { - // Active discriminators stay mutable to preserve unknown values during fallback deserialization. + // Fixed inherited parent discriminators are final; active discriminators remain mutable for fallback. if (discriminator.isConstant() && !Objects.equals(discriminator.getSerializedName(), model.getPolymorphicDiscriminatorName())) { classBlock.privateFinalMemberVariable(fieldSignature); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java index 21d26276009..c73c48bfec7 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java @@ -355,15 +355,9 @@ public ClientModel map(ObjectSchema compositeType) { result = builder.build(); if (isPolymorphic && !CoreUtils.isNullOrEmpty(derivedTypes)) { - // Walk the polymorphic hierarchy finding places where the parent model and child model have different - // polymorphic discriminators. When this case is found add the parent polymorphic discriminator as a - // parent - // polymorphic discriminator to the child model. This is necessary to ensure that the child model - // generates - // the correct serialization in multi-level polymorphic structures. + // Preserve the fixed outer discriminator when a child starts a nested discriminator hierarchy. for (ClientModel derivedType : derivedTypes) { if (!Objects.equals(polymorphicDiscriminator, derivedType.getPolymorphicDiscriminatorName())) { - // The child hierarchy stays in one fixed parent discriminator branch. ClientModelProperty parentDiscriminator = result.getPolymorphicDiscriminator() .newBuilder() .defaultValue(result.getPolymorphicDiscriminator() @@ -383,17 +377,35 @@ public ClientModel map(ObjectSchema compositeType) { return result; } + /** + * Propagates a fixed discriminator from an outer hierarchy through a nested discriminator hierarchy. + *

+ * The {@code parentDiscriminator} is the fixed outer selection, while {@code child}'s discriminator remains the + * active discriminator for its own descendants. For example, given an outer {@code type} discriminator, a + * {@code type="message"} child that introduces {@code role}, and a {@code role="assistant"} grandchild, both nested + * models retain the canonical {@code type="message"} value while {@code role} controls nested dispatch. + *

+ * A child can also declare an ordinary fixed property with the same wire name as the propagated discriminator. + * Keeping both representations would generate duplicate fields and accessors. Such a property must be constant and + * have the same wire type, client type, and fixed value as {@code parentDiscriminator}; otherwise mapping fails. + * A valid property becomes the canonical entry in {@link ClientModel#getParentPolymorphicDiscriminators()}, with + * discriminator metadata applied, and is removed from {@link ClientModel#getProperties()}. When no same-wire-name + * child property exists, {@code parentDiscriminator} itself remains the canonical parent entry. + *

+ * Parent models map after their children, so the canonical entry is inserted at index zero to retain + * outer-to-inner discriminator order. The fixed discriminator is then recursively propagated to every descendant. + * For current stream-style JSON, same-package hierarchies may serialize this metadata through shared + * {@code toJsonShared} code. When hierarchy models are in different packages, or sharing is disabled, each model + * serializes inherited discriminator metadata through {@code serializeParentJsonProperties}, which consumes + * {@link ClientModel#getParentPolymorphicDiscriminators()}. + * + * @param parentDiscriminator the fixed discriminator selected by the outer hierarchy + * @param child the nested-hierarchy model that receives the fixed discriminator + * @throws IllegalStateException if the child declares the same wire name without matching constant status, wire + * type, client type, and fixed value + */ private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty parentDiscriminator, ClientModel child) { - // A child that introduces a different discriminator still needs the fixed discriminator value selected by the - // parent hierarchy. For example, a parent may discriminate on "type", while a child fixes type="message" and - // discriminates its children on "role". The child branch must retain type="message" while dispatching by - // "role". - // - // If child.getProperties() contains a fixed property with the same serialized name and value as - // parentDiscriminator, use the matching property to build the parent discriminator entry. Then remove the - // matching property from child.getProperties() so the generated model does not contain "type" as both a normal - // property and a parent discriminator. ClientModelProperty discriminatorForChild = parentDiscriminator; for (int i = 0; i < child.getProperties().size(); i++) { ClientModelProperty childProperty = child.getProperties().get(i); @@ -423,8 +435,6 @@ private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty p break; } - // Children are mapped before their parents, so insert at index 0 to preserve outer-to-inner discriminator - // order. child.getParentPolymorphicDiscriminators().add(0, discriminatorForChild); for (ClientModel derived : child.getDerivedModels()) { diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java index 59b1f2527f9..8b1adca0843 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java @@ -873,19 +873,7 @@ private void addModelConstructor(ClientModel model, ClientModelPropertiesManager superProperties.append(property.getName()); } else { - /* - * here because the property in superclass constructor is overwritten in this model - * one example is - * - * model ParentModel { - * property: string; - * } - * model Model extends ParentModel { - * property: "constant"; - * } - * - * we use the property in this model to initiate the superclass - */ + // Canonicalized discriminators can supply a fixed inherited constructor argument. ClientModelProperty overridingProperty = Stream .concat(model.getProperties().stream(), model.getParentPolymorphicDiscriminators().stream()) .filter(p -> Objects.equals(p.getSerializedName(), property.getSerializedName())) diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java index da52b57562c..17211800ec8 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -16,6 +15,7 @@ */ @Immutable public class ChildWithRequiredPropertyAsDiscriminator extends ParentWithRequiredProperty { + /* * Discriminator property for ChildWithRequiredPropertyAsDiscriminator. */ @@ -30,7 +30,7 @@ public class ChildWithRequiredPropertyAsDiscriminator extends ParentWithRequired /** * Creates an instance of ChildWithRequiredPropertyAsDiscriminator class. - * + * * @param discriminator the discriminator value to set. * @param aProperty the aProperty value to set. * @param anotherProperty the anotherProperty value to set. @@ -43,7 +43,7 @@ protected ChildWithRequiredPropertyAsDiscriminator(String discriminator, String /** * Get the discriminator property: Discriminator property for ChildWithRequiredPropertyAsDiscriminator. - * + * * @return the discriminator value. */ @Generated @@ -54,7 +54,7 @@ public String getDiscriminator() { /** * Get the anotherProperty property: The anotherProperty property. - * + * * @return the anotherProperty value. */ @Generated @@ -77,7 +77,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of ChildWithRequiredPropertyAsDiscriminator from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of ChildWithRequiredPropertyAsDiscriminator if the JsonReader was pointing to an instance of * it, or null if it was pointing to JSON null. @@ -89,7 +89,8 @@ public static ChildWithRequiredPropertyAsDiscriminator fromJson(JsonReader jsonR return jsonReader.readObject(reader -> { String discriminatorValue = null; try (JsonReader readerToUse = reader.bufferObject()) { - readerToUse.nextToken(); // Prepare for reading + // Prepare for reading + readerToUse.nextToken(); while (readerToUse.nextToken() != JsonToken.END_OBJECT) { String fieldName = readerToUse.getFieldName(); readerToUse.nextToken(); @@ -103,8 +104,6 @@ public static ChildWithRequiredPropertyAsDiscriminator fromJson(JsonReader jsonR // Use the discriminator value to determine which subtype should be deserialized. if ("aValue".equals(discriminatorValue)) { return GrandChildWithRequiredProperty.fromJson(readerToUse.reset()); - } else if ("nested".equals(discriminatorValue)) { - return GrandChildWithNestedDiscriminator.fromJson(readerToUse.reset()); } else { return fromJsonKnownDiscriminator(readerToUse.reset()); } @@ -122,7 +121,6 @@ static ChildWithRequiredPropertyAsDiscriminator fromJsonKnownDiscriminator(JsonR while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); - if ("aProperty".equals(fieldName)) { aProperty = reader.getString(); } else if ("anotherProperty".equals(fieldName)) { @@ -136,7 +134,6 @@ static ChildWithRequiredPropertyAsDiscriminator fromJsonKnownDiscriminator(JsonR ChildWithRequiredPropertyAsDiscriminator deserializedChildWithRequiredPropertyAsDiscriminator = new ChildWithRequiredPropertyAsDiscriminator(discriminator, aProperty, anotherProperty); deserializedChildWithRequiredPropertyAsDiscriminator.discriminator = discriminator; - return deserializedChildWithRequiredPropertyAsDiscriminator; }); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java deleted file mode 100644 index c023265b5e6..00000000000 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. - -package tsptest.discriminatoredgecases.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.azure.json.JsonReader; -import com.azure.json.JsonToken; -import com.azure.json.JsonWriter; -import java.io.IOException; - -/** - * The GrandChildWithNestedDiscriminator model. - */ -@Immutable -public class GrandChildWithNestedDiscriminator extends ChildWithRequiredPropertyAsDiscriminator { - /* - * Discriminator property for ChildWithRequiredPropertyAsDiscriminator. - */ - @Generated - private final String discriminator = "nested"; - - /* - * The nestedDiscriminator property. - */ - @Generated - private String nestedDiscriminator = "nested"; - - /** - * Creates an instance of GrandChildWithNestedDiscriminator class. - * - * @param aProperty the aProperty value to set. - * @param anotherProperty the anotherProperty value to set. - */ - @Generated - protected GrandChildWithNestedDiscriminator(String aProperty, String anotherProperty) { - super("nested", aProperty, anotherProperty); - } - - /** - * Get the discriminator property: Discriminator property for ChildWithRequiredPropertyAsDiscriminator. - * - * @return the discriminator value. - */ - @Generated - @Override - public String getDiscriminator() { - return this.discriminator; - } - - /** - * Get the nestedDiscriminator property: The nestedDiscriminator property. - * - * @return the nestedDiscriminator value. - */ - @Generated - public String getNestedDiscriminator() { - return this.nestedDiscriminator; - } - - /** - * {@inheritDoc} - */ - @Generated - @Override - public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { - jsonWriter.writeStartObject(); - jsonWriter.writeStringField("discriminator", this.discriminator); - jsonWriter.writeStringField("aProperty", getAProperty()); - jsonWriter.writeStringField("anotherProperty", getAnotherProperty()); - jsonWriter.writeStringField("nestedDiscriminator", this.nestedDiscriminator); - return jsonWriter.writeEndObject(); - } - - /** - * Reads an instance of GrandChildWithNestedDiscriminator from the JsonReader. - * - * @param jsonReader The JsonReader being read. - * @return An instance of GrandChildWithNestedDiscriminator if the JsonReader was pointing to an instance of it, or - * null if it was pointing to JSON null. - * @throws IllegalStateException If the deserialized JSON object was missing any required properties. - * @throws IOException If an error occurs while reading the GrandChildWithNestedDiscriminator. - */ - @Generated - public static GrandChildWithNestedDiscriminator fromJson(JsonReader jsonReader) throws IOException { - return jsonReader.readObject(reader -> { - String discriminatorValue = null; - try (JsonReader readerToUse = reader.bufferObject()) { - readerToUse.nextToken(); // Prepare for reading - while (readerToUse.nextToken() != JsonToken.END_OBJECT) { - String fieldName = readerToUse.getFieldName(); - readerToUse.nextToken(); - if ("nestedDiscriminator".equals(fieldName)) { - discriminatorValue = readerToUse.getString(); - break; - } else { - readerToUse.skipChildren(); - } - } - // Use the discriminator value to determine which subtype should be deserialized. - if ("leaf".equals(discriminatorValue)) { - return GreatGrandChildWithDuplicateDiscriminator.fromJson(readerToUse.reset()); - } else { - return fromJsonKnownDiscriminator(readerToUse.reset()); - } - } - }); - } - - @Generated - static GrandChildWithNestedDiscriminator fromJsonKnownDiscriminator(JsonReader jsonReader) throws IOException { - return jsonReader.readObject(reader -> { - String aProperty = null; - String anotherProperty = null; - String nestedDiscriminator = "nested"; - while (reader.nextToken() != JsonToken.END_OBJECT) { - String fieldName = reader.getFieldName(); - reader.nextToken(); - - if ("aProperty".equals(fieldName)) { - aProperty = reader.getString(); - } else if ("anotherProperty".equals(fieldName)) { - anotherProperty = reader.getString(); - } else if ("nestedDiscriminator".equals(fieldName)) { - nestedDiscriminator = reader.getString(); - } else { - reader.skipChildren(); - } - } - GrandChildWithNestedDiscriminator deserializedGrandChildWithNestedDiscriminator - = new GrandChildWithNestedDiscriminator(aProperty, anotherProperty); - deserializedGrandChildWithNestedDiscriminator.nestedDiscriminator = nestedDiscriminator; - - return deserializedGrandChildWithNestedDiscriminator; - }); - } -} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java deleted file mode 100644 index fcf9aff8124..00000000000 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. - -package tsptest.discriminatoredgecases.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.azure.json.JsonReader; -import com.azure.json.JsonToken; -import com.azure.json.JsonWriter; -import java.io.IOException; - -/** - * The GreatGrandChildWithDuplicateDiscriminator model. - */ -@Immutable -public final class GreatGrandChildWithDuplicateDiscriminator extends GrandChildWithNestedDiscriminator { - /* - * The discriminator property. - */ - @Generated - private final String discriminator = "nested"; - - /* - * The nestedDiscriminator property. - */ - @Generated - private String nestedDiscriminator = "leaf"; - - /** - * Creates an instance of GreatGrandChildWithDuplicateDiscriminator class. - * - * @param aProperty the aProperty value to set. - * @param anotherProperty the anotherProperty value to set. - */ - @Generated - private GreatGrandChildWithDuplicateDiscriminator(String aProperty, String anotherProperty) { - super(aProperty, anotherProperty); - } - - /** - * Get the discriminator property: The discriminator property. - * - * @return the discriminator value. - */ - @Generated - @Override - public String getDiscriminator() { - return this.discriminator; - } - - /** - * Get the nestedDiscriminator property: The nestedDiscriminator property. - * - * @return the nestedDiscriminator value. - */ - @Generated - @Override - public String getNestedDiscriminator() { - return this.nestedDiscriminator; - } - - /** - * {@inheritDoc} - */ - @Generated - @Override - public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { - jsonWriter.writeStartObject(); - jsonWriter.writeStringField("discriminator", this.discriminator); - jsonWriter.writeStringField("aProperty", getAProperty()); - jsonWriter.writeStringField("anotherProperty", getAnotherProperty()); - jsonWriter.writeStringField("nestedDiscriminator", this.nestedDiscriminator); - return jsonWriter.writeEndObject(); - } - - /** - * Reads an instance of GreatGrandChildWithDuplicateDiscriminator from the JsonReader. - * - * @param jsonReader The JsonReader being read. - * @return An instance of GreatGrandChildWithDuplicateDiscriminator if the JsonReader was pointing to an instance of - * it, or null if it was pointing to JSON null. - * @throws IllegalStateException If the deserialized JSON object was missing any required properties. - * @throws IOException If an error occurs while reading the GreatGrandChildWithDuplicateDiscriminator. - */ - @Generated - public static GreatGrandChildWithDuplicateDiscriminator fromJson(JsonReader jsonReader) throws IOException { - return jsonReader.readObject(reader -> { - String aProperty = null; - String anotherProperty = null; - String nestedDiscriminator = "leaf"; - while (reader.nextToken() != JsonToken.END_OBJECT) { - String fieldName = reader.getFieldName(); - reader.nextToken(); - - if ("aProperty".equals(fieldName)) { - aProperty = reader.getString(); - } else if ("anotherProperty".equals(fieldName)) { - anotherProperty = reader.getString(); - } else if ("nestedDiscriminator".equals(fieldName)) { - nestedDiscriminator = reader.getString(); - } else { - reader.skipChildren(); - } - } - GreatGrandChildWithDuplicateDiscriminator deserializedGreatGrandChildWithDuplicateDiscriminator - = new GreatGrandChildWithDuplicateDiscriminator(aProperty, anotherProperty); - deserializedGreatGrandChildWithDuplicateDiscriminator.nestedDiscriminator = nestedDiscriminator; - - return deserializedGreatGrandChildWithDuplicateDiscriminator; - }); - } -} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java new file mode 100644 index 00000000000..ef84d9981cf --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java @@ -0,0 +1,99 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionAncestorOrdinaryPropertyMaskingAssistant model. + */ +@Immutable +public final class RegressionAncestorOrdinaryPropertyMaskingAssistant + extends RegressionAncestorOrdinaryPropertyMaskingMessage { + + /* + * Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. + */ + @Generated + private final String type = "message"; + + /* + * The role property. + */ + @Generated + private String role = "assistant"; + + /** + * Creates an instance of RegressionAncestorOrdinaryPropertyMaskingAssistant class. + */ + @Generated + private RegressionAncestorOrdinaryPropertyMaskingAssistant() { + } + + /** + * Get the type property: Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. + * + * @return the type value. + */ + @Generated + @Override + public String getType() { + return this.type; + } + + /** + * Get the role property: The role property. + * + * @return the role value. + */ + @Generated + @Override + public String getRole() { + return this.role; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + jsonWriter.writeStringField("role", this.role); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionAncestorOrdinaryPropertyMaskingAssistant from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionAncestorOrdinaryPropertyMaskingAssistant if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the RegressionAncestorOrdinaryPropertyMaskingAssistant. + */ + @Generated + public static RegressionAncestorOrdinaryPropertyMaskingAssistant fromJson(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + RegressionAncestorOrdinaryPropertyMaskingAssistant deserializedRegressionAncestorOrdinaryPropertyMaskingAssistant + = new RegressionAncestorOrdinaryPropertyMaskingAssistant(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("role".equals(fieldName)) { + deserializedRegressionAncestorOrdinaryPropertyMaskingAssistant.role = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionAncestorOrdinaryPropertyMaskingAssistant; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java new file mode 100644 index 00000000000..b40fcced80d --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java @@ -0,0 +1,107 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionAncestorOrdinaryPropertyMaskingBase model. + */ +@Immutable +public class RegressionAncestorOrdinaryPropertyMaskingBase extends RegressionAncestorOrdinaryPropertyMaskingRoot { + + /* + * Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. + */ + @Generated + private String type = "RegressionAncestorOrdinaryPropertyMaskingBase"; + + /** + * Creates an instance of RegressionAncestorOrdinaryPropertyMaskingBase class. + */ + @Generated + protected RegressionAncestorOrdinaryPropertyMaskingBase() { + } + + /** + * Get the type property: Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. + * + * @return the type value. + */ + @Generated + @Override + public String getType() { + return this.type; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionAncestorOrdinaryPropertyMaskingBase from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionAncestorOrdinaryPropertyMaskingBase if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the RegressionAncestorOrdinaryPropertyMaskingBase. + */ + @Generated + public static RegressionAncestorOrdinaryPropertyMaskingBase fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String discriminatorValue = null; + try (JsonReader readerToUse = reader.bufferObject()) { + // Prepare for reading + readerToUse.nextToken(); + while (readerToUse.nextToken() != JsonToken.END_OBJECT) { + String fieldName = readerToUse.getFieldName(); + readerToUse.nextToken(); + if ("type".equals(fieldName)) { + discriminatorValue = readerToUse.getString(); + break; + } else { + readerToUse.skipChildren(); + } + } + // Use the discriminator value to determine which subtype should be deserialized. + if ("message".equals(discriminatorValue)) { + return RegressionAncestorOrdinaryPropertyMaskingMessage.fromJson(readerToUse.reset()); + } else { + return fromJsonKnownDiscriminator(readerToUse.reset()); + } + } + }); + } + + @Generated + static RegressionAncestorOrdinaryPropertyMaskingBase fromJsonKnownDiscriminator(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + RegressionAncestorOrdinaryPropertyMaskingBase deserializedRegressionAncestorOrdinaryPropertyMaskingBase + = new RegressionAncestorOrdinaryPropertyMaskingBase(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("type".equals(fieldName)) { + deserializedRegressionAncestorOrdinaryPropertyMaskingBase.type = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionAncestorOrdinaryPropertyMaskingBase; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.java new file mode 100644 index 00000000000..e25c50daa60 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.java @@ -0,0 +1,124 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionAncestorOrdinaryPropertyMaskingMessage model. + */ +@Immutable +public class RegressionAncestorOrdinaryPropertyMaskingMessage extends RegressionAncestorOrdinaryPropertyMaskingBase { + + /* + * Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. + */ + @Generated + private final String type = "message"; + + /* + * The role property. + */ + @Generated + private String role = "message"; + + /** + * Creates an instance of RegressionAncestorOrdinaryPropertyMaskingMessage class. + */ + @Generated + protected RegressionAncestorOrdinaryPropertyMaskingMessage() { + } + + /** + * Get the type property: Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. + * + * @return the type value. + */ + @Generated + @Override + public String getType() { + return this.type; + } + + /** + * Get the role property: The role property. + * + * @return the role value. + */ + @Generated + public String getRole() { + return this.role; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + jsonWriter.writeStringField("role", this.role); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionAncestorOrdinaryPropertyMaskingMessage from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionAncestorOrdinaryPropertyMaskingMessage if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the RegressionAncestorOrdinaryPropertyMaskingMessage. + */ + @Generated + public static RegressionAncestorOrdinaryPropertyMaskingMessage fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String discriminatorValue = null; + try (JsonReader readerToUse = reader.bufferObject()) { + // Prepare for reading + readerToUse.nextToken(); + while (readerToUse.nextToken() != JsonToken.END_OBJECT) { + String fieldName = readerToUse.getFieldName(); + readerToUse.nextToken(); + if ("role".equals(fieldName)) { + discriminatorValue = readerToUse.getString(); + break; + } else { + readerToUse.skipChildren(); + } + } + // Use the discriminator value to determine which subtype should be deserialized. + if ("assistant".equals(discriminatorValue)) { + return RegressionAncestorOrdinaryPropertyMaskingAssistant.fromJson(readerToUse.reset()); + } else { + return fromJsonKnownDiscriminator(readerToUse.reset()); + } + } + }); + } + + @Generated + static RegressionAncestorOrdinaryPropertyMaskingMessage fromJsonKnownDiscriminator(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + RegressionAncestorOrdinaryPropertyMaskingMessage deserializedRegressionAncestorOrdinaryPropertyMaskingMessage + = new RegressionAncestorOrdinaryPropertyMaskingMessage(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("role".equals(fieldName)) { + deserializedRegressionAncestorOrdinaryPropertyMaskingMessage.role = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionAncestorOrdinaryPropertyMaskingMessage; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java new file mode 100644 index 00000000000..8447d87c689 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java @@ -0,0 +1,92 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionAncestorOrdinaryPropertyMaskingRoot model. + */ +@Immutable +public class RegressionAncestorOrdinaryPropertyMaskingRoot + implements JsonSerializable { + + /* + * The type property. + */ + @Generated + private String type; + + /** + * Creates an instance of RegressionAncestorOrdinaryPropertyMaskingRoot class. + */ + @Generated + protected RegressionAncestorOrdinaryPropertyMaskingRoot() { + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + public String getType() { + return this.type; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionAncestorOrdinaryPropertyMaskingRoot from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionAncestorOrdinaryPropertyMaskingRoot if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the RegressionAncestorOrdinaryPropertyMaskingRoot. + */ + @Generated + public static RegressionAncestorOrdinaryPropertyMaskingRoot fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + RegressionAncestorOrdinaryPropertyMaskingRoot deserializedRegressionAncestorOrdinaryPropertyMaskingRoot + = new RegressionAncestorOrdinaryPropertyMaskingRoot(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("type".equals(fieldName)) { + deserializedRegressionAncestorOrdinaryPropertyMaskingRoot.type = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionAncestorOrdinaryPropertyMaskingRoot; + }); + } + + /** + * Set the type property: The type property. + * + * @param type the type value to set. + * @return the RegressionAncestorOrdinaryPropertyMaskingRoot object itself. + */ + @Generated + RegressionAncestorOrdinaryPropertyMaskingRoot setType(String type) { + this.type = type; + return this; + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java new file mode 100644 index 00000000000..cf130d13e3f --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java @@ -0,0 +1,100 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionDuplicateRepeatedInheritedDiscriminatorAssistant model. + */ +@Immutable +public final class RegressionDuplicateRepeatedInheritedDiscriminatorAssistant + extends RegressionDuplicateRepeatedInheritedDiscriminatorMessage { + + /* + * The type property. + */ + @Generated + private final String type = "message"; + + /* + * The role property. + */ + @Generated + private String role = "assistant"; + + /** + * Creates an instance of RegressionDuplicateRepeatedInheritedDiscriminatorAssistant class. + */ + @Generated + private RegressionDuplicateRepeatedInheritedDiscriminatorAssistant() { + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + @Override + public String getType() { + return this.type; + } + + /** + * Get the role property: The role property. + * + * @return the role value. + */ + @Generated + @Override + public String getRole() { + return this.role; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + jsonWriter.writeStringField("role", this.role); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionDuplicateRepeatedInheritedDiscriminatorAssistant from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionDuplicateRepeatedInheritedDiscriminatorAssistant if the JsonReader was pointing + * to an instance of it, or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the + * RegressionDuplicateRepeatedInheritedDiscriminatorAssistant. + */ + @Generated + public static RegressionDuplicateRepeatedInheritedDiscriminatorAssistant fromJson(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + RegressionDuplicateRepeatedInheritedDiscriminatorAssistant deserializedRegressionDuplicateRepeatedInheritedDiscriminatorAssistant + = new RegressionDuplicateRepeatedInheritedDiscriminatorAssistant(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("role".equals(fieldName)) { + deserializedRegressionDuplicateRepeatedInheritedDiscriminatorAssistant.role = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionDuplicateRepeatedInheritedDiscriminatorAssistant; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java new file mode 100644 index 00000000000..4186bb63473 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java @@ -0,0 +1,109 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionDuplicateRepeatedInheritedDiscriminatorBase model. + */ +@Immutable +public class RegressionDuplicateRepeatedInheritedDiscriminatorBase + implements JsonSerializable { + + /* + * The type property. + */ + @Generated + private String type = "RegressionDuplicateRepeatedInheritedDiscriminatorBase"; + + /** + * Creates an instance of RegressionDuplicateRepeatedInheritedDiscriminatorBase class. + */ + @Generated + protected RegressionDuplicateRepeatedInheritedDiscriminatorBase() { + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + public String getType() { + return this.type; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionDuplicateRepeatedInheritedDiscriminatorBase from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionDuplicateRepeatedInheritedDiscriminatorBase if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the RegressionDuplicateRepeatedInheritedDiscriminatorBase. + */ + @Generated + public static RegressionDuplicateRepeatedInheritedDiscriminatorBase fromJson(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + String discriminatorValue = null; + try (JsonReader readerToUse = reader.bufferObject()) { + // Prepare for reading + readerToUse.nextToken(); + while (readerToUse.nextToken() != JsonToken.END_OBJECT) { + String fieldName = readerToUse.getFieldName(); + readerToUse.nextToken(); + if ("type".equals(fieldName)) { + discriminatorValue = readerToUse.getString(); + break; + } else { + readerToUse.skipChildren(); + } + } + // Use the discriminator value to determine which subtype should be deserialized. + if ("message".equals(discriminatorValue)) { + return RegressionDuplicateRepeatedInheritedDiscriminatorMessage.fromJson(readerToUse.reset()); + } else { + return fromJsonKnownDiscriminator(readerToUse.reset()); + } + } + }); + } + + @Generated + static RegressionDuplicateRepeatedInheritedDiscriminatorBase fromJsonKnownDiscriminator(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + RegressionDuplicateRepeatedInheritedDiscriminatorBase deserializedRegressionDuplicateRepeatedInheritedDiscriminatorBase + = new RegressionDuplicateRepeatedInheritedDiscriminatorBase(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("type".equals(fieldName)) { + deserializedRegressionDuplicateRepeatedInheritedDiscriminatorBase.type = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionDuplicateRepeatedInheritedDiscriminatorBase; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java new file mode 100644 index 00000000000..4f15bb45a25 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java @@ -0,0 +1,127 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionDuplicateRepeatedInheritedDiscriminatorMessage model. + */ +@Immutable +public class RegressionDuplicateRepeatedInheritedDiscriminatorMessage + extends RegressionDuplicateRepeatedInheritedDiscriminatorBase { + + /* + * The type property. + */ + @Generated + private final String type = "message"; + + /* + * The role property. + */ + @Generated + private String role = "message"; + + /** + * Creates an instance of RegressionDuplicateRepeatedInheritedDiscriminatorMessage class. + */ + @Generated + protected RegressionDuplicateRepeatedInheritedDiscriminatorMessage() { + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + @Override + public String getType() { + return this.type; + } + + /** + * Get the role property: The role property. + * + * @return the role value. + */ + @Generated + public String getRole() { + return this.role; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + jsonWriter.writeStringField("role", this.role); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionDuplicateRepeatedInheritedDiscriminatorMessage from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionDuplicateRepeatedInheritedDiscriminatorMessage if the JsonReader was pointing to + * an instance of it, or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the + * RegressionDuplicateRepeatedInheritedDiscriminatorMessage. + */ + @Generated + public static RegressionDuplicateRepeatedInheritedDiscriminatorMessage fromJson(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + String discriminatorValue = null; + try (JsonReader readerToUse = reader.bufferObject()) { + // Prepare for reading + readerToUse.nextToken(); + while (readerToUse.nextToken() != JsonToken.END_OBJECT) { + String fieldName = readerToUse.getFieldName(); + readerToUse.nextToken(); + if ("role".equals(fieldName)) { + discriminatorValue = readerToUse.getString(); + break; + } else { + readerToUse.skipChildren(); + } + } + // Use the discriminator value to determine which subtype should be deserialized. + if ("assistant".equals(discriminatorValue)) { + return RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.fromJson(readerToUse.reset()); + } else { + return fromJsonKnownDiscriminator(readerToUse.reset()); + } + } + }); + } + + @Generated + static RegressionDuplicateRepeatedInheritedDiscriminatorMessage fromJsonKnownDiscriminator(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + RegressionDuplicateRepeatedInheritedDiscriminatorMessage deserializedRegressionDuplicateRepeatedInheritedDiscriminatorMessage + = new RegressionDuplicateRepeatedInheritedDiscriminatorMessage(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("role".equals(fieldName)) { + deserializedRegressionDuplicateRepeatedInheritedDiscriminatorMessage.role = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionDuplicateRepeatedInheritedDiscriminatorMessage; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchAssistant.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchAssistant.java new file mode 100644 index 00000000000..cfa2e38756a --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchAssistant.java @@ -0,0 +1,97 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionStreamStyleJsonDispatchAssistant model. + */ +@Immutable +public final class RegressionStreamStyleJsonDispatchAssistant extends RegressionStreamStyleJsonDispatchMessage { + + /* + * The type property. + */ + @Generated + private final String type = "message"; + + /* + * The role property. + */ + @Generated + private String role = "assistant"; + + /** + * Creates an instance of RegressionStreamStyleJsonDispatchAssistant class. + */ + @Generated + private RegressionStreamStyleJsonDispatchAssistant() { + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + @Override + public String getType() { + return this.type; + } + + /** + * Get the role property: The role property. + * + * @return the role value. + */ + @Generated + @Override + public String getRole() { + return this.role; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + jsonWriter.writeStringField("role", this.role); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionStreamStyleJsonDispatchAssistant from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionStreamStyleJsonDispatchAssistant if the JsonReader was pointing to an instance + * of it, or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the RegressionStreamStyleJsonDispatchAssistant. + */ + @Generated + public static RegressionStreamStyleJsonDispatchAssistant fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + RegressionStreamStyleJsonDispatchAssistant deserializedRegressionStreamStyleJsonDispatchAssistant + = new RegressionStreamStyleJsonDispatchAssistant(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("role".equals(fieldName)) { + deserializedRegressionStreamStyleJsonDispatchAssistant.role = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionStreamStyleJsonDispatchAssistant; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchBase.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchBase.java new file mode 100644 index 00000000000..dfc12d50a9b --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchBase.java @@ -0,0 +1,106 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionStreamStyleJsonDispatchBase model. + */ +@Immutable +public class RegressionStreamStyleJsonDispatchBase implements JsonSerializable { + + /* + * The type property. + */ + @Generated + private String type = "RegressionStreamStyleJsonDispatchBase"; + + /** + * Creates an instance of RegressionStreamStyleJsonDispatchBase class. + */ + @Generated + protected RegressionStreamStyleJsonDispatchBase() { + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + public String getType() { + return this.type; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionStreamStyleJsonDispatchBase from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionStreamStyleJsonDispatchBase if the JsonReader was pointing to an instance of it, + * or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the RegressionStreamStyleJsonDispatchBase. + */ + @Generated + public static RegressionStreamStyleJsonDispatchBase fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String discriminatorValue = null; + try (JsonReader readerToUse = reader.bufferObject()) { + // Prepare for reading + readerToUse.nextToken(); + while (readerToUse.nextToken() != JsonToken.END_OBJECT) { + String fieldName = readerToUse.getFieldName(); + readerToUse.nextToken(); + if ("type".equals(fieldName)) { + discriminatorValue = readerToUse.getString(); + break; + } else { + readerToUse.skipChildren(); + } + } + // Use the discriminator value to determine which subtype should be deserialized. + if ("message".equals(discriminatorValue)) { + return RegressionStreamStyleJsonDispatchMessage.fromJson(readerToUse.reset()); + } else { + return fromJsonKnownDiscriminator(readerToUse.reset()); + } + } + }); + } + + @Generated + static RegressionStreamStyleJsonDispatchBase fromJsonKnownDiscriminator(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + RegressionStreamStyleJsonDispatchBase deserializedRegressionStreamStyleJsonDispatchBase + = new RegressionStreamStyleJsonDispatchBase(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("type".equals(fieldName)) { + deserializedRegressionStreamStyleJsonDispatchBase.type = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionStreamStyleJsonDispatchBase; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchMessage.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchMessage.java new file mode 100644 index 00000000000..67e9bbae268 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchMessage.java @@ -0,0 +1,124 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionStreamStyleJsonDispatchMessage model. + */ +@Immutable +public class RegressionStreamStyleJsonDispatchMessage extends RegressionStreamStyleJsonDispatchBase { + + /* + * The type property. + */ + @Generated + private final String type = "message"; + + /* + * The role property. + */ + @Generated + private String role = "message"; + + /** + * Creates an instance of RegressionStreamStyleJsonDispatchMessage class. + */ + @Generated + protected RegressionStreamStyleJsonDispatchMessage() { + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + @Override + public String getType() { + return this.type; + } + + /** + * Get the role property: The role property. + * + * @return the role value. + */ + @Generated + public String getRole() { + return this.role; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + jsonWriter.writeStringField("role", this.role); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionStreamStyleJsonDispatchMessage from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionStreamStyleJsonDispatchMessage if the JsonReader was pointing to an instance of + * it, or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the RegressionStreamStyleJsonDispatchMessage. + */ + @Generated + public static RegressionStreamStyleJsonDispatchMessage fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String discriminatorValue = null; + try (JsonReader readerToUse = reader.bufferObject()) { + // Prepare for reading + readerToUse.nextToken(); + while (readerToUse.nextToken() != JsonToken.END_OBJECT) { + String fieldName = readerToUse.getFieldName(); + readerToUse.nextToken(); + if ("role".equals(fieldName)) { + discriminatorValue = readerToUse.getString(); + break; + } else { + readerToUse.skipChildren(); + } + } + // Use the discriminator value to determine which subtype should be deserialized. + if ("assistant".equals(discriminatorValue)) { + return RegressionStreamStyleJsonDispatchAssistant.fromJson(readerToUse.reset()); + } else { + return fromJsonKnownDiscriminator(readerToUse.reset()); + } + } + }); + } + + @Generated + static RegressionStreamStyleJsonDispatchMessage fromJsonKnownDiscriminator(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + RegressionStreamStyleJsonDispatchMessage deserializedRegressionStreamStyleJsonDispatchMessage + = new RegressionStreamStyleJsonDispatchMessage(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("role".equals(fieldName)) { + deserializedRegressionStreamStyleJsonDispatchMessage.role = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionStreamStyleJsonDispatchMessage; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java new file mode 100644 index 00000000000..c600bc50d17 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java @@ -0,0 +1,99 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionSuperclassConstructorPropagationAssistant model. + */ +@Immutable +public final class RegressionSuperclassConstructorPropagationAssistant + extends RegressionSuperclassConstructorPropagationMessage { + + /* + * Discriminator property for RegressionSuperclassConstructorPropagationBase. + */ + @Generated + private final String type = "message"; + + /* + * The role property. + */ + @Generated + private String role = "assistant"; + + /** + * Creates an instance of RegressionSuperclassConstructorPropagationAssistant class. + */ + @Generated + private RegressionSuperclassConstructorPropagationAssistant() { + } + + /** + * Get the type property: Discriminator property for RegressionSuperclassConstructorPropagationBase. + * + * @return the type value. + */ + @Generated + @Override + public String getType() { + return this.type; + } + + /** + * Get the role property: The role property. + * + * @return the role value. + */ + @Generated + @Override + public String getRole() { + return this.role; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + jsonWriter.writeStringField("role", this.role); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionSuperclassConstructorPropagationAssistant from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionSuperclassConstructorPropagationAssistant if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the RegressionSuperclassConstructorPropagationAssistant. + */ + @Generated + public static RegressionSuperclassConstructorPropagationAssistant fromJson(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + RegressionSuperclassConstructorPropagationAssistant deserializedRegressionSuperclassConstructorPropagationAssistant + = new RegressionSuperclassConstructorPropagationAssistant(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("role".equals(fieldName)) { + deserializedRegressionSuperclassConstructorPropagationAssistant.role = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionSuperclassConstructorPropagationAssistant; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.java new file mode 100644 index 00000000000..6d8632d7fe9 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.java @@ -0,0 +1,113 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionSuperclassConstructorPropagationBase model. + */ +@Immutable +public class RegressionSuperclassConstructorPropagationBase extends RegressionSuperclassConstructorPropagationRoot { + + /* + * Discriminator property for RegressionSuperclassConstructorPropagationBase. + */ + @Generated + private String type = "RegressionSuperclassConstructorPropagationBase"; + + /** + * Creates an instance of RegressionSuperclassConstructorPropagationBase class. + * + * @param type the type value to set. + */ + @Generated + protected RegressionSuperclassConstructorPropagationBase(String type) { + super(type); + } + + /** + * Get the type property: Discriminator property for RegressionSuperclassConstructorPropagationBase. + * + * @return the type value. + */ + @Generated + @Override + public String getType() { + return this.type; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionSuperclassConstructorPropagationBase from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionSuperclassConstructorPropagationBase if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the RegressionSuperclassConstructorPropagationBase. + */ + @Generated + public static RegressionSuperclassConstructorPropagationBase fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String discriminatorValue = null; + try (JsonReader readerToUse = reader.bufferObject()) { + // Prepare for reading + readerToUse.nextToken(); + while (readerToUse.nextToken() != JsonToken.END_OBJECT) { + String fieldName = readerToUse.getFieldName(); + readerToUse.nextToken(); + if ("type".equals(fieldName)) { + discriminatorValue = readerToUse.getString(); + break; + } else { + readerToUse.skipChildren(); + } + } + // Use the discriminator value to determine which subtype should be deserialized. + if ("message".equals(discriminatorValue)) { + return RegressionSuperclassConstructorPropagationMessage.fromJson(readerToUse.reset()); + } else { + return fromJsonKnownDiscriminator(readerToUse.reset()); + } + } + }); + } + + @Generated + static RegressionSuperclassConstructorPropagationBase fromJsonKnownDiscriminator(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + String type = null; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("type".equals(fieldName)) { + type = reader.getString(); + } else { + reader.skipChildren(); + } + } + RegressionSuperclassConstructorPropagationBase deserializedRegressionSuperclassConstructorPropagationBase + = new RegressionSuperclassConstructorPropagationBase(type); + deserializedRegressionSuperclassConstructorPropagationBase.type = type; + return deserializedRegressionSuperclassConstructorPropagationBase; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java new file mode 100644 index 00000000000..e60e68cb9a7 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java @@ -0,0 +1,125 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionSuperclassConstructorPropagationMessage model. + */ +@Immutable +public class RegressionSuperclassConstructorPropagationMessage extends RegressionSuperclassConstructorPropagationBase { + + /* + * Discriminator property for RegressionSuperclassConstructorPropagationBase. + */ + @Generated + private final String type = "message"; + + /* + * The role property. + */ + @Generated + private String role = "message"; + + /** + * Creates an instance of RegressionSuperclassConstructorPropagationMessage class. + */ + @Generated + protected RegressionSuperclassConstructorPropagationMessage() { + super("message"); + } + + /** + * Get the type property: Discriminator property for RegressionSuperclassConstructorPropagationBase. + * + * @return the type value. + */ + @Generated + @Override + public String getType() { + return this.type; + } + + /** + * Get the role property: The role property. + * + * @return the role value. + */ + @Generated + public String getRole() { + return this.role; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + jsonWriter.writeStringField("role", this.role); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionSuperclassConstructorPropagationMessage from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionSuperclassConstructorPropagationMessage if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the RegressionSuperclassConstructorPropagationMessage. + */ + @Generated + public static RegressionSuperclassConstructorPropagationMessage fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String discriminatorValue = null; + try (JsonReader readerToUse = reader.bufferObject()) { + // Prepare for reading + readerToUse.nextToken(); + while (readerToUse.nextToken() != JsonToken.END_OBJECT) { + String fieldName = readerToUse.getFieldName(); + readerToUse.nextToken(); + if ("role".equals(fieldName)) { + discriminatorValue = readerToUse.getString(); + break; + } else { + readerToUse.skipChildren(); + } + } + // Use the discriminator value to determine which subtype should be deserialized. + if ("assistant".equals(discriminatorValue)) { + return RegressionSuperclassConstructorPropagationAssistant.fromJson(readerToUse.reset()); + } else { + return fromJsonKnownDiscriminator(readerToUse.reset()); + } + } + }); + } + + @Generated + static RegressionSuperclassConstructorPropagationMessage fromJsonKnownDiscriminator(JsonReader jsonReader) + throws IOException { + return jsonReader.readObject(reader -> { + RegressionSuperclassConstructorPropagationMessage deserializedRegressionSuperclassConstructorPropagationMessage + = new RegressionSuperclassConstructorPropagationMessage(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("role".equals(fieldName)) { + deserializedRegressionSuperclassConstructorPropagationMessage.role = reader.getString(); + } else { + reader.skipChildren(); + } + } + return deserializedRegressionSuperclassConstructorPropagationMessage; + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java new file mode 100644 index 00000000000..41461878be2 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package tsptest.discriminatoredgecases.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The RegressionSuperclassConstructorPropagationRoot model. + */ +@Immutable +public class RegressionSuperclassConstructorPropagationRoot + implements JsonSerializable { + + /* + * The type property. + */ + @Generated + private final String type; + + /** + * Creates an instance of RegressionSuperclassConstructorPropagationRoot class. + * + * @param type the type value to set. + */ + @Generated + protected RegressionSuperclassConstructorPropagationRoot(String type) { + this.type = type; + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + public String getType() { + return this.type; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of RegressionSuperclassConstructorPropagationRoot from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of RegressionSuperclassConstructorPropagationRoot if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the RegressionSuperclassConstructorPropagationRoot. + */ + @Generated + public static RegressionSuperclassConstructorPropagationRoot fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String type = null; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("type".equals(fieldName)) { + type = reader.getString(); + } else { + reader.skipChildren(); + } + } + return new RegressionSuperclassConstructorPropagationRoot(type); + }); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json index 4f0daf02fcc..0162559c276 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json @@ -1 +1 @@ -{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.DiscriminatorEdgeCases","crossLanguageVersion":"f7a3bf40b2af","crossLanguageDefinitions":{"tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClientBuilder":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.models.ChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.ChildWithRequiredPropertyAsDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithRequiredPropertyAsDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithNestedDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithNestedDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.GrandChildWithRequiredProperty","tsptest.discriminatoredgecases.models.GreatGrandChildWithDuplicateDiscriminator":"TspTest.DiscriminatorEdgeCases.GreatGrandChildWithDuplicateDiscriminator","tsptest.discriminatoredgecases.models.ModelWithDiscriminatorNoSubtypes":"TspTest.DiscriminatorEdgeCases.ModelWithDiscriminatorNoSubtypes","tsptest.discriminatoredgecases.models.NestedDiscriminatorAssistant":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorAssistant","tsptest.discriminatoredgecases.models.NestedDiscriminatorBase":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorBase","tsptest.discriminatoredgecases.models.NestedDiscriminatorMessage":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorMessage","tsptest.discriminatoredgecases.models.ParentWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.ParentWithRequiredProperty"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesAsyncClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClientBuilder.java","src/main/java/tsptest/discriminatoredgecases/implementation/DiscriminatorEdgeCasesClientImpl.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializer.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializerProviders.java","src/main/java/tsptest/discriminatoredgecases/implementation/package-info.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ModelWithDiscriminatorNoSubtypes.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorBase.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorMessage.java","src/main/java/tsptest/discriminatoredgecases/models/ParentWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/package-info.java","src/main/java/tsptest/discriminatoredgecases/package-info.java"]} \ No newline at end of file +{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.DiscriminatorEdgeCases","crossLanguageVersion":"80a717823d56","crossLanguageDefinitions":{"tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClientBuilder":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.models.ChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.ChildWithRequiredPropertyAsDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithRequiredPropertyAsDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.GrandChildWithRequiredProperty","tsptest.discriminatoredgecases.models.ModelWithDiscriminatorNoSubtypes":"TspTest.DiscriminatorEdgeCases.ModelWithDiscriminatorNoSubtypes","tsptest.discriminatoredgecases.models.NestedDiscriminatorAssistant":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorAssistant","tsptest.discriminatoredgecases.models.NestedDiscriminatorBase":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorBase","tsptest.discriminatoredgecases.models.NestedDiscriminatorMessage":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorMessage","tsptest.discriminatoredgecases.models.ParentWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.ParentWithRequiredProperty","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingAssistant":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingAssistant","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingBase":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingBase","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingMessage":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingMessage","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingRoot":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingRoot","tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorAssistant":"TspTest.DiscriminatorEdgeCases.RegressionDuplicateRepeatedInheritedDiscriminatorAssistant","tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorBase":"TspTest.DiscriminatorEdgeCases.RegressionDuplicateRepeatedInheritedDiscriminatorBase","tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorMessage":"TspTest.DiscriminatorEdgeCases.RegressionDuplicateRepeatedInheritedDiscriminatorMessage","tsptest.discriminatoredgecases.models.RegressionStreamStyleJsonDispatchAssistant":"TspTest.DiscriminatorEdgeCases.RegressionStreamStyleJsonDispatchAssistant","tsptest.discriminatoredgecases.models.RegressionStreamStyleJsonDispatchBase":"TspTest.DiscriminatorEdgeCases.RegressionStreamStyleJsonDispatchBase","tsptest.discriminatoredgecases.models.RegressionStreamStyleJsonDispatchMessage":"TspTest.DiscriminatorEdgeCases.RegressionStreamStyleJsonDispatchMessage","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationAssistant":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationAssistant","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationBase":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationBase","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationMessage":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationMessage","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationRoot":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationRoot"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesAsyncClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClientBuilder.java","src/main/java/tsptest/discriminatoredgecases/implementation/DiscriminatorEdgeCasesClientImpl.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializer.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializerProviders.java","src/main/java/tsptest/discriminatoredgecases/implementation/package-info.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/ModelWithDiscriminatorNoSubtypes.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorBase.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorMessage.java","src/main/java/tsptest/discriminatoredgecases/models/ParentWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchBase.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchMessage.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java","src/main/java/tsptest/discriminatoredgecases/models/package-info.java","src/main/java/tsptest/discriminatoredgecases/package-info.java"]} \ No newline at end of file diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/discriminatoredgecases/DiscriminatorRegressionTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/discriminatoredgecases/DiscriminatorRegressionTests.java new file mode 100644 index 00000000000..fb935478ad1 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/discriminatoredgecases/DiscriminatorRegressionTests.java @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package tsptest.discriminatoredgecases; + +import com.azure.core.util.BinaryData; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingAssistant; +import tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingBase; +import tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorAssistant; +import tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorBase; +import tsptest.discriminatoredgecases.models.RegressionStreamStyleJsonDispatchAssistant; +import tsptest.discriminatoredgecases.models.RegressionStreamStyleJsonDispatchBase; +import tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationAssistant; +import tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationBase; + +public class DiscriminatorRegressionTests { + + @Test + public void duplicateRepeatedInheritedDiscriminatorHasOneCanonicalRepresentation() { + String json = "{\"type\":\"message\",\"role\":\"assistant\"}"; + + RegressionDuplicateRepeatedInheritedDiscriminatorBase model + = BinaryData.fromString(json).toObject(RegressionDuplicateRepeatedInheritedDiscriminatorBase.class); + + Assertions.assertInstanceOf(RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.class, model); + Assertions.assertEquals(json, BinaryData.fromObject(model).toString()); + } + + @Test + public void canonicalDiscriminatorMasksAncestorOrdinaryProperty() { + String json = "{\"type\":\"message\",\"role\":\"assistant\"}"; + + RegressionAncestorOrdinaryPropertyMaskingBase model + = BinaryData.fromString(json).toObject(RegressionAncestorOrdinaryPropertyMaskingBase.class); + + Assertions.assertInstanceOf(RegressionAncestorOrdinaryPropertyMaskingAssistant.class, model); + Assertions.assertEquals(json, BinaryData.fromObject(model).toString()); + } + + @Test + public void canonicalDiscriminatorSuppliesSuperclassConstructor() { + String json = "{\"type\":\"message\",\"role\":\"assistant\"}"; + + RegressionSuperclassConstructorPropagationBase model + = BinaryData.fromString(json).toObject(RegressionSuperclassConstructorPropagationBase.class); + + Assertions.assertInstanceOf(RegressionSuperclassConstructorPropagationAssistant.class, model); + Assertions.assertEquals("message", model.getType()); + } + + @Test + public void streamStyleJsonEmitsOuterDiscriminatorAndDispatchesNestedDiscriminator() { + String json = "{\"type\":\"message\",\"role\":\"assistant\"}"; + + RegressionStreamStyleJsonDispatchBase model + = BinaryData.fromString(json).toObject(RegressionStreamStyleJsonDispatchBase.class); + + Assertions.assertInstanceOf(RegressionStreamStyleJsonDispatchAssistant.class, model); + Assertions.assertEquals(json, BinaryData.fromObject(model).toString()); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp b/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp index ce8a79150f4..43569ad943a 100644 --- a/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp +++ b/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp @@ -30,19 +30,85 @@ model GrandChildWithRequiredProperty extends ChildWithRequiredPropertyAsDiscrimi discriminator: "aValue"; } -@discriminator("nestedDiscriminator") -model GrandChildWithNestedDiscriminator extends ChildWithRequiredPropertyAsDiscriminator { - discriminator: "nested"; +@usage(Usage.output) +@access(Access.public) +@discriminator("type") +model RegressionDuplicateRepeatedInheritedDiscriminatorBase { + type: string; +} + +@discriminator("role") +model RegressionDuplicateRepeatedInheritedDiscriminatorMessage + extends RegressionDuplicateRepeatedInheritedDiscriminatorBase { + type: "message"; + role: string; +} + +model RegressionDuplicateRepeatedInheritedDiscriminatorAssistant + extends RegressionDuplicateRepeatedInheritedDiscriminatorMessage { + type: "message"; + role: "assistant"; +} + +model RegressionAncestorOrdinaryPropertyMaskingRoot { + type?: string; +} + +@usage(Usage.output) +@access(Access.public) +@discriminator("type") +model RegressionAncestorOrdinaryPropertyMaskingBase + extends RegressionAncestorOrdinaryPropertyMaskingRoot {} + +@discriminator("role") +model RegressionAncestorOrdinaryPropertyMaskingMessage + extends RegressionAncestorOrdinaryPropertyMaskingBase { + type: "message"; + role: string; +} - // Activates a nested hierarchy so the outer discriminator is propagated and masks the base property. - nestedDiscriminator: string; +model RegressionAncestorOrdinaryPropertyMaskingAssistant + extends RegressionAncestorOrdinaryPropertyMaskingMessage { + role: "assistant"; } -model GreatGrandChildWithDuplicateDiscriminator extends GrandChildWithNestedDiscriminator { - // Repeats the propagated outer discriminator to exercise duplicate merging. - discriminator: "nested"; +model RegressionSuperclassConstructorPropagationRoot { + type: string; +} + +@usage(Usage.output) +@access(Access.public) +@discriminator("type") +model RegressionSuperclassConstructorPropagationBase + extends RegressionSuperclassConstructorPropagationRoot {} + +@discriminator("role") +model RegressionSuperclassConstructorPropagationMessage + extends RegressionSuperclassConstructorPropagationBase { + type: "message"; + role: string; +} + +model RegressionSuperclassConstructorPropagationAssistant + extends RegressionSuperclassConstructorPropagationMessage { + role: "assistant"; +} + +@usage(Usage.output) +@access(Access.public) +@discriminator("type") +model RegressionStreamStyleJsonDispatchBase { + type: string; +} + +@discriminator("role") +model RegressionStreamStyleJsonDispatchMessage extends RegressionStreamStyleJsonDispatchBase { + type: "message"; + role: string; +} - nestedDiscriminator: "leaf"; +model RegressionStreamStyleJsonDispatchAssistant extends RegressionStreamStyleJsonDispatchMessage { + role: "assistant"; } @usage(Usage.output) From d1ff7bd54f70731698c2c17fba72214c8168b917 Mon Sep 17 00:00:00 2001 From: "Xiaofei Cao (from Dev Box)" Date: Tue, 8 Sep 2026 13:36:56 +0800 Subject: [PATCH 10/12] fix(http-client-java): reuse inherited discriminator metadata Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d4e8259f-d938-4448-9321-8eaf17f8b53d --- .../generator/core/mapper/ModelMapper.java | 14 +- ...ssionStreamStyleJsonDispatchAssistant.java | 97 -------------- ...RegressionStreamStyleJsonDispatchBase.java | 106 --------------- ...ressionStreamStyleJsonDispatchMessage.java | 124 ------------------ ...ptest-discriminatoredgecases_metadata.json | 2 +- .../DiscriminatorRegressionTests.java | 12 -- .../tsp/discriminator-edge-cases.tsp | 17 --- 7 files changed, 4 insertions(+), 368 deletions(-) delete mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchAssistant.java delete mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchBase.java delete mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchMessage.java diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java index c73c48bfec7..4fe3244bfe0 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java @@ -388,9 +388,8 @@ public ClientModel map(ObjectSchema compositeType) { * A child can also declare an ordinary fixed property with the same wire name as the propagated discriminator. * Keeping both representations would generate duplicate fields and accessors. Such a property must be constant and * have the same wire type, client type, and fixed value as {@code parentDiscriminator}; otherwise mapping fails. - * A valid property becomes the canonical entry in {@link ClientModel#getParentPolymorphicDiscriminators()}, with - * discriminator metadata applied, and is removed from {@link ClientModel#getProperties()}. When no same-wire-name - * child property exists, {@code parentDiscriminator} itself remains the canonical parent entry. + * A valid property is removed from {@link ClientModel#getProperties()}, leaving {@code parentDiscriminator} as the + * canonical entry in {@link ClientModel#getParentPolymorphicDiscriminators()}. *

* Parent models map after their children, so the canonical entry is inserted at index zero to retain * outer-to-inner discriminator order. The fixed discriminator is then recursively propagated to every descendant. @@ -406,7 +405,6 @@ public ClientModel map(ObjectSchema compositeType) { */ private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty parentDiscriminator, ClientModel child) { - ClientModelProperty discriminatorForChild = parentDiscriminator; for (int i = 0; i < child.getProperties().size(); i++) { ClientModelProperty childProperty = child.getProperties().get(i); if (!Objects.equals(parentDiscriminator.getSerializedName(), childProperty.getSerializedName())) { @@ -425,17 +423,11 @@ private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty p + ")."); } - discriminatorForChild = childProperty.newBuilder() - .name(parentDiscriminator.getName()) - .readOnly(true) - .required(false) - .polymorphicDiscriminator(true) - .build(); child.getProperties().remove(i); break; } - child.getParentPolymorphicDiscriminators().add(0, discriminatorForChild); + child.getParentPolymorphicDiscriminators().add(0, parentDiscriminator); for (ClientModel derived : child.getDerivedModels()) { passPolymorphicDiscriminatorToChildren(parentDiscriminator, derived); diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchAssistant.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchAssistant.java deleted file mode 100644 index cfa2e38756a..00000000000 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchAssistant.java +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. -package tsptest.discriminatoredgecases.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.azure.json.JsonReader; -import com.azure.json.JsonToken; -import com.azure.json.JsonWriter; -import java.io.IOException; - -/** - * The RegressionStreamStyleJsonDispatchAssistant model. - */ -@Immutable -public final class RegressionStreamStyleJsonDispatchAssistant extends RegressionStreamStyleJsonDispatchMessage { - - /* - * The type property. - */ - @Generated - private final String type = "message"; - - /* - * The role property. - */ - @Generated - private String role = "assistant"; - - /** - * Creates an instance of RegressionStreamStyleJsonDispatchAssistant class. - */ - @Generated - private RegressionStreamStyleJsonDispatchAssistant() { - } - - /** - * Get the type property: The type property. - * - * @return the type value. - */ - @Generated - @Override - public String getType() { - return this.type; - } - - /** - * Get the role property: The role property. - * - * @return the role value. - */ - @Generated - @Override - public String getRole() { - return this.role; - } - - /** - * {@inheritDoc} - */ - @Generated - @Override - public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { - jsonWriter.writeStartObject(); - jsonWriter.writeStringField("type", this.type); - jsonWriter.writeStringField("role", this.role); - return jsonWriter.writeEndObject(); - } - - /** - * Reads an instance of RegressionStreamStyleJsonDispatchAssistant from the JsonReader. - * - * @param jsonReader The JsonReader being read. - * @return An instance of RegressionStreamStyleJsonDispatchAssistant if the JsonReader was pointing to an instance - * of it, or null if it was pointing to JSON null. - * @throws IOException If an error occurs while reading the RegressionStreamStyleJsonDispatchAssistant. - */ - @Generated - public static RegressionStreamStyleJsonDispatchAssistant fromJson(JsonReader jsonReader) throws IOException { - return jsonReader.readObject(reader -> { - RegressionStreamStyleJsonDispatchAssistant deserializedRegressionStreamStyleJsonDispatchAssistant - = new RegressionStreamStyleJsonDispatchAssistant(); - while (reader.nextToken() != JsonToken.END_OBJECT) { - String fieldName = reader.getFieldName(); - reader.nextToken(); - if ("role".equals(fieldName)) { - deserializedRegressionStreamStyleJsonDispatchAssistant.role = reader.getString(); - } else { - reader.skipChildren(); - } - } - return deserializedRegressionStreamStyleJsonDispatchAssistant; - }); - } -} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchBase.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchBase.java deleted file mode 100644 index dfc12d50a9b..00000000000 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchBase.java +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. -package tsptest.discriminatoredgecases.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.azure.json.JsonReader; -import com.azure.json.JsonSerializable; -import com.azure.json.JsonToken; -import com.azure.json.JsonWriter; -import java.io.IOException; - -/** - * The RegressionStreamStyleJsonDispatchBase model. - */ -@Immutable -public class RegressionStreamStyleJsonDispatchBase implements JsonSerializable { - - /* - * The type property. - */ - @Generated - private String type = "RegressionStreamStyleJsonDispatchBase"; - - /** - * Creates an instance of RegressionStreamStyleJsonDispatchBase class. - */ - @Generated - protected RegressionStreamStyleJsonDispatchBase() { - } - - /** - * Get the type property: The type property. - * - * @return the type value. - */ - @Generated - public String getType() { - return this.type; - } - - /** - * {@inheritDoc} - */ - @Generated - @Override - public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { - jsonWriter.writeStartObject(); - jsonWriter.writeStringField("type", this.type); - return jsonWriter.writeEndObject(); - } - - /** - * Reads an instance of RegressionStreamStyleJsonDispatchBase from the JsonReader. - * - * @param jsonReader The JsonReader being read. - * @return An instance of RegressionStreamStyleJsonDispatchBase if the JsonReader was pointing to an instance of it, - * or null if it was pointing to JSON null. - * @throws IOException If an error occurs while reading the RegressionStreamStyleJsonDispatchBase. - */ - @Generated - public static RegressionStreamStyleJsonDispatchBase fromJson(JsonReader jsonReader) throws IOException { - return jsonReader.readObject(reader -> { - String discriminatorValue = null; - try (JsonReader readerToUse = reader.bufferObject()) { - // Prepare for reading - readerToUse.nextToken(); - while (readerToUse.nextToken() != JsonToken.END_OBJECT) { - String fieldName = readerToUse.getFieldName(); - readerToUse.nextToken(); - if ("type".equals(fieldName)) { - discriminatorValue = readerToUse.getString(); - break; - } else { - readerToUse.skipChildren(); - } - } - // Use the discriminator value to determine which subtype should be deserialized. - if ("message".equals(discriminatorValue)) { - return RegressionStreamStyleJsonDispatchMessage.fromJson(readerToUse.reset()); - } else { - return fromJsonKnownDiscriminator(readerToUse.reset()); - } - } - }); - } - - @Generated - static RegressionStreamStyleJsonDispatchBase fromJsonKnownDiscriminator(JsonReader jsonReader) throws IOException { - return jsonReader.readObject(reader -> { - RegressionStreamStyleJsonDispatchBase deserializedRegressionStreamStyleJsonDispatchBase - = new RegressionStreamStyleJsonDispatchBase(); - while (reader.nextToken() != JsonToken.END_OBJECT) { - String fieldName = reader.getFieldName(); - reader.nextToken(); - if ("type".equals(fieldName)) { - deserializedRegressionStreamStyleJsonDispatchBase.type = reader.getString(); - } else { - reader.skipChildren(); - } - } - return deserializedRegressionStreamStyleJsonDispatchBase; - }); - } -} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchMessage.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchMessage.java deleted file mode 100644 index 67e9bbae268..00000000000 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchMessage.java +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. -package tsptest.discriminatoredgecases.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.azure.json.JsonReader; -import com.azure.json.JsonToken; -import com.azure.json.JsonWriter; -import java.io.IOException; - -/** - * The RegressionStreamStyleJsonDispatchMessage model. - */ -@Immutable -public class RegressionStreamStyleJsonDispatchMessage extends RegressionStreamStyleJsonDispatchBase { - - /* - * The type property. - */ - @Generated - private final String type = "message"; - - /* - * The role property. - */ - @Generated - private String role = "message"; - - /** - * Creates an instance of RegressionStreamStyleJsonDispatchMessage class. - */ - @Generated - protected RegressionStreamStyleJsonDispatchMessage() { - } - - /** - * Get the type property: The type property. - * - * @return the type value. - */ - @Generated - @Override - public String getType() { - return this.type; - } - - /** - * Get the role property: The role property. - * - * @return the role value. - */ - @Generated - public String getRole() { - return this.role; - } - - /** - * {@inheritDoc} - */ - @Generated - @Override - public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { - jsonWriter.writeStartObject(); - jsonWriter.writeStringField("type", this.type); - jsonWriter.writeStringField("role", this.role); - return jsonWriter.writeEndObject(); - } - - /** - * Reads an instance of RegressionStreamStyleJsonDispatchMessage from the JsonReader. - * - * @param jsonReader The JsonReader being read. - * @return An instance of RegressionStreamStyleJsonDispatchMessage if the JsonReader was pointing to an instance of - * it, or null if it was pointing to JSON null. - * @throws IOException If an error occurs while reading the RegressionStreamStyleJsonDispatchMessage. - */ - @Generated - public static RegressionStreamStyleJsonDispatchMessage fromJson(JsonReader jsonReader) throws IOException { - return jsonReader.readObject(reader -> { - String discriminatorValue = null; - try (JsonReader readerToUse = reader.bufferObject()) { - // Prepare for reading - readerToUse.nextToken(); - while (readerToUse.nextToken() != JsonToken.END_OBJECT) { - String fieldName = readerToUse.getFieldName(); - readerToUse.nextToken(); - if ("role".equals(fieldName)) { - discriminatorValue = readerToUse.getString(); - break; - } else { - readerToUse.skipChildren(); - } - } - // Use the discriminator value to determine which subtype should be deserialized. - if ("assistant".equals(discriminatorValue)) { - return RegressionStreamStyleJsonDispatchAssistant.fromJson(readerToUse.reset()); - } else { - return fromJsonKnownDiscriminator(readerToUse.reset()); - } - } - }); - } - - @Generated - static RegressionStreamStyleJsonDispatchMessage fromJsonKnownDiscriminator(JsonReader jsonReader) - throws IOException { - return jsonReader.readObject(reader -> { - RegressionStreamStyleJsonDispatchMessage deserializedRegressionStreamStyleJsonDispatchMessage - = new RegressionStreamStyleJsonDispatchMessage(); - while (reader.nextToken() != JsonToken.END_OBJECT) { - String fieldName = reader.getFieldName(); - reader.nextToken(); - if ("role".equals(fieldName)) { - deserializedRegressionStreamStyleJsonDispatchMessage.role = reader.getString(); - } else { - reader.skipChildren(); - } - } - return deserializedRegressionStreamStyleJsonDispatchMessage; - }); - } -} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json index 0162559c276..e4779a49e62 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json @@ -1 +1 @@ -{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.DiscriminatorEdgeCases","crossLanguageVersion":"80a717823d56","crossLanguageDefinitions":{"tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClientBuilder":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.models.ChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.ChildWithRequiredPropertyAsDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithRequiredPropertyAsDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.GrandChildWithRequiredProperty","tsptest.discriminatoredgecases.models.ModelWithDiscriminatorNoSubtypes":"TspTest.DiscriminatorEdgeCases.ModelWithDiscriminatorNoSubtypes","tsptest.discriminatoredgecases.models.NestedDiscriminatorAssistant":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorAssistant","tsptest.discriminatoredgecases.models.NestedDiscriminatorBase":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorBase","tsptest.discriminatoredgecases.models.NestedDiscriminatorMessage":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorMessage","tsptest.discriminatoredgecases.models.ParentWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.ParentWithRequiredProperty","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingAssistant":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingAssistant","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingBase":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingBase","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingMessage":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingMessage","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingRoot":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingRoot","tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorAssistant":"TspTest.DiscriminatorEdgeCases.RegressionDuplicateRepeatedInheritedDiscriminatorAssistant","tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorBase":"TspTest.DiscriminatorEdgeCases.RegressionDuplicateRepeatedInheritedDiscriminatorBase","tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorMessage":"TspTest.DiscriminatorEdgeCases.RegressionDuplicateRepeatedInheritedDiscriminatorMessage","tsptest.discriminatoredgecases.models.RegressionStreamStyleJsonDispatchAssistant":"TspTest.DiscriminatorEdgeCases.RegressionStreamStyleJsonDispatchAssistant","tsptest.discriminatoredgecases.models.RegressionStreamStyleJsonDispatchBase":"TspTest.DiscriminatorEdgeCases.RegressionStreamStyleJsonDispatchBase","tsptest.discriminatoredgecases.models.RegressionStreamStyleJsonDispatchMessage":"TspTest.DiscriminatorEdgeCases.RegressionStreamStyleJsonDispatchMessage","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationAssistant":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationAssistant","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationBase":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationBase","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationMessage":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationMessage","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationRoot":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationRoot"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesAsyncClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClientBuilder.java","src/main/java/tsptest/discriminatoredgecases/implementation/DiscriminatorEdgeCasesClientImpl.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializer.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializerProviders.java","src/main/java/tsptest/discriminatoredgecases/implementation/package-info.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/ModelWithDiscriminatorNoSubtypes.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorBase.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorMessage.java","src/main/java/tsptest/discriminatoredgecases/models/ParentWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchBase.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionStreamStyleJsonDispatchMessage.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java","src/main/java/tsptest/discriminatoredgecases/models/package-info.java","src/main/java/tsptest/discriminatoredgecases/package-info.java"]} \ No newline at end of file +{"flavor":"Azure","apiVersions":{},"crossLanguagePackageId":"TspTest.DiscriminatorEdgeCases","crossLanguageVersion":"4f32174341d1","crossLanguageDefinitions":{"tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesAsyncClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildNewDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildNewDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrim":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getChildRequiredDiscrimWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getChildRequiredDiscrim","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypes":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClient.getNoSubtypesWithResponse":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp.getNoSubtypes","tsptest.discriminatoredgecases.DiscriminatorEdgeCasesClientBuilder":"TspTest.DiscriminatorEdgeCases.DiscriminatorEdgeCasesOp","tsptest.discriminatoredgecases.models.ChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.ChildWithRequiredPropertyAsDiscriminator":"TspTest.DiscriminatorEdgeCases.ChildWithRequiredPropertyAsDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithAnotherDiscriminator":"TspTest.DiscriminatorEdgeCases.GrandChildWithAnotherDiscriminator","tsptest.discriminatoredgecases.models.GrandChildWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.GrandChildWithRequiredProperty","tsptest.discriminatoredgecases.models.ModelWithDiscriminatorNoSubtypes":"TspTest.DiscriminatorEdgeCases.ModelWithDiscriminatorNoSubtypes","tsptest.discriminatoredgecases.models.NestedDiscriminatorAssistant":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorAssistant","tsptest.discriminatoredgecases.models.NestedDiscriminatorBase":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorBase","tsptest.discriminatoredgecases.models.NestedDiscriminatorMessage":"TspTest.DiscriminatorEdgeCases.NestedDiscriminatorMessage","tsptest.discriminatoredgecases.models.ParentWithRequiredProperty":"TspTest.DiscriminatorEdgeCases.ParentWithRequiredProperty","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingAssistant":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingAssistant","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingBase":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingBase","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingMessage":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingMessage","tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingRoot":"TspTest.DiscriminatorEdgeCases.RegressionAncestorOrdinaryPropertyMaskingRoot","tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorAssistant":"TspTest.DiscriminatorEdgeCases.RegressionDuplicateRepeatedInheritedDiscriminatorAssistant","tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorBase":"TspTest.DiscriminatorEdgeCases.RegressionDuplicateRepeatedInheritedDiscriminatorBase","tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorMessage":"TspTest.DiscriminatorEdgeCases.RegressionDuplicateRepeatedInheritedDiscriminatorMessage","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationAssistant":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationAssistant","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationBase":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationBase","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationMessage":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationMessage","tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationRoot":"TspTest.DiscriminatorEdgeCases.RegressionSuperclassConstructorPropagationRoot"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesAsyncClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClient.java","src/main/java/tsptest/discriminatoredgecases/DiscriminatorEdgeCasesClientBuilder.java","src/main/java/tsptest/discriminatoredgecases/implementation/DiscriminatorEdgeCasesClientImpl.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializer.java","src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializerProviders.java","src/main/java/tsptest/discriminatoredgecases/implementation/package-info.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithAnotherDiscriminator.java","src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/ModelWithDiscriminatorNoSubtypes.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorBase.java","src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorMessage.java","src/main/java/tsptest/discriminatoredgecases/models/ParentWithRequiredProperty.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java","src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java","src/main/java/tsptest/discriminatoredgecases/models/package-info.java","src/main/java/tsptest/discriminatoredgecases/package-info.java"]} \ No newline at end of file diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/discriminatoredgecases/DiscriminatorRegressionTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/discriminatoredgecases/DiscriminatorRegressionTests.java index fb935478ad1..40f7c8c6a1a 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/discriminatoredgecases/DiscriminatorRegressionTests.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/discriminatoredgecases/DiscriminatorRegressionTests.java @@ -10,8 +10,6 @@ import tsptest.discriminatoredgecases.models.RegressionAncestorOrdinaryPropertyMaskingBase; import tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorAssistant; import tsptest.discriminatoredgecases.models.RegressionDuplicateRepeatedInheritedDiscriminatorBase; -import tsptest.discriminatoredgecases.models.RegressionStreamStyleJsonDispatchAssistant; -import tsptest.discriminatoredgecases.models.RegressionStreamStyleJsonDispatchBase; import tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationAssistant; import tsptest.discriminatoredgecases.models.RegressionSuperclassConstructorPropagationBase; @@ -50,14 +48,4 @@ public void canonicalDiscriminatorSuppliesSuperclassConstructor() { Assertions.assertEquals("message", model.getType()); } - @Test - public void streamStyleJsonEmitsOuterDiscriminatorAndDispatchesNestedDiscriminator() { - String json = "{\"type\":\"message\",\"role\":\"assistant\"}"; - - RegressionStreamStyleJsonDispatchBase model - = BinaryData.fromString(json).toObject(RegressionStreamStyleJsonDispatchBase.class); - - Assertions.assertInstanceOf(RegressionStreamStyleJsonDispatchAssistant.class, model); - Assertions.assertEquals(json, BinaryData.fromObject(model).toString()); - } } diff --git a/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp b/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp index 43569ad943a..40f84251fe1 100644 --- a/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp +++ b/packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp @@ -94,23 +94,6 @@ model RegressionSuperclassConstructorPropagationAssistant role: "assistant"; } -@usage(Usage.output) -@access(Access.public) -@discriminator("type") -model RegressionStreamStyleJsonDispatchBase { - type: string; -} - -@discriminator("role") -model RegressionStreamStyleJsonDispatchMessage extends RegressionStreamStyleJsonDispatchBase { - type: "message"; - role: string; -} - -model RegressionStreamStyleJsonDispatchAssistant extends RegressionStreamStyleJsonDispatchMessage { - role: "assistant"; -} - @usage(Usage.output) @access(Access.public) @name("NestedDiscriminatorBase") From 9b009c473467f6889f8c5da5d55858dca8b18221 Mon Sep 17 00:00:00 2001 From: "Xiaofei Cao (from Dev Box)" Date: Tue, 8 Sep 2026 14:13:48 +0800 Subject: [PATCH 11/12] fix(http-client-java): validate inherited discriminator names Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d4e8259f-d938-4448-9321-8eaf17f8b53d --- .../generator/core/mapper/ModelMapper.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java index 4fe3244bfe0..38676128c7c 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java @@ -28,6 +28,7 @@ import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; +import java.util.ListIterator; import java.util.Objects; import java.util.Set; import java.util.function.Function; @@ -386,10 +387,11 @@ public ClientModel map(ObjectSchema compositeType) { * models retain the canonical {@code type="message"} value while {@code role} controls nested dispatch. *

* A child can also declare an ordinary fixed property with the same wire name as the propagated discriminator. - * Keeping both representations would generate duplicate fields and accessors. Such a property must be constant and - * have the same wire type, client type, and fixed value as {@code parentDiscriminator}; otherwise mapping fails. - * A valid property is removed from {@link ClientModel#getProperties()}, leaving {@code parentDiscriminator} as the - * canonical entry in {@link ClientModel#getParentPolymorphicDiscriminators()}. + * Keeping both representations would generate duplicate fields and accessors. Such a property must match + * {@code parentDiscriminator}'s Java name, wire type, client type, and fixed value, and must be constant; otherwise + * mapping fails. A valid property is removed from {@link ClientModel#getProperties()}, leaving + * {@code parentDiscriminator} as the canonical entry in + * {@link ClientModel#getParentPolymorphicDiscriminators()}. *

* Parent models map after their children, so the canonical entry is inserted at index zero to retain * outer-to-inner discriminator order. The fixed discriminator is then recursively propagated to every descendant. @@ -400,30 +402,33 @@ public ClientModel map(ObjectSchema compositeType) { * * @param parentDiscriminator the fixed discriminator selected by the outer hierarchy * @param child the nested-hierarchy model that receives the fixed discriminator - * @throws IllegalStateException if the child declares the same wire name without matching constant status, wire - * type, client type, and fixed value + * @throws IllegalStateException if the child declares the same wire name without matching constant status, Java + * name, wire type, client type, and fixed value */ private static void passPolymorphicDiscriminatorToChildren(ClientModelProperty parentDiscriminator, ClientModel child) { - for (int i = 0; i < child.getProperties().size(); i++) { - ClientModelProperty childProperty = child.getProperties().get(i); + ListIterator iterator = child.getProperties().listIterator(); + while (iterator.hasNext()) { + ClientModelProperty childProperty = iterator.next(); if (!Objects.equals(parentDiscriminator.getSerializedName(), childProperty.getSerializedName())) { continue; } if (!childProperty.isConstant() + || !Objects.equals(parentDiscriminator.getName(), childProperty.getName()) || !Objects.equals(parentDiscriminator.getWireType(), childProperty.getWireType()) || !Objects.equals(parentDiscriminator.getClientType(), childProperty.getClientType()) || !Objects.equals(parentDiscriminator.getDefaultValue(), childProperty.getDefaultValue())) { throw new IllegalStateException("Property '" + childProperty.getSerializedName() + "' on model '" - + child.getName() + "' does not match its inherited polymorphic discriminator. Expected (type=" - + parentDiscriminator.getClientType() + ", value=" - + String.valueOf(parentDiscriminator.getDefaultValue()) + "), but found (type=" + + child.getName() + "' does not match its inherited polymorphic discriminator. Expected (name=" + + parentDiscriminator.getName() + ", constant=true, type=" + parentDiscriminator.getClientType() + + ", value=" + String.valueOf(parentDiscriminator.getDefaultValue()) + "), but found (name=" + + childProperty.getName() + ", constant=" + childProperty.isConstant() + ", type=" + childProperty.getClientType() + ", value=" + String.valueOf(childProperty.getDefaultValue()) + ")."); } - child.getProperties().remove(i); + iterator.remove(); break; } From ce17d65a8a8e05beb6b7a8b73cb6c1cd48452adf Mon Sep 17 00:00:00 2001 From: "Xiaofei Cao (from Dev Box)" Date: Tue, 8 Sep 2026 16:04:24 +0800 Subject: [PATCH 12/12] chore(http-client-java): regenerate test clients Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d4e8259f-d938-4448-9321-8eaf-ba5f78405f73 --- .../implementation/XmlSerializer.java | 78 +++++++++++++++++++ .../XmlSerializerProviders.java | 29 +++++++ ...ldWithRequiredPropertyAsDiscriminator.java | 15 ++-- ...estorOrdinaryPropertyMaskingAssistant.java | 10 ++- ...onAncestorOrdinaryPropertyMaskingBase.java | 11 +-- ...ncestorOrdinaryPropertyMaskingMessage.java | 13 ++-- ...onAncestorOrdinaryPropertyMaskingRoot.java | 32 ++++---- ...peatedInheritedDiscriminatorAssistant.java | 10 ++- ...ateRepeatedInheritedDiscriminatorBase.java | 11 +-- ...RepeatedInheritedDiscriminatorMessage.java | 13 ++-- ...rclassConstructorPropagationAssistant.java | 10 ++- ...nSuperclassConstructorPropagationBase.java | 13 ++-- ...perclassConstructorPropagationMessage.java | 13 ++-- ...nSuperclassConstructorPropagationRoot.java | 9 ++- .../MaxOverloadModelClient.java | 4 +- .../versioning/added/AddedAsyncClient.java | 4 +- .../java/versioning/added/AddedClient.java | 4 +- .../added/InterfaceV2AsyncClient.java | 2 +- .../versioning/added/InterfaceV2Client.java | 2 +- 19 files changed, 203 insertions(+), 80 deletions(-) create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializer.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializerProviders.java diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializer.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializer.java new file mode 100644 index 00000000000..0e30cc6b97d --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializer.java @@ -0,0 +1,78 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package tsptest.discriminatoredgecases.implementation; + +import com.azure.core.util.serializer.ObjectSerializer; +import com.azure.core.util.serializer.TypeReference; +import com.azure.xml.XmlReader; +import com.azure.xml.XmlSerializable; +import com.azure.xml.XmlWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UncheckedIOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.concurrent.ConcurrentHashMap; +import javax.xml.stream.XMLStreamException; +import reactor.core.publisher.Mono; + +// DO NOT modify this helper class + +/** + * An {@link ObjectSerializer} implementation that serializes and deserializes {@link XmlSerializable} types using + * {@code azure-xml}. Deserialization relies on the generated static {@code fromXml(XmlReader)} factory method on the + * target type. + */ +public final class XmlSerializer implements ObjectSerializer { + + private static final ConcurrentHashMap, Method> FROM_XML_CACHE = new ConcurrentHashMap<>(); + + @Override + @SuppressWarnings("unchecked") + public T deserialize(InputStream stream, TypeReference typeReference) { + Class clazz = (Class) typeReference.getJavaClass(); + Method fromXml = FROM_XML_CACHE.computeIfAbsent(clazz, c -> { + try { + return c.getDeclaredMethod("fromXml", XmlReader.class); + } catch (NoSuchMethodException e) { + throw new IllegalStateException( + "Type " + c.getName() + " does not have a static fromXml(XmlReader) method.", e); + } + }); + try (XmlReader xmlReader = XmlReader.fromStream(stream)) { + return (T) fromXml.invoke(null, xmlReader); + } catch (XMLStreamException | IllegalAccessException e) { + throw new IllegalStateException(e); + } catch (InvocationTargetException e) { + throw new IllegalStateException(e.getCause() == null ? e : e.getCause()); + } + } + + @Override + public Mono deserializeAsync(InputStream stream, TypeReference typeReference) { + return Mono.fromCallable(() -> deserialize(stream, typeReference)); + } + + @Override + public void serialize(OutputStream stream, Object value) { + if (!(value instanceof XmlSerializable)) { + throw new IllegalArgumentException("Value must implement XmlSerializable to be serialized as XML, but was: " + + (value == null ? "null" : value.getClass().getName())); + } + try (XmlWriter xmlWriter = XmlWriter.toStream(stream)) { + xmlWriter.writeStartDocument(); + xmlWriter.writeXml((XmlSerializable) value); + xmlWriter.flush(); + } catch (XMLStreamException e) { + throw new UncheckedIOException(new IOException(e)); + } + } + + @Override + public Mono serializeAsync(OutputStream stream, Object value) { + return Mono.fromRunnable(() -> serialize(stream, value)); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializerProviders.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializerProviders.java new file mode 100644 index 00000000000..b3d586af9db --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/implementation/XmlSerializerProviders.java @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package tsptest.discriminatoredgecases.implementation; + +import com.azure.core.util.serializer.ObjectSerializer; + +// DO NOT modify this helper class + +/** + * This class is a proxy for creating an {@link ObjectSerializer} that serializes and deserializes XML payloads using + * {@code azure-xml}. It mirrors the pattern of {@code JsonSerializerProviders} in {@code azure-core}, but for XML. + */ +public final class XmlSerializerProviders { + + /** + * Creates an instance of an XML {@link ObjectSerializer}. + * + * @return A new instance of an XML {@link ObjectSerializer}. + */ + public static ObjectSerializer createInstance() { + return new XmlSerializer(); + } + + private XmlSerializerProviders() { + // no-op + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java index 17211800ec8..e0b4fb1f882 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -15,7 +16,6 @@ */ @Immutable public class ChildWithRequiredPropertyAsDiscriminator extends ParentWithRequiredProperty { - /* * Discriminator property for ChildWithRequiredPropertyAsDiscriminator. */ @@ -30,7 +30,7 @@ public class ChildWithRequiredPropertyAsDiscriminator extends ParentWithRequired /** * Creates an instance of ChildWithRequiredPropertyAsDiscriminator class. - * + * * @param discriminator the discriminator value to set. * @param aProperty the aProperty value to set. * @param anotherProperty the anotherProperty value to set. @@ -43,7 +43,7 @@ protected ChildWithRequiredPropertyAsDiscriminator(String discriminator, String /** * Get the discriminator property: Discriminator property for ChildWithRequiredPropertyAsDiscriminator. - * + * * @return the discriminator value. */ @Generated @@ -54,7 +54,7 @@ public String getDiscriminator() { /** * Get the anotherProperty property: The anotherProperty property. - * + * * @return the anotherProperty value. */ @Generated @@ -77,7 +77,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of ChildWithRequiredPropertyAsDiscriminator from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of ChildWithRequiredPropertyAsDiscriminator if the JsonReader was pointing to an instance of * it, or null if it was pointing to JSON null. @@ -89,8 +89,7 @@ public static ChildWithRequiredPropertyAsDiscriminator fromJson(JsonReader jsonR return jsonReader.readObject(reader -> { String discriminatorValue = null; try (JsonReader readerToUse = reader.bufferObject()) { - // Prepare for reading - readerToUse.nextToken(); + readerToUse.nextToken(); // Prepare for reading while (readerToUse.nextToken() != JsonToken.END_OBJECT) { String fieldName = readerToUse.getFieldName(); readerToUse.nextToken(); @@ -121,6 +120,7 @@ static ChildWithRequiredPropertyAsDiscriminator fromJsonKnownDiscriminator(JsonR while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("aProperty".equals(fieldName)) { aProperty = reader.getString(); } else if ("anotherProperty".equals(fieldName)) { @@ -134,6 +134,7 @@ static ChildWithRequiredPropertyAsDiscriminator fromJsonKnownDiscriminator(JsonR ChildWithRequiredPropertyAsDiscriminator deserializedChildWithRequiredPropertyAsDiscriminator = new ChildWithRequiredPropertyAsDiscriminator(discriminator, aProperty, anotherProperty); deserializedChildWithRequiredPropertyAsDiscriminator.discriminator = discriminator; + return deserializedChildWithRequiredPropertyAsDiscriminator; }); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java index ef84d9981cf..8f01270e03d 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -16,7 +17,6 @@ @Immutable public final class RegressionAncestorOrdinaryPropertyMaskingAssistant extends RegressionAncestorOrdinaryPropertyMaskingMessage { - /* * Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. */ @@ -38,7 +38,7 @@ private RegressionAncestorOrdinaryPropertyMaskingAssistant() { /** * Get the type property: Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. - * + * * @return the type value. */ @Generated @@ -49,7 +49,7 @@ public String getType() { /** * Get the role property: The role property. - * + * * @return the role value. */ @Generated @@ -72,7 +72,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of RegressionAncestorOrdinaryPropertyMaskingAssistant from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of RegressionAncestorOrdinaryPropertyMaskingAssistant if the JsonReader was pointing to an * instance of it, or null if it was pointing to JSON null. @@ -87,12 +87,14 @@ public static RegressionAncestorOrdinaryPropertyMaskingAssistant fromJson(JsonRe while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("role".equals(fieldName)) { deserializedRegressionAncestorOrdinaryPropertyMaskingAssistant.role = reader.getString(); } else { reader.skipChildren(); } } + return deserializedRegressionAncestorOrdinaryPropertyMaskingAssistant; }); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java index b40fcced80d..a970dd09a6d 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -15,7 +16,6 @@ */ @Immutable public class RegressionAncestorOrdinaryPropertyMaskingBase extends RegressionAncestorOrdinaryPropertyMaskingRoot { - /* * Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. */ @@ -31,7 +31,7 @@ protected RegressionAncestorOrdinaryPropertyMaskingBase() { /** * Get the type property: Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. - * + * * @return the type value. */ @Generated @@ -53,7 +53,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of RegressionAncestorOrdinaryPropertyMaskingBase from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of RegressionAncestorOrdinaryPropertyMaskingBase if the JsonReader was pointing to an * instance of it, or null if it was pointing to JSON null. @@ -64,8 +64,7 @@ public static RegressionAncestorOrdinaryPropertyMaskingBase fromJson(JsonReader return jsonReader.readObject(reader -> { String discriminatorValue = null; try (JsonReader readerToUse = reader.bufferObject()) { - // Prepare for reading - readerToUse.nextToken(); + readerToUse.nextToken(); // Prepare for reading while (readerToUse.nextToken() != JsonToken.END_OBJECT) { String fieldName = readerToUse.getFieldName(); readerToUse.nextToken(); @@ -95,12 +94,14 @@ static RegressionAncestorOrdinaryPropertyMaskingBase fromJsonKnownDiscriminator( while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("type".equals(fieldName)) { deserializedRegressionAncestorOrdinaryPropertyMaskingBase.type = reader.getString(); } else { reader.skipChildren(); } } + return deserializedRegressionAncestorOrdinaryPropertyMaskingBase; }); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.java index e25c50daa60..81076adc6ed 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -15,7 +16,6 @@ */ @Immutable public class RegressionAncestorOrdinaryPropertyMaskingMessage extends RegressionAncestorOrdinaryPropertyMaskingBase { - /* * Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. */ @@ -37,7 +37,7 @@ protected RegressionAncestorOrdinaryPropertyMaskingMessage() { /** * Get the type property: Discriminator property for RegressionAncestorOrdinaryPropertyMaskingBase. - * + * * @return the type value. */ @Generated @@ -48,7 +48,7 @@ public String getType() { /** * Get the role property: The role property. - * + * * @return the role value. */ @Generated @@ -70,7 +70,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of RegressionAncestorOrdinaryPropertyMaskingMessage from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of RegressionAncestorOrdinaryPropertyMaskingMessage if the JsonReader was pointing to an * instance of it, or null if it was pointing to JSON null. @@ -81,8 +81,7 @@ public static RegressionAncestorOrdinaryPropertyMaskingMessage fromJson(JsonRead return jsonReader.readObject(reader -> { String discriminatorValue = null; try (JsonReader readerToUse = reader.bufferObject()) { - // Prepare for reading - readerToUse.nextToken(); + readerToUse.nextToken(); // Prepare for reading while (readerToUse.nextToken() != JsonToken.END_OBJECT) { String fieldName = readerToUse.getFieldName(); readerToUse.nextToken(); @@ -112,12 +111,14 @@ static RegressionAncestorOrdinaryPropertyMaskingMessage fromJsonKnownDiscriminat while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("role".equals(fieldName)) { deserializedRegressionAncestorOrdinaryPropertyMaskingMessage.role = reader.getString(); } else { reader.skipChildren(); } } + return deserializedRegressionAncestorOrdinaryPropertyMaskingMessage; }); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java index 8447d87c689..5f64da0bdad 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -17,7 +18,6 @@ @Immutable public class RegressionAncestorOrdinaryPropertyMaskingRoot implements JsonSerializable { - /* * The type property. */ @@ -33,7 +33,7 @@ protected RegressionAncestorOrdinaryPropertyMaskingRoot() { /** * Get the type property: The type property. - * + * * @return the type value. */ @Generated @@ -41,6 +41,18 @@ public String getType() { return this.type; } + /** + * Set the type property: The type property. + * + * @param type the type value to set. + * @return the RegressionAncestorOrdinaryPropertyMaskingRoot object itself. + */ + @Generated + RegressionAncestorOrdinaryPropertyMaskingRoot setType(String type) { + this.type = type; + return this; + } + /** * {@inheritDoc} */ @@ -54,7 +66,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of RegressionAncestorOrdinaryPropertyMaskingRoot from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of RegressionAncestorOrdinaryPropertyMaskingRoot if the JsonReader was pointing to an * instance of it, or null if it was pointing to JSON null. @@ -68,25 +80,15 @@ public static RegressionAncestorOrdinaryPropertyMaskingRoot fromJson(JsonReader while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("type".equals(fieldName)) { deserializedRegressionAncestorOrdinaryPropertyMaskingRoot.type = reader.getString(); } else { reader.skipChildren(); } } + return deserializedRegressionAncestorOrdinaryPropertyMaskingRoot; }); } - - /** - * Set the type property: The type property. - * - * @param type the type value to set. - * @return the RegressionAncestorOrdinaryPropertyMaskingRoot object itself. - */ - @Generated - RegressionAncestorOrdinaryPropertyMaskingRoot setType(String type) { - this.type = type; - return this; - } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java index cf130d13e3f..ad94f35abb7 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -16,7 +17,6 @@ @Immutable public final class RegressionDuplicateRepeatedInheritedDiscriminatorAssistant extends RegressionDuplicateRepeatedInheritedDiscriminatorMessage { - /* * The type property. */ @@ -38,7 +38,7 @@ private RegressionDuplicateRepeatedInheritedDiscriminatorAssistant() { /** * Get the type property: The type property. - * + * * @return the type value. */ @Generated @@ -49,7 +49,7 @@ public String getType() { /** * Get the role property: The role property. - * + * * @return the role value. */ @Generated @@ -72,7 +72,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of RegressionDuplicateRepeatedInheritedDiscriminatorAssistant from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of RegressionDuplicateRepeatedInheritedDiscriminatorAssistant if the JsonReader was pointing * to an instance of it, or null if it was pointing to JSON null. @@ -88,12 +88,14 @@ public static RegressionDuplicateRepeatedInheritedDiscriminatorAssistant fromJso while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("role".equals(fieldName)) { deserializedRegressionDuplicateRepeatedInheritedDiscriminatorAssistant.role = reader.getString(); } else { reader.skipChildren(); } } + return deserializedRegressionDuplicateRepeatedInheritedDiscriminatorAssistant; }); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java index 4186bb63473..17494f99501 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -17,7 +18,6 @@ @Immutable public class RegressionDuplicateRepeatedInheritedDiscriminatorBase implements JsonSerializable { - /* * The type property. */ @@ -33,7 +33,7 @@ protected RegressionDuplicateRepeatedInheritedDiscriminatorBase() { /** * Get the type property: The type property. - * + * * @return the type value. */ @Generated @@ -54,7 +54,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of RegressionDuplicateRepeatedInheritedDiscriminatorBase from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of RegressionDuplicateRepeatedInheritedDiscriminatorBase if the JsonReader was pointing to an * instance of it, or null if it was pointing to JSON null. @@ -66,8 +66,7 @@ public static RegressionDuplicateRepeatedInheritedDiscriminatorBase fromJson(Jso return jsonReader.readObject(reader -> { String discriminatorValue = null; try (JsonReader readerToUse = reader.bufferObject()) { - // Prepare for reading - readerToUse.nextToken(); + readerToUse.nextToken(); // Prepare for reading while (readerToUse.nextToken() != JsonToken.END_OBJECT) { String fieldName = readerToUse.getFieldName(); readerToUse.nextToken(); @@ -97,12 +96,14 @@ static RegressionDuplicateRepeatedInheritedDiscriminatorBase fromJsonKnownDiscri while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("type".equals(fieldName)) { deserializedRegressionDuplicateRepeatedInheritedDiscriminatorBase.type = reader.getString(); } else { reader.skipChildren(); } } + return deserializedRegressionDuplicateRepeatedInheritedDiscriminatorBase; }); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java index 4f15bb45a25..16a9a208b69 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -16,7 +17,6 @@ @Immutable public class RegressionDuplicateRepeatedInheritedDiscriminatorMessage extends RegressionDuplicateRepeatedInheritedDiscriminatorBase { - /* * The type property. */ @@ -38,7 +38,7 @@ protected RegressionDuplicateRepeatedInheritedDiscriminatorMessage() { /** * Get the type property: The type property. - * + * * @return the type value. */ @Generated @@ -49,7 +49,7 @@ public String getType() { /** * Get the role property: The role property. - * + * * @return the role value. */ @Generated @@ -71,7 +71,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of RegressionDuplicateRepeatedInheritedDiscriminatorMessage from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of RegressionDuplicateRepeatedInheritedDiscriminatorMessage if the JsonReader was pointing to * an instance of it, or null if it was pointing to JSON null. @@ -84,8 +84,7 @@ public static RegressionDuplicateRepeatedInheritedDiscriminatorMessage fromJson( return jsonReader.readObject(reader -> { String discriminatorValue = null; try (JsonReader readerToUse = reader.bufferObject()) { - // Prepare for reading - readerToUse.nextToken(); + readerToUse.nextToken(); // Prepare for reading while (readerToUse.nextToken() != JsonToken.END_OBJECT) { String fieldName = readerToUse.getFieldName(); readerToUse.nextToken(); @@ -115,12 +114,14 @@ static RegressionDuplicateRepeatedInheritedDiscriminatorMessage fromJsonKnownDis while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("role".equals(fieldName)) { deserializedRegressionDuplicateRepeatedInheritedDiscriminatorMessage.role = reader.getString(); } else { reader.skipChildren(); } } + return deserializedRegressionDuplicateRepeatedInheritedDiscriminatorMessage; }); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java index c600bc50d17..3ac2b768976 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -16,7 +17,6 @@ @Immutable public final class RegressionSuperclassConstructorPropagationAssistant extends RegressionSuperclassConstructorPropagationMessage { - /* * Discriminator property for RegressionSuperclassConstructorPropagationBase. */ @@ -38,7 +38,7 @@ private RegressionSuperclassConstructorPropagationAssistant() { /** * Get the type property: Discriminator property for RegressionSuperclassConstructorPropagationBase. - * + * * @return the type value. */ @Generated @@ -49,7 +49,7 @@ public String getType() { /** * Get the role property: The role property. - * + * * @return the role value. */ @Generated @@ -72,7 +72,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of RegressionSuperclassConstructorPropagationAssistant from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of RegressionSuperclassConstructorPropagationAssistant if the JsonReader was pointing to an * instance of it, or null if it was pointing to JSON null. @@ -87,12 +87,14 @@ public static RegressionSuperclassConstructorPropagationAssistant fromJson(JsonR while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("role".equals(fieldName)) { deserializedRegressionSuperclassConstructorPropagationAssistant.role = reader.getString(); } else { reader.skipChildren(); } } + return deserializedRegressionSuperclassConstructorPropagationAssistant; }); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.java index 6d8632d7fe9..480bb5e0413 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -15,7 +16,6 @@ */ @Immutable public class RegressionSuperclassConstructorPropagationBase extends RegressionSuperclassConstructorPropagationRoot { - /* * Discriminator property for RegressionSuperclassConstructorPropagationBase. */ @@ -24,7 +24,7 @@ public class RegressionSuperclassConstructorPropagationBase extends RegressionSu /** * Creates an instance of RegressionSuperclassConstructorPropagationBase class. - * + * * @param type the type value to set. */ @Generated @@ -34,7 +34,7 @@ protected RegressionSuperclassConstructorPropagationBase(String type) { /** * Get the type property: Discriminator property for RegressionSuperclassConstructorPropagationBase. - * + * * @return the type value. */ @Generated @@ -56,7 +56,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of RegressionSuperclassConstructorPropagationBase from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of RegressionSuperclassConstructorPropagationBase if the JsonReader was pointing to an * instance of it, or null if it was pointing to JSON null. @@ -68,8 +68,7 @@ public static RegressionSuperclassConstructorPropagationBase fromJson(JsonReader return jsonReader.readObject(reader -> { String discriminatorValue = null; try (JsonReader readerToUse = reader.bufferObject()) { - // Prepare for reading - readerToUse.nextToken(); + readerToUse.nextToken(); // Prepare for reading while (readerToUse.nextToken() != JsonToken.END_OBJECT) { String fieldName = readerToUse.getFieldName(); readerToUse.nextToken(); @@ -98,6 +97,7 @@ static RegressionSuperclassConstructorPropagationBase fromJsonKnownDiscriminator while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("type".equals(fieldName)) { type = reader.getString(); } else { @@ -107,6 +107,7 @@ static RegressionSuperclassConstructorPropagationBase fromJsonKnownDiscriminator RegressionSuperclassConstructorPropagationBase deserializedRegressionSuperclassConstructorPropagationBase = new RegressionSuperclassConstructorPropagationBase(type); deserializedRegressionSuperclassConstructorPropagationBase.type = type; + return deserializedRegressionSuperclassConstructorPropagationBase; }); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java index e60e68cb9a7..e6cdec66519 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -15,7 +16,6 @@ */ @Immutable public class RegressionSuperclassConstructorPropagationMessage extends RegressionSuperclassConstructorPropagationBase { - /* * Discriminator property for RegressionSuperclassConstructorPropagationBase. */ @@ -38,7 +38,7 @@ protected RegressionSuperclassConstructorPropagationMessage() { /** * Get the type property: Discriminator property for RegressionSuperclassConstructorPropagationBase. - * + * * @return the type value. */ @Generated @@ -49,7 +49,7 @@ public String getType() { /** * Get the role property: The role property. - * + * * @return the role value. */ @Generated @@ -71,7 +71,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of RegressionSuperclassConstructorPropagationMessage from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of RegressionSuperclassConstructorPropagationMessage if the JsonReader was pointing to an * instance of it, or null if it was pointing to JSON null. @@ -82,8 +82,7 @@ public static RegressionSuperclassConstructorPropagationMessage fromJson(JsonRea return jsonReader.readObject(reader -> { String discriminatorValue = null; try (JsonReader readerToUse = reader.bufferObject()) { - // Prepare for reading - readerToUse.nextToken(); + readerToUse.nextToken(); // Prepare for reading while (readerToUse.nextToken() != JsonToken.END_OBJECT) { String fieldName = readerToUse.getFieldName(); readerToUse.nextToken(); @@ -113,12 +112,14 @@ static RegressionSuperclassConstructorPropagationMessage fromJsonKnownDiscrimina while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("role".equals(fieldName)) { deserializedRegressionSuperclassConstructorPropagationMessage.role = reader.getString(); } else { reader.skipChildren(); } } + return deserializedRegressionSuperclassConstructorPropagationMessage; }); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java index 41461878be2..96455db38c4 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package tsptest.discriminatoredgecases.models; import com.azure.core.annotation.Generated; @@ -17,7 +18,6 @@ @Immutable public class RegressionSuperclassConstructorPropagationRoot implements JsonSerializable { - /* * The type property. */ @@ -26,7 +26,7 @@ public class RegressionSuperclassConstructorPropagationRoot /** * Creates an instance of RegressionSuperclassConstructorPropagationRoot class. - * + * * @param type the type value to set. */ @Generated @@ -36,7 +36,7 @@ protected RegressionSuperclassConstructorPropagationRoot(String type) { /** * Get the type property: The type property. - * + * * @return the type value. */ @Generated @@ -57,7 +57,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of RegressionSuperclassConstructorPropagationRoot from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of RegressionSuperclassConstructorPropagationRoot if the JsonReader was pointing to an * instance of it, or null if it was pointing to JSON null. @@ -71,6 +71,7 @@ public static RegressionSuperclassConstructorPropagationRoot fromJson(JsonReader while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("type".equals(fieldName)) { type = reader.getString(); } else { diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/MaxOverloadModelClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/MaxOverloadModelClient.java index e3e81bb4954..925cee30cdf 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/MaxOverloadModelClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/MaxOverloadModelClient.java @@ -731,7 +731,7 @@ public SyncPoller beginExport(String name, /** * Long-running resource action operation template. - * + * * @param name The name parameter. * @param optional The optional parameter. * @throws IllegalArgumentException thrown if parameters fail the validation. @@ -905,7 +905,7 @@ public PagedIterable list(String filter, RequestOptions requestOp /** * Resource list operation template. - * + * * @param filter The filter parameter. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws HttpResponseException thrown if the request is rejected by server. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/AddedAsyncClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/AddedAsyncClient.java index b170758b8ae..62abf59b033 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/AddedAsyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/AddedAsyncClient.java @@ -123,7 +123,7 @@ Mono> v2WithResponseInternal(BinaryData body, RequestOption /** * The v1 operation. - * + * * @param headerV2 The headerV2 parameter. * @param body The body parameter. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. @@ -169,7 +169,7 @@ public Mono v1(String headerV2, ModelV1 body) { /** * The v2 operation. - * + * * @param body The body parameter. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws IllegalArgumentException thrown if parameters fail the validation. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/AddedClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/AddedClient.java index 20717422cbe..3d7af113e8e 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/AddedClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/AddedClient.java @@ -121,7 +121,7 @@ Response v2WithResponseInternal(BinaryData body, RequestOptions requ /** * The v1 operation. - * + * * @param headerV2 The headerV2 parameter. * @param body The body parameter. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. @@ -167,7 +167,7 @@ public ModelV1 v1(String headerV2, ModelV1 body) { /** * The v2 operation. - * + * * @param body The body parameter. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws IllegalArgumentException thrown if parameters fail the validation. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/InterfaceV2AsyncClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/InterfaceV2AsyncClient.java index 43ef93d648d..6d7156bcdec 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/InterfaceV2AsyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/InterfaceV2AsyncClient.java @@ -81,7 +81,7 @@ Mono> v2InInterfaceWithResponseInternal(BinaryData body, Re /** * The v2InInterface operation. - * + * * @param body The body parameter. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws IllegalArgumentException thrown if parameters fail the validation. diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/InterfaceV2Client.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/InterfaceV2Client.java index fb3c4c20d86..81c36b5f053 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/InterfaceV2Client.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/versioning/added/InterfaceV2Client.java @@ -79,7 +79,7 @@ Response v2InInterfaceWithResponseInternal(BinaryData body, RequestO /** * The v2InInterface operation. - * + * * @param body The body parameter. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws IllegalArgumentException thrown if parameters fail the validation.