//------------------------------------------------------ // // Private Methods // //------------------------------------------------------ private bool ManageUids() { int countGoodFiles = 0; // enumerate through each file foreach (ITaskItem inputFile in _markupFiles) { Log.LogMessageFromResources(SRID.CheckingUids, inputFile.ItemSpec); switch (_task) { case UidTask.Check: { UidCollector collector = ParseFile(inputFile.ItemSpec); bool success = VerifyUid( collector, // uid collector true // log error ); if (success) { countGoodFiles++; } break; } case UidTask.Update: { UidCollector collector = ParseFile(inputFile.ItemSpec); bool success = VerifyUid( collector, // uid collector false // log error ); if (!success) { if (SetupBackupDirectory()) { // resolve errors collector.ResolveUidErrors(); // temp file to write to string tempFile = GetTempFileName(inputFile.ItemSpec); // backup file of the source file before it is overwritten. string backupFile = GetBackupFileName(inputFile.ItemSpec); using (Stream uidStream = new FileStream(tempFile, FileMode.Create)) { using (Stream source = File.OpenRead(inputFile.ItemSpec)) { UidWriter writer = new UidWriter(collector, source, uidStream); writer.UpdateUidWrite(); } } // backup source file by renaming it. Expect to be (close to) atomic op. RenameFile(inputFile.ItemSpec, backupFile); // rename the uid output onto the source file. Expect to be (close to) atomic op. RenameFile(tempFile, inputFile.ItemSpec); // remove the temp files RemoveFile(tempFile); RemoveFile(backupFile); countGoodFiles++; } } else { // all uids are good. No-op countGoodFiles++; } break; } case UidTask.Remove: { UidCollector collector = ParseFile(inputFile.ItemSpec); bool hasUid = false; for (int i = 0; i < collector.Count; i++) { if (collector[i].Status != UidStatus.Absent) { hasUid = true; break; } } if (hasUid) { if (SetupBackupDirectory()) { // temp file to write to string tempFile = GetTempFileName(inputFile.ItemSpec); // backup file of the source file before it is overwritten. string backupFile = GetBackupFileName(inputFile.ItemSpec); using (Stream uidStream = new FileStream(tempFile, FileMode.Create)) { using (Stream source = File.OpenRead(inputFile.ItemSpec)) { UidWriter writer = new UidWriter(collector, source, uidStream); writer.RemoveUidWrite(); } } // rename the source file to the backup file name. Expect to be (close to) atomic op. RenameFile(inputFile.ItemSpec, backupFile); // rename the output file over to the source file. Expect to be (close to) atomic op. RenameFile(tempFile, inputFile.ItemSpec); // remove the temp files RemoveFile(tempFile); RemoveFile(backupFile); countGoodFiles++; } } else { // There is no Uid in the file. No need to do remove. countGoodFiles++; } break; } } } // spew out the overral log info for the task switch (_task) { case UidTask.Remove: Log.LogMessageFromResources(SRID.FilesRemovedUid, countGoodFiles); break; case UidTask.Update: Log.LogMessageFromResources(SRID.FilesUpdatedUid, countGoodFiles); break; case UidTask.Check: Log.LogMessageFromResources(SRID.FilesPassedUidCheck, countGoodFiles); if (_markupFiles.Length > countGoodFiles) { Log.LogErrorWithCodeFromResources(SRID.FilesFailedUidCheck, _markupFiles.Length - countGoodFiles); } break; } return(_markupFiles.Length == countGoodFiles); }
//------------------------------------------------------ // // Private Methods // //------------------------------------------------------ private bool ManageUids() { int countGoodFiles = 0; // enumerate through each file foreach (ITaskItem inputFile in _markupFiles) { Log.LogMessageFromResources(SRID.CheckingUids, inputFile.ItemSpec); switch (_task) { case UidTask.Check: { UidCollector collector = ParseFile(inputFile.ItemSpec); bool success = VerifyUid( collector, // uid collector true // log error ); if (success) countGoodFiles++; break; } case UidTask.Update: { UidCollector collector = ParseFile(inputFile.ItemSpec); bool success = VerifyUid( collector, // uid collector false // log error ); if (!success) { if (SetupBackupDirectory()) { // resolve errors collector.ResolveUidErrors(); // temp file to write to string tempFile = GetTempFileName(inputFile.ItemSpec); // backup file of the source file before it is overwritten. string backupFile = GetBackupFileName(inputFile.ItemSpec); using (Stream uidStream = new FileStream(tempFile, FileMode.Create)) { using (Stream source = File.OpenRead(inputFile.ItemSpec)) { UidWriter writer = new UidWriter(collector, source, uidStream); writer.UpdateUidWrite(); } } // backup source file by renaming it. Expect to be (close to) atomic op. RenameFile(inputFile.ItemSpec, backupFile); // rename the uid output onto the source file. Expect to be (close to) atomic op. RenameFile(tempFile, inputFile.ItemSpec); // remove the temp files RemoveFile(tempFile); RemoveFile(backupFile); countGoodFiles++; } } else { // all uids are good. No-op countGoodFiles++; } break; } case UidTask.Remove: { UidCollector collector = ParseFile(inputFile.ItemSpec); bool hasUid = false; for (int i = 0; i < collector.Count; i++) { if (collector[i].Status != UidStatus.Absent) { hasUid = true; break; } } if (hasUid) { if (SetupBackupDirectory()) { // temp file to write to string tempFile = GetTempFileName(inputFile.ItemSpec); // backup file of the source file before it is overwritten. string backupFile = GetBackupFileName(inputFile.ItemSpec); using (Stream uidStream = new FileStream(tempFile, FileMode.Create)) { using (Stream source = File.OpenRead(inputFile.ItemSpec)) { UidWriter writer = new UidWriter(collector, source, uidStream); writer.RemoveUidWrite(); } } // rename the source file to the backup file name. Expect to be (close to) atomic op. RenameFile(inputFile.ItemSpec, backupFile); // rename the output file over to the source file. Expect to be (close to) atomic op. RenameFile(tempFile, inputFile.ItemSpec); // remove the temp files RemoveFile(tempFile); RemoveFile(backupFile); countGoodFiles++; } } else { // There is no Uid in the file. No need to do remove. countGoodFiles++; } break; } } } // spew out the overral log info for the task switch (_task) { case UidTask.Remove: Log.LogMessageFromResources(SRID.FilesRemovedUid, countGoodFiles); break; case UidTask.Update: Log.LogMessageFromResources(SRID.FilesUpdatedUid, countGoodFiles); break; case UidTask.Check: Log.LogMessageFromResources(SRID.FilesPassedUidCheck, countGoodFiles); if (_markupFiles.Length > countGoodFiles) { Log.LogErrorWithCodeFromResources(SRID.FilesFailedUidCheck, _markupFiles.Length - countGoodFiles); } break; } return _markupFiles.Length == countGoodFiles; }