private static IReadOnlyCollection <InternalParserConfigurationEntry> LoadConfiguration()
        {
            var result = new List <InternalParserConfigurationEntry>();

            var allParsers        = GetAllParsers();
            var allDataProcessors = GetAllDataProcessors();

            foreach (var parserDefinition in allParsers)
            {
                var parserType      = parserDefinition.Key;
                var parserDataTypes = parserDefinition.Value;

                var attributes = parserType.GetCustomAttributes <UseForClassificationAttribute>();
                foreach (var attribute in attributes)
                {
                    var dataProcessorType = attribute.DataProcessor;
                    var dataType          = attribute.Data;

                    if (dataProcessorType == null && dataType == null)
                    {
                        var dataProcessorDefinitions = allDataProcessors
                                                       .Where(dp => dp.Value.Any(dpt => parserDataTypes.Contains(dpt)))
                                                       .ToList();
                        if (dataProcessorDefinitions.Count == 0)
                        {
                            throw new InvalidOperationException($"Can not find eligible IParsedDataProcessor for parser {parserType.Name}");
                        }
                        if (dataProcessorDefinitions.Count > 1)
                        {
                            throw new InvalidOperationException($"Have found more the one eligible IParsedDataProcessor for parser {parserType.Name}");
                        }
                        dataProcessorType = dataProcessorDefinitions.Single().Key;
                    }
                    else if (dataProcessorType == null)
                    {
                        var dataProcessorDefinitions = allDataProcessors
                                                       .Where(dp => dp.Value.Contains(dataType))
                                                       .ToList();
                        if (dataProcessorDefinitions.Count == 0)
                        {
                            throw new InvalidOperationException($"Can not find eligible IParsedDataProcessor for ParsedData type {dataType.Name}");
                        }
                        if (dataProcessorDefinitions.Count > 1)
                        {
                            throw new InvalidOperationException($"Have found more the one eligible IParsedDataProcessor for ParsedData type {dataType.Name}");
                        }
                        dataProcessorType = dataProcessorDefinitions.Single().Key;
                    }

                    if (dataType == null)
                    {
                        var eligebleTypes = allDataProcessors[dataProcessorType].Intersect(allParsers[parserType]).ToList();
                        if (eligebleTypes.Count == 0)
                        {
                            throw new InvalidOperationException($"Can not find eligible ParsedData type for parser {parserType.Name} and processor {dataProcessorType.Namespace}");
                        }
                        if (eligebleTypes.Count > 1)
                        {
                            throw new InvalidOperationException($"Have found more the one eligible ParsedData type for parser {parserType.Name} and processor {dataProcessorType.Namespace}");
                        }
                        dataType = eligebleTypes.Single();
                    }

                    var configurationEntry = new ParserConfiguration(parserType, dataType, dataProcessorType);
                    result.Add(new InternalParserConfigurationEntry(attribute.ContentType, configurationEntry));
                }
            }
            return(result.AsReadOnly());
        }
 public InternalParserConfigurationEntry(String contentType, ParserConfiguration configuration)
 {
     ContentType   = contentType;
     Configuration = configuration;
 }
        private static IList<InternalParserConfigurationEntry> LoadConfiguration()
        {
            var result = new List<InternalParserConfigurationEntry>();

            var parserInterface = typeof(IParser<>);
            var dataProcessorInterface = typeof(IParsedDataProcessor<>);

            var assembly = Assembly.GetExecutingAssembly();
            var allParsers = assembly.GetTypes()
                .Where(t => !t.IsAbstract)
                .Select(t => new {
                    Parser = t,
                    DataTypes = t.GetInterfaces()
                        .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == parserInterface)
                        .Select(i => i.GetGenericArguments()[0]).ToList()
                })
                .Where(t => t.DataTypes.Any())
                .ToDictionary(e => e.Parser, e => e.DataTypes);
            var allDataProcessors = assembly.GetTypes()
                .Where(t => !t.IsAbstract)
                .Select(t => new {
                    DataProcessor = t,
                    DataTypes = t.GetInterfaces()
                        .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == dataProcessorInterface)
                        .Select(i => i.GetGenericArguments()[0]).ToList()
                })
                .Where(t => t.DataTypes.Any())
                .ToDictionary(e => e.DataProcessor, e => e.DataTypes);
            foreach (var parserDefinition in allParsers) {
                var parserType = parserDefinition.Key;
                var attributes = parserType.GetCustomAttributes<UseForClassificationAttribute>();
                foreach (var attribute in attributes) {
                    var dataProcessorType = attribute.DataProcessor;
                    var dataType = attribute.Data;

                    if (dataProcessorType == null && dataType == null) {
                        var dataProcessorDefinitions = allDataProcessors
                            .Where(dp => dp.Value.Any(dpt => parserDefinition.Value.Contains(dpt)))
                            .ToList();
                        if (dataProcessorDefinitions.Count == 0) {
                            throw new InvalidOperationException($"Can not find eligible IParsedDataProcessor for parser {parserType.Name}");
                        }
                        if (dataProcessorDefinitions.Count > 1) {
                            throw new InvalidOperationException($"Find more the one eligible IParsedDataProcessor for parser {parserType.Name}");
                        }
                        dataProcessorType = dataProcessorDefinitions.Single().Key;
                    } else if (dataProcessorType == null) {
                        var dataProcessorDefinitions = allDataProcessors
                            .Where(dp => dp.Value.Contains(dataType))
                            .ToList();
                        if (dataProcessorDefinitions.Count == 0) {
                            throw new InvalidOperationException($"Can not find eligible IParsedDataProcessor for ParsedData type {dataType.Name}");
                        }
                        if (dataProcessorDefinitions.Count > 1) {
                            throw new InvalidOperationException($"Find more the one eligible IParsedDataProcessor for ParsedData type {dataType.Name}");
                        }
                        dataProcessorType = dataProcessorDefinitions.Single().Key;
                    }

                    if (dataType == null) {
                        var eligebleTypes = allDataProcessors[dataProcessorType].Intersect(allParsers[parserType]).ToList();
                        if (eligebleTypes.Count == 0) {
                            throw new InvalidOperationException($"Can not find eligible ParsedData type for parser {parserType.Name} and processor {dataProcessorType.Namespace}");
                        }
                        if (eligebleTypes.Count > 1) {
                            throw new InvalidOperationException($"Find more the one eligible ParsedData type for parser {parserType.Name} and processor {dataProcessorType.Namespace}");
                        }
                        dataType = eligebleTypes.Single();
                    }

                    var configurationEntry = new ParserConfiguration(parserType, dataType, dataProcessorType);
                    result.Add(new InternalParserConfigurationEntry(attribute.ContentType, configurationEntry));
                }
            }
            return result.AsReadOnly();
        }
