From e2594136487007063502ae97a7659fa63009647a Mon Sep 17 00:00:00 2001 From: Honghua Zhu Date: Thu, 10 May 2018 16:25:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E7=BD=AEEXECUTE=5FSERVICE=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/service/ServiceExecuterManager.java | 19 +++++--- .../org/lealone/sql/ddl/CreateService.java | 10 +++-- .../sql/expression/function/Function.java | 45 +++++++++++++------ .../lealone/test/service/ServiceConsumer.java | 5 +++ .../org/lealone/test/service/ServiceTest.java | 11 ----- .../service/generated/HelloWorldService.java | 8 ++-- .../test/service/generated/UserService.java | 4 +- .../test/service/impl/UserServiceImpl.java | 12 ++--- .../vertx/SockJSSocketServiceHandler.java | 3 +- 9 files changed, 67 insertions(+), 50 deletions(-) diff --git a/lealone-db/src/main/java/org/lealone/db/service/ServiceExecuterManager.java b/lealone-db/src/main/java/org/lealone/db/service/ServiceExecuterManager.java index 877b10813..989fb84c4 100644 --- a/lealone-db/src/main/java/org/lealone/db/service/ServiceExecuterManager.java +++ b/lealone-db/src/main/java/org/lealone/db/service/ServiceExecuterManager.java @@ -28,14 +28,17 @@ private ServiceExecuterManager() { private static final HashMap serviceExecuterClassNames = new HashMap<>(); public synchronized static void registerServiceExecuter(String name, ServiceExecuter serviceExecuter) { + name = name.toUpperCase(); serviceExecuters.put(name, serviceExecuter); } public synchronized static void registerServiceExecuter(String name, String serviceExecuterClassName) { + name = name.toUpperCase(); serviceExecuterClassNames.put(name, serviceExecuterClassName); } public synchronized void deregisterServiceExecuter(String name) { + name = name.toUpperCase(); serviceExecuters.remove(name); } @@ -48,22 +51,24 @@ public static String executeServiceWithReturnValue(String serviceName, String js } private static String executeService(String serviceName, String json) { - // System.out.println("serviceName=" + serviceName + ", json=" + json); + serviceName = serviceName.toUpperCase(); int dotPos = serviceName.indexOf('.'); String methodName = serviceName.substring(dotPos + 1); serviceName = serviceName.substring(0, dotPos); - // serviceName = "org.lealone.test.vertx.impl." + toClassName(serviceName); ServiceExecuter serviceExecuter = serviceExecuters.get(serviceName); if (serviceExecuter == null) { String serviceExecuterClassName = serviceExecuterClassNames.get(serviceName); if (serviceExecuterClassName != null) { synchronized (serviceExecuterClassNames) { - try { - serviceExecuter = (ServiceExecuter) Class.forName(serviceExecuterClassName).newInstance(); - serviceExecuters.put(serviceName, serviceExecuter); - } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { - throw new RuntimeException("newInstance exception: " + serviceExecuterClassName); + serviceExecuter = serviceExecuters.get(serviceName); + if (serviceExecuter == null) { + try { + serviceExecuter = (ServiceExecuter) Class.forName(serviceExecuterClassName).newInstance(); + serviceExecuters.put(serviceName, serviceExecuter); + } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { + throw new RuntimeException("newInstance exception: " + serviceExecuterClassName); + } } } } else { diff --git a/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateService.java b/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateService.java index f1d1a6550..46c8b7550 100644 --- a/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateService.java +++ b/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateService.java @@ -391,10 +391,10 @@ private void genServiceInterfaceCode() { buff.append(" private final String url;\r\n"); if (hasNoReturnValueMethods) buff.append(" private static final String sqlNoReturnValue " - + "= \"{call executeServiceNoReturnValue(?,?)}\";\r\n"); + + "= \"{call EXECUTE_SERVICE_NO_RETURN_VALUE(?,?)}\";\r\n"); if (hasWithReturnValueMethods) buff.append(" private static final String sqlWithReturnValue " - + "= \"{? = call executeServiceWithReturnValue(?,?)}\";\r\n"); + + "= \"{? = call EXECUTE_SERVICE_WITH_RETURN_VALUE(?,?)}\";\r\n"); buff.append("\r\n"); buff.append(" private Proxy(String url) {\r\n"); buff.append(" this.url = url;\r\n"); @@ -413,7 +413,8 @@ private void genServiceInterfaceCode() { buff.append(" return stmt.getString(1);\r\n"); buff.append(" }\r\n"); buff.append(" } catch (SQLException e) {\r\n"); - buff.append(" e.printStackTrace();\r\n"); + buff.append( + " throw new RuntimeException(\"Failted to execute service: \" + serviceName);\r\n"); buff.append(" }\r\n"); buff.append("\r\n"); buff.append(" return null;\r\n"); @@ -428,7 +429,8 @@ private void genServiceInterfaceCode() { buff.append(" stmt.setString(2, json);\r\n"); buff.append(" stmt.execute();\r\n"); buff.append(" } catch (SQLException e) {\r\n"); - buff.append(" e.printStackTrace();\r\n"); + buff.append( + " throw new RuntimeException(\"Failted to execute service: \" + serviceName);\r\n"); buff.append(" }\r\n"); buff.append(" }\r\n"); } diff --git a/lealone-sql/src/main/java/org/lealone/sql/expression/function/Function.java b/lealone-sql/src/main/java/org/lealone/sql/expression/function/Function.java index 7d849f068..c5e5f1fec 100644 --- a/lealone-sql/src/main/java/org/lealone/sql/expression/function/Function.java +++ b/lealone-sql/src/main/java/org/lealone/sql/expression/function/Function.java @@ -47,6 +47,7 @@ import org.lealone.db.expression.ExpressionVisitor; import org.lealone.db.schema.Schema; import org.lealone.db.schema.Sequence; +import org.lealone.db.service.ServiceExecuterManager; import org.lealone.db.table.Column; import org.lealone.db.table.ColumnResolver; import org.lealone.db.table.Table; @@ -80,10 +81,10 @@ */ public class Function extends Expression implements FunctionCall { public static final int ABS = 0, ACOS = 1, ASIN = 2, ATAN = 3, ATAN2 = 4, BITAND = 5, BITOR = 6, BITXOR = 7, - CEILING = 8, COS = 9, COT = 10, DEGREES = 11, EXP = 12, FLOOR = 13, LOG = 14, LOG10 = 15, MOD = 16, - PI = 17, POWER = 18, RADIANS = 19, RAND = 20, ROUND = 21, ROUNDMAGIC = 22, SIGN = 23, SIN = 24, SQRT = 25, - TAN = 26, TRUNCATE = 27, SECURE_RAND = 28, HASH = 29, ENCRYPT = 30, DECRYPT = 31, COMPRESS = 32, - EXPAND = 33, ZERO = 34, RANDOM_UUID = 35, COSH = 36, SINH = 37, TANH = 38, LN = 39; + CEILING = 8, COS = 9, COT = 10, DEGREES = 11, EXP = 12, FLOOR = 13, LOG = 14, LOG10 = 15, MOD = 16, PI = 17, + POWER = 18, RADIANS = 19, RAND = 20, ROUND = 21, ROUNDMAGIC = 22, SIGN = 23, SIN = 24, SQRT = 25, TAN = 26, + TRUNCATE = 27, SECURE_RAND = 28, HASH = 29, ENCRYPT = 30, DECRYPT = 31, COMPRESS = 32, EXPAND = 33, + ZERO = 34, RANDOM_UUID = 35, COSH = 36, SINH = 37, TANH = 38, LN = 39; public static final int ASCII = 50, BIT_LENGTH = 51, CHAR = 52, CHAR_LENGTH = 53, CONCAT = 54, DIFFERENCE = 55, HEXTORAW = 56, INSERT = 57, INSTR = 58, LCASE = 59, LEFT = 60, LENGTH = 61, LOCATE = 62, LTRIM = 63, @@ -103,11 +104,12 @@ public class Function extends Expression implements FunctionCall { AUTOCOMMIT = 155, READONLY = 156, DATABASE_PATH = 157, LOCK_TIMEOUT = 158, DISK_SPACE_USED = 159; public static final int IFNULL = 200, CASEWHEN = 201, CONVERT = 202, CAST = 203, COALESCE = 204, NULLIF = 205, - CASE = 206, NEXTVAL = 207, CURRVAL = 208, ARRAY_GET = 209, CSVREAD = 210, CSVWRITE = 211, - MEMORY_FREE = 212, MEMORY_USED = 213, LOCK_MODE = 214, SCHEMA = 215, SESSION_ID = 216, ARRAY_LENGTH = 217, - LINK_SCHEMA = 218, GREATEST = 219, LEAST = 220, CANCEL_SESSION = 221, SET = 222, TABLE = 223, - TABLE_DISTINCT = 224, FILE_READ = 225, TRANSACTION_ID = 226, TRUNCATE_VALUE = 227, NVL2 = 228, - DECODE = 229, ARRAY_CONTAINS = 230; + CASE = 206, NEXTVAL = 207, CURRVAL = 208, ARRAY_GET = 209, CSVREAD = 210, CSVWRITE = 211, MEMORY_FREE = 212, + MEMORY_USED = 213, LOCK_MODE = 214, SCHEMA = 215, SESSION_ID = 216, ARRAY_LENGTH = 217, LINK_SCHEMA = 218, + GREATEST = 219, LEAST = 220, CANCEL_SESSION = 221, SET = 222, TABLE = 223, TABLE_DISTINCT = 224, + FILE_READ = 225, TRANSACTION_ID = 226, TRUNCATE_VALUE = 227, NVL2 = 228, DECODE = 229, ARRAY_CONTAINS = 230; + + public static final int EXECUTE_SERVICE_NO_RETURN_VALUE = 500, EXECUTE_SERVICE_WITH_RETURN_VALUE = 501; /** * This is called LEALONE_VERSION() and not VERSION(), because we return a fake value @@ -372,6 +374,11 @@ public class Function extends Expression implements FunctionCall { // pseudo function addFunctionWithNull("ROW_NUMBER", ROW_NUMBER, 0, Value.LONG); + + // service function + addFunctionNotDeterministic("EXECUTE_SERVICE_NO_RETURN_VALUE", EXECUTE_SERVICE_NO_RETURN_VALUE, 2, Value.NULL); + addFunctionNotDeterministic("EXECUTE_SERVICE_WITH_RETURN_VALUE", EXECUTE_SERVICE_WITH_RETURN_VALUE, 2, + Value.STRING); } protected Function(Database database, FunctionInfo info) { @@ -941,6 +948,18 @@ private Value getSimpleValue(ServerSession session, Value v0, Expression[] args, result = session.getTransactionId(); break; } + case EXECUTE_SERVICE_NO_RETURN_VALUE: { + Value v1 = getNullOrValue(session, args, values, 1); + ServiceExecuterManager.executeServiceNoReturnValue(v0.getString(), v1.getString()); + result = ValueNull.INSTANCE; + break; + } + case EXECUTE_SERVICE_WITH_RETURN_VALUE: { + Value v1 = getNullOrValue(session, args, values, 1); + String r = ServiceExecuterManager.executeServiceWithReturnValue(v0.getString(), v1.getString()); + result = ValueString.get(r); + break; + } default: result = null; } @@ -1151,12 +1170,12 @@ private Value getValueWithArgs(ServerSession session, Expression[] args) { break; } case RPAD: - result = ValueString.get(StringUtils.pad(v0.getString(), v1.getInt(), v2 == null ? null : v2.getString(), - true)); + result = ValueString + .get(StringUtils.pad(v0.getString(), v1.getInt(), v2 == null ? null : v2.getString(), true)); break; case LPAD: - result = ValueString.get(StringUtils.pad(v0.getString(), v1.getInt(), v2 == null ? null : v2.getString(), - false)); + result = ValueString + .get(StringUtils.pad(v0.getString(), v1.getInt(), v2 == null ? null : v2.getString(), false)); break; case LEALONE_VERSION: result = ValueString.get(Constants.getVersion()); diff --git a/lealone-test/src/test/java/org/lealone/test/service/ServiceConsumer.java b/lealone-test/src/test/java/org/lealone/test/service/ServiceConsumer.java index bf819318b..dda8b53e1 100644 --- a/lealone-test/src/test/java/org/lealone/test/service/ServiceConsumer.java +++ b/lealone-test/src/test/java/org/lealone/test/service/ServiceConsumer.java @@ -34,6 +34,11 @@ public static void execute(String url) { user = userService.add(user); System.out.println("user.id=" + user.getId()); user = userService.find(user.getId()); + + user.setPhone(12345678); + userService.update(user); + + userService.delete(user.getId()); } } diff --git a/lealone-test/src/test/java/org/lealone/test/service/ServiceTest.java b/lealone-test/src/test/java/org/lealone/test/service/ServiceTest.java index db0ef62cf..58dc0a2a1 100644 --- a/lealone-test/src/test/java/org/lealone/test/service/ServiceTest.java +++ b/lealone-test/src/test/java/org/lealone/test/service/ServiceTest.java @@ -54,12 +54,6 @@ public void run() { private void createServices() { try (Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement()) { - System.out.println("create ALIAS"); - stmt.executeUpdate("CREATE ALIAS executeServiceNoReturnValue for " // - + "\"org.lealone.db.service.ServiceExecuterManager.executeServiceNoReturnValue\""); - stmt.executeUpdate("CREATE ALIAS executeServiceWithReturnValue for " // - + "\"org.lealone.db.service.ServiceExecuterManager.executeServiceWithReturnValue\""); - System.out.println("create table"); String packageName = ServiceTest.packageName + ".generated"; // 创建表: user @@ -78,11 +72,6 @@ private void createServices() { private void testBackendRpcServices() { System.out.println("test backend rpc services"); ServiceConsumer.execute(url); - - // user.setPhone(12345678); - // userService.update(user); - // - // userService.delete(1); } private void testFrontendRpcServices() { diff --git a/lealone-test/src/test/java/org/lealone/test/service/generated/HelloWorldService.java b/lealone-test/src/test/java/org/lealone/test/service/generated/HelloWorldService.java index 7f155148c..78e6fc829 100644 --- a/lealone-test/src/test/java/org/lealone/test/service/generated/HelloWorldService.java +++ b/lealone-test/src/test/java/org/lealone/test/service/generated/HelloWorldService.java @@ -24,8 +24,8 @@ static HelloWorldService create(String url) { static class Proxy implements HelloWorldService { private final String url; - private static final String sqlNoReturnValue = "{call executeServiceNoReturnValue(?,?)}"; - private static final String sqlWithReturnValue = "{? = call executeServiceWithReturnValue(?,?)}"; + private static final String sqlNoReturnValue = "{call EXECUTE_SERVICE_NO_RETURN_VALUE(?,?)}"; + private static final String sqlWithReturnValue = "{? = call EXECUTE_SERVICE_WITH_RETURN_VALUE(?,?)}"; private Proxy(String url) { this.url = url; @@ -58,7 +58,7 @@ private String executeWithReturnValue(String serviceName, String json) { return stmt.getString(1); } } catch (SQLException e) { - e.printStackTrace(); + throw new RuntimeException("Failted to execute service: " + serviceName); } return null; @@ -71,7 +71,7 @@ private void executeNoReturnValue(String serviceName, String json) { stmt.setString(2, json); stmt.execute(); } catch (SQLException e) { - e.printStackTrace(); + throw new RuntimeException("Failted to execute service: " + serviceName); } } } diff --git a/lealone-test/src/test/java/org/lealone/test/service/generated/UserService.java b/lealone-test/src/test/java/org/lealone/test/service/generated/UserService.java index 34cd5eccf..13ae4530e 100644 --- a/lealone-test/src/test/java/org/lealone/test/service/generated/UserService.java +++ b/lealone-test/src/test/java/org/lealone/test/service/generated/UserService.java @@ -33,7 +33,7 @@ static UserService create(String url) { static class Proxy implements UserService { private final String url; - private static final String sqlWithReturnValue = "{? = call executeServiceWithReturnValue(?,?)}"; + private static final String sqlWithReturnValue = "{? = call EXECUTE_SERVICE_WITH_RETURN_VALUE(?,?)}"; private Proxy(String url) { this.url = url; @@ -107,7 +107,7 @@ private String executeWithReturnValue(String serviceName, String json) { return stmt.getString(1); } } catch (SQLException e) { - e.printStackTrace(); + throw new RuntimeException("Failted to execute service: " + serviceName); } return null; diff --git a/lealone-test/src/test/java/org/lealone/test/service/impl/UserServiceImpl.java b/lealone-test/src/test/java/org/lealone/test/service/impl/UserServiceImpl.java index b913b7979..2597a87b7 100644 --- a/lealone-test/src/test/java/org/lealone/test/service/impl/UserServiceImpl.java +++ b/lealone-test/src/test/java/org/lealone/test/service/impl/UserServiceImpl.java @@ -31,26 +31,22 @@ public User add(User user) { @Override public User find(Long id) { - // TODO Auto-generated method stub - return null; + return new User().setId(id); } @Override public User findByDate(Date d) { - // TODO Auto-generated method stub - return null; + return new User().setNotes("date: " + d.toString()); } @Override public Boolean update(User user) { - // TODO Auto-generated method stub - return null; + return true; } @Override public Boolean delete(Long id) { - // TODO Auto-generated method stub - return null; + return true; } } diff --git a/lealone-vertx/src/main/java/org/lealone/vertx/SockJSSocketServiceHandler.java b/lealone-vertx/src/main/java/org/lealone/vertx/SockJSSocketServiceHandler.java index 42d0434fb..35c8f5352 100644 --- a/lealone-vertx/src/main/java/org/lealone/vertx/SockJSSocketServiceHandler.java +++ b/lealone-vertx/src/main/java/org/lealone/vertx/SockJSSocketServiceHandler.java @@ -17,6 +17,7 @@ */ package org.lealone.vertx; +import org.lealone.common.util.CamelCaseHelper; import org.lealone.db.service.ServiceExecuterManager; import io.vertx.core.Handler; @@ -31,7 +32,7 @@ public void handle(SockJSSocket sockJSSocket) { sockJSSocket.handler(buffer -> { String a[] = buffer.getString(0, buffer.length()).split(";"); int type = Integer.parseInt(a[0]); - String serviceName = a[1]; + String serviceName = CamelCaseHelper.toUnderscoreFromCamel(a[1]); String json = null; if (a.length >= 3) { json = a[2];