Example #1
0
        static bool ExtensionBuilderMatchesParent(ExtensionResolution ex, ResolutionResult resolutionResult)
        {
            var extensionBuilder = ex.ExtensionBuilder;

            var  parentExtensionPoint = ex.Parent as ExtensionPointResolution;
            bool result;

            if (parentExtensionPoint != null)
            {
                result = parentExtensionPoint.Children != null &&
                         (parentExtensionPoint.Children.Contains(extensionBuilder) ||
                          parentExtensionPoint.Path == extensionBuilder.ParentPath);  // 这是一个插件扩展了另外一个插件的 ExtensionSchema
                if (!result)
                {
                    resolutionResult.AddError(string.Format("The extension builder of the extension [{0}] is not a child of that of the extension point [{1}]!", ex.Head.Path, parentExtensionPoint.Name));
                }
                return(result);
            }

            var parentExtension = ex.Parent as ExtensionResolution;

            // the child extension builders of the extension builder for parent extension.
            result = parentExtension.ExtensionBuilder.Children.Contains(extensionBuilder) ||
                     parentExtension.ExtensionBuilder.Path == extensionBuilder.ParentPath;       // 这是一个插件扩展了另外一个插件的 ExtensionSchema
            if (!result)
            {
                resolutionResult.AddError(string.Format("The extension builder of the extension [{0}] is not a child of that of its parent [{1}]!", ex.Head.Path, parentExtension.Head.Path));
            }

            return(result);
        }
        static bool ExtensionBuilderMatchesParent(ExtensionResolution ex, IMessageDialog dialog)
        {
            var  extensionBuilder = ex.ExtensionBuilder;
            var  extensionPoint   = ex.Parent as ExtensionPointResolution;
            bool result;

            if (extensionPoint != null)
            {
                result = extensionPoint.Children != null && extensionPoint.Children.Contains(extensionBuilder);
                if (!result)
                {
                    dialog.AddError(string.Format("The extension builder of the extension [{0}] is not a child of that of the extension point [{1}]!", ex.Head.Path, extensionPoint.Id));
                }
                return(result);
            }

            var parentObj = ex.Parent as ExtensionResolution;

            // the child extension builders of the extension builder for parent extension.
            result = parentObj.ExtensionBuilder.Children.Contains(extensionBuilder);
            if (!result)
            {
                dialog.AddError(string.Format("The extension builder of the extension [{0}] is not a child of that of its parent [{1}]!", ex.Head.Path, parentObj.Head.Path));
            }
            return(result);
        }
 // returns null if sucessful, otherwise return an existing ExtensionPointResolution
 public bool TryRegisterExtension(ResolutionResult resolutionResult, ExtensionResolution newExtension, out ExtensionResolution existingExtension)
 {
     if (_path2Extensions.TryGetValue(newExtension.Head.Path, out existingExtension))
     {
         resolutionResult.AddError("##############");
         return(false);
     }
     _path2Extensions.Add(newExtension.Head.Path, newExtension);
     return(true);
 }
Example #4
0
 // returns null if sucessful, otherwise return an existing ExtensionPointResolution
 public bool TryRegisterExtension(IMessageDialog dialog, ExtensionResolution newExtension, out ExtensionResolution existingExtension)
 {
     if (_path2Extensions.TryGetValue(newExtension.Head.Path, out existingExtension))
     {
         dialog.AddError("");
         return(false);
     }
     _path2Extensions.Add(newExtension.Head.Path, newExtension);
     return(true);
 }
Example #5
0
        // Notes that this method will load the related assembly which defined the IExtensionBuilder implementation into memory.
        /// <summary>
        /// The required properties of extension builder (marked by ExtensionDataAttribute) must be provided by the extension data.
        /// </summary>
        /// <returns></returns>
        internal static bool ExtensionDataMatchesExtensionBuilder(this ExtensionResolution ex, ResolutionResult resolutionResult,
                                                                  ResolutionContext ctx, ConvertionManager convertionManager)
        {
            if (!ex.ExtensionBuilder.Type.HasProperties)
            {
                return(true);
            }

            var ebProps = ex.ExtensionBuilder.Type.Properties;

            return(ex.Data == null
                ? HasRequiredExtensionProperties(resolutionResult, ebProps)
                : ExtensionDataMatchesExtensionProperties(ctx, convertionManager, ex, resolutionResult, ebProps));
        }
 public void RegisterExtension(ExtensionResolution extension)
 {
     _path2Extensions.Add(extension.Head.Path, extension);
 }
