/*******************************************************************************
* Copyright (C) 2011, Jens Baumgart <jens.baumgart@sap.com>
* Copyright (C) 2011, Stefan Lay <stefan.lay@sap.com>
* Copyright (C) 2015, Thomas Wolf <thomas.wolf@paranor.ch>
*
* 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
*******************************************************************************/
package org.eclipse.egit.ui.internal.history;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.JobFamilies;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revplot.PlotCommit;
class FormatJob extends Job {
@Override
public boolean belongsTo(Object family) {
if (JobFamilies.FORMAT_COMMIT_INFO.equals(family))
return true;
return super.belongsTo(family);
}
private Object lock = new Object(); // guards formatRequest and formatResult
private FormatRequest formatRequest;
private FormatResult formatResult;
FormatJob(FormatRequest formatRequest) {
super(UIText.FormatJob_buildingCommitInfo);
this.formatRequest = formatRequest;
}
FormatResult getFormatResult() {
synchronized(lock) {
return formatResult;
}
}
@Override
protected IStatus run(IProgressMonitor monitor) {
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
FormatResult commitInfo;
CommitInfoBuilder builder;
try {
synchronized(lock) {
SWTCommit commit = (SWTCommit)formatRequest.getCommit();
commit.parseBody();
builder = new CommitInfoBuilder(formatRequest.getRepository(),
commit, formatRequest.isFill(),
formatRequest.getAllRefs());
}
commitInfo = builder.format(monitor);
} catch (IOException e) {
return Activator.createErrorStatus(e.getMessage(), e);
}
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
synchronized(lock) {
formatResult = commitInfo;
}
return Status.OK_STATUS;
}
static class FormatRequest {
public Collection<Ref> getAllRefs() {
return allRefs;
}
public void setAllRefs(Collection<Ref> allRefs) {
this.allRefs = allRefs;
}
private Repository repository;
private PlotCommit<?> commit;
private boolean fill;
private Collection<Ref> allRefs;
FormatRequest(Repository repository, PlotCommit<?> commit, boolean fill,
Collection<Ref> allRefs) {
this.repository = repository;
this.commit = commit;
this.fill = fill;
this.allRefs = allRefs;
}
public Repository getRepository() {
return repository;
}
public PlotCommit<?> getCommit() {
return commit;
}
public boolean isFill() {
return fill;
}
}
static class FormatResult{
private final String commitInfo;
private final List<GitCommitReference> knownLinks;
private final int headerEnd;
private final int footerStart;
FormatResult(String commmitInfo, List<GitCommitReference> links,
int headerEnd, int footerStart) {
this.commitInfo = commmitInfo;
this.knownLinks = links;
this.headerEnd = headerEnd;
this.footerStart = footerStart;
}
public String getCommitInfo() {
return commitInfo;
}
public List<GitCommitReference> getKnownLinks() {
return knownLinks;
}
public int getHeaderEnd() {
return headerEnd;
}
public int getFooterStart() {
return footerStart;
}
}
}