package de.skuzzle.polly.core.internal.httpv2;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.egit.github.core.Repository;
import org.eclipse.egit.github.core.RepositoryCommit;
import org.eclipse.egit.github.core.client.PageIterator;
import org.eclipse.egit.github.core.service.CommitService;
import org.eclipse.egit.github.core.service.RepositoryService;
import de.skuzzle.polly.http.annotations.Post;
import de.skuzzle.polly.http.api.Controller;
import de.skuzzle.polly.http.api.answers.HttpAnswer;
import de.skuzzle.polly.http.api.answers.HttpAnswers;
import de.skuzzle.polly.sdk.MyPolly;
import de.skuzzle.polly.sdk.httpv2.PollyController;
import de.skuzzle.polly.sdk.time.Time;
public class GitHubController extends PollyController {
private final static Logger logger = Logger.getLogger(GitHubController.class
.getName());
private final static String API_RECEIVE_EVENT = "/api/github/receive"; //$NON-NLS-1$
private final static int MAX_COMMITS = 15;
private final static String GIT_HUB_OWNER = "skuzzle"; //$NON-NLS-1$
private final static String GIT_HUB_REPO = "polly"; //$NON-NLS-1$
private final static List<RepositoryCommit> LATEST_COMMITS;
private static Date lastRefresh;
static {
LATEST_COMMITS = new ArrayList<>(MAX_COMMITS);
}
public static Collection<RepositoryCommit> getLatestCommits() {
synchronized (LATEST_COMMITS) {
return new ArrayList<>(LATEST_COMMITS);
}
}
public static Date getLastRefresh() {
return lastRefresh;
}
private static void updateCommitList(Collection<RepositoryCommit> all, CommitService cservice) {
synchronized (LATEST_COMMITS) {
LATEST_COMMITS.clear();
int i = 0;
for (RepositoryCommit ci : all) {
if (i++ == MAX_COMMITS) {
break;
}
LATEST_COMMITS.add(ci);
}
lastRefresh = Time.currentTime();
logger.info("Succcessfully read " + i + " commits"); //$NON-NLS-1$//$NON-NLS-2$
}
}
public static void refreshCommits() {
try {
final RepositoryService rservice = new RepositoryService();
final CommitService cservice = new CommitService();
final Repository repo = rservice.getRepository(GIT_HUB_OWNER, GIT_HUB_REPO);
final PageIterator<RepositoryCommit> pit = cservice.pageCommits(repo, MAX_COMMITS);
if (pit.hasNext()) {
updateCommitList(pit.next(), cservice);
}
} catch (IOException e) {
logger.error("Error while updating GitHub commits", e); //$NON-NLS-1$
}
}
public GitHubController(MyPolly myPolly) {
super(myPolly);
}
@Override
protected Controller createInstance() {
return new GitHubController(this.getMyPolly());
}
@Post(API_RECEIVE_EVENT)
public HttpAnswer receiveEvent() {
logger.trace("GitHub API Post Request"); //$NON-NLS-1$
refreshCommits();
return HttpAnswers.newStringAnswer("ok"); //$NON-NLS-1$
}
}