package se.bjurr.sbcc;
import static java.lang.Boolean.TRUE;
import static java.util.logging.Level.SEVERE;
import static se.bjurr.sbcc.settings.SbccSettings.sscSettings;
import java.util.Collection;
import java.util.logging.Logger;
import com.atlassian.applinks.api.ApplicationLinkService;
import com.atlassian.bitbucket.auth.AuthenticationContext;
import com.atlassian.bitbucket.hook.HookResponse;
import com.atlassian.bitbucket.hook.repository.PreReceiveRepositoryHook;
import com.atlassian.bitbucket.hook.repository.RepositoryHookContext;
import com.atlassian.bitbucket.repository.RefChange;
import com.atlassian.bitbucket.setting.Settings;
import com.google.common.annotations.VisibleForTesting;
import se.bjurr.sbcc.commits.ChangeSetsService;
import se.bjurr.sbcc.data.SbccVerificationResult;
import se.bjurr.sbcc.settings.SbccSettings;
public class SbccPreReceiveRepositoryHook implements PreReceiveRepositoryHook {
private static Logger logger = Logger.getLogger(SbccPreReceiveRepositoryHook.class.getName());
@VisibleForTesting
public static Logger getLogger() {
return logger;
}
@VisibleForTesting
public static void setLogger(Logger logger) {
SbccPreReceiveRepositoryHook.logger = logger;
}
private final ApplicationLinkService applicationLinkService;
private final AuthenticationContext bitbucketAuthenticationContext;
private ChangeSetsService changesetsService;
private String hookName;
private final SbccUserAdminService sbccUserAdminService;
public SbccPreReceiveRepositoryHook(
ChangeSetsService changesetsService,
AuthenticationContext bitbucketAuthenticationContext,
ApplicationLinkService applicationLinkService,
SbccUserAdminService sbccUserAdminService) {
this.hookName = "Simple Bitbucket Commit Checker";
this.changesetsService = changesetsService;
this.bitbucketAuthenticationContext = bitbucketAuthenticationContext;
this.applicationLinkService = applicationLinkService;
this.sbccUserAdminService = sbccUserAdminService;
}
@VisibleForTesting
public String getHookName() {
return this.hookName;
}
@Override
public boolean onReceive(
RepositoryHookContext repositoryHookContext,
Collection<RefChange> refChanges,
HookResponse hookResponse) {
try {
if (!this.hookName.isEmpty()) {
hookResponse.out().println(this.hookName);
hookResponse.out().println();
}
SbccRenderer sbccRenderer = new SbccRenderer(this.bitbucketAuthenticationContext);
Settings rawSettings = repositoryHookContext.getSettings();
final SbccSettings settings = sscSettings(new RenderingSettings(rawSettings, sbccRenderer));
if (new UserValidator(settings, this.bitbucketAuthenticationContext.getCurrentUser())
.shouldIgnoreChecksForUser()) {
return TRUE;
}
final SbccVerificationResult refChangeVerificationResults =
new RefChangeValidator(
repositoryHookContext.getRepository(),
repositoryHookContext.getRepository(),
settings,
this.changesetsService,
this.bitbucketAuthenticationContext,
sbccRenderer,
this.applicationLinkService,
this.sbccUserAdminService)
.validateRefChanges(refChanges);
String printOut =
new SbccPrinter(settings, sbccRenderer)
.printVerificationResults(refChangeVerificationResults);
hookResponse.out().print(printOut);
if (settings.isDryRun() && settings.getDryRunMessage().isPresent()) {
hookResponse.out().println(settings.getDryRunMessage().get());
}
if (!settings.isDryRun()) {
return refChangeVerificationResults.isAccepted();
}
return TRUE;
} catch (final Exception e) {
final String message =
"Error while validating reference changes. Will allow all of them. \""
+ e.getMessage()
+ "\"";
logger.log(SEVERE, message, e);
hookResponse.out().println(message);
return TRUE;
}
}
@VisibleForTesting
public void setChangesetsService(ChangeSetsService changesetsService) {
this.changesetsService = changesetsService;
}
@VisibleForTesting
public void setHookName(String hookName) {
this.hookName = hookName;
}
}