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..6acbebea6c0 --- /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 discriminator members while preserving inherited discriminators in stream-style XML serialization. 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-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..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 @@ -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()), + // 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()) .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/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..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 @@ -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,13 @@ private static void declareFieldInternal(ClientModelProperty discriminator, Clie && settings.isShareJsonSerializableCode()) { classBlock.memberVariable(JavaVisibility.PackagePrivate, fieldSignature); } else if (!allPolymorphicModelsInSamePackage || !settings.isShareJsonSerializableCode()) { - classBlock.privateMemberVariable(fieldSignature); + // Fixed inherited parent discriminators are final; active discriminators remain mutable for fallback. + 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-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..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; @@ -355,12 +356,7 @@ 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())) { ClientModelProperty parentDiscriminator = result.getPolymorphicDiscriminator() @@ -368,6 +364,7 @@ public ClientModel map(ObjectSchema compositeType) { .defaultValue(result.getPolymorphicDiscriminator() .getClientType() .defaultValueExpression(derivedType.getSerializedName())) + .constant(true) .build(); passPolymorphicDiscriminatorToChildren(parentDiscriminator, derivedType); @@ -381,14 +378,60 @@ 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 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. + * 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, Java + * name, wire type, client type, and fixed value + */ 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. + 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 (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()) + + ")."); + } + + iterator.remove(); + break; + } + child.getParentPolymorphicDiscriminators().add(0, parentDiscriminator); 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 69dac758321..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,31 +873,19 @@ 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 - */ - ClientModelProperty propertyInThisModel = model.getProperties() - .stream() + // 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())) .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-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/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/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/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..78ab5dba285 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/NestedDiscriminatorAssistant.java @@ -0,0 +1,123 @@ +// 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 type property. + */ + @Generated + private final String type = "message"; + + /* + * The role property. + */ + @Generated + private String role = "assistant"; + + /** + * Creates an instance of NestedDiscriminatorAssistant class. + */ + @Generated + private NestedDiscriminatorAssistant() { + } + + /** + * 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; + } + + @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 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/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..8f01270e03d --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingAssistant.java @@ -0,0 +1,101 @@ +// 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..a970dd09a6d --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingBase.java @@ -0,0 +1,108 @@ +// 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()) { + readerToUse.nextToken(); // Prepare for reading + 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..81076adc6ed --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingMessage.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 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()) { + readerToUse.nextToken(); // Prepare for reading + 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..5f64da0bdad --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionAncestorOrdinaryPropertyMaskingRoot.java @@ -0,0 +1,94 @@ +// 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; + } + + /** + * 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} + */ + @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; + }); + } +} 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..ad94f35abb7 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorAssistant.java @@ -0,0 +1,102 @@ +// 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..17494f99501 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorBase.java @@ -0,0 +1,110 @@ +// 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()) { + readerToUse.nextToken(); // Prepare for reading + 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..16a9a208b69 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionDuplicateRepeatedInheritedDiscriminatorMessage.java @@ -0,0 +1,128 @@ +// 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()) { + readerToUse.nextToken(); // Prepare for reading + 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/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..3ac2b768976 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationAssistant.java @@ -0,0 +1,101 @@ +// 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..480bb5e0413 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationBase.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 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()) { + readerToUse.nextToken(); // Prepare for reading + 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..e6cdec66519 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationMessage.java @@ -0,0 +1,126 @@ +// 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()) { + readerToUse.nextToken(); // Prepare for reading + 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..96455db38c4 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/RegressionSuperclassConstructorPropagationRoot.java @@ -0,0 +1,84 @@ +// 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/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..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 @@ -20,7 +20,7 @@ public final class SawShark 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/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/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/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. 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. 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..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":"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":"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 new file mode 100644 index 00000000000..40f7c8c6a1a --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/discriminatoredgecases/DiscriminatorRegressionTests.java @@ -0,0 +1,51 @@ +// 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.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()); + } + +} 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..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 @@ -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,6 +30,91 @@ model GrandChildWithRequiredProperty extends ChildWithRequiredPropertyAsDiscrimi discriminator: "aValue"; } +@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; +} + +model RegressionAncestorOrdinaryPropertyMaskingAssistant + extends RegressionAncestorOrdinaryPropertyMaskingMessage { + role: "assistant"; +} + +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) +@name("NestedDiscriminatorBase") +@discriminator("type") +model NestedDiscriminatorBase { + @attribute type: string; +} + +@name("NestedDiscriminatorMessage") +@discriminator("role") +model NestedDiscriminatorMessage extends NestedDiscriminatorBase { + @attribute type: "message"; + @attribute role: string; +} + +@name("NestedDiscriminatorAssistant") +model NestedDiscriminatorAssistant extends NestedDiscriminatorMessage { + @attribute type: "message"; + @attribute role: "assistant"; +} + model GrandChildWithAnotherDiscriminator extends ChildWithAnotherDiscriminator { differentDiscriminator: "anotherValue"; }