From 2b2633f7b7e0666cffc1104a56cf57492b3bf670 Mon Sep 17 00:00:00 2001 From: TommyLemon <1184482681@qq.com> Date: Sat, 26 Sep 2020 00:34:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=20APIJSONFramework=EF=BC=8C?= =?UTF-8?q?=E5=8F=AA=E7=94=A8=20=20apijson-framework=EF=BC=9B=20APIJSONORM?= =?UTF-8?q?=EF=BC=9Afastjson=20=E5=8D=87=E7=BA=A7=E5=88=B0=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E5=BB=BA=E8=AE=AE=E7=A8=B3=E5=AE=9A=E7=89=88=201.2.73?= =?UTF-8?q?=EF=BC=9B=E8=87=AA=E8=BA=AB=E7=89=88=E6=9C=AC=E6=8F=90=E9=AB=98?= =?UTF-8?q?=E5=88=B0=204.2.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSONFramework/.gitignore | 1 - APIJSONFramework/libs/apijson-orm-4.2.0.jar | Bin 287282 -> 0 bytes APIJSONFramework/pom.xml | 78 -- .../apijson/framework/APIJSONApplication.java | 110 --- .../apijson/framework/APIJSONConstant.java | 77 -- .../apijson/framework/APIJSONController.java | 234 ----- .../apijson/framework/APIJSONCreator.java | 42 - .../framework/APIJSONFunctionParser.java | 643 ------------- .../framework/APIJSONObjectParser.java | 66 -- .../java/apijson/framework/APIJSONParser.java | 179 ---- .../apijson/framework/APIJSONSQLConfig.java | 212 ----- .../apijson/framework/APIJSONSQLExecutor.java | 129 --- .../apijson/framework/APIJSONVerifier.java | 244 ----- .../java/apijson/framework/BaseModel.java | 304 ------ .../java/apijson/framework/MethodUtil.java | 862 ------------------ .../java/apijson/framework/StructureUtil.java | 252 ----- .../java/apijson/framework/package-info.java | 8 - .../src/main/resources/application.properties | 0 APIJSONORM/pom.xml | 4 +- 19 files changed, 2 insertions(+), 3443 deletions(-) delete mode 100644 APIJSONFramework/.gitignore delete mode 100644 APIJSONFramework/libs/apijson-orm-4.2.0.jar delete mode 100755 APIJSONFramework/pom.xml delete mode 100755 APIJSONFramework/src/main/java/apijson/framework/APIJSONApplication.java delete mode 100644 APIJSONFramework/src/main/java/apijson/framework/APIJSONConstant.java delete mode 100755 APIJSONFramework/src/main/java/apijson/framework/APIJSONController.java delete mode 100644 APIJSONFramework/src/main/java/apijson/framework/APIJSONCreator.java delete mode 100755 APIJSONFramework/src/main/java/apijson/framework/APIJSONFunctionParser.java delete mode 100755 APIJSONFramework/src/main/java/apijson/framework/APIJSONObjectParser.java delete mode 100755 APIJSONFramework/src/main/java/apijson/framework/APIJSONParser.java delete mode 100755 APIJSONFramework/src/main/java/apijson/framework/APIJSONSQLConfig.java delete mode 100755 APIJSONFramework/src/main/java/apijson/framework/APIJSONSQLExecutor.java delete mode 100755 APIJSONFramework/src/main/java/apijson/framework/APIJSONVerifier.java delete mode 100755 APIJSONFramework/src/main/java/apijson/framework/BaseModel.java delete mode 100644 APIJSONFramework/src/main/java/apijson/framework/MethodUtil.java delete mode 100755 APIJSONFramework/src/main/java/apijson/framework/StructureUtil.java delete mode 100755 APIJSONFramework/src/main/java/apijson/framework/package-info.java delete mode 100755 APIJSONFramework/src/main/resources/application.properties diff --git a/APIJSONFramework/.gitignore b/APIJSONFramework/.gitignore deleted file mode 100644 index b83d22266..000000000 --- a/APIJSONFramework/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/APIJSONFramework/libs/apijson-orm-4.2.0.jar b/APIJSONFramework/libs/apijson-orm-4.2.0.jar deleted file mode 100644 index 67338ee11be538b2bf09c21206f6979c4e29a58a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287282 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

