예제 #1
0
        public static TermStore LookupTermStore(SiteModelHost currentSiteModelHost,
                                                TaxonomyFieldDefinition taxFieldModel, bool raiseNullRefException)
        {
            var termStore = TaxonomyTermStoreModelHandler.FindTermStore(currentSiteModelHost,
                                                                        taxFieldModel.SspName,
                                                                        taxFieldModel.SspId,
                                                                        taxFieldModel.UseDefaultSiteCollectionTermStore);

            if (termStore == null && raiseNullRefException)
            {
                throw new ArgumentNullException("termStore is NULL. Please define SspName, SspId or ensure there is a default term store for the giving site.");
            }

            if (termStore != null)
            {
                var storeContext = currentSiteModelHost.HostClientContext;

                storeContext.Load(termStore, s => s.Id);
                storeContext.ExecuteQueryWithTrace();
            }

            return(termStore);
        }
예제 #2
0
        /// <summary>
        /// Deploys and validates target site model.
        /// </summary>
        /// <param name="model"></param>
        public override void DeploySiteModel(ModelNode model)
        {
            foreach (var siteUrl in SiteUrls)
            {
                Trace.WriteLine(string.Format("[INF]    Running on site: [{0}]", siteUrl));

                for (var provisionGeneration = 0; provisionGeneration < ProvisionGenerationCount; provisionGeneration++)
                {
                    WithCSOMContext(siteUrl, context =>
                    {
                        if (EnableDefinitionProvision)
                        {
                            _provisionService.DeployModel(SiteModelHost.FromClientContext(context), model);
                        }

                        if (EnableDefinitionValidation)
                        {
                            _validationService.DeployModel(SiteModelHost.FromClientContext(context), model);
                        }
                    });
                }
            }
        }
예제 #3
0
        private void DeployModel(ModelNode model)
        {
            WithCSOMContext(context =>
            {
                var provisionService = new StandardCSOMProvisionService();

                if (model.Value.GetType() == typeof(FarmDefinition))
                {
                    throw new SPMeta2NotImplementedException(
                        string.Format("Runner does not support model of type: [{0}]", model.Value.GetType()));
                }
                else if (model.Value.GetType() == typeof(WebApplicationDefinition))
                {
                    throw new SPMeta2NotImplementedException(
                        string.Format("Runner does not support model of type: [{0}]", model.Value.GetType()));
                }
                else if (model.Value.GetType() == typeof(SiteDefinition))
                {
                    provisionService.DeployModel(SiteModelHost.FromClientContext(context), model);
                }
                else if (model.Value.GetType() == typeof(WebDefinition))
                {
                    provisionService.DeployModel(WebModelHost.FromClientContext(context), model);
                }
                else if (model.Value.GetType() == typeof(ListDefinition))
                {
                    throw new SPMeta2NotImplementedException(
                        string.Format("Runner does not support model of type: [{0}]", model.Value.GetType()));
                }
                else
                {
                    throw new SPMeta2NotImplementedException(
                        string.Format("Runner does not support model of type: [{0}]", model.Value.GetType()));
                }
            });
        }
예제 #4
0
 public static Term LookupTerm(SiteModelHost currentSiteModelHost, TermStore termStore,
                               TermSet termSet,
                               TaxonomyFieldDefinition termModel)
 {
     return(LookupTerm(currentSiteModelHost.HostClientContext, termStore, termSet, termModel));
 }
