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 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 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.EnsureProperty(w => w.ServerRelativeUrl); 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(rootWeb.ServerRelativeUrl.Length + 1))); } } } // Add ContentTypes web.Context.Load(web.AvailableContentTypes, cs => cs.Include(ct => ct.StringId, ct => ct.Name)); web.Context.ExecuteQueryRetry(); foreach (var ct in web.AvailableContentTypes) { _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)); } 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)); foreach (var roleDef in web.RoleDefinitions.AsEnumerable().Where(r => r.RoleTypeKind != RoleType.None)) { _tokens.Add(new RoleDefinitionToken(web, roleDef)); } // 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)); } 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)); // 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))); } // 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 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)); // 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); } } var sortedTokens = from t in _tokens orderby t.GetTokenLength() descending select t; _tokens = sortedTokens.ToList(); }