package de.uni_passau.fim.infosun.prophet.plugin.plugins;
import java.util.Arrays;
import java.util.Map;
import java.util.Scanner;
import de.uni_passau.fim.infosun.prophet.experimentViewer.EViewer;
import de.uni_passau.fim.infosun.prophet.plugin.Plugin;
import de.uni_passau.fim.infosun.prophet.util.language.UIElementNames;
import de.uni_passau.fim.infosun.prophet.util.qTree.Attribute;
import de.uni_passau.fim.infosun.prophet.util.qTree.QTreeNode;
import de.uni_passau.fim.infosun.prophet.util.settings.Setting;
import de.uni_passau.fim.infosun.prophet.util.settings.SettingsList;
import de.uni_passau.fim.infosun.prophet.util.settings.components.TextAreaSetting;
/**
* <code>Plugin</code> that enables the experiment creator to specify the names of answers that are required.
* Will deny exiting any node in which required answers are missing.
*/
public class AnswerRequiredPlugin implements Plugin {
private static final String KEY = "answers_required";
private static final String KEY_NAMES = "names";
@Override
public Setting getSetting(QTreeNode node) {
Attribute mainAttribute = node.getAttribute(KEY);
SettingsList settingsList = new SettingsList(mainAttribute, getClass().getSimpleName(), true);
settingsList.setCaption(UIElementNames.getLocalized("MENU_TAB_SETTINGS_REQUIRED_ANSWERS"));
Attribute subAttribute = mainAttribute.getSubAttribute(KEY_NAMES);
Setting subSetting = new TextAreaSetting(subAttribute, null);
subSetting.setCaption(UIElementNames.getLocalized("MENU_TAB_SETTINGS_REQUIRED_ANSWER_COMPONENTS") + ":");
settingsList.addSetting(subSetting);
return settingsList;
}
@Override
public void experimentViewerRun(EViewer experimentViewer) {
}
@Override
public boolean denyEnterNode(QTreeNode node) {
return false;
}
@Override
public void enterNode(QTreeNode node) {
}
@Override
public String denyNextNode(QTreeNode currentNode) {
boolean enabled = Boolean.parseBoolean(currentNode.getAttribute(KEY).getValue());
if (enabled) {
String requiredAnswers = currentNode.getAttribute(KEY).getSubAttribute(KEY_NAMES).getValue();
Map<String, String[]> answers = currentNode.getAnswers();
Scanner sc = new Scanner(requiredAnswers);
while (sc.hasNextLine()) {
String requiredAnswerKey = sc.nextLine();
boolean missing = !answers.containsKey(requiredAnswerKey);
boolean empty = missing || Arrays.stream(answers.get(requiredAnswerKey)).allMatch(String::isEmpty);
if (missing || empty) {
return UIElementNames.getLocalized("MENU_TAB_SETTINGS_MESSAGE_FILL_ALL_FIELDS");
}
}
}
return null;
}
@Override
public void exitNode(QTreeNode node) {
}
@Override
public String finishExperiment() {
return null;
}
}