Skip to content

Commit

Permalink
Feat/add options to amqp annotation (#980)
Browse files Browse the repository at this point in the history
* feat(amqp): add userId and bcc to AmqpAsyncOperationBinding

* chore(gh): update test reports configuration in pipeline

* refactor: Replace EmbeddedValueResolverAware with SpringValueResolver

by using the StringValueResolverProxy bean
  • Loading branch information
timonback authored Sep 15, 2024
1 parent 336a6c5 commit 8826905
Show file tree
Hide file tree
Showing 87 changed files with 544 additions and 415 deletions.
1 change: 1 addition & 0 deletions .github/workflows/springwolf-core.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ jobs:
if: success() || failure()
with:
check_name: test-core
require_tests: true
report_paths: '**/build/test-results/test/TEST-*.xml'

- name: Publish package
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/springwolf-plugins.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ jobs:
uses: mikepenz/action-junit-report@v4
if: success() || failure()
with:
check_name: test-${{ matrix.plugin }}-junit
check_name: test-plugin-${{ matrix.plugin }}-junit
require_tests: true
report_paths: '**/build/test-results/test/TEST-*.xml'

Expand All @@ -73,7 +73,7 @@ jobs:
- uses: actions/upload-artifact@v4
if: always()
with:
name: test-${{ matrix.plugin }}-playwright
name: test-plugin-${{ matrix.plugin }}-playwright
path: springwolf-examples/e2e/playwright-report/
retention-days: 14

Expand Down
1 change: 1 addition & 0 deletions .github/workflows/springwolf-ui.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ jobs:
if: success() || failure()
with:
check_name: test-ui-jest
require_tests: true
report_paths: '**/build/test-results/test/*.xml'

- name: Build
Expand Down
4 changes: 3 additions & 1 deletion springwolf-add-ons/springwolf-generic-binding/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ dependencies {

testImplementation "org.assertj:assertj-core:${assertjCoreVersion}"
testImplementation "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}"
testImplementation("org.junit.jupiter:junit-jupiter-params:${junitJupiterVersion}")
testImplementation "org.junit.jupiter:junit-jupiter-params:${junitJupiterVersion}"
testImplementation "org.mockito:mockito-core:${mockitoCoreVersion}"

testRuntimeOnly "org.junit.jupiter:junit-jupiter:${junitJupiterVersion}"
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.util.StringValueResolver;

@Configuration
public class SpringwolfGenericBindingAutoConfiguration {

@Bean
@Order(value = BindingProcessorPriority.GENERIC_BINDING)
public AsyncGenericOperationBindingProcessor asyncGenericOperationBindingProcessor() {
return new AsyncGenericOperationBindingProcessor();
public AsyncGenericOperationBindingProcessor asyncGenericOperationBindingProcessor(
StringValueResolver stringValueResolver) {
return new AsyncGenericOperationBindingProcessor(stringValueResolver);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,18 @@
import io.github.springwolf.asyncapi.v3.bindings.OperationBinding;
import io.github.springwolf.core.asyncapi.scanners.bindings.operations.AbstractOperationBindingProcessor;
import io.github.springwolf.core.asyncapi.scanners.bindings.operations.ProcessedOperationBinding;
import org.springframework.util.StringValueResolver;

import java.util.HashMap;
import java.util.Map;

public class AsyncGenericOperationBindingProcessor
extends AbstractOperationBindingProcessor<AsyncGenericOperationBinding> {

public AsyncGenericOperationBindingProcessor(StringValueResolver stringValueResolver) {
super(stringValueResolver);
}

@Override
protected ProcessedOperationBinding mapToOperationBinding(AsyncGenericOperationBinding bindingAnnotation) {
Map<String, Object> bindingData = PropertiesUtil.toMap(bindingAnnotation.fields());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,20 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.springframework.util.StringValueResolver;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;

class AsyncGenericOperationBindingProcessorTest {

private final AsyncGenericOperationBindingProcessor processor = new AsyncGenericOperationBindingProcessor();
private final StringValueResolver stringValueResolver = mock(StringValueResolver.class);
private final AsyncGenericOperationBindingProcessor processor =
new AsyncGenericOperationBindingProcessor(stringValueResolver);

@Test
void testClassWithoutAnnotation() {
Expand Down
4 changes: 4 additions & 0 deletions springwolf-bindings/springwolf-amqp-binding/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,12 @@ dependencies {
implementation "org.springframework:spring-core"
implementation "org.springframework.boot:spring-boot-autoconfigure"

compileOnly "org.projectlombok:lombok:${lombokVersion}"
annotationProcessor "org.projectlombok:lombok:${lombokVersion}"

testImplementation "org.assertj:assertj-core:${assertjCoreVersion}"
testImplementation "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}"
testImplementation "org.mockito:mockito-core:${mockitoCoreVersion}"

testRuntimeOnly "org.junit.jupiter:junit-jupiter:${junitJupiterVersion}"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@

int expiration() default 0;

String userId() default "";

String[] cc() default {};

int priority() default 0;
Expand All @@ -31,6 +33,8 @@

boolean mandatory() default false;

String[] bcc() default {};

boolean timestamp() default false;

boolean ack() default false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import org.springframework.util.StringValueResolver;

/**
* Autoconfiguration for the springwolf Amqp Binding.
Expand All @@ -21,8 +22,8 @@ public class SpringwolfAmqpBindingAutoConfiguration {
@Bean
@Order(value = BindingProcessorPriority.PROTOCOL_BINDING)
@ConditionalOnMissingBean
public AmqpOperationBindingProcessor amqpOperationBindingProcessor() {
return new AmqpOperationBindingProcessor();
public AmqpOperationBindingProcessor amqpOperationBindingProcessor(StringValueResolver stringValueResolver) {
return new AmqpOperationBindingProcessor(stringValueResolver);
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,12 @@
import io.github.springwolf.bindings.amqp.annotations.AmqpAsyncOperationBinding;
import io.github.springwolf.core.asyncapi.scanners.bindings.messages.MessageBindingProcessor;
import io.github.springwolf.core.asyncapi.scanners.bindings.messages.ProcessedMessageBinding;
import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.util.StringValueResolver;

import java.lang.reflect.AnnotatedElement;
import java.util.Arrays;
import java.util.Optional;

public class AmqpMessageBindingProcessor implements MessageBindingProcessor, EmbeddedValueResolverAware {
private StringValueResolver resolver;

@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
this.resolver = resolver;
}

public class AmqpMessageBindingProcessor implements MessageBindingProcessor {
@Override
public Optional<ProcessedMessageBinding> process(AnnotatedElement annotatedElement) {
return Arrays.stream(annotatedElement.getAnnotations())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,29 @@
import io.github.springwolf.bindings.amqp.annotations.AmqpAsyncOperationBinding;
import io.github.springwolf.core.asyncapi.scanners.bindings.operations.AbstractOperationBindingProcessor;
import io.github.springwolf.core.asyncapi.scanners.bindings.operations.ProcessedOperationBinding;
import org.springframework.util.StringValueResolver;

import java.util.Arrays;

public class AmqpOperationBindingProcessor extends AbstractOperationBindingProcessor<AmqpAsyncOperationBinding> {
public AmqpOperationBindingProcessor(StringValueResolver stringValueResolver) {
super(stringValueResolver);
}

@Override
protected ProcessedOperationBinding mapToOperationBinding(AmqpAsyncOperationBinding bindingAnnotation) {
AMQPOperationBinding amqpOperationBinding = AMQPOperationBinding.builder()
.expiration(bindingAnnotation.expiration())
.userId(resolveOrNull(bindingAnnotation.userId()))
.cc(Arrays.stream(bindingAnnotation.cc())
.map(this::resolveOrNull)
.toList())
.priority(bindingAnnotation.priority())
.deliveryMode(bindingAnnotation.deliveryMode())
.mandatory(bindingAnnotation.mandatory())
.bcc(Arrays.stream(bindingAnnotation.bcc())
.map(this::resolveOrNull)
.toList())
.timestamp(bindingAnnotation.timestamp())
.ack(bindingAnnotation.ack())
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,91 @@
import io.github.springwolf.asyncapi.v3.bindings.amqp.AMQPOperationBinding;
import io.github.springwolf.bindings.amqp.annotations.AmqpAsyncOperationBinding;
import io.github.springwolf.core.asyncapi.scanners.bindings.operations.ProcessedOperationBinding;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.util.StringValueResolver;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;

class AmqpOperationBindingProcessorTest {
private final AmqpOperationBindingProcessor processor = new AmqpOperationBindingProcessor();

@Test
void mapToOperationBindingTest() throws NoSuchMethodException {
AmqpAsyncOperationBinding annotation = AmqpOperationBindingProcessorTest.class
.getMethod("methodWithAnnotation")
.getAnnotation(AmqpAsyncOperationBinding.class);

ProcessedOperationBinding binding = processor.mapToOperationBinding(annotation);

assertThat(binding.getType()).isEqualTo("amqp");
assertThat(binding.getBinding())
.isEqualTo(AMQPOperationBinding.builder()
.cc(List.of())
.priority(0)
.deliveryMode(1)
.mandatory(false)
.timestamp(false)
.ack(false)
.build());
private final StringValueResolver stringValueResolver = mock(StringValueResolver.class);
private final AmqpOperationBindingProcessor processor = new AmqpOperationBindingProcessor(stringValueResolver);

@BeforeEach
void setUp() {
doAnswer(invocation -> invocation.getArgument(0))
.when(stringValueResolver)
.resolveStringValue(anyString());
}

@Nested
class EmptyAnnotation {
@Test
void mapToOperationBindingTest() throws NoSuchMethodException {
AmqpAsyncOperationBinding annotation = EmptyAnnotation.class
.getMethod("methodWithAnnotation")
.getAnnotation(AmqpAsyncOperationBinding.class);

ProcessedOperationBinding binding = processor.mapToOperationBinding(annotation);

assertThat(binding.getType()).isEqualTo("amqp");
assertThat(binding.getBinding())
.isEqualTo(AMQPOperationBinding.builder()
.cc(List.of())
.bcc(List.of())
.priority(0)
.deliveryMode(1)
.mandatory(false)
.timestamp(false)
.ack(false)
.build());
}

@AmqpAsyncOperationBinding
public void methodWithAnnotation() {}
}

@AmqpAsyncOperationBinding
public void methodWithAnnotation() {}
@Nested
class AllFieldsSetInAnnotation {
@Test
void mapToOperationBindingTest() throws NoSuchMethodException {
AmqpAsyncOperationBinding annotation = AllFieldsSetInAnnotation.class
.getMethod("methodWithAnnotation")
.getAnnotation(AmqpAsyncOperationBinding.class);

ProcessedOperationBinding binding = processor.mapToOperationBinding(annotation);

assertThat(binding.getType()).isEqualTo("amqp");
assertThat(binding.getBinding())
.isEqualTo(AMQPOperationBinding.builder()
.expiration(1)
.userId("userId")
.cc(List.of("cc1", "cc2"))
.priority(2)
.deliveryMode(3)
.mandatory(true)
.bcc(List.of("bcc1", "bcc2"))
.timestamp(true)
.ack(true)
.build());
}

@AmqpAsyncOperationBinding(
expiration = 1,
userId = "userId",
cc = {"cc1", "cc2"},
priority = 2,
deliveryMode = 3,
mandatory = true,
bcc = {"bcc1", "bcc2"},
timestamp = true,
ack = true)
public void methodWithAnnotation() {}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ dependencies {

implementation "org.apache.commons:commons-lang3:${commonsLang3Version}"

compileOnly "org.projectlombok:lombok:${lombokVersion}"
annotationProcessor "org.projectlombok:lombok:${lombokVersion}"

testImplementation "org.assertj:assertj-core:${assertjCoreVersion}"
testImplementation "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,12 @@
import io.github.springwolf.core.asyncapi.scanners.bindings.channels.ChannelBindingProcessor;
import io.github.springwolf.core.asyncapi.scanners.bindings.channels.ProcessedChannelBinding;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.util.StringValueResolver;

import java.lang.reflect.AnnotatedElement;
import java.util.Arrays;
import java.util.Optional;

public class GooglePubSubChannelBindingProcessor implements ChannelBindingProcessor, EmbeddedValueResolverAware {
private StringValueResolver resolver;

@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
this.resolver = resolver;
}

public class GooglePubSubChannelBindingProcessor implements ChannelBindingProcessor {
@Override
public Optional<ProcessedChannelBinding> process(AnnotatedElement annotatedElement) {
return Arrays.stream(annotatedElement.getAnnotations())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,12 @@
import io.github.springwolf.core.asyncapi.scanners.bindings.messages.MessageBindingProcessor;
import io.github.springwolf.core.asyncapi.scanners.bindings.messages.ProcessedMessageBinding;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.util.StringValueResolver;

import java.lang.reflect.AnnotatedElement;
import java.util.Arrays;
import java.util.Optional;

public class GooglePubSubMessageBindingProcessor implements MessageBindingProcessor, EmbeddedValueResolverAware {
private StringValueResolver resolver;

@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
this.resolver = resolver;
}
public class GooglePubSubMessageBindingProcessor implements MessageBindingProcessor {

@Override
public Optional<ProcessedMessageBinding> process(AnnotatedElement annotatedElement) {
Expand Down
4 changes: 4 additions & 0 deletions springwolf-bindings/springwolf-jms-binding/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,12 @@ dependencies {
implementation "org.springframework:spring-core"
implementation "org.springframework.boot:spring-boot-autoconfigure"

compileOnly "org.projectlombok:lombok:${lombokVersion}"
annotationProcessor "org.projectlombok:lombok:${lombokVersion}"

testImplementation "org.assertj:assertj-core:${assertjCoreVersion}"
testImplementation "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}"
testImplementation "org.mockito:mockito-core:${mockitoCoreVersion}"

testRuntimeOnly "org.junit.jupiter:junit-jupiter:${junitJupiterVersion}"
}
Expand Down
Loading

0 comments on commit 8826905

Please sign in to comment.