001package com.box.sdk;
002
003import java.util.List;
004
005/** */
006public class LargeFileUploadTask implements Runnable {
007
008  private final int partPostion;
009  private BoxFileUploadSession session;
010  private byte[] data;
011  private List<BoxFileUploadSessionPart> parts;
012  private long offset;
013  private int partSize;
014  private long fileSize;
015
016  /**
017   * Runable task to create parallel http connctions for file upload session.
018   *
019   * @param session file upload session object
020   * @param data bytes to be uploaded
021   * @param offset stream offset
022   * @param partSize part size of the put request
023   * @param fileSize total file size
024   * @param parts list of the BoxFileUploadSessionPart objects
025   * @param partPostion sequence number of the part
026   */
027  public LargeFileUploadTask(
028      BoxFileUploadSession session,
029      byte[] data,
030      long offset,
031      int partSize,
032      long fileSize,
033      List<BoxFileUploadSessionPart> parts,
034      int partPostion) {
035    this.session = session;
036    this.data = data;
037    this.offset = offset;
038    this.partSize = partSize;
039    this.fileSize = fileSize;
040    this.parts = parts;
041    this.partPostion = partPostion;
042  }
043
044  @Override
045  public void run() {
046    // Retries the upload part 3 times in case of failure.
047    for (int i = 0; i < 3; i++) {
048      try {
049        BoxFileUploadSessionPart part =
050            this.session.uploadPart(this.data, this.offset, this.partSize, this.fileSize);
051        this.parts.set(this.partPostion, part);
052        return;
053      } catch (BoxAPIException ex) {
054        if (i == 2) {
055          throw ex;
056        }
057      }
058    }
059    throw new BoxAPIException(
060        "Upload part failed for offset: " + this.offset + " range: " + this.partSize);
061  }
062}