Example #1
0
        /// <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());
            }
        }
Example #2
0
        /// <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);
        }