/*************************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.work; import com.thoughtworks.go.domain.JobIdentifier; import com.thoughtworks.go.domain.JobResult; import com.thoughtworks.go.domain.JobState; import com.thoughtworks.go.domain.Property; import com.thoughtworks.go.domain.builder.FetchArtifactBuilder; import com.thoughtworks.go.publishers.GoArtifactsManipulator; import com.thoughtworks.go.remote.AgentIdentifier; import com.thoughtworks.go.remote.BuildRepositoryRemote; import com.thoughtworks.go.remote.work.ConsoleOutputTransmitter; import com.thoughtworks.go.server.service.AgentRuntimeInfo; import com.thoughtworks.go.util.GoConstants; import com.thoughtworks.go.util.SystemEnvironment; import com.thoughtworks.go.util.SystemUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.File; import static java.lang.String.format; public class DefaultGoPublisher implements GoPublisher { private GoArtifactsManipulator manipulator; private JobIdentifier jobIdentifier; private AgentIdentifier agentIdentifier; private BuildRepositoryRemote remoteBuildRepository; private final AgentRuntimeInfo agentRuntimeInfo; private ConsoleOutputTransmitter consoleOutputTransmitter; private static final Log LOG = LogFactory.getLog(DefaultGoPublisher.class); private String currentWorkingDirectory = SystemUtil.currentWorkingDirectory(); public DefaultGoPublisher(GoArtifactsManipulator manipulator, JobIdentifier jobIdentifier, BuildRepositoryRemote remoteBuildRepository, AgentRuntimeInfo agentRuntimeInfo) { this.manipulator = manipulator; this.jobIdentifier = jobIdentifier; this.agentIdentifier = agentRuntimeInfo.getIdentifier(); this.remoteBuildRepository = remoteBuildRepository; this.agentRuntimeInfo = agentRuntimeInfo; init(); } //do not put the logic into the constructor it is really hard to stub. protected void init() { consoleOutputTransmitter = manipulator.createConsoleOutputTransmitter(jobIdentifier, agentIdentifier); } @Override public void setProperty(Property property) { manipulator.setProperty(jobIdentifier, property); } @Override public void upload(File fileToUpload, String destPath) { manipulator.publish(this, destPath, fileToUpload, jobIdentifier); } public void fetch(FetchArtifactBuilder fetchArtifact) { manipulator.fetch(this, fetchArtifact); } @Override public void consumeLine(String line) { taggedConsumeLine(null, line); } public void flushToServer() { consoleOutputTransmitter.flushToServer(); } public void stop() { LOG.info("Stopping Transmission for " + jobIdentifier.toFullString()); consoleOutputTransmitter.stop(); } public void reportCurrentStatus(JobState state) { LOG.info(format("%s is reporting status [%s] to Go Server for %s", agentIdentifier, state, jobIdentifier.toFullString())); remoteBuildRepository.reportCurrentStatus(agentRuntimeInfo, jobIdentifier, state); } public void reportCompleting(JobResult result) { LOG.info(String.format("%s is reporting build result [%s] to Go Server for %s", agentIdentifier, result, jobIdentifier.toFullString())); remoteBuildRepository.reportCompleting(agentRuntimeInfo, jobIdentifier, result); } public void reportCompleted(JobResult result) { LOG.info(String.format("%s is reporting build result [%s] to Go Server for %s", agentIdentifier, result, jobIdentifier.toFullString())); remoteBuildRepository.reportCompleted(agentRuntimeInfo, jobIdentifier, result); reportCompletedAction(); } public void reportCompletedAction() { reportAction(COMPLETED, "Job completed"); } public boolean isIgnored() { return remoteBuildRepository.isIgnored(jobIdentifier); } public void reportAction(String action) { reportAction(NOTICE, action); } public void reportAction(String tag, String action) { String message = String.format("[%s] %s %s on %s [%s]", GoConstants.PRODUCT_NAME, action, jobIdentifier.buildLocatorForDisplay(), agentIdentifier.getHostName(), currentWorkingDirectory); if (LOG.isDebugEnabled()) { LOG.debug(message); } taggedConsumeLine(tag, message); } @Override public void consumeLineWithPrefix(String message) { taggedConsumeLineWithPrefix(NOTICE, message); } @Override public void taggedConsumeLineWithPrefix(String tag, String message) { taggedConsumeLine(tag, String.format("[%s] %s", GoConstants.PRODUCT_NAME, message)); } @Override public void reportErrorMessage(String message, Exception e) { LOG.error(message, e); taggedConsumeLine(ERR, message); } @Override public void taggedConsumeLine(String tag, String line) { SystemEnvironment env = new SystemEnvironment(); if (env.isWebsocketsForAgentsEnabled() && env.isConsoleLogsThroughWebsocketEnabled()) { remoteBuildRepository.taggedConsumeLine(tag, line, jobIdentifier); } else { consoleOutputTransmitter.taggedConsumeLine(tag, line); } } }