Пример #1
0
        internal static void SetFormmattedValues(XrmDb db, Entity entity, EntityMetadata metadata)
        {
            var validMetadata = metadata.Attributes
                                .Where(a => IsValidForFormattedValues(a));

            var formattedValues = new List <KeyValuePair <string, string> >();

            foreach (var a in entity.Attributes)
            {
                if (a.Value == null)
                {
                    continue;
                }
                var metadataAtt        = validMetadata.Where(m => m.LogicalName == a.Key).FirstOrDefault();
                var formattedValuePair = new KeyValuePair <string, string>(a.Key, Utility.GetFormattedValueLabel(db, metadataAtt, a.Value, entity));
                if (formattedValuePair.Value != null)
                {
                    formattedValues.Add(formattedValuePair);
                }
            }

            if (formattedValues.Count > 0)
            {
                entity.FormattedValues.AddRange(formattedValues);
            }
        }
Пример #2
0
        internal void AddRolesForBusinessUnit(XrmDb db, EntityReference businessUnit)
        {
            AddRoleTemplatesForBusinessUnit(db, businessUnit);

            foreach (var sr in SecurityRoles.Values)
            {
                var roleMeta = Metadata.EntityMetadata.GetMetadata("role");
                var role     = new Entity("role")
                {
                    Id = Guid.NewGuid()
                };
                role[roleMeta.PrimaryIdAttribute] = role.Id;
                role["businessunitid"]            = businessUnit;
                role["name"] = sr.Name;
                if (sr.RoleTemplateId != Guid.Empty)
                {
                    role["roletemplateid"] = new EntityReference("roletemplate", sr.RoleTemplateId);
                }
                role["createdby"]  = Core.AdminUserRef;
                role["createdon"]  = DateTime.UtcNow.Add(Core.TimeOffset);
                role["modifiedby"] = Core.AdminUserRef;
                role["modifiedon"] = DateTime.UtcNow.Add(Core.TimeOffset);
                db.Add(role);
                SecurityRoleMapping.Add(role.Id, sr.RoleId);
            }
        }
Пример #3
0
        private List <RequestHandler> GetRequestHandlers(XrmDb db) => new List <RequestHandler>
        {
            new CreateRequestHandler(this, db, metadata, security),
            new UpdateRequestHandler(this, db, metadata, security),
            new RetrieveMultipleRequestHandler(this, db, metadata, security),
            new RetrieveRequestHandler(this, db, metadata, security),
            new DeleteRequestHandler(this, db, metadata, security),
            new SetStateRequestHandler(this, db, metadata, security),
            new AssignRequestHandler(this, db, metadata, security),
            new AssociateRequestHandler(this, db, metadata, security),
            new DisassociateRequestHandler(this, db, metadata, security),
            new MergeRequestHandler(this, db, metadata, security),
            new RetrieveVersionRequestHandler(this, db, metadata, security),
            new FetchXmlToQueryExpressionRequestHandler(this, db, metadata, security),
            new ExecuteMultipleRequestHandler(this, db, metadata, security),
            new RetrieveEntityRequestHandler(this, db, metadata, security),
            new RetrieveRelationshipRequestHandler(this, db, metadata, security),
            new GrantAccessRequestHandler(this, db, metadata, security),
            new ModifyAccessRequestHandler(this, db, metadata, security),
            new RevokeAccessRequestHandler(this, db, metadata, security),
            new WinOpportunityRequestHandler(this, db, metadata, security),
            new LoseOpportunityRequestHandler(this, db, metadata, security),
            new RetrieveAllOptionSetsRequestHandler(this, db, metadata, security),
            new RetrieveOptionSetRequestHandler(this, db, metadata, security),
            new RetrieveExchangeRateRequestHandler(this, db, metadata, security),
            new CloseIncidentRequestHandler(this, db, metadata, security),
#if !(XRM_MOCKUP_2011 || XRM_MOCKUP_2013)
            new IsValidStateTransitionRequestHandler(this, db, metadata, security),
            new CalculateRollupFieldRequestHandler(this, db, metadata, security),
#endif
#if !(XRM_MOCKUP_2011 || XRM_MOCKUP_2013 || XRM_MOCKUP_2015)
            new UpsertRequestHandler(this, db, metadata, security),
#endif
        };
