//        protected string directory = StateManager.Settings["XmlMessageDefinition.Directory"].ToString();
        public MessageDefinition Read(string messageName, string section = null)
        {
            var filename = messageName;

            if (!File.Exists(filename)) throw new FileNotFoundException("Unable to locate message definition file {0}", filename);

            var definition = XDocument.Load(filename);
            var message = definition.Element("message");

            if (message == null) return null;

            var messageDefinition = new MessageDefinition
                                        {
                                            Name = message.GetAttributeOrDefault("name"),
                                            FileName = filename,
                                            RecordSeparator = message.GetAttributeOrDefault("recordSeparator", ","),
                                            HasHeader = message.GetAttributeOrDefault<bool>("hasHeader"),
                                        };

            foreach (XElement record in message.Elements("record"))
            {
                var newRecord = new RecordDefinition
                {
                    Name = record.GetAttributeOrDefault("name"),
                    DomainObjectName = record.GetAttributeOrDefault("domainobjectname"),
                    FieldSeparator = record.GetAttributeOrDefault("fieldSeparator", ","),
                };

                int defaultStartPos = 0;
                foreach (XElement field in record.Elements("field"))
                {
                    var newField = new FieldDefinition
                    {
                        Format = field.GetAttributeOrDefault("format"),
                        IsOptional = field.GetAttributeOrDefault<bool>("optional"),
                        StartPosition = field.GetAttributeOrDefault<int>("position", defaultStartPos),
                        Name = field.GetAttributeOrDefault("name"),
                        Type = field.GetAttributeFromDescriptorOrDefault<FieldDefinitionType>("type"),
                        Label = field.GetAttributeOrDefault("label", field.GetAttributeOrDefault("name")),
                        Table = field.GetAttributeOrDefault("table", newRecord.DomainObjectName),
                        Default = field.GetAttributeOrDefault("default")
                    };
                    defaultStartPos = newField.StartPosition + 1;

                    if (newField.Name.IsNullOrEmpty() || newField.Type.IsNullOrEmpty()) throw new MessagingException("Error reading message definition " + messageDefinition.Name);

                    newRecord.Fields.Add(newField);
                }
                messageDefinition.Records.Add(newRecord);
            }

            return messageDefinition;
        }
Exemple #2
0
        private static Record CreateRecord(MessageDefinition definition, XElement element)
        {
            RecordDefinition recordDef = definition.FindRecord(element.Name.LocalName);
            TableDescriber table = new TableDescriber(recordDef.Name, DataSources.NoSource);

            Record record = recordDef.Create(new DictionaryState());

            record.State.Set(new ColumnDescriber("ID", table, isIdentity: true), Guid.NewGuid());

            foreach (XElement subelement in element.Elements())
            {
                FieldDefinition fieldDef = recordDef.FindField(subelement.Name.LocalName);
                if (fieldDef.Type == FieldDefinitionType.Record)
                {
                    RecordDefinition subRecordDef = definition.FindRecord(subelement.Name.LocalName);
                    if (subRecordDef.Repeats > 1 || subRecordDef.Repeats == -1)
                    {
                        // This element appears more than once
                        List<Record> existing = record.State.Get<List<Record>>(new ColumnDescriber(fieldDef.Name, recordDef.Name)) ?? new List<Record>();
                        // If not initialized, do so now

                        existing.Add(CreateRecord(definition, subelement));

                        record.State.Set(new ColumnDescriber(fieldDef.Name, recordDef.Name), existing);
                    }
                    else
                    {
                        Record value = CreateRecord(definition, subelement);
                        record.State.Set(new ColumnDescriber(fieldDef.Name, recordDef.Name), value);
                    }
                }
                else
                {
                    record.State.Set(new ColumnDescriber(fieldDef.Name, recordDef.Name), subelement.Value);
                }
            }

            return record;
        }
Exemple #3
0
        private IEnumerable<Record> BreakIntoRecords(MessageDefinition definition, StreamReader reader)
        {
            var currentLine = 1;
            var currentRecord = string.Empty;

            try
            {
                var records = new List<Record>();
                var recordDefinition = definition.Records[0];
                var table = new TableDescriber(recordDefinition.Name, DataSources.NoSource);

                var line = reader.ReadLine();
                if (definition.HasHeader) line = reader.ReadLine();

                string seperator = recordDefinition.FieldSeparator.Length == 1
                                       ? string.Format(@"(?<=^(?:[^""]*""[^""]*"")*[^""]*){0}",
                                                       recordDefinition.FieldSeparator)
                                       : recordDefinition.FieldSeparator;
                Regex seperatorRegex = recordDefinition.FieldSeparator.Length == 1
                                           ? new Regex(seperator, RegexOptions.Compiled)
                                           : null;

                while (line != null)
                {
                    string[] fields = seperatorRegex != null ? seperatorRegex.Split(line) : line.Split(new[] { recordDefinition.FieldSeparator }, StringSplitOptions.None);

                    var state = new DictionaryState { IsNew = true };

                    if (!recordDefinition.Fields.Exists(f => f.Name.Equals("ID", StringComparison.OrdinalIgnoreCase)))
                    {
                        state[new ColumnDescriber("ID", table, isIdentity: true)] = Guid.NewGuid();
                    }
                    state[new ColumnDescriber("TimeStamp", table, isTimestamp: true)] = null;

                    foreach (var fieldDefinition in recordDefinition.Fields)
                    {
                        currentRecord = fieldDefinition.Name;
                        ReadRecordField(state, table, fieldDefinition, fields);
                    }

                    records.Add(recordDefinition.Create(state));

                    line = reader.ReadLine();
                    currentLine++;
                    currentRecord = string.Empty;
                }

                return records;
            }
            catch (FormatException exception)
            {
                throw new MessagingException(string.Format("Unknown message format. Line {1}, field {2}. {0}", exception.Message, currentLine, currentRecord), exception);
            }
        }