blob: cea8b84067e16fbc95af16de54e8a81c7fc5a205 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 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
* Sebastien Dubois (Ericsson) - Improvements for bug 400266
* Guy Perron 423242: Add ability to edit comment from compare navigator popup
*******************************************************************************/
package org.eclipse.mylyn.internal.gerrit.ui;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.mylyn.internal.gerrit.core.GerritOperationFactory;
import org.eclipse.mylyn.internal.gerrit.core.Messages;
import org.eclipse.mylyn.internal.gerrit.core.client.rest.CommentInput;
import org.eclipse.mylyn.internal.gerrit.core.operations.DiscardDraftRequest;
import org.eclipse.mylyn.internal.gerrit.core.operations.GerritOperation;
import org.eclipse.mylyn.internal.gerrit.core.operations.SaveDraftRequest;
import org.eclipse.mylyn.internal.gerrit.ui.egit.GitFileRevisionUtils;
import org.eclipse.mylyn.reviews.core.model.IComment;
import org.eclipse.mylyn.reviews.core.model.IFileVersion;
import org.eclipse.mylyn.reviews.core.model.ILineLocation;
import org.eclipse.mylyn.reviews.core.model.ILocation;
import org.eclipse.mylyn.reviews.core.model.IReviewItem;
import org.eclipse.mylyn.reviews.ui.ReviewBehavior;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.core.history.IFileRevision;
import com.google.common.base.Strings;
import com.google.gerrit.reviewdb.Patch;
import com.google.gwtjsonrpc.client.VoidResult;
/**
* @author Steffen Pingel
* @author Guy Perron
*/
public class GerritReviewBehavior extends ReviewBehavior {
private Repository repository = null;
private final short LEFT_SIDE = 0;
private final short RIGHT_SIDE = 1;
private final String BASE = "base-"; //$NON-NLS-1$
public GerritReviewBehavior(ITask task) {
super(task);
}
public GerritReviewBehavior(ITask task, Repository repository) {
super(task);
this.repository = repository;
}
public GerritOperationFactory getOperationFactory() {
return GerritUiPlugin.getDefault().getOperationFactory();
}
@Override
public IStatus addComment(IReviewItem item, IComment comment, IProgressMonitor monitor) {
short side = RIGHT_SIDE;
String id = item.getId();
if (id.startsWith(BASE)) {
// base revision
id = id.substring(BASE.length());
side = LEFT_SIDE;
}
Patch.Key key = Patch.Key.parse(id);
for (ILocation location : comment.getLocations()) {
if (location instanceof ILineLocation) {
ILineLocation lineLocation = (ILineLocation) location;
SaveDraftRequest request = new SaveDraftRequest(key, lineLocation.getRangeMin(), side, null,
Strings.emptyToNull(comment.getId()));
request.setMessage(comment.getDescription());
GerritOperation<CommentInput> operation = getOperationFactory().createOperation(getTask(), request);
IStatus status = operation.run(monitor);
CommentInput commentInput = operation.getOperationResult();
// save the value of uuid, and keep it with the comment
if (commentInput != null) {
comment.setId(commentInput.getId());
}
return status;
}
}
//We'll only get here if there is something really broken in calling code or model. Gerrit has one and only one comment per location.
throw new RuntimeException(NLS.bind(Messages.GerritReviewBehavior_Internal_Exception, comment.getId()));
}
@Override
public IStatus discardComment(IReviewItem item, IComment comment, IProgressMonitor monitor) {
short side = RIGHT_SIDE;
String id = item.getId();
if (id.startsWith(BASE)) {
// base revision
id = id.substring(BASE.length());
side = LEFT_SIDE;
}
Patch.Key key = Patch.Key.parse(id);
for (ILocation location : comment.getLocations()) {
if (location instanceof ILineLocation) {
ILineLocation lineLocation = (ILineLocation) location;
DiscardDraftRequest request = new DiscardDraftRequest(key, comment.getId());
request.setMessage(comment.getDescription());
GerritOperation<VoidResult> operation = getOperationFactory().createOperation(getTask(), request);
return operation.run(monitor);
}
}
throw new RuntimeException(Messages.GerritReviewBehavior_Internal_Exception + comment.getId());
}
@Override
public IFileRevision getFileRevision(IFileVersion reviewFileVersion) {
if (repository != null) {
return GitFileRevisionUtils.getFileRevision(repository, reviewFileVersion);
}
return null;
}
}