예제 #4
0
        private static IList <InternalParserConfigurationEntry> LoadConfiguration()
        {
            var result = new List <InternalParserConfigurationEntry>();

            var parserInterface        = typeof(IParser <>);
            var dataProcessorInterface = typeof(IParsedDataProcessor <>);

            var assembly   = Assembly.GetExecutingAssembly();
            var allParsers = assembly.GetTypes()
                             .Where(t => !t.IsAbstract)
                             .Select(t => new
            {
                Parser    = t,
                DataTypes = t.GetInterfaces()
                            .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == parserInterface)
                            .Select(i => i.GetGenericArguments()[0]).ToList()
            })
                             .Where(t => t.DataTypes.Any())
                             .ToDictionary(e => e.Parser, e => e.DataTypes);
            var allDataProcessors = assembly.GetTypes()
                                    .Where(t => !t.IsAbstract)
                                    .Select(t => new
            {
                DataProcessor = t,
                DataTypes     = t.GetInterfaces()
                                .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == dataProcessorInterface)
                                .Select(i => i.GetGenericArguments()[0]).ToList()
            })
                                    .Where(t => t.DataTypes.Any())
                                    .ToDictionary(e => e.DataProcessor, e => e.DataTypes);

            foreach (var parserDefinition in allParsers)
            {
                var parserType = parserDefinition.Key;
                var attributes = parserType.GetCustomAttributes <UseForClassificationAttribute>();
                foreach (var attribute in attributes)
                {
                    var dataProcessorType = attribute.DataProcessor;
                    var dataType          = attribute.Data;

                    if (dataProcessorType == null && dataType == null)
                    {
                        var dataProcessorDefinitions = allDataProcessors
                                                       .Where(dp => dp.Value.Any(dpt => parserDefinition.Value.Contains(dpt)))
                                                       .ToList();
                        if (dataProcessorDefinitions.Count == 0)
                        {
                            throw new InvalidOperationException($"Can not find eligible IParsedDataProcessor for parser {parserType.Name}");
                        }
                        if (dataProcessorDefinitions.Count > 1)
                        {
                            throw new InvalidOperationException($"Find more the one eligible IParsedDataProcessor for parser {parserType.Name}");
                        }
                        dataProcessorType = dataProcessorDefinitions.Single().Key;
                    }
                    else if (dataProcessorType == null)
                    {
                        var dataProcessorDefinitions = allDataProcessors
                                                       .Where(dp => dp.Value.Contains(dataType))
                                                       .ToList();
                        if (dataProcessorDefinitions.Count == 0)
                        {
                            throw new InvalidOperationException($"Can not find eligible IParsedDataProcessor for ParsedData type {dataType.Name}");
                        }
                        if (dataProcessorDefinitions.Count > 1)
                        {
                            throw new InvalidOperationException($"Find more the one eligible IParsedDataProcessor for ParsedData type {dataType.Name}");
                        }
                        dataProcessorType = dataProcessorDefinitions.Single().Key;
                    }

                    if (dataType == null)
                    {
                        var eligebleTypes = allDataProcessors[dataProcessorType].Intersect(allParsers[parserType]).ToList();
                        if (eligebleTypes.Count == 0)
                        {
                            throw new InvalidOperationException($"Can not find eligible ParsedData type for parser {parserType.Name} and processor {dataProcessorType.Namespace}");
                        }
                        if (eligebleTypes.Count > 1)
                        {
                            throw new InvalidOperationException($"Find more the one eligible ParsedData type for parser {parserType.Name} and processor {dataProcessorType.Namespace}");
                        }
                        dataType = eligebleTypes.Single();
                    }

                    var configurationEntry = new ParserConfiguration(parserType, dataType, dataProcessorType);
                    result.Add(new InternalParserConfigurationEntry(attribute.ContentType, configurationEntry));
                }
            }
            return(result.AsReadOnly());
        }
 public InternalParserConfigurationEntry(String contentType, ParserConfiguration configuration)
 {
     ContentType = contentType;
     Configuration = configuration;
 }