Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(core): split payload service #796

Merged
merged 3 commits into from
Jun 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@
import io.github.springwolf.core.asyncapi.scanners.bindings.operations.OperationBindingProcessor;
import io.github.springwolf.core.asyncapi.scanners.classes.ClassScanner;
import io.github.springwolf.core.asyncapi.scanners.common.AsyncAnnotationScanner;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadAsyncOperationService;
import io.github.springwolf.core.asyncapi.scanners.common.utils.AsyncAnnotationUtil;
import io.github.springwolf.core.configuration.docket.AsyncApiDocketService;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -36,14 +35,12 @@ public AsyncAnnotationChannelsScanner(
ClassScanner classScanner,
ComponentsService componentsService,
AsyncApiDocketService asyncApiDocketService,
PayloadClassExtractor payloadClassExtractor,
PayloadService payloadService,
PayloadAsyncOperationService payloadAsyncOperationService,
List<OperationBindingProcessor> operationBindingProcessors,
List<MessageBindingProcessor> messageBindingProcessors) {
super(
asyncAnnotationProvider,
payloadClassExtractor,
payloadService,
payloadAsyncOperationService,
componentsService,
operationBindingProcessors,
messageBindingProcessors);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import io.github.springwolf.core.asyncapi.scanners.common.ClassLevelAnnotationScanner;
import io.github.springwolf.core.asyncapi.scanners.common.headers.AsyncHeadersBuilder;
import io.github.springwolf.core.asyncapi.scanners.common.headers.HeaderClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadMethodService;
import io.github.springwolf.core.asyncapi.scanners.common.utils.AnnotationScannerUtil;
import lombok.extern.slf4j.Slf4j;

Expand All @@ -31,15 +31,15 @@ public SpringAnnotationClassLevelChannelsScanner(
Class<MethodAnnotation> methodAnnotationClass,
BindingFactory<ClassAnnotation> bindingFactory,
AsyncHeadersBuilder asyncHeadersBuilder,
PayloadService payloadService,
PayloadMethodService payloadMethodService,
HeaderClassExtractor headerClassExtractor,
ComponentsService componentsService) {
super(
classAnnotationClass,
methodAnnotationClass,
bindingFactory,
asyncHeadersBuilder,
payloadService,
payloadMethodService,
headerClassExtractor,
componentsService);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import io.github.springwolf.core.asyncapi.scanners.common.headers.AsyncHeadersBuilder;
import io.github.springwolf.core.asyncapi.scanners.common.headers.HeaderClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.NamedSchemaObject;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadMethodService;
import io.github.springwolf.core.asyncapi.scanners.common.utils.AnnotationScannerUtil;
import lombok.extern.slf4j.Slf4j;

Expand All @@ -28,19 +28,19 @@ public class SpringAnnotationMethodLevelChannelsScanner<MethodAnnotation extends
extends MethodLevelAnnotationScanner<MethodAnnotation> implements SpringAnnotationChannelsScannerDelegator {

private final Class<MethodAnnotation> methodAnnotationClass;
private final PayloadService payloadService;
private final PayloadMethodService payloadMethodService;
private final HeaderClassExtractor headerClassExtractor;

public SpringAnnotationMethodLevelChannelsScanner(
Class<MethodAnnotation> methodAnnotationClass,
BindingFactory<MethodAnnotation> bindingFactory,
AsyncHeadersBuilder asyncHeadersBuilder,
PayloadService payloadService,
PayloadMethodService payloadMethodService,
HeaderClassExtractor headerClassExtractor,
ComponentsService componentsService) {
super(bindingFactory, asyncHeadersBuilder, componentsService);
this.methodAnnotationClass = methodAnnotationClass;
this.payloadService = payloadService;
this.payloadMethodService = payloadMethodService;
this.headerClassExtractor = headerClassExtractor;
}

Expand All @@ -62,7 +62,7 @@ private Map.Entry<String, ChannelObject> mapMethodToChannel(Method method) {

MethodAnnotation annotation = AnnotationScannerUtil.findAnnotationOrThrow(methodAnnotationClass, method);

NamedSchemaObject payloadSchema = payloadService.extractSchema(method);
NamedSchemaObject payloadSchema = payloadMethodService.extractSchema(method);
SchemaObject headerSchema = headerClassExtractor.extractHeader(method, payloadSchema);
ChannelObject channelItem = buildChannelItem(annotation, payloadSchema, headerSchema);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@
import io.github.springwolf.core.asyncapi.scanners.bindings.messages.MessageBindingProcessor;
import io.github.springwolf.core.asyncapi.scanners.bindings.operations.OperationBindingProcessor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.NamedSchemaObject;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadAsyncOperationService;
import io.github.springwolf.core.asyncapi.scanners.common.utils.AnnotationScannerUtil;
import io.github.springwolf.core.asyncapi.scanners.common.utils.AsyncAnnotationUtil;
import io.github.springwolf.core.asyncapi.scanners.common.utils.TextUtils;
Expand All @@ -43,8 +42,7 @@
public abstract class AsyncAnnotationScanner<A extends Annotation> implements EmbeddedValueResolverAware {

protected final AsyncAnnotationProvider<A> asyncAnnotationProvider;
protected final PayloadClassExtractor payloadClassExtractor;
protected final PayloadService payloadService;
protected final PayloadAsyncOperationService payloadAsyncOperationService;
protected final ComponentsService componentsService;
protected final List<OperationBindingProcessor> operationBindingProcessors;
protected final List<MessageBindingProcessor> messageBindingProcessors;
Expand Down Expand Up @@ -92,7 +90,7 @@ protected Operation buildOperation(AsyncOperation asyncOperation, Method method,
}

protected MessageObject buildMessage(AsyncOperation operationData, Method method) {
NamedSchemaObject payloadSchema = payloadService.extractSchema(operationData, method);
NamedSchemaObject payloadSchema = payloadAsyncOperationService.extractSchema(operationData, method);

SchemaObject headerSchema = AsyncAnnotationUtil.getAsyncHeaders(operationData, resolver);
String headerSchemaName = this.componentsService.registerSchema(headerSchema);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import io.github.springwolf.core.asyncapi.scanners.common.headers.AsyncHeadersBuilder;
import io.github.springwolf.core.asyncapi.scanners.common.headers.HeaderClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.NamedSchemaObject;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadMethodService;
import io.github.springwolf.core.asyncapi.scanners.common.utils.AnnotationScannerUtil;
import io.github.springwolf.core.asyncapi.scanners.operations.annotations.SpringAnnotationClassLevelOperationsScanner;
import io.github.springwolf.core.asyncapi.schemas.SchemaObjectMerger;
Expand All @@ -40,7 +40,7 @@ public abstract class ClassLevelAnnotationScanner<
protected final Class<MethodAnnotation> methodAnnotationClass;
protected final BindingFactory<ClassAnnotation> bindingFactory;
protected final AsyncHeadersBuilder asyncHeadersBuilder;
protected final PayloadService payloadService;
protected final PayloadMethodService payloadMethodService;
protected final HeaderClassExtractor headerClassExtractor;
protected final ComponentsService componentsService;

Expand Down Expand Up @@ -71,7 +71,7 @@ protected Map<String, MessageReference> buildMessages(
SpringAnnotationClassLevelOperationsScanner.MessageType messageType) {
Set<MessageObject> messages = methods.stream()
.map((Method method) -> {
NamedSchemaObject payloadSchema = payloadService.extractSchema(method);
NamedSchemaObject payloadSchema = payloadMethodService.extractSchema(method);
SchemaObject headerSchema = headerClassExtractor.extractHeader(method, payloadSchema);
return buildMessage(classAnnotation, payloadSchema, headerSchema);
})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// SPDX-License-Identifier: Apache-2.0
package io.github.springwolf.core.asyncapi.scanners.common.payload;

import io.github.springwolf.core.asyncapi.annotations.AsyncOperation;
import io.github.springwolf.core.asyncapi.scanners.common.payload.internal.PayloadClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.internal.PayloadService;
import lombok.RequiredArgsConstructor;

import java.lang.reflect.Method;
import java.util.Optional;

@RequiredArgsConstructor
public class PayloadAsyncOperationService {
private final PayloadClassExtractor payloadClassExtractor;
private final PayloadService payloadService;

public NamedSchemaObject extractSchema(AsyncOperation operationData, Method method) {
Optional<Class<?>> payloadType = operationData.payloadType() != Object.class
? Optional.of(operationData.payloadType())
: payloadClassExtractor.extractFrom(method);

String contentType = operationData.message().contentType();

return payloadType
.map((type) -> payloadService.buildSchema(contentType, type))
.orElseGet(payloadService::useUnusedPayload);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// SPDX-License-Identifier: Apache-2.0
package io.github.springwolf.core.asyncapi.scanners.common.payload;

import io.github.springwolf.core.asyncapi.scanners.common.payload.internal.PayloadClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.internal.PayloadService;
import lombok.RequiredArgsConstructor;

import java.lang.reflect.Method;
import java.util.Optional;

@RequiredArgsConstructor
public class PayloadMethodParameterService implements PayloadMethodService {
private final PayloadClassExtractor payloadClassExtractor;
private final PayloadService payloadService;

public NamedSchemaObject extractSchema(Method method) {
Optional<Class<?>> payloadType = payloadClassExtractor.extractFrom(method);

return payloadType.map(payloadService::buildSchema).orElseGet(payloadService::useUnusedPayload);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// SPDX-License-Identifier: Apache-2.0
package io.github.springwolf.core.asyncapi.scanners.common.payload;

import io.github.springwolf.core.asyncapi.scanners.common.payload.internal.PayloadService;
import lombok.RequiredArgsConstructor;

import java.lang.reflect.Method;

@RequiredArgsConstructor
public class PayloadMethodReturnService implements PayloadMethodService {
private final PayloadService payloadService;

@Override
public NamedSchemaObject extractSchema(Method method) {
return payloadService.buildSchema(method.getReturnType());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// SPDX-License-Identifier: Apache-2.0
package io.github.springwolf.core.asyncapi.scanners.common.payload;

import java.lang.reflect.Method;

public interface PayloadMethodService {
NamedSchemaObject extractSchema(Method method);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: Apache-2.0
package io.github.springwolf.core.asyncapi.scanners.common.payload;
package io.github.springwolf.core.asyncapi.scanners.common.payload.internal;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,56 +1,37 @@
// SPDX-License-Identifier: Apache-2.0
package io.github.springwolf.core.asyncapi.scanners.common.payload;
package io.github.springwolf.core.asyncapi.scanners.common.payload.internal;

import io.github.springwolf.asyncapi.v3.model.schema.SchemaObject;
import io.github.springwolf.core.asyncapi.annotations.AsyncOperation;
import io.github.springwolf.core.asyncapi.components.ComponentsService;
import io.github.springwolf.core.asyncapi.scanners.common.payload.NamedSchemaObject;
import io.github.springwolf.core.configuration.properties.SpringwolfConfigProperties;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.Optional;

@Slf4j
@RequiredArgsConstructor
public class PayloadService {
private final PayloadClassExtractor payloadClassExtractor;
private final ComponentsService componentsService;
private final SpringwolfConfigProperties properties;

private static final String PAYLOAD_NOT_USED_KEY = "PayloadNotUsed";
static final NamedSchemaObject PAYLOAD_NOT_USED = new NamedSchemaObject(
public static final NamedSchemaObject PAYLOAD_NOT_USED = new NamedSchemaObject(
PAYLOAD_NOT_USED_KEY,
SchemaObject.builder()
.title(PAYLOAD_NOT_USED_KEY)
.description("No payload specified")
.properties(Map.of())
.build());

public NamedSchemaObject extractSchema(Method method) {
Optional<Class<?>> payloadType = payloadClassExtractor.extractFrom(method);

return payloadType.map(this::buildSchema).orElseGet(this::useUnusedPayload);
}

public NamedSchemaObject extractSchema(AsyncOperation operationData, Method method) {
Optional<Class<?>> payloadType = operationData.payloadType() != Object.class
? Optional.of(operationData.payloadType())
: payloadClassExtractor.extractFrom(method);

String contentType = operationData.message().contentType();

return payloadType.map((type) -> buildSchema(contentType, type)).orElseGet(this::useUnusedPayload);
}

private NamedSchemaObject buildSchema(Class<?> payloadType) {
public NamedSchemaObject buildSchema(Class<?> payloadType) {
String contentType = properties.getDocket().getDefaultContentType();

return buildSchema(contentType, payloadType);
}

private NamedSchemaObject buildSchema(String contentType, Class<?> payloadType) {
public NamedSchemaObject buildSchema(String contentType, Class<?> payloadType) {
String componentsSchemaName = this.componentsService.registerSchema(payloadType, contentType);

SchemaObject schema = componentsService.resolveSchema(componentsSchemaName);
Expand All @@ -61,18 +42,11 @@ private NamedSchemaObject buildSchema(String contentType, Class<?> payloadType)
return new NamedSchemaObject(componentsSchemaName, schema);
}

public String extractSchemaForName(Class<?> payloadType) {
String contentType = properties.getDocket().getDefaultContentType();

return this.componentsService.registerSchema(payloadType, contentType);
}

private NamedSchemaObject useUnusedPayload() {
public NamedSchemaObject useUnusedPayload() {
SchemaObject schema = PAYLOAD_NOT_USED.schema();
if (schema != null) {
this.componentsService.registerSchema(schema);
}

return PAYLOAD_NOT_USED;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: Apache-2.0
package io.github.springwolf.core.asyncapi.scanners.common.payload;
package io.github.springwolf.core.asyncapi.scanners.common.payload.internal;

import io.github.springwolf.core.configuration.properties.SpringwolfConfigProperties;
import lombok.extern.slf4j.Slf4j;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@
import io.github.springwolf.core.asyncapi.scanners.bindings.operations.OperationBindingProcessor;
import io.github.springwolf.core.asyncapi.scanners.classes.ClassScanner;
import io.github.springwolf.core.asyncapi.scanners.common.AsyncAnnotationScanner;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadAsyncOperationService;
import io.github.springwolf.core.asyncapi.scanners.operations.OperationMerger;
import lombok.extern.slf4j.Slf4j;

Expand All @@ -28,14 +27,12 @@ public AsyncAnnotationOperationsScanner(
AsyncAnnotationProvider<A> asyncAnnotationProvider,
ClassScanner classScanner,
ComponentsService componentsService,
PayloadClassExtractor payloadClassExtractor,
PayloadService payloadService,
PayloadAsyncOperationService payloadAsyncOperationService,
List<OperationBindingProcessor> operationBindingProcessors,
List<MessageBindingProcessor> messageBindingProcessors) {
super(
asyncAnnotationProvider,
payloadClassExtractor,
payloadService,
payloadAsyncOperationService,
componentsService,
operationBindingProcessors,
messageBindingProcessors);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import io.github.springwolf.core.asyncapi.scanners.common.ClassLevelAnnotationScanner;
import io.github.springwolf.core.asyncapi.scanners.common.headers.AsyncHeadersBuilder;
import io.github.springwolf.core.asyncapi.scanners.common.headers.HeaderClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadMethodService;
import io.github.springwolf.core.asyncapi.scanners.common.utils.AnnotationScannerUtil;
import lombok.extern.slf4j.Slf4j;

Expand All @@ -33,15 +33,15 @@ public SpringAnnotationClassLevelOperationsScanner(
Class<MethodAnnotation> methodAnnotationClass,
BindingFactory<ClassAnnotation> bindingFactory,
AsyncHeadersBuilder asyncHeadersBuilder,
PayloadService payloadService,
PayloadMethodService payloadMethodService,
HeaderClassExtractor headerClassExtractor,
ComponentsService componentsService) {
super(
classAnnotationClass,
methodAnnotationClass,
bindingFactory,
asyncHeadersBuilder,
payloadService,
payloadMethodService,
headerClassExtractor,
componentsService);
}
Expand Down
Loading