/* * 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.beans; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.impl.cmd.CreateAttachmentCmd; import org.activiti.engine.impl.context.Context; import org.activiti.engine.impl.interceptor.CommandContext; import org.activiti.engine.task.Attachment; import org.apache.commons.lang.StringUtils; import org.apache.tika.mime.MimeTypes; import ru.codeinside.gses.activiti.Activiti; import ru.codeinside.gses.activiti.ftarchive.AttachmentFFT; import ru.codeinside.gses.activiti.history.ExecutionId; import ru.codeinside.gses.activiti.history.HistoricDbSqlSession; import ru.codeinside.gws.api.Enclosure; import ru.codeinside.gws.api.ExchangeContext; import ru.codeinside.gws.api.Signature; import java.io.ByteArrayInputStream; import java.security.cert.CertificateEncodingException; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; //TODO переместить в другой пакет public class ActivitiExchangeContext implements ExchangeContext { final protected Logger logger = Logger.getLogger(getClass().getName()); private final MimeTypes mimeTypes = new MimeTypes(); private final DelegateExecution execution; private Object local; public ActivitiExchangeContext(DelegateExecution execution) { this.execution = execution; } @Override public void setVariable(String name, Object value) { logger.fine("Set " + name + " = '" + value + "'"); execution.setVariable(name, value); } @Override public Set<String> getVariableNames() { return execution.getVariableNames(); } @Override public Object getVariable(String name) { final Object value = execution.getVariable(name); logger.fine("Get " + name + " = '" + value + "'"); return value; } @Override public Object getLocal() { return local; } @Override public void setLocal(Object value) { local = value; } @Override public boolean isEnclosure(String name) { final Object value = execution.getVariable(name); return AttachmentFFT.isAttachmentValue(value); } @Override public Enclosure getEnclosure(String name) { final Object value = execution.getVariable(name); String attId = AttachmentFFT.getAttachmentIdByValue(value); if (StringUtils.isEmpty(attId)) { return null; } return Activiti.createEnclosureInCommandContext(attId, execution.getId(), name); } //TODO переделать Cmd на сервисы @Override public void addEnclosure(String name, Enclosure enclosure) { ByteArrayInputStream content = new ByteArrayInputStream(enclosure.content); String mimeType = StringUtils.isNotEmpty(enclosure.mimeType) ? enclosure.mimeType : mimeTypes.getMimeType(enclosure.content).getName(); Attachment attachment = new CreateAttachmentCmd(mimeType, execution.getId(), execution.getProcessInstanceId(), enclosure.fileName, name, content, null).execute(Context.getCommandContext()); setVariable(name, AttachmentFFT.stringValue(attachment)); final Signature signature = enclosure.signature; if (signature != null && signature.certificate != null && signature.sign != null && signature.valid) { try { final byte[] certificate = signature.certificate.getEncoded(); final byte[] sign = signature.sign; final CommandContext ctx = Context.getCommandContext(); final HistoricDbSqlSession session = (HistoricDbSqlSession) ctx.getDbSqlSession(); // TODO: является ли execution.getId()==taskId ? final ExecutionId executionId = new ExecutionId(execution.getProcessInstanceId(), execution.getId(), execution.getId()); session.addSignature(executionId, name, certificate, sign, true); } catch (CertificateEncodingException e) { logger.log(Level.WARNING, "encode certificate fail", e); } } } }