/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.explorer.ui.content.file; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import org.activiti.engine.ProcessEngines; import org.activiti.engine.TaskService; import org.activiti.engine.task.Attachment; import org.activiti.explorer.ExplorerApp; import org.activiti.explorer.I18nManager; import org.activiti.explorer.Messages; import org.activiti.explorer.ui.Images; import org.activiti.explorer.ui.content.AttachmentEditorComponent; import org.activiti.explorer.ui.custom.UploadComponent; import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.ui.Form; import com.vaadin.ui.Label; import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; import com.vaadin.ui.Upload.FinishedEvent; import com.vaadin.ui.Upload.FinishedListener; import com.vaadin.ui.Upload.Receiver; import com.vaadin.ui.VerticalLayout; /** * @author Frederik Heremans */ public class FileAttachmentEditorComponent extends VerticalLayout implements AttachmentEditorComponent { private static final long serialVersionUID = 1L; public static final String MIME_TYPE_EXTENTION_SPLIT_CHAR = ";"; protected Attachment attachment; protected String taskId; protected String processInstanceId; // File related protected String fileName; protected ByteArrayOutputStream byteArrayOutputStream; protected String mimeType; protected boolean fileUploaded = false; protected I18nManager i18nManager; protected TaskService taskService; protected Form form; protected UploadComponent uploadComponent; protected Label successIndicator; public FileAttachmentEditorComponent(String taskId, String processInstanceId) { this(null, taskId, processInstanceId); } public FileAttachmentEditorComponent(Attachment attachment, String taskId, String processInstanceId) { this.attachment = attachment; this.taskId = taskId; this.processInstanceId = processInstanceId; this.i18nManager = ExplorerApp.get().getI18nManager(); taskService = ProcessEngines.getDefaultProcessEngine().getTaskService(); form = new Form(); form.setDescription(i18nManager.getMessage(Messages.RELATED_CONTENT_TYPE_FILE_HELP)); setSizeFull(); addComponent(form); initSuccessIndicator(); initFileUpload(); initName(); initDescription(); } protected void initSuccessIndicator() { successIndicator = new Label(); successIndicator.setIcon(Images.SUCCESS); successIndicator.setVisible(false); addComponent(successIndicator); } protected void initFileUpload() { uploadComponent = new UploadComponent(null, new Receiver() { private static final long serialVersionUID = 1L; public OutputStream receiveUpload(String filename, String mType) { fileName = filename; // Try extracting the extention as well, and append it to the mime-type String extention = extractExtention(filename); if(extention != null) { mimeType = mType + MIME_TYPE_EXTENTION_SPLIT_CHAR + extention; } else { mimeType = mType; } // TODO: Refactor, don't use BAOS!! byteArrayOutputStream = new ByteArrayOutputStream(); return byteArrayOutputStream; } }); uploadComponent.addFinishedListener(new FinishedListener() { private static final long serialVersionUID = 1L; public void uploadFinished(FinishedEvent event) { // Update UI if(getAttachmentName() == null || "".equals(getAttachmentName())) { setAttachmentName(getFriendlyName(fileName)); } fileUploaded = true; successIndicator.setVisible(true); successIndicator.setCaption(i18nManager.getMessage(Messages.RELATED_CONTENT_TYPE_FILE_UPLOADED, fileName)); form.setComponentError(null); } }); addComponent(uploadComponent); setExpandRatio(uploadComponent, 1.0f); } protected String extractExtention(String fileName) { int lastIndex = fileName.lastIndexOf('.'); if(lastIndex > 0 && lastIndex < fileName.length() - 1) { return fileName.substring(lastIndex + 1); } return null; } protected String getFriendlyName(String name) { if(name != null) { String friendlyName = null; int lastDotIndex = name.lastIndexOf("."); if(lastDotIndex > 0) { friendlyName = name.substring(0, name.length() - (name.length() - lastDotIndex)); } else { friendlyName = name; } return friendlyName.replace("_", " ").replace("-", " "); } return name; } protected void initDescription() { TextArea descriptionField = new TextArea(i18nManager.getMessage(Messages.RELATED_CONTENT_DESCRIPTION)); descriptionField.setWidth(100, UNITS_PERCENTAGE); descriptionField.setHeight(50, UNITS_PIXELS); form.addField("description", descriptionField); } protected void initName() { TextField nameField = new TextField(i18nManager.getMessage(Messages.RELATED_CONTENT_NAME)); nameField.focus(); nameField.setRequired(true); nameField.setRequiredError(i18nManager.getMessage(Messages.RELATED_CONTENT_NAME_REQUIRED)); nameField.setWidth(100, UNITS_PERCENTAGE); form.addField("name", nameField); } public Attachment getAttachment() throws InvalidValueException { // Force validation of the fields form.commit(); // Check if file is uploaded if(!fileUploaded) { InvalidValueException ive = new InvalidValueException(i18nManager.getMessage(Messages.RELATED_CONTENT_TYPE_FILE_REQUIRED)); form.setComponentError(ive); throw ive; } if(attachment != null) { applyValuesToAttachment(); } else { // Create new attachment based on values // TODO: use explorerApp to get services attachment = taskService.createAttachment(mimeType, taskId, processInstanceId, getAttachmentName(), getAttachmentDescription(), new ByteArrayInputStream(byteArrayOutputStream.toByteArray())); } return attachment; } protected void setAttachmentName(String name) { form.getField("name").setValue(name); } protected String getAttachmentName() { return (String) form.getField("name").getValue(); } protected String getAttachmentDescription() { return (String) form.getField("description").getValue(); } private void applyValuesToAttachment() { attachment.setName(getAttachmentName()); attachment.setDescription(getAttachmentDescription()); } }