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/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..de77b7a --- /dev/null +++ b/src/main/java/com/javabaas/server/cloud/handler/impl/InternalCloudFunctionHandler.java @@ -0,0 +1,45 @@ +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 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; + CloudResponse response = new CloudResponse(); + try { + invocable.invokeFunction(name, request, response); + } catch (ScriptException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + return response; + } + +} 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/CloudEngineManager.java b/src/main/java/com/javabaas/server/cloud/internal/CloudEngineManager.java new file mode 100644 index 0000000..1febe39 --- /dev/null +++ b/src/main/java/com/javabaas/server/cloud/internal/CloudEngineManager.java @@ -0,0 +1,44 @@ +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 test(request){\n" + + "\tvar book = JB.get(\"Book\",\"b4f4290920174c058307fd502fedea3a\");\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); + } + +} 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);