public ChoJSONRecordConfiguration UseDefaultContractResolver(bool flag = true)
        {
            if (flag)
            {
                var jsonResolver = new ChoPropertyRenameAndIgnoreSerializerContractResolver(this);
                JsonSerializerSettings.ContractResolver = jsonResolver;
            }
            else
            {
                JsonSerializerSettings.ContractResolver = null;
            }

            return(this);
        }
Exemplo n.º 2
0
        public override IEnumerable <object> WriteTo(object writer, IEnumerable <object> records, Func <object, bool> predicate = null)
        {
            _sw = writer;
            TextWriter sw = writer as TextWriter;

            ChoGuard.ArgumentNotNull(sw, "TextWriter");

            if (Configuration.JsonSerializerSettings.ContractResolver is ChoPropertyRenameAndIgnoreSerializerContractResolver)
            {
                ChoPropertyRenameAndIgnoreSerializerContractResolver cr = Configuration.JsonSerializerSettings.ContractResolver as ChoPropertyRenameAndIgnoreSerializerContractResolver;
                cr.CallbackRecordFieldWrite = _callbackRecordFieldWrite;
                cr.Writer = Writer;
            }

            if (records == null)
            {
                yield break;
            }
            if (Configuration.SingleDocument == null)
            {
                Configuration.SingleDocument = false;
            }

            CultureInfo prevCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;

            System.Threading.Thread.CurrentThread.CurrentCulture = Configuration.Culture;

            string recText       = String.Empty;
            bool   recordIgnored = false;

            try
            {
                foreach (object record in records)
                {
                    _index++;

                    //if (!isFirstRec)
                    //{
                    //    if (!recordIgnored)
                    //        sw.Write(",");
                    //    else
                    //        recordIgnored = false;
                    //}

                    if (TraceSwitch.TraceVerbose)
                    {
                        if (record is IChoETLNameableObject)
                        {
                            ChoETLFramework.WriteLog(TraceSwitch.TraceVerbose, "Writing [{0}] object...".FormatString(((IChoETLNameableObject)record).Name));
                        }
                        else
                        {
                            ChoETLFramework.WriteLog(TraceSwitch.TraceVerbose, "Writing [{0}] object...".FormatString(_index));
                        }
                    }

                    recText = String.Empty;
                    if (predicate == null || predicate(record))
                    {
                        //Discover and load Xml columns from first record
                        if (!Configuration.IsInitialized)
                        {
                            if (record == null)
                            {
                                continue;
                            }

                            string[] fieldNames = null;
                            if (Configuration.RecordType == typeof(object))
                            {
                                Type recordType = ElementType == null?record.GetType() : ElementType;

                                RecordType = Configuration.RecordType = recordType.GetUnderlyingType(); //.ResolveType();
                                Configuration.IsDynamicObject = recordType.IsDynamicType();
                            }
                            if (typeof(IDictionary).IsAssignableFrom(Configuration.RecordType) ||
                                typeof(IList).IsAssignableFrom(Configuration.RecordType))
                            {
                                Configuration.UseYamlSerialization = true;
                            }

                            if (!Configuration.IsDynamicObject)
                            {
                                if (Configuration.YamlRecordFieldConfigurations.Count == 0)
                                {
                                    Configuration.MapRecordFields(Configuration.RecordType);
                                }
                            }

                            if (Configuration.IsDynamicObject)
                            {
                                var dict = record.ToDynamicObject() as IDictionary <string, Object>;
                                fieldNames = dict.Keys.ToArray();
                            }
                            else
                            {
                                fieldNames = ChoTypeDescriptor.GetProperties <ChoYamlRecordFieldAttribute>(Configuration.RecordType).Select(pd => pd.Name).ToArray();
                                if (fieldNames.Length == 0)
                                {
                                    fieldNames = ChoType.GetProperties(Configuration.RecordType).Select(p => p.Name).ToArray();
                                }
                            }

                            Configuration.Validate(fieldNames);

                            Configuration.IsInitialized = true;

                            if (!BeginWrite.Value)
                            {
                                yield break;
                            }
                        }

                        if (!RaiseBeforeRecordWrite(record, _index, ref recText))
                        {
                            yield break;
                        }

                        if (recText == null)
                        {
                            continue;
                        }

                        try
                        {
                            if ((Configuration.ObjectValidationMode & ChoObjectValidationMode.ObjectLevel) == ChoObjectValidationMode.ObjectLevel)
                            {
                                record.DoObjectLevelValidation(Configuration, Configuration.YamlRecordFieldConfigurations);
                            }

                            if (ToText(_index, record, out recText))
                            {
                                if (recText.EndsWith("..."))
                                {
                                    recText = recText.Left(recText.Length - 3);
                                }

                                if (recText.EndsWith($"...{Environment.NewLine}"))
                                {
                                    recText = recText.Left(recText.Length - $"...{Environment.NewLine}".Length);
                                }

                                if (!Configuration.SingleDocument.Value)
                                {
                                    sw.Write($"---{EOLDelimiter}");
                                }

                                sw.Write("{0}", recText);

                                if (!Configuration.SingleDocument.Value)
                                {
                                    sw.Write($"...{EOLDelimiter}");
                                }

                                if (!RaiseAfterRecordWrite(record, _index, recText))
                                {
                                    yield break;
                                }
                            }
                        }
                        //catch (ChoParserException)
                        //{
                        //    throw;
                        //}
                        catch (Exception ex)
                        {
                            ChoETLFramework.HandleException(ref ex);
                            if (Configuration.ErrorMode == ChoErrorMode.IgnoreAndContinue)
                            {
                                recordIgnored = true;
                                ChoETLFramework.WriteLog(TraceSwitch.TraceError, "Error [{0}] found. Ignoring record...".FormatString(ex.Message));
                            }
                            else if (Configuration.ErrorMode == ChoErrorMode.ReportAndContinue)
                            {
                                if (!RaiseRecordWriteError(record, _index, recText, ex))
                                {
                                    throw;
                                }
                                else
                                {
                                    recordIgnored = true;
                                    //ChoETLFramework.WriteLog(TraceSwitch.TraceError, "Error [{0}] found. Ignoring record...".FormatString(ex.Message));
                                }
                            }
                            else
                            {
                                throw;
                            }
                        }
                    }

                    yield return(record);

                    if (Configuration.NotifyAfter > 0 && _index % Configuration.NotifyAfter == 0)
                    {
                        if (RaisedRowsWritten(_index))
                        {
                            ChoETLFramework.WriteLog(TraceSwitch.TraceVerbose, "Abort requested.");
                            yield break;
                        }
                    }
                }
            }
            finally
            {
                System.Threading.Thread.CurrentThread.CurrentCulture = prevCultureInfo;
            }
        }