/// <summary> /// Get checkpoints that have been created. /// </summary> /// <returns>Existing checkpoints.</returns> public Checkpoint[] GetCheckpoints() { SalesForceAPI.Tooling.queryResponse response = _client.ToolingClient.query(new SalesForceAPI.Tooling.queryRequest( new SalesForceAPI.Tooling.SessionHeader() { sessionId = _client.SessionId }, String.Format("SELECT Id, ActionScript, ActionScriptType, ExecutableEntityId, ExpirationDate, IsDumpingHeap, Iteration, Line, ScopeId FROM ApexExecutionOverlayAction WHERE ScopeId = '{0}'", _client.User.Id))); List <Checkpoint> result = new List <Checkpoint>(); if (response.result.records != null) { // get file names Dictionary <string, string> idToFileNameMap = new Dictionary <string, string>(); foreach (SalesForceAPI.Tooling.sObject record in response.result.records) { if (!idToFileNameMap.ContainsKey((record as SalesForceAPI.Tooling.ApexExecutionOverlayAction).ExecutableEntityId)) { idToFileNameMap.Add( (record as SalesForceAPI.Tooling.ApexExecutionOverlayAction).ExecutableEntityId, String.Empty); } } DataSelectResult names = _client.Data.Select(String.Format( "SELECT Id, Name FROM ApexClass WHERE Id IN ('{0}')", String.Join("','", idToFileNameMap.Keys))); foreach (DataRow row in names.Data.Rows) { idToFileNameMap.Remove(row["Id"] as string); idToFileNameMap.Add(row["Id"] as string, row["Name"] as string); } names = _client.Data.Select(String.Format( "SELECT Id, Name FROM ApexTrigger WHERE Id IN ('{0}')", String.Join("','", idToFileNameMap.Keys))); foreach (DataRow row in names.Data.Rows) { idToFileNameMap.Remove(row["Id"] as string); idToFileNameMap.Add(row["Id"] as string, row["Name"] as string); } // create checkpoints foreach (SalesForceAPI.Tooling.sObject record in response.result.records) { result.Add(new Checkpoint( record as SalesForceAPI.Tooling.ApexExecutionOverlayAction, idToFileNameMap[(record as SalesForceAPI.Tooling.ApexExecutionOverlayAction).ExecutableEntityId])); } } return(result.ToArray()); }
/// <summary> /// Get the code coverage for the entire org. /// </summary> /// <returns>The code coverage for the entire org.</returns> public CodeCoverage[] GetCodeCoverage() { // get all apex classes and triggers SourceFile[] files = _client.Meta.GetSourceFiles( new SourceFileType[] { new SourceFileType("ApexClass", null), new SourceFileType("ApexTrigger", null) }, false); Dictionary <string, SourceFile> fileMap = new Dictionary <string, SourceFile>(); foreach (SourceFile file in files) { if (!String.IsNullOrWhiteSpace(file.Id)) { fileMap.Add(file.Id, file); } } // get the code coverage SalesForceAPI.Tooling.queryResponse response = _client.ToolingClient.query(new SalesForceAPI.Tooling.queryRequest( new SalesForceAPI.Tooling.SessionHeader() { sessionId = _client.SessionId }, "SELECT ApexClassorTriggerId, Coverage FROM ApexCodeCoverageAggregate")); List <CodeCoverage> result = new List <CodeCoverage>(); if (response != null && response.result != null && response.result.records != null) { foreach (SalesForceAPI.Tooling.sObject obj in response.result.records) { SalesForceAPI.Tooling.ApexCodeCoverageAggregate coverage = obj as SalesForceAPI.Tooling.ApexCodeCoverageAggregate; if (coverage != null) { if (!String.IsNullOrWhiteSpace(coverage.ApexClassOrTriggerId) && fileMap.ContainsKey(coverage.ApexClassOrTriggerId)) { CodeCoverage cc = new CodeCoverage(fileMap[coverage.ApexClassOrTriggerId], coverage); if (cc.LinesUncovered.Length != 0 || cc.LinesCovered.Length != 0) { result.Add(cc); } } } } } return(result.ToArray()); }
/// <summary> /// Get the logs for the given user. /// </summary> /// <param name="userId">The id of the user to get logs for.</param> /// <returns>The log for the given user.</returns> public Log[] GetLogs(string userId) { SalesForceAPI.Tooling.queryResponse response = _client.ToolingClient.query(new SalesForceAPI.Tooling.queryRequest( new SalesForceAPI.Tooling.SessionHeader() { sessionId = _client.SessionId }, String.Format("SELECT Id, StartTime, DurationMilliseconds, Operation, Status FROM ApexLog WHERE LogUserId = '{0}' ORDER BY StartTime DESC", userId))); List <Log> result = new List <Log>(); if (response.result.records != null) { // create logs foreach (SalesForceAPI.Tooling.ApexLog log in response.result.records) { result.Add(new Log(log)); } } return(result.ToArray()); }
/// <summary> /// Get the overall code coverage percent. /// </summary> /// <returns>The overall code coverage percent.</returns> public int GetOverallCodeCoveragePercent() { // get the code coverage SalesForceAPI.Tooling.queryResponse response = _client.ToolingClient.query(new SalesForceAPI.Tooling.queryRequest( new SalesForceAPI.Tooling.SessionHeader() { sessionId = _client.SessionId }, "SELECT PercentCovered FROM ApexOrgWideCoverage")); if (response != null && response.result != null && response.result.records != null && response.result.records.Length == 1) { SalesForceAPI.Tooling.ApexOrgWideCoverage coverage = response.result.records[0] as SalesForceAPI.Tooling.ApexOrgWideCoverage; if (coverage != null && coverage.PercentCovered.HasValue) { return(coverage.PercentCovered.Value); } } return(0); }
/// <summary> /// Get all of the log listeners that currently exist. /// </summary> /// <returns>The currently existing log listeners.</returns> public LogListener[] GetLogListeners() { SalesForceAPI.Tooling.queryResponse response = _client.ToolingClient.query(new SalesForceAPI.Tooling.queryRequest( new SalesForceAPI.Tooling.SessionHeader() { sessionId = _client.SessionId }, String.Format("SELECT Id, ApexCode, ApexProfiling, Callout, Database, ExpirationDate, ScopeId, System, TracedEntityId, Validation, Visualforce, Workflow FROM TraceFlag WHERE ExpirationDate > {0}", DateTime.UtcNow.ToString("yyyy-MM-ddThh:mm:ssZ")))); List <LogListener> result = new List <LogListener>(); if (response.result.records != null) { // get entity names Dictionary <string, string> names = new Dictionary <string, string>(); foreach (SalesForceAPI.Tooling.TraceFlag traceFlag in response.result.records) { if (traceFlag.ScopeId != null && !names.ContainsKey(traceFlag.ScopeId)) { names.Add(traceFlag.ScopeId, String.Empty); } if (traceFlag.TracedEntityId != null && !names.ContainsKey(traceFlag.TracedEntityId)) { names.Add(traceFlag.TracedEntityId, String.Empty); } } DataSelectResult nameData = _client.Data.SelectAll(String.Format( "SELECT Id, Name FROM User WHERE Id IN ('{0}')", String.Join("','", names.Keys))); foreach (DataRow row in nameData.Data.Rows) { names[row["Id"] as string] = String.Format("{0} (user)", row["Name"]); } nameData = _client.Data.SelectAll(String.Format( "SELECT Id, Name FROM ApexClass WHERE Id IN ('{0}')", String.Join("','", names.Keys))); foreach (DataRow row in nameData.Data.Rows) { names[row["Id"] as string] = String.Format("{0} (class)", row["Name"]); } nameData = _client.Data.SelectAll(String.Format( "SELECT Id, Name FROM ApexTrigger WHERE Id IN ('{0}')", String.Join("','", names.Keys))); foreach (DataRow row in nameData.Data.Rows) { names[row["Id"] as string] = String.Format("{0} (trigger)", row["Name"]); } // create log listener foreach (SalesForceAPI.Tooling.TraceFlag traceFlag in response.result.records) { result.Add(new LogListener( traceFlag, (traceFlag.ScopeId != null) ? names[traceFlag.ScopeId] : String.Empty, (traceFlag.TracedEntityId != null) ? names[traceFlag.TracedEntityId] : String.Empty)); } } return(result.ToArray()); }