/* * Copyright 2016 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. */ package com.thoughtworks.go.domain; import java.io.File; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import org.apache.commons.lang.StringUtils; import static com.thoughtworks.go.domain.TestReportGenerator.TEST_RESULTS_FILE; import static com.thoughtworks.go.util.ExceptionUtils.bomb; public class JobInstances extends BaseCollection<JobInstance> { private static final Comparator<JobInstance> JOB_INSTANCE_NAME_COMPARATOR = new Comparator<JobInstance>() { public int compare(JobInstance o1, JobInstance o2) { return o1.getName().compareTo(o2.getName()); } }; public JobInstances() { super(); } public JobInstances(Collection<? extends JobInstance> jobInstances) { for (JobInstance instance : jobInstances) { add(instance); } } public JobInstances(JobInstance... jobInstance) { super(Arrays.asList(jobInstance)); } public JobInstance getByName(String name) { for (JobInstance thisInstance : this) { if (name.equals(thisInstance.getName())) { return thisInstance; } } throw bomb("Does not contain plan with name " + name); } public boolean hasJobNamed(String name) { for (JobInstance thisInstance : this) { if (name.equalsIgnoreCase(thisInstance.getName())) { return true; } } return false; } public JobInstances filterByState(JobState state) { JobInstances filtered = new JobInstances(); for (JobInstance instance : this) { if (state == instance.getState()) { filtered.add(instance); } } return filtered; } public JobInstances filterByResult(JobResult... results) { JobInstances filtered = new JobInstances(); for (JobInstance instance : this) { if (Arrays.asList(results).contains(instance.getResult())) { filtered.add(instance); } } return filtered; } public JobInstance mostRecentPassed() { JobInstance mostRecent = JobInstance.NULL; for (JobInstance instance : this) { mostRecent = instance.mostRecentPassed(mostRecent); } return mostRecent; } public JobInstance mostRecentCompleted() { JobInstance mostRecent = JobInstance.NULL; for (JobInstance instance : this) { mostRecent = instance.mostRecentCompleted(mostRecent); } return mostRecent; } public StageState stageState() { return StageState.findByBuilds(this); } public JobStateTransitions stateTransitions() { final JobStateTransitions transitions = new JobStateTransitions(); for (JobInstance job : this) { transitions.addAll(job.getTransitions()); } return transitions; } public JobInstances withNonEmptyStacktrace() { JobInstances jobInstances = new JobInstances(); for (JobInstance instance : this) { if (StringUtils.isNotBlank(instance.getStacktrace())) { jobInstances.add(instance); } } return jobInstances; } public JobInstances withNonEmptyBuildErrors() { JobInstances jobInstances = new JobInstances(); for (JobInstance instance : this) { if (StringUtils.isNotBlank(instance.getBuildError())) { jobInstances.add(instance); } } return jobInstances; } public JobInstances withNonEmptyIndexPages() { JobInstances jobInstances = new JobInstances(); for (JobInstance key : this) { File indexPage = key.getTestIndexPage(); if (indexPage != null && TEST_RESULTS_FILE.equals(indexPage.getName())) { jobInstances.add(key); } } return jobInstances; } public JobInstances sortByName() { Collections.sort(this, JOB_INSTANCE_NAME_COMPARATOR); return this; } public Date latestTransitionDate() { Date mostRecent = null; for (JobInstance jobInstance : this) { if (mostRecent == null || jobInstance.latestTransitionDate().after(mostRecent)) { mostRecent = jobInstance.latestTransitionDate(); } } return mostRecent; } public long latestTransitionId() { long latest = JobStateTransition.NOT_PERSISTED; for (JobInstance jobInstance : this) { long id = jobInstance.latestTransitionId(); if (id > latest) { latest = id; } } return latest; } public void resetJobsIds() { for (JobInstance jobInstance : this) { jobInstance.resetForCopy(); } } }