예제 #5
0
        private void DeployArtifact(SiteModelHost modelHost, DesignPackageDefinition definition)
        {
            var site    = modelHost.HostSite;
            var context = site.Context;

            //var existingSolutionFile = FindExistingSolutionFile(siteModelHost, definition);
            var existingSolution = FindExistingSolutionById(modelHost, definition.SolutionId);

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

            // uninstalling existing one
            if (existingSolution != null && definition.Install)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject,
                                         "Processing existing sandbox solution");

                var fileItem = existingSolution.ListItemAllFields;
                context.Load(fileItem);
                context.ExecuteQueryWithTrace();

                var currentFileName = fileItem["FileLeafRef"].ToString();

                //if (!currentFileName.Contains(definition.FileName))
                //    currentFileName = currentFileName.Replace(string.Format("-v{0}.{1}.wsp", 1, 0), string.Empty);
                //else
                //    currentFileName = definition.FileName;

                var packageFileName      = Path.GetFileNameWithoutExtension(currentFileName);
                var packageFileNameParts = packageFileName.Split('-');

                var packageName = packageFileNameParts[0];

                var versionParts = packageFileNameParts[1].Replace("v", string.Empty)
                                   .Split('.');

                var packageMajorVersion = int.Parse(versionParts[0]);
                var packageMinorVersion = int.Parse(versionParts[1]);

                var info = new DesignPackageInfo
                {
                    PackageGuid  = definition.SolutionId,
                    MajorVersion = packageMajorVersion,
                    MinorVersion = packageMinorVersion,
                    PackageName  = packageName,
                };

                // cleaning up AppliedDesignGuid at root web to enable 'force' uninstall
                var rootWeb = site.RootWeb;
                rootWeb.AllProperties["AppliedDesignGuid"] = null;
                rootWeb.Update();

                context.ExecuteQueryWithTrace();

                // deactivate and remove
                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall,
                                     "Deleting existing sandbox solution via DesignPackage.UnInstall()");
                DesignPackage.UnInstall(context, site, info);

                try
                {
                    context.ExecuteQueryWithTrace();
                }
                catch (Exception uninstallException)
                {
                    // pass this one
                    // bug in SharePoint's DesignPackage.UnInstall method
                    if (!uninstallException.ToString().Contains("33e33eca-7712-4f3d-ab83-6848789fc9b6"))
                    {
                        throw;
                    }
                }
            }

            // installing new
            if (definition.Install)
            {
                var folder = site.RootWeb.RootFolder;

                context.Load(folder);
                context.ExecuteQueryWithTrace();

                var fileCreatingInfo = new FileCreationInformation
                {
                    Url       = definition.FileName,
                    Overwrite = true
                };

                if (definition.Content.Length < 1024 * 1024 * 1.5)
                {
                    fileCreatingInfo.Content = definition.Content;
                }
                else
                {
                    fileCreatingInfo.ContentStream = new MemoryStream(definition.Content);
                }


                var newFile = folder.Files.Add(fileCreatingInfo);

                context.Load(newFile);
                context.Load(newFile, f => f.ServerRelativeUrl);

                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Uploading new sandbox solution to root site folder");
                context.ExecuteQueryWithTrace();

                var info = new DesignPackageInfo
                {
                    PackageGuid  = definition.SolutionId,
                    MajorVersion = definition.MajorVersion,
                    MinorVersion = definition.MinorVersion,
                    PackageName  = Path.GetFileNameWithoutExtension(definition.FileName)
                };

                // activate and remove
                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "DesignPackage.Install()");
                DesignPackage.Install(context, site, info, newFile.ServerRelativeUrl);
                context.ExecuteQueryWithTrace();

                // clean up the file
                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Deleting sandbox file from root site folder");
                newFile.DeleteObject();
                context.ExecuteQueryWithTrace();

                existingSolution = FindExistingSolutionById(modelHost, definition.SolutionId);
            }

            if (definition.Apply)
            {
                var info = new DesignPackageInfo
                {
                    PackageGuid  = definition.SolutionId,
                    MajorVersion = definition.MajorVersion,
                    MinorVersion = definition.MinorVersion,
                    PackageName  = Path.GetFileNameWithoutExtension(definition.FileName)
                };

                // apply
                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "DesignPackage.Apply()");
                DesignPackage.Apply(context, site, info);
                context.ExecuteQueryWithTrace();
            }

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioned,
                Object           = existingSolution,
                ObjectType       = typeof(File),
                ObjectDefinition = definition,
                ModelHost        = modelHost
            });
        }
예제 #6
0
 protected SPWeb GetCurrentObject(SiteModelHost siteModelHost, RootWebDefinition definition)
 {
     return(siteModelHost.HostSite.RootWeb);
 }
예제 #7
0
 private void DeploySiteEventReceiver(object modelHost, SiteModelHost siteModelHost, EventReceiverDefinition definition)
 {
     DeployEventReceiver(modelHost, siteModelHost.HostSite.EventReceivers, definition);
 }
