/* * 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.activiti.ftarchive; import com.google.common.collect.Maps; import com.vaadin.ui.Field; import org.activiti.engine.impl.context.Context; import org.activiti.engine.impl.db.DbSqlSession; import org.activiti.engine.impl.interceptor.CommandContext; import ru.codeinside.adm.AdminServiceProvider; import ru.codeinside.gses.activiti.ReadOnly; import ru.codeinside.gses.activiti.forms.FormID; import ru.codeinside.gses.activiti.forms.Signatures; import ru.codeinside.gses.activiti.history.HistoricDbSqlSession; import ru.codeinside.gses.webui.Flash; import ru.codeinside.gses.webui.form.SignatureType; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; public class FormSignatureFFT { final private static Logger logger = Logger.getLogger(FormSignatureFFT.class.getName()); final private static ThreadLocal<Map<Integer, Signatures>> THREAD_LOCAL_MAP = new ThreadLocal<Map<Integer, Signatures>>(); //@Override public Field createField(String taskId, String fieldId, String name, String value, boolean writable, boolean required) { if (!writable) { return new ReadOnly("ЭЦП"); } return new ReadOnly("Редактирование ЭЦП не поддерживается!", false); } /** * Вызывается как во время преобразования из базы, так и из UI. */ //@Override public String convertModelValueToFormValue(Object modelValue) { final CommandContext ctx = Context.getCommandContext(); if (ctx != null) { // контекст преобразования из базы THREAD_LOCAL_MAP.remove(); } else { // контекст преобразования из UI if (modelValue instanceof Signatures) { final Signatures signatures = (Signatures) modelValue; Map<Integer, Signatures> map = getOrCreateForwardMap(); int id = 1 + map.size(); map.put(id, signatures); final FormID formID = signatures.formID; if (formID.taskId != null) { AdminServiceProvider.get().createLog(Flash.getActor(), "userTask", formID.taskId, "sign form", null, true); } else { AdminServiceProvider.get().createLog(Flash.getActor(), "startEvent", formID.processDefinitionId, "sign form", null, true); } return "" + id; } } // иначе никак не представляем в формате формы return null; } /** * Вызывается во время преобразования из формата формы в формат базы. * В контексте команды Activiti. */ //@Override public Object convertFormValueToModelValue(final String propertyValue) { if (propertyValue != null) { try { int id = Integer.parseInt(propertyValue); final Signatures signatures = extractFromForwardMap(id); if (signatures != null) { final HistoricDbSqlSession session = (HistoricDbSqlSession) Context.getCommandContext().getSession(DbSqlSession.class); session.addSignatures(SignatureType.FIELDS, signatures); } else { logger.log(Level.SEVERE, "invalid forwardingId " + id); } } catch (Exception e) { logger.log(Level.SEVERE, "convert fail", e); throw new RuntimeException(e); } } return null; } // Временное решение для передачи подписи с формы в базу. // Желательно переработать Signatures в реальные сущности! private Map<Integer, Signatures> getOrCreateForwardMap() { Map<Integer, Signatures> map = THREAD_LOCAL_MAP.get(); if (map == null) { map = Maps.newLinkedHashMap(); THREAD_LOCAL_MAP.set(map); } return map; } private Signatures extractFromForwardMap(int id) { Signatures signatures = null; Map<Integer, Signatures> map = THREAD_LOCAL_MAP.get(); if (map != null) { signatures = map.remove(id); if (map.isEmpty()) { THREAD_LOCAL_MAP.remove(); } } return signatures; } }