12 changed files with 218 additions and 22 deletions
@ -0,0 +1,27 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2018 The Thingsboard Authors |
||||
|
* |
||||
|
* 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 org.thingsboard.server.service.script; |
||||
|
|
||||
|
import javax.script.ScriptException; |
||||
|
|
||||
|
public interface JsSandboxService { |
||||
|
|
||||
|
Object eval(String js) throws ScriptException; |
||||
|
|
||||
|
Object invokeFunction(String name, Object... args) throws ScriptException, NoSuchMethodException; |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,70 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2018 The Thingsboard Authors |
||||
|
* |
||||
|
* 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 org.thingsboard.server.service.script; |
||||
|
|
||||
|
import delight.nashornsandbox.NashornSandbox; |
||||
|
import delight.nashornsandbox.NashornSandboxes; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
import javax.annotation.PostConstruct; |
||||
|
import javax.annotation.PreDestroy; |
||||
|
import javax.script.ScriptException; |
||||
|
import java.util.concurrent.ExecutorService; |
||||
|
import java.util.concurrent.Executors; |
||||
|
|
||||
|
@Slf4j |
||||
|
@Service |
||||
|
public class NashornJsSandboxService implements JsSandboxService { |
||||
|
|
||||
|
@Value("${actors.rule.js_sandbox.monitor_thread_pool_size}") |
||||
|
private int monitorThreadPoolSize; |
||||
|
|
||||
|
@Value("${actors.rule.js_sandbox.max_cpu_time}") |
||||
|
private long maxCpuTime; |
||||
|
|
||||
|
private NashornSandbox sandbox = NashornSandboxes.create(); |
||||
|
private ExecutorService monitorExecutorService; |
||||
|
|
||||
|
@PostConstruct |
||||
|
public void init() { |
||||
|
monitorExecutorService = Executors.newFixedThreadPool(monitorThreadPoolSize); |
||||
|
sandbox.setExecutor(monitorExecutorService); |
||||
|
sandbox.setMaxCPUTime(maxCpuTime); |
||||
|
sandbox.allowNoBraces(false); |
||||
|
sandbox.setMaxPreparedStatements(30); |
||||
|
} |
||||
|
|
||||
|
@PreDestroy |
||||
|
public void stop() { |
||||
|
if (monitorExecutorService != null) { |
||||
|
monitorExecutorService.shutdownNow(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Object eval(String js) throws ScriptException { |
||||
|
return sandbox.eval(js); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Object invokeFunction(String name, Object... args) throws ScriptException, NoSuchMethodException { |
||||
|
return sandbox.getSandboxedInvocable().invokeFunction(name, args); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,54 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2018 The Thingsboard Authors |
||||
|
* |
||||
|
* 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 org.thingsboard.server.service.script; |
||||
|
|
||||
|
import delight.nashornsandbox.NashornSandbox; |
||||
|
import delight.nashornsandbox.NashornSandboxes; |
||||
|
|
||||
|
import javax.script.ScriptException; |
||||
|
import java.util.concurrent.ExecutorService; |
||||
|
import java.util.concurrent.Executors; |
||||
|
|
||||
|
public class TestNashornJsSandboxService implements JsSandboxService { |
||||
|
|
||||
|
private NashornSandbox sandbox = NashornSandboxes.create(); |
||||
|
private ExecutorService monitorExecutorService; |
||||
|
|
||||
|
public TestNashornJsSandboxService(int monitorThreadPoolSize, long maxCpuTime) { |
||||
|
monitorExecutorService = Executors.newFixedThreadPool(monitorThreadPoolSize); |
||||
|
sandbox.setExecutor(monitorExecutorService); |
||||
|
sandbox.setMaxCPUTime(maxCpuTime); |
||||
|
sandbox.allowNoBraces(false); |
||||
|
sandbox.setMaxPreparedStatements(30); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Object eval(String js) throws ScriptException { |
||||
|
return sandbox.eval(js); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Object invokeFunction(String name, Object... args) throws ScriptException, NoSuchMethodException { |
||||
|
return sandbox.getSandboxedInvocable().invokeFunction(name, args); |
||||
|
} |
||||
|
|
||||
|
public void destroy() { |
||||
|
if (monitorExecutorService != null) { |
||||
|
monitorExecutorService.shutdownNow(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue