示例#1
0
        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();
        }
示例#2
0
        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);
        }