package com.idega.content.upload.business; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.logging.Logger; import com.idega.builder.bean.AdvancedProperty; import com.idega.content.upload.bean.UploadFile; import com.idega.idegaweb.IWApplicationContext; import com.idega.idegaweb.IWMainApplication; import com.idega.util.ListUtil; import com.idega.util.StringUtil; public class FileUploadProgressListenerBean implements FileUploadProgressListener { private static final Logger LOGGER = Logger.getLogger(FileUploadProgressListenerBean.class.getName()); private long bytesTransferred, fileSize = 0, maxSize = -1; private String uploadId; private int uploadedItemNr, fileItemNumberInUploadSequence; private Map<String, Boolean> uploadInfo = new HashMap<String, Boolean>(); private Map<String, List<UploadFile>> uploadedFiles = new HashMap<String, List<UploadFile>>(); private List<String> failedUploads = new ArrayList<String>(); @Override public void update(long bytesRead, long contentLength, int itemNr) { bytesTransferred = bytesRead; fileSize = contentLength; this.uploadedItemNr = itemNr; } @Override public void markFailedUpload(String id) { if (!StringUtil.isEmpty(id)) failedUploads.add(id); } @Override public String getFileUploadStatus(String id) { if (!StringUtil.isEmpty(id) && failedUploads.contains(id)) { failedUploads.remove(id); LOGGER.warning("Upload by ID " + id + " has failed"); return String.valueOf(-1); } if (fileSize <= 0) { LOGGER.warning("Invalid file size: " + fileSize); return null; } double progress = Long.valueOf(bytesTransferred).doubleValue() / Long.valueOf(fileSize).doubleValue(); String hundredPercent = String.valueOf(100); if (bytesTransferred >= fileSize) { if (fileItemNumberInUploadSequence >= 0 && uploadedItemNr >= fileItemNumberInUploadSequence) return hundredPercent; return hundredPercent; } if (progress >= 0.99) return hundredPercent; NumberFormat nf = NumberFormat.getPercentInstance(Locale.ENGLISH); String status = nf.format(progress); return status.substring(0, status.length() - 1); } @Override public boolean resetFileUploaderCounters(String id, long maxSize) { bytesTransferred = 0; fileSize = 0; this.uploadId = id; this.maxSize = maxSize; uploadedItemNr = -1; fileItemNumberInUploadSequence = -1; return true; } @Override public boolean isUploadInProgress(String id) { if (StringUtil.isEmpty(id)) return false; IWApplicationContext iwac = IWMainApplication.getDefaultIWApplicationContext(); if (iwac == null) return false; Object o = iwac.getApplicationAttribute(id); if (o instanceof Boolean) return (Boolean) o; return false; } @Override public Boolean isUploadSuccessful(String id) { if (StringUtil.isEmpty(id)) return Boolean.FALSE; return uploadInfo.remove(id); } @Override public void setUploadSuccessful(String id, boolean success) { if (StringUtil.isEmpty(id)) return; uploadInfo.put(id, success); } @Override public long getMaxSize() { return maxSize; } @Override public String getUploadId() { return uploadId; } @Override public void addUploadedFiles(String uploadId, Collection<UploadFile> files) { if (StringUtil.isEmpty(uploadId) || ListUtil.isEmpty(files)) return; List<UploadFile> uploadFiles = uploadedFiles.get(uploadId); if (uploadFiles == null) { uploadFiles = new ArrayList<UploadFile>(); uploadedFiles.put(uploadId, uploadFiles); } for (UploadFile file: files) { if (!uploadFiles.contains(file)) uploadFiles.add(file); } } @Override public Collection<AdvancedProperty> getUploadedFiles(String uploadId) { if (StringUtil.isEmpty(uploadId)) return null; List<UploadFile> files = uploadedFiles.remove(uploadId); if (ListUtil.isEmpty(files)) return null; Collection<AdvancedProperty> uploadedFiles = new ArrayList<AdvancedProperty>(files.size()); for (UploadFile file: files) { uploadedFiles.add(new AdvancedProperty(file.getPath(), file.getName())); } return uploadedFiles; } @Override public void setFileNumberInUploadSequence(int number) { fileItemNumberInUploadSequence = number; } }