예제 #8
0
        static void Main(string[] args)
        {
            try
            {
                ReadSettings();
                using (ClientContext ctx = GetAuthenticatedContext())
                {
                    TraceHelper.TraceInformation("Configuring managed metadata");

                    var provisioningService = new StandardCSOMProvisionService();
                    var siteModel           = SiteModel.BuildTaxonomyModel();

                    Console.WriteLine(siteModel.ToPrettyPrint());

                    provisioningService.RegisterModelHandlers(typeof(TaxonomyGroupModelHandler).Assembly);
                    provisioningService.DeployModel(SiteModelHost.FromClientContext(ctx), siteModel);
                }
                using (ClientContext ctx = GetAuthenticatedContext())
                {
                    TraceHelper.TraceInformation("Building site features");

                    var provisioningService = new CSOMProvisionService();
                    var siteModel           = SiteModel.BuildSiteFeaturesModel();
                    Console.WriteLine(siteModel.ToPrettyPrint());

                    provisioningService.DeployModel(SiteModelHost.FromClientContext(ctx), siteModel);
                }
                using (ClientContext ctx = GetAuthenticatedContext())
                {
                    TraceHelper.TraceInformation("Building site fields");

                    var provisioningService = new StandardCSOMProvisionService();
                    var siteModel           = SiteModel.BuildFieldsModel();
                    Console.WriteLine(siteModel.ToPrettyPrint());

                    provisioningService.DeployModel(SiteModelHost.FromClientContext(ctx), siteModel);
                }
                using (ClientContext ctx = GetAuthenticatedContext())
                {
                    TraceHelper.TraceInformation("Building site content types");

                    var provisioningService = new StandardCSOMProvisionService();
                    var siteModel           = SiteModel.BuildContentTypesModel();
                    Console.WriteLine(siteModel.ToPrettyPrint());

                    provisioningService.DeployModel(SiteModelHost.FromClientContext(ctx), siteModel);
                }
                using (ClientContext ctx = GetAuthenticatedContext())
                {
                    TraceHelper.TraceInformation("Building web root model ");

                    var provisioningService = new StandardCSOMProvisionService();
                    var webModel            = SiteModel.BuildWebRootModel();
                    Console.WriteLine(webModel.ToPrettyPrint());

                    provisioningService.DeployModel(SiteModelHost.FromClientContext(ctx), webModel);
                }
                using (ClientContext ctx = GetAuthenticatedContext())
                {
                    TraceHelper.TraceInformation("Building web root files and modules");

                    var provisioningService = new StandardCSOMProvisionService();
                    var webModel            = Model.FIles.BuildFilesModel();
                    Console.WriteLine(webModel.ToPrettyPrint());

                    provisioningService.DeployModel(WebModelHost.FromClientContext(ctx), webModel);
                }
                using (ClientContext ctx = GetAuthenticatedContext())
                {
                    TraceHelper.TraceInformation("Building pages");

                    var provisioningService = new StandardCSOMProvisionService();
                    var webModel            = Model.Pages.BuildPagesModel();
                    Console.WriteLine(webModel.ToPrettyPrint());

                    provisioningService.DeployModel(WebModelHost.FromClientContext(ctx), webModel);
                }
            }
            catch (Exception ex)
            {
                TraceHelper.TraceError("an error has occured, message:{0}", ex);
            }
        }
 protected File FindExistingSolutionFile(SiteModelHost siteModelHost,
                                         SandboxSolutionDefinition sandboxSolutionDefinition)
 {
     return(FindExistingSolutionFileByName(siteModelHost, sandboxSolutionDefinition.FileName));
 }
예제 #10
0
 protected File FindExistingSolution(SiteModelHost siteModelHost,
                                     SandboxSolutionDefinition sandboxSolutionDefinition)
 {
     return(FindExistingSolutionById(siteModelHost, sandboxSolutionDefinition.SolutionId));
 }
예제 #11
0
        private void DeployImageRenditionSettings(object modelHost, SiteModelHost siteModelHost,
                                                  ImageRenditionDefinition imageRenditionModel)
        {
            var context    = siteModelHost.HostSite.Context;
            var renditions = SiteImageRenditions.GetRenditions(siteModelHost.HostSite.Context);

            context.ExecuteQueryWithTrace();

            var currentRendition = GetCurrentImageRendition(renditions, imageRenditionModel);

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

            if (currentRendition == null)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing new Image Rendition");

                var newRendition = new ImageRendition
                {
                    Name   = imageRenditionModel.Name,
                    Width  = imageRenditionModel.Width,
                    Height = imageRenditionModel.Height
                };

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

                renditions.Add(newRendition);
                SiteImageRenditions.SetRenditions(context, renditions);

                context.ExecuteQueryWithTrace();
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing existing Image Rendition");

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = currentRendition,
                    ObjectType       = typeof(ImageRendition),
                    ObjectDefinition = imageRenditionModel,
                    ModelHost        = modelHost
                });
            }
        }
