001/**
002 * Copyright (c) 2015-2022, Michael Yang 杨福海 (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.apache.org/licenses/LICENSE-2.0
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package io.jboot.apidoc;
017
018import com.jfinal.kit.Ret;
019import com.jfinal.plugin.activerecord.Page;
020import io.jboot.utils.ClassType;
021
022import java.lang.reflect.Method;
023import java.util.ArrayList;
024import java.util.HashMap;
025import java.util.List;
026import java.util.Map;
027
028public class ApiMockBuilders {
029
030    static ApiMockBuilder retBuilder = new ApiMockBuilder() {
031        @Override
032        public Object build(ClassType classType, Method method, int level) {
033            Ret ret = Ret.ok();
034            if (classType.isGeneric()) {
035                ClassType[] genericTypes = classType.getGenericTypes();
036                if (genericTypes.length == 1) {
037                    Class<?> type = genericTypes[0].getMainClass();
038                    if (List.class.isAssignableFrom(type)) {
039                        ret.set("list", getMockObject(genericTypes[0], method, level));
040                    } else if (Map.class.isAssignableFrom(type)) {
041                        ret.set("map", getMockObject(genericTypes[0], method, level));
042                    } else if (Page.class.isAssignableFrom(type)) {
043                        ret.set("page", getMockObject(genericTypes[0], method, level));
044                    } else {
045                        ret.set("object", getMockObject(genericTypes[0], method, level));
046                    }
047                }
048            }
049            List<ApiResponse> responses = ApiDocUtil.getApiResponseInMethod(method);
050            for (ApiResponse response : responses) {
051                Object mockObject = null;
052                if (level == 0 && !response.isType(Map.class) && !response.isType(Ret.class)) {
053                    mockObject = getMockObject(response.getClassType(), method, level);
054                }
055                if (mockObject == null || "".equals(mockObject)) {
056                    mockObject = response.getMockObject();
057                }
058                ret.put(response.getField(), mockObject);
059            }
060            return ret;
061        }
062    };
063
064
065    static ApiMockBuilder mapBuilder = new ApiMockBuilder() {
066        @Override
067        public Object build(ClassType classType, Method method, int level) {
068            // ret 让给 retBuilder 去构建
069            if (Ret.class.isAssignableFrom(classType.getMainClass())) {
070                return null;
071            }
072
073            Map map = new HashMap();
074            if (classType.isGeneric()) {
075                Object key = getMockObject(classType.getGenericTypes()[0], method, level);
076                if (key == null) {
077                    key = "key";
078                }
079                Object value = getMockObject(classType.getGenericTypes()[1], method, level);
080                map.put(key, value);
081            }
082
083            List<ApiResponse> responses = ApiDocUtil.getApiResponseInMethod(method);
084            for (ApiResponse response : responses) {
085                Object mockObject = null;
086                if (level == 0 && !response.isType(Map.class) && !response.isType(Ret.class)) {
087                    mockObject = getMockObject(response.getClassType(), method, level);
088                }
089                if (mockObject == null || "".equals(mockObject)) {
090                    mockObject = response.getMockObject();
091                }
092                map.put(response.getField(), mockObject);
093            }
094            return map;
095        }
096    };
097
098
099    static ApiMockBuilder listBuilder = new ApiMockBuilder() {
100        @Override
101        public Object build(ClassType classType, Method method, int level) {
102            List list = new ArrayList();
103            if (classType.isGeneric()) {
104                Object value = getMockObject(classType.getGenericTypes()[0], method, level);
105                list.add(value);
106                Object value2 = getMockObject(classType.getGenericTypes()[0], method, level);
107                list.add(value2);
108            }
109            return list;
110        }
111    };
112
113
114    static ApiMockBuilder pageBuilder = new ApiMockBuilder() {
115        @Override
116        public Object build(ClassType classType, Method method, int level) {
117            Page page = new Page();
118            page.setPageNumber(1);
119            page.setPageSize(10);
120            page.setTotalPage(1);
121            page.setTotalRow(2);
122
123            List list = new ArrayList();
124            list.add(getMockObject(classType.getGenericTypes()[0], method, level));
125            list.add(getMockObject(classType.getGenericTypes()[0], method, level));
126
127            page.setList(list);
128            return page;
129        }
130    };
131
132
133    static ApiMockBuilder stringBuilder = new ApiMockBuilder() {
134        @Override
135        public Object build(ClassType classType, Method method, int level) {
136            return "";
137        }
138    };
139
140
141}