/*
* The MIT License (MIT)
*
* Copyright (c) <2014-2015> <Ioannis Moutsatsos, Bruno P. Kinoshita>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.biouno.unochoice.model;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.biouno.unochoice.util.Utils;
import org.jenkinsci.plugins.scriptler.config.Script;
import org.jenkinsci.plugins.scriptler.util.ScriptHelper;
import org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest;
import hudson.Extension;
import hudson.Util;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
/**
* A scriptler script.
*
* @author Bruno P. Kinoshita
* @since 0.1
*/
public class ScriptlerScript extends AbstractScript {
/*
* Serial UID.
*/
private static final long serialVersionUID = -6600327523009436354L;
private final String scriptlerScriptId;
// Map is not serializable, but LinkedHashMap is. Ignore static analysis errors
private final Map<String, String> parameters;
@DataBoundConstructor
public ScriptlerScript(String scriptlerScriptId, List<ScriptlerScriptParameter> parameters) {
super();
this.scriptlerScriptId = scriptlerScriptId;
this.parameters = new LinkedHashMap<String, String>();
if (parameters != null) {
for (ScriptlerScriptParameter parameter : parameters) {
this.parameters.put(parameter.getName(), parameter.getValue());
}
}
}
/**
* @return the scriptlerScriptId
*/
public String getScriptlerScriptId() {
return scriptlerScriptId;
}
/**
* @return the parameters
*/
public Map<String, String> getParameters() {
return parameters;
}
@Override
public Object eval() {
return eval(null);
}
/*
* (non-Javadoc)
* @see org.biouno.unochoice.model.Script#eval(java.util.Map)
*/
@Override
public Object eval(Map<String, String> parameters) {
final Map<String, String> envVars = Utils.getSystemEnv();
Map<String, String> evaledParameters = new LinkedHashMap<String, String>(envVars);
// if we have any parameter that came from UI, let's eval and use them
if (parameters != null && !parameters.isEmpty()) {
// fill our map with the given parameters
evaledParameters.putAll(parameters);
// and now try to expand env vars
for (String key : this.getParameters().keySet()) {
String value = this.getParameters().get(key);
value = Util.replaceMacro((String) value, parameters);
evaledParameters.put(key, value);
}
} else {
evaledParameters.putAll(this.getParameters());
}
return this.toGroovyScript().eval(evaledParameters);
}
// --- utility methods for conversion
/**
* Converts this scriptler script to a GroovyScript.
*
* @return a GroovyScript
*/
public GroovyScript toGroovyScript() {
final Script scriptler = ScriptHelper.getScript(getScriptlerScriptId(), true);
return new GroovyScript(new SecureGroovyScript(scriptler.script, false, null), null);
}
// --- descriptor
@Extension
public static class DescriptorImpl extends ScriptDescriptor {
/*
* (non-Javadoc)
*
* @see hudson.model.Descriptor#getDisplayName()
*/
@Override
public String getDisplayName() {
return "Scriptler Script";
}
@Override
public AbstractScript newInstance(StaplerRequest req, JSONObject jsonObject) throws FormException {
ScriptlerScript script = null;
String scriptScriptId = jsonObject.getString("scriptlerScriptId");
if (scriptScriptId != null && !scriptScriptId.trim().equals("")) {
List<ScriptlerScriptParameter> parameters = new ArrayList<ScriptlerScriptParameter>();
final JSONObject defineParams = jsonObject.getJSONObject("defineParams");
if (defineParams != null && !defineParams.isNullObject()) {
JSONObject argsObj = defineParams.optJSONObject("parameters");
if (argsObj == null) {
JSONArray argsArrayObj = defineParams.optJSONArray("parameters");
if (argsArrayObj != null) {
for (int i = 0; i < argsArrayObj.size(); i++) {
JSONObject obj = argsArrayObj.getJSONObject(i);
String name = obj.getString("name");
String value = obj.getString("value");
if (name != null && !name.trim().equals("") && value != null) {
ScriptlerScriptParameter param = new ScriptlerScriptParameter(name, value);
parameters.add(param);
}
}
}
} else {
String name = argsObj.getString("name");
String value = argsObj.getString("value");
if (name != null && !name.trim().equals("") && value != null) {
ScriptlerScriptParameter param = new ScriptlerScriptParameter(name, value);
parameters.add(param);
}
}
}
script = new ScriptlerScript(scriptScriptId, parameters);
}
return script;
}
}
}