Example #7
0
 public bool TryGetExtension(IMessageDialog dialog, string extensionPath, out ExtensionResolution extension)
 {
     return(_path2Extensions.TryGetValue(extensionPath, out extension));
 }
        internal bool TryParse(ResolutionResult resolutionResult, AddinResolution addin, Resolvable parent, out ExtensionResolution result)
        {
            result = null;
            ExtensionHeadResolution head;

            if (!Head.TryParse(resolutionResult, addin, out head))
            {
                return(false);
            }
            result = new NewOrUpdatedExtensionResolution(addin)
            {
                Data = (Data != null && Data.Items != null ? new ExtensionDataResolution(Data.Items) : null), Head = head, Parent = parent
            };
            if (_children != null)
            {
                foreach (var child in _children)
                {
                    ExtensionResolution ex;
                    if (!child.TryParse(resolutionResult, addin, result, out ex))
                    {
                        return(false);
                    }
                    result.AddChild(ex);
                }
            }
            return(true);
        }
        internal override bool Transform(string propName, string propData, ResolutionContext ctx, ConvertionManager cm, ExtensionResolution ex)
        {
            // convert to custom type (with an ObjectConverter registered in ConvertionManager).
            var objectConverter = cm.TryGet(typeof(string), ExtensionDataType);

            if (objectConverter == null)
            {
                return(false);
            }

            // if an property value is provided for the property name, try to convert it.
            object propValue;

            if (!objectConverter.TryConvert(propData, out propValue))
            {
                return(false);
            }

            var holder = new Int32Holder(propValue);

            ex.Data.AddDataHolder(propName, holder);

            return(true);
        }
 internal abstract bool Transform(string propName, string propData, ResolutionContext ctx, ConvertionManager cm, ExtensionResolution ex);
        internal override bool Transform(string propName, string propData, ResolutionContext ctx, ConvertionManager cm, ExtensionResolution ex)
        {
            TypeResolution type;

            // a type dependency is introduced here.
            // should it be added to the current addin's reference set?
            if (!ctx.TryGetAddinType(ex.DeclaringAddin, propData, out type))
            {
                return(false);
            }
            var holder = new LazyTypeHandleHolder(type);

            ex.Data.AddDataHolder(propName, holder);
            return(true);
        }
        // Notes that this method will load the related assembly which defined the IExtensionBuilder implementation into memory.
        /// <summary>
        /// The required properties of extension builder (marked by ExtensionDataAttribute) must be provided by the extension data.
        /// </summary>
        /// <returns></returns>
        internal static bool ExtensionDataMatchesExtensionBuilder(this ExtensionResolution ex, IMessageDialog dialog,
                                                                  ResolutionContext ctx, ConvertionManager convertionManager)
        {
            var ebProperties = ex.ExtensionBuilder.Type.GetSettableRuntimeProperties();

            if (ebProperties == null)
            {
                return(true);
            }

            var data = ex.Data;

            foreach (var ebProp in ebProperties)
            {
                var    propName = ebProp.Name;
                string propInput;
                if (!data.TryGetString(propName, out propInput))
                {
                    var exPropAttrib = ebProp.GetCustomAttribute <ExtensionPropertyAttribute>(false, false);
                    if (exPropAttrib != null && exPropAttrib.Required)
                    {
                        dialog.AddError("a required property is missing!");
                        return(false);
                    }
                    continue;
                }

                #region specific types
                if (ebProp.PropertyType == typeof(string))
                {
                    var holder = new StringHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }

                // convert to TypeId
                if (ebProp.PropertyType == typeof(TypeId))
                {
                    TypeResolution type;
                    // a type dependency is introduced here.
                    // should it be added to the current addin's reference set?
                    if (!ctx.TryGetAddinType(ex.DeclaringAddin, propInput, out type))
                    {
                        dialog.AddError("");
                        return(false);
                    }
                    var holder = new LazyTypeIdHolder(type);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                #endregion

                // convert to custom type (with an ObjectConverter registered in ConvertionManager).
                var objectConverter = convertionManager.TryGet(typeof(string), ebProp.PropertyType);
                if (objectConverter == null)
                {
                    dialog.AddError("No converter is registered for !");
                    return(false);
                }

                // if an property value is provided for the property name, try to convert it.
                object propValue;
                if (!objectConverter.TryConvert(propInput, out propValue))
                {
                    dialog.AddError("The string [] can not be converted to !");
                    return(false);
                }

                #region common types
                if (ebProp.PropertyType == typeof(Int32))
                {
                    var holder = new Int32Holder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(Boolean))
                {
                    var holder = new BooleanHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(Version))
                {
                    var holder = new VersionHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(DateTime))
                {
                    var holder = new DateTimeHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(Guid))
                {
                    var holder = new GuidHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(TimeSpan))
                {
                    var holder = new TimeSpanHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(Int64))
                {
                    var holder = new Int64Holder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(UInt64))
                {
                    var holder = new UInt64Holder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(UInt32))
                {
                    var holder = new UInt32Holder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(Int16))
                {
                    var holder = new Int16Holder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(UInt16))
                {
                    var holder = new UInt16Holder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(Byte))
                {
                    var holder = new ByteHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(SByte))
                {
                    var holder = new SByteHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(Char))
                {
                    var holder = new CharHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(Decimal))
                {
                    var holder = new DecimalHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(Double))
                {
                    var holder = new DoubleHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                if (ebProp.PropertyType == typeof(Single))
                {
                    var holder = new SingleHolder(propInput);
                    data.AddSerializableHolder(propName, holder);
                    continue;
                }
                #endregion
            }

            return(true);
        }
 /// <summary>
 /// The extension builders used to build the current extension and the sibling extension (if exists) must be a child of that
 /// of the parent extension or extension point.
 /// </summary>
 internal static bool ExtensionBuildersMatchParent(this ExtensionResolution ex, IMessageDialog dialog)
 {
     return(ex.Sibling == null
         ? ExtensionBuilderMatchesParent(ex, dialog)
         : ExtensionBuilderMatchesParent(ex, dialog) && ExtensionBuilderMatchesParent(ex.Sibling, dialog));
 }
Example #14
0
        static bool ExtensionDataMatchesExtensionProperties(ResolutionContext ctx, ConvertionManager convertionManager,
                                                            ExtensionResolution ex, ResolutionResult resolutionResult, IEnumerable <PropertyDefinition> ebProps)
        {
            var data = ex.Data;

            if (ex is NewOrUpdatedExtensionResolution)
            {
                foreach (var ebProp in ebProps)
                {
                    var    propName = ebProp.Name;
                    string propData;
                    if (!data.TryGetString(propName, out propData))
                    {
                        if (ExtensionPropertyIsRequired(ebProp))
                        {
                            resolutionResult.AddError(string.Format("A required property [{0}] of extension builder [{1}] is not provided with a data!", ebProp.Name, ex.ExtensionBuilder.Type.TypeName));
                            return(false);
                        }
                        continue;
                    }

                    var propType = ebProp.PropertyType.SafeResolve();

                    DataTransformer dataTransformer;
                    if (!ctx.TryGetDataTransformer(propType.Module.Assembly.FullName, propType.MetadataToken.ToInt32(), out dataTransformer))
                    {
                        resolutionResult.AddError(string.Format("No data transformer is registered for type [{0}]!", propType.FullName));
                        return(false);
                    }

                    if (!dataTransformer.Transform(propName, propData, ctx, convertionManager, ex))
                    {
                        resolutionResult.AddError(string.Format("Can not transform from value [{1}] to type [{0}]!", propType.FullName, propData));
                        return(false);
                    }
                }
            }
            else
            {
                foreach (var ebProp in ebProps)
                {
                    var        propName = ebProp.Name;
                    DataHolder dataHolder;
                    if (!data.TryGetDataHolder(propName, out dataHolder))
                    {
                        if (ExtensionPropertyIsRequired(ebProp))
                        {
                            resolutionResult.AddError(string.Format("A required property [{0}] of extension builder [{1}] is not provided with a data!", ebProp.Name, ex.ExtensionBuilder.Type.TypeName));
                            return(false);
                        }
                        continue;
                    }

                    var propType = ebProp.PropertyType.SafeResolve();

                    DataTransformer dataTransformer;
                    if (!ctx.TryGetDataTransformer(propType.Module.Assembly.FullName, propType.MetadataToken.ToInt32(), out dataTransformer))
                    {
                        resolutionResult.AddError(string.Format("No data transformer is registered for type [{0}]!", propType.FullName));
                        return(false);
                    }

                    if (!dataTransformer.CanTransform(dataHolder))
                    {
                        resolutionResult.AddError(string.Format("Can not transform from value [{1}] to type [{0}]!", propType.FullName, dataHolder.Value));
                        return(false);
                    }
                }
            }

            return(true);
        }
 public void UnregisterExtension(ExtensionResolution extension)
 {
     _path2Extensions.Remove(extension.Head.Path);
 }
        internal override bool Transform(string propName, string propData, ResolutionContext ctx, ConvertionManager cm, ExtensionResolution ex)
        {
            var holder = new StringHolder(propData);

            ex.Data.AddDataHolder(propName, holder);
            return(true);
        }
 public bool TryGetExtension(ResolutionResult resolutionResult, string extensionPath, out ExtensionResolution extension)
 {
     return(_path2Extensions.TryGetValue(extensionPath, out extension));
 }
Example #18
0
 /// <summary>
 /// The extension builders used to build the current extension and the sibling extension (if exists) must be a child of that
 /// of the parent extension or extension point.
 /// </summary>
 internal static bool ExtensionBuildersMatchParent(this ExtensionResolution ex, ResolutionResult resolutionResult)
 {
     return(ex.Sibling == null
         ? ExtensionBuilderMatchesParent(ex, resolutionResult)
         : ExtensionBuilderMatchesParent(ex, resolutionResult) && ExtensionBuilderMatchesParent(ex.Sibling, resolutionResult));
 }