/*******************************************************************************
* Copyright (c) 2016 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.jobs;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import org.eclipse.egit.core.RepositoryCache;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.jface.action.Action;
import org.eclipse.jgit.annotations.NonNull;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryCache.FileKey;
import org.eclipse.jgit.util.FS;
/**
* An {@link Action} to report some background job result.
*/
public abstract class RepositoryJobResultAction extends Action {
/**
* Because this action may be associated with a job and may be invoked long
* after the repository operation had been performed we do not keep a
* reference to the {@link Repository} here. The repository might have been
* deleted in the meantime.
*/
private final File repositoryDir;
private boolean repositoryGone;
/**
* Creates a new {@link RepositoryJobResultAction}.
*
* @param repository
* the result belongs to
* @param title
* of the action
*/
public RepositoryJobResultAction(@NonNull Repository repository,
String title) {
super(title);
this.repositoryDir = repository.getDirectory();
}
@Override
public final void run() {
Repository repo = null;
if (!repositoryGone) {
RepositoryCache repoCache = org.eclipse.egit.core.Activator
.getDefault().getRepositoryCache();
repo = repoCache.getRepository(repositoryDir);
if (repo == null
&& FileKey.isGitRepository(repositoryDir, FS.DETECTED)) {
// No longer in the Egit cache but still on disk
try {
repo = repoCache.lookupRepository(repositoryDir);
} catch (IOException e) {
// Ignore, repo remains null
}
}
repositoryGone = repo == null;
}
if (repositoryGone || repo == null) {
Activator.showError(MessageFormat.format(
UIText.RepositoryJobResultAction_RepositoryGone,
repositoryDir), null);
return;
}
showResult(repo);
}
/**
* Shows the job result to the user.
*
* @param repository
* the result belongs to
*/
abstract protected void showResult(@NonNull Repository repository);
}