package fi.otavanopisto.muikku.plugins.dnm.translator; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import fi.otavanopisto.muikku.plugins.dnm.parser.content.ConnectFieldOption; import fi.otavanopisto.muikku.plugins.dnm.parser.content.OptionListOption; import fi.otavanopisto.muikku.plugins.dnm.parser.content.RightAnswer; import fi.otavanopisto.muikku.plugins.material.fieldmeta.ConnectFieldConnectionMeta; import fi.otavanopisto.muikku.plugins.material.fieldmeta.ConnectFieldMeta; import fi.otavanopisto.muikku.plugins.material.fieldmeta.ConnectFieldOptionMeta; import fi.otavanopisto.muikku.plugins.material.fieldmeta.FileFieldMeta; import fi.otavanopisto.muikku.plugins.material.fieldmeta.MemoFieldMeta; import fi.otavanopisto.muikku.plugins.material.fieldmeta.MultiSelectFieldMeta; import fi.otavanopisto.muikku.plugins.material.fieldmeta.MultiSelectFieldOptionMeta; import fi.otavanopisto.muikku.plugins.material.fieldmeta.SelectFieldMeta; import fi.otavanopisto.muikku.plugins.material.fieldmeta.SelectFieldOptionMeta; import fi.otavanopisto.muikku.plugins.material.fieldmeta.TextFieldMeta; import fi.otavanopisto.muikku.plugins.material.fieldmeta.TextFieldRightAnswer; public class FieldTranslator { private static final int ALPHABET_SIZE = 26; private static String getExcelStyleLetterIndex(int numericIndex) { String result = ""; do { int charIndex = numericIndex % ALPHABET_SIZE; numericIndex /= ALPHABET_SIZE; numericIndex -= 1; result = new String(Character.toChars(charIndex + 'A')) + result; } while (numericIndex > -1); return result; } public TextFieldMeta translateTextField(String name, Integer columns, Boolean autogrow, List<RightAnswer> rightAnswers, String help, String hint) { List<TextFieldRightAnswer> translatedAnswers = new ArrayList<>(); for (fi.otavanopisto.muikku.plugins.dnm.parser.content.RightAnswer rightAnswer : rightAnswers) { Boolean correct = rightAnswer.getPoints() != null && rightAnswer.getPoints() > 0; translatedAnswers.add(new TextFieldRightAnswer(rightAnswer.getText(), true, false, correct)); } return new TextFieldMeta(name, columns, autogrow, translatedAnswers, hint); } public MemoFieldMeta translateMemoField(String name, Integer columns, Integer rows, String help, String hint) { return new MemoFieldMeta(name, columns, rows, help, hint, "" /* no example */, false); } private String generateUniqueName(List<SelectFieldOptionMeta> options) { int i = 0; String name = String.valueOf(i); for (int j = 0; j < options.size(); j++) { if (name.equals(options.get(j).getName())) { name = String.valueOf(++i); j = -1; } } return name; } public SelectFieldMeta translateOptionList(String name, String listType, List<OptionListOption> options) { List<SelectFieldOptionMeta> translatedOptions = new ArrayList<>(); for (OptionListOption option : options) { translatedOptions.add(new SelectFieldOptionMeta(option.getName(), option.getPoints() != null && option.getPoints() > 0, option.getText())); } // Fix for bug #499; generate unique values for empty option names for (SelectFieldOptionMeta translatedOption : translatedOptions) { if (StringUtils.isEmpty(translatedOption.getName())) { translatedOption.setName(generateUniqueName(translatedOptions)); } } // Nexus: dropdown | list | radio | radio_horz // Muikku: dropdown | list | radio-vertical | radio-horizontal String newListType = listType; if ("radio".equals(listType)) { newListType = "radio-vertical"; } else if ("radio_horz".equals(listType)) { newListType = "radio-horizontal"; } return new SelectFieldMeta(name, newListType, translatedOptions); } public MultiSelectFieldMeta translateChecklistField(String paramName, List<MultiSelectFieldOptionMeta> options) { List<MultiSelectFieldOptionMeta> translatedOptions = new ArrayList<>(); for (MultiSelectFieldOptionMeta option : options) { translatedOptions.add(new MultiSelectFieldOptionMeta(option.getName(), option.getText(), option.getCorrect())); } return new MultiSelectFieldMeta(paramName, "checkbox-vertical", translatedOptions); } public ConnectFieldMeta translateConnectField(String name, List<ConnectFieldOption> options) { List<ConnectFieldOptionMeta> connectFieldOptionMetas = new ArrayList<ConnectFieldOptionMeta>(); List<ConnectFieldOptionMeta> counterparts = new ArrayList<ConnectFieldOptionMeta>();; List<ConnectFieldConnectionMeta> connectFieldConnectionMetas = new ArrayList<>(); for (int i = 0; i < options.size(); i++) { ConnectFieldOption option = options.get(i); String fieldName = String.valueOf(i+1); String counterpartName = getExcelStyleLetterIndex(i); if (StringUtils.length(option.getTerm()) > 255) { option.setTerm(option.getTerm().substring(0, 254)); } if (StringUtils.length(option.getEquivalent()) > 255) { option.setEquivalent(option.getEquivalent().substring(0, 254)); } connectFieldOptionMetas.add(new ConnectFieldOptionMeta(fieldName, option.getTerm())); counterparts.add(new ConnectFieldOptionMeta(counterpartName, option.getEquivalent())); connectFieldConnectionMetas.add(new ConnectFieldConnectionMeta(fieldName, option.getAnswer())); } return new ConnectFieldMeta(name, connectFieldOptionMetas, counterparts, connectFieldConnectionMetas); } public FileFieldMeta translateFileField(String name, String help, String hint) { return new FileFieldMeta(name, help, hint); } }