예제 #12
0
        private void DeploySiteGroup(object modelHost, SiteModelHost siteModelHost, DefinitionBase model)
        {
            var site = siteModelHost.HostSite;

            var securityGroupModel = model.WithAssertAndCast <SecurityGroupDefinition>("model",
                                                                                       value => value.RequireNotNull());

            var web = site.RootWeb;

            //var site = web.Site;
            var currentGroup    = (SPGroup)null;
            var hasInitialGroup = false;

            try
            {
                currentGroup    = site.RootWeb.SiteGroups[securityGroupModel.Name];
                hasInitialGroup = true;

                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject,
                                         "Processing existing security group");
            }
            catch (SPException)
            {
                var defaultUser = EnsureDefaultUser(web, securityGroupModel);

                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject,
                                         "Processing new security group");

                // owner would be defaut site owner
                web.SiteGroups.Add(securityGroupModel.Name, web.Site.Owner, defaultUser,
                                   securityGroupModel.Description ?? string.Empty);
                currentGroup = web.SiteGroups[securityGroupModel.Name];

                // updating the owner or leave as default
                // Enhance 'SecurityGroupDefinition' provision - add self-owner support #516
                // https://github.com/SubPointSolutions/spmeta2/issues/516
                var ownerUser = EnsureOwnerUser(web, securityGroupModel.Owner);

                currentGroup.Owner = ownerUser;
                currentGroup.Update();
            }

            if (hasInitialGroup)
            {
                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioning,
                    Object           = currentGroup,
                    ObjectType       = typeof(SPPrincipal),
                    ObjectDefinition = securityGroupModel,
                    ModelHost        = modelHost
                });
            }
            else
            {
                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioning,
                    Object           = null,
                    ObjectType       = typeof(SPPrincipal),
                    ObjectDefinition = securityGroupModel,
                    ModelHost        = modelHost
                });
            }

            currentGroup.OnlyAllowMembersViewMembership = securityGroupModel.OnlyAllowMembersViewMembership;

            if (!string.IsNullOrEmpty(securityGroupModel.Owner))
            {
                currentGroup.Owner = EnsureOwnerUser(web, securityGroupModel.Owner);
            }

            currentGroup.Description = securityGroupModel.Description ?? string.Empty;

            if (securityGroupModel.AllowMembersEditMembership.HasValue)
            {
                currentGroup.AllowMembersEditMembership = securityGroupModel.AllowMembersEditMembership.Value;
            }

            if (securityGroupModel.AllowRequestToJoinLeave.HasValue)
            {
                currentGroup.AllowRequestToJoinLeave = securityGroupModel.AllowRequestToJoinLeave.Value;
            }

            if (securityGroupModel.AutoAcceptRequestToJoinLeave.HasValue)
            {
                currentGroup.AutoAcceptRequestToJoinLeave = securityGroupModel.AutoAcceptRequestToJoinLeave.Value;
            }

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

            currentGroup.Update();
        }
예제 #13
0
        internal static TermStore FindTermStore(SiteModelHost siteModelHost,
                                                string termStoreName,
                                                Guid?termStoreId,
                                                bool?useDefaultSiteCollectionTermStore)
        {
            var site = siteModelHost.HostSite;

            TermStore termStore = null;

            lock (_storeCacheLock)
            {
                var key = string.Format("{0}-{1}-{2}",
                                        siteModelHost.HostClientContext.GetHashCode(),
                                        siteModelHost.HostClientContext.Site.GetHashCode(),
                                        string.Format("{0}-{1}-{2}", termStoreName, termStoreId, useDefaultSiteCollectionTermStore))
                          .ToLower();

                if (!_storeCache.ContainsKey(key))
                {
                    TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "First call to TermStore with cache key: [{0}]", key);

                    var session = TaxonomySession.GetTaxonomySession(siteModelHost.HostClientContext);
                    var client  = siteModelHost.HostClientContext;

                    if (useDefaultSiteCollectionTermStore == true)
                    {
                        TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Resolving Term Store as useDefaultSiteCollectionTermStore");

                        termStore = session.GetDefaultSiteCollectionTermStore();
                    }
                    else
                    {
                        if (termStoreId.HasValue && termStoreId != default(Guid))
                        {
                            TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Resolving Term Store by ID: [{0}]", termStoreId.Value);
                            termStore = session.TermStores.GetById(termStoreId.Value);
                        }
                        else if (!string.IsNullOrEmpty(termStoreName))
                        {
                            TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Resolving Term Store by Name: [{0}]", termStoreName);
                            termStore = session.TermStores.GetByName(termStoreName);
                        }
                    }

                    if (termStore != null)
                    {
                        client.Load(termStore, s => s.Id);
                        client.Load(termStore, s => s.Name);

                        client.ExecuteQueryWithTrace();
                    }


                    _storeCache.Add(key, termStore);
                }
                else
                {
                    TraceService.VerboseFormat((int)LogEventId.ModelProvisionCoreCall, "Resolving term store from internal cache with cache key: [{0}]", key);
                }

                return(_storeCache[key]);
            }

            return(termStore);
        }
