Ejemplo n.º 1
0
        internal static void Click(DTE dte)
        {
            try
            {
                dte.StatusBar.Animate(true, vsStatusAnimation.vsStatusAnimationDeploy);
                var config = UtilityPackage.IsValid(dte);
                if (config == null)
                {
                    return;
                }
                UtilityPackage.SetDTEStatusBar(dte, " !!! Read DynamicsCrm.DevKit.Cli.json config !!! ");
                var check = UtilityPackage.GetGlobal("CrmService", dte);
                if (check == null)
                {
                    var connection = UtilityPackage.IsConnection(config.CrmConnection);
                    if (connection == null)
                    {
                        UtilityPackage.SetDTEStatusBar(dte, " !!! Connection Dynamics CRM  failed !!! ", true);
                        return;
                    }
                    UtilityPackage.SetGlobal("CrmService", connection, dte);
                }
                var crmService = (OrganizationServiceProxy)UtilityPackage.GetGlobal("CrmService", dte);
                UtilityPackage.SetDTEStatusBar(dte, " !!! Connected Dynamics CRM !!! ");
                var webResourceId = IsFoundWebResource(dte, crmService, config.JsonWebResource.prefix);
                if (webResourceId == Guid.Empty)
                {
                    UtilityPackage.SetDTEStatusBar(dte, " !!! WebResource not found !!! ", true);
                    return;
                }
                var requests = new OrganizationRequestCollection();

                var webResource = new Entity("webresource")
                {
                    Id = webResourceId
                };
                var content = File.ReadAllText(dte.ActiveDocument.FullName);
                webResource["content"] = Convert.ToBase64String(Encoding.UTF8.GetBytes(content));
                var request = new UpdateRequest {
                    Target = webResource
                };
                requests.Add(request);

                var publishXml = $"<importexportxml><webresources><webresource>{webResource.Id}</webresource></webresources></importexportxml>";
                var pubRequest = new PublishXmlRequest {
                    ParameterXml = publishXml
                };
                requests.Add(pubRequest);

                var multipleRequest = new ExecuteMultipleRequest
                {
                    Requests = requests,
                    Settings = new ExecuteMultipleSettings
                    {
                        ContinueOnError = false,
                        ReturnResponses = true
                    }
                };
                UtilityPackage.SetDTEStatusBar(dte, " !!! Updating & publishing WebResource !!! ");
                var multipleResponse = (ExecuteMultipleResponse)crmService.Execute(multipleRequest);
                foreach (var response in multipleResponse.Responses)
                {
                    if (response.Fault == null)
                    {
                        continue;
                    }
                    UtilityPackage.SetDTEStatusBar(dte, " !!! Deploy WebResource failed !!! ", true);
                    return;
                }
                UtilityPackage.SetDTEStatusBar(dte, " !!! Deploy WebResource succeeded !!! ", true);
            }
            catch
            {
                UtilityPackage.SetDTEStatusBar(dte, " !!! Deploy WebResource failed !!! ", true);
            }
        }
        private static void BuildEvents_OnBuildProjConfigDone(string Project, string ProjectConfig, string Platform, string SolutionConfig, bool Success)
        {
            DTE.Events.BuildEvents.OnBuildProjConfigDone -= BuildEvents_OnBuildProjConfigDone;
            if (!Success || !ProjectUniqueName.EndsWith(Project))
            {
                return;
            }
            UtilityPackage.SetDTEStatusBar(DTE, "Build project report succeeded!");
#if DEBUG
            ProjectUniqueName = @"C:\src\github\phuocle\Dynamics-Crm-DevKit\test\TestReport\Test.Abc.Report.2015\Test.Abc.Report.2015.rptproj";
#endif
            var xml  = File.ReadAllText(ProjectUniqueName);
            var xdoc = XDocument.Parse(xml);
            //Fist check for project VS2015
            var node = (from x in xdoc?.Descendants("Project")?.Descendants("Configurations")?.Elements("Configuration")
                        where x?.Element("Name")?.Value == ProjectConfig
                        select x)?.FirstOrDefault();
            var outputPath = node?.Descendants("Options")?.FirstOrDefault()?.Element("OutputPath")?.Value;
            //if null, then check for project VS2017
            if (outputPath == null)
            {
                var nodes = (from x in xdoc?.Root.Elements()
                             where x?.Name?.LocalName == "PropertyGroup"
                             select x);
                foreach (var n in nodes)
                {
                    if (n.Elements().Where(x => x?.Name?.LocalName == "FullPath" && x?.Value == "Debug").Any())
                    {
                        outputPath = n.Elements().Where(x => x?.Name?.LocalName == "OutputPath").FirstOrDefault()?.Value;
                        break;
                    }
                }
            }
            if (outputPath == null)
            {
                throw new Exception("Cannot read the Output directory of the current report project");
            }
            var folderOutput = Path.Combine(Path.GetDirectoryName(ProjectUniqueName), outputPath);
            var fileName     = Path.GetFileName(DTE.SelectedItems.Item(1).ProjectItem.FileNames[0]);
            var deployFile   = Path.Combine(folderOutput, fileName);
            if (!File.Exists(deployFile))
            {
                throw new Exception($"Cannot find deployable report: {deployFile}");
            }

            var config = UtilityPackage.IsValid(DTE);
            if (config == null)
            {
                return;
            }
            UtilityPackage.SetDTEStatusBar(DTE, " !!! Read DynamicsCrm.DevKit.Cli.json config !!! ");
            var check = UtilityPackage.GetGlobal("CrmService", DTE);
            if (check == null)
            {
                var connection = UtilityPackage.IsConnection(config.CrmConnection);
                if (connection == null)
                {
                    UtilityPackage.SetDTEStatusBar(DTE, " !!! Connection Dynamics CRM  failed !!! ", true);
                    return;
                }
                UtilityPackage.SetGlobal("CrmService", connection, DTE);
            }
            var crmService = (IOrganizationService)UtilityPackage.GetGlobal("CrmService", DTE);
            UtilityPackage.SetDTEStatusBar(DTE, " !!! Connected Dynamics CRM !!! ");

            var fetchData = new
            {
                ismanaged = "0",
                filename  = fileName
            };
            var fetchXml = $@"
<fetch>
  <entity name='report'>
    <attribute name='reportid' />
    <filter type='and'>
      <condition attribute='ismanaged' operator='eq' value='{fetchData.ismanaged/*0*/}'/>
      <condition attribute='filename' operator='eq' value='{fetchData.filename/*ReportTemplate.rdl*/}'/>
    </filter>
  </entity>
</fetch>";
            var rows     = crmService.RetrieveMultiple(new FetchExpression(fetchXml));
            if (rows.Entities.Count == 0)
            {
                throw new Exception("Please deploy this report first by Dynamics 365");
            }
            if (rows.Entities.Count != 1)
            {
                throw new Exception($"Found {rows.Entities.Count} reports file name: {fileName} in the system. Cannot deploy.");
            }
            UtilityPackage.SetDTEStatusBar(DTE, "Deploying Report ...");
            var update = new Entity("report", rows.Entities[0].Id);
            update["bodytext"] = File.ReadAllText(deployFile);
            crmService.Update(update);
            UtilityPackage.SetDTEStatusBar(DTE, "   !!!   Deploy Report succeeded   !!!   ", true);
        }