示例#1
0
  @Override
  public FileData getFileByIndex(FileData fileIndex) {
    FileData.Builder builder = FileData.newBuilder().setId(fileIndex.getId());

    FileData data = getFileById(fileIndex.getId());
    if (null != data) {
      List<DataSlice> slices = FileDataHelper.extract(data, fileIndex);
      builder.addAllSlice(slices);
    }

    return builder.build();
  }
示例#2
0
 @Override
 public FileData getFileById(String fileId) {
   FileData data = fileCache.get(fileId);
   if (null == data) {
     // File might be stored persistently
     try {
       data = FileData.parseFrom(fileStore.get(fileId));
     } catch (InvalidProtocolBufferException e) {
       log.warn("Spoiled file data, id: " + fileId);
     }
   }
   return data;
 }
示例#3
0
  @Override
  public FileData storeFile(FileData fileData) {
    FileData.Builder builder = FileData.newBuilder().mergeFrom(fileData);

    FileData prevData = fileCache.get(fileData.getId());
    if (null != prevData) {
      builder.addAllSlice(prevData.getSliceList());
    }

    FileData data = builder.build();
    if (FileDataHelper.isSane(data)) {
      FileData fixed = FileDataHelper.removeDuplicate(data);
      fileStore.put(fileData.getId(), fixed.toByteArray());

      // This cache can reserved for performance
      fileCache.remove(fileData.getId());
    } else {
      fileCache.put(fileData.getId(), data);

      if (FileDataHelper.nearComplete(data)) {
        List<DataSlice> missingSlices = FileDataHelper.findMissing(data);
        FileData missing =
            FileData.newBuilder().setId(data.getId()).addAllSlice(missingSlices).build();
        return missing;
      }
    }

    return FileData.newBuilder().setId(data.getId()).build();
  }