Exemplo n.º 1
0
        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)));
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 4
0
        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"));
        }
Exemplo n.º 7
0
        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"]);
        }
Exemplo n.º 8
0
    /// <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);
    }
Exemplo n.º 9
0
        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());
            }
        }
Exemplo n.º 10
0
        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);
        }