&j5S{&?I4*GNxkue1ACwrHL#TO_}4& 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 z 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 J+Z%+|hc-@c1CqR!})fn9?YI#ZSmV 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 diff --git a/APIJSONFramework/pom.xml b/APIJSONFramework/pom.xml deleted file mode 100755 index c80ba7307..000000000 --- a/APIJSONFramework/pom.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - 4.0.0 - - apijson.framework - apijson-framework - 4.1.0 - jar - - APIJSONFramework - APIJSON Server Framework - - - UTF-8 - UTF-8 - 1.8 - - - - - com.alibaba - fastjson - 1.2.61 - - - - javax.servlet - javax.servlet-api - 4.0.1 - - - - - - mysql - mysql-connector-java - 8.0.11 - - - org.postgresql - postgresql - 42.2.5 - - - net.sourceforge.jtds - jtds - 1.3.1 - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - - - - jitpack.io - https://jitpack.io - - - - diff --git a/APIJSONFramework/src/main/java/apijson/framework/APIJSONApplication.java b/APIJSONFramework/src/main/java/apijson/framework/APIJSONApplication.java deleted file mode 100755 index aabecfc59..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/APIJSONApplication.java +++ /dev/null @@ -1,110 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.framework; - -import apijson.NotNull; -import apijson.orm.ParserCreator; -import apijson.orm.SQLCreator; - - -/**SpringBootApplication - * 右键这个类 > Run As > Java Application - * @author Lemon - */ -public class APIJSONApplication { - - @NotNull - public static APIJSONCreator DEFAULT_APIJSON_CREATOR; - static { - DEFAULT_APIJSON_CREATOR = new APIJSONCreator(); - } - - - public static void init() throws Exception { - init(true); - } - public static void init(boolean shutdownWhenServerError) throws Exception { - init(shutdownWhenServerError, null, null); - } - public static void init(APIJSONCreator creator) throws Exception { - init(false, creator); - } - public static void init(boolean shutdownWhenServerError, APIJSONCreator creator) throws Exception { - init(shutdownWhenServerError, creator, creator); - } - public static void init(boolean shutdownWhenServerError, ParserCreator parserCreator, SQLCreator sqlCreator) throws Exception { - System.out.println("\n\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<<< APIJSON 开始启动 >>>>>>>>>>>>>>>>>>>>>>>>\n"); - - if (parserCreator == null) { - parserCreator = DEFAULT_APIJSON_CREATOR; - } - if (sqlCreator == null) { - sqlCreator = DEFAULT_APIJSON_CREATOR; - } - - System.out.println("\n\n\n开始初始化:远程函数配置 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); - try { - APIJSONFunctionParser.init(shutdownWhenServerError, parserCreator); - } - catch (Exception e) { - e.printStackTrace(); - } - System.out.println("\n完成初始化:远程函数配置 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - - System.out.println("开始测试:远程函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); - try { - APIJSONFunctionParser.test(); - } - catch (Exception e) { - e.printStackTrace(); - } - System.out.println("\n完成测试:远程函数 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - - - - System.out.println("\n\n\n开始初始化:请求校验配置 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); - try { - StructureUtil.init(shutdownWhenServerError, parserCreator); - } - catch (Exception e) { - e.printStackTrace(); - } - System.out.println("\n完成初始化:请求校验配置 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - - System.out.println("\n\n\n开始测试:请求校验 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); - try { - StructureUtil.test(sqlCreator); - } - catch (Exception e) { - e.printStackTrace(); - } - System.out.println("\n完成测试:请求校验 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - - - - System.out.println("\n\n\n开始初始化:权限校验配置 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); - try { - APIJSONVerifier.init(shutdownWhenServerError, parserCreator); - } - catch (Exception e) { - e.printStackTrace(); - } - System.out.println("\n完成初始化:权限校验配置 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - - - System.out.println("\n\n<<<<<<<<<<<<<<<<<<<<<<<<< APIJSON 启动完成,试试调用自动化 API 吧 ^_^ >>>>>>>>>>>>>>>>>>>>>>>>\n"); - } - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/APIJSONConstant.java b/APIJSONFramework/src/main/java/apijson/framework/APIJSONConstant.java deleted file mode 100644 index 6a840b334..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/APIJSONConstant.java +++ /dev/null @@ -1,77 +0,0 @@ -package apijson.framework; - -import apijson.JSONResponse; -import apijson.orm.JSONRequest; -import apijson.orm.Visitor; -import apijson.orm.model.Access; -import apijson.orm.model.Column; -import apijson.orm.model.Document; -import apijson.orm.model.ExtendedProperty; -import apijson.orm.model.Function; -import apijson.orm.model.PgAttribute; -import apijson.orm.model.PgClass; -import apijson.orm.model.Request; -import apijson.orm.model.Response; -import apijson.orm.model.SysColumn; -import apijson.orm.model.SysTable; -import apijson.orm.model.Table; -import apijson.orm.model.Test; -import apijson.orm.model.TestRecord; - -public class APIJSONConstant { - - public static final String DEFAULTS = "defaults"; - public static final String USER_ = "User"; - public static final String PRIVACY_ = "Privacy"; - public static final String VISITOR_ID = "visitorId"; - - public static final String ID = JSONRequest.KEY_ID; - public static final String USER_ID = JSONRequest.KEY_USER_ID; - public static final String TAG = JSONRequest.KEY_TAG; - public static final String VERSION = JSONRequest.KEY_VERSION; - public static final String FORMAT = JSONRequest.KEY_FORMAT; - - public static final String CODE = JSONResponse.KEY_CODE; - public static final String MSG = JSONResponse.KEY_MSG; - public static final String COUNT = JSONResponse.KEY_COUNT; - public static final String TOTAL = JSONResponse.KEY_TOTAL; - - public static final String ACCESS_; - public static final String COLUMN_; - public static final String DOCUMENT_; - public static final String EXTENDED_PROPERTY_; - public static final String FUNCTION_; - public static final String PG_ATTRIBUTE_; - public static final String PG_CLASS_; - public static final String RESPONSE_; - public static final String REQUEST_; - public static final String SYS_COLUMN_; - public static final String SYS_TABLE_; - public static final String TABLE_; - public static final String TEST_; - public static final String TEST_RECORD_; - - public static final String VISITOR_; - - static { - ACCESS_ = Access.class.getSimpleName(); - COLUMN_ = Column.class.getSimpleName(); - DOCUMENT_ = Document.class.getSimpleName(); - EXTENDED_PROPERTY_ = ExtendedProperty.class.getSimpleName(); - FUNCTION_ = Function.class.getSimpleName(); - PG_ATTRIBUTE_ = PgAttribute.class.getSimpleName(); - PG_CLASS_ = PgClass.class.getSimpleName(); - REQUEST_ = Request.class.getSimpleName(); - RESPONSE_ = Response.class.getSimpleName(); - SYS_COLUMN_ = SysColumn.class.getSimpleName(); - SYS_TABLE_ = SysTable.class.getSimpleName(); - TABLE_ = Table.class.getSimpleName(); - TEST_ = Test.class.getSimpleName(); - TEST_RECORD_ = TestRecord.class.getSimpleName(); - - VISITOR_ = Visitor.class.getSimpleName(); - } - - - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/APIJSONController.java b/APIJSONFramework/src/main/java/apijson/framework/APIJSONController.java deleted file mode 100755 index 6e68961b8..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/APIJSONController.java +++ /dev/null @@ -1,234 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.framework; - -import static apijson.RequestMethod.DELETE; -import static apijson.RequestMethod.GET; -import static apijson.RequestMethod.GETS; -import static apijson.RequestMethod.HEAD; -import static apijson.RequestMethod.HEADS; -import static apijson.RequestMethod.POST; -import static apijson.RequestMethod.PUT; -import static apijson.framework.APIJSONConstant.ACCESS_; -import static apijson.framework.APIJSONConstant.DEFAULTS; -import static apijson.framework.APIJSONConstant.FORMAT; -import static apijson.framework.APIJSONConstant.FUNCTION_; -import static apijson.framework.APIJSONConstant.REQUEST_; -import static apijson.framework.APIJSONConstant.VERSION; -import static apijson.framework.APIJSONConstant.VISITOR_; -import static apijson.framework.APIJSONConstant.VISITOR_ID; - -import java.rmi.ServerException; - -import javax.servlet.http.HttpSession; - -import com.alibaba.fastjson.JSONObject; - -import apijson.Log; -import apijson.NotNull; -import apijson.RequestMethod; -import apijson.StringUtil; -import apijson.orm.Parser; -import apijson.orm.Visitor; - - -/**request controller - *
全通过 HTTP POST 来请求: - *
1.减少代码 - 客户端无需写 HTTP GET, HTTP PUT 等各种方式的请求代码 - *
2.提高性能 - 无需 URL encode 和 decode - *
3.调试方便 - 建议使用 APIAuto-机器学习自动化接口管理工具(https://github.com/TommyLemon/APIAuto) - * @author Lemon - */ -public class APIJSONController { - public static final String TAG = "APIJSONController"; - - public Parser newParser(HttpSession session, RequestMethod method) { - Parser parser = APIJSONApplication.DEFAULT_APIJSON_CREATOR.createParser(); - parser.setMethod(method); - if (parser instanceof APIJSONParser) { - ((APIJSONParser) parser).setSession(session); - } - return parser; - } - - public String parse(String request, HttpSession session, RequestMethod method) { - return newParser(session, method).parse(request); - } - - //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**获取 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#GET} - */ - public String get(String request, HttpSession session) { - return parse(request, session, GET); - } - - /**计数 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#HEAD} - */ - public String head(String request, HttpSession session) { - return parse(request, session, HEAD); - } - - /**限制性GET,request和response都非明文,浏览器看不到,用于对安全性要求高的GET请求 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#GETS} - */ - public String gets(String request, HttpSession session) { - return parse(request, session, GETS); - } - - /**限制性HEAD,request和response都非明文,浏览器看不到,用于对安全性要求高的HEAD请求 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#HEADS} - */ - public String heads(String request, HttpSession session) { - return parse(request, session, HEADS); - } - - /**新增 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#POST} - */ - public String post(String request, HttpSession session) { - return parse(request, session, POST); - } - - /**修改 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#PUT} - */ - public String put(String request, HttpSession session) { - return parse(request, session, PUT); - } - - /**删除 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#DELETE} - */ - public String delete(String request, HttpSession session) { - return parse(request, session, DELETE); - } - - - //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - - /**重新加载配置 - * @param request - * @return - * @see - *

-		{
-			"type": "ALL",  //重载对象,ALL, FUNCTION, REQUEST, ACCESS,非必须
-			"phone": "13000082001",
-			"verify": "1234567" //验证码,对应类型为 Verify.TYPE_RELOAD
-		}
-	 * 
- */ - public JSONObject reload(String type) { - JSONObject result = APIJSONParser.newSuccessResult(); - - boolean reloadAll = StringUtil.isEmpty(type, true) || "ALL".equals(type); - - if (reloadAll || "FUNCTION".equals(type)) { - try { - result.put(FUNCTION_, APIJSONFunctionParser.init()); - } catch (ServerException e) { - e.printStackTrace(); - result.put(FUNCTION_, APIJSONParser.newErrorResult(e)); - } - } - - if (reloadAll || "REQUEST".equals(type)) { - try { - result.put(REQUEST_, StructureUtil.init()); - } catch (ServerException e) { - e.printStackTrace(); - result.put(REQUEST_, APIJSONParser.newErrorResult(e)); - } - } - - if (reloadAll || "ACCESS".equals(type)) { - try { - result.put(ACCESS_, APIJSONVerifier.init()); - } catch (ServerException e) { - e.printStackTrace(); - result.put(ACCESS_, APIJSONParser.newErrorResult(e)); - } - } - - return result; - } - - - /**用户登录 - * @param session - * @param visitor - * @param version - * @param format - * @param defaults - * @return 返回类型设置为 Object 是为了子类重写时可以有返回值,避免因为冲突而另写一个有返回值的登录方法 - */ - public Object login(@NotNull HttpSession session, Visitor visitor, Integer version, Boolean format, JSONObject defaults) { - //登录状态保存至session - session.setAttribute(VISITOR_ID, visitor.getId()); //用户id - session.setAttribute(VISITOR_, visitor); //用户 - session.setAttribute(VERSION, version); //全局默认版本号 - session.setAttribute(FORMAT, format); //全局默认格式化配置 - session.setAttribute(DEFAULTS, defaults); //给每个请求JSON最外层加的字段 - return null; - } - - /**退出登录,清空session - * @param session - * @return 返回类型设置为 Object 是为了子类重写时可以有返回值,避免因为冲突而另写一个有返回值的登录方法 - */ - public Object logout(@NotNull HttpSession session) { - Object userId = APIJSONVerifier.getVisitorId(session);//必须在session.invalidate();前! - Log.d(TAG, "logout userId = " + userId + "; session.getId() = " + (session == null ? null : session.getId())); - session.invalidate(); - return null; - } - - - public JSONObject invokeMethod(String request) { - return MethodUtil.invokeMethod(request); - } - - public JSONObject listMethod(String request) { - return MethodUtil.listMethod(request); - } - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/APIJSONCreator.java b/APIJSONFramework/src/main/java/apijson/framework/APIJSONCreator.java deleted file mode 100644 index 8fb14eaf5..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/APIJSONCreator.java +++ /dev/null @@ -1,42 +0,0 @@ -package apijson.framework; - -import apijson.orm.FunctionParser; -import apijson.orm.Parser; -import apijson.orm.ParserCreator; -import apijson.orm.SQLConfig; -import apijson.orm.SQLCreator; -import apijson.orm.SQLExecutor; -import apijson.orm.Verifier; -import apijson.orm.VerifierCreator; - -/**APIJSON相关创建器 - * @author Lemon - */ -public class APIJSONCreator implements ParserCreator, VerifierCreator, SQLCreator { - - @Override - public Parser createParser() { - return new APIJSONParser(); - } - - @Override - public FunctionParser createFunctionParser() { - return new APIJSONFunctionParser(); - } - - @Override - public Verifier createVerifier() { - return new APIJSONVerifier(); - } - - @Override - public SQLConfig createSQLConfig() { - return new APIJSONSQLConfig(); - } - - @Override - public SQLExecutor createSQLExecutor() { - return new APIJSONSQLExecutor(); - } - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/APIJSONFunctionParser.java b/APIJSONFramework/src/main/java/apijson/framework/APIJSONFunctionParser.java deleted file mode 100755 index 1f045c455..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/APIJSONFunctionParser.java +++ /dev/null @@ -1,643 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.framework; - -import static apijson.framework.APIJSONConstant.FUNCTION_; - -import java.io.IOException; -import java.rmi.ServerException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.servlet.http.HttpSession; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -import apijson.JSON; -import apijson.JSONResponse; -import apijson.Log; -import apijson.NotNull; -import apijson.RequestMethod; -import apijson.RequestRole; -import apijson.StringUtil; -import apijson.framework.MethodUtil.Argument; -import apijson.orm.AbstractFunctionParser; -import apijson.orm.JSONRequest; -import apijson.orm.ParserCreator; - - -/**可远程调用的函数类 - * @author Lemon - */ -public class APIJSONFunctionParser extends AbstractFunctionParser { - public static final String TAG = "APIJSONFunctionParser"; - - private HttpSession session; - public APIJSONFunctionParser() { - this(null); - } - public APIJSONFunctionParser(HttpSession session) { - this(null, null, 0, null, session); - } - public APIJSONFunctionParser(RequestMethod method, String tag, int version, JSONObject request, HttpSession session) { - super(method, tag, version, request); - setSession(session); - } - public HttpSession getSession() { - return session; - } - public APIJSONFunctionParser setSession(HttpSession session) { - this.session = session; - return this; - } - - @Override - public APIJSONFunctionParser setMethod(RequestMethod method) { - super.setMethod(method); - return this; - } - @Override - public APIJSONFunctionParser setTag(String tag) { - super.setTag(tag); - return this; - } - @Override - public APIJSONFunctionParser setVersion(int version) { - super.setVersion(version); - return this; - } - - /**初始化,加载所有远程函数配置,并校验是否已在应用层代码实现 - * @return - * @throws ServerException - */ - public static JSONObject init() throws ServerException { - return init(false); - } - /**初始化,加载所有远程函数配置,并校验是否已在应用层代码实现 - * @param shutdownWhenServerError - * @return - * @throws ServerException - */ - public static JSONObject init(boolean shutdownWhenServerError) throws ServerException { - return init(shutdownWhenServerError, null); - } - /**初始化,加载所有远程函数配置,并校验是否已在应用层代码实现 - * @param creator - * @return - * @throws ServerException - */ - public static JSONObject init(ParserCreator creator) throws ServerException { - return init(false, creator); - } - /**初始化,加载所有远程函数配置,并校验是否已在应用层代码实现 - * @param shutdownWhenServerError - * @param creator - * @return - * @throws ServerException - */ - public static JSONObject init(boolean shutdownWhenServerError, ParserCreator creator) throws ServerException { - JSONObject request = new JSONObject(); - - { //Function[]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - JSONRequest functionItem = new JSONRequest(); - - { //Function<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - JSONRequest function = new JSONRequest(); - functionItem.put(FUNCTION_, function); - } //Function>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - request.putAll(functionItem.toArray(0, 0, FUNCTION_)); - } //Function[]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - if (creator == null) { - creator = APIJSONApplication.DEFAULT_APIJSON_CREATOR; - } - - JSONObject response = creator.createParser().setMethod(RequestMethod.GET).setNeedVerify(true).parseResponse(request); - if (JSONResponse.isSuccess(response) == false) { - onServerError("\n\n\n\n\n !!!! 查询远程函数异常 !!!\n" + response.getString(JSONResponse.KEY_MSG) + "\n\n\n\n\n", shutdownWhenServerError); - } - - JSONArray list = response.getJSONArray(FUNCTION_ + "[]"); - if (list == null || list.isEmpty()) { - Log.w(TAG, "init list == null || list.isEmpty(),没有可用的远程函数"); - throw new NullPointerException("没有可用的远程函数"); - } - - JSONObject item; - for (int i = 0; i < list.size(); i++) { - item = list.getJSONObject(i); - if (item == null) { - continue; - } - - JSONObject demo = JSON.parseObject(item.getString("demo")); - if (demo == null) { - onServerError("字段 demo 的值必须为合法且非 null 的 JSONObejct 字符串!", shutdownWhenServerError); - } - String name = item.getString("name"); - if (demo.containsKey("result()") == false) { - demo.put("result()", getFunctionCall(name, item.getString("arguments"))); - } - // demo.put(JSONRequest.KEY_TAG, item.getString(JSONRequest.KEY_TAG)); - // demo.put(JSONRequest.KEY_VERSION, item.getInteger(JSONRequest.KEY_VERSION)); - - FUNCTION_MAP.put(name, item); //必须在测试 invoke 前! - - String[] methods = StringUtil.split(item.getString("methods")); - JSONObject r = new APIJSONParser( - methods == null || methods.length <= 0 ? RequestMethod.GET : RequestMethod.valueOf(methods[0]) - , false - ) - .setTag(item.getString(JSONRequest.KEY_TAG)) - .setVersion(item.getIntValue(JSONRequest.KEY_VERSION)) - .parseResponse(demo); - - if (JSONResponse.isSuccess(r) == false) { - onServerError(JSONResponse.getMsg(r), shutdownWhenServerError); - } - - } - - return response; - } - - - private static void onServerError(String msg, boolean shutdown) throws ServerException { - Log.e(TAG, "\n远程函数文档测试未通过!\n请新增 demo 里的函数,或修改 Function 表里的 demo 为已有的函数示例!\n保证前端看到的远程函数文档是正确的!!!\n\n原因:\n" + msg); - - if (shutdown) { - System.exit(1); - } else { - throw new ServerException(msg); - } - } - - - public static void test() throws Exception { - test(null); - } - public static void test(APIJSONFunctionParser function) throws Exception { - int i0 = 1, i1 = -2; - JSONObject request = new JSONObject(); - request.put("id", 10); - request.put("i0", i0); - request.put("i1", i1); - JSONArray arr = new JSONArray(); - arr.add(new JSONObject()); - request.put("arr", arr); - - JSONArray array = new JSONArray(); - array.add(1);//new JSONObject()); - array.add(2);//new JSONObject()); - array.add(4);//new JSONObject()); - array.add(10);//new JSONObject()); - request.put("array", array); - - request.put("position", 1); - request.put("@position", 0); - - request.put("key", "key"); - JSONObject object = new JSONObject(); - object.put("key", true); - request.put("object", object); - - if (function == null) { - function = new APIJSONFunctionParser(null, null, 1, null, null); - } - - Log.i(TAG, "plus(1,-2) = " + function.invoke("plus(i0,i1)", request)); - Log.i(TAG, "count([1,2,4,10]) = " + function.invoke("countArray(array)", request)); - Log.i(TAG, "isContain([1,2,4,10], 10) = " + function.invoke("isContain(array,id)", request)); - Log.i(TAG, "getFromArray([1,2,4,10], 0) = " + function.invoke("getFromArray(array,@position)", request)); - Log.i(TAG, "getFromObject({key:true}, key) = " + function.invoke("getFromObject(object,key)", request)); - - } - - - - - - - - /**获取远程函数的demo,如果没有就自动补全 - * @param request - * @return - * @throws ServerException - */ - public JSONObject getFunctionDemo(@NotNull JSONObject request) { - JSONObject demo = JSON.parseObject(request.getString("demo")); - if (demo == null) { - demo = new JSONObject(); - } - if (demo.containsKey("result()") == false) { - demo.put("result()", getFunctionCall(request.getString("name"), request.getString("arguments"))); - } - return demo; - } - - /**获取远程函数的demo,如果没有就自动补全 - * @param request - * @return - */ - public String getFunctionDetail(@NotNull JSONObject request) { - return getFunctionCall(request.getString("name"), request.getString("arguments")) - + ": " + StringUtil.getTrimedString(request.getString("detail")); - } - /**获取函数调用代码 - * @param name - * @param arguments - * @return - */ - private static String getFunctionCall(String name, String arguments) { - return name + "(" + StringUtil.getTrimedString(arguments) + ")"; - } - - /**TODO 仅用来测试 "key-()":"getIdList()" 和 "key()":"getIdList()" - * @param request - * @return JSONArray 只能用JSONArray,用long[]会在SQLConfig解析崩溃 - * @throws Exception - */ - public JSONArray getIdList(@NotNull JSONObject request) { - return new JSONArray(new ArrayList(Arrays.asList(12, 15, 301, 82001, 82002, 38710))); - } - - - /**TODO 仅用来测试 "key-()":"verifyAccess()" - * @param request - * @return - * @throws Exception - */ - public Object verifyAccess(@NotNull JSONObject request) throws Exception { - long userId = request.getLongValue(apijson.JSONObject.KEY_USER_ID); - RequestRole role = RequestRole.get(request.getString(apijson.JSONObject.KEY_ROLE)); - if (role == RequestRole.OWNER && userId != APIJSONVerifier.getVisitorId(session)) { - throw new IllegalAccessException("登录用户与角色OWNER不匹配!"); - } - return null; - } - - - - /**获取方法参数的定义 - * @param request - * @return - * @throws IOException - * @throws ClassNotFoundException - * @throws IllegalArgumentException - */ - public String getMethodArguments(@NotNull JSONObject request) throws IllegalArgumentException, ClassNotFoundException, IOException { - return getMethodArguments(request, "methodArgs"); - } - /**获取方法参数的定义 - * @param request - * @param requestKey - * @param methodArgs - * @return - * @throws IllegalArgumentException - * @throws ClassNotFoundException - * @throws IOException - */ - public String getMethodArguments(@NotNull JSONObject request, String methodArgsKey) throws IllegalArgumentException, ClassNotFoundException, IOException { - String argsStr = request.getString(methodArgsKey); - if (StringUtil.isEmpty(argsStr, true)) { - JSONObject obj = request.getJSONObject("request"); - argsStr = obj == null ? null : obj.getString(methodArgsKey); - } - List methodArgs = JSON.parseArray(removeComment(argsStr), Argument.class); - if (methodArgs == null || methodArgs.isEmpty()) { - return ""; - } - - Class[] types = new Class[methodArgs.size()]; - Object[] args = new Object[methodArgs.size()]; - MethodUtil.initTypesAndValues(methodArgs, types, args, true); - - String s = ""; - if (types != null) { - String sn; - for (int i = 0; i < types.length; i++) { - sn = types[i] == null ? null : types[i].getSimpleName(); - if (sn == null) { - sn = Object.class.getSimpleName(); - } - - if (i > 0) { - s += ","; - } - - if (MethodUtil.CLASS_MAP.containsKey(sn)) { - s += sn; - } - else { - s += types[i].getName(); - } - } - } - return s; - } - - - /**获取方法的定义 - * @param request - * @return - * @throws IOException - * @throws ClassNotFoundException - * @throws IllegalArgumentException - */ - public String getMethodDefination(@NotNull JSONObject request) - throws IllegalArgumentException, ClassNotFoundException, IOException { -// request.put("arguments", removeComment(request.getString("methodArgs"))); - return getMethodDefination(request, "method", "arguments", "type", "exceptions", "Java"); - } - /**获取方法的定义 - * @param request - * @param method - * @param arguments - * @param type - * @return method(argType0,argType1...): returnType - * @throws IOException - * @throws ClassNotFoundException - * @throws IllegalArgumentException - */ - public String getMethodDefination(@NotNull JSONObject request, String method, String arguments, String type, String exceptions, String language) - throws IllegalArgumentException, ClassNotFoundException, IOException { - String n = request.getString(method); - if (StringUtil.isEmpty(n, true)) { - throw new NullPointerException("getMethodDefination StringUtil.isEmpty(methodArgs, true) !"); - } - String a = request.getString(arguments); - String t = request.getString(type); - String e = request.getString(exceptions); - - if (language == null) { - language = ""; - } - switch (language) { - case "TypeScript": - return n + "(" + (StringUtil.isEmpty(a, true) ? "" : a) + ")" + (StringUtil.isEmpty(t, true) ? "" : ": " + t) + (StringUtil.isEmpty(e, true) ? "" : " throws " + e); - case "Go": - return n + "(" + (StringUtil.isEmpty(a, true) ? "" : a ) + ")" + (StringUtil.isEmpty(t, true) ? "" : " " + t) + (StringUtil.isEmpty(e, true) ? "" : " throws " + e); - default: - //类型可能很长,Eclipse, Idea 代码提示都是类型放后面 return (StringUtil.isEmpty(t, true) ? "" : t + " ") + n + "(" + (StringUtil.isEmpty(a, true) ? "" : a) + ")"; - return n + "(" + (StringUtil.isEmpty(a, true) ? "" : a) + ")" + (StringUtil.isEmpty(t, true) ? "" : ": " + t) + (StringUtil.isEmpty(e, true) ? "" : " throws " + e); - } - } - - /** - * methodArgs 和 classArgs 都可以带注释 - */ - public String getMethodRequest(@NotNull JSONObject request) { - String req = request.getString("request"); - if (StringUtil.isEmpty(req, true) == false) { - return req; - } - - req = "{"; - Boolean isStatic = request.getBoolean("static"); - String methodArgs = request.getString("methodArgs"); - String classArgs = request.getString("classArgs"); - - boolean comma = false; - if (isStatic != null && isStatic) { - req += "\n \"static\": " + true; - comma = true; - } - if (StringUtil.isEmpty(methodArgs, true) == false) { - req += (comma ? "," : "") + "\n \"methodArgs\": " + methodArgs; - comma = true; - } - if (StringUtil.isEmpty(classArgs, true) == false) { - req += (comma ? "," : "") + "\n \"classArgs\": " + classArgs; - } - req += "\n}"; - return req; - } - - // public static JSONObject removeComment(String json) { - // return JSON.parseObject(removeComment(json)); - // } - public static String removeComment(String json) { - return json == null ? null: json.replaceAll("(//.*)|(/\\*[\\s\\S]*?\\*/)", ""); - } - - - - public double plus(@NotNull JSONObject request, String i0, String i1) { - return request.getDoubleValue(i0) + request.getDoubleValue(i1); - } - public double minus(@NotNull JSONObject request, String i0, String i1) { - return request.getDoubleValue(i0) - request.getDoubleValue(i1); - } - public double multiply(@NotNull JSONObject request, String i0, String i1) { - return request.getDoubleValue(i0) * request.getDoubleValue(i1); - } - public double divide(@NotNull JSONObject request, String i0, String i1) { - return request.getDoubleValue(i0) / request.getDoubleValue(i1); - } - - //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断array是否为空 - * @param request - * @param array - * @return - */ - public boolean isArrayEmpty(@NotNull JSONObject request, String array) { - return BaseModel.isEmpty(request.getJSONArray(array)); - } - /**判断object是否为空 - * @param request - * @param object - * @return - */ - public boolean isObjectEmpty(@NotNull JSONObject request, String object) { - return BaseModel.isEmpty(request.getJSONObject(object)); - } - //判断是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - //判断是否为包含 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断array是否包含value - * @param request - * @param array - * @param value - * @return - */ - public boolean isContain(@NotNull JSONObject request, String array, String value) { - //解决isContain((List) [82001,...], (Integer) 82001) == false及类似问题, list元素可能是从数据库查到的bigint类型的值 - // return BaseModel.isContain(request.getJSONArray(array), request.get(value)); - - //不用准确的的 request.getString(value).getClass() ,因为Long值转Integer崩溃,而且转成一种类型本身就和字符串对比效果一样了。 - List list = com.alibaba.fastjson.JSON.parseArray(request.getString(array), String.class); - return list != null && list.contains(request.getString(value)); - } - /**判断object是否包含key - * @param request - * @param object - * @param key - * @return - */ - public boolean isContainKey(@NotNull JSONObject request, String object, String key) { - return BaseModel.isContainKey(request.getJSONObject(object), request.getString(key)); - } - /**判断object是否包含value - * @param request - * @param object - * @param value - * @return - */ - public boolean isContainValue(@NotNull JSONObject request, String object, String value) { - return BaseModel.isContainValue(request.getJSONObject(object), request.get(value)); - } - //判断是否为包含 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取数量 - * @param request - * @param array - * @return - */ - public int countArray(@NotNull JSONObject request, String array) { - return BaseModel.count(request.getJSONArray(array)); - } - /**获取数量 - * @param request - * @param object - * @return - */ - public int countObject(@NotNull JSONObject request, String object) { - return BaseModel.count(request.getJSONObject(object)); - } - //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //根据键获取值 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取 - ** @param request - * @param array - * @param position 支持直接传数字,例如 getFromArray(array,0) ;或者引用当前对象的值,例如 "@position": 0, "result()": "getFromArray(array,@position)" - * @return - */ - public Object getFromArray(@NotNull JSONObject request, String array, String position) { - int p; - try { - p = Integer.parseInt(position); - } catch (Exception e) { - p = request.getIntValue(position); - } - return BaseModel.get(request.getJSONArray(array), p); - } - /**获取 - * @param request - * @param object - * @param key - * @return - */ - public Object getFromObject(@NotNull JSONObject request, String object, String key) { - return BaseModel.get(request.getJSONObject(object), request.getString(key)); - } - //根据键获取值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - //根据键移除值 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**移除 - ** @param request - * @param array - * @param position 支持直接传数字,例如 getFromArray(array,0) ;或者引用当前对象的值,例如 "@position": 0, "result()": "getFromArray(array,@position)" - * @return - */ - public Object removeIndex(@NotNull JSONObject request, String position) { - int p; - try { - p = Integer.parseInt(position); - } catch (Exception e) { - p = request.getIntValue(position); - } - request.remove(p); - return null; - } - /**移除 - * @param request - * @param object - * @param key - * @return - */ - public Object removeKey(@NotNull JSONObject request, String key) { - request.remove(key); - return null; - } - //根据键获取值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - //获取非基本类型对应基本类型的非空值 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取非空值 - * @param request - * @param value - * @return - */ - public boolean booleanValue(@NotNull JSONObject request, String value) { - return request.getBooleanValue(value); - } - /**获取非空值 - * @param request - * @param value - * @return - */ - public int intValue(@NotNull JSONObject request, String value) { - return request.getIntValue(value); - } - /**获取非空值 - * @param request - * @param value - * @return - */ - public long longValue(@NotNull JSONObject request, String value) { - return request.getLongValue(value); - } - /**获取非空值 - * @param request - * @param value - * @return - */ - public float floatValue(@NotNull JSONObject request, String value) { - return request.getFloatValue(value); - } - /**获取非空值 - * @param request - * @param value - * @return - */ - public double doubleValue(@NotNull JSONObject request, String value) { - return request.getDoubleValue(value); - } - //获取非基本类型对应基本类型的非空值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - /**获取value,当value为null时获取defaultValue - * @param request - * @param value - * @param defaultValue - * @return v == null ? request.get(defaultValue) : v - */ - public Object getWithDefault(@NotNull JSONObject request, String value, String defaultValue) { - Object v = request.get(value); - return v == null ? request.get(defaultValue) : v; - } - - - -} \ No newline at end of file diff --git a/APIJSONFramework/src/main/java/apijson/framework/APIJSONObjectParser.java b/APIJSONFramework/src/main/java/apijson/framework/APIJSONObjectParser.java deleted file mode 100755 index c6dcfd48a..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/APIJSONObjectParser.java +++ /dev/null @@ -1,66 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.framework; - -import java.util.List; - -import javax.servlet.http.HttpSession; - -import com.alibaba.fastjson.JSONObject; - -import apijson.NotNull; -import apijson.RequestMethod; -import apijson.orm.AbstractObjectParser; -import apijson.orm.AbstractParser; -import apijson.orm.Join; -import apijson.orm.SQLConfig; - - -/**简化Parser,getObject和getArray(getArrayConfig)都能用 - * @author Lemon - */ -public class APIJSONObjectParser extends AbstractObjectParser { - public static final String TAG = "APIJSONObjectParser"; - - /**for single object - * @param parentPath - * @param request - * @param name - * @throws Exception - */ - public APIJSONObjectParser(HttpSession session, @NotNull JSONObject request, String parentPath, String name, SQLConfig arrayConfig, boolean isSubquery) throws Exception { - super(request, parentPath, name, arrayConfig, isSubquery); - } - - @Override - public APIJSONObjectParser setMethod(RequestMethod method) { - super.setMethod(method); - return this; - } - - @Override - public APIJSONObjectParser setParser(AbstractParser parser) { - super.setParser(parser); - return this; - } - - - @Override - public SQLConfig newSQLConfig(RequestMethod method, String table, String alias, JSONObject request, List joinList, boolean isProcedure) throws Exception { - return APIJSONSQLConfig.newSQLConfig(method, table, alias, request, joinList, isProcedure); - } - - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/APIJSONParser.java b/APIJSONFramework/src/main/java/apijson/framework/APIJSONParser.java deleted file mode 100755 index 4cfabbd49..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/APIJSONParser.java +++ /dev/null @@ -1,179 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.framework; - -import static apijson.framework.APIJSONConstant.DEFAULTS; -import static apijson.framework.APIJSONConstant.FORMAT; -import static apijson.framework.APIJSONConstant.VERSION; - -import java.util.Map; -import java.util.Set; - -import javax.servlet.http.HttpSession; - -import com.alibaba.fastjson.JSONObject; - -import apijson.RequestMethod; -import apijson.orm.AbstractParser; -import apijson.orm.FunctionParser; -import apijson.orm.Parser; -import apijson.orm.SQLConfig; -import apijson.orm.SQLExecutor; -import apijson.orm.Verifier; - - -/**请求解析器 - * @author Lemon - */ -public class APIJSONParser extends AbstractParser { - public static final String TAG = "APIJSONParser"; - - public APIJSONParser() { - super(); - } - public APIJSONParser(RequestMethod method) { - super(method); - } - public APIJSONParser(RequestMethod method, boolean needVerify) { - super(method, needVerify); - } - - private HttpSession session; - public HttpSession getSession() { - return session; - } - public APIJSONParser setSession(HttpSession session) { - this.session = session; - setVisitor(APIJSONVerifier.getVisitor(session)); - return this; - } - - @Override - public Parser createParser() { - return APIJSONApplication.DEFAULT_APIJSON_CREATOR.createParser(); - } - @Override - public FunctionParser createFunctionParser() { - return APIJSONApplication.DEFAULT_APIJSON_CREATOR.createFunctionParser(); - } - - @Override - public Verifier createVerifier() { - return APIJSONApplication.DEFAULT_APIJSON_CREATOR.createVerifier(); - } - - @Override - public SQLConfig createSQLConfig() { - return APIJSONApplication.DEFAULT_APIJSON_CREATOR.createSQLConfig(); - } - @Override - public SQLExecutor createSQLExecutor() { - return APIJSONApplication.DEFAULT_APIJSON_CREATOR.createSQLExecutor(); - } - - - @Override - public JSONObject parseResponse(JSONObject request) { - //补充format - if (session != null && request != null) { - if (request.get(FORMAT) == null) { - request.put(FORMAT, session.getAttribute(FORMAT)); - } - if (request.get(DEFAULTS) == null) { - JSONObject defaults = (JSONObject) session.getAttribute(DEFAULTS); - Set> set = defaults == null ? null : defaults.entrySet(); - - if (set != null) { - for (Map.Entry e : set) { - if (e != null && request.get(e.getKey()) == null) { - request.put(e.getKey(), e.getValue()); - } - } - } - } - } - return super.parseResponse(request); - } - - private FunctionParser functionParser; - public FunctionParser getFunctionParser() { - return functionParser; - } - @Override - public Object onFunctionParse(String key, String function, String parentPath, String currentName, JSONObject currentObject) throws Exception { - if (functionParser == null) { - functionParser = createFunctionParser(); - functionParser.setMethod(getMethod()); - functionParser.setTag(getTag()); - functionParser.setVersion(getVersion()); - functionParser.setRequest(requestObject); - - if (functionParser instanceof APIJSONFunctionParser) { - ((APIJSONFunctionParser) functionParser).setSession(getSession()); - } - } - functionParser.setKey(key); - functionParser.setParentPath(parentPath); - functionParser.setCurrentName(currentName); - functionParser.setCurrentObject(currentObject); - - return functionParser.invoke(function, currentObject); - } - - - @Override - public APIJSONObjectParser createObjectParser(JSONObject request, String parentPath, String name, SQLConfig arrayConfig, boolean isSubquery) throws Exception { - - return new APIJSONObjectParser(getSession(), request, parentPath, name, arrayConfig, isSubquery) { - - // @Override - // protected APIJSONSQLConfig newQueryConfig() { - // if (itemConfig != null) { - // return itemConfig; - // } - // return super.newQueryConfig(); - // } - - //导致最多评论的(Strong 30个)的那个动态详情界面Android(82001)无姓名和头像,即User=null - // @Override - // protected void onComplete() { - // if (response != null) { - // putQueryResult(path, response);//解决获取关联数据时requestObject里不存在需要的关联数据 - // } - // } - - }.setMethod(getMethod()).setParser(this); - } - - - - @Override - public void onVerifyContent() throws Exception { - //补充全局缺省版本号 //可能在默认为1的前提下这个请求version就需要为0 requestObject.getIntValue(VERSION) <= 0) { - HttpSession session = getSession(); - if (session != null && requestObject.get(VERSION) == null) { - requestObject.put(VERSION, session.getAttribute(VERSION)); - } - super.onVerifyContent(); - } - - - // //可重写来设置最大查询数量 - // @Override - // public int getMaxQueryCount() { - // return 50; - // } - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/APIJSONSQLConfig.java b/APIJSONFramework/src/main/java/apijson/framework/APIJSONSQLConfig.java deleted file mode 100755 index a2d99dc78..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/APIJSONSQLConfig.java +++ /dev/null @@ -1,212 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.framework; - -import static apijson.framework.APIJSONConstant.ID; -import static apijson.framework.APIJSONConstant.PRIVACY_; -import static apijson.framework.APIJSONConstant.USER_; -import static apijson.framework.APIJSONConstant.USER_ID; - -import java.util.List; - -import com.alibaba.fastjson.JSONObject; - -import apijson.RequestMethod; -import apijson.orm.AbstractSQLConfig; -import apijson.orm.Join; -import apijson.orm.SQLConfig; - - -/**SQL配置 - * TiDB 用法和 MySQL 一致 - * @author Lemon - */ -public class APIJSONSQLConfig extends AbstractSQLConfig { - public static final String TAG = "APIJSONSQLConfig"; - - public static Callback SIMPLE_CALLBACK; - static { - DEFAULT_DATABASE = DATABASE_MYSQL; //TODO 默认数据库类型,改成你自己的 - DEFAULT_SCHEMA = "sys"; //TODO 默认模式名,改成你自己的,默认情况是 MySQL: sys, PostgreSQL: public, SQL Server: dbo, Oracle: - - // 由 APIJSONVerifier.init 方法读取数据库 Access 表来替代手动输入配置 - // //表名映射,隐藏真实表名,对安全要求很高的表可以这么做 - // TABLE_KEY_MAP.put(User.class.getSimpleName(), "apijson_user"); - // TABLE_KEY_MAP.put(Privacy.class.getSimpleName(), "apijson_privacy"); - - //主键名映射 - SIMPLE_CALLBACK = new SimpleCallback() { - - @Override - public SQLConfig getSQLConfig(RequestMethod method, String database, String schema, String table) { - SQLConfig config = APIJSONApplication.DEFAULT_APIJSON_CREATOR.createSQLConfig(); - config.setMethod(method); - config.setTable(table); - return config; - } - - //取消注释来实现自定义各个表的主键名 - // @Override - // public String getIdKey(String database, String schema, String table) { - // return StringUtil.firstCase(table + "Id"); // userId, comemntId ... - // // return StringUtil.toLowerCase(t) + "_id"; // user_id, comemnt_id ... - // // return StringUtil.toUpperCase(t) + "_ID"; // USER_ID, COMMENT_ID ... - // } - - @Override - public String getUserIdKey(String database, String schema, String table) { - return USER_.equals(table) || PRIVACY_.equals(table) ? ID : USER_ID; // id / userId - } - - //取消注释来实现数据库自增 id - // @Override - // public Object newId(RequestMethod method, String database, String schema, String table) { - // return null; // return null 则不生成 id,一般用于数据库自增 id - // } - }; - } - - @Override - public String getDBVersion() { - if (isMySQL()) { - return "5.7.22"; //"8.0.11"; //TODO 改成你自己的 MySQL 或 PostgreSQL 数据库版本号 //MYSQL 8 和 7 使用的 JDBC 配置不一样 - } - if (isPostgreSQL()) { - return "9.6.15"; //TODO 改成你自己的 - } - if (isSQLServer()) { - return "2016"; //TODO 改成你自己的 - } - if (isOracle()) { - return "18c"; //TODO 改成你自己的 - } - return null; - } - @Override - public String getDBUri() { - if (isMySQL()) { - return "jdbc:mysql://localhost:3306"; //TODO 改成你自己的,TiDB 可以当成 MySQL 使用,默认端口为 4000 - } - if (isPostgreSQL()) { - return "jdbc:postgresql://localhost:5432/postgres"; //TODO 改成你自己的 - } - if (isSQLServer()) { - return "jdbc:jtds:sqlserver://localhost:1433/pubs;instance=SQLEXPRESS"; //TODO 改成你自己的 - } - if (isOracle()) { - return "jdbc:oracle:thin:@localhost:1521:orcl"; //TODO 改成你自己的 - } - return null; - } - @Override - public String getDBAccount() { - if (isMySQL()) { - return "root"; //TODO 改成你自己的 - } - if (isPostgreSQL()) { - return "postgres"; //TODO 改成你自己的 - } - if (isSQLServer()) { - return "sa"; //TODO 改成你自己的 - } - if (isOracle()) { - return "scott"; //TODO 改成你自己的 - } - return null; - } - @Override - public String getDBPassword() { - if (isMySQL()) { - return "apijson"; //TODO 改成你自己的,TiDB 可以当成 MySQL 使用, 默认密码为空字符串 "" - } - if (isPostgreSQL()) { - return null; //TODO 改成你自己的 - } - if (isSQLServer()) { - return "apijson@123"; //TODO 改成你自己的 - } - if (isOracle()) { - return "tiger"; //TODO 改成你自己的 - } - return null; - } - - //取消注释后,默认的数据库类型会由 MySQL 改为 PostgreSQL - // @Override - // public String getDatabase() { - // String db = super.getDatabase(); - // return db == null ? DATABASE_POSTGRESQL : db; - // } - - //如果确定只用一种数据库,可以重写方法,这种数据库直接 return true,其它数据库直接 return false,来减少判断,提高性能 - // @Override - // public boolean isMySQL() { - // return true; - // } - // @Override - // public boolean isPostgreSQL() { - // return false; - // } - // @Override - // public boolean isSQLServer() { - // return false; - // } - // @Override - // public boolean isOracle() { - // return false; - // } - - - - @Override - public String getIdKey() { - return SIMPLE_CALLBACK.getIdKey(getDatabase(), getSchema(), getTable()); - } - - @Override - public String getUserIdKey() { - return SIMPLE_CALLBACK.getUserIdKey(getDatabase(), getSchema(), getTable()); - } - - - public APIJSONSQLConfig() { - this(RequestMethod.GET); - } - public APIJSONSQLConfig(RequestMethod method) { - super(method); - } - public APIJSONSQLConfig(RequestMethod method, String table) { - super(method, table); - } - public APIJSONSQLConfig(RequestMethod method, int count, int page) { - super(method, count, page); - } - - - - /**获取SQL配置 - * @param table - * @param alias - * @param request - * @param isProcedure - * @return - * @throws Exception - */ - public static SQLConfig newSQLConfig(RequestMethod method, String table, String alias, JSONObject request, List joinList, boolean isProcedure) throws Exception { - return newSQLConfig(method, table, alias, request, joinList, isProcedure, SIMPLE_CALLBACK); - } - - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/APIJSONSQLExecutor.java b/APIJSONFramework/src/main/java/apijson/framework/APIJSONSQLExecutor.java deleted file mode 100755 index df7293387..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/APIJSONSQLExecutor.java +++ /dev/null @@ -1,129 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.framework; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.util.Map; - -import org.postgresql.util.PGobject; - -import com.alibaba.fastjson.JSONObject; - -import apijson.JSON; -import apijson.Log; -import apijson.NotNull; -import apijson.orm.AbstractSQLExecutor; -import apijson.orm.SQLConfig; - - -/**executor for query(read) or update(write) MySQL database - * @author Lemon - */ -public class APIJSONSQLExecutor extends AbstractSQLExecutor { - public static final String TAG = "APIJSONSQLExecutor"; - - static { - try { //加载驱动程序 - Log.d(TAG, "尝试加载 MySQL 8 驱动 <<<<<<<<<<<<<<<<<<<<< "); - Class.forName("com.mysql.cj.jdbc.Driver"); - Log.d(TAG, "成功加载 MySQL 8 驱动!>>>>>>>>>>>>>>>>>>>>>"); - } - catch (ClassNotFoundException e) { - Log.e(TAG, "加载 MySQL 8 驱动失败,请检查 pom.xml 中 mysql-connector-java 版本是否存在以及可用 !!!"); - e.printStackTrace(); - - try { //加载驱动程序 - Log.d(TAG, "尝试加载 MySQL 7 及以下版本的 驱动 <<<<<<<<<<<<<<<<<<<<< "); - Class.forName("com.mysql.jdbc.Driver"); - Log.d(TAG, "成功加载 MySQL 7 及以下版本的 驱动!>>>>>>>>>>>>>>>>>>>>> "); - } - catch (ClassNotFoundException e2) { - Log.e(TAG, "加载 MySQL 7 及以下版本的 驱动失败,请检查 pom.xml 中 mysql-connector-java 版本是否存在以及可用 !!!"); - e2.printStackTrace(); - } - } - - try { //加载驱动程序 - Log.d(TAG, "尝试加载 PostgresSQL 驱动 <<<<<<<<<<<<<<<<<<<<< "); - Class.forName("org.postgresql.Driver"); - Log.d(TAG, "成功加载 PostgresSQL 驱动!>>>>>>>>>>>>>>>>>>>>> "); - } - catch (ClassNotFoundException e) { - e.printStackTrace(); - Log.e(TAG, "加载 PostgresSQL 驱动失败,请检查 libs 目录中 postgresql.jar 版本是否存在以及可用 !!!"); - } - - - try { //加载驱动程序 - Log.d(TAG, "尝试加载 SQLServer 驱动 <<<<<<<<<<<<<<<<<<<<< "); - Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); - Log.d(TAG, "成功加载 SQLServer 驱动!>>>>>>>>>>>>>>>>>>>>> "); - } - catch (ClassNotFoundException e) { - e.printStackTrace(); - Log.e(TAG, "加载 SQLServer 驱动失败,请检查 pom.xml 中 net.sourceforge.jtds 版本是否存在以及可用 !!!"); - } - - try { //加载驱动程序 - Log.d(TAG, "尝试加载 Oracle 驱动 <<<<<<<<<<<<<<<<<<<<< "); - Class.forName("oracle.jdbc.driver.OracleDriver"); - Log.d(TAG, "成功加载 Oracle 驱动!>>>>>>>>>>>>>>>>>>>>> "); - } - catch (ClassNotFoundException e) { - e.printStackTrace(); - Log.e(TAG, "加载 Oracle 驱动失败,请检查 pom.xml 中 com.oracle.jdbc 版本是否存在以及可用 !!!"); - } - - try { //加载驱动程序 - Log.d(TAG, "尝试加载 DB2 驱动 <<<<<<<<<<<<<<<<<<<<< "); - Class.forName("com.ibm.db2.jcc.DB2Driver"); - Log.d(TAG, "成功加载 DB2 驱动!>>>>>>>>>>>>>>>>>>>>> "); - } - catch (ClassNotFoundException e) { - e.printStackTrace(); - Log.e(TAG, "加载 DB2 驱动失败,请检查 pom.xml 中 com.ibm.db2 版本是否存在以及可用 !!!"); - } - - } - - - @Override - public PreparedStatement setArgument(@NotNull SQLConfig config, @NotNull PreparedStatement statement, int index, Object value) throws SQLException { - if (config.isPostgreSQL() && JSON.isBooleanOrNumberOrString(value) == false) { - PGobject o = new PGobject(); - o.setType("jsonb"); - o.setValue(value == null ? null : value.toString()); - statement.setObject(index + 1, o); //PostgreSQL 除了基本类型,其它的必须通过 PGobject 设置进去,否则 jsonb = varchar 等报错 - return statement; - } - - return super.setArgument(config, statement, index, value); - } - - - @Override - protected Object getValue(SQLConfig config, ResultSet rs, ResultSetMetaData rsmd, int tablePosition, - JSONObject table, int columnIndex, String lable, Map childMap) throws Exception { - - Object value = super.getValue(config, rs, rsmd, tablePosition, table, columnIndex, lable, childMap); - - return value instanceof PGobject ? JSON.parse(((PGobject) value).getValue()) : value; - } - - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/APIJSONVerifier.java b/APIJSONFramework/src/main/java/apijson/framework/APIJSONVerifier.java deleted file mode 100755 index 110aeeda1..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/APIJSONVerifier.java +++ /dev/null @@ -1,244 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.framework; - -import static apijson.framework.APIJSONConstant.ACCESS_; -import static apijson.framework.APIJSONConstant.VISITOR_; -import static apijson.framework.APIJSONConstant.VISITOR_ID; - -import java.rmi.ServerException; -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.http.HttpSession; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -import apijson.JSON; -import apijson.JSONResponse; -import apijson.Log; -import apijson.NotNull; -import apijson.RequestMethod; -import apijson.RequestRole; -import apijson.StringUtil; -import apijson.orm.AbstractVerifier; -import apijson.orm.JSONRequest; -import apijson.orm.ParserCreator; -import apijson.orm.Visitor; - - -/**权限验证器 - * @author Lemon - */ -public class APIJSONVerifier extends AbstractVerifier { - public static final String TAG = "APIJSONVerifier"; - - // 由 init 方法读取数据库 Access 表来替代手动输入配置 - // // > - // // > - // static { //注册权限 - // ACCESS_MAP.put(User.class.getSimpleName(), getAccessMap(User.class.getAnnotation(MethodAccess.class))); - // ACCESS_MAP.put(Privacy.class.getSimpleName(), getAccessMap(Privacy.class.getAnnotation(MethodAccess.class))); - // ACCESS_MAP.put(Moment.class.getSimpleName(), getAccessMap(Moment.class.getAnnotation(MethodAccess.class))); - // ACCESS_MAP.put(Comment.class.getSimpleName(), getAccessMap(Comment.class.getAnnotation(MethodAccess.class))); - // ACCESS_MAP.put(Verify.class.getSimpleName(), getAccessMap(Verify.class.getAnnotation(MethodAccess.class))); - // ACCESS_MAP.put(Login.class.getSimpleName(), getAccessMap(Login.class.getAnnotation(MethodAccess.class))); - // } - - - /**初始化,加载所有权限配置 - * @return - * @throws ServerException - */ - public static JSONObject init() throws ServerException { - return init(false); - } - /**初始化,加载所有权限配置 - * @return - * @throws ServerException - */ - public static JSONObject init(ParserCreator creator) throws ServerException { - return init(false, creator); - } - /**初始化,加载所有权限配置 - * @param shutdownWhenServerError - * @return - * @throws ServerException - */ - public static JSONObject init(boolean shutdownWhenServerError) throws ServerException { - return init(shutdownWhenServerError, null); - } - /**初始化,加载所有权限配置 - * @param shutdownWhenServerError - * @return - * @throws ServerException - */ - public static JSONObject init(boolean shutdownWhenServerError, ParserCreator creator) throws ServerException { - JSONRequest request = new JSONRequest(); - - { //Access[]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - JSONRequest accessItem = new JSONRequest(); - - { //Access<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - JSONRequest access = new JSONRequest(); - accessItem.put(ACCESS_, access); - } //Access>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - request.putAll(accessItem.toArray(0, 0, ACCESS_)); - } //Access[]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - if (creator == null) { - creator = APIJSONApplication.DEFAULT_APIJSON_CREATOR; - } - - JSONObject response = creator.createParser().setMethod(RequestMethod.GET).setNeedVerify(false).parseResponse(request); - if (JSONResponse.isSuccess(response) == false) { - Log.e(TAG, "\n\n\n\n\n !!!! 查询权限配置异常 !!!\n" + response.getString(JSONResponse.KEY_MSG) + "\n\n\n\n\n"); - onServerError("查询权限配置异常 !", shutdownWhenServerError); - } - - JSONArray list = response.getJSONArray(ACCESS_ + "[]"); - if (list == null || list.isEmpty()) { - Log.w(TAG, "init list == null || list.isEmpty(),没有可用的权限配置"); - throw new NullPointerException("没有可用的权限配置"); - } - - Log.d(TAG, "init < for ACCESS_MAP.size() = " + ACCESS_MAP.size() + " <<<<<<<<<<<<<<<<<<<<<<<<"); - - ACCESS_MAP.clear(); - - JSONObject item; - for (int i = 0; i < list.size(); i++) { - item = list.getJSONObject(i); - if (item == null) { - continue; - } - - Map map = new HashMap<>(); - map.put(RequestMethod.GET, JSON.parseObject(item.getString("get"), RequestRole[].class)); - map.put(RequestMethod.HEAD, JSON.parseObject(item.getString("head"), RequestRole[].class)); - map.put(RequestMethod.GETS, JSON.parseObject(item.getString("gets"), RequestRole[].class)); - map.put(RequestMethod.HEADS, JSON.parseObject(item.getString("heads"), RequestRole[].class)); - map.put(RequestMethod.POST, JSON.parseObject(item.getString("post"), RequestRole[].class)); - map.put(RequestMethod.PUT, JSON.parseObject(item.getString("put"), RequestRole[].class)); - map.put(RequestMethod.DELETE, JSON.parseObject(item.getString("delete"), RequestRole[].class)); - - String name = item.getString("name"); - String alias = item.getString("alias"); - - /**TODO - * 以下判断写得比较复杂,因为表设计不够好,但为了兼容旧版 APIJSON 服务 和 APIAuto 工具而保留了下来。 - * 如果是 name 为接口传参的 表对象 的 key,对应一个可缺省的 tableName,判断就会简单不少。 - */ - - if (StringUtil.isEmpty(name, true)) { - onServerError("字段 name 的值不能为空!", shutdownWhenServerError); - } - - if (StringUtil.isEmpty(alias, true)) { - if (JSONRequest.isTableKey(name) == false) { - onServerError("name: " + name + "不合法!字段 alias 的值为空时,name 必须为合法表名!", shutdownWhenServerError); - } - - if (Log.DEBUG || item.getBooleanValue("debug") == false) { - ACCESS_MAP.put(name, map); - } - } - else { - if (JSONRequest.isTableKey(alias) == false) { - onServerError("alias: " + alias + "不合法!字段 alias 的值只能为 空 或者 合法表名!", shutdownWhenServerError); - } - - if (Log.DEBUG || item.getBooleanValue("debug") == false) { - ACCESS_MAP.put(alias, map); - } - } - - APIJSONSQLConfig.TABLE_KEY_MAP.put(alias, name); - } - - Log.d(TAG, "init for /> ACCESS_MAP.size() = " + ACCESS_MAP.size() + " >>>>>>>>>>>>>>>>>>>>>>>"); - - return response; - } - - - private static void onServerError(String msg, boolean shutdown) throws ServerException { - Log.e(TAG, "\n权限配置文档测试未通过!\n请修改 Access 表里的记录!\n保证前端看到的权限配置文档是正确的!!!\n\n原因:\n" + msg); - - if (shutdown) { - System.exit(1); - } else { - throw new ServerException(msg); - } - } - - - - @NotNull - @Override - public APIJSONParser createParser() { - APIJSONParser parser = new APIJSONParser(); - parser.setVisitor(visitor); - return parser; - } - - /**登录校验 - * @author - * @modifier Lemon - * @param session - * @throws Exception - */ - public static void verifyLogin(HttpSession session) throws Exception { - Log.d(TAG, "verifyLogin session.getId() = " + (session == null ? null : session.getId())); - new APIJSONVerifier().setVisitor(getVisitor(session)).verifyLogin(); - } - - - /**获取来访用户的id - * @author Lemon - * @param session - * @return - */ - public static long getVisitorId(HttpSession session) { - if (session == null) { - return 0; - } - Long id = (Long) session.getAttribute(VISITOR_ID); - if (id == null) { - Visitor v = getVisitor(session); - id = v == null ? 0 : value(v.getId()); - session.setAttribute(VISITOR_ID, id); - } - return value(id); - } - /**获取来访用户 - * @param session - * @return - */ - @SuppressWarnings("unchecked") - public static Visitor getVisitor(HttpSession session) { - return session == null ? null : (Visitor) session.getAttribute(VISITOR_); - } - - public static long value(Long v) { - return v == null ? 0 : v; - } - - - - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/BaseModel.java b/APIJSONFramework/src/main/java/apijson/framework/BaseModel.java deleted file mode 100755 index f50dba7d6..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/BaseModel.java +++ /dev/null @@ -1,304 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.framework; - -import java.io.Serializable; -import java.sql.Timestamp; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.Map; - -import com.alibaba.fastjson.JSON; - -import apijson.StringUtil; - -/**base model for reduce model codes - * @author Lemon - * @use extends BaseModel - */ -public abstract class BaseModel implements Serializable { - private static final long serialVersionUID = 1L; - - private Long id; //主键,唯一标识 - private Long userId; //对应User表中的id,外键 - private String date; //创建时间,JSON没有Date,TimeStamp类型,都会被转成Long,不能用! - - public Long getId() { - return id; - } - public BaseModel setId(Long id) { - this.id = id; - return this; - } - public Long getUserId() { - return userId; - } - public BaseModel setUserId(Long userId) { - this.userId = userId; - return this; - } - public String getDate() { - return date; - } - public BaseModel setDate(String date) { - this.date = date; - return this; - } - - - @Override - public String toString() { - return JSON.toJSONString(this); - } - - - /**获取当前时间戳 - * @return - */ - public static Timestamp currentTimeStamp() { - return new Timestamp(new Date().getTime()); - } - /**获取时间戳 TODO 判空? 还是要报错? - * @param time - * @return - */ - public static Timestamp getTimeStamp(String time) { - return Timestamp.valueOf(time); - } - /**获取时间毫秒值 TODO 判空? 还是要报错? - * @param time - * @return - */ - public static long getTimeMillis(String time) { - return StringUtil.isEmpty(time, true) ? 0 : getTimeStamp(time).getTime(); - } - - - //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断array是否为空 - * @param array - * @return - */ - public static boolean isEmpty(T[] array) { - return array == null || array.length <= 0; - } - /**判断collection是否为空 - * @param collection - * @return - */ - public static boolean isEmpty(Collection collection) { - return collection == null || collection.isEmpty(); - } - /**判断map是否为空 - * @param - * @param - * @param map - * @return - */ - public static boolean isEmpty(Map map) { - return map == null || map.isEmpty(); - } - //判断是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - //判断是否包含 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断array是否包含a - * @param array - * @param a - * @return - */ - public static boolean isContain(T[] array, T a) { - return array == null ? false : Arrays.asList(array).contains(a); - } - /**判断collection是否包含object - * @param collection - * @param object - * @return - */ - public static boolean isContain(Collection collection, T object) { - return collection != null && collection.contains(object); - } - /**判断map是否包含key - * @param - * @param - * @param map - * @param key - * @return - */ - public static boolean isContainKey(Map map, K key) { - return map != null && map.containsKey(key); - } - /**判断map是否包含value - * @param - * @param - * @param map - * @param value - * @return - */ - public static boolean isContainValue(Map map, V value) { - return map != null && map.containsValue(value); - } - //判断是否为包含 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取数量 - * @param - * @param array - * @return - */ - public static int count(T[] array) { - return array == null ? 0 : array.length; - } - /**获取数量 - * @param - * @param collection List, Vector, Set等都是Collection的子类 - * @return - */ - public static int count(Collection collection) { - return collection == null ? 0 : collection.size(); - } - /**获取数量 - * @param - * @param - * @param map - * @return - */ - public static int count(Map map) { - return map == null ? 0 : map.size(); - } - //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取 - * @param - * @param array - * @return - */ - public static T get(T[] array, int position) { - return position < 0 || position >= count(array) ? null : array[position]; - } - /**获取 - * @param - * @param collection List, Vector, Set等都是Collection的子类 - * @return - */ - @SuppressWarnings("unchecked") - public static T get(Collection collection, int position) { - return collection == null ? null : (T) get(collection.toArray(), position); - } - /**获取 - * @param - * @param - * @param map null ? null - * @param key null ? null : map.get(key); - * @return - */ - public static V get(Map map, K key) { - return key == null || map == null ? null : map.get(key); - } - //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - //获取非基本类型对应基本类型的非空值 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取非空值 - * @param value - * @return - */ - public static boolean value(Boolean value) { - return value == null ? false : value; - } - /**获取非空值 - * @param value - * @return - */ - public static int value(Integer value) { - return value == null ? 0 : value; - } - /**获取非空值 - * @param value - * @return - */ - public static long value(Long value) { - return value == null ? 0 : value; - } - /**获取非空值 - * @param value - * @return - */ - public static float value(Float value) { - return value == null ? 0 : value; - } - /**获取非空值 - * @param value - * @return - */ - public static double value(Double value) { - return value == null ? 0 : value; - } - //获取非基本类型对应基本类型的非空值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - /**index是否在arr长度范围内 - * @param index - * @param array - * @return - */ - public static boolean isIndexInRange(Integer index, Object[] array) { - return index != null && index >= 0 && index < count(array); - } - - /**获取在arr长度范围内的index - * defaultIndex = 0 - * @param index - * @param array - * @return - */ - public static int getIndexInRange(Integer index, Object[] array) { - return getIndexInRange(index, array, 0); - } - /**获取在arr长度范围内的index - * @param index - * @param array - * @param defaultIndex - * @return - */ - public static int getIndexInRange(Integer index, Object[] array, int defaultIndex) { - return isIndexInRange(index, array) ? index : defaultIndex; - } - - /**获取在arr长度范围内的index - * defaultIndex = 0 - * @param - * @param index - * @param array - * @return - */ - public static T getInRange(Integer index, T[] array) { - return getInRange(index, array, 0); - } - /**获取在arr长度范围内的index - * @param - * @param index - * @param array - * @param defaultIndex - * @return - */ - public static T getInRange(Integer index, T[] array, int defaultIndex) { - return get(array, getIndexInRange(index, array, defaultIndex)); - } - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/MethodUtil.java b/APIJSONFramework/src/main/java/apijson/framework/MethodUtil.java deleted file mode 100644 index 7dcc2b093..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/MethodUtil.java +++ /dev/null @@ -1,862 +0,0 @@ -package apijson.framework; - -import java.io.File; -import java.lang.reflect.Array; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; -import java.util.Set; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.alibaba.fastjson.parser.ParserConfig; -import com.alibaba.fastjson.util.TypeUtils; - -public class MethodUtil { - - - public interface Callback { - JSONObject newSuccessResult(); - JSONObject newErrorResult(Exception e); - } - - public static String KEY_CODE = "code"; - public static String KEY_MSG = "msg"; - - public static int CODE_SUCCESS = 200; - public static int CODE_SERVER_ERROR = 500; - public static String MSG_SUCCESS = "success"; - public static Callback CALLBACK = new Callback() { - - @Override - public JSONObject newSuccessResult() { - JSONObject result = new JSONObject(true); - result.put(KEY_CODE, CODE_SUCCESS); - result.put(KEY_MSG, MSG_SUCCESS); - return result; - } - - @Override - public JSONObject newErrorResult(Exception e) { - JSONObject result = new JSONObject(true); - result.put(KEY_CODE, CODE_SERVER_ERROR); - result.put(KEY_MSG, e.getMessage()); - return result; - } - }; - - // Map> - public static final Map, Map> INSTANCE_MAP; - public static final Map> PRIMITIVE_CLASS_MAP; - public static final Map> BASE_CLASS_MAP; - public static final Map> CLASS_MAP; - static { - INSTANCE_MAP = new HashMap<>(); - - PRIMITIVE_CLASS_MAP = new HashMap>(); - BASE_CLASS_MAP = new HashMap>(); - CLASS_MAP = new HashMap>(); - - PRIMITIVE_CLASS_MAP.put(boolean.class.getSimpleName(), boolean.class); - PRIMITIVE_CLASS_MAP.put(int.class.getSimpleName(), int.class); - PRIMITIVE_CLASS_MAP.put(long.class.getSimpleName(), long.class); - PRIMITIVE_CLASS_MAP.put(float.class.getSimpleName(), float.class); - PRIMITIVE_CLASS_MAP.put(double.class.getSimpleName(), double.class); - BASE_CLASS_MAP.putAll(PRIMITIVE_CLASS_MAP); - - BASE_CLASS_MAP.put(Boolean.class.getSimpleName(), Boolean.class); - BASE_CLASS_MAP.put(Integer.class.getSimpleName(), Integer.class); - BASE_CLASS_MAP.put(Long.class.getSimpleName(), Long.class); - BASE_CLASS_MAP.put(Float.class.getSimpleName(), Float.class); - BASE_CLASS_MAP.put(Double.class.getSimpleName(), Double.class); - BASE_CLASS_MAP.put(Number.class.getSimpleName(), Number.class); - BASE_CLASS_MAP.put(String.class.getSimpleName(), String.class); - BASE_CLASS_MAP.put(Object.class.getSimpleName(), Object.class); - CLASS_MAP.putAll(BASE_CLASS_MAP); - - CLASS_MAP.put(boolean[].class.getSimpleName(), boolean[].class); - CLASS_MAP.put(int[].class.getSimpleName(), int[].class); - CLASS_MAP.put(long[].class.getSimpleName(), long[].class); - CLASS_MAP.put(float[].class.getSimpleName(), float[].class); - CLASS_MAP.put(double[].class.getSimpleName(), double[].class); - CLASS_MAP.put(Array.class.getSimpleName(), Array.class); - CLASS_MAP.put(Boolean[].class.getSimpleName(), Boolean[].class); - CLASS_MAP.put(Integer[].class.getSimpleName(), Integer[].class); - CLASS_MAP.put(Long[].class.getSimpleName(), Long[].class); - CLASS_MAP.put(Float[].class.getSimpleName(), Float[].class); - CLASS_MAP.put(Double[].class.getSimpleName(), Double[].class); - CLASS_MAP.put(Number[].class.getSimpleName(), Number[].class); - CLASS_MAP.put(String[].class.getSimpleName(), String[].class); - CLASS_MAP.put(Object[].class.getSimpleName(), Object[].class); - CLASS_MAP.put(Array[].class.getSimpleName(), Array[].class); - - CLASS_MAP.put(Collection.class.getSimpleName(), Collection.class);//不允许指定 - CLASS_MAP.put(List.class.getSimpleName(), List.class);//不允许指定 - CLASS_MAP.put(ArrayList.class.getSimpleName(), ArrayList.class);//不允许指定 - CLASS_MAP.put(Map.class.getSimpleName(), Map.class);//不允许指定 - CLASS_MAP.put(HashMap.class.getSimpleName(), HashMap.class);//不允许指定 - CLASS_MAP.put(Set.class.getSimpleName(), Set.class);//不允许指定 - CLASS_MAP.put(HashSet.class.getSimpleName(), HashSet.class);//不允许指定 - - CLASS_MAP.put(JSON.class.getSimpleName(), JSON.class);//必须有,Map中没有getLongValue等方法 - CLASS_MAP.put(JSONObject.class.getSimpleName(), JSONObject.class);//必须有,Map中没有getLongValue等方法 - CLASS_MAP.put(JSONArray.class.getSimpleName(), JSONArray.class);//必须有,Collection中没有getJSONObject等方法 - } - - - - /**获取方法列表 - * @param request : - { - "sync": true, //同步到数据库 - "package": "apijson.demo.server", - "class": "DemoFunction", - "method": "plus", - "types": ["Integer", "String", "com.alibaba.fastjson.JSONObject"] - //不返回的话,这个接口没意义 "return": true, //返回 class list,方便调试 - } - * @return - */ - public static JSONObject listMethod(String request) { - JSONObject result; - - try { - JSONObject req = JSON.parseObject(request); - if (req == null) { - req = new JSONObject(true); - } - // boolean sync = req.getBooleanValue("sync"); - // boolean returnList = req.getBooleanValue("return"); - String pkgName = req.getString("package"); - String clsName = req.getString("class"); - String methodName = req.getString("method"); - JSONArray methodArgTypes = null; - - boolean allMethod = isEmpty(methodName, true); - - Class[] argTypes = null; - if (allMethod == false) { - methodArgTypes = req.getJSONArray("types"); - if (methodArgTypes != null && methodArgTypes.isEmpty() == false) { - argTypes = new Class[methodArgTypes.size()]; - - for (int i = 0; i < methodArgTypes.size(); i++) { - argTypes[i] = getType(methodArgTypes.getString(i), null, true); - } - } - } - - JSONArray list = getMethodListGroupByClass(pkgName, clsName, methodName, argTypes); - result = CALLBACK.newSuccessResult(); - // if (returnList) { - result.put("classList", list); //序列化 Class 只能拿到 name result.put("Class[]", JSON.parseArray(JSON.toJSONString(classlist))); - // } - } catch (Exception e) { - e.printStackTrace(); - result = CALLBACK.newErrorResult(e); - } - - return result; - } - - - - /**执行方法 - * @param request - * @return {@link #invokeMethod(String, Object)} - */ - public static JSONObject invokeMethod(String request) { - return invokeMethod(request, null); - } - /**执行方法 - * @param request - * @return {@link #invokeMethod(JSONObject, Object)} - */ - public static JSONObject invokeMethod(JSONObject request) { - return invokeMethod(request, null); - } - /**执行方法 - * @param request - * @param instance - * @return {@link #invokeMethod(JSONObject, Object)} - */ - public static JSONObject invokeMethod(String request, Object instance) { - return invokeMethod(JSON.parseObject(request), instance); - } - /**执行方法 - * @param req : - { - "package": "apijson.demo.server", - "class": "DemoFunction", - "classArgs": [ - null, - null, - 0, - null - ], - "method": "plus", - "methodArgs": [ - { - "type": "Integer", //可缺省,自动根据 value 来判断 - "value": 1 - }, - { - "type": "String", - "value": "APIJSON" - }, - { - "type": "JSONObject", //可缺省,JSONObject 已缓存到 CLASS_MAP - "value": {} - }, - { - "type": "apijson.demo.server.model.User", //不可缺省,且必须全称 - "value": { - "id": 1, - "name": "Tommy" - } - } - ] - } - * @param instance 默认自动 new,传非 null 值一般是因为 Spring 自动注入的 Service, Component, Mapper 等不能自己 new - * @return - */ - public static JSONObject invokeMethod(JSONObject req, Object instance) { - if (req == null) { - req = new JSONObject(true); - } - String pkgName = req.getString("package"); - String clsName = req.getString("class"); - String methodName = req.getString("method"); - - JSONObject result; - try { - Class clazz = getInvokeClass(pkgName, clsName); - if (clazz == null) { - throw new ClassNotFoundException("找不到 " + dot2Separator(pkgName) + "/" + clsName + " 对应的类!"); - } - - if (instance == null && req.getBooleanValue("static") == false) { - instance = getInvokeInstance(clazz, getArgList(req, "classArgs")); - } - - JSONObject ir = getInvokeResult(clazz, instance, methodName, getArgList(req, "methodArgs")); - - result = CALLBACK.newSuccessResult(); - result.put("invoke", ir == null ? null : ir.get("invoke")); - result.put("types", ir == null ? null : ir.get("types")); - result.put("args", ir == null ? null : ir.get("args")); - result.put("instance", instance); - } - catch (Exception e) { - e.printStackTrace(); - if (e instanceof NoSuchMethodException) { - e = new IllegalArgumentException("字符 " + methodName + " 对应的方法不在 " + pkgName + "/" + clsName + " 内!" - + "\n请检查函数名和参数数量是否与已定义的函数一致!\n" + e.getMessage()); - } - if (e instanceof InvocationTargetException) { - Throwable te = ((InvocationTargetException) e).getTargetException(); - if (isEmpty(te.getMessage(), true) == false) { //到处把函数声明throws Exception改成throws Throwable挺麻烦 - e = te instanceof Exception ? (Exception) te : new Exception(te.getMessage()); - } - e = new IllegalArgumentException("字符 " + methodName + " 对应的方法传参类型错误!" - + "\n请检查 key:value 中value的类型是否满足已定义的函数的要求!\n" + e.getMessage()); - } - result = CALLBACK.newErrorResult(e); - result.put("throw", e.getClass().getTypeName()); - result.put("cause", e.getCause()); - result.put("trace", e.getStackTrace()); - } - - return result; - } - - - public static List getArgList(JSONObject req, String arrKey) { - JSONArray arr = req == null ? null : JSON.parseArray(req.getString(arrKey)); - - List list = null; - if (arr != null && arr.isEmpty() == false) { - list = new ArrayList<>(); - for (Object item : arr) { - if (item instanceof Boolean || item instanceof Number || item instanceof Collection) { - list.add(new Argument(null, item)); - } - else if (item instanceof String) { - String str = (String) item; - int index = str.indexOf(":"); - String type = index < 0 ? null : str.substring(0, index); - String value = index < 0 ? str : str.substring(index + 1); - list.add(new Argument(type, value)); - } - else { //null 合法,也要加,按顺序调用的 - list.add(item == null ? null : JSON.parseObject(JSON.toJSONString(item), Argument.class)); - } - } - } - return list; - } - - - - /**获取类 - * @param pkgName - * @param clsName - * @return - * @throws Exception - */ - public static Class getInvokeClass(String pkgName, String clsName) throws Exception { - return findClass(pkgName, clsName, false); - } - - /**获取示例 - * @param clazz - * @param pkgName - * @param clsName - * @param classArgs - * @return - * @throws Exception - */ - public static Object getInvokeInstance(Class clazz, List classArgs) throws Exception { - //new 出实例 - Map clsMap = INSTANCE_MAP.get(clazz); - if (clsMap == null) { - clsMap = new HashMap<>(); - INSTANCE_MAP.put(clazz, clsMap); - } - - String key = classArgs == null || classArgs.isEmpty() ? "" : JSON.toJSONString(classArgs); - Object instance = clsMap.get(key); //必须精确对应值,否则去除缓存的和需要的很可能不符 - - if (instance == null) { - if (classArgs == null || classArgs.isEmpty()) { - instance = clazz.newInstance(); - } - else { //通过构造方法 - boolean exactContructor = false; //指定某个构造方法,只要某一项 type 不为空就是 - for (int i = 0; i < classArgs.size(); i++) { - Argument obj = classArgs.get(i); - if (obj != null && isEmpty(obj.getType(), true) == false) { - exactContructor = true; - break; - } - } - - Class[] classArgTypes = new Class[classArgs.size()]; - Object[] classArgValues = new Object[classArgs.size()]; - initTypesAndValues(classArgs, classArgTypes, classArgValues, exactContructor); - - if (exactContructor) { //指定某个构造方法 - Constructor constructor = clazz.getConstructor(classArgTypes); - instance = constructor.newInstance(classArgValues); - } - else { //尝试参数数量一致的构造方法 - Constructor[] constructors = clazz.getConstructors(); - if (constructors != null) { - for (int i = 0; i < constructors.length; i++) { - if (constructors[i] != null && constructors[i].getParameterCount() == classArgValues.length) { - try { - instance = constructors[i].newInstance(classArgValues); - break; - } - catch (Exception e) {} - } - } - } - } - - } - - if (instance == null) { //通过默认方法 - throw new NullPointerException("找不到 " + dot2Separator(clazz.getName()) + " 以及 classArgs 对应的构造方法!"); - } - - clsMap.put(key, instance); - } - - return instance; - } - - /**获取方法 - * @param clazz - * @param methodName - * @param methodArgs - * @return - * @throws Exception - */ - public static Method getInvokeMethod(Class clazz, String methodName, List methodArgs) throws Exception { - Objects.requireNonNull(clazz); - Objects.requireNonNull(methodName); - - //method argument, types and values - Class[] types = null; - Object[] args = null; - - if (methodArgs != null && methodArgs.isEmpty() == false) { - types = new Class[methodArgs.size()]; - args = new Object[methodArgs.size()]; - initTypesAndValues(methodArgs, types, args, true); - } - - return clazz.getMethod(methodName, types); - } - - /**执行方法并返回结果 - * @param instance - * @param methodName - * @param methodArgs - * @return - * @throws Exception - */ - public static JSONObject getInvokeResult(Class clazz, Object instance, String methodName, List methodArgs) throws Exception { - Objects.requireNonNull(clazz); - Objects.requireNonNull(methodName); - - //method argument, types and values - Class[] types = null; - Object[] args = null; - - if (methodArgs != null && methodArgs.isEmpty() == false) { - types = new Class[methodArgs.size()]; - args = new Object[methodArgs.size()]; - initTypesAndValues(methodArgs, types, args, true); - } - - JSONObject result = new JSONObject(); - result.put("invoke", clazz.getMethod(methodName, types).invoke(instance, args)); - result.put("types", types); - result.put("args", args); - return result; - } - - - /**获取用 Class 分组的 Method 二级嵌套列表 - * @param pkgName - * @param clsName - * @param methodName - * @param argTypes - * @return - * @throws Exception - */ - public static JSONArray getMethodListGroupByClass(String pkgName, String clsName - , String methodName, Class[] argTypes) throws Exception { - - boolean allMethod = isEmpty(methodName, true); - - List> classlist = findClassList(pkgName, clsName, true); - JSONArray list = null; - if (classlist != null) { - list = new JSONArray(classlist.size()); - - for (Class cls : classlist) { - if (cls == null) { - continue; - } - - JSONObject clsObj = new JSONObject(true); - - clsObj.put("name", cls.getSimpleName()); - clsObj.put("type", trimType(cls.getGenericSuperclass())); - clsObj.put("package", dot2Separator(cls.getPackage().getName())); - - JSONArray methodList = null; - if (allMethod == false && argTypes != null && argTypes.length > 0) { - Object mObj = parseMethodObject(cls.getMethod(methodName, argTypes)); - if (mObj != null) { - methodList = new JSONArray(1); - methodList.add(mObj); - } - } - else { - Method[] methods = cls.getDeclaredMethods(); //父类的就用父类去获取 cls.getMethods(); - if (methods != null && methods.length > 0) { - methodList = new JSONArray(methods.length); - - for (Method m : methods) { - if (m == null) { - continue; - } - if (allMethod || methodName.equals(m.getName())) { - methodList.add(parseMethodObject(m)); - } - } - } - } - clsObj.put("methodList", methodList); //太多不需要的信息,导致后端返回慢、前端卡 UI clsObj.put("Method[]", JSON.parseArray(methods)); - - list.add(clsObj); - } - - } - - return list; - } - - - - public static String dot2Separator(String name) { - return name == null ? null : name.replaceAll("\\.", File.separator); - } - - // private void initTypesAndValues(JSONArray methodArgs, Class[] types, Object[] args) - // throws IllegalArgumentException, ClassNotFoundException, IOException { - // initTypesAndValues(methodArgs, types, args, false); - // } - - public static void initTypesAndValues(List methodArgs, Class[] types, Object[] args, boolean defaultType) - throws IllegalArgumentException, ClassNotFoundException { - if (methodArgs == null || methodArgs.isEmpty()) { - return; - } - if (types == null || args == null) { - throw new IllegalArgumentException("types == null || args == null !"); - } - if (types.length != methodArgs.size() || args.length != methodArgs.size()) { - throw new IllegalArgumentException("methodArgs.isEmpty() || types.length != methodArgs.size() || args.length != methodArgs.size() !"); - } - - Argument argObj; - - String typeName; - Object value; - for (int i = 0; i < methodArgs.size(); i++) { - argObj = methodArgs.get(i); - - typeName = argObj == null ? null : argObj.getType(); - value = argObj == null ? null : argObj.getValue(); - - // if (typeName != null && value != null && value.getClass().equals(CLASS_MAP.get(typeName)) == false) { - //// if ("double".equals(typeName)) { - // value = TypeUtils.cast(value, CLASS_MAP.get(typeName), new ParserConfig()); - //// } - //// else if (PRIMITIVE_CLASS_MAP.containsKey(typeName)) { - //// value = JSON.parse(JSON.toJSONString(value)); - //// } else { - //// value = JSON.parseObject(JSON.toJSONString(value), Class.forName(typeName)); - //// } - // } - - types[i] = getType(typeName, value, defaultType); - - if (value != null && types[i] != null && value.getClass().equals(types[i]) == false) { - value = TypeUtils.cast(value, types[i], new ParserConfig()); - } - - args[i] = value; - } - } - - public static JSONObject parseMethodObject(Method m) { - if (m == null) { - return null; - } - //排除 private 和 protected 等访问不到的方法,以后可以通过 IDE 插件为这些方法新增代理方法 - /* - public Type $_delegate_$method(Type0 arg0, Type1 arg1...) { - Type returnVal = method(arg0, arg1...) - if (returnVal instanceof Void) { - return new Object[]{ watchVar0, watchVar1... } //FIXME void 方法需要指定要观察的变量 - } - return returnVal; - } - */ - int mod = m.getModifiers(); - if (Modifier.isPrivate(mod) || Modifier.isProtected(mod)) { - return null; - } - - JSONObject obj = new JSONObject(true); - obj.put("name", m.getName()); - obj.put("parameterTypeList", trimTypes(m.getParameterTypes())); //不能用泛型,会导致解析崩溃 m.getGenericParameterTypes())); - obj.put("genericParameterTypeList", trimTypes(m.getGenericParameterTypes())); //不能用泛型,会导致解析崩溃 m.getGenericParameterTypes())); - obj.put("returnType", trimType(m.getReturnType())); //不能用泛型,会导致解析崩溃m.getGenericReturnType())); - obj.put("genericReturnType", trimType(m.getGenericReturnType())); //不能用泛型,会导致解析崩溃m.getGenericReturnType())); - obj.put("static", Modifier.isStatic(m.getModifiers())); - obj.put("exceptionTypeList", trimTypes(m.getExceptionTypes())); //不能用泛型,会导致解析崩溃m.getGenericExceptionTypes())); - obj.put("genericExceptionTypeList", trimTypes(m.getGenericExceptionTypes())); //不能用泛型,会导致解析崩溃m.getGenericExceptionTypes())); - return obj; - } - - private static String[] trimTypes(Type[] types) { - if (types != null && types.length > 0) { - String[] names = new String[types.length]; - for (int i = 0; i < types.length; i++) { - names[i] = trimType(types[i]); - } - return names; - } - return null; - } - private static String trimType(Type type) { - return trimType(type == null ? null : type.getTypeName()); - } - private static String trimType(String name) { - if (name == null || "void".equals(name)) { - return null; - } - - Collection>> set = CLASS_MAP.entrySet(); - for (Entry> e : set) { - if (name.equals(e.getValue().getTypeName())) { - return e.getKey(); - } - } - - String child = ""; - int index; - do { - index = name.indexOf("<"); - if (index < 0) { - break; - } - child += "<" + trimType(name.substring(index + 1, name.lastIndexOf(">"))) + ">"; - name = name.substring(0, index); - } - while (index >= 0); - - if (name.startsWith("java.lang.")) { - name = name.substring("java.lang.".length()); - } - if (name.startsWith("java.util.")) { - name = name.substring("java.util.".length()); - } - if (name.startsWith("com.alibaba.fastjson.")) { - name = name.substring("com.alibaba.fastjson.".length()); - } - - return dot2Separator(name) + child; - } - - - // private Class getType(String name) throws ClassNotFoundException, IOException { - // return getType(name, null); - // } - // private Class getType(String name, Object value) throws ClassNotFoundException, IOException { - // return getType(name, value, false); - // } - public static Class getType(String name, Object value, boolean defaultType) throws ClassNotFoundException { - Class type = null; - if (isEmpty(name, true)) { //根据值来自动判断 - if (value == null || defaultType == false) { - //nothing - } - else { - type = value.getClass(); - } - } - else { - int index = name.indexOf("<"); - if (index >= 0) { - name = name.substring(0, index); - } - - type = CLASS_MAP.get(name); - if (type == null) { - name = dot2Separator(name); - index = name.lastIndexOf(File.separator); - type = findClass(index < 0 ? "" : name.substring(0, index), index < 0 ? name : name.substring(index + 1), defaultType); - - if (type != null) { - CLASS_MAP.put(name, type); - } - } - } - - if (type == null && defaultType) { - type = Object.class; - } - - return type; - } - - /** - * 提供直接调用的方法 - * @param packageOrFileName - * @param className - * @param ignoreError - * @return - * @throws ClassNotFoundException - */ - public static Class findClass(String packageOrFileName, String className, boolean ignoreError) throws ClassNotFoundException { - //根目录 Objects.requireNonNull(packageName); - Objects.requireNonNull(className); - - //FIXME 这个方法在 jar 包里获取不到 class,主要是 ClassLoader.getResource(packageOrFileName) 取出来为 null,试了多种方法都没解决 - try { - List> list = findClassList(packageOrFileName, className, ignoreError); - Class cls = list == null || list.isEmpty() ? null : list.get(0); - if (cls != null) { - return cls; - } - } catch(Exception e) { } - - int index = className.indexOf("<"); - if (index >= 0) { - className = className.substring(0, index); - } - //这个方法保证在 jar 包里能正常执行 - return Class.forName(isEmpty(packageOrFileName, true) ? className : packageOrFileName.replaceAll("/", ".") + "." + className); - } - - /** - * @param packageOrFileName - * @param className - * @param ignoreError - * @return - * @throws ClassNotFoundException - */ - public static List> findClassList(String packageOrFileName, String className, boolean ignoreError) throws ClassNotFoundException { - List> list = new ArrayList<>(); - - int index = className.indexOf("<"); - if (index >= 0) { - className = className.substring(0, index); - } - - boolean allPackage = isEmpty(packageOrFileName, true); - boolean allName = isEmpty(className, true); - - //将报名替换成目录 - String fileName = allPackage ? File.separator : dot2Separator(packageOrFileName); - - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - - //通过 ClassLoader 来获取文件列表 - File file; - try { - file = new File(loader.getResource(fileName).getFile()); - } catch (Exception e) { - if (ignoreError) { - return null; - } - throw e; - } - - File[] files; - // if (allPackage) { //getResource 已经过滤了 - files = file.listFiles(); - // } - // else { - // files = file.listFiles(new FilenameFilter() { - // - // @Override - // public boolean accept(File dir, String name) { - // if (fileName.equals(dir.getAbsolutePath())) { - // - // } - // return false; - // } - // }); - // } - - if (files != null) { - for (File f : files) { - if (f.isDirectory()) { //如果是目录,这进一个寻找 - if (allPackage) { - //进一步寻找 - List> childList = findClassList(f.getAbsolutePath(), className, ignoreError); - if (childList != null && childList.isEmpty() == false) { - list.addAll(childList); - } - } - } - else { //如果是class文件 - String name = trim(f.getName()); - if (name != null && name.endsWith(".class")) { - name = name.substring(0, name.length() - ".class".length()); - if (name.isEmpty() || name.equals("package-info") || name.contains("$")) { - continue; - } - - if (allName || className.equals(name)) { - //反射出实例 - try { - Class clazz = loader.loadClass(packageOrFileName.replaceAll(File.separator, "\\.") + "." + name); - list.add(clazz); - - if (allName == false) { - break; - } - } catch (Exception e) { - if (ignoreError == false) { - throw e; - } - e.printStackTrace(); - } - - } - } - } - } - } - - return list; - } - - - /**判断字符是否为空 - * @param s - * @param trim - * @return - */ - public static boolean isEmpty(String s, boolean trim) { - // Log.i(TAG, "isEmpty s = " + s); - if (s == null) { - return true; - } - - if (trim) { - s = s.trim(); - } - - return s.isEmpty(); - } - - /**判断字符是否为空 - * @param s - * @return - */ - public static String trim(String s) { - // Log.i(TAG, "trim s = " + s); - return s == null ? null : s.trim(); - } - - - /**参数,包括类型和值 - */ - public static class Argument { - private String type; - private Object value; - - public Argument() { - } - public Argument(String type, Object value) { - setType(type); - setValue(value); - } - - public String getType() { - return type; - } - public void setType(String type) { - this.type = type; - } - public Object getValue() { - return value; - } - public void setValue(Object value) { - this.value = value; - } - } - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/StructureUtil.java b/APIJSONFramework/src/main/java/apijson/framework/StructureUtil.java deleted file mode 100755 index 086c55809..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/StructureUtil.java +++ /dev/null @@ -1,252 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.framework; - -import static apijson.framework.APIJSONConstant.REQUEST_; - -import java.rmi.ServerException; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -import apijson.JSON; -import apijson.JSONResponse; -import apijson.Log; -import apijson.RequestMethod; -import apijson.StringUtil; -import apijson.orm.JSONRequest; -import apijson.orm.ParserCreator; -import apijson.orm.SQLCreator; -import apijson.orm.Structure; - - -/**请求结构校验 - * @author Lemon - */ -public class StructureUtil { - public static final String TAG = "StructureUtil"; - - //根据 version 动态从数据库查的 version{}:">=$currentVersion",所以静态缓存暂时没用 public static final Map REQUEST_MAP; - static { - // REQUEST_MAP = new HashMap<>(); - } - - /**初始化,加载所有请求校验配置 - * @return - * @throws ServerException - */ - public static JSONObject init() throws ServerException { - return init(false); - } - /**初始化,加载所有请求校验配置 - * @param shutdownWhenServerError - * @return - * @throws ServerException - */ - public static JSONObject init(boolean shutdownWhenServerError) throws ServerException { - return init(shutdownWhenServerError, null); - } - /**初始化,加载所有请求校验配置 - * @param creator - * @return - * @throws ServerException - */ - public static JSONObject init(ParserCreator creator) throws ServerException { - return init(false, creator); - } - /**初始化,加载所有请求校验配置 - * @param shutdownWhenServerError - * @param creator - * @return - * @throws ServerException - */ - public static JSONObject init(boolean shutdownWhenServerError, ParserCreator creator) throws ServerException { - JSONRequest request = new JSONRequest(); - - { //Request[]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - JSONRequest requestItem = new JSONRequest(); - - { //Request<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - requestItem.put(REQUEST_, new JSONRequest()); - } //Request>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - request.putAll(requestItem.toArray(0, 0, REQUEST_)); - - } //Request[]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - if (creator == null) { - creator = APIJSONApplication.DEFAULT_APIJSON_CREATOR; - } - - JSONObject response = creator.createParser().setMethod(RequestMethod.GET).setNeedVerify(false).parseResponse(request); - if (JSONResponse.isSuccess(response) == false) { - Log.e(TAG, "\n\n\n\n\n !!!! 查询权限配置异常 !!!\n" + response.getString(JSONResponse.KEY_MSG) + "\n\n\n\n\n"); - onServerError("查询权限配置异常 !", shutdownWhenServerError); - } - - JSONArray list = response.getJSONArray(REQUEST_ + "[]"); - if (list == null || list.isEmpty()) { - Log.w(TAG, "init list == null || list.isEmpty(),没有可用的权限配置"); - throw new NullPointerException("没有可用的权限配置"); - } - - // Log.d(TAG, "init < for REQUEST_MAP.size() = " + REQUEST_MAP.size() + " <<<<<<<<<<<<<<<<<<<<<<<<"); - - // REQUEST_MAP.clear(); - - JSONObject item; - for (int i = 0; i < list.size(); i++) { - item = list.getJSONObject(i); - if (item == null) { - continue; - } - - String version = item.getString("version"); - if (StringUtil.isEmpty(version, true)) { - Log.e(TAG, "init for StringUtil.isEmpty(version, true),Request 表中的 version 不能为空!"); - onServerError("服务器内部错误,Request 表中的 version 不能为空!", shutdownWhenServerError); - } - - String method = item.getString("method"); - if (StringUtil.isEmpty(method, true)) { - Log.e(TAG, "init for StringUtil.isEmpty(method, true),Request 表中的 method 不能为空!"); - onServerError("服务器内部错误,Request 表中的 method 不能为空!", shutdownWhenServerError); - } - - String tag = item.getString("tag"); - if (StringUtil.isEmpty(tag, true)) { - Log.e(TAG, "init for StringUtil.isEmpty(tag, true),Request 表中的 tag 不能为空!"); - onServerError("服务器内部错误,Request 表中的 tag 不能为空!", shutdownWhenServerError); - } - - JSONObject structure = JSON.parseObject(item.getString("structure")); - - - JSONObject target = null; - - if (structure != null) { - target = structure; - if (structure.containsKey(tag) == false) { //tag 是 Table 名或 Table[] - - boolean isArrayKey = tag.endsWith(":[]"); // JSONRequest.isArrayKey(tag); - String key = isArrayKey ? tag.substring(0, tag.length() - 3) : tag; - - if (apijson.JSONObject.isTableKey(key)) { - if (isArrayKey) { //自动为 tag = Comment:[] 的 { ... } 新增键值对 "Comment[]":[] 为 { "Comment[]":[], ... } - target.put(key + "[]", new JSONArray()); - } - else { //自动为 tag = Comment 的 { ... } 包一层为 { "Comment": { ... } } - target = new JSONObject(true); - target.put(tag, structure); - } - } - } - } - - if (target == null || target.isEmpty()) { - Log.e(TAG, "init for target == null || target.isEmpty()"); - onServerError("服务器内部错误,Request 表中的 version = " + version + ", method = " + method + ", tag = " + tag + " 对应的 structure 不能为空!", shutdownWhenServerError); - } - - // REQUEST_MAP.put(tag, target); - } - - // Log.d(TAG, "init for /> REQUEST_MAP.size() = " + REQUEST_MAP.size() + " >>>>>>>>>>>>>>>>>>>>>>>"); - - return response; - } - - private static void onServerError(String msg, boolean shutdown) throws ServerException { - Log.e(TAG, "\n请求校验配置文档测试未通过!\n请修改 Request 表里的记录!\n保证前端看到的请求校验配置文档是正确的!!!\n\n原因:\n" + msg); - - if (shutdown) { - System.exit(1); - } else { - throw new ServerException(msg); - } - } - - - static final String requestString = "{\"Comment\":{\"DISALLOW\": \"id\", \"NECESSARY\": \"userId,momentId,content\"}, \"ADD\":{\"Comment:to\":{}}}"; - static final String responseString = "{\"User\":{\"REMOVE\": \"phone\", \"REPLACE\":{\"sex\":2}, \"ADD\":{\"name\":\"api\"}}, \"PUT\":{\"Comment:to\":{}}}"; - /**测试 - * @throws Exception - */ - public static void test() throws Exception { - test(null); - } - /**测试 - * @throws Exception - */ - public static void test(SQLCreator creator) throws Exception { - JSONObject request; - - if (creator == null) { - creator = APIJSONApplication.DEFAULT_APIJSON_CREATOR; - } - - try { - request = JSON.parseObject("{\"Comment\":{\"userId\":0}}"); - Log.d(TAG, "test parseRequest = " + Structure.parseRequest(RequestMethod.POST, "", JSON.parseObject(requestString), request, creator)); - } catch (Exception e) { - e.printStackTrace(); - } - try { - request = JSON.parseObject("{\"Comment\":{\"userId\":0, \"momentId\":0, \"content\":\"apijson\"}}"); - Log.d(TAG, "test parseRequest = " + Structure.parseRequest(RequestMethod.POST, "", JSON.parseObject(requestString), request, creator)); - } catch (Exception e) { - e.printStackTrace(); - } - try { - request = JSON.parseObject("{\"Comment\":{\"id\":0, \"userId\":0, \"momentId\":0, \"content\":\"apijson\"}}"); - Log.d(TAG, "test parseRequest = " + Structure.parseRequest(RequestMethod.POST, "", JSON.parseObject(requestString), request, creator)); - } catch (Exception e) { - e.printStackTrace(); - } - - - JSONObject response; - try { - response = JSON.parseObject("{\"User\":{\"userId\":0}}"); - Log.d(TAG, "test parseResponse = " + Structure.parseResponse(RequestMethod.GET, "", JSON.parseObject(responseString), response, creator, null)); - } catch (Exception e) { - e.printStackTrace(); - } - try { - response = JSON.parseObject("{\"User\":{\"userId\":0, \"phone\":\"12345678\"}}"); - Log.d(TAG, "test parseResponse = " + Structure.parseResponse(RequestMethod.GET, "", JSON.parseObject(responseString), response, creator, null)); - } catch (Exception e) { - e.printStackTrace(); - } - try { - response = JSON.parseObject("{\"User\":{\"userId\":0, \"phone\":\"12345678\", \"sex\":1}}"); - Log.d(TAG, "test parseResponse = " + Structure.parseResponse(RequestMethod.GET, "", JSON.parseObject(responseString), response, creator, null)); - } catch (Exception e) { - e.printStackTrace(); - } - try { - response = JSON.parseObject("{\"User\":{\"id\":0, \"name\":\"tommy\", \"phone\":\"12345678\", \"sex\":1}}"); - Log.d(TAG, "test parseResponse = " + Structure.parseResponse(RequestMethod.GET, "", JSON.parseObject(responseString), response,creator, null)); - } catch (Exception e) { - e.printStackTrace(); - } - - } - - - - -} diff --git a/APIJSONFramework/src/main/java/apijson/framework/package-info.java b/APIJSONFramework/src/main/java/apijson/framework/package-info.java deleted file mode 100755 index 1eaed8552..000000000 --- a/APIJSONFramework/src/main/java/apijson/framework/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * 服务端框架 - */ -/** - * @author Lemon - * - */ -package apijson.framework; \ No newline at end of file diff --git a/APIJSONFramework/src/main/resources/application.properties b/APIJSONFramework/src/main/resources/application.properties deleted file mode 100755 index e69de29bb..000000000 diff --git a/APIJSONORM/pom.xml b/APIJSONORM/pom.xml index 5174b0561..2afcfcf35 100755 --- a/APIJSONORM/pom.xml +++ b/APIJSONORM/pom.xml @@ -5,7 +5,7 @@ apijson.orm apijson-orm - 4.1.0 + 4.2.1 jar APIJSONORM @@ -22,7 +22,7 @@ com.alibaba fastjson - 1.2.61 + 1.2.73