public async Task GetEnabledFeatures_DefaultStrategyHandler_ReturnsTrue() { string featureId; var enabledFeatures = 4; var disabledFeatures = 3; var disabledFeatureIds = new List <string>(); for (var i = 0; i < enabledFeatures; i++) { featureId = Guid.NewGuid().ToString(); InMemoryFeatureStore.Features.TryAdd(featureId, FeatureExtensions.CreateFeatureWithDefaultStrategy(featureId, enabled: true)); } for (var i = 0; i < disabledFeatures; i++) { featureId = Guid.NewGuid().ToString(); disabledFeatureIds.Add(featureId); InMemoryFeatureStore.Features.TryAdd(featureId, FeatureExtensions.CreateFeatureWithDefaultStrategy(featureId, enabled: false)); } var features = _sut.GetEnabledFeatures(context: null); var featuresAsync = await _sut.GetEnabledFeaturesAsync(context : null, token : CancellationToken.None); Assert.Equal(0, features.Count(p => disabledFeatureIds.Any(f => f == p))); Assert.Equal(0, featuresAsync.Count(p => disabledFeatureIds.Any(f => f == p))); }
public void TestIssue83() { var geoJson = @"{ ""type"": ""Feature"", ""geometry"": { ""type"": ""Point"", ""coordinates"": [10.0, 60.0] }, ""id"": 1, ""properties"": { ""Name"": ""test"" } }"; var s = new GeoJsonSerializer(); Feature f = null; Assert.DoesNotThrow(() => f = s.Deserialize <Feature>(new JsonTextReader(new StringReader(geoJson))) ); Assert.IsNotNull(f, "f != null"); Assert.IsTrue(FeatureExtensions.HasID(f), "f.HasID()"); Assert.AreEqual(1, FeatureExtensions.ID(f), "f.ID != 1"); var sb = new StringBuilder(); var tw = new JsonTextWriter(new StringWriter(sb)); s.Serialize(tw, f); var geoJsonRes = sb.ToString(); CompareJson(geoJson, geoJsonRes); }
public void TestWhenFeatureCollectionHasBBox() { const string geoJsonString = @" { ""type"":""FeatureCollection"", ""features"":[ { ""geometry"":{ ""type"":""Point"", ""coordinates"":[ -6.09, 4.99 ] }, ""type"":""Feature"", ""properties"":{ ""prop1"":[ ""a"", ""b"" ] }, ""id"":1 } ], ""bbox"":[ -8.59, 4.35, -2.49, 10.73 ] }"; var featureCollection = new GeoJsonReader().Read <FeatureCollection>(geoJsonString); Assert.AreEqual(1, featureCollection.Count); Assert.That(FeatureExtensions.HasID(featureCollection[0])); var res = new GeoJsonWriter().Write(featureCollection); CompareJson(geoJsonString, res); }
private IList <TFeatureProviderType> CreateFeatureProviders(ModelItem item, ItemPolicy policy, List <PolicyDrivenFeatureConnector <TFeatureProviderType> .ProviderData> dataList) { UsesItemPolicyAttribute requiredPolicy = new UsesItemPolicyAttribute(policy.GetType()); Predicate <Type> match = (Predicate <Type>)(featureProviderType => { foreach (UsesItemPolicyAttribute itemPolicyAttribute in this.Manager.GetCustomAttributes(featureProviderType, typeof(UsesItemPolicyAttribute))) { if (itemPolicyAttribute.Equals((object)requiredPolicy) && new RequirementValidator(this.Manager, featureProviderType).MeetsRequirements) { if (dataList != null) { foreach (PolicyDrivenFeatureConnector <TFeatureProviderType> .ProviderData providerData in dataList) { if (providerData.Provider.GetType() == featureProviderType) { if (providerData.AssociatedPolicies == null || !providerData.AssociatedPolicies.Contains(policy)) { providerData.AssociatedPolicies = new PolicyDrivenFeatureConnector <TFeatureProviderType> .PolicyNode(policy, providerData.AssociatedPolicies); } return(false); } } } return(true); } } return(false); }); List <TFeatureProviderType> list = new List <TFeatureProviderType>(); if (!policy.IsSurrogate) { foreach (TFeatureProviderType featureProviderType in FeatureExtensions.CreateFeatureProviders(this.Manager, typeof(TFeatureProviderType), item, match)) { list.Add(featureProviderType); } } else { foreach (ModelItem modelItem in policy.GetSurrogateItems(item)) { foreach (TFeatureProviderType featureProviderType in FeatureExtensions.CreateFeatureProviders(this.Manager, typeof(TFeatureProviderType), modelItem, match)) { list.Add(featureProviderType); } } } return((IList <TFeatureProviderType>)list); }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); var objects = new List <FeatureDefinition>(); var web = this.ClientContext.Web; var site = this.ClientContext.Site; this.ClientContext.Load(web); this.ClientContext.Load(site); this.ClientContext.ExecuteQueryRetry(); // Site Features var siteFeatures = ClientContext.LoadQuery(ClientContext.Site.Features.Include(fctx => fctx.DefinitionId, fctx => fctx.DisplayName)); ClientContext.ExecuteQueryRetry(); foreach (Feature siteFeature in siteFeatures) { objects.Add(new FeatureDefinition() { Id = siteFeature.DefinitionId, DisplayName = siteFeature.DisplayName, Scope = FeatureDefinitionScope.Site, IsActivated = FeatureExtensions.IsFeatureActive(site, siteFeature.DefinitionId) }); } // Web Features var webFeatures = ClientContext.LoadQuery(ClientContext.Web.Features.Include(fctx => fctx.DefinitionId, fctx => fctx.DisplayName)); ClientContext.ExecuteQueryRetry(); foreach (var webFeature in webFeatures) { objects.Add(new FeatureDefinition() { Id = webFeature.DefinitionId, DisplayName = webFeature.DisplayName, Scope = FeatureDefinitionScope.Web, IsActivated = FeatureExtensions.IsFeatureActive(web, webFeature.DefinitionId) }); } // Export Objects WriteObject(objects, true); }
public void TestReaderFailsToParseProperties() { const string geojson = @"{ ""type"": ""Feature"", ""geometry"": { ""type"": ""Point"", ""coordinates"": [ 12.5851472, 55.68323837 ] }, ""crs"": { ""type"": ""name"", ""properties"": { ""name"": ""EPSG:4326"" } }, ""properties"": { ""id"": ""0a3f507a-b2e6-32b8-e044-0003ba298018"", ""status"": 1, ""vejkode"": ""4112"", ""vejnavn"": ""Landgreven"", ""adresseringsvejnavn"": ""Landgreven"", ""husnr"": ""10"", ""supplerendebynavn"": null, ""postnr"": ""1301"", ""postnrnavn"": ""København K"", ""kommunekode"": ""0101"" } }"; Feature f = null; Assert.That(() => f = new GeoJsonReader().Read <Feature>(geojson), Throws.Nothing); Assert.That(f.Attributes, Is.Not.Null); Assert.That(f.Attributes.Count, Is.EqualTo(10)); Assert.That(FeatureExtensions.HasID(f), Is.True); Assert.That(FeatureExtensions.ID(f), Is.EqualTo("0a3f507a-b2e6-32b8-e044-0003ba298018")); }
public void TestIssue88WithoutAdditionalProperties() { string expectedJson = @" { ""id"" : ""00000000-0000-0000-0000-000000000000"", ""type"" : ""Feature"", ""geometry"" : null, ""properties"" : { ""yesNo 1"" : false, ""date 1"" : ""2016-02-16T00:00:00"" } } "; GeoJsonSerializer serializer = new GeoJsonSerializer(); Feature feat = null; Assert.DoesNotThrow(() => { using (JsonReader reader = new JsonTextReader(new StringReader(expectedJson))) feat = serializer.Deserialize <Feature>(reader); }); Assert.IsNotNull(feat); Assert.IsTrue(FeatureExtensions.HasID(feat)); Assert.AreEqual("00000000-0000-0000-0000-000000000000", FeatureExtensions.ID(feat)); IGeometry geometry = feat.Geometry; Assert.IsNull(geometry); IAttributesTable attributes = feat.Attributes; Assert.IsNotNull(attributes); Assert.AreEqual(3, attributes.Count); Assert.AreEqual(FeatureExtensions.ID(feat), attributes["id"]); Assert.AreEqual(false, attributes["yesNo 1"]); Assert.AreEqual(DateTime.Parse("2016-02-16T00:00:00", CultureInfo.InvariantCulture), attributes["date 1"]); }
/// <summary> /// Apply features in the ASP.NET core application. Apply data migrations. /// </summary> /// <param name="app">The <see cref="IApplicationBuilder"/> to add the middleware to.</param> /// <returns>The <see cref="IApplicationBuilder"/> now configured to use features.</returns> public static IApplicationBuilder UseFeatures(this IApplicationBuilder app) { var serviceProvider = app.ApplicationServices.GetRequiredService <IServiceProvider>(); using (var scope = serviceProvider.CreateScope()) using (var context = scope.ServiceProvider.GetRequiredService <FeatureManagementDb>()) { var settings = scope.ServiceProvider.GetRequiredService <Settings>(); var logger = scope.ServiceProvider.GetRequiredService <ILogger <FeatureManagementDb> >(); // Apply migrations bool isRelational = context.Database.IsRelational(); bool hasPendingMigrations = isRelational && context.Database.GetPendingMigrations().Any(); bool shouldMigrate = hasPendingMigrations; if (shouldMigrate) { logger.LogInformation("Executing database migrations"); context.Database.Migrate(); } // Update Features table var featuresSet = context.Features; var intFeatureChoicesSet = context.IntFeatureChoices; var decimalFeatureChoicesSet = context.DecimalFeatureChoices; var stringFeatureChoicesSet = context.StringFeatureChoices; var groupFeaturesSet = context.GroupFeatures; var timeWindowFeaturesSet = context.TimeWindowFeatures; var existingFeatures = featuresSet .Include(f => f.IntFeatureChoices) .Include(f => f.DecimalFeatureChoices) .Include(f => f.StringFeatureChoices) .Include(f => f.GroupFeatures) .ToList(); var newFeatures = settings.Features .Select(f => { var feature = new Feature { Name = f.Name, Description = f.Description, UiPrefix = f.UiPrefix, UiSuffix = f.UiSuffix }; feature.ApplyConfiguration(f); if (f is IFeatureWithValueSettings <bool> fBool) { feature.ValueType = FeatureValueTypes.Boolean; feature.Server = f.Type == FeatureTypes.Server ? new ServerFeatureData { BooleanValue = fBool.Value } : null; } if (f is IFeatureWithValueSettings <int> fInt) { feature.ValueType = FeatureValueTypes.Integer; feature.Server = f.Type == FeatureTypes.Server ? new ServerFeatureData { IntValue = fInt.Value } : null; if (f is IFeatureWithChoicesSettings <int> fIntWithChoices) { feature.IntFeatureChoices = fIntWithChoices.Choices .Select(c => new IntFeatureChoice { Choice = c }) .ToList(); } else { feature.IntFeatureChoices = new List <IntFeatureChoice>(); } } if (f is IFeatureWithValueSettings <decimal> fDecimal) { feature.ValueType = FeatureValueTypes.Decimal; feature.Server = f.Type == FeatureTypes.Server ? new ServerFeatureData { DecimalValue = fDecimal.Value } : null; if (f is IFeatureWithChoicesSettings <decimal> fDecimalWithChoices) { feature.DecimalFeatureChoices = fDecimalWithChoices.Choices .Select(c => new DecimalFeatureChoice { Choice = c }) .ToList(); } else { feature.DecimalFeatureChoices = new List <DecimalFeatureChoice>(); } } if (f is IFeatureWithValueSettings <string> fString) { feature.ValueType = FeatureValueTypes.String; feature.Server = f.Type == FeatureTypes.Server ? new ServerFeatureData { StringValue = fString.Value } : null; if (f is IFeatureWithChoicesSettings <string> fStringWithChoices) { feature.StringFeatureChoices = fStringWithChoices.Choices .Select(c => new StringFeatureChoice { Choice = c }) .ToList(); } else { feature.StringFeatureChoices = new List <StringFeatureChoice>(); } } return(feature); }) .ToList(); var featuresToAdd = newFeatures .Where(f => !existingFeatures.Any(sf => sf.Name == f.Name && !FeatureExtensions.HasBreakingChanges(sf, f))); var featuresToUpdate = newFeatures .Where(f => existingFeatures.Any(sf => sf.Name == f.Name && !FeatureExtensions.HasBreakingChanges(sf, f))); var featuresToDelete = existingFeatures .Where(f => !newFeatures.Any(sf => sf.Name == f.Name && !FeatureExtensions.HasBreakingChanges(sf, f))); featuresSet.AddRange(featuresToAdd); foreach (var feature in featuresToUpdate) { var savedFeature = existingFeatures.Single(f => f.Name == feature.Name); savedFeature.Description = feature.Description; if (feature.ValueType == FeatureValueTypes.Integer) { var existingChoices = savedFeature.IntFeatureChoices; var choicesToAdd = feature.IntFeatureChoices .Where(c => !existingChoices.Any(ec => ec.Choice == c.Choice)); var choicesToDelete = existingChoices .Where(c => !feature.IntFeatureChoices.Any(ec => ec.Choice == c.Choice)); savedFeature.IntFeatureChoices.AddRange(choicesToAdd); intFeatureChoicesSet.RemoveRange(choicesToDelete); } if (feature.ValueType == FeatureValueTypes.Decimal) { var existingChoices = savedFeature.DecimalFeatureChoices; var choicesToAdd = feature.DecimalFeatureChoices .Where(c => !existingChoices.Any(ec => ec.Choice == c.Choice)); var choicesToDelete = existingChoices .Where(c => !feature.DecimalFeatureChoices.Any(ec => ec.Choice == c.Choice)); savedFeature.DecimalFeatureChoices.AddRange(choicesToAdd); decimalFeatureChoicesSet.RemoveRange(choicesToDelete); } if (feature.ValueType == FeatureValueTypes.String) { var existingChoices = savedFeature.StringFeatureChoices; var choicesToAdd = feature.StringFeatureChoices .Where(c => !existingChoices.Any(ec => ec.Choice == c.Choice)); var choicesToDelete = existingChoices .Where(c => !feature.StringFeatureChoices.Any(ec => ec.Choice == c.Choice)); savedFeature.StringFeatureChoices.AddRange(choicesToAdd); stringFeatureChoicesSet.RemoveRange(choicesToDelete); } var existingGroupFeatures = savedFeature.GroupFeatures; var groupFeaturesToAdd = feature.GroupFeatures .Where(gf => !existingGroupFeatures .Any(egf => egf.Group == gf.Group && egf.BooleanValue == gf.BooleanValue && egf.IntValue == gf.IntValue && egf.DecimalValue == gf.DecimalValue && egf.StringValue == gf.StringValue ) ); var groupFeaturesToDelete = existingGroupFeatures .Where(gf => !feature.GroupFeatures .Any(egf => egf.Group == gf.Group && egf.BooleanValue == gf.BooleanValue && egf.IntValue == gf.IntValue && egf.DecimalValue == gf.DecimalValue && egf.StringValue == gf.StringValue ) ); savedFeature.GroupFeatures.AddRange(groupFeaturesToAdd); groupFeaturesSet.RemoveRange(groupFeaturesToDelete); var existingTimeWindowFeatures = savedFeature.TimeWindowFeatures; var timeWindowFeaturesToAdd = feature.TimeWindowFeatures .Where(gf => !existingTimeWindowFeatures .Any(egf => egf.StartDate == gf.StartDate && egf.EndDate == gf.EndDate && egf.BooleanValue == gf.BooleanValue && egf.IntValue == gf.IntValue && egf.DecimalValue == gf.DecimalValue && egf.StringValue == gf.StringValue ) ); var timeWindowFeaturesToDelete = existingTimeWindowFeatures .Where(gf => !feature.TimeWindowFeatures .Any(egf => egf.StartDate == gf.StartDate && egf.EndDate == gf.EndDate && egf.BooleanValue == gf.BooleanValue && egf.IntValue == gf.IntValue && egf.DecimalValue == gf.DecimalValue && egf.StringValue == gf.StringValue ) ); savedFeature.TimeWindowFeatures.AddRange(timeWindowFeaturesToAdd); timeWindowFeaturesSet.RemoveRange(timeWindowFeaturesToDelete); } featuresSet.RemoveRange(featuresToDelete); context.SaveChanges(); } return(app); }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); LogVerbose("To enable SharePoint app sideLoading, enter Site Url, username and password"); var sideLoadingGuid = OfficeDevPnP.Core.Constants.FeatureId_Site_AppSideLoading; var siteurl = this.ClientContext.Url; var outfilepath = siteurl.Replace(':', '_').Replace('/', '_'); try { var web = this.ClientContext.Web; var site = this.ClientContext.Site; this.ClientContext.Load(web); this.ClientContext.Load(site); this.ClientContext.ExecuteQuery(); var siteFeatures = site.Features; this.ClientContext.Load(siteFeatures, fcol => fcol.Include(f => f.DisplayName, f => f.DefinitionId)); var webFeatures = web.Features; this.ClientContext.Load(webFeatures, wf => wf.Include(f => f.DisplayName, f => f.DefinitionId)); this.ClientContext.ExecuteQuery(); LogWarning("Now parsing site features."); siteFeatures.ToList().ForEach(a => { var status = FeatureExtensions.IsFeatureActive(site, a.DefinitionId); LogVerbose("Site Feature {0} with Id {1} and status {2}", a.DisplayName, a.DefinitionId, status); }); LogWarning("Now parsing web features."); webFeatures.ToList().ForEach(a => { var status = FeatureExtensions.IsFeatureActive(web, a.DefinitionId); LogVerbose("Web Feature {0} with Id {1} and status {2}", a.DisplayName, a.DefinitionId, status); }); var sideLoadingEnabled = AppCatalog.IsAppSideloadingEnabled(this.ClientContext); this.ClientContext.ExecuteQuery(); var sideLoadingFeature = siteFeatures.FirstOrDefault(f => f.DefinitionId == sideLoadingGuid); if (!sideLoadingEnabled.Value) { LogVerbose("SideLoading feature is not enabled on the site: {0}", siteurl); var siteFeature = site.Features.GetById(sideLoadingGuid); this.ClientContext.Load(siteFeature); this.ClientContext.ExecuteQuery(); if (siteFeature != null) { LogWarning("Side loading feature is found."); } site.Features.Add(sideLoadingGuid, true, Microsoft.SharePoint.Client.FeatureDefinitionScope.Site); this.ClientContext.ExecuteQuery(); LogVerbose("SideLoading feature enabled on site {0}", siteurl); } else { LogVerbose("SideLoading feature is already enabled on site {0}", siteurl); } } catch (Exception ex) { LogError(ex, "Error encountered when trying to enable SideLoading feature {0} with message {1}", siteurl, ex.Message.ToString()); } }
protected override ModelItem CreateItem(Type itemType, CreateOptions options, params object[] arguments) { ModelItem modelItem = (ModelItem)null; if (arguments == null || arguments.Length == 0) { modelItem = (ModelItem)this.viewModel.CreateSceneNode(itemType).ModelItem; } else { object obj = (object)null; try { obj = Activator.CreateInstance(itemType, arguments); } catch (Exception ex) { } if (obj != null) { modelItem = this.CreateItem(obj); } } if (modelItem != null && options == CreateOptions.InitializeDefaults) { foreach (DefaultInitializer defaultInitializer in Enumerable.Reverse <FeatureProvider>(FeatureExtensions.CreateFeatureProviders(this.viewModel.ExtensibilityManager.FeatureManager, typeof(DefaultInitializer), modelItem))) { defaultInitializer.InitializeDefaults(modelItem); } } return(modelItem); }