// 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; }
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; }
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); } }