package fi.otavanopisto.muikku.plugins.material; import java.util.List; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Event; import javax.enterprise.event.Observes; import javax.inject.Inject; import fi.otavanopisto.muikku.plugins.material.events.HtmlMaterialCreateEvent; import fi.otavanopisto.muikku.plugins.material.events.HtmlMaterialDeleteEvent; import fi.otavanopisto.muikku.plugins.material.events.HtmlMaterialFieldCreateEvent; import fi.otavanopisto.muikku.plugins.material.events.HtmlMaterialFieldDeleteEvent; import fi.otavanopisto.muikku.plugins.material.events.HtmlMaterialFieldUpdateEvent; import fi.otavanopisto.muikku.plugins.material.events.HtmlMaterialUpdateEvent; import fi.otavanopisto.muikku.plugins.material.model.HtmlMaterial; import fi.otavanopisto.muikku.plugins.material.model.QueryField; @ApplicationScoped public class HtmlMaterialChangeListener { @Inject private Event<HtmlMaterialFieldCreateEvent> htmlMaterialFieldCreateEvent; @Inject private Event<HtmlMaterialFieldUpdateEvent> htmlMaterialFieldUpdateEvent; @Inject private Event<HtmlMaterialFieldDeleteEvent> htmlMaterialFieldDeleteEvent; @Inject private QuerySelectFieldController querySelectFieldController; @Inject private QueryMultiSelectFieldController queryMultiSelectFieldController; public void onHtmlMaterialCreated(@Observes HtmlMaterialCreateEvent event) { MaterialFieldCollection fieldCollection = new MaterialFieldCollection(event.getMaterial().getHtml()); for (MaterialField newField : fieldCollection.getFields()) { HtmlMaterialFieldCreateEvent createEvent = new HtmlMaterialFieldCreateEvent(event.getMaterial(), newField); htmlMaterialFieldCreateEvent.fire(createEvent); } } // HtmlMaterialUpdate // HtmlMaterialFieldXXXEvent -> HtmlMaterialFieldChangeListener // QueryFieldXXXEvent -> QueryFieldChangeListener // WorkspaceMaterialFieldXXXEvent -> WorkspaceMaterialFieldChangeListener public void onHtmlMaterialUpdate(@Observes HtmlMaterialUpdateEvent event) { MaterialFieldCollection oldFieldCollection = new MaterialFieldCollection(event.getOldHtml()); MaterialFieldCollection newFieldCollection = new MaterialFieldCollection(event.getNewHtml()); // TODO Logic for determining whether answers may be removed for deleted and (heavily) modified fields List<MaterialField> removedFields = newFieldCollection.getRemovedFields(oldFieldCollection); for (MaterialField removedField : removedFields) { HtmlMaterialFieldDeleteEvent deleteEvent = new HtmlMaterialFieldDeleteEvent(event.getMaterial(), removedField, event.getRemoveAnswers()); htmlMaterialFieldDeleteEvent.fire(deleteEvent); } List<MaterialField> updatedFields = newFieldCollection.getUpdatedFields(oldFieldCollection); for (MaterialField updatedField : updatedFields) { // awkward fix for #293; remove when implementing #305 if (isSelectFieldChangingType(event.getMaterial(), updatedField)) { HtmlMaterialFieldDeleteEvent deleteEvent = new HtmlMaterialFieldDeleteEvent(event.getMaterial(), updatedField, event.getRemoveAnswers()); htmlMaterialFieldDeleteEvent.fire(deleteEvent); HtmlMaterialFieldCreateEvent createEvent = new HtmlMaterialFieldCreateEvent(event.getMaterial(), updatedField); htmlMaterialFieldCreateEvent.fire(createEvent); } else { HtmlMaterialFieldUpdateEvent updatedEvent = new HtmlMaterialFieldUpdateEvent(event.getMaterial(), updatedField, event.getRemoveAnswers()); htmlMaterialFieldUpdateEvent.fire(updatedEvent); } } List<MaterialField> newFields = newFieldCollection.getNewFields(oldFieldCollection); for (MaterialField newField : newFields) { HtmlMaterialFieldCreateEvent createEvent = new HtmlMaterialFieldCreateEvent(event.getMaterial(), newField); htmlMaterialFieldCreateEvent.fire(createEvent); } } public void onHtmlMaterialDelete(@Observes HtmlMaterialDeleteEvent event) { // TODO removeAnswers flag MaterialFieldCollection fieldCollection = new MaterialFieldCollection(event.getMaterial().getHtml()); for (MaterialField deletedField : fieldCollection.getFields()) { HtmlMaterialFieldDeleteEvent deletedEvent = new HtmlMaterialFieldDeleteEvent(event.getMaterial(), deletedField, event.getRemoveAnswers()); htmlMaterialFieldDeleteEvent.fire(deletedEvent); } } private boolean isSelectFieldChangingType(HtmlMaterial material, MaterialField field) { String type = field.getType(); if ("application/vnd.muikku.field.select".equals(type)) { QueryField oldField = queryMultiSelectFieldController.findQueryMultiSelectFieldByMaterialAndName(material, field.getName()); return oldField != null; } else if ("application/vnd.muikku.field.multiselect".equals(type)) { QueryField oldField = querySelectFieldController.findQuerySelectFieldByMaterialAndName(material, field.getName()); return oldField != null; } return false; } }