예제 #14
0
        private void DeploySiteGroup(object modelHost, SiteModelHost siteModelHost, DefinitionBase model)
        {
            var webModelHost = modelHost.WithAssertAndCast <SiteModelHost>("modelHost", value => value.RequireNotNull());

            var web = webModelHost.HostSite.RootWeb;
            var securityGroupModel = model.WithAssertAndCast <SecurityGroupDefinition>("model", value => value.RequireNotNull());

            var context = web.Context;

            // well, this should be pulled up to the site handler and init Load/Exec query
            context.Load(web, tmpWeb => tmpWeb.SiteGroups, g => g.Id, g => g.Title);
            context.ExecuteQueryWithTrace();

            Principal groupOwner = null;

            if (!string.IsNullOrEmpty(securityGroupModel.Owner) &&
                (securityGroupModel.Owner.ToUpper() != securityGroupModel.Name.ToUpper()))
            {
                groupOwner = ResolvePrincipal(context, web, securityGroupModel.Owner);

                if (groupOwner == null)
                {
                    throw new SPMeta2Exception(string.Format("Cannot resolve Principal by string value: [{0}]", securityGroupModel.Owner));
                }
            }

            var currentGroup = FindSecurityGroupByTitle(web.SiteGroups, securityGroupModel.Name);

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

            if (currentGroup == null)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing new security group");

                currentGroup = web.SiteGroups.Add(new GroupCreationInformation
                {
                    Title       = securityGroupModel.Name,
                    Description = securityGroupModel.Description ?? string.Empty,
                });

                currentGroup.Update();
                context.ExecuteQueryWithTrace();

                // updating the owner or leave as default
                // Enhance 'SecurityGroupDefinition' provision - add self-owner support #516
                // https://github.com/SubPointSolutions/spmeta2/issues/516
                if (!string.IsNullOrEmpty(securityGroupModel.Owner))
                {
                    groupOwner         = ResolvePrincipal(context, web, securityGroupModel.Owner);
                    currentGroup.Owner = groupOwner;

                    currentGroup.Update();
                    context.ExecuteQueryWithTrace();
                }

                context.Load(currentGroup);
                context.ExecuteQueryWithTrace();
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing security group");
            }

            currentGroup.Title       = securityGroupModel.Name;
            currentGroup.Description = securityGroupModel.Description ?? string.Empty;
            currentGroup.OnlyAllowMembersViewMembership = securityGroupModel.OnlyAllowMembersViewMembership;

            if (securityGroupModel.AllowMembersEditMembership.HasValue)
            {
                currentGroup.AllowMembersEditMembership = securityGroupModel.AllowMembersEditMembership.Value;
            }

            if (securityGroupModel.AllowRequestToJoinLeave.HasValue)
            {
                currentGroup.AllowRequestToJoinLeave = securityGroupModel.AllowRequestToJoinLeave.Value;
            }

            if (securityGroupModel.AutoAcceptRequestToJoinLeave.HasValue)
            {
                currentGroup.AutoAcceptRequestToJoinLeave = securityGroupModel.AutoAcceptRequestToJoinLeave.Value;
            }

            if (groupOwner != null)
            {
                currentGroup.Owner = groupOwner;
            }


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

            currentGroup.Update();
            context.ExecuteQueryWithTrace();
        }
예제 #15
0
        public override void DeployModel(object modelHost, DefinitionBase model)
        {
            if (!(modelHost is SiteModelHost || modelHost is ListModelHost))
            {
                throw new ArgumentException("modelHost needs to be SiteModelHost/ListModelHost instance.");
            }

            CurrentSiteModelHost = modelHost as SiteModelHost;

            TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Casting field model definition");
            var fieldModel = model.WithAssertAndCast <FieldDefinition>("model", value => value.RequireNotNull());

            Field currentField           = null;
            ClientRuntimeContext context = null;

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = null,
                ObjectType       = GetTargetFieldType(fieldModel),
                ObjectDefinition = model,
                ModelHost        = modelHost
            });
            InvokeOnModelEvent <FieldDefinition, Field>(currentField, ModelEventType.OnUpdating);

            if (modelHost is SiteModelHost)
            {
                var siteHost = modelHost as SiteModelHost;
                context = siteHost.HostSite.Context;

                currentField = DeploySiteField(siteHost as SiteModelHost, fieldModel);
            }
            else if (modelHost is ListModelHost)
            {
                var listHost = modelHost as ListModelHost;
                context = listHost.HostList.Context;

                currentField = DeployListField(modelHost as ListModelHost, fieldModel);
            }

            object typedField = null;

            // emulate context.CastTo<>() call for typed field type
            if (GetTargetFieldType(fieldModel) != currentField.GetType())
            {
                var targetFieldType = GetTargetFieldType(fieldModel);

                TraceService.InformationFormat((int)LogEventId.ModelProvisionCoreCall, "Calling context.CastTo() to field type: [{0}]", targetFieldType);

                var method  = context.GetType().GetMethod("CastTo");
                var generic = method.MakeGenericMethod(targetFieldType);

                typedField = generic.Invoke(context, new object[] { currentField });
            }

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioned,
                Object           = typedField ?? currentField,
                ObjectType       = GetTargetFieldType(fieldModel),
                ObjectDefinition = model,
                ModelHost        = modelHost
            });
            InvokeOnModelEvent <FieldDefinition, Field>(currentField, ModelEventType.OnUpdated);

            TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "UpdateAndPushChanges(true)");
            currentField.UpdateAndPushChanges(true);

            TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "ExecuteQuery()");
            context.ExecuteQueryWithTrace();
        }
