import 'package:jinja/jinja.dart' as jj; import 'package:apidash/utils/utils.dart' show getValidRequestUri, stripUriParams; import 'package:apidash/models/models.dart' show RequestModel; import 'package:apidash/consts.dart'; class JavaAsyncHttpClientGen { final String kStringStart = ''' import org.asynchttpclient.*; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.stream.Collectors; '''; final String kTemplateMultipartImport = ''' import java.util.Map; import java.util.HashMap; import org.asynchttpclient.request.body.multipart.StringPart; {% if hasFileInFormData %}import org.asynchttpclient.request.body.multipart.FilePart; {% endif %} '''; final String kStringMainClassMainMethodStart = ''' public class Main { public static void main(String[] args) { '''; final String kStringAsyncHttpClientTryBlockStart = ''' try (AsyncHttpClient asyncHttpClient = Dsl.asyncHttpClient()) { '''; final String kTemplateUrl = ''' String url = "{{url}}";\n '''; final String kTemplateRequestCreation = ''' BoundRequestBuilder requestBuilder = asyncHttpClient.prepare("{{ method|upper }}", url);\n '''; final String kTemplateUrlQueryParam = ''' requestBuilder{% for name, value in queryParams %} .addQueryParam("{{ name }}", "{{ value }}"){% endfor %};\n '''; final String kTemplateRequestHeader = ''' requestBuilder{% for name, value in headers %} .addHeader("{{ name }}", "{{ value }}"){% endfor %};\n '''; final String kTemplateMultipartTextFormData = ''' Map params = new HashMap<>() { { {% for param in params if param.type == "text" %} put("{{ param.name }}", "{{ param.value }}");{% endfor %} } }; for (String paramName : params.keySet()) { requestBuilder.addBodyPart(new StringPart( paramName, params.get(paramName) )); } '''; final String kTemplateMultipartFileHandling = ''' Map files = new HashMap<>() { { {% for field in fields if field.type == "file" %} put("{{ field.name }}", "{{ field.value }}");{% endfor %} } }; for (String paramName : files.keySet()) { File file = new File(files.get(paramName)); requestBuilder.addBodyPart(new FilePart( paramName, file, "application/octet-stream", StandardCharsets.UTF_8, file.getName() )); } '''; String kTemplateRequestBodyContent = ''' String bodyContent = """ {{body}}""";\n '''; String kStringRequestBodySetup = ''' requestBuilder.setBody(bodyContent); '''; final String kStringRequestEnd = ''' Future whenResponse = requestBuilder.execute(); Response response = whenResponse.get(); InputStream is = response.getResponseBodyAsStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); String respBody = br.lines().collect(Collectors.joining("\\n")); System.out.println(response.getStatusCode()); System.out.println(respBody); } catch (InterruptedException | ExecutionException | IOException ignored) { } } } '''; String? getCode( RequestModel requestModel, ) { try { String result = ''; bool hasBody = false; var rec = getValidRequestUri( requestModel.url, requestModel.enabledRequestParams, ); Uri? uri = rec.$1; if (uri == null) { return ""; } result += kStringStart; if (requestModel.hasFormData) { var templateMultipartImport = jj.Template(kTemplateMultipartImport); result += templateMultipartImport .render({"hasFileInFormData": requestModel.hasFileInFormData}); } result += kStringMainClassMainMethodStart; result += kStringAsyncHttpClientTryBlockStart; var url = stripUriParams(uri); // contains the HTTP method associated with the request var method = requestModel.method; // generating the URL to which the request has to be submitted var templateUrl = jj.Template(kTemplateUrl); result += templateUrl.render({"url": url}); // if request type is not form data, the request method can include // a body, and the body of the request is not null, in that case // we need to parse the body as it is, and write it to the body if (requestModel.hasTextData || requestModel.hasJsonData) { var templateBodyContent = jj.Template(kTemplateRequestBodyContent); result += templateBodyContent.render({"body": requestModel.requestBody}); hasBody = true; } var templateRequestCreation = jj.Template(kTemplateRequestCreation); result += templateRequestCreation.render({"method": method.name}); // setting up query parameters var params = uri.queryParameters; if (params.isNotEmpty) { var templateUrlQueryParam = jj.Template(kTemplateUrlQueryParam); result += templateUrlQueryParam.render({"queryParams": params}); } var headers = requestModel.enabledHeadersMap; if (hasBody && !requestModel.hasContentTypeHeader) { headers[kHeaderContentType] = requestModel.requestBodyContentType.header; } // setting up rest of the request headers if (headers.isNotEmpty) { var templateRequestHeader = jj.Template(kTemplateRequestHeader); result += templateRequestHeader.render({"headers": headers}); } // handling form data if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty && kMethodsWithBody.contains(method)) { var formDataList = requestModel.formDataMapList; int textCount = 0; for (var formData in formDataList) { if (formData["type"] == "text") { textCount++; } } if (textCount > 0) { var templateRequestFormData = jj.Template(kTemplateMultipartTextFormData); result += templateRequestFormData.render({ "params": formDataList, }); } if (requestModel.hasFileInFormData) { var templateFileHandling = jj.Template(kTemplateMultipartFileHandling); result += templateFileHandling.render({ "fields": formDataList, }); } } if (hasBody) { result += kStringRequestBodySetup; } result += kStringRequestEnd; return result; } catch (e) { return null; } } }