package tv.dyndns.kishibe.qmaclone.client.ranking; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import tv.dyndns.kishibe.qmaclone.client.ServiceAsync; import tv.dyndns.kishibe.qmaclone.client.packet.PacketRankingData; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.IsWidget; import com.google.inject.Inject; public class ThemeRankingPresenter { interface View extends IsWidget { void setRanking(List<PacketRankingData> ranking); } private enum DateRange { Old, All, Year, YearMonth } private static final Logger logger = Logger.getLogger(ThemeRankingPresenter.class.toString()); private final ServiceAsync service; private View view; private int year; private int month; private String theme; private DateRange dateRange; @Inject public ThemeRankingPresenter(ServiceAsync service) { this.service = Preconditions.checkNotNull(service); } public void setView(View view) { this.view = Preconditions.checkNotNull(view); } public void onOldSelected() { dateRange = DateRange.Old; update(); } public void onAllSelected() { dateRange = DateRange.All; update(); } public void onYearSelected(int year) { dateRange = DateRange.Year; this.year = year; update(); } public void onMonthSelected(int year, int month) { dateRange = DateRange.YearMonth; this.year = year; this.month = month; update(); } public void onThemeSelected(String theme) { this.theme = theme; update(); } private void update() { if (theme == null || dateRange == null) { return; } switch (dateRange) { case Old: service.getThemeRankingOld(theme, callbackGetThemeRanking); break; case All: service.getThemeRankingAll(theme, callbackGetThemeRanking); break; case Year: service.getThemeRanking(theme, year, callbackGetThemeRanking); break; case YearMonth: service.getThemeRanking(theme, year, month, callbackGetThemeRanking); break; default: break; } } @VisibleForTesting final AsyncCallback<List<PacketRankingData>> callbackGetThemeRanking = new AsyncCallback<List<PacketRankingData>>() { @Override public void onSuccess(List<PacketRankingData> result) { view.setRanking(result); } @Override public void onFailure(Throwable caught) { logger.log(Level.WARNING, "テーマランキングの取得に失敗しました", caught); } }; }