예제 #16
0
        private void DeployDesignPackage(object modelHost, SiteModelHost siteModelHost, DesignPackageDefinition definition)
        {
            var site            = siteModelHost.HostSite;
            var sandboxSolution = FindExistingSolutionById(siteModelHost, definition.SolutionId);

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

            if (sandboxSolution != null)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject,
                                         "Processing existing design package");
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject,
                                         "Processing new design package");
            }

            var designPackageInfo = new DesignPackageInfo(definition.FileName,
                                                          definition.SolutionId,
                                                          definition.MajorVersion,
                                                          definition.MinorVersion);

            if (definition.Install)
            {
                // removing first
                if (sandboxSolution != null)
                {
                    TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Deleting existing sandbox solution");
                    siteModelHost.HostSite.Solutions.Remove(sandboxSolution);

                    var catalog = siteModelHost.HostSite.RootWeb.GetCatalog(SPListTemplateType.SolutionCatalog);

                    try
                    {
                        var solutionFile = catalog.RootFolder.Files[sandboxSolution.Name];

                        if (solutionFile.Exists)
                        {
                            solutionFile.Delete();
                        }
                    }
                    catch
                    {
                        TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject,
                                                 "Error while deleting design package");
                    }
                }

                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Deploying design package file to the root folder of the root web");

                var rootFolder           = site.RootWeb.RootFolder;
                var tmpDesignPackageFile = rootFolder.Files.Add(definition.FileName, definition.Content, true);

                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall,
                                     string.Format("Installing design package from URL:[{0}]", tmpDesignPackageFile.ServerRelativeUrl));

                DesignPackage.Install(site, designPackageInfo, tmpDesignPackageFile.ServerRelativeUrl);
                sandboxSolution = FindExistingSolutionById(siteModelHost, definition.SolutionId);

                if (definition.Apply)
                {
                    TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Applying design package");
                    DesignPackage.Apply(site, designPackageInfo);
                }
                else
                {
                    TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Apply == false. Skipping design package activation");
                }

                // cleanup
                if (tmpDesignPackageFile.Exists)
                {
                    tmpDesignPackageFile.Delete();
                }

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = sandboxSolution,
                    ObjectType       = typeof(SPUserSolution),
                    ObjectDefinition = definition,
                    ModelHost        = modelHost
                });
            }
            else
            {
                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Activate = false. Continue provision");

                if (sandboxSolution != null)
                {
                    TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Solution is NOT NULL. Checking Apply status");

                    if (definition.Apply)
                    {
                        TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Applying design package");
                        DesignPackage.Apply(site, designPackageInfo);
                    }
                    else
                    {
                        TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall,
                                             "Apply == false. Skipping design package activation");
                    }
                }
                else
                {
                    TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Solution is NULL. Skipping Apply status");
                }

                sandboxSolution = FindExistingSolutionById(siteModelHost, definition.SolutionId);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = sandboxSolution,
                    ObjectType       = typeof(SPUserSolution),
                    ObjectDefinition = definition,
                    ModelHost        = modelHost
                });
            }
        }
 protected TermStore FindTermStore(SiteModelHost siteModelHost, TaxonomyTermStoreDefinition termStoreModel)
 {
     return(FindTermStore(siteModelHost.HostSite,
                          termStoreModel.Name, termStoreModel.Id, termStoreModel.UseDefaultSiteCollectionTermStore));
 }
예제 #18
0
 private void DeploySiteDependentLookup(object modelHost, SiteModelHost siteModelHost, DependentLookupFieldDefinition definition)
 {
     DeployDependentLookupField(modelHost, siteModelHost.HostSite.RootWeb.Fields, definition);
 }
