package fi.otavanopisto.muikku.plugins.material; import java.io.IOException; import java.util.List; import javax.enterprise.context.Dependent; import javax.enterprise.event.Event; import javax.inject.Inject; import org.apache.commons.lang3.StringUtils; import org.codehaus.jackson.map.ObjectMapper; import fi.otavanopisto.muikku.plugins.material.dao.QueryMultiSelectFieldDAO; import fi.otavanopisto.muikku.plugins.material.dao.QueryMultiSelectFieldOptionDAO; import fi.otavanopisto.muikku.plugins.material.events.QueryFieldDeleteEvent; import fi.otavanopisto.muikku.plugins.material.events.QueryFieldUpdateEvent; import fi.otavanopisto.muikku.plugins.material.fieldmeta.MultiSelectFieldMeta; import fi.otavanopisto.muikku.plugins.material.fieldmeta.MultiSelectFieldOptionMeta; import fi.otavanopisto.muikku.plugins.material.model.Material; import fi.otavanopisto.muikku.plugins.material.model.QueryMultiSelectField; import fi.otavanopisto.muikku.plugins.material.model.QueryMultiSelectFieldOption; @Dependent public class QueryMultiSelectFieldController { @Inject private QueryMultiSelectFieldDAO queryMultiSelectFieldDAO; @Inject private QueryMultiSelectFieldOptionDAO queryMultiSelectFieldOptionDAO; @Inject private Event<QueryFieldUpdateEvent> queryFieldUpdateEvent; @Inject private Event<QueryFieldDeleteEvent> queryFieldDeleteEvent; /* QueryMultiSelectField */ public QueryMultiSelectField createQueryMultiSelectField(Material material, String name) { return queryMultiSelectFieldDAO.create(material, name); } public QueryMultiSelectField findQueryMultiSelectFieldbyId(Long id) { return queryMultiSelectFieldDAO.findById(id); } public QueryMultiSelectField findQueryMultiSelectFieldByMaterialAndName(Material material, String name) { return queryMultiSelectFieldDAO.findByMaterialAndName(material, name); } public QueryMultiSelectField updateQueryMultiSelectField(Material material, MaterialField field, boolean removeAnswers) throws MaterialFieldMetaParsingExeption { // Field JSON to metadata object ObjectMapper objectMapper = new ObjectMapper(); MultiSelectFieldMeta multiSelectFieldMeta; try { multiSelectFieldMeta = objectMapper.readValue(field.getContent(), MultiSelectFieldMeta.class); } catch (IOException e) { throw new MaterialFieldMetaParsingExeption("Could not parse select field meta", e); } QueryMultiSelectField queryField = queryMultiSelectFieldDAO.findByMaterialAndName(material, multiSelectFieldMeta.getName()); // -> fi.otavanopisto.muikku.plugins.workspace.QueryFieldChangeListener queryFieldUpdateEvent.fire(new QueryFieldUpdateEvent(queryField, field, removeAnswers)); List<QueryMultiSelectFieldOption> oldOptions = queryMultiSelectFieldOptionDAO.listByField(queryField); List<MultiSelectFieldOptionMeta> newOptions = multiSelectFieldMeta.getOptions(); for (MultiSelectFieldOptionMeta newOption : newOptions) { QueryMultiSelectFieldOption correspondingOption = findOptionByName(oldOptions, newOption.getName()); if (correspondingOption == null) { // New options createQueryMultiSelectFieldOption(queryField, newOption.getName(), newOption.getText()); } else { // Modified options if (!StringUtils.equals(correspondingOption.getText(), newOption.getText())) { updateQueryMultiSelectFieldOptionText(correspondingOption, newOption.getText()); } oldOptions.remove(correspondingOption); } } // Removed options for (QueryMultiSelectFieldOption removedOption : oldOptions) { deleteQueryMultiSelectFieldOption(removedOption); } return queryField; } private QueryMultiSelectFieldOption findOptionByName(List<QueryMultiSelectFieldOption> options, String name) { for (QueryMultiSelectFieldOption option : options) { if (StringUtils.equals(option.getName(), name)) { return option; } } return null; } public void deleteQueryMultiSelectField(QueryMultiSelectField queryField, boolean removeAnswers) { queryFieldDeleteEvent.fire(new QueryFieldDeleteEvent(queryField, removeAnswers)); for (QueryMultiSelectFieldOption option : listQueryMultiSelectFieldOptionsByField(queryField)) { deleteQueryMultiSelectFieldOption(option); } queryMultiSelectFieldDAO.delete(queryField); } /* QueryMultiSelectFieldOption */ public QueryMultiSelectFieldOption createQueryMultiSelectFieldOption(QueryMultiSelectField querySelectField, String name, String text) { return queryMultiSelectFieldOptionDAO.create(name, text, querySelectField); } public QueryMultiSelectFieldOption findQueryMultiSelectFieldOptionByFieldAndName(QueryMultiSelectField field, String name) { return queryMultiSelectFieldOptionDAO.findByFieldAndName(field, name); } public List<QueryMultiSelectFieldOption> listQueryMultiSelectFieldOptionsByField(QueryMultiSelectField field) { return queryMultiSelectFieldOptionDAO.listByField(field); } public QueryMultiSelectFieldOption updateQueryMultiSelectFieldOptionText(QueryMultiSelectFieldOption queryMultiSelectFieldOption, String text) { return queryMultiSelectFieldOptionDAO.updateText(queryMultiSelectFieldOption, text); } public void deleteQueryMultiSelectFieldOption(QueryMultiSelectFieldOption queryMultiSelectFieldOption) { queryMultiSelectFieldOptionDAO.delete(queryMultiSelectFieldOption); } }