Пример #4
0
        /// <summary>
        /// Creates a new instance of Core
        /// </summary>
        /// <param name="Settings"></param>
        /// <param name="metadata"></param>
        /// <param name="SecurityRoles"></param>
        /// <param name="Workflows"></param>
        public Core(XrmMockupSettings Settings, MetadataSkeleton metadata, List <Entity> Workflows,
                    List <SecurityRole> SecurityRoles)
        {
            this.TimeOffset       = new TimeSpan();
            this.settings         = Settings;
            this.metadata         = metadata;
            baseCurrency          = metadata.BaseOrganization.GetAttributeValue <EntityReference>("basecurrencyid");
            baseCurrencyPrecision = metadata.BaseOrganization.GetAttributeValue <int>("pricingdecimalprecision");

            this.db             = new XrmDb(metadata.EntityMetadata, GetOnlineProxy());
            this.snapshots      = new Dictionary <string, Snapshot>();
            this.security       = new Security(this, metadata, SecurityRoles);
            this.ServiceFactory = new MockupServiceProviderAndFactory(this);

            //add the additional plugin settings to the meta data
            if (settings.IPluginMetadata != null)
            {
                metadata.Plugins.AddRange(Settings.IPluginMetadata);
            }

            this.pluginManager   = new PluginManager(Settings.BasePluginTypes, metadata.EntityMetadata, metadata.Plugins);
            this.workflowManager = new WorkflowManager(Settings.CodeActivityInstanceTypes, Settings.IncludeAllWorkflows,
                                                       Workflows, metadata.EntityMetadata);

            this.systemAttributeNames = new List <string>()
            {
                "createdon", "createdby", "modifiedon", "modifiedby"
            };

            this.RequestHandlers = GetRequestHandlers(db);
            InitializeDB();
            this.security.InitializeSecurityRoles(db);
        }
Пример #5
0
 internal RequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security, string RequestName)
 {
     this.security    = security;
     this.core        = core;
     this.db          = db;
     this.metadata    = metadata;
     this.RequestName = RequestName;
 }
Пример #6
0
 internal void InitializeSecurityRoles(XrmDb db)
 {
     AddRolesForBusinessUnit(db, Core.RootBusinessUnitRef);
     SetSecurityRole(Core.AdminUserRef,
                     SecurityRoles
                     .Where(s => s.Value.RoleTemplateId == SYSTEMADMIN_ROLE_TEMPLATE)
                     .Select(s => s.Value.RoleId)
                     .ToArray());
 }
Пример #7
0
 internal Security(Core core, MetadataSkeleton metadata, List <SecurityRole> SecurityRoles, XrmDb db)
 {
     this.Core          = core;
     this.Metadata      = metadata;
     this.db            = db;
     this.SecurityRoles = SecurityRoles.ToDictionary(s => s.RoleId, s => s);
     this.addedRoles    = new List <Guid>();
     Initialize();
 }
Пример #8
0
 internal void ResetEnvironment(XrmDb db)
 {
     Initialize();
     //remove any roles added on the fly
     foreach (var role in addedRoles)
     {
         SecurityRoles.Remove(role);
     }
     addedRoles = new List <Guid>();
     this.db    = db;
     InitializeSecurityRoles(db);
 }
Пример #9
0
 internal void ResetEnvironment()
 {
     this.TimeOffset = new TimeSpan();
     if (settings.IncludeAllWorkflows == false)
     {
         workflowManager.ResetWorkflows();
     }
     this.db = new XrmDb(metadata.EntityMetadata, GetOnlineProxy());
     this.RequestHandlers = GetRequestHandlers(db);
     InitializeDB();
     security.ResetEnvironment(db);
 }
Пример #10
0
        private static string GetFormattedValueLabel(XrmDb db, AttributeMetadata metadataAtt, object value, Entity entity)
        {
            if (metadataAtt is PicklistAttributeMetadata)
            {
                var optionset = (metadataAtt as PicklistAttributeMetadata).OptionSet.Options
                                .Where(opt => opt.Value == (value as OptionSetValue).Value).FirstOrDefault();
                return(optionset.Label.UserLocalizedLabel.Label);
            }

            if (metadataAtt is BooleanAttributeMetadata)
            {
                var booleanOptions = (metadataAtt as BooleanAttributeMetadata).OptionSet;
                var label          = (bool)value ? booleanOptions.TrueOption.Label : booleanOptions.FalseOption.Label;
                return(label.UserLocalizedLabel.Label);
            }

            if (metadataAtt is MoneyAttributeMetadata)
            {
                var currencysymbol =
                    db.GetEntity(
                        db.GetEntity(entity.ToEntityReference())
                        .GetAttributeValue <EntityReference>("transactioncurrencyid"))
                    .GetAttributeValue <string>("currencysymbol");

                return(currencysymbol + (value as Money).Value.ToString());
            }

            if (metadataAtt is LookupAttributeMetadata)
            {
                try
                {
                    return((value as EntityReference).Name);
                }
                catch (NullReferenceException e)
                {
                    Console.WriteLine("No lookup entity exists: " + e.Message);
                }
            }

            if (metadataAtt is IntegerAttributeMetadata ||
                metadataAtt is DateTimeAttributeMetadata ||
                metadataAtt is MemoAttributeMetadata ||
                metadataAtt is DoubleAttributeMetadata ||
                metadataAtt is DecimalAttributeMetadata)
            {
                return(value.ToString());
            }

            return(null);
        }
Пример #11
0
        internal static void SetOwner(XrmDb db, Security dataMethods, MetadataSkeleton metadata, Entity entity, EntityReference owner)
        {
            var ownershipType = metadata.EntityMetadata.GetMetadata(entity.LogicalName).OwnershipType;

            if (!ownershipType.HasValue)
            {
                throw new MockupException($"No ownership type set for '{entity.LogicalName}'");
            }

            if (ownershipType.Value.HasFlag(OwnershipTypes.UserOwned) || ownershipType.Value.HasFlag(OwnershipTypes.TeamOwned))
            {
                if (db.GetDbRowOrNull(owner) == null)
                {
                    throw new FaultException($"Owner referenced with id '{owner.Id}' does not exist");
                }

                var prevOwner = entity.Attributes.ContainsKey("ownerid") ? entity["ownerid"] : null;
                entity["ownerid"] = owner;

                if (!dataMethods.HasPermission(entity, AccessRights.ReadAccess, owner))
                {
                    entity["ownerid"] = prevOwner;
                    throw new FaultException($"Trying to assign '{entity.LogicalName}' with id '{entity.Id}'" +
                                             $" to '{owner.LogicalName}' with id '{owner.Id}', but owner does not have read access for that entity");
                }

                entity["owningbusinessunit"] = null;
                entity["owninguser"]         = null;
                entity["owningteam"]         = null;


                if (entity.LogicalName != LogicalNames.SystemUser && entity.LogicalName != LogicalNames.Team)
                {
                    if (owner.LogicalName == LogicalNames.SystemUser && ownershipType.Value.HasFlag(OwnershipTypes.UserOwned))
                    {
                        entity["owninguser"] = owner;
                    }
                    else if (owner.LogicalName == "team")
                    {
                        entity["owningteam"] = owner;
                    }
                    else
                    {
                        throw new MockupException($"Trying to give owner to {owner.LogicalName} but ownershiptype is {ownershipType.ToString()}");
                    }
                    entity["owningbusinessunit"] = GetBusinessUnit(db, owner);
                }
            }
        }
