Skip to content

Commit

Permalink
[SCB-2058] make RequestPartAnnotationProcessor extend AbstractSpringm…
Browse files Browse the repository at this point in the history
…vcSerializableParameterProcessor
  • Loading branch information
yhs0092 authored and liubao68 committed Aug 5, 2020
1 parent 09746aa commit cb47f4c
Showing 1 changed file with 7 additions and 40 deletions.
Expand Up @@ -19,22 +19,13 @@

import java.lang.reflect.Type;

import org.apache.servicecomb.swagger.generator.ParameterProcessor;
import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
import org.springframework.web.bind.annotation.RequestPart;

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.type.TypeFactory;

import io.swagger.converter.ModelConverters;
import io.swagger.models.Operation;
import io.swagger.models.Swagger;
import io.swagger.models.parameters.FormParameter;
import io.swagger.models.properties.ArrayProperty;
import io.swagger.models.properties.Property;

public class RequestPartAnnotationProcessor implements
ParameterProcessor<FormParameter, RequestPart> {
public class RequestPartAnnotationProcessor extends
AbstractSpringmvcSerializableParameterProcessor<FormParameter, RequestPart> {
@Override
public Type getProcessType() {
return RequestPart.class;
Expand All @@ -55,36 +46,12 @@ public HttpParameterType getHttpParameterType(RequestPart parameterAnnotation) {
}

@Override
public void fillParameter(Swagger swagger, Operation operation, FormParameter formParameter, Type type,
RequestPart requestPart) {
Property property = resolveParamProperty(type);

formParameter.setProperty(property);
formParameter.setRequired(requestPart.required());
protected boolean readRequired(RequestPart requestPart) {
return requestPart.required();
}

private Property resolveParamProperty(Type type) {
JavaType javaType = TypeFactory.defaultInstance().constructType(type);
if (javaType.isContainerType()) {
return resolvePropertyAsContainerType(javaType);
}
return ModelConverters.getInstance().readAsProperty(type);
}

private Property resolvePropertyAsContainerType(JavaType javaType) {
// At present, only array and collection of Part params are supported,
// but Map type is also a kind of container type.
// Although Map is not supported now, we still consider to take the type of value to generate a property.
// Therefore, here we use lastContainedTypeIndex to get the contained type.
int lastContainedTypeIndex = javaType.containedTypeCount() - 1;
JavaType containedItemType;
if (lastContainedTypeIndex < 0) {
// javaType may be an array
containedItemType = javaType.getContentType();
} else {
containedItemType = javaType.containedType(lastContainedTypeIndex);
}
Property containedItemProperty = ModelConverters.getInstance().readAsProperty(containedItemType);
return new ArrayProperty(containedItemProperty);
@Override
protected String pureReadDefaultValue(RequestPart requestPart) {
return null;
}
}

0 comments on commit cb47f4c

Please sign in to comment.