package de.tud.kom.socom.web.client.influence.strategies;
import java.util.List;
import java.util.Map;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Widget;
import de.tud.kom.socom.web.client.AppController;
import de.tud.kom.socom.web.client.administration.itemadministration.ItemAdministration.ChangeVisibilityButtonCallback;
import de.tud.kom.socom.web.client.administration.itemadministration.ItemAdministration.DeleteButtonCallback;
import de.tud.kom.socom.web.client.administration.itemadministration.ItemAdministrationState;
import de.tud.kom.socom.web.client.influence.InfluencePresenter.InfluenceAnswerViewInterface;
import de.tud.kom.socom.web.client.influence.InfluencePresenter.InfluenceFreeAnswerViewInterface;
import de.tud.kom.socom.web.client.reporting.ItemReportView.SendReportCallback;
import de.tud.kom.socom.web.client.sharedmodels.InfluenceAnswer;
import de.tud.kom.socom.web.client.sharedmodels.SimpleEntry;
import de.tud.kom.socom.web.client.util.ShortNotification;
public abstract class InfluenceStrategy<T> {
private static final String INFLUENCE_REPORT_TYPE_IDENTIFIER = "influenceanswer";
private AppController appController;
protected InfluenceStrategy(AppController appController)
{
this.appController = appController;
}
public abstract void addPredefinedAnswer(InfluenceAnswer answer);
public abstract InfluenceAnswerViewInterface<T> addFreeAnswer(InfluenceAnswer answer, boolean votable);
public abstract void addFreeAnswerForm();
protected AppController getAppController()
{
return this.appController;
}
public void appendItemAdministration(long uid, boolean isAdmin) {
Map<InfluenceAnswerViewInterface<T>, InfluenceAnswer> answers = getAnswerMap();
for (final InfluenceAnswerViewInterface<T> view : answers.keySet()) {
if(!(isAdmin || answers.get(view).getOwnerId() == uid) || answers.get(view).isNewFreeAnswer()) {
continue;
}
final InfluenceAnswer answer = answers.get(view);
ItemAdministrationState state = ItemAdministrationState.delete;
if (answer.getDeletedFlag() > 0)
state = ItemAdministrationState.undelete;
view.setAdministrationState(state, generateDeleteCallback(view, answer));
int visibility = answer.getVisibility();
view.setItemAdministrationVisibility(visibility);
view.setItemAdministrationVisibilityChangeCallback(generateVisibilityChangeCallback(view, answer));
}
}
private ChangeVisibilityButtonCallback generateVisibilityChangeCallback(final InfluenceAnswerViewInterface<T> view,
final InfluenceAnswer answer) {
return new ChangeVisibilityButtonCallback() {
@Override
public void onClicked(final int newVisibility) {
if(answer.getVisibility() == newVisibility) return;
String sid = getAppController().getLoginManager().getSessionID();
appController.getRPCFactory().getAdministrationService().changeInfluenceAnswerVisibilityState
(sid, answer.isPredefined(), answer.getId(), newVisibility, new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
Window.alert("Error changing visibility. (" + caught.getMessage() + ")");
}
@Override
public void onSuccess(Boolean result) {
if(result){
view.setItemAdministrationVisibility(newVisibility);
answer.setVisibility(newVisibility);
}
else
Window.alert("Error changing visibility.");
}
});
}
};
}
private DeleteButtonCallback generateDeleteCallback(final InfluenceAnswerViewInterface<T> view,
final InfluenceAnswer answer) {
return new DeleteButtonCallback() {
@Override
public void onClicked(final ItemAdministrationState state) {
int deleted = state == ItemAdministrationState.delete ? 1 : 0; /* only hide, or undelete */
String sid = getAppController().getLoginManager().getSessionID();
appController.getRPCFactory().getAdministrationService().changeInfluenceAnswerDeletedState
(sid, answer.isPredefined(), answer.getId(), deleted, new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
if(result) {
ItemAdministrationState newState =
(state == ItemAdministrationState.delete) ?
ItemAdministrationState.undelete: ItemAdministrationState.delete;
view.setAdministrationState(newState);
view.setVotable(newState != ItemAdministrationState.undelete);
} else {
Window.alert("Error changing deletion state.");
}
}
@Override
public void onFailure(Throwable caught) {
Window.alert("Error changing deletion state. (" + caught.getMessage() + ")");
}
});
}
};
}
public void appendItemReporting(final String externalid, final long userId) {
final Map<InfluenceAnswerViewInterface<T>, InfluenceAnswer> answers = getAnswerMap();
for(final InfluenceAnswerViewInterface<T> a : answers.keySet()) {
//implement report callbacks and apply
if(!answers.get(a).isNewFreeAnswer())
a.setSendReportCallback(generateReportCallback(externalid, answers, a));
}
}
private SendReportCallback generateReportCallback(final String externalid, final Map<InfluenceAnswerViewInterface<T>,
InfluenceAnswer> answers, final InfluenceAnswerViewInterface<T> a) {
return new SendReportCallback() {
@Override
public void onSendReport(String report) {
long reference = answers.get(a).getId();
appController.getRPCFactory().getReportingService().sendReport
(reference, externalid, INFLUENCE_REPORT_TYPE_IDENTIFIER, report,
getAppController().getLoginManager().getSessionID(), new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
Window.alert("Error sending report (" + (caught == null ? "false" : caught.getLocalizedMessage()) + ")");
}
@Override
public void onSuccess(Boolean result) {
if(result){
ShortNotification.show("Report successfully submitted.", 2500, false);
}
else onFailure(null);
}
});
}
};
}
String getDataPath(String filePath) {
//XXX use resource manager..?
return "data/influence_data/" + filePath;
}
public abstract List<InfluenceAnswerViewInterface<T>> getPossibleAnswers();
public abstract List<InfluenceAnswer> collectSelectedAnswers(List<InfluenceAnswerViewInterface<T>> selected);
public abstract InfluenceAnswerViewInterface<T> findParentViewForElement(Widget sourceWidget);
public abstract void updateFreeAnswerOnChange(InfluenceFreeAnswerViewInterface<T> parent, String message);
public abstract void updateFreeAnswerOnUploadSuccess(InfluenceFreeAnswerViewInterface<T> answer, SimpleEntry<String, String>[] sourceParameter,
JSONValue result);
public abstract void clearAnsweres();
public abstract Map<InfluenceAnswerViewInterface<T>, InfluenceAnswer> getAnswerMap();
public boolean hasValidFileEnding(String filename) {
for(String s:getValidFileEndings())
{
if(filename.endsWith("."+s)) return true;
}
return false;
}
public abstract String[] getValidFileEndings();
}