package fi.otavanopisto.muikku.plugins.workspace; import java.util.List; import java.util.logging.Logger; import javax.enterprise.context.Dependent; import javax.enterprise.event.Event; import javax.enterprise.inject.Any; import javax.enterprise.inject.Instance; import javax.inject.Inject; import fi.otavanopisto.muikku.plugins.material.MaterialField; import fi.otavanopisto.muikku.plugins.material.model.QueryField; import fi.otavanopisto.muikku.plugins.workspace.dao.WorkspaceMaterialFieldDAO; import fi.otavanopisto.muikku.plugins.workspace.events.WorkspaceMaterialFieldCreateEvent; import fi.otavanopisto.muikku.plugins.workspace.events.WorkspaceMaterialFieldDeleteEvent; import fi.otavanopisto.muikku.plugins.workspace.events.WorkspaceMaterialFieldUpdateEvent; import fi.otavanopisto.muikku.plugins.workspace.fieldio.WorkspaceFieldIOException; import fi.otavanopisto.muikku.plugins.workspace.fieldio.WorkspaceFieldIOHandler; import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterial; import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterialField; import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterialReply; @Dependent public class WorkspaceMaterialFieldController { @Inject private Logger logger; @Inject private WorkspaceMaterialFieldDAO workspaceMaterialFieldDAO; @Inject private Event<WorkspaceMaterialFieldCreateEvent> workspaceMaterialFieldCreateEvent; @Inject @Any private Instance<WorkspaceFieldIOHandler> fieldIOHandlers; @Inject private Event<WorkspaceMaterialFieldUpdateEvent> workspaceMaterialFieldUpdateEvent; @Inject private Event<WorkspaceMaterialFieldDeleteEvent> workspaceMaterialFieldDeleteEvent; public WorkspaceMaterialField createWorkspaceMaterialField(WorkspaceMaterial workspaceMaterial, QueryField queryField, String embedId) { WorkspaceMaterialField workspaceMaterialField = workspaceMaterialFieldDAO.create(queryField, workspaceMaterial, embedId); workspaceMaterialFieldCreateEvent.fire(new WorkspaceMaterialFieldCreateEvent(workspaceMaterialField)); return workspaceMaterialField; } public WorkspaceMaterialField findWorkspaceMaterialFieldByWorkspaceMaterialAndQueryFieldAndEmbedId(WorkspaceMaterial workspaceMaterial, QueryField queryField, String embedId) { return workspaceMaterialFieldDAO.findByWorkspaceMaterialAndQueryFieldAndEmbedId(workspaceMaterial, queryField, embedId); } public List<WorkspaceMaterialField> listWorkspaceMaterialFieldsByWorkspaceMaterial(WorkspaceMaterial workspaceMaterial){ return workspaceMaterialFieldDAO.listByWorkspaceMaterial(workspaceMaterial); } public List<WorkspaceMaterialField> listWorkspaceMaterialFieldsByQueryField(QueryField queryField) { return workspaceMaterialFieldDAO.listByQueryField(queryField); } public void updateWorkspaceMaterialField(WorkspaceMaterialField workspaceMaterialField, MaterialField materialField, boolean removeAnswers) { // In theory, fields' workspace instances remain the same even when updated (apart // from answers that might get removed based on WorkspaceMaterialFieldUpdateEvent) // // -> fi.otavanopisto.muikku.plugins.workspace.WorkspaceMaterialFieldChangeListener workspaceMaterialFieldUpdateEvent.fire(new WorkspaceMaterialFieldUpdateEvent(workspaceMaterialField, materialField, removeAnswers)); } public void deleteWorkspaceMaterialField(WorkspaceMaterialField workspaceMaterialField, boolean removeAnswers) { workspaceMaterialFieldDeleteEvent.fire(new WorkspaceMaterialFieldDeleteEvent(workspaceMaterialField, removeAnswers)); workspaceMaterialFieldDAO.delete(workspaceMaterialField); } public String retrieveFieldValue(WorkspaceMaterialField field, WorkspaceMaterialReply reply) throws WorkspaceFieldIOException { WorkspaceFieldIOHandler handler = getIOHandler(field.getQueryField().getType()); if (handler != null) { return handler.retrieve(field, reply); } else { logger.severe(String.format("Could not find io handler for queryfield type: %s", field.getQueryField().getType())); } return null; } public void storeFieldValue(WorkspaceMaterialField field, WorkspaceMaterialReply reply, String value) throws WorkspaceFieldIOException { WorkspaceFieldIOHandler handler = getIOHandler(field.getQueryField().getType()); if (handler != null) { handler.store(field, reply, value); } else { logger.severe(String.format("Could not find io handler for queryfield type: %s", field.getQueryField().getType())); } } private WorkspaceFieldIOHandler getIOHandler(String type) { for (WorkspaceFieldIOHandler handler : fieldIOHandlers) { if (handler.getType().equals(type)) { return handler; } } return null; } }