public override void DeployModel(object modelHost, DefinitionBase model)
        {
            var definition = model.WithAssertAndCast <TrustedAccessProviderDefinition>("model", value => value.RequireNotNull());

            SPTrustedAccessProvider spObject = GetCurrentTrustedAccessProvider(modelHost, definition);

            var assert = ServiceFactory.AssertService
                         .NewAssert(definition, spObject)
                         .ShouldNotBeNull(spObject);


            assert.ShouldBeEqual(m => m.Name, o => o.Name);

            if (!string.IsNullOrEmpty(definition.Description))
            {
                assert.ShouldBeEqual(m => m.Description, o => o.Description);
            }
            else
            {
                assert.SkipProperty(m => m.Description);
            }

            if (!string.IsNullOrEmpty(definition.MetadataEndPoint))
            {
                assert.ShouldBeEqual((p, s, d) =>
                {
                    var srcProp = s.GetExpressionValue(def => def.MetadataEndPoint);

                    var isValid = s.MetadataEndPoint.ToUpper() == d.MetadataEndPoint.ToString().ToUpper();

                    return(new PropertyValidationResult
                    {
                        Tag = p.Tag,
                        Src = srcProp,
                        Dst = null,
                        IsValid = isValid
                    });
                });
            }
            else
            {
                assert.SkipProperty(m => m.MetadataEndPoint);
            }

            assert.ShouldBeEqual((p, s, d) =>
            {
                var srcProp = s.GetExpressionValue(def => def.Certificate);

                var isValid = new X509Certificate2(s.Certificate).Thumbprint == d.SigningCertificate.Thumbprint;

                return(new PropertyValidationResult
                {
                    Tag = p.Tag,
                    Src = srcProp,
                    Dst = null,
                    IsValid = isValid
                });
            });
        }
        protected virtual SPTrustedAccessProvider GetCurrentTrustedAccessProvider(SPFarm spFarm, TrustedAccessProviderDefinition definition)
        {
            SPTrustedAccessProvider result = null;
            var securityTokenService       = SPSecurityTokenServiceManager.Local;

            result = securityTokenService.TrustedAccessProviders
                     .FirstOrDefault(p => !string.IsNullOrEmpty(p.Name) &&
                                     (p.Name.ToUpper() == definition.Name.ToUpper()));

            return(result);
        }
        private void DeployAftifact(FarmModelHost modelHost, SPFarm spFarm, TrustedAccessProviderDefinition definition)
        {
            var currentObject = GetCurrentTrustedAccessProvider(spFarm, definition);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = currentObject,
                ObjectType       = typeof(SPTrustedAccessProvider),
                ObjectDefinition = definition,
                ModelHost        = modelHost
            });

            if (currentObject == null)
            {
                var securityTokenService = SPSecurityTokenServiceManager.Local;

                if (securityTokenService == null)
                {
                    throw new SPMeta2Exception("SPSecurityTokenServiceManager.Local is NULL");
                }

                if (definition != null && definition.Certificate.Count() > 0)
                {
                    var certificate = new X509Certificate2(definition.Certificate);

                    currentObject = new SPTrustedAccessProvider(securityTokenService,
                                                                definition.Name,
                                                                definition.Description ?? string.Empty,
                                                                certificate);
                }
                else
                {
                    currentObject = new SPTrustedAccessProvider(securityTokenService,
                                                                definition.Name,
                                                                definition.Description ?? string.Empty);
                }
            }

#if !NET35
            if (!string.IsNullOrEmpty(definition.MetadataEndPoint))
            {
                if (currentObject.MetadataEndPoint != null)
                {
                    if (currentObject.MetadataEndPoint.AbsoluteUri.ToUpper() !=
                        new Uri(definition.MetadataEndPoint).AbsoluteUri.ToUpper())
                    {
                        currentObject.MetadataEndPoint = new Uri(definition.MetadataEndPoint);
                    }
                }
                else
                {
                    currentObject.MetadataEndPoint = new Uri(definition.MetadataEndPoint);
                }
            }
#endif

            if (definition != null && definition.Certificate.Count() > 0)
            {
                var certificate = new X509Certificate2(definition.Certificate);

                if (currentObject.SigningCertificate.Thumbprint != certificate.Thumbprint)
                {
                    currentObject.SigningCertificate = certificate;
                }
            }

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioned,
                Object           = currentObject,
                ObjectType       = typeof(SPTrustedAccessProvider),
                ObjectDefinition = definition,
                ModelHost        = modelHost
            });

            currentObject.Update();
        }