Skip to content

Commit

Permalink
333 generated avro class imports use model package instead of avro sc…
Browse files Browse the repository at this point in the history
…hema namespace (#335)

* Logic changed in AsyncApiGenerator processExternalAvro function to always use Avro contained namespace. Test for file generation with external Avro schemas changed by adding new avro schema with namespace outside of the model package.

* README.md changed to reflect new behaviour

* Added new exception, InvalidAvroException, for the case where an Avro file contains no namespace attribute as well as a test for said exception in AsyncApiGeneratorTest, testExceptionForTestIssueInvalidAvro().
Also Updated README to reflect behaviour.

* README changed to display correct version (5.3.6)

* Changed version number from 5.3.6 to 5.4.0

* Readme column width fixed

* Removed references to disashop present in some tests. Now the name referenced is testshop.

* Added developer information to the pom file
  • Loading branch information
MarcosFreireSngular committed Apr 1, 2024
1 parent 824fad3 commit fe2c468
Show file tree
Hide file tree
Showing 22 changed files with 390 additions and 29 deletions.
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ As commented above, they both could be used at the same time, setting a double
<plugin>
<groupId>com.sngular</groupId>
<artifactId>scs-multiapi-maven-plugin</artifactId>
<version>5.3.5</version>
<version>5.4.0</version>
<executions>
<execution>
<id>asyncapi</id>
Expand Down Expand Up @@ -114,7 +114,7 @@ Apply the plugin in the `build.gradle` file and invoke the task.
```groovy
plugins {
id "java"
id "com.sngular.scs-multiapi-gradle-plugin' version '5.3.5"
id "com.sngular.scs-multiapi-gradle-plugin' version '5.4.0"
openapimodel {
Expand Down Expand Up @@ -153,7 +153,7 @@ which the plugin is designed.
<plugin>
<groupId>com.sngular</groupId>
<artifactId>scs-multiapi-maven-plugin</artifactId>
<version>5.3.5</version>
<version>5.4.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
Expand Down Expand Up @@ -368,10 +368,10 @@ order/createCommand:
$ref: '#/components/messages/com.sngular.apigenerator.asyncapi.model.CreateOrder'
```

- **Namespace from Avro**: If the user doesn't provide a package name, and the
entity is defined by an Avro Schema, the plugin will check for a `namespace`
attribute defined in the Avro file, and if there is, it will use it. The plugin
expects to receive a relative path from the `yml` file folder.
- **Namespace from Avro**: The plugin will check for a `namespace`
attribute defined in the Avro file and use it, if a namespace is
not defined it will throw an exception. The plugin expects to receive
a relative path from the `yml` file folder.

```yaml
order/created:
Expand Down Expand Up @@ -584,7 +584,7 @@ file. Here is an example of a basic configuration:
<plugin>
<groupId>com.sngular</groupId>
<artifactId>scs-multiapi-maven-plugin</artifactId>
<version>5.3.5</version>
<version>5.4.0</version>
<executions>
<execution>
<goals>
Expand Down
4 changes: 2 additions & 2 deletions multiapi-engine/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<groupId>com.sngular</groupId>
<artifactId>multiapi-engine</artifactId>
<version>5.3.5</version>
<version>5.4.0</version>
<packaging>jar</packaging>

<properties>
Expand Down Expand Up @@ -63,7 +63,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.sngular.api.generator.plugin.PluginConstants;
import com.sngular.api.generator.plugin.asyncapi.exception.ChannelNameException;
import com.sngular.api.generator.plugin.asyncapi.exception.DuplicateClassException;
import com.sngular.api.generator.plugin.asyncapi.exception.DuplicatedOperationException;
import com.sngular.api.generator.plugin.asyncapi.exception.ExternalRefComponentNotFoundException;
import com.sngular.api.generator.plugin.asyncapi.exception.FileSystemException;
import com.sngular.api.generator.plugin.asyncapi.exception.InvalidAsyncAPIException;
import com.sngular.api.generator.plugin.asyncapi.exception.*;
import com.sngular.api.generator.plugin.asyncapi.model.ProcessBindingsResult;
import com.sngular.api.generator.plugin.asyncapi.model.ProcessBindingsResult.ProcessBindingsResultBuilder;
import com.sngular.api.generator.plugin.asyncapi.model.ProcessMethodResult;
Expand Down Expand Up @@ -591,8 +586,11 @@ private String processExternalAvro(final String modelPackage, final FileLocation
final ObjectMapper mapper = new ObjectMapper();
try {
final JsonNode fileTree = mapper.readTree(avroFile);
final String fullNamespace = fileTree.get("namespace").asText() + PACKAGE_SEPARATOR + fileTree.get("name").asText();
namespace = processModelPackage(fullNamespace, modelPackage);
final JsonNode avroNamespace = fileTree.get("namespace");

if (avroNamespace == null) throw new InvalidAvroException(avroFilePath);

namespace = avroNamespace.asText() + PACKAGE_SEPARATOR + fileTree.get("name").asText();;//processModelPackage(fullNamespace, avroPackage);
} catch (final IOException e) {
throw new FileSystemException(e);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* * License, v. 2.0. If a copy of the MPL was not distributed with this
* * file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/

package com.sngular.api.generator.plugin.asyncapi.exception;

public class InvalidAvroException extends RuntimeException {
private static final String ERROR_MESSAGE = "AsyncApi -> Avro schema at path %s lacks a namespace.";
public InvalidAvroException(final String enumName) {
super(String.format(ERROR_MESSAGE, enumName));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ public class AsyncApiGeneratorFixtures {
.builder()
.filePath("src/test/resources/asyncapigenerator/testFileGenerationExternalAvro/event-api.yml")
.consumer(OperationParameterObject.builder()
.ids("subscribeOperationExternalAvro")
.ids("subscribeOperationExternalAvro,subscribeReceiptExternalAvro")
.apiPackage("com.sngular.scsplugin.externalavro.model.event.consumer")
.modelPackage("com.sngular.scsplugin.externalavro.model.event")
.build())
Expand All @@ -180,6 +180,23 @@ public class AsyncApiGeneratorFixtures {
.build()
);

final static List<SpecFile> TEST_ISSUE_INVALID_AVRO = List.of(
SpecFile
.builder()
.filePath("src/test/resources/asyncapigenerator/testIssueInvalidAvro/event-api.yml")
.consumer(OperationParameterObject.builder()
.ids("subscribeOperationExternalAvro")
.apiPackage("com.sngular.scsplugin.issueAvro.model.event.consumer")
.modelPackage("com.sngular.scsplugin.issueAvro.model.event")
.build())
.supplier(OperationParameterObject.builder()
.ids("publishOperationExternalAvro")
.apiPackage("com.sngular.scsplugin.issueAvro.model.event.producer")
.modelPackage("com.sngular.scsplugin.issueAvro.model.event")
.build())
.build()
);

final static List<SpecFile> TEST_FILE_GENERATION_STREAM_BRIDGE = List.of(
SpecFile
.builder()
Expand Down Expand Up @@ -743,6 +760,7 @@ static Function<Path, Boolean> validateTestFileGenerationExternalAvro() {

final List<String> expectedConsumerFiles = List.of(
ASSETS_PATH + "ISubscribeOperationExternalAvro.java",
ASSETS_PATH + "ISubscribeReceiptExternalAvro.java",
ASSETS_PATH + "Subscriber.java"
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.util.function.Function;
import java.util.stream.Stream;

import com.sngular.api.generator.plugin.asyncapi.exception.InvalidAvroException;
import com.sngular.api.generator.plugin.asyncapi.parameter.SpecFile;
import com.sngular.api.generator.plugin.exception.InvalidAPIException;
import org.assertj.core.api.Assertions;
Expand Down Expand Up @@ -91,4 +92,9 @@ void testExceptionForTestGenerationWithNoOperationConfiguration() {
Assertions.assertThatThrownBy(() -> asyncApiGenerator.processFileSpec(AsyncApiGeneratorFixtures.TEST_FILE_GENERATION_NO_CONFIG)).isInstanceOf(InvalidAPIException.class);
}

@Test
void testExceptionForTestIssueInvalidAvro() {
Assertions.assertThatThrownBy(() -> asyncApiGenerator.processFileSpec(AsyncApiGeneratorFixtures.TEST_ISSUE_INVALID_AVRO)).isInstanceOf(InvalidAvroException.class);
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.sngular.scsplugin.externalavro.model.event.producer;

import com.sngular.scsplugin.externalavro.model.event.Order;
import com.sngular.testshop.business_model.model.event.Order;

public interface IPublishOperationExternalAvro {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.sngular.scsplugin.externalavro.model.event.consumer;

import com.sngular.testshop.commons.Receipt;

public interface ISubscribeReceiptExternalAvro {

void subscribeReceiptExternalAvro(final Receipt value);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.sngular.scsplugin.externalavro.model.event.Order;
import com.sngular.testshop.business_model.model.event.Order;

@Configuration
public class Producer {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,26 @@

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.sngular.testshop.commons.Receipt;
import com.sngular.scsplugin.externalavro.model.event.CreateOrder;

@Configuration
public class Subscriber {

private final ISubscribeReceiptExternalAvro subscribeReceiptExternalAvro;

private final ISubscribeOperationExternalAvro subscribeOperationExternalAvro;

protected Subscriber(final ISubscribeOperationExternalAvro subscribeOperationExternalAvro) {
protected Subscriber(final ISubscribeReceiptExternalAvro subscribeReceiptExternalAvro, final ISubscribeOperationExternalAvro subscribeOperationExternalAvro) {
this.subscribeReceiptExternalAvro = subscribeReceiptExternalAvro;
this.subscribeOperationExternalAvro = subscribeOperationExternalAvro;
}

@Bean
public Consumer<Receipt> subscribeReceiptExternalAvro() {
return value -> subscribeReceiptExternalAvro.subscribeReceiptExternalAvro(value);
}

@Bean
public Consumer<CreateOrder> subscribeOperationExternalAvro() {
return value -> subscribeOperationExternalAvro.subscribeOperationExternalAvro(value);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"type": "record",
"name": "Order",
"namespace": "com.sngular.disashop.business_model.model.event",
"namespace": "com.sngular.testshop.business_model.model.event",
"fields": [
{
"name": "ref",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"type": "record",
"name": "Receipt",
"namespace": "com.sngular.testshop.commons",
"fields": [
{
"name": "ref",
"type": "string"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ servers:
protocol: kafka
protocolVersion: 0.9.1
channels:
order/receipt:
subscribe:
operationId: "subscribeReceiptExternalAvro"
message:
payload:
$ref: 'avro/Receipt.avsc'
order/created:
publish:
operationId: "publishOperationExternalAvro"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.sngular.scsplugin.issueAvro.model.event.producer;

import com.sngular.testshop.business_model.model.event.Order;

public interface IPublishOperationExternalAvro {

Order publishOperationExternalAvro();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.sngular.scsplugin.issueAvro.model.event.consumer;

import com.sngular.scsplugin.issueAvro.model.event.CreateOrder;

public interface ISubscribeOperationExternalAvro {

void subscribeOperationExternalAvro(final CreateOrder value);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.sngular.scsplugin.issueAvro.model.event.exception;

public class ModelClassException extends RuntimeException {

private static final String ERROR_MESSAGE = "There are some problems related to the entity called %s. Maybe could be caused by required fields or anyOf/oneOf restrictions";

public ModelClassException(final String modelEntity) {
super(String.format(ERROR_MESSAGE, modelEntity));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.sngular.scsplugin.issueAvro.model.event.producer;

import java.util.function.Supplier;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.sngular.testshop.business_model.model.event.Order;

@Configuration
public class Producer {

private final IPublishOperationExternalAvro publishOperationExternalAvro;

protected Producer(final IPublishOperationExternalAvro publishOperationExternalAvro) {
this.publishOperationExternalAvro = publishOperationExternalAvro;
}

@Bean
public Supplier<Order> publishOperationExternalAvro() {
return () -> publishOperationExternalAvro.publishOperationExternalAvro();
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.sngular.scsplugin.issueAvro.model.event.consumer;

import java.util.function.Consumer;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.sngular.scsplugin.issueAvro.model.event.CreateOrder;

@Configuration
public class Subscriber {

private final ISubscribeOperationExternalAvro subscribeOperationExternalAvro;

protected Subscriber(final ISubscribeOperationExternalAvro subscribeOperationExternalAvro) {
this.subscribeOperationExternalAvro = subscribeOperationExternalAvro;
}

@Bean
public Consumer<CreateOrder> subscribeOperationExternalAvro() {
return value -> subscribeOperationExternalAvro.subscribeOperationExternalAvro(value);
}


}
Loading

0 comments on commit fe2c468

Please sign in to comment.