Package com.eviware.soapui.model.propertyexpansion.resolvers

Source Code of com.eviware.soapui.model.propertyexpansion.resolvers.EvalPropertyResolver

/*
* Copyright 2004-2014 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 java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

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;

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);
        }
    }
}
TOP

Related Classes of com.eviware.soapui.model.propertyexpansion.resolvers.EvalPropertyResolver

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.