/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.model.propertyexpansion.resolvers; import com.eviware.soapui.SoapUI; import com.eviware.soapui.impl.wsdl.teststeps.TestRequest; import com.eviware.soapui.model.ModelItem; import com.eviware.soapui.model.iface.Interface; import com.eviware.soapui.model.iface.Operation; import com.eviware.soapui.model.iface.Request; import com.eviware.soapui.model.mock.MockOperation; import com.eviware.soapui.model.mock.MockResponse; import com.eviware.soapui.model.mock.MockRunContext; import com.eviware.soapui.model.mock.MockService; import com.eviware.soapui.model.project.Project; import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext; import com.eviware.soapui.model.testsuite.LoadTest; import com.eviware.soapui.model.testsuite.LoadTestRunContext; import com.eviware.soapui.model.testsuite.SamplerTestStep; import com.eviware.soapui.model.testsuite.TestCase; import com.eviware.soapui.model.testsuite.TestCaseRunContext; import com.eviware.soapui.model.testsuite.TestStep; import com.eviware.soapui.model.testsuite.TestSuite; import com.eviware.soapui.security.SecurityTest; import com.eviware.soapui.support.scripting.ScriptEnginePool; import com.eviware.soapui.support.scripting.SoapUIScriptEngine; import com.eviware.soapui.support.scripting.SoapUIScriptEngineRegistry; import com.eviware.soapui.support.types.StringToObjectMap; import org.apache.log4j.Logger; import java.util.HashMap; import java.util.Map; public class EvalPropertyResolver implements PropertyResolver { private Logger log = Logger.getLogger(EvalPropertyResolver.class); private Map<String, ScriptEnginePool> scriptEnginePools = new HashMap<String, ScriptEnginePool>(); public String resolveProperty(PropertyExpansionContext context, String name, boolean globalOverride) { if (name.length() == 0 || name.charAt(0) != '=') { return null; } name = name.substring(1); StringToObjectMap objects = new StringToObjectMap(context.getProperties()); objects.put("context", context); objects.put("log", SoapUI.ensureGroovyLog()); if (context instanceof TestCaseRunContext) { TestCaseRunContext testCaseRunContext = (TestCaseRunContext) context; objects.put("testRunner", testCaseRunContext.getTestRunner()); objects.put("testStep", testCaseRunContext.getCurrentStep()); if (testCaseRunContext.getCurrentStep() instanceof SamplerTestStep) { objects.put("request", ((SamplerTestStep) testCaseRunContext.getCurrentStep()).getTestRequest()); } } if (context instanceof LoadTestRunContext) { objects.put("loadTestRunner", ((LoadTestRunContext) context).getLoadTestRunner()); } if (context instanceof MockRunContext) { objects.put("mockRunner", ((MockRunContext) context).getMockRunner()); } ModelItem modelItem = context.getModelItem(); if (modelItem instanceof TestCase) { objects.put("testCase", modelItem); objects.put("testSuite", ((TestCase) modelItem).getTestSuite()); objects.put("project", ((TestCase) modelItem).getTestSuite().getProject()); } else if (modelItem instanceof TestStep) { objects.put("testStep", modelItem); if (modelItem instanceof SamplerTestStep) { objects.put("request", ((SamplerTestStep) modelItem).getTestRequest()); } objects.put("testCase", ((TestStep) modelItem).getTestCase()); objects.put("testSuite", ((TestStep) modelItem).getTestCase().getTestSuite()); objects.put("project", ((TestStep) modelItem).getTestCase().getTestSuite().getProject()); } else if (modelItem instanceof TestSuite) { objects.put("testSuite", modelItem); objects.put("project", ((TestSuite) modelItem).getProject()); } if (modelItem instanceof LoadTest) { objects.put("loadTest", modelItem); objects.put("testCase", ((LoadTest) modelItem).getTestCase()); objects.put("testSuite", ((LoadTest) modelItem).getTestCase().getTestSuite()); objects.put("project", ((LoadTest) modelItem).getTestCase().getTestSuite().getProject()); } else if (modelItem instanceof Project) { objects.put("project", modelItem); } else if (modelItem instanceof MockService) { objects.put("mockService", modelItem); objects.put("project", ((MockService) modelItem).getProject()); } else if (modelItem instanceof MockOperation) { objects.put("mockOperation", modelItem); objects.put("mockService", ((MockOperation) modelItem).getMockService()); objects.put("project", ((MockOperation) modelItem).getMockService().getProject()); } else if (modelItem instanceof MockResponse) { objects.put("mockResponse", modelItem); objects.put("mockOperation", ((MockResponse) modelItem).getMockOperation()); objects.put("mockService", ((MockResponse) modelItem).getMockOperation().getMockService()); objects.put("project", ((MockResponse) modelItem).getMockOperation().getMockService().getProject()); } else if (modelItem instanceof Request) { objects.put("request", modelItem); if (modelItem instanceof TestRequest) { objects.put("testStep", ((TestRequest) modelItem).getTestStep()); objects.put("testCase", ((TestRequest) modelItem).getTestStep().getTestCase()); objects.put("testSuite", ((TestRequest) modelItem).getTestStep().getTestCase().getTestSuite()); objects.put("project", ((TestRequest) modelItem).getTestStep().getTestCase().getTestSuite() .getProject()); } } else if (modelItem instanceof Operation) { objects.put("operation", modelItem); } else if (modelItem instanceof Interface) { objects.put("interface", modelItem); } else if (modelItem instanceof SecurityTest) { objects.put("securityTest", modelItem); } if (modelItem != null) { objects.put("modelItem", modelItem); } return doEval(name, modelItem, objects); } private String doEval(String name, ModelItem modelItem, StringToObjectMap objects) { String engineId = SoapUIScriptEngineRegistry.getScriptEngineId(modelItem); synchronized (this) { if (!scriptEnginePools.containsKey(engineId)) { scriptEnginePools.put(engineId, new ScriptEnginePool(engineId)); } } ScriptEnginePool scriptEnginePool = scriptEnginePools.get(engineId); SoapUIScriptEngine scriptEngine = scriptEnginePool.getScriptEngine(); try { scriptEngine.setScript(name); for (Map.Entry<String, Object> entry : objects.entrySet()) { scriptEngine.setVariable(entry.getKey(), entry.getValue()); } Object result = scriptEngine.run(); return result == null ? null : result.toString(); } catch (Throwable e) { log.error("Error evaluating script", e); return e.getMessage(); } finally { scriptEngine.clearVariables(); scriptEnginePool.returnScriptEngine(scriptEngine); } } }