Example #1
0
        /// <summary>
        /// Get the parameters for the specified builder type, possibly creating it, if there
        /// is not yet one in the build data collection.
        /// </summary>
        /// <param name="builderType">Type of the builder to request a set of sample data for.</param>
        /// <param name="paraType">Type of the parameter class.</param>
        /// <param name="properties">The global properties storage.</param>
        /// <returns>
        /// A new instance of a matching parameter data set for the specified builder.
        /// </returns>
        /// <exception cref="KeyNotFoundException">The given <paramref name="builderType"/> was not present in the lookup.</exception>
        public IMemberBuildParameters GetParameters(Type builderType, Type paraType, IBuildDataDictionary properties)
        {
            Guard.NotNull(() => properties, properties);
            IBuilderData result;
            var          found = properties.TryGetValue(string.Empty + builderType.FullName, out result);

            if (found)
            {
                return(result as IMemberBuildParameters);
            }

            var paraInstance = Activator.CreateInstance(paraType);
            var setupPara    = (IMemberBuildParameters)paraInstance;

            properties.AddDataItem(string.Empty + builderType.FullName, setupPara);
            return(setupPara);
        }
Example #2
0
        /// <summary>
        /// Get the parameters for the specified builder type, possibly creating it, if there
        /// is not yet one in the build data collection.
        /// </summary>
        /// <param name="key">The unique identifier of the parameter data set.</param>
        /// <param name="builderType">Type of the builder to request a set of sample data for.</param>
        /// <param name="paraType">Type of the parameter class.</param>
        /// <param name="properties">The global properties storage.</param>
        /// <returns>
        /// A new instance of a matching parameter data set for the specified builder.
        /// </returns>
        /// <exception cref="KeyNotFoundException">The given <paramref name="builderType"/> was not present in the lookup.</exception>
        public IMultiBuildParameters GetMultiParameter(Guid key, Type builderType, Type paraType, IBuildDataDictionary properties)
        {
            Guard.NotNull(() => properties, properties);
            Guard.CanBeAssigned(() => paraType, paraType, typeof(IMultiBuildParameters));

            IBuilderData result;

            if (key == null || key == Guid.Empty)
            {
                key = Guid.NewGuid();
            }
            else
            {
                IReadOnlyDictionary <string, IBuilderData> category;
                var catfound = properties.Data().TryGetValue("Multi." + builderType.FullName, out category);
                if (catfound)
                {
                    var found = category.TryGetValue(key.ToString(), out result);
                    if (found)
                    {
                        return(result as IMultiBuildParameters);
                    }
                }
            }

            var paraInstance = Activator.CreateInstance(paraType);
            var setupPara    = (IMultiBuildParameters)paraInstance;

            properties.AddDataItem("Multi." + builderType.FullName, key.ToString(), setupPara);
            setupPara.Id = key;
            return(setupPara);

            //var paraInstance = Activator.CreateInstance(paraType);
            //var setupPara = (IMemberBuildParameters)paraInstance;

            //properties.AddDataItem(string.Empty + builderType.FullName, setupPara);
            //return setupPara;
        }
