/// <summary> /// Activate the options that were previously set with calls to properties. /// </summary> /// <remarks> /// <para> /// This allows an object to defer activation of its options until all /// options have been set. This is required for components which have /// related options that remain ambiguous until all are set. /// </para> /// <para> /// If a component implements this interface then this method must be called /// after its properties have been set before the component can be used. /// </para> /// <para> /// The strange constructor call to this method is suspended using /// <see cref="m_constructed"/>. /// </para> /// </remarks> public override void ActivateOptions() { if (!m_constructed) { return; } // pass control to parent in case we do not get a serializer :o[ base.ActivateOptions(); // just to get those converters var parser = CreatePatternParser(String.Empty); // Extract discovered converters var converters = Enumerable.ToArray( Enumerable.Cast <ConverterInfo>( parser.PatternConverters.Values ) ); var arrangement = new MultipleArrangement(); if (m_arrangement.Arrangements.Count != 0) { arrangement.AddArrangement(m_arrangement); } var patternArrangement = ArrangementConverter.GetArrangement(ConversionPattern, converters); if (patternArrangement != null) { arrangement.AddArrangement(patternArrangement); } if (arrangement.Arrangements.Count == 0) { // cater for bare defaults arrangement.AddArrangement(new DefaultArrangement()); } var serconv = SerializingConverter; if (serconv == null) { var name = SerializerName ?? DefaultSerializerName; var info = (parser.PatternConverters.ContainsKey(name) ? parser.PatternConverters[name] as ConverterInfo : null ) ?? CreateSerializingConverterInfo(name, typeof(JsonPatternConverter)); SerializingConverter = serconv = CreateSerializingConverter(info); } if (serconv != null) { SetUpSerializingConverter(serconv, converters, arrangement, m_fetcher, m_renderer, m_decorators.ToArray()); } }
/// <summary> /// Parse a composite arrangement /// </summary> /// <param name="option"></param> /// <returns></returns> public IArrangement ParseArrangementSet(string option) { if (string.IsNullOrEmpty(option)) { return(null); } var set = new MultipleArrangement(); int lengthMatched = 0; foreach (Match match in s_setMatcher.Matches(option)) { var member = match.Groups["Member"].Value; lengthMatched += match.Length; if (string.IsNullOrEmpty(member)) { continue; } // shortcuts switch (member) { case "DEFAULT": case "default": member = "DEFAULT!default"; break; case "nxlog": member = "DEFAULT!nxlog"; break; case "CLEAR": member = "REMOVE"; break; } var cleanMember = s_semiClean.Replace(member, Clean); var arrangement = ParseArangement(cleanMember); set.AddArrangement(arrangement); } if (lengthMatched != option.Length) { throw new Exception(String.Format("Unable to parse option: {0}", option)); } return(set.Arrangements.Count == 0 ? null : set.Arrangements.Count == 1 ? set.Arrangements[0] : set); }