package org.apereo.cas.util;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
import java.io.File;
/**
* This is {@link ScriptingUtils}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
public final class ScriptingUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(ScriptingUtils.class);
private ScriptingUtils() {
}
/**
* Execute groovy script via run object.
*
* @param <T> the type parameter
* @param groovyScript the groovy script
* @param args the args
* @param clazz the clazz
* @return the object
*/
public static <T> T executeGroovyScript(final Resource groovyScript,
final Object[] args, final Class<T> clazz) {
return executeGroovyScript(groovyScript, "run", args, clazz);
}
/**
* Execute groovy script t.
*
* @param <T> the type parameter
* @param groovyScript the groovy script
* @param methodName the method name
* @param args the args
* @param clazz the clazz
* @return the t
*/
public static <T> T executeGroovyScript(final Resource groovyScript,
final String methodName,
final Object[] args,
final Class<T> clazz) {
if (groovyScript == null || StringUtils.isBlank(methodName)) {
return null;
}
final ClassLoader parent = ScriptingUtils.class.getClassLoader();
try (GroovyClassLoader loader = new GroovyClassLoader(parent)) {
final File groovyFile = groovyScript.getFile();
if (groovyFile.exists()) {
final Class<?> groovyClass = loader.parseClass(groovyFile);
LOGGER.trace("Creating groovy object instance from class [{}]", groovyFile.getCanonicalPath());
final GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
LOGGER.trace("Executing groovy script's [{}] method, with parameters [{}]", methodName, args);
final T result = (T) groovyObject.invokeMethod(methodName, args);
LOGGER.trace("Results returned by the groovy script are [{}]", result);
if (!clazz.isAssignableFrom(result.getClass())) {
throw new ClassCastException("Result [" + result
+ " is of type " + result.getClass()
+ " when we were expecting " + clazz);
}
return result;
} else {
LOGGER.trace("Groovy script at [{}] does not exist", groovyScript);
}
} catch (final Exception e) {
LOGGER.error(e.getMessage(), e);
}
return null;
}
}