private void DeployTermUnderTerm(object modelHost, TermModelHost groupModelHost, TaxonomyTermDefinition termModel)
        {
            var termStore = groupModelHost.HostTermStore;
            var termSet   = groupModelHost.HostTerm;

            var currentTerm = FindTermInTerm(termSet, termModel);

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

            if (currentTerm == null)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing new Term");

                currentTerm = termModel.Id.HasValue
                    ? termSet.CreateTerm(termModel.Name, termModel.LCID, termModel.Id.Value)
                    : termSet.CreateTerm(termModel.Name, termModel.LCID, Guid.NewGuid());

                MapTermProperties(currentTerm, termModel);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = currentTerm,
                    ObjectType       = typeof(Term),
                    ObjectDefinition = termModel,
                    ModelHost        = modelHost
                });
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing Term");

                MapTermProperties(currentTerm, termModel);

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

            termStore.CommitAll();
            termStore.Context.ExecuteQueryWithTrace();
        }
        private void SharePointOnlineWait(TermModelHost termModelHost, TaxonomyTermLabelDefinition definition)
        {
            // wait until the group is there
            // Nested terms provisioning in Office 365 fails #995
            // TermSet not found #994
            var context = termModelHost.HostClientContext;

            if (IsSharePointOnlineContext(context))
            {
                var term         = termModelHost.HostTerm;
                var currentLabel = FindLabelInTerm(term, definition);

                if (currentLabel == null)
                {
                    TryRetryService.TryWithRetry(() =>
                    {
                        currentLabel = FindLabelInTerm(term, definition);
                        return(currentLabel != null);
                    });
                }

                if (currentLabel == null)
                {
                    throw new SPMeta2Exception(string.Format("Cannot find a term label after provision"));
                }
            }
        }
Example #3
0
        private void DeployTermUnderTerm(object modelHost, TermModelHost termModelHost, TaxonomyTermDefinition termModel)
        {
            var term = termModelHost.HostTerm;

            var currentTerm = FindTermInTerm(term, termModel);

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

            if (currentTerm == null)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing new Term");

                currentTerm = termModel.Id.HasValue
                    ? term.CreateTerm(termModel.Name, termModel.LCID, termModel.Id.Value)
                    : term.CreateTerm(termModel.Name, termModel.LCID);

                currentTerm.SetDescription(termModel.Description, termModel.LCID);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = currentTerm,
                    ObjectType       = typeof(Term),
                    ObjectDefinition = termModel,
                    ModelHost        = modelHost
                });
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing Term");

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

            termModelHost.HostTermStore.CommitAll();
        }
        private void DeployTermLabel(object modelHost, TermModelHost termModelHost, TaxonomyTermLabelDefinition labelModel)
        {
            var termStore = termModelHost.HostTermStore;
            var context   = termStore.Context;

            var term         = termModelHost.HostTerm;
            var currentLabel = FindLabelInTerm(term, labelModel);

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

            if (currentLabel == null)
            {
                TraceService.Verbose((int)LogEventId.ModelProvisionProcessingNewObject, "Processing new Label");

                currentLabel = term.CreateLabel(labelModel.Name, labelModel.LCID, labelModel.IsDefault);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = currentLabel,
                    ObjectType       = typeof(Label),
                    ObjectDefinition = labelModel,
                    ModelHost        = modelHost
                });
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing Term");

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

            termStore.CommitAll();
            context.ExecuteQueryWithTrace();
        }
        public override void WithResolvingModelHost(ModelHostResolveContext modelHostContext)
        {
            var modelHost      = modelHostContext.ModelHost;
            var model          = modelHostContext.Model;
            var childModelType = modelHostContext.ChildModelType;
            var action         = modelHostContext.Action;


            var definition = model.WithAssertAndCast <TaxonomyTermDefinition>("model", value => value.RequireNotNull());

            Term      currentTerm = null;
            TermGroup group       = null;
            TermSet   termSet     = null;
            TermStore termStore   = null;

            TermModelHost localModelHost = new TermModelHost();

            if (modelHost is TermModelHost)
            {
                var h = (modelHost as TermModelHost);

                group     = h.HostGroup;
                termSet   = h.HostTermSet;
                termStore = h.HostTermStore;

                currentTerm = FindTermInTerm(h.HostTerm, definition);

                localModelHost.HostGroup     = group;
                localModelHost.HostTermSet   = termSet;
                localModelHost.HostTerm      = currentTerm;
                localModelHost.HostTermStore = termStore;
            }
            else if (modelHost is TermSetModelHost)
            {
                var h = (modelHost as TermSetModelHost);

                termStore = h.HostTermStore;
                group     = h.HostGroup;
                termSet   = h.HostTermSet;

                currentTerm = FindTermInTermSet(h.HostTermSet, definition);

                localModelHost.HostGroup     = group;
                localModelHost.HostTermSet   = termSet;
                localModelHost.HostTerm      = currentTerm;
                localModelHost.HostTermStore = termStore;
            }

            action(localModelHost);
        }
