public void Bendy_CanSetAndGetLazyProperty() { // Arrange var bendyObject = new BendyObject(); var delegateTest = 0; // Act bendyObject.AddLazy("MyProperty", () => "this is my value"); bendyObject.AddLazy("FirstDelegate", () => { delegateTest = 1; return("value 1"); }); bendyObject.AddLazy("SecondDelegate", () => { delegateTest = 2; return("value 2"); }); dynamic bendyDynamic = bendyObject.AsDynamic(); // Assert Assert.AreEqual("this is my value", bendyDynamic.MyProperty); Assert.AreEqual("value 2", bendyDynamic.SecondDelegate); Assert.AreEqual("value 1", bendyDynamic.FirstDelegate); Assert.AreEqual(1, delegateTest); }
public void SetUp() { var assemblies = new[] { typeof(Umbraco.Tests.Extensions.TestDynamicExtensions).Assembly }; var supportedDynamicTypes = new[] { typeof(Content), typeof(BendyObject) }; var supportedDynamicFieldTypes = new[] { typeof(Content), typeof(TypedAttribute), typeof(BendyObject) }; var bendyMethods = DynamicExtensionsHelper.GetExtensions(assemblies, supportedDynamicTypes); var subBendyMethods = DynamicExtensionsHelper.GetExtensions<DynamicFieldExtensionAttribute>(assemblies, supportedDynamicFieldTypes); var bendy = new BendyObject(); BendyObjectExtensionsHelper.ApplyDynamicExtensions<Content>(bendy, bendyMethods); var content = new Content(); _bendy = bendy; _bendy["__OriginalItem"] = content; var attrType1 = new AttributeType {RenderTypeProvider = CorePluginConstants.FileUploadPropertyEditorId}; var attrDef1 = new AttributeDefinition {AttributeType = attrType1}; var attr1 = new TypedAttribute(attrDef1); var subBendy1 = new BendyObject(); subBendy1["__OriginalItem"] = attr1; subBendy1.AddLazy("__Parent", () => bendy); subBendy1["__ParentKey"] = "Test"; BendyObjectExtensionsHelper.ApplyDynamicFieldExtensions(content, CorePluginConstants.FileUploadPropertyEditorId, subBendy1, subBendyMethods); _bendy["Test"] = subBendy1; var attrType2 = new AttributeType { RenderTypeProvider = CorePluginConstants.TreeNodePickerPropertyEditorId }; var attrDef2 = new AttributeDefinition { AttributeType = attrType2 }; var attr2 = new TypedAttribute(attrDef2); var subBendy2 = new BendyObject(); subBendy2["__OriginalItem"] = attr2; subBendy2.AddLazy("__Parent", () => bendy); subBendy2["__ParentKey"] = "Test2"; BendyObjectExtensionsHelper.ApplyDynamicFieldExtensions(content, CorePluginConstants.TreeNodePickerPropertyEditorId, subBendy2, subBendyMethods); _bendy["Test2"] = subBendy2; }
public void Bendy_CanSetAndGetEnumerableProperty() { // Arrange dynamic bendyObject = new BendyObject(); var numbers = new[] { 1, 2, 3, 4, 5 }; dynamic bendy1 = new BendyObject(); bendy1.Blah = "blah1"; dynamic bendy2 = new BendyObject(); bendy2.Blah = "blah2"; var alreadyBendy = new[] { bendy1, bendy2 }; var bendyEnumWithLazy = new BendyObject(); // Act bendyObject.Numbers = numbers; bendyObject.AlreadyBendy = alreadyBendy; bendyEnumWithLazy.AddLazy("Lazy", () => alreadyBendy); // Assert int count = 0; foreach (var number in bendyObject.Numbers) { count++; Assert.AreEqual(count, number); } Assert.AreEqual(5, count); int alreadyBendyCount = 0; foreach (var already in bendyObject.AlreadyBendy) { alreadyBendyCount++; //Assert.AreEqual("blah" + alreadyBendyCount, already.Blah); } Assert.AreEqual(2, alreadyBendyCount); dynamic lazyBendy = bendyEnumWithLazy; int alreadyBendyLazyCount = 0; foreach (var already in lazyBendy.Lazy) { alreadyBendyLazyCount++; Assert.AreEqual("blah" + alreadyBendyLazyCount, already.Blah); } Assert.AreEqual(2, alreadyBendyLazyCount); }
public void SetUp() { var assemblies = new[] { typeof(Rebel.Tests.Extensions.TestDynamicExtensions).Assembly }; var supportedDynamicTypes = new[] { typeof(Content), typeof(BendyObject) }; var supportedDynamicFieldTypes = new[] { typeof(Content), typeof(TypedAttribute), typeof(BendyObject) }; var bendyMethods = DynamicExtensionsHelper.GetExtensions(assemblies, supportedDynamicTypes); var subBendyMethods = DynamicExtensionsHelper.GetExtensions <DynamicFieldExtensionAttribute>(assemblies, supportedDynamicFieldTypes); var bendy = new BendyObject(); BendyObjectExtensionsHelper.ApplyDynamicExtensions <Content>(bendy, bendyMethods); var content = new Content(); _bendy = bendy; _bendy["__OriginalItem"] = content; var attrType1 = new AttributeType { RenderTypeProvider = CorePluginConstants.FileUploadPropertyEditorId }; var attrDef1 = new AttributeDefinition { AttributeType = attrType1 }; var attr1 = new TypedAttribute(attrDef1); var subBendy1 = new BendyObject(); subBendy1["__OriginalItem"] = attr1; subBendy1.AddLazy("__Parent", () => bendy); subBendy1["__ParentKey"] = "Test"; BendyObjectExtensionsHelper.ApplyDynamicFieldExtensions(content, CorePluginConstants.FileUploadPropertyEditorId, subBendy1, subBendyMethods); _bendy["Test"] = subBendy1; var attrType2 = new AttributeType { RenderTypeProvider = CorePluginConstants.TreeNodePickerPropertyEditorId }; var attrDef2 = new AttributeDefinition { AttributeType = attrType2 }; var attr2 = new TypedAttribute(attrDef2); var subBendy2 = new BendyObject(); subBendy2["__OriginalItem"] = attr2; subBendy2.AddLazy("__Parent", () => bendy); subBendy2["__ParentKey"] = "Test2"; BendyObjectExtensionsHelper.ApplyDynamicFieldExtensions(content, CorePluginConstants.TreeNodePickerPropertyEditorId, subBendy2, subBendyMethods); _bendy["Test2"] = subBendy2; }
public static dynamic Bend(this Content content, IHiveManager hiveManager, IMembershipService <Member> membershipService, IPublicAccessService publicAccessService, IEnumerable <Assembly> dynamicExtensionAssemblies = null) { if (content == null) { return(null); } var bendy = new BendyObject(content); dynamic dynamicBendy = bendy; //get all fields that have a value var attributesWithValue = content.Attributes.Where(typedAttribute => typedAttribute.Values.Any()).ToArray(); foreach (var attrib in attributesWithValue) { //if the default value doesn't exist, then add to sub bendy... normally this occurs if the // property editor is saving custom values var defaultval = attrib.Values.GetDefaultValue(); if (attrib.Values.Count > 1 || defaultval == null) { //03/05/12 (SD). we only need to create one sub bendy, then assign it to each property alias // this used to create 2 of them not sure why as this will just have more overhead. // This also used to create a new bendy object, then iterate over each of the attrib.Values and //manually assign each value using AddToBendy. This has changed so that we can better support //multi-value properties and because the BendyObject ctor now has support to check for IDictionary //which automatically adds each dictionary key/value as a property. var subBendy = new BendyObject(attrib.Values); AddToBendy(bendy, attrib.AttributeDefinition.Alias, subBendy); subBendy["__OriginalItem"] = attrib; subBendy.AddLazy("__Parent", () => bendy); subBendy["__ParentKey"] = attrib.AttributeDefinition.Alias; BendyObjectExtensionsHelper.ApplyDynamicFieldExtensions(content, attrib.AttributeDefinition.AttributeType.RenderTypeProvider, subBendy, dynamicExtensionAssemblies); BendyObjectExtensionsHelper.ApplyDynamicExtensions <TypedAttribute>(subBendy, dynamicExtensionAssemblies); AddToBendy(bendy, attrib.AttributeDefinition.Alias, subBendy); } else { AddToBendy(bendy, attrib.AttributeDefinition.Alias, defaultval); } } // Now put in rudimentary default values for any that don't have a value // TODO: Get the default values from the backoffice/AttributeDefinition/AttributeType involved in this foreach (var attrib in content.Attributes.Except(attributesWithValue)) { object defaultValue = null; switch (attrib.AttributeDefinition.AttributeType.SerializationType.DataSerializationType) { case DataSerializationTypes.Date: defaultValue = DateTime.MinValue; break; case DataSerializationTypes.Guid: defaultValue = Guid.Empty; break; case DataSerializationTypes.SmallInt: case DataSerializationTypes.LargeInt: defaultValue = 0; break; case DataSerializationTypes.Decimal: defaultValue = 0d; break; case DataSerializationTypes.ByteArray: defaultValue = new byte[] { }; break; case DataSerializationTypes.Boolean: defaultValue = false; break; case DataSerializationTypes.String: case DataSerializationTypes.LongString: defaultValue = string.Empty; break; } AddToBendy(bendy, attrib.AttributeDefinition.Alias, defaultValue); } bendy["__OriginalItem"] = content; bendy.WhenItemNotFound = (bent, membername) => { if (membername.IsNullOrWhiteSpace()) { return(new BendyObject()); } // Support recursively looking up a property similarly to v4 if (membername.StartsWith("_") && membername.ElementAt(1).IsLowerCase()) { return(content.Field(membername.TrimStart('_'), true)); } // Support pluralised document-type aliases inferring a query if (membername.EndsWith("s", StringComparison.InvariantCultureIgnoreCase)) { var alias = membername.TrimEnd("s"); var up = alias.StartsWith("Ancestor", StringComparison.InvariantCultureIgnoreCase); if (up) { alias = alias.TrimStart("Ancestor"); } dynamic theBendy = bent; return(up ? theBendy.AncestorsOrSelf.Where("NodeTypeAlias == @0", alias) : theBendy.DescendantsOrSelf.Where("NodeTypeAlias == @0", alias)); } return(new BendyObject()); }; bendy.AddLazy("AllAncestorIds", () => content.AllAncestorIds()); bendy.AddLazy("Ancestors", () => { var ancestorIds = content.AllAncestorIds(); return(new DynamicContentList(content.Id, hiveManager, membershipService, publicAccessService, new BendyObject(), ancestorIds)); }); bendy.AddLazy("AllAncestorIdsOrSelf", () => content.AllAncestorIdsOrSelf()); bendy.AddLazy("AncestorsOrSelf", () => { var ancestorIds = content.AllAncestorIdsOrSelf(); return(new DynamicContentList(content.Id, hiveManager, membershipService, publicAccessService, new BendyObject(), ancestorIds)); }); bendy.AddLazy("AllDescendantIds", () => content.AllDescendantIds()); bendy.AddLazy("Descendants", () => { var descendantContentIds = content.AllDescendantIds(); return(new DynamicContentList(content.Id, hiveManager, membershipService, publicAccessService, new BendyObject(), descendantContentIds)); }); bendy.AddLazy("AllDescendantIdsOrSelf", () => content.AllDescendantIdsOrSelf()); bendy.AddLazy("DescendantsOrSelf", () => { var descendantContentIds = content.AllDescendantIdsOrSelf(); return(new DynamicContentList(content.Id, hiveManager, membershipService, publicAccessService, new BendyObject(), descendantContentIds)); }); bendy.AddLazy("AllChildIds", () => content.AllChildIds(hiveManager)); bendy.AddLazy("Children", () => { var childIds = content.AllChildIds(hiveManager); return(new DynamicContentList(content.Id, hiveManager, membershipService, publicAccessService, new BendyObject(), childIds)); }); bendy.AddLazy("Parent", () => content.ParentContent(hiveManager).Bend(hiveManager, membershipService, publicAccessService)); bendy.AddLazy("Path", () => content.GetPath(hiveManager)); bendy.AddLazy("PathById", () => content.GetPath(hiveManager)); bendy.AddLazy("Level", () => content.GetPath(hiveManager).Level); //Add lazy url property bendy.AddLazy("Url", content.NiceUrl); bendy.AddLazy("NiceUrl", content.NiceUrl); bendy.AddLazy("NodeTypeAlias", () => content.ContentType.IfNotNull(x => x.Alias, string.Empty)); bendy.AddLazy("Template", () => content.CurrentTemplate.IfNotNull(x => x.Alias, string.Empty)); bendy.AddLazy("TemplateId", () => content.CurrentTemplate.IfNotNull(x => x.Id, HiveId.Empty)); bendy.AddLazy("TemplateFileName", () => content.CurrentTemplate.IfNotNull(x => (string)x.Id.Value, string.Empty)); bendy.AddLazy("CreateDate", () => content.UtcCreated); bendy.AddLazy("UpdateDate", () => content.UtcModified); bendy.AddLazy("StatusChangedDate", () => content.UtcStatusChanged); dynamicBendy.ContentType = content.ContentType; var nodeNameAlias = NodeNameAttributeDefinition.AliasValue.ToRebelAlias(StringAliasCaseType.PascalCase); try { dynamicBendy.Name = bendy[nodeNameAlias].Name; dynamicBendy.UrlName = bendy[nodeNameAlias].UrlName; } catch { /* Nothing */ } dynamicBendy.Id = content.Id; // Add any dynamic registered methods BendyObjectExtensionsHelper.ApplyDynamicExtensions <Content>(bendy, dynamicExtensionAssemblies); return(dynamicBendy); }
public static dynamic Bend(this Content content, IHiveManager hiveManager) { if (content == null) { return(null); } var bendy = new BendyObject(content); dynamic dynamicBendy = bendy; //get all fields that have a value foreach (var typedAttribute in content.Attributes.Where(typedAttribute => typedAttribute.Values.Any())) { //if there are more than 1 value, put them into a sub bendy if (typedAttribute.Values.Count() > 1) { var subBendy1 = new BendyObject(); var subBendy2 = new BendyObject(); foreach (var v in typedAttribute.Values) { subBendy1[v.Key.ToUmbracoAlias(StringAliasCaseType.PascalCase)] = v.Value; subBendy2[v.Key.ToUmbracoAlias(StringAliasCaseType.Unchanged)] = v.Value; } bendy[typedAttribute.AttributeDefinition.Alias.ToUmbracoAlias(StringAliasCaseType.PascalCase)] = subBendy1; bendy[typedAttribute.AttributeDefinition.Alias.ToUmbracoAlias(StringAliasCaseType.Unchanged)] = subBendy2; } else { bendy[typedAttribute.AttributeDefinition.Alias.ToUmbracoAlias(StringAliasCaseType.PascalCase)] = typedAttribute.Values.First().Value; bendy[typedAttribute.AttributeDefinition.Alias.ToUmbracoAlias(StringAliasCaseType.Unchanged)] = typedAttribute.Values.First().Value; } } bendy["__OriginalItem"] = content; bendy.WhenItemNotFound = (bent, membername) => { if (membername.IsNullOrWhiteSpace()) { return(new BendyObject()); } // Support recursively looking up a property similarly to v4 if (membername.StartsWith("_") && membername.ElementAt(1).IsLowerCase()) { return(content.Field(membername.TrimStart('_'), true)); } // Support pluralised document-type aliases inferring a query if (membername.EndsWith("s", StringComparison.InvariantCultureIgnoreCase)) { var alias = membername.TrimEnd("s"); var up = alias.StartsWith("Ancestor", StringComparison.InvariantCultureIgnoreCase); if (up) { alias = alias.TrimStart("Ancestor"); } dynamic theBendy = bent; return(up ? theBendy.AncestorsOrSelf.Where("NodeTypeAlias == @0", alias) : theBendy.DescendantsOrSelf.Where("NodeTypeAlias == @0", alias)); } return(new BendyObject()); }; bendy.AddLazy("AllAncestorIds", () => content.AllAncestorIds()); bendy.AddLazy("Ancestors", () => { var ancestorIds = content.AllAncestorIds(); return(new DynamicContentList(content.Id, hiveManager, new BendyObject(), ancestorIds)); }); bendy.AddLazy("AllAncestorIdsOrSelf", () => content.AllAncestorIdsOrSelf()); bendy.AddLazy("AncestorsOrSelf", () => { var ancestorIds = content.AllAncestorIdsOrSelf(); return(new DynamicContentList(content.Id, hiveManager, new BendyObject(), ancestorIds)); }); bendy.AddLazy("AllDescendantIds", () => content.AllDescendantIds()); bendy.AddLazy("Descendants", () => { var descendantContentIds = content.AllDescendantIds(); return(new DynamicContentList(content.Id, hiveManager, new BendyObject(), descendantContentIds)); }); bendy.AddLazy("AllDescendantIdsOrSelf", () => content.AllDescendantIdsOrSelf()); bendy.AddLazy("DescendantsOrSelf", () => { var descendantContentIds = content.AllDescendantIdsOrSelf(); return(new DynamicContentList(content.Id, hiveManager, new BendyObject(), descendantContentIds)); }); bendy.AddLazy("AllChildIds", () => content.AllChildIds()); bendy.AddLazy("Children", () => { var childIds = content.AllChildIds(); return(new DynamicContentList(content.Id, hiveManager, new BendyObject(), childIds)); }); bendy.AddLazy("Parent", () => content.ParentContent().Bend()); bendy.AddLazy("Path", () => content.GetPath(hiveManager)); bendy.AddLazy("PathById", () => content.GetPath(hiveManager)); bendy.AddLazy("Level", () => content.GetPath(hiveManager).Level); //Add lazy url property bendy.AddLazy("Url", content.NiceUrl); bendy.AddLazy("NiceUrl", content.NiceUrl); bendy.AddLazy("NodeTypeAlias", () => content.ContentType.IfNotNull(x => x.Alias, string.Empty)); bendy.AddLazy("Template", () => content.CurrentTemplate.IfNotNull(x => x.Alias, string.Empty)); bendy.AddLazy("TemplateId", () => content.CurrentTemplate.IfNotNull(x => x.Id, HiveId.Empty)); bendy.AddLazy("TemplateFileName", () => content.CurrentTemplate.IfNotNull(x => (string)x.Id.Value, string.Empty)); bendy.AddLazy("CreateDate", () => content.UtcCreated); bendy.AddLazy("UpdateDate", () => content.UtcModified); bendy.AddLazy("StatusChangedDate", () => content.UtcStatusChanged); dynamicBendy.ContentType = content.ContentType; var nodeNameAlias = NodeNameAttributeDefinition.AliasValue.ToUmbracoAlias(StringAliasCaseType.PascalCase); try { dynamicBendy.Name = bendy[nodeNameAlias].Name; dynamicBendy.UrlName = bendy[nodeNameAlias].UrlName; } catch { /* Nothing */ } dynamicBendy.Id = content.Id; return(dynamicBendy); }