public static synchronized void removeMetaInfo(String fileId) throws FileAccessException {
   if (fileId == null) return;
   removeMetaInfoInMem(fileId);
   if (FileHelper.exist(
       IPackagingConstants.PACKAGING_PATH, getSubPath(fileId), META_INFO_FILENAME))
     FileHelper.delete(IPackagingConstants.PACKAGING_PATH, getSubPath(fileId), META_INFO_FILENAME);
 }
  /** This Constructor is used to create metaInfo during sending. */
  private MetaInfo(
      String fileId,
      int blockSize,
      int thresholdSize,
      String transId,
      String originalEventId,
      int totalBlocks,
      int lastBlockSize)
      throws FileAccessException, ApplicationException {
    _subPath = getSubPath(fileId);

    if (FileHelper.exist(IPackagingConstants.PACKAGING_PATH, _subPath, META_INFO_FILENAME)) {
      getMetaInfoFromFile(fileId);
      checkMetaInfo(
          fileId, blockSize, thresholdSize, transId, originalEventId, totalBlocks, lastBlockSize);
    } else {
      _fileId = fileId;
      _transId = transId;
      _blockSize = blockSize;
      _thresholdSize = thresholdSize;
      _originalEventId = originalEventId;
      _totalBlocks = totalBlocks;
      _lastBlockSize = lastBlockSize;
      createMetaInfo();
      storeMetaInfoIntoFile();
    }
  }
 private synchronized void storeMetaInfoIntoFile() throws FileAccessException {
   _timeLastAction = TimeUtil.localToUtc();
   File tmpFile = new File(META_INFO_FILENAME);
   FileWriter file = null;
   BufferedWriter bw = null;
   PrintWriter pw = null;
   try {
     file = new FileWriter(tmpFile);
     bw = new BufferedWriter(file);
     pw = new PrintWriter(bw);
     pw.println(_blockSize);
     pw.println(parseBlockReceivedToString());
     pw.println(_totalBlocks);
     pw.println(_fileId);
     pw.println(_lastBlock);
     pw.println(_lastBlockSent);
     pw.println(_lastBlockSize);
     pw.println(_subPath);
     pw.println(_thresholdSize);
     pw.println(_transId);
     pw.println(parseBlockFilenameToString());
     pw.println(_timeCreated);
     pw.println(_originalEventId);
     pw.println(_GNCI);
     pw.println(_finishedOnce);
     int originalDataLen = (_originalData == null) ? -1 : _originalData.length;
     pw.println(originalDataLen);
     for (int i = 0; i < originalDataLen; i++) {
       if (_originalData[i] != null) pw.println(_originalData[i]);
       else pw.println(NULL_DELIMITER);
     }
     pw.println(_timeLastAction);
     close(pw);
     if (FileHelper.exist(IPackagingConstants.PACKAGING_PATH, _subPath, META_INFO_FILENAME))
       FileHelper.replace(
           IPackagingConstants.PACKAGING_PATH, _subPath, META_INFO_FILENAME, tmpFile);
     else
       FileHelper.create(
           IPackagingConstants.PACKAGING_PATH, _subPath, META_INFO_FILENAME, tmpFile);
     tmpFile.delete();
   } catch (IOException ioe) {
     throw new FileAccessException("Unable to store meta info to file.");
   } finally {
     close(pw);
   }
 }
 /** This Constructor is used to create metaInfo when receiving. */
 private MetaInfo(String fileId, int totalBlocks)
     throws FileAccessException, ApplicationException {
   _subPath = getSubPath(fileId);
   if (FileHelper.exist(IPackagingConstants.PACKAGING_PATH, _subPath, META_INFO_FILENAME)) {
     getMetaInfoFromFile(fileId);
     checkMetaInfo(fileId);
     if (_totalBlocks < totalBlocks) {
       _totalBlocks = totalBlocks; // new total Block value
       storeMetaInfoIntoFile();
     }
   } else {
     _fileId = fileId;
     createMetaInfo();
     if (_totalBlocks < totalBlocks) _totalBlocks = totalBlocks;
     storeMetaInfoIntoFile();
   }
 }
  private synchronized void getMetaInfoFromFile(String fileId) throws FileAccessException {
    // String[] metaInfo = new String[6];
    File fileDesc = null;
    FileReader reader = null;
    BufferedReader breader = null;
    try {
      fileDesc =
          FileHelper.getFile(
              IPackagingConstants.PACKAGING_PATH, getSubPath(fileId), META_INFO_FILENAME);
      reader = new FileReader(fileDesc);
      breader = new BufferedReader(reader);

      _blockSize = Integer.parseInt(breader.readLine());
      parseStringToBlockReceived(breader.readLine());
      _totalBlocks = Integer.parseInt(breader.readLine());
      _fileId = breader.readLine();
      _lastBlock = Integer.parseInt(breader.readLine());
      _lastBlockSent = Integer.parseInt(breader.readLine());
      _lastBlockSize = Integer.parseInt(breader.readLine());
      _subPath = breader.readLine();
      _thresholdSize = Integer.parseInt(breader.readLine());
      _transId = breader.readLine();
      parseStringToBlockFilename(breader.readLine());
      _timeCreated = breader.readLine();
      _originalEventId = breader.readLine();
      _GNCI = breader.readLine();
      _finishedOnce = Boolean.valueOf(breader.readLine()).booleanValue();

      int originalDataLen = Integer.parseInt(breader.readLine());
      if (originalDataLen < 0) _originalData = null;
      else {
        _originalData = new String[originalDataLen];
        for (int i = 0; i < originalDataLen; i++) {
          _originalData[i] = breader.readLine();
          if (NULL_DELIMITER.equals(_originalData[i])) _originalData[i] = null;
        }
      }
      _timeLastAction = Long.valueOf(breader.readLine()).longValue();
    } catch (IOException ioe) {
      throw new FileAccessException("Unable to read meta info from file.", ioe);
    } finally {
      close(breader);
    }
  }
 /** This Constructor is used to create metaInfo when receiving acknowledgement. */
 private MetaInfo(String fileId) throws FileAccessException {
   _subPath = getSubPath(fileId);
   if (FileHelper.exist(IPackagingConstants.PACKAGING_PATH, _subPath, META_INFO_FILENAME))
     getMetaInfoFromFile(fileId);
   else throw new FileAccessException("Meta Info file not found!");
 }