Example #1
0
            public MapProcessor(MapResults results, string pattern)
            {
                string[] patternParts = pattern.Split(" > ");

                if (patternParts.Length < 4)
                {
                    throw new ArgumentException($"Invalid pattern '{pattern}'");
                }

                HashSet <string> options = patternParts[3]
                                           .Split(',', StringSplitOptions.RemoveEmptyEntries)
                                           .ToHashSet(StringComparer.OrdinalIgnoreCase);

                _pattern = options.Contains("CaseSensitive")
                    ? new Regex(Unescape(patternParts[0]))
                    : new Regex(Unescape(patternParts[0]), RegexOptions.IgnoreCase);

                _options                 = options;
                _replacement             = Unescape(patternParts[1]);
                _replacementGroupMatches = _groupSubstitution.Matches(_replacement);

                string outputFile = patternParts[2];

                if (!string.IsNullOrEmpty(outputFile))
                {
                    _results = results.InitializeForFile(outputFile, options);
                }

                _replaceOrigin = options.Contains("ReplaceOrigin");
            }
Example #2
0
 public MapPattern(MapResults results, IEnumerable <string> patterns)
 {
     _processors = patterns
                   .Where(item => !string.IsNullOrWhiteSpace(item))
                   .Select(pattern => new MapProcessor(results, pattern))
                   .ToArray();
 }
Example #3
0
        private static ICollection <ICollection <MapPattern> > GetMapChains(IConfiguration configuration, MapResults mapResults)
        {
            int  mapFlowIndex  = 0;
            bool mapFlowFailed = false;

            ICollection <ICollection <MapPattern> > results = new List <ICollection <MapPattern> >();

            while (!mapFlowFailed)
            {
                bool mapPatternFailed = false;
                mapFlowFailed = true;
                int mapPatternIndex           = 0;
                List <MapPattern> currentList = null;

                while (!mapPatternFailed)
                {
                    string patternFilesKey = $"mapConfigurations:{mapFlowIndex}:{mapPatternIndex}:patternFiles";
                    string patternsKey     = $"mapConfigurations:{mapFlowIndex}:{mapPatternIndex}:patterns";

                    string[] patternFiles = configuration.GetSection(patternFilesKey).Get <string[]>();
                    string[] patterns     = configuration.GetSection(patternsKey).Get <string[]>();

                    mapPatternFailed = patternFiles == null && patterns == null;

                    if (!mapPatternFailed)
                    {
                        if (currentList == null)
                        {
                            currentList = new List <MapPattern>();
                            results.Add(currentList);
                        }
                        mapFlowFailed = false;
                    }

                    if (patternFiles != null)
                    {
                        IEnumerable <MapPattern> mapPatterns = patternFiles
                                                               .Select(File.ReadAllLines)
                                                               .Select(lines => new MapPattern(mapResults, lines));

                        currentList.AddRange(mapPatterns);
                    }

                    if (patterns != null)
                    {
                        currentList.Add(new MapPattern(mapResults, patterns));
                    }

                    ++mapPatternIndex;
                }

                ++mapFlowIndex;
            }

            return(results);
        }
Example #4
0
        private static void Main()
        {
            Logger         logger;
            IConfiguration appConfiguration;
            IConfiguration searchConfiguration;

            try
            {
                appConfiguration = GetConfiguration();

                string configurationName = DisplayAndChooseConfiguration(appConfiguration);

                logger = SetupLogger(configurationName);

                searchConfiguration = GetSearchConfiguration(appConfiguration, configurationName);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                Console.ReadLine();

                return;
            }

            try
            {
                Regex[]    fileExcludePatterns = GetFileExcludePatterns(searchConfiguration);
                Regex[]    fileIncludePatterns = GetFileIncludePatterns(searchConfiguration);
                Regex[]    excludePatterns     = GetExcludePatterns(searchConfiguration);
                string[]   itemsToSearch       = GetItemsToSearch(searchConfiguration);
                MapResults mapResults          = new MapResults();
                ICollection <ICollection <MapPattern> > mapChains = GetMapChains(searchConfiguration, mapResults);

                IEnumerable <string> files = Directory
                                             .EnumerateFiles(appConfiguration["searchRoot"],
                                                             "*",
                                                             SearchOption.AllDirectories
                                                             )
                                             .Where(file =>
                                                    fileExcludePatterns.All(pattern => !pattern.IsMatch(file)) ||
                                                    fileIncludePatterns.Any(pattern => pattern.IsMatch(file))
                                                    );

                int         foundItemCount = 0;
                FileCounter fileCounter    = new FileCounter();

                Parallel.ForEach(
                    files,
                    (file, state) =>
                {
                    FileNameWriter fileNameWriter = new FileNameWriter(file, logger, fileCounter);

                    bool somethingReplaced = false;

                    string[] fileLines = File.ReadAllLines(file);

                    for (int lineIndex = 0; lineIndex < fileLines.Length; lineIndex++)
                    {
                        string fileLine = fileLines[lineIndex];

                        string currentLine = fileLine;

                        if (string.IsNullOrEmpty(currentLine))
                        {
                            continue;
                        }

                        if (itemsToSearch
                            .All(itemToSearch => !currentLine.Contains(itemToSearch, StringComparison.OrdinalIgnoreCase)))
                        {
                            continue;
                        }

                        for (int index = 0; index < excludePatterns.Length; index++)
                        {
                            Regex excludePattern = excludePatterns[index];
                            currentLine          = excludePattern.Replace(currentLine, string.Empty);
                        }

                        for (int index = 0; index < excludePatterns.Length; index++)
                        {
                            Regex excludePattern = excludePatterns[index];
                            currentLine          = excludePattern.Replace(currentLine, string.Empty);
                        }

                        if (itemsToSearch
                            .All(itemToSearch => !currentLine.Contains(itemToSearch, StringComparison.OrdinalIgnoreCase)))
                        {
                            continue;
                        }

                        fileNameWriter.Write();
                        logger.Information($"    {lineIndex} {fileLine}");

                        ++foundItemCount;

                        foreach (ICollection <MapPattern> mapChain in mapChains)
                        {
                            string processingLine = fileLine;
                            foreach (MapPattern mapPattern in mapChain)
                            {
                                (string outputLine, bool replaceOrigin) = mapPattern.Process(processingLine);

                                processingLine = outputLine;

                                if (replaceOrigin)
                                {
                                    logger.Information("Replaced with:");
                                    logger.Information($"    {lineIndex} {processingLine}");
                                    fileLines[lineIndex] = processingLine;
                                    somethingReplaced    = true;
                                }
                            }
                        }
                    }

                    if (somethingReplaced)
                    {
                        File.WriteAllLines(file, fileLines);
                    }

                    Console.WriteLine($"'{file}' has been processed");
                }
                    );

                logger.Information($"Found: {foundItemCount} items in {fileCounter.Count} files");

                foreach ((string FileName, ICollection <string> Values)mapResult
                         in mapResults
                         .GetFiles()
                         .Select(fileName => (FileName: fileName, Results: mapResults.GetResults(fileName)))
                         )
                {
                    ICollection <string> collection = mapResult.Values;

                    if (!collection.Any())
                    {
                        continue;
                    }

                    logger.Information(string.Empty);
                    logger.Information($"Results for output '{mapResult.FileName}':");
                    foreach (string item in collection)
                    {
                        logger.Information(item);
                    }
                }
            }
            catch (Exception e)
            {
                logger.Error(e.ToString());
                Console.ReadLine();
            }

            logger.Information(string.Empty);
            logger.Information("Done");
        }