protected override void ExecuteInternal(string filePath, OrganizationServiceContext ctx) { _trace.WriteLine("Searching for webresources in '{0}'", filePath); ConfigFile config = null; try { var configs = ConfigFile.FindConfig(filePath); config = configs[0]; } catch { config = new ConfigFile() { filePath = filePath, }; } if (config.webresources == null || config.webresources.Count == 0) { // Add a webresource seciton config.webresources = new List <WebresourceDeployConfig> { new WebresourceDeployConfig { files = new List <WebResourceFile>() } }; } var newWebResources = new List <WebResourceFile>(); var files = config.webresources.Where(a => a.files != null).SelectMany(a => a.files); Dictionary <string, WebResourceFile> existingWebResources = new Dictionary <string, WebResourceFile>(); foreach (var file in files) { string key = file.uniquename.ToLower(); if (!existingWebResources.ContainsKey(key)) { existingWebResources[key] = file; } else { var duplicate = new SparkleTaskException(SparkleTaskException.ExceptionTypes.DUPLICATE_FILE, String.Format("Duplicate file in webresource config '{0}'. Config at '{1}'", file.file, filePath)); throw duplicate; } } var webresources = DirectoryEx.Search(filePath, "*.js|*.htm|*.html|*.css|*.xap|*.png|*.jpeg|*.jpg|*.gif|*.ico|*.xml", null); // Get a list of all webresources! var matchList = ctx.GetWebresources().ToDictionary(w => w.Name.ToLower().Replace(Prefix + (Prefix.EndsWith("_")? "" :"_"), "")); foreach (var filename in webresources) { _trace.WriteLine("Found '{0}'", filename); var file = filename.Replace("\\", "/").ToLower(); // Find if there are any matches var match = matchList.Keys.Where(w => file.Contains(w)).FirstOrDefault(); if (match != null) { _trace.WriteLine(String.Format("Found webresource {0}", match)); var webresource = matchList[match]; var webresourcePath = filename.Replace(config.filePath, "").TrimStart('\\').TrimStart('/'); // is it already in the config file var existingMatch = existingWebResources.Keys.Where(w => webresource.Name.Contains(w)).FirstOrDefault(); if (existingMatch != null) { continue; } var webresourceFile = new WebResourceFile { uniquename = webresource.Name, file = webresourcePath, displayname = "" + webresource.DisplayName, description = "" + webresource.Description }; // If the displayname is the same as the uniquename then we only need the unique name if (webresourceFile.displayname == webresourceFile.uniquename) { webresourceFile.displayname = null; } newWebResources.Add(webresourceFile); } } var webresourceConfig = config.GetWebresourceConfig(null).FirstOrDefault(); if (webresourceConfig == null) { throw new Exception("Cannot find webresource section in spkl.json"); } if (webresourceConfig.files == null) { webresourceConfig.files = new List <WebResourceFile>(); } webresourceConfig.files.AddRange(newWebResources); config.Save(); }
private void DeployWebResource(WebResourceFile webResourceFile, int current, int totalWebResources) { var len = totalWebResources.ToString().Length; if (webResourceFile.uniquename.StartsWith("/")) { webResourceFile.uniquename = webResourceFile.uniquename.Substring(1); } var fetchData = new { name = webResourceFile.uniquename, name2 = webResourceFile.uniquename.Substring(0, webResourceFile.uniquename.LastIndexOf('.')) }; var fetchXml = $@" <fetch> <entity name='webresource'> <attribute name='content' /> <attribute name='webresourceid' /> <attribute name='name' /> <attribute name='iscustomizable' /> <attribute name='ismanaged' /> <filter type='or'> <condition attribute='name' operator='eq' value='{fetchData.name}'/> <condition attribute='name' operator='eq' value='{fetchData.name2}'/> </filter> </entity> </fetch>"; var rows = crmServiceClient.RetrieveMultiple(new FetchExpression(fetchXml)); var content = string.Empty; var webResourceId = Guid.Empty; if (rows.Entities.Count > 0) { if (rows.Entities.Count == 1) { var entity = rows.Entities[0]; var ismanaged = entity.GetAttributeValue <bool?>("ismanaged"); var iscustomizable = entity.GetAttributeValue <BooleanManagedProperty>("iscustomizable"); if (ismanaged.HasValue && ismanaged.Value == true) { if (iscustomizable?.Value == false) { CliLog.WriteLine(CliLog.ColorWhite, "|", CliLog.ColorGreen, string.Format("{0,0}{1," + len + "}", "", current) + ": ", CliLog.ColorRed, "Update webresource failed because the setting webresource.iscustomizable = false - ", CliLog.ColorGreen, webResourceFile.uniquename); return; } } webResourceId = entity.Id; content = entity?["content"]?.ToString(); } else { foreach (var entity in rows.Entities) { if (entity.GetAttributeValue <string>("name") != fetchData.name) { continue; } var ismanaged = entity.GetAttributeValue <bool?>("ismanaged"); var iscustomizable = entity.GetAttributeValue <BooleanManagedProperty>("iscustomizable"); if (ismanaged.HasValue && ismanaged.Value == true) { if (iscustomizable?.Value == false) { CliLog.WriteLine(CliLog.ColorWhite, "|", CliLog.ColorGreen, string.Format("{0,0}{1," + len + "}", "", current) + ": ", CliLog.ColorRed, "Update webresource failed because the setting webresource.iscustomizable = false - ", CliLog.ColorGreen, webResourceFile.uniquename); return; } } webResourceId = entity.Id; content = entity?["content"]?.ToString(); break; } } } var fileContent = Convert.ToBase64String(File.ReadAllBytes(webResourceFile.file)); if (fileContent == content) { CliLog.WriteLine(CliLog.ColorWhite, "|", CliLog.ColorBlue, string.Format("{0,0}{1," + len + "}", "", current) + ": ", CliLog.ColorGreen, webResourceFile.file.Substring(currentDirectory.Length + 1)); AddWebResourceToSolution(new Entity("webresource") { ["name"] = webResourceFile.uniquename, ["webresourceid"] = webResourceId }); return; } var webResource = new Entity("webresource") { ["name"] = webResourceFile.uniquename, ["displayname"] = webResourceFile.displayname, ["description"] = webResourceFile.version, ["content"] = fileContent }; var webResourceFileInfo = new FileInfo(webResourceFile.file); var fileType = WebResourceWebResourceType.ScriptJScript; switch (webResourceFileInfo.Extension.ToLower().TrimStart('.')) { case "html": case "htm": fileType = WebResourceWebResourceType.WebpageHtml; break; case "js": fileType = WebResourceWebResourceType.ScriptJScript; break; case "png": fileType = WebResourceWebResourceType.PngFormat; break; case "gif": fileType = WebResourceWebResourceType.GifFormat; break; case "jpg": case "jpeg": fileType = WebResourceWebResourceType.JpgFormat; break; case "css": fileType = WebResourceWebResourceType.StyleSheetCss; break; case "ico": fileType = WebResourceWebResourceType.IcoFormat; break; case "xml": fileType = WebResourceWebResourceType.DataXml; break; case "xsl": case "xslt": fileType = WebResourceWebResourceType.StyleSheetXsl; break; case "xap": fileType = WebResourceWebResourceType.SilverlightXap; break; case "resx": fileType = WebResourceWebResourceType.StringResx; break; case "svg": fileType = WebResourceWebResourceType.SvgFormat; break; } webResource["webresourcetype"] = new OptionSetValue((int)fileType); if (fileType == WebResourceWebResourceType.StringResx) { var fileName = webResourceFileInfo.Name.Substring(0, webResourceFileInfo.Name.Length - webResourceFileInfo.Extension.Length); var arr = fileName.Split(".".ToCharArray()); if (int.TryParse(arr[arr.Length - 1], out var languagecode)) { var req = new RetrieveProvisionedLanguagesRequest(); var res = (RetrieveProvisionedLanguagesResponse)crmServiceClient.Execute(req); if (res.RetrieveProvisionedLanguages.Contains(languagecode)) { webResource["languagecode"] = languagecode; } else { throw new Exception($"Language code not found: {languagecode}"); } } } if (webResourceId == Guid.Empty) { CliLog.WriteLine(CliLog.ColorWhite, "|", CliLog.ColorBlue, string.Format("{0,0}{1," + len + "}", "", current), ": ", CliLog.ColorMagenta, "Creating", CliLog.ColorGreen, " WebResource ", CliLog.ColorCyan, webResourceFile.file, CliLog.ColorGreen, " to ", CliLog.ColorCyan, webResourceFile.uniquename); webResourceId = crmServiceClient.Create(webResource); webResource["webresourceid"] = webResourceId; } else { webResource["webresourceid"] = webResourceId; CliLog.WriteLine(CliLog.ColorWhite, "|", CliLog.ColorBlue, string.Format("{0,0}{1," + len + "}", "", current), ": ", CliLog.ColorMagenta, "Updating", CliLog.ColorGreen, " WebResource ", CliLog.ColorCyan, webResourceFile.file, CliLog.ColorGreen, " to ", CliLog.ColorCyan, webResourceFile.uniquename); crmServiceClient.Update(webResource); } WebResourcesToPublish.Add(webResourceId); AddWebResourceToSolution(webResource); }