package com.hubspot.blazar.cctray; import com.google.common.base.Function; import com.google.common.base.Optional; import com.hubspot.blazar.base.GitInfo; import com.hubspot.blazar.base.RepositoryBuild; import com.hubspot.blazar.base.RepositoryBuild.State; import com.hubspot.blazar.base.RepositoryState; import com.hubspot.blazar.cctray.CCTrayProject.CCTrayActivity; import com.hubspot.blazar.cctray.CCTrayProject.CCTrayStatus; import com.hubspot.blazar.util.BlazarUrlHelper; import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.ISODateTimeFormat; import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; @Singleton public class CCTrayProjectFactory implements Function<RepositoryState, Optional<CCTrayProject>> { private static final DateTimeFormatter DATE_FORMATTER = ISODateTimeFormat.dateTimeNoMillis(); private final BlazarUrlHelper urlHelper; @Inject public CCTrayProjectFactory(BlazarUrlHelper urlHelper) { this.urlHelper = urlHelper; } @Override public Optional<CCTrayProject> apply(@Nullable RepositoryState repositoryState) { if (repositoryState == null || !repositoryState.getGitInfo().isActive() || !repositoryState.getLastBuild().isPresent()) { return Optional.absent(); } RepositoryBuild lastBuild = repositoryState.getLastBuild().get(); String name = computeCCTrayName(repositoryState.getGitInfo()); CCTrayActivity activity = computeCCTrayActivity(repositoryState.getInProgressBuild()); CCTrayStatus lastBuildState = computeLastBuildState(lastBuild); String lastBuildLabel = computeLastBuildLabel(lastBuild); String lastBuildTime = computeLastBuildTime(lastBuild); String webUrl = computeWebUrl(repositoryState.getGitInfo()); return Optional.of(new CCTrayProject(name, activity, lastBuildState, lastBuildLabel, lastBuildTime, webUrl)); } private String computeCCTrayName(GitInfo gitInfo) { return gitInfo.getRepository() + '/' + gitInfo.getBranch(); } private CCTrayActivity computeCCTrayActivity(Optional<RepositoryBuild> inProgressBuild) { if (inProgressBuild.isPresent()) { if (inProgressBuild.get().getState() == State.LAUNCHING) { return CCTrayActivity.CHECKING_MODIFICATIONS; } else { return CCTrayActivity.BUILDING; } } else { return CCTrayActivity.SLEEPING; } } private CCTrayStatus computeLastBuildState(RepositoryBuild lastBuild) { switch (lastBuild.getState()) { case SUCCEEDED: return CCTrayStatus.SUCCESS; case CANCELLED: return CCTrayStatus.UNKNOWN; case FAILED: case UNSTABLE: return CCTrayStatus.FAILURE; default: return CCTrayStatus.UNKNOWN; } } private String computeLastBuildLabel(RepositoryBuild lastBuild) { return String.valueOf(lastBuild.getBuildNumber()); } private String computeLastBuildTime(RepositoryBuild lastBuild) { return DATE_FORMATTER.print(lastBuild.getStartTimestamp().or(0L)); } private String computeWebUrl(GitInfo gitInfo) { return urlHelper.getBlazarUiLink(gitInfo).toString(); } }