All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.citrusframework.groovy.dsl.GroovyShellUtils Maven / Gradle / Ivy

The newest version!
/*
 * Copyright the original author or 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.citrusframework.groovy.dsl;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.citrusframework.Citrus;
import org.citrusframework.TestActionBuilder;
import org.citrusframework.context.TestContext;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import groovy.lang.Script;
import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.control.customizers.ImportCustomizer;

public class GroovyShellUtils {

    private static final Pattern COMMENTS = Pattern.compile("^(?:\\s*//|/\\*|\\s+\\*).*$", Pattern.MULTILINE);

    private GroovyShellUtils() {
        // prevent instantiation of utility class
    }

    /**
     * Run given scriptCode with GroovyShell.
     * @param ic import customizer
     * @param scriptCode code to evaluate in shell
     * @param context the current test context
     * @param  return type
     * @return script result
     */
    public static  T run(ImportCustomizer ic, String scriptCode, Citrus citrus, TestContext context) {
        return run(ic, null, scriptCode, citrus, context);
    }

    /**
     * Run given scriptCode with GroovyShell and delegate execution to given instance.
     * @param delegate instance providing methods and properties
     * @param scriptCode code to evaluate in shell
     * @param context the current test context
     * @param  return type
     * @return script result
     */
    public static  T run(Object delegate, String scriptCode, Citrus citrus, TestContext context) {
        return run(new ImportCustomizer(), delegate, scriptCode, citrus, context);
    }

    /**
     * Run given scriptCode with GroovyShell and delegate execution to given instance.
     * @param ic import customizer
     * @param delegate instance providing methods and properties
     * @param scriptCode code to evaluate in shell
     * @param context the current test context
     * @param  return type
     * @return script result
     */
    public static  T run(ImportCustomizer ic, Object delegate, String scriptCode, Citrus citrus, TestContext context) {
        CompilerConfiguration cc = new CompilerConfiguration();
        cc.addCompilationCustomizers(ic);
        cc.setScriptBaseClass(GroovyScript.class.getName());

        ClassLoader cl = Thread.currentThread().getContextClassLoader();
        GroovyShell sh = new GroovyShell(cl, new Binding(), cc);

        Script script = sh.parse(scriptCode);

        if (script instanceof GroovyScript) {
            if (delegate != null) {
                // set the delegate target
                ((GroovyScript) script).setDelegate(delegate);
            }

            if (citrus != null) {
                ((GroovyScript) script).setCitrusFramework(citrus);
            }

            ((GroovyScript) script).setContext(context);
        }

        return (T) script.run();
    }

    /**
     * Remove leading comments such as license header.
     * @param script
     * @return
     */
    public static String removeComments(String script) {
        Matcher matcher = COMMENTS.matcher(script);
        if (matcher.find()) {
            return matcher.replaceAll("").trim();
        } else {
            return script.trim();
        }
    }

    /**
     * Automatically adds static imports for TestAction builders used in given script.
     * @param source the script source code.
     * @param ic the import customizer.
     */
    public static void autoAddImports(String source, ImportCustomizer ic) {
        TestActionBuilder.lookup()
                .entrySet()
                .stream()
                .filter(entry -> !entry.getKey().equals("send") && !entry.getKey().equals("receive") )
                .filter(entry -> !source.contains("import static " + String.format("%s.%s", entry.getValue().getClass().getCanonicalName(), entry.getKey())))
                .filter(entry -> source.contains(String.format("$(%s(", entry.getKey())) || source.contains(String.format("%s()", entry.getKey())))
                .peek(entry -> System.out.println(entry.getKey()))
                .forEach(entry -> ic.addStaticImport(entry.getValue().getClass().getCanonicalName(), entry.getKey()));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy