/// <summary> /// Check if all tokens where replaced. If the field is a taxonomy field then we will check for the values of the referenced termstore and termset. /// </summary> /// <param name="fieldXml">The xml to parse</param> /// <param name="parser"></param> /// <param name="context"></param> /// <returns></returns> protected static bool IsFieldXmlValid(string fieldXml, TokenParser parser, ClientRuntimeContext context) { var isValid = true; var leftOverTokens = parser.GetLeftOverTokens(fieldXml); if (!leftOverTokens.Any()) { var fieldElement = XElement.Parse(fieldXml); if (fieldElement.Attribute("Type").Value == "TaxonomyFieldType") { var termStoreIdElement = fieldElement.XPathSelectElement("//ArrayOfProperty/Property[Name='SspId']/Value"); if (termStoreIdElement != null) { var termStoreId = Guid.Parse(termStoreIdElement.Value); TaxonomySession taxSession = TaxonomySession.GetTaxonomySession(context); try { taxSession.EnsureProperty(t => t.TermStores); var store = taxSession.TermStores.GetById(termStoreId); context.Load(store); context.ExecuteQueryRetry(); if (store.ServerObjectIsNull.HasValue && !store.ServerObjectIsNull.Value) { var termSetIdElement = fieldElement.XPathSelectElement("//ArrayOfProperty/Property[Name='TermSetId']/Value"); if (termSetIdElement != null) { var termSetId = Guid.Parse(termSetIdElement.Value); try { var termSet = store.GetTermSet(termSetId); context.Load(termSet); context.ExecuteQueryRetry(); isValid = termSet.ServerObjectIsNull.HasValue && !termSet.ServerObjectIsNull.Value; } catch (Exception) { isValid = false; } } } } catch (Exception) { isValid = false; } } else { isValid = false; } } } else { //Some tokens where not replaced isValid = false; } return(isValid); }
private void AddTermStoreTokens(Web web) { TaxonomySession session = TaxonomySession.GetTaxonomySession(web.Context); var termStores = session.EnsureProperty(s => s.TermStores); foreach (var ts in termStores) { _tokens.Add(new TermStoreIdToken(web, ts.Name, ts.Id)); } var termStore = session.GetDefaultSiteCollectionTermStore(); web.Context.Load(termStore); web.Context.ExecuteQueryRetry(); if (!termStore.ServerObjectIsNull.Value) { web.Context.Load(termStore.Groups, g => g.Include( tg => tg.Name, tg => tg.TermSets.Include( ts => ts.Name, ts => ts.Id) )); web.Context.ExecuteQueryRetry(); foreach (var termGroup in termStore.Groups) { foreach (var termSet in termGroup.TermSets) { _tokens.Add(new TermSetIdToken(web, termGroup.Name, termSet.Name, termSet.Id)); } } } // SiteCollection TermSets, only when we're not working in app-only if (!web.Context.IsAppOnly()) { _tokens.Add(new SiteCollectionTermGroupIdToken(web)); _tokens.Add(new SiteCollectionTermGroupNameToken(web)); var site = (web.Context as ClientContext).Site; var siteCollectionTermGroup = termStore.GetSiteCollectionGroup(site, true); web.Context.Load(siteCollectionTermGroup); try { web.Context.ExecuteQueryRetry(); if (null != siteCollectionTermGroup && !siteCollectionTermGroup.ServerObjectIsNull.Value) { web.Context.Load(siteCollectionTermGroup, group => group.TermSets.Include(ts => ts.Name, ts => ts.Id)); web.Context.ExecuteQueryRetry(); foreach (var termSet in siteCollectionTermGroup.TermSets) { _tokens.Add(new SiteCollectionTermSetIdToken(web, termSet.Name, termSet.Id)); } } } catch (ServerUnauthorizedAccessException) { // If we don't have permission to access the TermGroup, just skip it } catch (NullReferenceException) { // If there isn't a default TermGroup for the Site Collection, we skip the terms in token handler } } }
/// <summary> /// Constructor /// </summary> /// <param name="web">A SharePoint site or subsite</param> /// <param name="template">a provisioning template</param> public TokenParser(Web web, ProvisioningTemplate template) { web.EnsureProperties(w => w.ServerRelativeUrl, w => w.Language); _web = web; _tokens = new List <TokenDefinition>(); _tokens.Add(new SiteCollectionToken(web)); _tokens.Add(new SiteCollectionIdToken(web)); _tokens.Add(new SiteToken(web)); _tokens.Add(new MasterPageCatalogToken(web)); _tokens.Add(new SiteCollectionTermStoreIdToken(web)); _tokens.Add(new KeywordsTermStoreIdToken(web)); _tokens.Add(new ThemeCatalogToken(web)); _tokens.Add(new SiteNameToken(web)); _tokens.Add(new SiteIdToken(web)); _tokens.Add(new SiteOwnerToken(web)); _tokens.Add(new AssociatedGroupToken(web, AssociatedGroupToken.AssociatedGroupType.owners)); _tokens.Add(new AssociatedGroupToken(web, AssociatedGroupToken.AssociatedGroupType.members)); _tokens.Add(new AssociatedGroupToken(web, AssociatedGroupToken.AssociatedGroupType.visitors)); _tokens.Add(new GuidToken(web)); _tokens.Add(new DateNowToken(web)); _tokens.Add(new CurrentUserIdToken(web)); _tokens.Add(new CurrentUserLoginNameToken(web)); _tokens.Add(new CurrentUserFullNameToken(web)); _tokens.Add(new AuthenticationRealmToken(web)); // Add lists AddListTokens(web); // Add ContentTypes AddContentTypeTokens(web); // Add parameters foreach (var parameter in template.Parameters) { _tokens.Add(new ParameterToken(web, parameter.Key, parameter.Value ?? string.Empty)); } // Add TermSetIds TaxonomySession session = TaxonomySession.GetTaxonomySession(web.Context); var termStores = session.EnsureProperty(s => s.TermStores); foreach (var ts in termStores) { _tokens.Add(new TermStoreIdToken(web, ts.Name, ts.Id)); } var termStore = session.GetDefaultSiteCollectionTermStore(); web.Context.Load(termStore); web.Context.ExecuteQueryRetry(); if (!termStore.ServerObjectIsNull.Value) { web.Context.Load(termStore.Groups, g => g.Include( tg => tg.Name, tg => tg.TermSets.Include( ts => ts.Name, ts => ts.Id) )); web.Context.ExecuteQueryRetry(); foreach (var termGroup in termStore.Groups) { foreach (var termSet in termGroup.TermSets) { _tokens.Add(new TermSetIdToken(web, termGroup.Name, termSet.Name, termSet.Id)); } } } _tokens.Add(new SiteCollectionTermGroupIdToken(web)); _tokens.Add(new SiteCollectionTermGroupNameToken(web)); // SiteCollection TermSets, only when we're not working in app-only if (!web.Context.IsAppOnly()) { var site = (web.Context as ClientContext).Site; var siteCollectionTermGroup = termStore.GetSiteCollectionGroup(site, true); web.Context.Load(siteCollectionTermGroup); try { web.Context.ExecuteQueryRetry(); if (null != siteCollectionTermGroup && !siteCollectionTermGroup.ServerObjectIsNull.Value) { web.Context.Load(siteCollectionTermGroup, group => group.TermSets.Include(ts => ts.Name, ts => ts.Id)); web.Context.ExecuteQueryRetry(); foreach (var termSet in siteCollectionTermGroup.TermSets) { _tokens.Add(new SiteCollectionTermSetIdToken(web, termSet.Name, termSet.Id)); } } } catch (NullReferenceException) { // If there isn't a default TermGroup for the Site Collection, we skip the terms in token handler } } // Fields var fields = web.Fields; web.Context.Load(fields, flds => flds.Include(f => f.Title, f => f.InternalName)); web.Context.ExecuteQueryRetry(); foreach (var field in fields) { _tokens.Add(new FieldTitleToken(web, field.InternalName, field.Title)); } if (web.IsSubSite()) { // SiteColumns from rootsite var rootWeb = (web.Context as ClientContext).Site.RootWeb; var siteColumns = rootWeb.Fields; web.Context.Load(siteColumns, flds => flds.Include(f => f.Title, f => f.InternalName)); web.Context.ExecuteQueryRetry(); foreach (var field in siteColumns) { _tokens.Add(new FieldTitleToken(rootWeb, field.InternalName, field.Title)); } } // Handle resources if (template.Localizations.Any()) { // Read all resource keys in a list List <Tuple <string, uint, string> > resourceEntries = new List <Tuple <string, uint, string> >(); foreach (var localizationEntry in template.Localizations) { var filePath = localizationEntry.ResourceFile; using (var stream = template.Connector.GetFileStream(filePath)) { if (stream != null) { using (ResXResourceReader resxReader = new ResXResourceReader(stream)) { foreach (DictionaryEntry entry in resxReader) { resourceEntries.Add(new Tuple <string, uint, string>(entry.Key.ToString(), (uint)localizationEntry.LCID, entry.Value.ToString())); } } } } } var uniqueKeys = resourceEntries.Select(k => k.Item1).Distinct(); foreach (var key in uniqueKeys) { var matches = resourceEntries.Where(k => k.Item1 == key); var entries = matches.Select(k => new ResourceEntry() { LCID = k.Item2, Value = k.Item3 }).ToList(); LocalizationToken token = new LocalizationToken(web, key, entries); _tokens.Add(token); } } // OOTB Roledefs web.EnsureProperty(w => w.RoleDefinitions.Include(r => r.RoleTypeKind, r => r.Name, r => r.Id)); foreach (var roleDef in web.RoleDefinitions.AsEnumerable().Where(r => r.RoleTypeKind != RoleType.None)) { _tokens.Add(new RoleDefinitionToken(web, roleDef)); } foreach (var roleDef in web.RoleDefinitions) { _tokens.Add(new RoleDefinitionIdToken(web, roleDef.Name, roleDef.Id)); } // Groups web.EnsureProperty(w => w.SiteGroups.Include(g => g.Title, g => g.Id)); foreach (var siteGroup in web.SiteGroups) { _tokens.Add(new GroupIdToken(web, siteGroup.Title, siteGroup.Id)); } web.EnsureProperty(w => w.AssociatedVisitorGroup).EnsureProperties(g => g.Id, g => g.Title); web.EnsureProperty(w => w.AssociatedMemberGroup).EnsureProperties(g => g.Id, g => g.Title); web.EnsureProperty(w => w.AssociatedOwnerGroup).EnsureProperties(g => g.Id, g => g.Title); if (!web.AssociatedVisitorGroup.ServerObjectIsNull.Value) { _tokens.Add(new GroupIdToken(web, "associatedvisitorgroup", web.AssociatedVisitorGroup.Id)); } if (!web.AssociatedMemberGroup.ServerObjectIsNull.Value) { _tokens.Add(new GroupIdToken(web, "associatedmembergroup", web.AssociatedMemberGroup.Id)); } if (!web.AssociatedOwnerGroup.ServerObjectIsNull.Value) { _tokens.Add(new GroupIdToken(web, "associatedownergroup", web.AssociatedOwnerGroup.Id)); } // AppPackages tokens #if !ONPREMISES AddAppPackagesTokens(web); #endif var sortedTokens = from t in _tokens orderby t.GetTokenLength() descending select t; _tokens = sortedTokens.ToList(); }
public TokenParser(Web web, ProvisioningTemplate template) { web.EnsureProperties(w => w.ServerRelativeUrl, w => w.Language); _web = web; _tokens = new List <TokenDefinition>(); _tokens.Add(new SiteCollectionToken(web)); _tokens.Add(new SiteToken(web)); _tokens.Add(new MasterPageCatalogToken(web)); _tokens.Add(new SiteCollectionTermStoreIdToken(web)); _tokens.Add(new KeywordsTermStoreIdToken(web)); _tokens.Add(new ThemeCatalogToken(web)); _tokens.Add(new SiteNameToken(web)); _tokens.Add(new SiteIdToken(web)); _tokens.Add(new AssociatedGroupToken(web, AssociatedGroupToken.AssociatedGroupType.owners)); _tokens.Add(new AssociatedGroupToken(web, AssociatedGroupToken.AssociatedGroupType.members)); _tokens.Add(new AssociatedGroupToken(web, AssociatedGroupToken.AssociatedGroupType.visitors)); _tokens.Add(new GuidToken(web)); _tokens.Add(new CurrentUserIdToken(web)); _tokens.Add(new CurrentUserLoginNameToken(web)); _tokens.Add(new CurrentUserFullNameToken(web)); _tokens.Add(new AuthenticationRealmToken(web)); // Add lists web.Context.Load(web.Lists, ls => ls.Include(l => l.Id, l => l.Title, l => l.RootFolder.ServerRelativeUrl)); web.Context.ExecuteQueryRetry(); foreach (var list in web.Lists) { _tokens.Add(new ListIdToken(web, list.Title, list.Id)); _tokens.Add(new ListUrlToken(web, list.Title, list.RootFolder.ServerRelativeUrl.Substring(web.ServerRelativeUrl.Length + 1))); } if (web.IsSubSite()) { // Add lists from rootweb var rootWeb = (web.Context as ClientContext).Site.RootWeb; rootWeb.Context.Load(rootWeb.Lists, ls => ls.Include(l => l.Id, l => l.Title, l => l.RootFolder.ServerRelativeUrl)); rootWeb.Context.ExecuteQueryRetry(); foreach (var rootList in rootWeb.Lists) { // token already there? Skip the list if (web.Lists.FirstOrDefault(l => l.Title == rootList.Title) == null) { _tokens.Add(new ListIdToken(web, rootList.Title, rootList.Id)); _tokens.Add(new ListUrlToken(web, rootList.Title, rootList.RootFolder.ServerRelativeUrl.Substring(web.ServerRelativeUrl.Length + 1))); } } } // Add ContentTypes web.Context.Load(web.ContentTypes, cs => cs.Include(ct => ct.StringId, ct => ct.Name)); web.Context.ExecuteQueryRetry(); foreach (var ct in web.ContentTypes) { _tokens.Add(new ContentTypeIdToken(web, ct.Name, ct.StringId)); } // Add parameters foreach (var parameter in template.Parameters) { _tokens.Add(new ParameterToken(web, parameter.Key, parameter.Value)); } // Add TermSetIds TaxonomySession session = TaxonomySession.GetTaxonomySession(web.Context); var termStores = session.EnsureProperty(s => s.TermStores); foreach (var ts in termStores) { _tokens.Add(new TermStoreIdToken(web, ts.Name, ts.Id)); } var termStore = session.GetDefaultSiteCollectionTermStore(); web.Context.Load(termStore); web.Context.ExecuteQueryRetry(); if (!termStore.ServerObjectIsNull.Value) { web.Context.Load(termStore.Groups, g => g.Include( tg => tg.Name, tg => tg.TermSets.Include( ts => ts.Name, ts => ts.Id) )); web.Context.ExecuteQueryRetry(); foreach (var termGroup in termStore.Groups) { foreach (var termSet in termGroup.TermSets) { _tokens.Add(new TermSetIdToken(web, termGroup.Name, termSet.Name, termSet.Id)); } } } _tokens.Add(new SiteCollectionTermGroupIdToken(web)); _tokens.Add(new SiteCollectionTermGroupNameToken(web)); // Fields var fields = web.Fields; web.Context.Load(fields, flds => flds.Include(f => f.Title, f => f.InternalName)); web.Context.ExecuteQueryRetry(); foreach (var field in fields) { _tokens.Add(new FieldTitleToken(web, field.InternalName, field.Title)); } // Handle resources if (template.Localizations.Any()) { // Read all resource keys in a list List <Tuple <string, uint, string> > resourceEntries = new List <Tuple <string, uint, string> >(); foreach (var localizationEntry in template.Localizations) { var filePath = localizationEntry.ResourceFile; using (var stream = template.Connector.GetFileStream(filePath)) { if (stream != null) { using (ResXResourceReader resxReader = new ResXResourceReader(stream)) { foreach (DictionaryEntry entry in resxReader) { resourceEntries.Add(new Tuple <string, uint, string>(entry.Key.ToString(), (uint)localizationEntry.LCID, entry.Value.ToString())); } } } } } var uniqueKeys = resourceEntries.Select(k => k.Item1).Distinct(); foreach (var key in uniqueKeys) { var matches = resourceEntries.Where(k => k.Item1 == key); var entries = matches.Select(k => new ResourceEntry() { LCID = k.Item2, Value = k.Item3 }).ToList(); LocalizationToken token = new LocalizationToken(web, key, entries); _tokens.Add(token); } } // OOTB Roledefs web.EnsureProperty(w => w.RoleDefinitions.Include(r => r.RoleTypeKind)); foreach (var roleDef in web.RoleDefinitions.AsEnumerable().Where(r => r.RoleTypeKind != RoleType.None)) { _tokens.Add(new RoleDefinitionToken(web, roleDef)); } var sortedTokens = from t in _tokens orderby t.GetTokenLength() descending select t; _tokens = sortedTokens.ToList(); }
private void AddTermStoreTokens(Web web, List <string> tokenIds) { if (tokenIds.Contains("termstoreid") || tokenIds.Contains("termsetid") || tokenIds.Contains("sitecollectiontermgroupid") || tokenIds.Contains("sitecollectiontermgroupname") || tokenIds.Contains("sitecollectiontermsetid")) { TaxonomySession session = TaxonomySession.GetTaxonomySession(web.Context); if (tokenIds.Contains("termstoreid")) { var termStores = session.EnsureProperty(s => s.TermStores); foreach (var ts in termStores) { _tokens.Add(new TermStoreIdToken(web, ts.Name, ts.Id)); } } var termStore = session.GetDefaultSiteCollectionTermStore(); web.Context.Load(termStore); web.Context.ExecuteQueryRetry(); if (tokenIds.Contains("termsetid")) { if (!termStore.ServerObjectIsNull.Value) { web.Context.Load(termStore.Groups, g => g.Include( tg => tg.Name, tg => tg.TermSets.Include( ts => ts.Name, ts => ts.Id) )); web.Context.ExecuteQueryRetry(); foreach (var termGroup in termStore.Groups) { foreach (var termSet in termGroup.TermSets) { _tokens.Add(new TermSetIdToken(web, termGroup.Name, termSet.Name, termSet.Id)); } } } } if (tokenIds.Contains("sitecollectiontermgroupid")) { _tokens.Add(new SiteCollectionTermGroupIdToken(web)); } if (tokenIds.Contains("sitecollectiontermgroupname")) { _tokens.Add(new SiteCollectionTermGroupNameToken(web)); } if (tokenIds.Contains("sitecollectiontermsetid")) { var site = (web.Context as ClientContext).Site; var siteCollectionTermGroup = termStore.GetSiteCollectionGroup(site, true); web.Context.Load(siteCollectionTermGroup); try { web.Context.ExecuteQueryRetry(); if (null != siteCollectionTermGroup && !siteCollectionTermGroup.ServerObjectIsNull.Value) { web.Context.Load(siteCollectionTermGroup, group => group.TermSets.Include(ts => ts.Name, ts => ts.Id)); web.Context.ExecuteQueryRetry(); foreach (var termSet in siteCollectionTermGroup.TermSets) { _tokens.Add(new SiteCollectionTermSetIdToken(web, termSet.Name, termSet.Id)); } } } catch (ServerUnauthorizedAccessException) { // If we don't have permission to access the TermGroup, just skip it Log.Warning(Constants.LOGGING_SOURCE, CoreResources.TermGroup_No_Access); } catch (NullReferenceException) { // If there isn't a default TermGroup for the Site Collection, we skip the terms in token handler } } } }