예제 #19
0
 private void DeploySiteManagedProperty(object modelHost, SiteModelHost siteModelHost, ManagedPropertyDefinition managedProperty)
 {
     throw new NotImplementedException();
 }
예제 #20
0
 public static void DeploySiteModel(this SSOMProvisionService modelHost, SPSite site, ModelNode model)
 {
     modelHost.DeployModel(SiteModelHost.FromSite(site), model);
 }
예제 #21
0
 private void DeploySiteManagedProperty(object modelHost, SiteModelHost siteModelHost, ManagedPropertyDefinition managedProperty)
 {
     throw new SPMeta2NotImplementedException("Managed property deployment under site is not implemented yet");
 }
예제 #22
0
 public static TermStore LookupTermStore(SiteModelHost currentSiteModelHost,
                                         TaxonomyFieldDefinition taxFieldModel)
 {
     return(LookupTermStore(currentSiteModelHost, taxFieldModel, false));
 }
예제 #23
0
        public static Term LookupTerm(SiteModelHost currentSiteModelHost, TermStore termStore, TaxonomyFieldDefinition termModel)
        {
            var context = currentSiteModelHost.HostClientContext;
            var site    = currentSiteModelHost.HostSite;

            Term result = null;

            TermGroup currenGroup = null;

            var termGroupName         = termModel.TermGroupName;
            var termGroupId           = termModel.TermGroupId;
            var isSiteCollectionGroup = termModel.IsSiteCollectionGroup;

            if (!string.IsNullOrEmpty(termGroupName))
            {
                currenGroup = termStore.Groups.GetByName(termGroupName);

                context.Load(currenGroup);
                context.ExecuteQueryWithTrace();
            }
            else if (termGroupId != null && termGroupId.HasGuidValue())
            {
                currenGroup = termStore.Groups.GetById(termGroupId.Value);

                context.Load(currenGroup);
                context.ExecuteQueryWithTrace();
            }
            else if (isSiteCollectionGroup == true)
            {
                currenGroup = termStore.GetSiteCollectionGroup(site, false);

                context.Load(currenGroup);
                context.ExecuteQueryWithTrace();
            }

            if (currenGroup != null)
            {
                if (termModel.TermId.HasValue)
                {
                    // by ID, the only one match

                    var scope = new ExceptionHandlingScope(context);
                    using (scope.StartScope())
                    {
                        using (scope.StartTry())
                        {
                            result = termStore.GetTerm(termModel.TermId.Value);
                            context.Load(result);
                        }

                        using (scope.StartCatch())
                        {
                        }
                    }

                    context.ExecuteQueryWithTrace();
                }
                else if (!string.IsNullOrEmpty(termModel.TermName))
                {
                    var terms = termStore.GetTerms(new LabelMatchInformation(context)
                    {
                        Lcid            = termModel.TermLCID,
                        TermLabel       = termModel.TermName,
                        TrimUnavailable = false
                    });

                    context.Load(terms, t => t.Include(
                                     i => i.Id,
                                     i => i.Name,
                                     i => i.TermSet,
                                     i => i.TermSet.Group,
                                     i => i.TermSet.Group.Name
                                     ));
                    context.ExecuteQueryWithTrace();

                    result = terms.FirstOrDefault(t => t.TermSet.Group.Name == currenGroup.Name);
                }
            }

            else
            {
                if (termModel.TermId.HasValue)
                {
                    var scope = new ExceptionHandlingScope(context);
                    using (scope.StartScope())
                    {
                        using (scope.StartTry())
                        {
                            result = termStore.GetTerm(termModel.TermId.Value);
                            context.Load(result);
                        }

                        using (scope.StartCatch())
                        {
                        }
                    }

                    context.ExecuteQueryWithTrace();
                }
                else if (!string.IsNullOrEmpty(termModel.TermName))
                {
                    var terms = termStore.GetTerms(new LabelMatchInformation(context)
                    {
                        Lcid            = termModel.TermLCID,
                        TermLabel       = termModel.TermName,
                        TrimUnavailable = false
                    });

                    context.Load(terms);
                    context.ExecuteQueryWithTrace();

                    result = terms.FirstOrDefault();
                }
            }

            if (result != null && result.ServerObjectIsNull == false)
            {
                context.Load(result);
                context.ExecuteQueryWithTrace();

                return(result);
            }

            return(null);
        }
