package fi.otavanopisto.muikku.plugins.workspace.fieldio;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import fi.otavanopisto.muikku.plugins.material.QueryConnectFieldController;
import fi.otavanopisto.muikku.plugins.material.model.QueryConnectField;
import fi.otavanopisto.muikku.plugins.material.model.QueryConnectFieldCounterpart;
import fi.otavanopisto.muikku.plugins.material.model.QueryConnectFieldTerm;
import fi.otavanopisto.muikku.plugins.workspace.WorkspaceMaterialFieldAnswerController;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterialConnectFieldAnswer;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterialField;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterialReply;
public class WorkspaceConnectFieldIOHandler implements WorkspaceFieldIOHandler {
@Inject
private WorkspaceMaterialFieldAnswerController workspaceMaterialFieldAnswerController;
@Inject
private QueryConnectFieldController queryConnectFieldController;
@Override
public void store(WorkspaceMaterialField field, WorkspaceMaterialReply reply, String value) throws WorkspaceFieldIOException {
Map<String, String> valueMap = null;
try {
valueMap = new ObjectMapper().readValue(value, new TypeReference<Map<String, String>>() {});
} catch (IOException e) {
throw new WorkspaceFieldIOException("Could not unmarshal field response", e);
}
QueryConnectField queryConnectField = (QueryConnectField) field.getQueryField();
if (queryConnectField != null) {
List<QueryConnectFieldTerm> terms = queryConnectFieldController.listConnectFieldTermsByField(queryConnectField);
for (QueryConnectFieldTerm term : terms) {
String parameterValue = valueMap.get(term.getName());
QueryConnectFieldCounterpart counterpart = StringUtils.isNotEmpty(parameterValue) ? queryConnectFieldController.findQueryConnectFieldCounterpartByFieldAndName(queryConnectField, parameterValue) : null;
WorkspaceMaterialConnectFieldAnswer connectFieldAnswer = workspaceMaterialFieldAnswerController.findWorkspaceMaterialConnectFieldAnswerByFieldAndReplyAndTerm(field, reply, term);
if (connectFieldAnswer != null) {
workspaceMaterialFieldAnswerController.updateWorkspaceMaterialConnectFieldAnswerCounterpart(connectFieldAnswer, counterpart);
} else {
if (counterpart != null) {
workspaceMaterialFieldAnswerController.createWorkspaceMaterialConnectFieldAnswer(field, reply, term, counterpart);
}
}
}
} else {
throw new WorkspaceFieldIOException("Workspace material connect field #" + field.getId() + " points to non-existing field ");
}
}
@Override
public String retrieve(WorkspaceMaterialField field, WorkspaceMaterialReply reply) throws WorkspaceFieldIOException {
Map<String, String> answers = new HashMap<>();
QueryConnectField queryConnectField = (QueryConnectField) field.getQueryField();
List<QueryConnectFieldTerm> terms = queryConnectFieldController.listConnectFieldTermsByField(queryConnectField);
for (QueryConnectFieldTerm term : terms) {
WorkspaceMaterialConnectFieldAnswer connectFieldAnswer = workspaceMaterialFieldAnswerController.findWorkspaceMaterialConnectFieldAnswerByFieldAndReplyAndTerm(field, reply, term);
if ((connectFieldAnswer != null) && (connectFieldAnswer.getCounterpart() != null)) {
answers.put(term.getName(), connectFieldAnswer.getCounterpart().getName());
}
}
try {
return new ObjectMapper().writeValueAsString(answers);
} catch (IOException e) {
throw new WorkspaceFieldIOException("Could not marshal field response", e);
}
}
@Override
public String getType() {
return "application/vnd.muikku.field.connect";
}
}