@Override public void process(OperationGenerator operationGenerator, int paramIdx) { InvocationContextParameter parameter = new InvocationContextParameter(); operationGenerator.addProviderParameter(parameter); } }
@Override public void process(Object annotation, OperationGenerator operationGenerator) { DeleteMapping mappingAnnotation = (DeleteMapping) annotation; Operation operation = operationGenerator.getOperation(); // path/value是等同的 this.processPath(mappingAnnotation.path(), operationGenerator); this.processPath(mappingAnnotation.value(), operationGenerator); this.processMethod(RequestMethod.DELETE, operationGenerator); this.processConsumes(mappingAnnotation.consumes(), operation); this.processProduces(mappingAnnotation.produces(), operation); if (StringUtils.isEmpty(operationGenerator.getHttpMethod()) && StringUtils.isEmpty(operationGenerator.getSwaggerGenerator().getHttpMethod())) { throw new Error("HttpMethod must not both be empty in class and method"); } } }
protected void setParameterType(OperationGenerator operationGenerator, int paramIdx, T parameter) { ParamUtils.setParameterType(operationGenerator.getSwagger(), operationGenerator.getProviderMethod(), paramIdx, parameter); }
protected void correctHttpMethod(OperationGenerator operationGenerator) { if (StringUtils.isEmpty(operationGenerator.getHttpMethod())) { operationGenerator.setHttpMethod(HttpMethod.POST); } }
protected void correctPath(OperationGenerator operationGenerator) { String path = operationGenerator.getPath(); if (StringUtils.isEmpty(path)) { path = "/" + operationGenerator.getOperation().getOperationId(); } operationGenerator.setPath(path); }
@Override public void process(OperationGenerator operationGenerator, int paramIdx) { String paramName = ParamUtils.getParameterName(operationGenerator.getProviderMethod(), paramIdx); QueryParameter queryParameter = new QueryParameter(); queryParameter.setName(paramName); ParamUtils.setParameterType(operationGenerator.getSwagger(), operationGenerator.getProviderMethod(), paramIdx, queryParameter); operationGenerator.addProviderParameter(queryParameter); } }
@Override public void process(OperationGenerator operationGenerator, int paramIdx) { FormParameter parameter = new FormParameter(); parameter.setType(new FileProperty().getType()); parameter.setName(ParamUtils.getParameterName(operationGenerator.getProviderMethod(), paramIdx)); operationGenerator.addProviderParameter(parameter); } }
@Override public void process(Object annotation, OperationGenerator operationGenerator) { ApiOperation apiOperationAnnotation = (ApiOperation) annotation; Operation operation = operationGenerator.getOperation(); operationGenerator.setHttpMethod(apiOperationAnnotation.httpMethod()); if (!StringUtils.isEmpty(apiOperationAnnotation.value())) { operation.setSummary(apiOperationAnnotation.value()); } if (!StringUtils.isEmpty(apiOperationAnnotation.notes())) { operation.setDescription(apiOperationAnnotation.notes()); } operation.setOperationId(apiOperationAnnotation.nickname()); operation.getVendorExtensions().putAll(BaseReaderUtils.parseExtensions(apiOperationAnnotation.extensions())); convertTags(apiOperationAnnotation.tags(), operation); convertProduces(apiOperationAnnotation.produces(), operation); convertConsumes(apiOperationAnnotation.consumes(), operation); convertProtocols(apiOperationAnnotation.protocols(), operation); AnnotationUtils.addResponse(operationGenerator.getSwagger(), operation, apiOperationAnnotation); // responseReference未解析 // hidden未解析 // authorizations未解析 }
@Override public void process(Object annotation, OperationGenerator operationGenerator) { // swagger号称不允许独立使用这个标注,不过支持独立使用,也没什么后果 ApiResponse apiResponse = (ApiResponse) annotation; AnnotationUtils.addResponse(operationGenerator.getSwagger(), operationGenerator.getOperation(), apiResponse); } }
protected void scanMethods() { // 有时方法顺序不同,很不利于测试,所以先排序 List<Method> methods = Arrays.asList(cls.getMethods()); methods.sort(Comparator.comparing(Method::getName)); for (Method method : methods) { if (isSkipMethod(method)) { continue; } OperationGenerator operationGenerator = new OperationGenerator(this, method); operationGenerator.setHttpMethod(httpMethod); try { operationGenerator.generate(); } catch (Throwable e) { String msg = String.format("generate operation swagger failed, %s:%s", this.cls.getName(), method.getName()); throw new Error(msg, e); } String operationId = operationGenerator.getOperation().getOperationId(); if (operationGeneratorMap.containsKey(operationId)) { throw new Error(String.format("OperationId must be unique. %s:%s", cls.getName(), method.getName())); } operationGeneratorMap.put(operationId, operationGenerator); } }
@JsonIgnore public Method getMethod() { return operationGenerator.getProviderMethod(); }
protected void mergeBodyBasedParameters(OperationGenerator operationGenerator, List<BodyParameter> bodyParameters) { List<Parameter> swaggerParameters = operationGenerator.getSwaggerParameters(); swaggerParameters.removeAll(bodyParameters); // 将这些body包装为一个class,整体做为一个body参数 String bodyParamName = ParamUtils.generateBodyParameterName(operationGenerator.getProviderMethod()); Class<?> cls = ClassUtils.getOrCreateBodyClass(operationGenerator, bodyParameters); BodyParameter bodyParameter = ParamUtils.createBodyParameter(operationGenerator.getSwagger(), bodyParamName, cls); swaggerParameters.add(bodyParameter); }
protected void processPath(String[] paths, OperationGenerator operationGenerator) { if (null == paths || paths.length == 0) { return; } // swagger仅支持配一个path,否则将会出现重复的operationId if (paths.length > 1) { throw new Error(String.format("not allowed multi path for %s:%s", operationGenerator.getProviderMethod().getDeclaringClass().getName(), operationGenerator.getProviderMethod().getName())); } operationGenerator.setPath(paths[0]); }
public static Class<?> getOrCreateBodyClass(OperationGenerator operationGenerator, List<BodyParameter> bodyParameters) { SwaggerGenerator swaggerGenerator = operationGenerator.getSwaggerGenerator(); Method method = operationGenerator.getProviderMethod(); String clsName = swaggerGenerator.ensureGetPackageName() + "." + method.getName() + "Body"; Class<?> cls = getClassByName(swaggerGenerator.getClassLoader(), clsName); if (cls != null) { return cls; } ClassConfig classConfig = new ClassConfig(); classConfig.setClassName(clsName); // 1.全是预备body // 2.预备body与明确body混合 SwaggerToClassGenerator classGenerator = new SwaggerToClassGenerator(swaggerGenerator.getClassLoader(), swaggerGenerator.getSwagger(), swaggerGenerator.ensureGetPackageName()); for (BodyParameter bp : bodyParameters) { JavaType javaType = ConverterMgr.findJavaType(classGenerator, bp); classConfig.addField(bp.getName(), javaType); } return JavassistUtils.createClass(swaggerGenerator.getClassLoader(), classConfig); }
@Override public void process(Object annotation, OperationGenerator operationGenerator) { Consumes consumes = (Consumes) annotation; List<String> consumeList = Arrays.stream(consumes.value()).filter(s -> !StringUtils.isEmpty(s)) .collect(Collectors.toList()); if (!consumeList.isEmpty()) { operationGenerator.getOperation().setConsumes(consumeList); } } }
@Override public void process(Object annotation, OperationGenerator operationGenerator) { Annotation httpMethodAnnotation = (Annotation) annotation; HttpMethod httpMethod = httpMethodAnnotation.annotationType().getAnnotation(HttpMethod.class); operationGenerator.setHttpMethod(httpMethod.value()); } }
/** * Generate swagger parameter, set default value, and return it. * * @param operationGenerator operationGenerator * @param fieldAnnotation JAX-RS param annotation * @param genericParamType type of the parameter * @param defaultValue default value, can be null * @return the generated swagger Parameter */ private Parameter setUpParameter( OperationGenerator operationGenerator, Annotation fieldAnnotation, Type genericParamType, String defaultValue) { AbstractSerializableParameter<?> parameter = createParameter( operationGenerator.getContext(), fieldAnnotation, genericParamType); if (null != defaultValue) { parameter.setDefaultValue(defaultValue); } return parameter; }
protected void checkPath(OperationGenerator operationGenerator) { if (StringUtils.isEmpty(operationGenerator.getPath()) && StringUtils.isEmpty(operationGenerator.getSwagger().getBasePath())) { throw new Error("Path must not both be empty in class and method"); } } }
@Override public void process(Object annotation, OperationGenerator operationGenerator) { ApiImplicitParam paramAnnotation = (ApiImplicitParam) annotation; Parameter parameter = AnnotationUtils.createParameter(operationGenerator.getSwagger(), paramAnnotation); operationGenerator.addMethodAnnotationParameter(parameter); } }