package au.edu.anu.dcclient.tasks; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sun.jersey.api.client.ClientResponse; public class UploadFilesetTask extends AbstractDcBagTask<Map<File, FileTaskInfo>, Void> { private static final Logger LOGGER = LoggerFactory.getLogger(UploadFilesetTask.class); private final String pid; private long totalBytesToUpload = 0L; private long bytesUploaded = 0L; private Map<File, FileTaskInfo> filesetStatus = new HashMap<File, FileTaskInfo>(); public UploadFilesetTask(String pid, Collection<File> fileset) { this.pid = pid; populateFilesetStatusKeys(fileset); } @Override protected Map<File, FileTaskInfo> doInBackground() throws Exception { for (File iFile : filesetStatus.keySet()) { final FileTaskInfo fileTaskInfo = filesetStatus.get(iFile); UploadFileTask upTask = new UploadFileTask(pid, iFile.getName(), iFile); upTask.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { LOGGER.trace("{}, {}", evt.getSource().toString()); if ("progress".equals(evt.getPropertyName())) { setProgress((Integer) evt.getNewValue()); } } }); bytesUploaded += iFile.length(); fileTaskInfo.setStatus(FileTaskInfo.Status.INPROGRESS); ClientResponse resp = upTask.doInBackground(); fileTaskInfo.setRespStatusCode(resp.getStatus()); fileTaskInfo.setRespStatusStr(resp.getEntity(String.class)); if (fileTaskInfo.getRespStatusCode() == 200) { fileTaskInfo.setStatus(FileTaskInfo.Status.SUCCESS); } else { fileTaskInfo.setStatus(FileTaskInfo.Status.FAILED); } } setProgress(100); return filesetStatus; } private void populateFilesetStatusKeys(Collection<File> fileset) { for (File iFile : fileset) { FileTaskInfo iFileInfo = new FileTaskInfo(iFile.length()); filesetStatus.put(iFile, iFileInfo); totalBytesToUpload += iFile.length(); } } }