Пример #12
0
 internal static void PopulateEntityReferenceNames(Entity entity, XrmDb db)
 {
     foreach (var attr in entity.Attributes)
     {
         if (attr.Value is EntityReference eRef)
         {
             var row = db.GetDbRowOrNull(eRef);
             if (row != null)
             {
                 var nameAttr = row.Metadata.PrimaryNameAttribute;
                 eRef.Name = row.GetColumn <string>(nameAttr);
             }
         }
     }
 }
Пример #13
0
        internal void RestoreToSnapshot(string snapshotName)
        {
            if (!snapshots.ContainsKey(snapshotName))
            {
                throw new KeyNotFoundException("A Snapshot with that name does not exist");
            }
            var snapshot = snapshots[snapshotName];

            this.db                  = snapshot.db.Clone();
            this.security            = snapshot.security.Clone();
            this.AdminUserRef        = snapshot.AdminUserRef;
            this.RootBusinessUnitRef = snapshot.RootBusinessUnitRef;
            this.TimeOffset          = snapshot.TimeOffset;
            this.OrganizationId      = snapshot.OrganizationId;
            this.RequestHandlers     = GetRequestHandlers(this.db);
        }
Пример #14
0
        internal void AddRoleTemplatesForBusinessUnit(XrmDb db, EntityReference businessUnit)
        {
            //role templates are actually uniques across all business units so don't try adding more than once.
            var allRoleTemplates = db.GetDBEntityRows("roletemplate").Select(x => x.ToEntity());

            foreach (var sr in SecurityRoles.Values.Where(x => x.RoleTemplateId != Guid.Empty).GroupBy(x => x.RoleTemplateId).Select(x => x.Key))
            {
                if (!allRoleTemplates.Any(x => x.Id == sr))
                {
                    var roleTemplate = new Entity("roletemplate")
                    {
                        Id = sr
                    };
                    db.Add(roleTemplate);
                }
            }
        }
Пример #15
0
        /// <summary>
        /// Creates a new instance of Core
        /// </summary>
        /// <param name="Settings"></param>
        /// <param name="metadata"></param>
        /// <param name="SecurityRoles"></param>
        /// <param name="Workflows"></param>
        public Core(XrmMockupSettings Settings, MetadataSkeleton metadata, List <Entity> Workflows, List <SecurityRole> SecurityRoles)
        {
            this.TimeOffset       = new TimeSpan();
            this.settings         = Settings;
            this.metadata         = metadata;
            baseCurrency          = metadata.BaseOrganization.GetAttributeValue <EntityReference>("basecurrencyid");
            baseCurrencyPrecision = metadata.BaseOrganization.GetAttributeValue <int>("pricingdecimalprecision");

            this.db              = new XrmDb(metadata.EntityMetadata, GetOnlineProxy());
            this.security        = new Security(this, metadata, SecurityRoles);
            this.ServiceFactory  = new MockupServiceProviderAndFactory(this);
            this.pluginManager   = new PluginManager(Settings.BasePluginTypes, metadata.EntityMetadata, metadata.Plugins);
            this.workflowManager = new WorkflowManager(Settings.CodeActivityInstanceTypes, Settings.IncludeAllWorkflows, Workflows, metadata.EntityMetadata);

            this.RequestHandlers = GetRequestHandlers(db);
            InitializeDB();
            this.security.InitializeSecurityRoles(db);
        }
Пример #16
0
        internal static EntityReference GetBusinessUnit(XrmDb db, EntityReference owner)
        {
            var user = db.GetEntityOrNull(owner);

            if (user == null)
            {
                return(null);
            }
            var buRef = user.GetAttributeValue <EntityReference>("businessunitid");
            var bu    = db.GetEntityOrNull(buRef);

            if (bu == null)
            {
                return(null);
            }
            buRef.Name = bu.GetAttributeValue <string>("name");
            return(buRef);
        }
