package ru.codeinside.gses.webui.form; import com.vaadin.ui.Form; import ru.codeinside.gses.activiti.FileValue; import ru.codeinside.gses.activiti.ReadOnly; import ru.codeinside.gses.activiti.SignatureProtocol; import ru.codeinside.gses.activiti.VariableToBytes; import ru.codeinside.gses.activiti.forms.FormID; import ru.codeinside.gws.api.Enclosure; import java.nio.charset.Charset; import java.util.Collections; import java.util.LinkedList; import java.util.List; public class FormUtils { private FormUtils() { throw new UnsupportedOperationException("Static methods only"); } static void addSignedDataToForm(Form form, SignData signData, String propertyId) { byte[] signedData = signData.getData() != null ? signData.getData() : new byte[0]; final ReadOnly txt = new ReadOnly(new String(signedData, Charset.forName("UTF-8"))); txt.setCaption("Подписываемые данные"); txt.addStyleName("light"); txt.setVisible(false); form.addField(propertyId, txt); for (Enclosure e : getEnclosuresWithoutSign(signData.getEnclosures())) { String fieldId = e.code != null && !e.code.isEmpty() ? e.code : e.fileName; ReadOnly field = new ReadOnly(fieldId); field.setVisible(false); form.addField(fieldId, field); } } static void addSignatureFieldToForm( Form form, FormID formId, SignData signData, List<FormField> previousFields, String fieldId, DataAccumulator dataAccumulator) { List<Enclosure> enclosures = getEnclosuresWithoutSign(signData.getEnclosures()); List<FormField> attachmentsFromForm = getAttachmentsFromForm(previousFields); int enclosureSize = enclosures.size(); int formAttachmentsSize = attachmentsFromForm.size(); boolean[] files = new boolean[enclosureSize + formAttachmentsSize + 1]; files[0] = false; String[] ids = new String[enclosureSize + formAttachmentsSize + 1]; ids[0] = fieldId; byte[][] blocks = new byte[enclosureSize +formAttachmentsSize + 1][]; blocks[0] = signData.getData() != null ? signData.getData() : new byte[0]; for (int i = 0; i < enclosureSize; ++i) { Enclosure e = enclosures.get(i); files[i + 1] = true; ids[i + 1] = e.code != null && !e.code.isEmpty() ? e.code : e.fileName; blocks[i + 1] = e.content; } for (int i = 0; i < formAttachmentsSize; ++i) { FormField field = attachmentsFromForm.get(i); files[i + enclosureSize + 1] = true; ids[i + enclosureSize + 1] = field.getPropId(); blocks[i + enclosureSize + 1] = VariableToBytes.toBytes(field.getValue()); } FormSignatureField signatureField = new FormSignatureField(new SignatureProtocol(formId, FormSignatureSeq.SIGNATURE, FormSignatureSeq.SIGNATURE, blocks, files, ids, form, dataAccumulator)); signatureField.setCaption(FormSignatureSeq.SIGNATURE); signatureField.setRequired(true); form.addField(FormSignatureSeq.SIGNATURE, signatureField); } private static List<FormField> getAttachmentsFromForm(List<FormField> previousFields) { if (previousFields != null) { List<FormField> result = new LinkedList<FormField>(); for (FormField field : previousFields) { if (field.getValue() instanceof FileValue) { result.add(field); } } return result; } return Collections.emptyList(); } private static List<Enclosure> getEnclosuresWithoutSign(List<Enclosure> enclosures) { List<Enclosure> withoutSign = new LinkedList<Enclosure>(); for (Enclosure e : enclosures) { if (e.signature == null) { withoutSign.add(e); } } return withoutSign; } }