// Path: src/main/java/cn/readen/relay/common/JsonParser.java
// public class JsonParser {
//     private ObjectMapper objectMapper = new ObjectMapper();
//     private ObjectReader objectReader=objectMapper.reader();
//     private  static JsonParser instance;
// 
//     private JsonParser(){}
// 
//     public static  JsonParser me(){
//         if(instance==null){
//             synchronized (JsonParser.class){
//                 instance=new JsonParser();
//             }
//         }
//         return instance;
//     }
// 
//     public  static ObjectMapper getObjectMapper(){
//         return me().objectMapper;
//     }
// 
//     public  static ObjectReader getObjectReader(){
//         return me().objectReader;
//     }
// 
//     public String toJson(Object obj){
//         try {
// 
//             return objectMapper.writeValueAsString(obj);
//         } catch (Exception e) {
//             throw e instanceof RuntimeException ? (RuntimeException)e : new RuntimeException(e);
//         }
//     }
// 
// }
// 
// Path: src/main/java/cn/readen/relay/model/ApiConfig.java
// public class ApiConfig {
//     private String apiName;
//     private String host;
//     private String basePath;
//     private String localPath;
//     private String appKey;
//     private String appSecret;
//     private ApiMethod[] apiMethods;
// 
//     public String getApiName() {
//         return apiName;
//     }
// 
//     public void setApiName(String apiName) {
//         this.apiName = apiName;
//     }
// 
//     public String getHost() {
//         return host;
//     }
// 
//     public void setHost(String host) {
//         this.host = host;
//     }
// 
//     public String getBasePath() {
//         return basePath;
//     }
// 
//     public void setBasePath(String basePath) {
//         this.basePath = basePath;
//     }
// 
//     public String getLocalPath() {
//         return localPath;
//     }
// 
//     public void setLocalPath(String localPath) {
//         this.localPath = localPath;
//     }
// 
//     public String getAppKey() {
//         return appKey;
//     }
// 
//     public void setAppKey(String appKey) {
//         this.appKey = appKey;
//     }
// 
//     public String getAppSecret() {
//         return appSecret;
//     }
// 
//     public void setAppSecret(String appSecret) {
//         this.appSecret = appSecret;
//     }
// 
//     public ApiMethod[] getApiMethods() {
//         return apiMethods;
//     }
// 
//     public void setApiMethods(ApiMethod[] apiMethods) {
//         this.apiMethods = apiMethods;
//     }
// }
// 
// Path: src/main/java/cn/readen/relay/model/ApiMethod.java
// public class ApiMethod {
//     private String name;
//     private String httpMethod;
//     private ApiParam[] urlParams;
//     private ApiParam[] headerParams;
//     private int cacheExpireTime;
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getHttpMethod() {
//         return httpMethod;
//     }
// 
//     public void setHttpMethod(String httpMethod) {
//         this.httpMethod = httpMethod;
//     }
// 
//     public ApiParam[] getUrlParams() {
//         return urlParams;
//     }
// 
//     public void setUrlParams(ApiParam[] urlParams) {
//         this.urlParams = urlParams;
//     }
// 
//     public ApiParam[] getHeaderParams() {
//         return headerParams;
//     }
// 
//     public void setHeaderParams(ApiParam[] headerParams) {
//         this.headerParams = headerParams;
//     }
// 
//     public int getCacheExpireTime() {
//         return cacheExpireTime;
//     }
// 
//     public void setCacheExpireTime(int cacheExpireTime) {
//         this.cacheExpireTime = cacheExpireTime;
//     }
// }


import cn.readen.relay.common.JsonParser;
import cn.readen.relay.generator.*;
import cn.readen.relay.model.ApiConfig;
import cn.readen.relay.model.ApiMethod;
import com.jfinal.config.Routes;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
    public void generateSource(PrintStream out, String apiName) {
        ApiConfig config = getConfig(apiName);
        JClass jClass = new JClass(getClassName(apiName), packageName);
        jClass.setExtends(BaseController.class);
        jClass.add(new JImport(ApiGenerator.class));
        jClass.add(new JImport(ApiConfig.class));
        jClass.add(new JImport(ApiMethod.class));
        ApiMethod[] apiMethods = config.getApiMethods();
        for (int j = 0; j < apiMethods.length; j++) {
            JMethodBody methodBody = new JMethodBody();
            methodBody.append("ApiConfig apiConfig= ApiGenerator.me().getConfig(\"" + apiName + "\");");
            methodBody.append("ApiMethod method=apiConfig.getApiMethods()[" + j + "];");
            methodBody.append("handle(apiConfig,method);");
            JMethod method = new JMethod(Modifier.PUBLIC, false,
                    apiMethods[j].getName(), "void", methodBody);
            jClass.add(method);
        }
        jClass.print(out, 0);
    }


    @Override
    public ApiConfig getConfig(String apiName) {
        if (apiConfigs.get(apiName) == null) {
            String fileName = apiName + ".json";
            InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            String jsonConfig = CommentRemover.removeComments(inputStreamReader);
//        System.out.println(jsonConfig);
            try {
// Path: src/main/java/cn/readen/relay/common/JsonParser.java
// public class JsonParser {
//     private ObjectMapper objectMapper = new ObjectMapper();
//     private ObjectReader objectReader=objectMapper.reader();
//     private  static JsonParser instance;
// 
//     private JsonParser(){}
// 
//     public static  JsonParser me(){
//         if(instance==null){
//             synchronized (JsonParser.class){
//                 instance=new JsonParser();
//             }
//         }
//         return instance;
//     }
// 
//     public  static ObjectMapper getObjectMapper(){
//         return me().objectMapper;
//     }
// 
//     public  static ObjectReader getObjectReader(){
//         return me().objectReader;
//     }
// 
//     public String toJson(Object obj){
//         try {
// 
//             return objectMapper.writeValueAsString(obj);
//         } catch (Exception e) {
//             throw e instanceof RuntimeException ? (RuntimeException)e : new RuntimeException(e);
//         }
//     }
// 
// }
// 
// Path: src/main/java/cn/readen/relay/model/ApiConfig.java
// public class ApiConfig {
//     private String apiName;
//     private String host;
//     private String basePath;
//     private String localPath;
//     private String appKey;
//     private String appSecret;
//     private ApiMethod[] apiMethods;
// 
//     public String getApiName() {
//         return apiName;
//     }
// 
//     public void setApiName(String apiName) {
//         this.apiName = apiName;
//     }
// 
//     public String getHost() {
//         return host;
//     }
// 
//     public void setHost(String host) {
//         this.host = host;
//     }
// 
//     public String getBasePath() {
//         return basePath;
//     }
// 
//     public void setBasePath(String basePath) {
//         this.basePath = basePath;
//     }
// 
//     public String getLocalPath() {
//         return localPath;
//     }
// 
//     public void setLocalPath(String localPath) {
//         this.localPath = localPath;
//     }
// 
//     public String getAppKey() {
//         return appKey;
//     }
// 
//     public void setAppKey(String appKey) {
//         this.appKey = appKey;
//     }
// 
//     public String getAppSecret() {
//         return appSecret;
//     }
// 
//     public void setAppSecret(String appSecret) {
//         this.appSecret = appSecret;
//     }
// 
//     public ApiMethod[] getApiMethods() {
//         return apiMethods;
//     }
// 
//     public void setApiMethods(ApiMethod[] apiMethods) {
//         this.apiMethods = apiMethods;
//     }
// }
// 
// Path: src/main/java/cn/readen/relay/model/ApiMethod.java
// public class ApiMethod {
//     private String name;
//     private String httpMethod;
//     private ApiParam[] urlParams;
//     private ApiParam[] headerParams;
//     private int cacheExpireTime;
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getHttpMethod() {
//         return httpMethod;
//     }
// 
//     public void setHttpMethod(String httpMethod) {
//         this.httpMethod = httpMethod;
//     }
// 
//     public ApiParam[] getUrlParams() {
//         return urlParams;
//     }
// 
//     public void setUrlParams(ApiParam[] urlParams) {
//         this.urlParams = urlParams;
//     }
// 
//     public ApiParam[] getHeaderParams() {
//         return headerParams;
//     }
// 
//     public void setHeaderParams(ApiParam[] headerParams) {
//         this.headerParams = headerParams;
//     }
// 
//     public int getCacheExpireTime() {
//         return cacheExpireTime;
//     }
// 
//     public void setCacheExpireTime(int cacheExpireTime) {
//         this.cacheExpireTime = cacheExpireTime;
//     }
// }


// Path: src/main/java/cn/readen/relay/ApiGenerator.java
import cn.readen.relay.common.JsonParser;
import cn.readen.relay.generator.*;
import cn.readen.relay.model.ApiConfig;
import cn.readen.relay.model.ApiMethod;
import com.jfinal.config.Routes;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

    public void generateSource(PrintStream out, String apiName) {
        ApiConfig config = getConfig(apiName);
        JClass jClass = new JClass(getClassName(apiName), packageName);
        jClass.setExtends(BaseController.class);
        jClass.add(new JImport(ApiGenerator.class));
        jClass.add(new JImport(ApiConfig.class));
        jClass.add(new JImport(ApiMethod.class));
        ApiMethod[] apiMethods = config.getApiMethods();
        for (int j = 0; j < apiMethods.length; j++) {
            JMethodBody methodBody = new JMethodBody();
            methodBody.append("ApiConfig apiConfig= ApiGenerator.me().getConfig(\"" + apiName + "\");");
            methodBody.append("ApiMethod method=apiConfig.getApiMethods()[" + j + "];");
            methodBody.append("handle(apiConfig,method);");
            JMethod method = new JMethod(Modifier.PUBLIC, false,
                    apiMethods[j].getName(), "void", methodBody);
            jClass.add(method);
        }
        jClass.print(out, 0);
    }


    @Override
    public ApiConfig getConfig(String apiName) {
        if (apiConfigs.get(apiName) == null) {
            String fileName = apiName + ".json";
            InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            String jsonConfig = CommentRemover.removeComments(inputStreamReader);
//        System.out.println(jsonConfig);
            try {
                ApiConfig config = JsonParser.getObjectReader().forType(ApiConfig.class).readValue(jsonConfig);