/*
* 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.ngrinder.operation.cotroller;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.ngrinder.agent.service.AgentManagerService;
import org.ngrinder.common.controller.BaseController;
import org.ngrinder.infra.plugin.PluginManager;
import org.ngrinder.perftest.service.AgentManager;
import org.ngrinder.perftest.service.ConsoleManager;
import org.ngrinder.perftest.service.PerfTestService;
import org.ngrinder.perftest.service.TagService;
import org.ngrinder.region.service.RegionService;
import org.ngrinder.script.service.FileEntryService;
import org.ngrinder.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Profile;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.PrintWriter;
import java.io.StringWriter;
/**
* Script Runner for maintenance.
*
* This class has the jython instance and put the most important class instances as variables in the jython. Admin and
* super user can run any jython code to print out or modify the internal ngrinder states.
*
* @author JunHo Yoon
* @since 3.0
*/
@SuppressWarnings("SpringJavaAutowiringInspection")
@Profile("production")
@Controller
@RequestMapping("/operation/script_console")
@PreAuthorize("hasAnyRole('A')")
public class ScriptConsoleController extends BaseController implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Autowired
private AgentManager agentManager;
@Autowired
private AgentManagerService agentManagerService;
@Autowired
private ConsoleManager consoleManager;
@Autowired
private PerfTestService perfTestService;
@Autowired
private FileEntryService fileEntryService;
@Autowired
private UserService userService;
@Autowired
private RegionService regionService;
@Autowired
private PluginManager pluginManager;
@Autowired
private TagService tagService;
@Autowired
private CacheManager cacheManager;
/**
* Run the given script. The run result is stored in "result" of the given model.
*
* @param script script
* @param model model
* @return operation/script_console
*/
@RequestMapping("")
public String run(@RequestParam(value = "script", defaultValue = "") String script, Model model) {
if (StringUtils.isNotBlank(script)) {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("Groovy");
engine.put("applicationContext", this.applicationContext);
engine.put("agentManager", this.agentManager);
engine.put("agentManagerService", this.agentManagerService);
engine.put("regionService", this.regionService);
engine.put("consoleManager", this.consoleManager);
engine.put("userService", this.userService);
engine.put("perfTestService", this.perfTestService);
engine.put("tagService", this.tagService);
engine.put("fileEntryService", this.fileEntryService);
engine.put("config", getConfig());
engine.put("pluginManager", this.pluginManager);
engine.put("cacheManager", this.cacheManager);
engine.put("user", getCurrentUser());
final StringWriter out = new StringWriter();
PrintWriter writer = new PrintWriter(out);
engine.getContext().setWriter(writer);
engine.getContext().setErrorWriter(writer);
try {
Object result = engine.eval(script);
result = out.toString() + "\n" + ObjectUtils.defaultIfNull(result, "");
model.addAttribute("result", result);
} catch (ScriptException e) {
model.addAttribute("result", out.toString() + "\n" + e.getMessage());
}
}
model.addAttribute("script", script);
return "operation/script_console";
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
}