Example #3
0
        private IMemberBuildParameters SetSingleNode(IBuildDataDictionary properties, IBuildHandler handler,
                                                     XmlNode firstChild)
        {
            Guard.NotNull(() => properties, properties);
            Guard.NotNull(() => handler, handler);
            var paraType = handler.ParameterDataType;

            if (!typeof(IBuilderData).IsAssignableFrom(paraType))
            {
                throw new ArgumentOutOfRangeException("handler",
                                                      "The handler for MemberBuilder '" + handler.Type.FullName +
                                                      "' is mapping to a invalid parameter of '" + handler.ParameterDataType.FullName + "' type. " +
                                                      "Parameter types have to implement the '" + typeof(IBuilderData).FullName + "' interface.");
            }
            object paraInstance = null;

            if (handler.IsMultiBuilder)
            {
                if (!typeof(IMultiBuildParameters).IsAssignableFrom(paraType))
                {
                    throw new ArgumentOutOfRangeException("handler",
                                                          "Requesting a parameter type of '" + firstChild.Name +
                                                          "' (via Xml) for the '" + handler.ParameterDataType.FullName + "' handler assigned type. " +
                                                          "Parameter types have to implement the '" + typeof(IMultiBuildParameters).FullName + "' interface.");
                }

                // null check paraType
                var xxx  = paraType.BaseType.GetGenericTypeDefinition();
                var xxxx = xxx.BaseType.GetGenericTypeDefinition();

                // null check xxxx
                var serializer2 = xxxx.BaseType.GetGenericTypeDefinition();

                // Todo: This strange thingy ... very good checking and logging! :)
                // null check serializer2
                paraInstance = serializer2
                               .MakeGenericType(paraType)
                               .GetMethod("Deserialize", new[] { typeof(string) })
                               .Invoke(null, new object[] { firstChild.InnerXml });
            }
            else
            {
                if (!typeof(IMemberBuildParameters).IsAssignableFrom(paraType))
                {
                    throw new ArgumentOutOfRangeException("handler",
                                                          "Requesting a parameter type for '" + firstChild.Name +
                                                          "' (via Xml) for the '" + paraType.FullName + "' handler assigned type. " +
                                                          "Parameter types have to implement the '" + typeof(IMemberBuildParameters).FullName + "' interface.");
                }

                // Todo: really need this stuff here? should this be done in the handler construction?
                // for example: checking if a multibuilder has IMultiBuildParameters and a
                // normal builder has IMemberBuildParameters.
                var xmlParaType = firstChild.FirstChild.Name;
                if (xmlParaType != paraType.Name)
                {
                    throw new ArgumentOutOfRangeException("firstChild",
                                                          "Requesting a parameter type of '" + xmlParaType + "' (via Xml). " +
                                                          "Parameter types for the '" + handler.Type.FullName + "' builder have to be of the '" + paraType.FullName + "' kind.");
                }

                // null check paraType
                var xxxx = paraType.BaseType.GetGenericTypeDefinition();

                // null check xxxx
                var serializer2 = xxxx.BaseType.GetGenericTypeDefinition();

                // Todo: This strange thingy ... very good checking and logging! :)
                // null check serializer2
                paraInstance = serializer2
                               .MakeGenericType(paraType)
                               .GetMethod("Deserialize", new[] { typeof(string) })
                               .Invoke(null, new object[] { firstChild.InnerXml });
            }

            var setupPara = (IMemberBuildParameters)paraInstance;

            try
            {
                var propertyKey = handler.Type.FullName;

                // IBuilderData property;
                // var found = properties.TryGetValue(propertyKey, out property);
                // if (found)
                // {
                if (handler.IsMultiBuilder)
                {
                    var multiPara = setupPara as IMultiBuildParameters;
                    properties.AddDataItem("Multi." + handler.Type.FullName, multiPara.Id.ToString(), setupPara, true);
                }
                else
                {
                    properties.AddDataItem(propertyKey, setupPara, true);
                }

                // return setupPara;
                // }
                // properties.AddDataItem(propertyKey, setupPara);
            }
            catch (Exception ex)
            {
                var message = string.Format(
                    "Problem building {0} from serialization data.{1}{2}{3}",
                    handler.Type.FullName,
                    Environment.NewLine,
                    firstChild.InnerXml,
                    Environment.NewLine);
                throw new InvalidCastException(message, ex);
            }
            return(setupPara);
        }
Example #4
0
        /// <summary>
        /// Get the parameters for the specified builder type, possibly creating it, if there
        /// is not yet one in the build data collection.
        /// </summary>
        /// <param name="key">The unique identifier of the parameter data set.</param>
        /// <param name="builderType">Type of the builder to request a set of sample data for.</param>
        /// <param name="paraType">Type of the parameter class.</param>
        /// <param name="properties">The global properties storage.</param>
        /// <returns>
        /// A new instance of a matching parameter data set for the specified builder.
        /// </returns>
        /// <exception cref="KeyNotFoundException">The given <paramref name="builderType"/> was not present in the lookup.</exception>
        public IMultiBuildParameters GetMultiParameter(Guid key, Type builderType, Type paraType, IBuildDataDictionary properties)
        {
            Guard.NotNull(() => properties, properties);
            Guard.CanBeAssigned(()=> paraType, paraType, typeof(IMultiBuildParameters));

            IBuilderData result;

            if (key == null || key == Guid.Empty)
            {
                key = Guid.NewGuid();
            }
            else
            {
                IReadOnlyDictionary<string, IBuilderData> category;
                var catfound = properties.Data().TryGetValue("Multi." + builderType.FullName, out category);
                if (catfound)
                {
                    var found = category.TryGetValue(key.ToString(), out result);
                    if (found)
                    {
                        return result as IMultiBuildParameters;
                    }
                }
            }

            var paraInstance = Activator.CreateInstance(paraType);
            var setupPara = (IMultiBuildParameters)paraInstance;

            properties.AddDataItem("Multi." + builderType.FullName, key.ToString(), setupPara);
            setupPara.Id = key;
            return setupPara;

            //var paraInstance = Activator.CreateInstance(paraType);
            //var setupPara = (IMemberBuildParameters)paraInstance;

            //properties.AddDataItem(string.Empty + builderType.FullName, setupPara);
            //return setupPara;
        }