예제 #24
0
        private void DeploySandboxSolution(object modelHost, SiteModelHost siteModelHost, SandboxSolutionDefinition sandboxSolutionDefinition)
        {
            var site    = siteModelHost.HostSite;
            var context = site.Context;

            var existingSolutionFile = FindExistingSolutionFile(siteModelHost, sandboxSolutionDefinition);
            var existingSolution     = FindExistingSolution(siteModelHost, sandboxSolutionDefinition);

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

            if (existingSolution != null)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing sandbox solution");

                var fileItem = existingSolution.ListItemAllFields;
                context.Load(fileItem);
                context.ExecuteQueryWithTrace();

                var currentFileName = fileItem["FileLeafRef"].ToString();

                if (!currentFileName.Contains(sandboxSolutionDefinition.FileName))
                {
                    currentFileName = currentFileName.Replace(string.Format("-v{0}.{1}.wsp", 1, 0), string.Empty);
                }
                else
                {
                    currentFileName = sandboxSolutionDefinition.FileName;
                }

                var info = new DesignPackageInfo
                {
                    PackageGuid  = sandboxSolutionDefinition.SolutionId,
                    MajorVersion = 1,
                    MinorVersion = 0,
                    PackageName  = Path.GetFileNameWithoutExtension(currentFileName)
                };

                // deactivate and remove
                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Deleting existing sandbox solution via DesignPackage.UnInstall()");
                DesignPackage.UnInstall(context, site, info);

                context.ExecuteQueryWithTrace();
            }

            //var solutionGallery = site.RootWeb.Lists.GetByTitle("Site Assets");
            //var folder = solutionGallery.RootFolder;
            var folder = site.RootWeb.RootFolder;

            context.Load(folder);
            context.ExecuteQueryWithTrace();

            var fileCreatingInfo = new FileCreationInformation
            {
                Url       = sandboxSolutionDefinition.FileName,
                Overwrite = true
            };

            if (sandboxSolutionDefinition.Content.Length < 1024 * 1024 * 1.5)
            {
                fileCreatingInfo.Content = sandboxSolutionDefinition.Content;
            }
            else
            {
                fileCreatingInfo.ContentStream = new System.IO.MemoryStream(sandboxSolutionDefinition.Content);
            }


            var newFile = folder.Files.Add(fileCreatingInfo);

            context.Load(newFile);
            context.Load(newFile, f => f.ServerRelativeUrl);

            TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Uploading new sandbox solution to root site folder");
            context.ExecuteQueryWithTrace();

            if (sandboxSolutionDefinition.Activate)
            {
                var info = new DesignPackageInfo
                {
                    PackageGuid  = sandboxSolutionDefinition.SolutionId,
                    MajorVersion = 1,
                    MinorVersion = 0,
                    PackageName  = Path.GetFileNameWithoutExtension(sandboxSolutionDefinition.FileName)
                };

                // activate and remove
                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Activating sandbox solution via DesignPackage.Install()");
                DesignPackage.Install(context, site, info, newFile.ServerRelativeUrl);
                context.ExecuteQueryWithTrace();

                // clean up the file
                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Deleting sandbox file from root site folder");
                newFile.DeleteObject();
                context.ExecuteQueryWithTrace();
            }

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioned,
                Object           = newFile,
                ObjectType       = typeof(File),
                ObjectDefinition = sandboxSolutionDefinition,
                ModelHost        = modelHost
            });
        }
예제 #25
0
        private void DeploySandboxSolution(object modelHost, SiteModelHost siteModelHost, SandboxSolutionDefinition sandboxSolutionDefinition)
        {
            var existingSolutions = FindExistingSolutionFile(siteModelHost, sandboxSolutionDefinition);
            var sandboxSolution   = FindExistingSolution(siteModelHost, sandboxSolutionDefinition);

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

            if (sandboxSolution != null)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing sandbox solution");
            }

            if (sandboxSolution != null && sandboxSolution.Status == SPUserSolutionStatus.Activated)
            {
                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Deleting existing sandbox solution");
                siteModelHost.HostSite.Solutions.Remove(sandboxSolution);
            }

            var solutionGallery = (SPDocumentLibrary)siteModelHost.HostSite.GetCatalog(SPListTemplateType.SolutionCatalog);
            var file            = solutionGallery.RootFolder.Files.Add(sandboxSolutionDefinition.FileName, sandboxSolutionDefinition.Content, true);

            if (sandboxSolutionDefinition.Activate)
            {
                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Activating sandbox solution");

                var userSolution = siteModelHost.HostSite.Solutions.Add(file.Item.ID);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = userSolution,
                    ObjectType       = typeof(SPUserSolution),
                    ObjectDefinition = sandboxSolutionDefinition,
                    ModelHost        = modelHost
                });
            }
            else
            {
                TraceService.Verbose((int)LogEventId.ModelProvisionCoreCall, "Activate = false. Continue provision");

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