Пример #17
0
        internal void AddRoleToDb(XrmDb db, SecurityRole newRole, EntityReference businessUnit)
        {
            var roleMeta = Metadata.EntityMetadata.GetMetadata("role");
            var role     = new Entity("role")
            {
                Id = newRole.RoleId
            };

            role[roleMeta.PrimaryIdAttribute] = role.Id;
            role["businessunitid"]            = businessUnit;
            role["name"]           = newRole.Name;
            role["roletemplateid"] = newRole.RoleTemplateId;
            role["createdby"]      = Core.AdminUserRef;
            role["createdon"]      = DateTime.UtcNow.Add(Core.TimeOffset);
            role["modifiedby"]     = Core.AdminUserRef;
            role["modifiedon"]     = DateTime.UtcNow.Add(Core.TimeOffset);
            db.Add(role);
            SecurityRoleMapping.Add(role.Id, newRole.RoleId);
        }
Пример #18
0
        private static void HandleBaseCurrencies(MetadataSkeleton metadata, XrmDb db, Entity entity)
        {
            if (entity.LogicalName == LogicalNames.TransactionCurrency)
            {
                return;
            }
            var transAttr = "transactioncurrencyid";

            if (!entity.Attributes.ContainsKey(transAttr))
            {
                return;
            }
            var currency           = db.GetEntity(LogicalNames.TransactionCurrency, entity.GetAttributeValue <EntityReference>(transAttr).Id);
            var attributesMetadata = metadata.EntityMetadata.GetMetadata(entity.LogicalName).Attributes.Where(a => a is MoneyAttributeMetadata);

            if (!currency.GetAttributeValue <decimal?>("exchangerate").HasValue)
            {
                throw new FaultException($"No exchangerate specified for transactioncurrency '{entity.GetAttributeValue<EntityReference>(transAttr)}'");
            }

            var baseCurrency = GetBaseCurrency(metadata);

            foreach (var attr in entity.Attributes.ToList())
            {
                if (attributesMetadata.Any(a => a.LogicalName == attr.Key) && !attr.Key.EndsWith("_base"))
                {
                    if (entity.GetAttributeValue <EntityReference>(transAttr) == baseCurrency)
                    {
                        entity[attr.Key + "_base"] = attr.Value;
                    }
                    else
                    {
                        if (attr.Value is Money money)
                        {
                            var value = money.Value / currency.GetAttributeValue <decimal?>("exchangerate").Value;
                            entity[attr.Key + "_base"] = new Money(value);
                        }
                    }
                }
            }
        }
Пример #19
0
        private List <Entity> GetAliasedValuesFromLinkentity(LinkEntity linkEntity, Entity parent, Entity toAdd, XrmDb db)
        {
            var collection = new List <Entity>();

            foreach (var linkedRow in db[linkEntity.LinkToEntityName])
            {
                if (!Utility.MatchesCriteria(linkedRow, linkEntity.LinkCriteria))
                {
                    continue;
                }
                var linkedEntity = linkedRow.ToEntity();

                if (linkedEntity.Attributes.ContainsKey(linkEntity.LinkToAttributeName) &&
                    parent.Attributes.ContainsKey(linkEntity.LinkFromAttributeName))
                {
                    var linkedAttr = Utility.ConvertToComparableObject(
                        linkedEntity.Attributes[linkEntity.LinkToAttributeName]);
                    var entAttr = Utility.ConvertToComparableObject(
                        parent.Attributes[linkEntity.LinkFromAttributeName]);

                    if (linkedAttr.Equals(entAttr))
                    {
                        var aliasedEntity = GetEntityWithAliasAttributes(linkEntity.EntityAlias, toAdd,
                                                                         metadata.EntityMetadata.GetMetadata(toAdd.LogicalName), linkedEntity.Attributes, linkEntity.Columns);

                        if (linkEntity.LinkEntities.Count > 0)
                        {
                            var subEntities = new List <Entity>();
                            foreach (var nestedLinkEntity in linkEntity.LinkEntities)
                            {
                                nestedLinkEntity.LinkFromEntityName = linkEntity.LinkToEntityName;
                                subEntities.AddRange(
                                    GetAliasedValuesFromLinkentity(
                                        nestedLinkEntity, linkedEntity, aliasedEntity, db));
                            }
                            collection.AddRange(subEntities);
                        }
                        else
                        {
                            collection.Add(aliasedEntity);
                        }
                    }
                }
            }
            if (linkEntity.JoinOperator == JoinOperator.LeftOuter && collection.Count == 0)
            {
                collection.Add(toAdd);
            }
            return(collection);
        }
