/* * 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 org.activiti.engine.impl.interceptor.CommandExecutor; import ru.codeinside.adm.AdminServiceProvider; import ru.codeinside.adm.database.Bid; import ru.codeinside.gses.activiti.forms.FormID; import ru.codeinside.gses.activiti.forms.Signatures; import ru.codeinside.gses.activiti.forms.SubmitFormCmd; import ru.codeinside.gses.service.PF; 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.log.SignatureLogger; import java.util.HashMap; import java.util.List; import java.util.Map; class TaskFormSubmitter implements PF<Boolean> { private static final long serialVersionUID = 1L; private final String taskId; private final List<Form> forms; private DataAccumulator accumulator; TaskFormSubmitter(String taskId, List<Form> forms, DataAccumulator accumulator) { this.taskId = taskId; this.forms = forms; this.accumulator = accumulator; } public Boolean 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 FieldSignatureSource) { FieldSignatureSource signatureSource = (FieldSignatureSource) form; if (form instanceof FormSignatureSeq.SignatureForm) { signatures.put(SignatureType.FIELDS, signatureSource.getSignatures()); } else if (form instanceof FormSpSignatureSeq.SpSignatureForm) { spSignatures = signatureSource.getSignatures(); spData = signatureSource.getSignedData(); signatures.put(SignatureType.SP, spSignatures); putEnclosures(fieldValues, signatureSource.getSignData().getEnclosures()); //TODO сохранять signedAppData в ByteArrayEntity, а в контекст писать только ID } else if (form instanceof FormOvSignatureSeq.OvSignatureForm) { ovSignatures = signatureSource.getSignatures(); ovData = signatureSource.getSignedData(); signatures.put(SignatureType.OV, ovSignatures); putEnclosures(fieldValues, signatureSource.getSignData().getEnclosures()); //TODO сохранять signedSoapBody в ByteArrayEntity, а в контекст писать только ID } } } } else { signatures = null; } CommandExecutor commandExecutor = ((ServiceImpl) engine.getFormService()).getCommandExecutor(); String processInstanceId = commandExecutor.execute( new SubmitFormCmd(FormID.byTaskId(taskId), fieldValues, signatures, accumulator)); Bid bid = AdminServiceProvider.get().getBidByProcessInstanceId(processInstanceId); SignatureLogger signatureLogger = new SignatureLogger(bid.getId(), taskId); 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 true; } 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); } } } }