/*************************GO-LICENSE-START*********************************
* Copyright 2014 ThoughtWorks, Inc.
*
* 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.
*************************GO-LICENSE-END***********************************/
package com.thoughtworks.go.domain.builder.pluggableTask;
import com.thoughtworks.go.config.pluggabletask.PluggableTask;
import com.thoughtworks.go.domain.BuildLogElement;
import com.thoughtworks.go.domain.RunIfConfigs;
import com.thoughtworks.go.domain.builder.Builder;
import com.thoughtworks.go.domain.config.PluginConfiguration;
import com.thoughtworks.go.plugin.access.pluggabletask.JobConsoleLoggerInternal;
import com.thoughtworks.go.plugin.access.pluggabletask.TaskExtension;
import com.thoughtworks.go.plugin.api.config.Property;
import com.thoughtworks.go.plugin.api.response.execution.ExecutionResult;
import com.thoughtworks.go.plugin.api.task.*;
import com.thoughtworks.go.plugin.infra.ActionWithReturn;
import com.thoughtworks.go.plugin.infra.PluginManager;
import com.thoughtworks.go.plugin.infra.PluginManagerReference;
import com.thoughtworks.go.plugin.infra.plugininfo.GoPluginDescriptor;
import com.thoughtworks.go.util.StringUtil;
import com.thoughtworks.go.util.command.CruiseControlException;
import com.thoughtworks.go.util.command.EnvironmentVariableContext;
import com.thoughtworks.go.work.DefaultGoPublisher;
import java.io.Serializable;
import java.util.Map;
/**
* This class is serialized and sent over wire to agents.
* Please watch out what you store as fields.
* Do not serialize PluggableTask
*/
public class PluggableTaskBuilder extends Builder implements Serializable {
private final String workingDir;
private String pluginId;
private String version;
private Map<String, Map<String, String>> pluginConfig;
public PluggableTaskBuilder(RunIfConfigs conditions, Builder cancelBuilder, PluggableTask task, String description, String workingDir) {
super(conditions, cancelBuilder, description);
this.workingDir = workingDir;
extractFrom(task);
}
private void extractFrom(PluggableTask task) {
PluginConfiguration pluginConfiguration = task.getPluginConfiguration();
pluginId = pluginConfiguration.getId();
version = pluginConfiguration.getVersion();
pluginConfig = task.configAsMap();
}
@Override
public void build(final BuildLogElement buildLogElement, final DefaultGoPublisher publisher,
final EnvironmentVariableContext environmentVariableContext, TaskExtension taskExtension) throws CruiseControlException {
ExecutionResult executionResult = null;
try {
executionResult = taskExtension.execute(pluginId, new ActionWithReturn<Task, ExecutionResult>() {
@Override
public ExecutionResult execute(Task task, GoPluginDescriptor pluginDescriptor) {
return executeTask(task, buildLogElement, publisher, environmentVariableContext);
}
});
} catch (Exception e) {
logException(publisher, e);
} finally {
JobConsoleLoggerInternal.unsetContext();
}
if (executionResult == null) {
logError(publisher, "ExecutionResult cannot be null. Please return a success or a failure response.");
}
if (!executionResult.isSuccessful()) {
logError(publisher, executionResult.getMessagesForDisplay());
}
}
protected ExecutionResult executeTask(Task task, BuildLogElement buildLogElement,
DefaultGoPublisher publisher,
EnvironmentVariableContext environmentVariableContext) {
final TaskExecutionContext taskExecutionContext = buildTaskContext(buildLogElement, publisher, environmentVariableContext);
JobConsoleLoggerInternal.setContext(taskExecutionContext);
TaskConfig config = buildTaskConfig(task.config());
return task.executor().execute(config, taskExecutionContext);
}
protected TaskExecutionContext buildTaskContext(BuildLogElement buildLogElement,
DefaultGoPublisher publisher,
EnvironmentVariableContext environmentVariableContext) {
return new PluggableTaskContext(buildLogElement, publisher, environmentVariableContext, workingDir);
}
protected TaskConfig buildTaskConfig(TaskConfig config) {
TaskConfig taskExecConfig = new TaskConfig();
for (Property property : config.list()) {
taskExecConfig.add(getExecProperty(config, property));
}
return taskExecConfig;
}
private Property getExecProperty(TaskConfig defaultConfig, Property property) {
String key = property.getKey();
String configValue = pluginConfig.get(key) == null ? null : pluginConfig.get(key).get(PluggableTask.VALUE_KEY);
return StringUtil.isBlank(configValue) ? defaultConfig.get(key) : new TaskConfigProperty(key, configValue);
}
private PluginManager pluginManager() {
return PluginManagerReference.reference().getPluginManager();
}
}