//------------------------------------------------------
        //
        //  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);
        }
示例#2
0
        //------------------------------------------------------
        //
        //  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;
        }