Пример #20
0
 internal RetrieveVersionRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "RetrieveVersion")
 {
 }
Пример #21
0
 internal AddMembersTeamRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "AddMembersTeam")
 {
 }
Пример #22
0
 internal RemoveUserFromRecordTeamRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "RemoveUserFromRecordTeam")
 {
 }
Пример #23
0
 internal static void HandleCurrencies(MetadataSkeleton metadata, XrmDb db, Entity entity)
 {
     HandleBaseCurrencies(metadata, db, entity);
     HandlePrecision(metadata, db, entity);
 }
Пример #24
0
        internal static void HandlePrecision(MetadataSkeleton metadata, XrmDb db, Entity entity)
        {
            if (entity.LogicalName == LogicalNames.TransactionCurrency)
            {
                return;
            }
            var transAttr = "transactioncurrencyid";

            if (!entity.Attributes.ContainsKey(transAttr))
            {
                return;
            }
            var currency              = db.GetEntity(LogicalNames.TransactionCurrency, entity.GetAttributeValue <EntityReference>(transAttr).Id);
            var attributesMetadata    = metadata.EntityMetadata.GetMetadata(entity.LogicalName).Attributes.Where(a => a is MoneyAttributeMetadata);
            var baseCurrencyPrecision = GetBaseCurrencyPrecision(metadata);

            foreach (var attr in entity.Attributes.ToList())
            {
                if (attributesMetadata.Any(a => a.LogicalName == attr.Key) && attr.Value != null)
                {
                    var attributeMetadata = attributesMetadata.First(m => m.LogicalName == attr.Key) as MoneyAttributeMetadata;
                    int?precision         = null;
                    switch (attributeMetadata.PrecisionSource)
                    {
                    case 0:
                        precision = attributeMetadata.Precision;
                        break;

                    case 1:
                        precision = baseCurrencyPrecision;
                        break;

                    case 2:
                        precision = currency.GetAttributeValue <int?>("currencyprecision");
                        break;
                    }

                    if (!precision.HasValue)
                    {
                        switch (attributeMetadata.PrecisionSource)
                        {
                        case 0:
                            throw new MockupException($"No precision set for field '{attr.Key}' on entity '{entity.LogicalName}'");

                        case 1:
                            throw new MockupException($"No precision set for organization. Please check you have the correct metadata");

                        case 2:
                            throw new MockupException($"No precision set for currency. Make sure you set the precision for your own currencies");
                        }
                    }

                    var rounded = Math.Round(((Money)attr.Value).Value, precision.Value);
                    if (rounded < (decimal)attributeMetadata.MinValue.Value || rounded > (decimal)attributeMetadata.MaxValue.Value)
                    {
                        throw new FaultException($"'{attr.Key}' was outside the ranges '{attributeMetadata.MinValue}','{attributeMetadata.MaxValue}' with value '{rounded}' ");
                    }
                    entity[attr.Key] = new Money(rounded);
                }
            }
        }
Пример #25
0
 internal RetrievePrincipalAccessRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "RetrievePrincipalAccess")
 {
 }
Пример #26
0
 internal ExecuteMultipleRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "ExecuteMultiple")
 {
 }
Пример #27
0
 internal DisassociateRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "Disassociate")
 {
 }
Пример #28
0
 internal AssignRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "Assign")
 {
 }
Пример #29
0
 internal void ResetEnvironment(XrmDb db)
 {
     Initialize();
     InitializeSecurityRoles(db);
 }
 internal MergeRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "Merge")
 {
 }