/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gses.webui.form;
import com.vaadin.ui.Form;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.impl.ServiceImpl;
import ru.codeinside.gses.activiti.SubmitStartFormCommand;
import ru.codeinside.gses.activiti.forms.Signatures;
import ru.codeinside.gses.activiti.forms.api.definitions.PropertyNode;
import ru.codeinside.gses.service.BidID;
import ru.codeinside.gses.service.PF;
import ru.codeinside.gses.webui.Flash;
import ru.codeinside.gses.webui.form.api.FieldSignatureSource;
import ru.codeinside.gses.webui.form.api.FieldValuesSource;
import ru.codeinside.gws.api.Enclosure;
import ru.codeinside.gws.api.ExchangeContext;
import ru.codeinside.log.SignatureLogger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
final public class StartTaskFormSubmitter implements PF<BidID> {
private static final long serialVersionUID = 1L;
private final String processDefinitionId;
private final List<Form> forms;
private DataAccumulator accumulator;
StartTaskFormSubmitter(String processDefinitionId, List<Form> forms, DataAccumulator accumulator) {
this.processDefinitionId = processDefinitionId;
this.forms = forms;
this.accumulator = accumulator;
}
public BidID apply(ProcessEngine engine) {
FieldValuesSource valuesSource = (FieldValuesSource) forms.get(0);
Map<String, Object> fieldValues = valuesSource.getFieldValues();
Map<SignatureType, Signatures> signatures = new HashMap<SignatureType, Signatures>();
Signatures spSignatures = null;
Signatures ovSignatures = null;
String spData = null;
String ovData = null;
if (forms.size() > 1) {
for (Form form : forms) {
if (form instanceof FormSignatureSeq.SignatureForm) {
FieldSignatureSource signatureSource = (FieldSignatureSource) form;
signatures.put(SignatureType.FIELDS, signatureSource.getSignatures());
} else if (form instanceof FormSpSignatureSeq.SpSignatureForm) {
FormSpSignatureSeq.SpSignatureForm spForm = (FormSpSignatureSeq.SpSignatureForm) form;
spSignatures = spForm.getSignatures();
spData = spForm.getSignedData();
signatures.put(SignatureType.SP, spSignatures);
putEnclosures(fieldValues, spForm.getSignData().getEnclosures());
} else if (form instanceof FormOvSignatureSeq.OvSignatureForm) {
FormOvSignatureSeq.OvSignatureForm ovForm = (FormOvSignatureSeq.OvSignatureForm) form;
ovSignatures = ovForm.getSignatures();
ovData = ovForm.getSignedData();
putEnclosures(fieldValues, ovForm.getSignData().getEnclosures());
signatures.put(SignatureType.OV, ovSignatures);
}
}
} else {
signatures = null;
}
updateFieldValuesFromTempContext(fieldValues);
BidID bidID = ((ServiceImpl) engine.getFormService()).getCommandExecutor().execute(
new SubmitStartFormCommand(null, null, processDefinitionId, fieldValues, signatures, Flash.login(), null,
accumulator));
SignatureLogger signatureLogger = new SignatureLogger(bidID.bidId, null);
if (spSignatures != null && spData != null) {
signatureLogger.log(spData, spSignatures, SignatureType.SP, accumulator.getVirginAppData());
}
if (ovSignatures != null && ovData != null) {
signatureLogger.log(ovData, ovSignatures, SignatureType.OV, accumulator.getVirginSoapMessage());
}
return bidID;
}
private void updateFieldValuesFromTempContext(Map<String, Object> fieldValues) {
ExchangeContext tempContext = accumulator.getTempContext();
if (tempContext != null) {
for (String varName : tempContext.getVariableNames()) {
Object oldValue = fieldValues.get(varName);
Object newValue = tempContext.getVariable(varName);
Map<String, PropertyNode> nodeMap = accumulator.getPropertyTree().getIndex();
if (nodeMap.containsKey(varName) && !nodeMap.get(varName).isFieldWritable()) continue;
if (newValue != null && !newValue.equals(oldValue)) {
fieldValues.put(varName, newValue);
}
}
}
}
private void putEnclosures(Map<String, Object> fieldValues, List<Enclosure> enclosures) {
for(Enclosure e : enclosures) {
String key = e.code != null && !e.code.isEmpty() ? e.code : e.fileName;
if (!fieldValues.containsKey(key)) {
fieldValues.put(key, e);
}
}
}
}