Beispiel #1
0
        /// <summary>
        /// Sets configuration values. In .Net it sets the properties, in case of java it invokes set methods (since java does not have properties).
        /// </summary>
        private void SetConfiguration()
        {
            if (m_metadata.ComponentMetadataDefinition.ConfigurationType != null)
            {
                try
                {
                    if (m_metadata.ComponentMetadataDefinition.ConfigurationWrapperDefinition.IsJava == false)
                    {
                        PropertyInfo[] properties = LoadedComponent.Configuration.GetType().GetProperties();
                        foreach (PropertyInfo property in properties)
                        {
                            object value = m_metadata.ConfigWrapper.ConfigValues[property.Name].Value;

                            if (value != null)
                            {
                                var converter = System.ComponentModel.TypeDescriptor.GetConverter(value);

                                //in mono TypeDescriptor.GetConverter(value) does not return EnumValueTypeConverter for EnumValueCollection, 
                                //it returns just simply TypeConverter and that causes experiment to fail with any component that has any enum values
                                if (RuntimeInfo.IsRunInMono)
                                {
                                    var enumValueCollection = value as EnumValueCollection;
                                    if (enumValueCollection != null)
                                    {
                                        converter = new EnumValueTypeConverter(enumValueCollection);
                                    }
                                }

                                if (value.GetType().Equals(property.PropertyType) || property.PropertyType.IsAssignableFrom(value.GetType()))
                                {
                                    property.SetValue(LoadedComponent.Configuration, value, null);
                                }
                                else if (converter != null && converter.CanConvertTo(property.PropertyType))
                                {
                                    property.SetValue(LoadedComponent.Configuration, converter.ConvertTo(value, property.PropertyType), null);
                                }
                                else
                                {
                                    throw new ArgumentException(
                                        string.Format("Unable to convert Configuration value's type {0} to {1}", value.GetType(), property.PropertyType));
                                }
                            }
                        }
                    }
                    else
                    {
                        //for java
                        foreach (string propertyName in m_metadata.ConfigWrapper.ConfigValues.Keys)
                        {
                            String setterPrefix = "set";
                            MethodInfo method = LoadedComponent.Configuration.GetType().GetMethod(setterPrefix + propertyName);
                            if (method != null)
                            {
                                method.Invoke(LoadedComponent.Configuration, new object[] { m_metadata.ConfigWrapper.ConfigValues[propertyName].Value });
                            }
                        }
                    }
                }
                catch (TargetInvocationException ex)
                {
                    //it catches target invocation exception and rethrows inner exception, that we could show user actual message from component exception
                    throw ex.InnerException;
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Sets configuration values. In .Net it sets the properties, in case of java it invokes set methods (since java does not have properties).
        /// </summary>
        private void SetConfiguration()
        {
            if (m_metadata.ComponentMetadataDefinition.ConfigurationType != null)
            {
                try
                {
                    if (m_metadata.ComponentMetadataDefinition.ConfigurationWrapperDefinition.IsJava == false)
                    {
                        PropertyInfo[] properties = LoadedComponent.Configuration.GetType().GetProperties();
                        foreach (PropertyInfo property in properties)
                        {
                            object value = m_metadata.ConfigWrapper.ConfigValues[property.Name].Value;

                            if (value != null)
                            {
                                var converter = System.ComponentModel.TypeDescriptor.GetConverter(value);

                                //in mono TypeDescriptor.GetConverter(value) does not return EnumValueTypeConverter for EnumValueCollection,
                                //it returns just simply TypeConverter and that causes experiment to fail with any component that has any enum values
                                if (RuntimeInfo.IsRunInMono)
                                {
                                    var enumValueCollection = value as EnumValueCollection;
                                    if (enumValueCollection != null)
                                    {
                                        converter = new EnumValueTypeConverter(enumValueCollection);
                                    }
                                }

                                if (value.GetType().Equals(property.PropertyType) || property.PropertyType.IsAssignableFrom(value.GetType()))
                                {
                                    property.SetValue(LoadedComponent.Configuration, value, null);
                                }
                                else if (converter != null && converter.CanConvertTo(property.PropertyType))
                                {
                                    property.SetValue(LoadedComponent.Configuration, converter.ConvertTo(value, property.PropertyType), null);
                                }
                                else
                                {
                                    throw new ArgumentException(
                                              string.Format("Unable to convert Configuration value's type {0} to {1}", value.GetType(), property.PropertyType));
                                }
                            }
                        }
                    }
                    else
                    {
                        //for java
                        foreach (string propertyName in m_metadata.ConfigWrapper.ConfigValues.Keys)
                        {
                            String     setterPrefix = "set";
                            MethodInfo method       = LoadedComponent.Configuration.GetType().GetMethod(setterPrefix + propertyName);
                            if (method != null)
                            {
                                method.Invoke(LoadedComponent.Configuration, new object[] { m_metadata.ConfigWrapper.ConfigValues[propertyName].Value });
                            }
                        }
                    }
                }
                catch (TargetInvocationException ex)
                {
                    //it catches target invocation exception and rethrows inner exception, that we could show user actual message from component exception
                    throw ex.InnerException;
                }
            }
        }