From ba60ddfba1caf6f44b63a9ce58431364c3625625 Mon Sep 17 00:00:00 2001 From: "2884686@qq.com" <2884686@qq.com> Date: Tue, 25 Jul 2017 11:42:39 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=AC=E5=9C=B0js?= =?UTF-8?q?=E4=BA=91=E4=BB=A3=E7=A0=81=E6=89=A7=E8=A1=8C=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloud/handler/ICloudFunctionHandler.java | 14 ++++++++++ .../impl/InternalCloudFunctionHandler.java | 19 +++++++++++++ .../impl/RemoteCloudFunctionHandler.java | 27 +++++++++++++++++++ .../server/cloud/internal/CloudContext.java | 11 ++++++++ .../server/cloud/service/CloudService.java | 8 ++++-- 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/javabaas/server/cloud/handler/ICloudFunctionHandler.java create mode 100644 src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java create mode 100644 src/main/java/com/javabaas/server/cloud/handler/impl/RemoteCloudFunctionHandler.java create mode 100644 src/main/java/com/javabaas/server/cloud/internal/CloudContext.java diff --git a/src/main/java/com/javabaas/server/cloud/handler/ICloudFunctionHandler.java b/src/main/java/com/javabaas/server/cloud/handler/ICloudFunctionHandler.java new file mode 100644 index 0000000..f84cb65 --- /dev/null +++ b/src/main/java/com/javabaas/server/cloud/handler/ICloudFunctionHandler.java @@ -0,0 +1,14 @@ +package com.javabaas.server.cloud.handler; + +import com.javabaas.server.admin.entity.App; +import com.javabaas.server.cloud.entity.CloudRequest; +import com.javabaas.server.cloud.entity.CloudResponse; + +/** + * Created by Codi on 2017/7/24. + */ +public interface ICloudFunctionHandler { + + CloudResponse cloud(App app, String name, CloudRequest request); + +} diff --git a/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java b/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java new file mode 100644 index 0000000..8e9b3a1 --- /dev/null +++ b/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java @@ -0,0 +1,19 @@ +package com.javabaas.server.cloud.handler.impl; + +import com.javabaas.server.admin.entity.App; +import com.javabaas.server.cloud.entity.CloudRequest; +import com.javabaas.server.cloud.entity.CloudResponse; +import com.javabaas.server.cloud.handler.ICloudFunctionHandler; + +/** + * 基于JS实现的内部云代码处理器 + * Created by Codi on 2017/7/24. + */ +public class InternalCloudFunctionHandler implements ICloudFunctionHandler { + + @Override + public CloudResponse cloud(App app, String name, CloudRequest request) { + return null; + } + +} diff --git a/src/main/java/com/javabaas/server/cloud/handler/impl/RemoteCloudFunctionHandler.java b/src/main/java/com/javabaas/server/cloud/handler/impl/RemoteCloudFunctionHandler.java new file mode 100644 index 0000000..256f6ec --- /dev/null +++ b/src/main/java/com/javabaas/server/cloud/handler/impl/RemoteCloudFunctionHandler.java @@ -0,0 +1,27 @@ +package com.javabaas.server.cloud.handler.impl; + +import com.javabaas.server.admin.entity.App; +import com.javabaas.server.cloud.entity.CloudRequest; +import com.javabaas.server.cloud.entity.CloudResponse; +import com.javabaas.server.cloud.handler.ICloudFunctionHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +/** + * 云代码远程执行器 + * Created by Codi on 2017/7/24. + */ +@Component +public class RemoteCloudFunctionHandler implements ICloudFunctionHandler { + + @Autowired + private RestTemplate rest; + + @Override + public CloudResponse cloud(App app, String name, CloudRequest request) { + return rest.postForObject(app.getCloudSetting().getCustomerHost() + "/cloud/" + name, + request, CloudResponse.class); + } + +} diff --git a/src/main/java/com/javabaas/server/cloud/internal/CloudContext.java b/src/main/java/com/javabaas/server/cloud/internal/CloudContext.java new file mode 100644 index 0000000..179e7a3 --- /dev/null +++ b/src/main/java/com/javabaas/server/cloud/internal/CloudContext.java @@ -0,0 +1,11 @@ +package com.javabaas.server.cloud.internal; + +/** + * 提供内部运行时环境所需要的所有工具 + * Created by Codi on 2017/7/24. + */ +public class CloudContext { + + + +} diff --git a/src/main/java/com/javabaas/server/cloud/service/CloudService.java b/src/main/java/com/javabaas/server/cloud/service/CloudService.java index b740317..adc422d 100644 --- a/src/main/java/com/javabaas/server/cloud/service/CloudService.java +++ b/src/main/java/com/javabaas/server/cloud/service/CloudService.java @@ -5,6 +5,7 @@ import com.javabaas.server.cloud.entity.CloudRequest; import com.javabaas.server.cloud.entity.CloudResponse; import com.javabaas.server.cloud.entity.CloudSetting; +import com.javabaas.server.cloud.handler.ICloudFunctionHandler; import com.javabaas.server.cloud.util.SignUtil; import com.javabaas.server.common.entity.SimpleCode; import com.javabaas.server.common.entity.SimpleError; @@ -19,6 +20,7 @@ import java.util.Map; /** + * 云代码服务 * Created by Staryet on 15/9/15. */ @Service @@ -30,6 +32,8 @@ public class CloudService { private AppService appService; @Autowired private SignUtil signUtil; + @Autowired + private Map handlers; public SimpleResult cloud(String appId, String plat, String functionName, BaasUser user, boolean isMaster, Map requestParams, String body) { @@ -69,8 +73,8 @@ public SimpleResult cloud(String appId, String plat, String functionName, BaasUs //发送请求 CloudResponse response; try { - response = rest.postForObject(app.getCloudSetting().getCustomerHost() + "/cloud/" + functionName, - cloudRequest, CloudResponse.class); + ICloudFunctionHandler handler = handlers.get("remoteCloudFunctionHandler"); + response = handler.cloud(app, functionName, cloudRequest); } catch (Exception e) { //请求执行异常 throw new SimpleError(SimpleCode.CLOUD_FUNCTION_EXECUTE_FAILED); From 84b701d55ffdd98f1ef9a074281fe0a8a30673dc Mon Sep 17 00:00:00 2001 From: "2884686@qq.com" <2884686@qq.com> Date: Thu, 27 Jul 2017 15:07:46 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E4=BA=91=E4=BB=A3=E7=A0=81=E6=89=A7=E8=A1=8C=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/cloud/entity/CloudSetting.java | 1 + .../impl/InternalCloudFunctionHandler.java | 25 ++++++++++ .../server/cloud/internal/CloudContext.java | 11 ----- .../cloud/internal/CloudEngineManager.java | 46 +++++++++++++++++++ .../javabaas/server/cloud/internal/JB.java | 25 ++++++++++ 5 files changed, 97 insertions(+), 11 deletions(-) delete mode 100644 src/main/java/com/javabaas/server/cloud/internal/CloudContext.java create mode 100644 src/main/java/com/javabaas/server/cloud/internal/CloudEngineManager.java create mode 100644 src/main/java/com/javabaas/server/cloud/internal/JB.java diff --git a/src/main/java/com/javabaas/server/cloud/entity/CloudSetting.java b/src/main/java/com/javabaas/server/cloud/entity/CloudSetting.java index c8d9658..7cc8f9e 100644 --- a/src/main/java/com/javabaas/server/cloud/entity/CloudSetting.java +++ b/src/main/java/com/javabaas/server/cloud/entity/CloudSetting.java @@ -4,6 +4,7 @@ import java.util.Map; /** + * 云代码配置 * Created by Staryet on 15/9/22. */ public class CloudSetting { diff --git a/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java b/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java index 8e9b3a1..000b039 100644 --- a/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java +++ b/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java @@ -4,15 +4,40 @@ import com.javabaas.server.cloud.entity.CloudRequest; import com.javabaas.server.cloud.entity.CloudResponse; import com.javabaas.server.cloud.handler.ICloudFunctionHandler; +import com.javabaas.server.cloud.internal.CloudEngineManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptException; /** * 基于JS实现的内部云代码处理器 * Created by Codi on 2017/7/24. */ +@Component public class InternalCloudFunctionHandler implements ICloudFunctionHandler { + @Autowired + private CloudEngineManager engineManager; + @Override public CloudResponse cloud(App app, String name, CloudRequest request) { + ScriptEngine engine = null; + try { + engine = engineManager.getCloudEngine(app.getId(), name); + } catch (ScriptException e) { + e.printStackTrace(); + } + Invocable invocable = (Invocable) engine; + try { + invocable.invokeFunction(name, request); + } catch (ScriptException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } return null; } diff --git a/src/main/java/com/javabaas/server/cloud/internal/CloudContext.java b/src/main/java/com/javabaas/server/cloud/internal/CloudContext.java deleted file mode 100644 index 179e7a3..0000000 --- a/src/main/java/com/javabaas/server/cloud/internal/CloudContext.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.javabaas.server.cloud.internal; - -/** - * 提供内部运行时环境所需要的所有工具 - * Created by Codi on 2017/7/24. - */ -public class CloudContext { - - - -} diff --git a/src/main/java/com/javabaas/server/cloud/internal/CloudEngineManager.java b/src/main/java/com/javabaas/server/cloud/internal/CloudEngineManager.java new file mode 100644 index 0000000..287fc63 --- /dev/null +++ b/src/main/java/com/javabaas/server/cloud/internal/CloudEngineManager.java @@ -0,0 +1,46 @@ +package com.javabaas.server.cloud.internal; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import java.util.HashMap; +import java.util.Map; + +/** + * 提供内部运行时环境所需要的所有工具 + * Created by Codi on 2017/7/24. + */ +@Service +public class CloudEngineManager { + + @Autowired + private JB jb; + + private Map engineMap = new HashMap<>(); + + public ScriptEngine getCloudEngine(String appId, String name) throws ScriptException { + ScriptEngine engine = engineMap.get(getKey(appId, name)); + if (engine == null) { + ScriptEngineManager manager = new ScriptEngineManager(); + engine = manager.getEngineByName("nashorn"); + engine.put("JB", jb); + + engine.eval("function cloud(request){\n" + + "\tvar book = JB.get(\"Book\",\"b4f4290920174c058307fd502fedea3a\");\n" + + "\tprint(book);\n" + + "\tJB.log(book);\n" + + "}"); + + engineMap.put(getKey(appId, name), engine); + } + return engine; + } + + private String getKey(String appId, String name) { + return appId + "_" + name; + } + +} diff --git a/src/main/java/com/javabaas/server/cloud/internal/JB.java b/src/main/java/com/javabaas/server/cloud/internal/JB.java new file mode 100644 index 0000000..8aa2a8e --- /dev/null +++ b/src/main/java/com/javabaas/server/cloud/internal/JB.java @@ -0,0 +1,25 @@ +package com.javabaas.server.cloud.internal; + +import com.javabaas.server.object.entity.BaasObject; +import com.javabaas.server.object.service.ObjectService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * Created by Codi on 2017/7/25. + */ +@Service +public class JB { + + @Autowired + private ObjectService objectService; + + public BaasObject get(String className, String id) { + return objectService.get("597729ca4fdda62044e7cb2c", "cloud", className, id); + } + + public void log(Object object) { + System.out.println(object); + } + +} From 8db594c43d0db7fe2b0f49905fe767b0dec935aa Mon Sep 17 00:00:00 2001 From: "2884686@qq.com" <2884686@qq.com> Date: Mon, 31 Jul 2017 14:25:00 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BA=91=E6=96=B9=E6=B3=95=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E6=89=A7=E8=A1=8C=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloud/handler/impl/InternalCloudFunctionHandler.java | 5 +++-- .../javabaas/server/cloud/internal/CloudEngineManager.java | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java b/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java index 000b039..de77b7a 100644 --- a/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java +++ b/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java @@ -31,14 +31,15 @@ public CloudResponse cloud(App app, String name, CloudRequest request) { e.printStackTrace(); } Invocable invocable = (Invocable) engine; + CloudResponse response = new CloudResponse(); try { - invocable.invokeFunction(name, request); + invocable.invokeFunction(name, request, response); } catch (ScriptException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } - return null; + return response; } } diff --git a/src/main/java/com/javabaas/server/cloud/internal/CloudEngineManager.java b/src/main/java/com/javabaas/server/cloud/internal/CloudEngineManager.java index 287fc63..1febe39 100644 --- a/src/main/java/com/javabaas/server/cloud/internal/CloudEngineManager.java +++ b/src/main/java/com/javabaas/server/cloud/internal/CloudEngineManager.java @@ -28,10 +28,8 @@ public ScriptEngine getCloudEngine(String appId, String name) throws ScriptExcep engine = manager.getEngineByName("nashorn"); engine.put("JB", jb); - engine.eval("function cloud(request){\n" + + engine.eval("function test(request){\n" + "\tvar book = JB.get(\"Book\",\"b4f4290920174c058307fd502fedea3a\");\n" + - "\tprint(book);\n" + - "\tJB.log(book);\n" + "}"); engineMap.put(getKey(appId, name), engine);