Skip to content

Commit

Permalink
fix: properly support multiple types
Browse files Browse the repository at this point in the history
Some of the AsyncAPI fields support more than an object type. Previously this problem was
"solved" accepting any `Object` but this approach required castings or directly losing
the generic validations in any consumer code.

Here we propose to define an interface for each field type. For example `MessageBindingValue`
interface can be implemented both by the `Message` and the `Reference` models.

Note this PR is WIP to discuss the approach before making it more generic.
  • Loading branch information
Carlos Tasada committed Jun 26, 2023
1 parent 23cb885 commit b3d6fb7
Show file tree
Hide file tree
Showing 35 changed files with 188 additions and 45 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define ChannelBinding compatible objects.
*/
public interface ChannelBindingValue {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define CorrelationId compatible objects.
*/
public interface CorrelationIdValue {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define MessageBinding compatible objects.
*/
public interface MessageBindingValue {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define MessageTrait compatible objects.
*/
public interface MessageTraitValue {
}
7 changes: 7 additions & 0 deletions asyncapi-core/src/main/java/com/asyncapi/v2/MessageValue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define Message compatible objects.
*/
public interface MessageValue {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define OperationBinding compatible objects.
*/
public interface OperationBindingValue {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define OperationTrait compatible objects.
*/
public interface OperationTraitValue {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define Message compatible objects.
*/
public interface ParameterValue {
}
7 changes: 7 additions & 0 deletions asyncapi-core/src/main/java/com/asyncapi/v2/SchemaValue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define Schema compatible objects.
*/
public interface SchemaValue {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define SecurityScheme compatible objects.
*/
public interface SecuritySchemeValue {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define ServerBinding compatible objects.
*/
public interface ServerBindingValue {
}
7 changes: 7 additions & 0 deletions asyncapi-core/src/main/java/com/asyncapi/v2/ServerValue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define Server compatible objects.
*/
public interface ServerValue {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncapi.v2;

/**
* Interface to define ServerVariable compatible objects.
*/
public interface ServerVariableValue {
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
package com.asyncapi.v2._6_0.model;

import com.asyncapi.v2.ChannelBindingValue;
import com.asyncapi.v2.CorrelationIdValue;
import com.asyncapi.v2.MessageBindingValue;
import com.asyncapi.v2.MessageTraitValue;
import com.asyncapi.v2.MessageValue;
import com.asyncapi.v2.OperationBindingValue;
import com.asyncapi.v2.OperationTraitValue;
import com.asyncapi.v2.ParameterValue;
import com.asyncapi.v2.SchemaValue;
import com.asyncapi.v2.SecuritySchemeValue;
import com.asyncapi.v2.ServerBindingValue;
import com.asyncapi.v2.ServerValue;
import com.asyncapi.v2.ServerVariableValue;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
Expand All @@ -26,7 +39,7 @@
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class Reference {
public class Reference implements ChannelBindingValue, CorrelationIdValue, MessageValue, MessageBindingValue, MessageTraitValue, OperationBindingValue, OperationTraitValue, ParameterValue, SchemaValue, SecuritySchemeValue, ServerValue, ServerBindingValue, ServerVariableValue {

/**
* Required.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.asyncapi.v2._6_0.model.channel;

import com.asyncapi.v2.ChannelBindingValue;
import com.asyncapi.v2.ExtendableObject;
import com.asyncapi.v2.ParameterValue;
import com.asyncapi.v2._6_0.jackson.model.channel.ChannelParametersDeserializer;
import com.asyncapi.v2._6_0.model.channel.operation.Operation;
import com.asyncapi.v2.binding.channel.ChannelBinding;
Expand Down Expand Up @@ -79,7 +81,7 @@ public class ChannelItem extends ExtendableObject {
*/
@Nullable
@JsonDeserialize(using = ChannelParametersDeserializer.class)
private Map<String, Object> parameters;
private Map<String, ParameterValue> parameters;

/**
* A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the channel.
Expand All @@ -92,6 +94,6 @@ public class ChannelItem extends ExtendableObject {
*/
@Nullable
@JsonDeserialize(using = ChannelBindingsDeserializer.class)
private Map<String, Object> bindings;
private Map<String, ChannelBindingValue> bindings;

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.asyncapi.v2._6_0.model.channel;

import com.asyncapi.v2.ExtendableObject;
import com.asyncapi.v2.ParameterValue;
import com.asyncapi.v2._6_0.jackson.model.schema.SchemaDeserializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.AllArgsConstructor;
Expand All @@ -22,7 +23,7 @@
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Parameter extends ExtendableObject {
public class Parameter extends ExtendableObject implements ParameterValue {

/**
* A verbose explanation of the parameter. <a href="https://spec.commonmark.org/">CommonMark syntax</a> can be used for rich text representation.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.asyncapi.v2._6_0.model.channel.message;

import com.asyncapi.v2.CorrelationIdValue;
import com.asyncapi.v2.ExtendableObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand All @@ -23,7 +24,7 @@
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class CorrelationId extends ExtendableObject {
public class CorrelationId extends ExtendableObject implements CorrelationIdValue {

/**
* An optional description of the identifier. <a href="https://spec.commonmark.org/">CommonMark syntax</a> can be used for rich text representation.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.asyncapi.v2._6_0.model.channel.message;

import com.asyncapi.v2.ExtendableObject;
import com.asyncapi.v2.MessageBindingValue;
import com.asyncapi.v2.MessageTraitValue;
import com.asyncapi.v2.MessageValue;
import com.asyncapi.v2._6_0.jackson.model.channel.message.MessageCorrelationIdDeserializer;
import com.asyncapi.v2._6_0.jackson.model.channel.message.MessageHeadersDeserializer;
import com.asyncapi.v2._6_0.jackson.model.channel.message.MessagePayloadDeserializer;
Expand Down Expand Up @@ -32,7 +35,7 @@
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Message extends ExtendableObject {
public class Message extends ExtendableObject implements MessageValue {

/**
* Unique string used to identify the message.
Expand Down Expand Up @@ -155,7 +158,7 @@ public class Message extends ExtendableObject {
*/
@Nullable
@JsonDeserialize(using = MessageBindingsDeserializer.class)
private Map<String, Object> bindings;
private Map<String, MessageBindingValue> bindings;

/**
* List of examples.
Expand All @@ -176,6 +179,5 @@ public class Message extends ExtendableObject {
*/
@Nullable
@JsonDeserialize(using = MessageTraitsDeserializer.class)
private List<Object> traits;

private List<MessageTraitValue> traits;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.asyncapi.v2._6_0.model.channel.message;

import com.asyncapi.v2.ExtendableObject;
import com.asyncapi.v2.MessageBindingValue;
import com.asyncapi.v2.MessageTraitValue;
import com.asyncapi.v2._6_0.jackson.model.channel.message.MessageCorrelationIdDeserializer;
import com.asyncapi.v2._6_0.jackson.model.channel.message.MessageHeadersDeserializer;
import com.asyncapi.v2._6_0.model.ExternalDocumentation;
Expand Down Expand Up @@ -36,7 +38,7 @@
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class MessageTrait extends ExtendableObject {
public class MessageTrait extends ExtendableObject implements MessageTraitValue {

/**
* Unique string used to identify the message.
Expand Down Expand Up @@ -145,7 +147,7 @@ public class MessageTrait extends ExtendableObject {
*/
@Nullable
@JsonDeserialize(using = MessageBindingsDeserializer.class)
private Map<String, Object> bindings;
private Map<String, MessageBindingValue> bindings;

/**
* List of examples.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.asyncapi.v2._6_0.model.channel.message;

import com.asyncapi.v2.MessageValue;
import com.asyncapi.v2._6_0.jackson.model.channel.message.MessagesDeserializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.AllArgsConstructor;
Expand Down Expand Up @@ -31,6 +32,6 @@ public class OneOfMessages {
*/
@NotNull
@JsonDeserialize(using = MessagesDeserializer.class)
private List<Object> oneOf;
private List<MessageValue> oneOf;

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.asyncapi.v2._6_0.model.channel.operation;

import com.asyncapi.v2.ExtendableObject;
import com.asyncapi.v2.OperationBindingValue;
import com.asyncapi.v2.OperationTraitValue;
import com.asyncapi.v2._6_0.jackson.model.channel.operation.OperationMessageDeserializer;
import com.asyncapi.v2._6_0.jackson.model.channel.operation.OperationTraitsDeserializer;
import com.asyncapi.v2._6_0.model.ExternalDocumentation;
Expand Down Expand Up @@ -93,7 +95,7 @@ public class Operation extends ExtendableObject {
*/
@Nullable
@JsonDeserialize(using = OperationBindingsDeserializer.class)
private Map<String, Object> bindings;
private Map<String, OperationBindingValue> bindings;

/**
* A list of traits to apply to the operation object.
Expand All @@ -107,7 +109,7 @@ public class Operation extends ExtendableObject {
*/
@Nullable
@JsonDeserialize(using = OperationTraitsDeserializer.class)
private List<Object> traits;
private List<OperationTraitValue> traits;

/**
* A definition of the message that will be published or received by this operation.
Expand All @@ -124,5 +126,4 @@ public class Operation extends ExtendableObject {
@Nullable
@JsonDeserialize(using = OperationMessageDeserializer.class)
private Object message;

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.asyncapi.v2._6_0.model.channel.operation;

import com.asyncapi.v2.ExtendableObject;
import com.asyncapi.v2.OperationBindingValue;
import com.asyncapi.v2.OperationTraitValue;
import com.asyncapi.v2._6_0.model.ExternalDocumentation;
import com.asyncapi.v2._6_0.model.Tag;
import com.asyncapi.v2.binding.operation.OperationBinding;
Expand Down Expand Up @@ -38,7 +40,7 @@
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class OperationTrait extends ExtendableObject {
public class OperationTrait extends ExtendableObject implements OperationTraitValue {

/**
* Unique string used to identify the operation.
Expand Down Expand Up @@ -98,6 +100,6 @@ public class OperationTrait extends ExtendableObject {
*/
@Nullable
@JsonDeserialize(using = OperationBindingsDeserializer.class)
private Map<String, Object> bindings;
private Map<String, OperationBindingValue> bindings;

}
Loading

0 comments on commit b3d6fb7

Please sign in to comment.