Example #6
0
        public override void WithResolvingModelHost(object modelHost, DefinitionBase model, Type childModelType, Action <object> action)
        {
            var definition = model.WithAssertAndCast <TaxonomyTermDefinition>("model", value => value.RequireNotNull());

            Term      currentTerm = null;
            TermGroup group       = null;
            TermSet   termSet     = null;
            TermStore termStore   = null;

            TermModelHost localModelHost = new TermModelHost();

            if (modelHost is TermModelHost)
            {
                var h = (modelHost as TermModelHost);

                group     = h.HostGroup;
                termSet   = h.HostTermSet;
                termStore = h.HostTermStore;

                currentTerm = FindTermInTerm(h.HostTerm, definition);

                localModelHost.HostGroup     = group;
                localModelHost.HostTermSet   = termSet;
                localModelHost.HostTerm      = currentTerm;
                localModelHost.HostTermStore = termStore;
            }
            else if (modelHost is TermSetModelHost)
            {
                var h = (modelHost as TermSetModelHost);

                termStore = h.HostTermStore;
                group     = h.HostGroup;
                termSet   = h.HostTermSet;

                currentTerm = FindTermInTermSet(h.HostTermSet, definition);

                localModelHost.HostGroup     = group;
                localModelHost.HostTermSet   = termSet;
                localModelHost.HostTerm      = currentTerm;
                localModelHost.HostTermStore = termStore;
            }

            action(localModelHost);
        }
Example #7
0
        private void DeployTermUnderTerm(object modelHost, TermModelHost groupModelHost, TaxonomyTermDefinition termModel)
        {
            var termStore = groupModelHost.HostTermStore;
            var termSet   = groupModelHost.HostTerm;

            var currentTerm = FindTermInTerm(termSet, termModel);
            var termName    = NormalizeTermName(termModel.Name);

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

            if (currentTerm == null)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing new Term");

                currentTerm = termModel.Id.HasValue
                    ? termSet.CreateTerm(termName, termModel.LCID, termModel.Id.Value)
                    : termSet.CreateTerm(termName, termModel.LCID, Guid.NewGuid());

                MapTermProperties(currentTerm, termModel, true);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = currentTerm,
                    ObjectType       = typeof(Term),
                    ObjectDefinition = termModel,
                    ModelHost        = modelHost
                });
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing Term");

                MapTermProperties(currentTerm, termModel, false);

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

            try
            {
                termStore.CommitAll();
                currentTerm.RefreshLoad();

                termStore.Context.ExecuteQueryWithTrace();
            }
            catch (Exception e)
            {
                var context = groupModelHost.HostClientContext;

                if (!IsSharePointOnlineContext(context))
                {
                    throw;
                }

                var serverException = e as ServerException;

                if (serverException != null &&
                    ReflectionUtils.GetHResultValue(serverException).Value == -2146233088 &&
                    serverException.ServerErrorTypeName == "Microsoft.SharePoint.Taxonomy.TermStoreOperationException")
                {
                    TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing Term");

                    currentTerm = FindTermInTerm(termSet, termModel);

                    if (currentTerm == null)
                    {
                        TryRetryService.TryWithRetry(() =>
                        {
                            currentTerm = FindTermInTerm(termSet, termModel);
                            return(currentTerm != null);
                        });
                    }

                    MapTermProperties(currentTerm, termModel, false);

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

                    termStore.CommitAll();
                    termStore.Context.ExecuteQueryWithTrace();
                }
            }
        }