/*******************************************************************************
* Copyright (c) 2015, 2016 Vaughan Hilts and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Vaughan Hilts - Initial implementation
* Kyle Ross - Initial implementation
*******************************************************************************/
package org.eclipse.mylyn.reviews.internal.core;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Map.Entry;
import java.util.Objects;
import org.eclipse.core.runtime.Assert;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
public class TaskBuildStatusMapper {
public static final String BUILD_RESULT_TYPE = "BuildResult"; //$NON-NLS-1$
public static final String JOB_NAME_ATTRIBUTE_KEY = "JOB"; //$NON-NLS-1$
public static final String BUILD_NUMBER_ATTRIBUTE_KEY = "NUMBER"; //$NON-NLS-1$
public static final String STATUS_ATTRIBUTE_KEY = "STATUS"; //$NON-NLS-1$
public static final String URL_ATTRIBUTE_KEY = "URL"; //$NON-NLS-1$
public static final String ATTR_ID_BUILD_RESULT = "BUILD_RESULT-"; //$NON-NLS-1$
public static final String ATTR_TYPE_PATCH_SET = "PATCH_SET-"; //$NON-NLS-1$
public static final String KIND_PATCH_SET = "review.patch.set"; //$NON-NLS-1$
private final Iterable<BuildResult> buildResults;
public TaskBuildStatusMapper(Collection<BuildResult> buildResults) {
this.buildResults = buildResults;
}
public void applyTo(TaskAttribute taskAttribute) {
Assert.isNotNull(taskAttribute);
TaskData taskData = taskAttribute.getTaskData();
TaskAttributeMapper mapper = taskData.getAttributeMapper();
taskAttribute.getMetaData().defaults().setType(BUILD_RESULT_TYPE).setKind(TaskBuildStatusMapper.KIND_PATCH_SET);
Function<BuildResult, String> groupFunction = new Function<BuildResult, String>() {
@Override
public String apply(BuildResult source) {
return source.getJobName();
}
};
final Multimap<String, BuildResult> buildsByJobName = Multimaps.index(this.buildResults, groupFunction);
int i = 0;
for (Entry<String, Collection<BuildResult>> jobEntry : buildsByJobName.asMap().entrySet()) {
// We'll take the biggest entry build number and use that for mapping right now
BuildResult result = Collections.max(jobEntry.getValue(), new Comparator<BuildResult>() {
@Override
public int compare(BuildResult o1, BuildResult o2) {
return Integer.compare(o1.getBuildNumber(), o2.getBuildNumber());
}
});
TaskAttribute buildAttribute = taskAttribute.createAttribute(ATTR_ID_BUILD_RESULT + i);
buildAttribute.getMetaData().defaults().setType(BUILD_RESULT_TYPE);
if (result.getBuildUrl() != null) {
TaskAttribute child = buildAttribute.createAttribute(URL_ATTRIBUTE_KEY);
child.getMetaData().defaults().setType(BUILD_RESULT_TYPE);
mapper.setValue(child, result.getBuildUrl());
}
if (result.getBuildStatus() != null) {
TaskAttribute child = buildAttribute.createAttribute(STATUS_ATTRIBUTE_KEY);
child.getMetaData().defaults().setType(BUILD_RESULT_TYPE);
mapper.setValue(child, result.getBuildStatus().toString());
}
if (result.getBuildNumber() > -1) {
TaskAttribute child = buildAttribute.createAttribute(BUILD_NUMBER_ATTRIBUTE_KEY);
child.getMetaData().defaults().setType(BUILD_RESULT_TYPE);
mapper.setValue(child, String.valueOf(result.getBuildNumber()));
}
if (result.getJobName() != null) {
TaskAttribute child = buildAttribute.createAttribute(JOB_NAME_ATTRIBUTE_KEY);
child.getMetaData().defaults().setType(BUILD_RESULT_TYPE);
mapper.setValue(child, result.getJobName());
}
buildAttribute.setValue(hashChildAttributeValues(buildAttribute));
i++;
}
taskAttribute.setValue(hashChildAttributeValues(taskAttribute));
}
private String hashChildAttributeValues(TaskAttribute attribute) {
Object[] childValues = FluentIterable.from(attribute.getAttributes().values())
.transform(toValue())
.toArray(Object.class);
return Integer.toString(Objects.hash(childValues));
}
private static Function<TaskAttribute, Object> toValue() {
return new Function<TaskAttribute, Object>() {
public Object apply(TaskAttribute o) {
return o.getValue();
}
};
}
}