/******************************************************************************* * Copyright (c) 2013, 2015 Tasktop Technologies 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: * Tasktop Technologies - initial API and implementation * Marc-Andre Laperle (Ericsson) - Add topic *******************************************************************************/ package org.eclipse.mylyn.internal.gerrit.core.client.rest; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.eclipse.mylyn.internal.gerrit.core.client.compat.PermissionLabel; import com.google.gerrit.common.data.ApprovalDetail; import com.google.gerrit.common.data.ApprovalType; import com.google.gerrit.reviewdb.Account; import com.google.gerrit.reviewdb.ApprovalCategory; import com.google.gerrit.reviewdb.ApprovalCategoryValue; import com.google.gerrit.reviewdb.Change; import com.google.gerrit.reviewdb.PatchSet; import com.google.gerrit.reviewdb.PatchSetApproval; /** * Data model object for * <a href="https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#change-info">ChangeInfo</a>. */ public class ChangeInfo { // e.g. "gerritcodereview#change" private String kind; // e.g. "myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940" private String id; // e.g. "myProject" private String project; // e.g. "master" private String branch; // e.g. "I8473b95934b5732ac55d26311a706c9c2bde9940" private String change_id; // e.g. "Topic" private String topic; // e.g. "Implementing Feature X" private String subject; // e.g. "ABANDONED" private Change.Status status; // e.g. "2013-02-01 09:59:32.126000000" private Timestamp created; // e.g. "2013-02-21 11:16:36.775000000", private Timestamp updated; private boolean reviewed; private boolean mergeable; private AccountInfo owner; private LinkedHashMap<String/*Label*/, LabelInfo> labels; private String current_revision; private Map<String/*commit ID*/, RevisionInfo> revisions; private Map<String/*Label*/, String[]> permitted_labels; // e.g. "0023412400000f7d" @SuppressWarnings("unused") private String _sortkey; // e.g. 3965 private int _number; public int getNumber() { return _number; } public String getKind() { return kind; } public String getId() { return id; } public String getProject() { return project; } public String getBranch() { return branch; } public String getTopic() { return topic; } public String getChangeId() { return change_id; } public String getSubject() { return subject; } public Change.Status getStatus() { return status; } public Timestamp getCreated() { return created; } public Timestamp getUpdated() { return updated; } public boolean isReviewed() { return reviewed; } public boolean isMergeable() { return mergeable; } public AccountInfo getOwner() { return owner; } public Map<String, LabelInfo> getLabels() { return labels; } public String getCurrentRevision() { return current_revision; } public Map<String, RevisionInfo> getRevisions() { return revisions; } public Map<String, String[]> getPermittedLabels() { return permitted_labels; } public PatchSet.Id getCurrentPatchSetId() { Change.Id changeId = new Change.Id(_number); int patchSetId = revisions.get(current_revision).getNumber(); return new PatchSet.Id(changeId, patchSetId); } public Set<ApprovalDetail> convertToApprovalDetails() { if (labels == null) { return Collections.<ApprovalDetail> emptySet(); } Set<ApprovalDetail> result = new LinkedHashSet<ApprovalDetail>(); for (Entry<String, LabelInfo> entry : labels.entrySet()) { List<ApprovalInfo> all = entry.getValue().getAll(); if (all != null) { ApprovalCategory.Id approvalCategoryId = ApprovalUtil.findCategoryIdByNameWithDash(entry.getKey()); if (approvalCategoryId == null) { continue; } for (ApprovalInfo approvalInfo : all) { Account.Id accountId = new Account.Id(approvalInfo.getId()); ApprovalDetail approvalDetail = new ApprovalDetail(accountId); approvalDetail.add(new PatchSetApproval( new PatchSetApproval.Key(getCurrentPatchSetId(), accountId, approvalCategoryId), approvalInfo.getValue())); result.add(approvalDetail); } } } return result; } public Set<ApprovalType> convertToApprovalTypes() { if (labels == null) { return null; } Set<ApprovalType> result = new LinkedHashSet<ApprovalType>(); for (Entry<String, LabelInfo> entry : labels.entrySet()) { ApprovalCategory approvalCategory = ApprovalUtil.findCategoryByNameWithDash(entry.getKey()); if (approvalCategory == null) { // it's a custom approval type approvalCategory = new ApprovalCategory(new ApprovalCategory.Id(null), entry.getKey()); } List<ApprovalCategoryValue> valueList = new ArrayList<ApprovalCategoryValue>(); if (entry.getValue() != null && entry.getValue().getValues() != null) { // custom approval types may not provide values for (Entry<String, String> valueEntry : entry.getValue().getValues().entrySet()) { valueList.add(new ApprovalCategoryValue(new ApprovalCategoryValue.Id(approvalCategory.getId(), ApprovalUtil.parseShort(valueEntry.getKey())), valueEntry.getValue())); } } ApprovalType approvalType = new ApprovalType(approvalCategory, valueList); result.add(approvalType); } return result; } public List<PermissionLabel> convertToPermissionLabels() { if (permitted_labels == null) { return null; } List<PermissionLabel> result = new ArrayList<PermissionLabel>(permitted_labels.size()); for (Entry<String, String[]> entry : permitted_labels.entrySet()) { List<Short> values = new ArrayList<Short>(entry.getValue().length); for (String value : entry.getValue()) { values.add(ApprovalUtil.parseShort(value)); } PermissionLabel label = new PermissionLabel(); label.setName(PermissionLabel.toLabelName(entry.getKey())); label.setMin(Collections.min(values).intValue()); label.setMax(Collections.max(values).intValue()); result.add(label); } return result; } /** * Converts labels into a map of approvals given by the provided user. * * @param id * id of the current patch set * @param account * the user whose approvals should be converted * @return map of given approvals * @see #labels */ public Map<ApprovalCategory.Id, PatchSetApproval> convertToPatchSetApprovals(PatchSet.Id id, Account account) { if (labels == null) { return null; } Map<ApprovalCategory.Id, PatchSetApproval> result = new HashMap<ApprovalCategory.Id, PatchSetApproval>( labels.size()); for (Entry<String, LabelInfo> entry : labels.entrySet()) { ApprovalCategory approvalCategory = ApprovalUtil.findCategoryByNameWithDash(entry.getKey()); if (approvalCategory == null) { continue; } if (entry.getValue().getAll() == null) { continue; } for (ApprovalInfo approvalInfo : entry.getValue().getAll()) { if (approvalInfo.getId() == account.getId().get()) { Account.Id accountId = new Account.Id(approvalInfo.getId()); PatchSetApproval.Key key = new PatchSetApproval.Key(id, accountId, approvalCategory.getId()); PatchSetApproval approval = new PatchSetApproval(key, approvalInfo.getValue()); result.put(approvalCategory.getId(), approval); } } } return result; } }