package org.iatoki.judgels.uriel.config;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.google.inject.util.Providers;
import org.iatoki.judgels.AWSFileSystemProvider;
import org.iatoki.judgels.FileSystemProvider;
import org.iatoki.judgels.LocalFileSystemProvider;
import org.iatoki.judgels.play.config.AbstractJudgelsPlayModule;
import org.iatoki.judgels.jophiel.Jophiel;
import org.iatoki.judgels.jophiel.services.BaseUserService;
import org.iatoki.judgels.sandalphon.Sandalphon;
import org.iatoki.judgels.sealtiel.Sealtiel;
import org.iatoki.judgels.uriel.UrielProperties;
import org.iatoki.judgels.uriel.services.impls.UserServiceImpl;
public final class UrielModule extends AbstractJudgelsPlayModule {
@Override
protected void manualBinding() {
bind(Jophiel.class).toInstance(jophiel());
bind(Sandalphon.class).toInstance(sandalphon());
bind(Sealtiel.class).toInstance(sealtiel());
bind(FileSystemProvider.class).annotatedWith(ContestFile.class).toInstance(contestFileSystemProvider());
bind(FileSystemProvider.class).annotatedWith(TeamAvatarFile.class).toInstance(teamAvatarFileSystemProvider());
bind(FileSystemProvider.class).annotatedWith(SubmissionLocalFile.class).toInstance(submissionLocalFileSystemProvider());
FileSystemProvider submissionRemoteFileSystemProvider = submissionRemoteFileSystemProvider();
if (submissionRemoteFileSystemProvider != null) {
bind(FileSystemProvider.class).annotatedWith(SubmissionRemoteFile.class).toInstance(submissionRemoteFileSystemProvider);
} else {
bind(FileSystemProvider.class).annotatedWith(SubmissionRemoteFile.class).toProvider(Providers.of(null));
}
bindConstant().annotatedWith(GabrielClientJid.class).to(gabrielClientJid());
bind(BaseUserService.class).to(UserServiceImpl.class);
}
@Override
protected String getDaosImplPackage() {
return "org.iatoki.judgels.uriel.models.daos.impls";
}
@Override
protected String getServicesImplPackage() {
return "org.iatoki.judgels.uriel.services.impls";
}
private UrielProperties urielProperties() {
return UrielProperties.getInstance();
}
private Jophiel jophiel() {
return new Jophiel(urielProperties().getJophielBaseUrl(), urielProperties().getJophielClientJid(), urielProperties().getJophielClientSecret());
}
private Sandalphon sandalphon() {
return new Sandalphon(urielProperties().getSandalphonBaseUrl(), urielProperties().getSandalphonClientJid(), urielProperties().getSandalphonClientSecret());
}
private Sealtiel sealtiel() {
return new Sealtiel(urielProperties().getSealtielBaseUrl(), urielProperties().getSealtielClientJid(), urielProperties().getSealtielClientSecret());
}
private FileSystemProvider teamAvatarFileSystemProvider() {
FileSystemProvider teamAvatarFileSystemProvider = null;
if (urielProperties().isTeamAvatarUsingAWSS3()) {
AmazonS3Client awsS3Client;
if (urielProperties().isTeamAvatarAWSUsingKeys()) {
awsS3Client = new AmazonS3Client(new BasicAWSCredentials(urielProperties().getTeamAvatarAWSAccessKey(), urielProperties().getTeamAvatarAWSSecretKey()));
} else {
awsS3Client = new AmazonS3Client();
}
teamAvatarFileSystemProvider = new AWSFileSystemProvider(awsS3Client, urielProperties().getTeamAvatarAWSS3BucketName(), urielProperties().getTeamAvatarAWSCloudFrontUrl(), urielProperties().getTeamAvatarAWSS3BucketRegion());
} else {
teamAvatarFileSystemProvider = new LocalFileSystemProvider(urielProperties().getTeamAvatarLocalDir());
}
return teamAvatarFileSystemProvider;
}
private FileSystemProvider submissionRemoteFileSystemProvider() {
FileSystemProvider submissionRemoteFileSystemProvider = null;
if (urielProperties().isSubmissionUsingAWSS3()) {
AmazonS3Client awsS3Client;
if (urielProperties().isSubmissionAWSUsingKeys()) {
awsS3Client = new AmazonS3Client(new BasicAWSCredentials(urielProperties().getSubmissionAWSAccessKey(), urielProperties().getSubmissionAWSSecretKey()));
} else {
awsS3Client = new AmazonS3Client();
}
submissionRemoteFileSystemProvider = new AWSFileSystemProvider(awsS3Client, urielProperties().getSubmissionAWSS3BucketName(), urielProperties().getSubmissionAWSS3BucketRegion());
}
return submissionRemoteFileSystemProvider;
}
private FileSystemProvider submissionLocalFileSystemProvider() {
return new LocalFileSystemProvider(urielProperties().getSubmissionLocalDir());
}
private FileSystemProvider contestFileSystemProvider() {
FileSystemProvider contestFileSystemProvider = null;
if (urielProperties().isFileUsingAWSS3()) {
AmazonS3Client awsS3Client;
if (urielProperties().isFileAWSUsingKeys()) {
awsS3Client = new AmazonS3Client(new BasicAWSCredentials(urielProperties().getFileAWSAccessKey(), urielProperties().getFileAWSSecretKey()));
} else {
awsS3Client = new AmazonS3Client();
}
contestFileSystemProvider = new AWSFileSystemProvider(awsS3Client, urielProperties().getFileAWSS3BucketName(), urielProperties().getFileAWSS3BucketRegion());
} else {
contestFileSystemProvider = new LocalFileSystemProvider(urielProperties().getFileLocalDir());
}
return contestFileSystemProvider;
}
private String gabrielClientJid() {
return urielProperties().getSealtielGabrielClientJid();
}
}