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); }
// 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); }
// 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); }
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)); }
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)); }
/// <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)); }