Example #5
0
        private IMemberBuildParameters SetSingleNode(IBuildDataDictionary properties, IBuildHandler handler, 
            XmlNode firstChild)
        {
            Guard.NotNull(() => properties, properties);
            Guard.NotNull(() => handler, handler);
            var paraType = handler.ParameterDataType;
            if (!typeof(IBuilderData).IsAssignableFrom(paraType))
            {
                throw new ArgumentOutOfRangeException("handler",
                    "The handler for MemberBuilder '" + handler.Type.FullName +
                    "' is mapping to a invalid parameter of '" + handler.ParameterDataType.FullName + "' type. " +
                "Parameter types have to implement the '" + typeof(IBuilderData).FullName + "' interface.");
            }
            object paraInstance = null;
            if (handler.IsMultiBuilder)
            {
                if (!typeof(IMultiBuildParameters).IsAssignableFrom(paraType))
                {
                    throw new ArgumentOutOfRangeException("handler",
                        "Requesting a parameter type of '" + firstChild.Name +
                        "' (via Xml) for the '" + handler.ParameterDataType.FullName + "' handler assigned type. " +
                    "Parameter types have to implement the '" + typeof(IMultiBuildParameters).FullName + "' interface.");
                }

                // null check paraType
                var xxx = paraType.BaseType.GetGenericTypeDefinition();
                var xxxx = xxx.BaseType.GetGenericTypeDefinition();

                // null check xxxx
                var serializer2 = xxxx.BaseType.GetGenericTypeDefinition();

                // Todo: This strange thingy ... very good checking and logging! :)
                // null check serializer2
                paraInstance = serializer2
                    .MakeGenericType(paraType)
                    .GetMethod("Deserialize", new[] { typeof(string) })
                    .Invoke(null, new object[] { firstChild.InnerXml });
            }
            else
            {

                if (!typeof(IMemberBuildParameters).IsAssignableFrom(paraType))
                {
                    throw new ArgumentOutOfRangeException("handler",
                        "Requesting a parameter type for '" + firstChild.Name +
                        "' (via Xml) for the '" + paraType.FullName + "' handler assigned type. " +
                    "Parameter types have to implement the '" + typeof(IMemberBuildParameters).FullName + "' interface.");
                }

                // Todo: really need this stuff here? should this be done in the handler construction?
                // for example: checking if a multibuilder has IMultiBuildParameters and a
                // normal builder has IMemberBuildParameters.
                var xmlParaType = firstChild.FirstChild.Name;
                if (xmlParaType != paraType.Name)
                {
                    throw new ArgumentOutOfRangeException("firstChild",
                        "Requesting a parameter type of '" + xmlParaType + "' (via Xml). " +
                    "Parameter types for the '" + handler.Type.FullName + "' builder have to be of the '" + paraType.FullName + "' kind.");
                }

                // null check paraType
                var xxxx = paraType.BaseType.GetGenericTypeDefinition();

                // null check xxxx
                var serializer2 = xxxx.BaseType.GetGenericTypeDefinition();

                // Todo: This strange thingy ... very good checking and logging! :)
                // null check serializer2
                paraInstance = serializer2
                    .MakeGenericType(paraType)
                    .GetMethod("Deserialize", new[] { typeof(string) })
                    .Invoke(null, new object[] { firstChild.InnerXml });
            }

            var setupPara = (IMemberBuildParameters)paraInstance;
            try
            {
                var propertyKey = handler.Type.FullName;

                // IBuilderData property;
                // var found = properties.TryGetValue(propertyKey, out property);
                // if (found)
                // {
                if (handler.IsMultiBuilder)
                {
                    var multiPara = setupPara as IMultiBuildParameters;
                    properties.AddDataItem("Multi." + handler.Type.FullName, multiPara.Id.ToString(), setupPara, true);
                 }
                 else
                 {
                    properties.AddDataItem(propertyKey, setupPara, true);
                 }

                // return setupPara;
                // }
                // properties.AddDataItem(propertyKey, setupPara);
            }
            catch (Exception ex)
            {
                var message = string.Format(
                    "Problem building {0} from serialization data.{1}{2}{3}",
                    handler.Type.FullName,
                    Environment.NewLine,
                    firstChild.InnerXml,
                    Environment.NewLine);
                throw new InvalidCastException(message, ex);
            }
            return setupPara;
        }
Example #6
0
        /// <summary>
        /// Get the parameters for the specified builder type, possibly creating it, if there
        /// is not yet one in the build data collection.
        /// </summary>
        /// <param name="builderType">Type of the builder to request a set of sample data for.</param>
        /// <param name="paraType">Type of the parameter class.</param>
        /// <param name="properties">The global properties storage.</param>
        /// <returns>
        /// A new instance of a matching parameter data set for the specified builder.
        /// </returns>
        /// <exception cref="KeyNotFoundException">The given <paramref name="builderType"/> was not present in the lookup.</exception>
        public IMemberBuildParameters GetParameters(Type builderType, Type paraType, IBuildDataDictionary properties)
        {
            Guard.NotNull(() => properties, properties);
            IBuilderData result;
            var found = properties.TryGetValue(string.Empty + builderType.FullName, out result);
            if (found)
            {
                return result as IMemberBuildParameters;
            }

            var paraInstance = Activator.CreateInstance(paraType);
            var setupPara = (IMemberBuildParameters)paraInstance;

            properties.AddDataItem(string.Empty + builderType.FullName, setupPara);
            return setupPara;
        }