private Tuple<List<IssueBCF>, List<Issue>> AddIssue(string path, bool isBcf) { try { // set image export settings ComApi.InwOaPropertyVec options = ComBridge.State.GetIOPluginOptions("lcodpimage"); // configure the option "export.image.format" to export png and image size foreach (ComApi.InwOaProperty opt in options.Properties()) { if (opt.name == "export.image.format") opt.value = "lcodpexpng"; if (opt.name == "export.image.width") opt.value = 1600; if (opt.name == "export.image.height") opt.value = 900; } _savedViewpoints = new List<SavedViewpoint>(); foreach (SavedItem oSI in _oDoc.SavedViewpoints.ToSavedItemCollection()) { RecurseItems(oSI); } var types = new ObservableCollection<Issuetype>(); var assignees = new List<User>(); var components = new ObservableCollection<Component>(); var priorities = new ObservableCollection<Priority>(); var noCom = true; var noPrior = true; var noAssign = true; if (!isBcf) { types = mainPan.jira.TypesCollection; assignees = mainPan.getAssigneesProj(); components = mainPan.jira.ComponentsCollection; priorities = mainPan.jira.PrioritiesCollection; noCom = mainPan.jira.ProjectsCollection[mainPan.jiraPan.projIndex].issuetypes[0].fields.components == null; noPrior = mainPan.jira.ProjectsCollection[mainPan.jiraPan.projIndex].issuetypes[0].fields.priority == null; noAssign = mainPan.jira.ProjectsCollection[mainPan.jiraPan.projIndex].issuetypes[0].fields.assignee == null; } AddIssueNavis ain = new AddIssueNavis(_savedViewpoints, types, assignees, components, priorities, noCom, noPrior, noAssign); if (isBcf) ain.JiraFieldsBox.Visibility = System.Windows.Visibility.Collapsed; ain.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen; ain.ShowDialog(); if (ain.DialogResult.HasValue && ain.DialogResult.Value) { int elemCheck = 2; if (ain.all.IsChecked.Value) elemCheck = 0; else if (ain.selected.IsChecked.Value) elemCheck = 1; List<SavedViewpoint> savedViewpointsImport = new List<SavedViewpoint>(); for (int i = 0; i < ain.issueList.SelectedItems.Count; i++) { int index = ain.issueList.Items.IndexOf(ain.issueList.SelectedItems[i]); savedViewpointsImport.Add(_savedViewpoints[index]); } if (!savedViewpointsImport.Any()) return null; //get selection only once! if (elemCheck == 1) _elementList = _oDoc.CurrentSelection.SelectedItems.Where(o => o.InstanceGuid != Guid.Empty).ToList<ModelItem>(); List<IssueBCF> issues = new List<IssueBCF>(); List<Issue> issuesJira = new List<Issue>(); foreach (var sv in savedViewpointsImport) { Issue issueJira = new Issue(); if (!isBcf) { issueJira.fields = new Fields(); issueJira.fields.issuetype = (Issuetype)ain.issueTypeCombo.SelectedItem; issueJira.fields.priority = (Priority)ain.priorityCombo.SelectedItem; if (!string.IsNullOrEmpty(ain.ChangeAssign.Content.ToString()) && ain.ChangeAssign.Content.ToString() != "none") { issueJira.fields.assignee = new User(); issueJira.fields.assignee.name = ain.ChangeAssign.Content.ToString(); } if (ain.SelectedComponents != null && ain.SelectedComponents.Any()) { issueJira.fields.components = ain.SelectedComponents; } } IssueBCF issue = new IssueBCF(); string folderIssue = Path.Combine(path, issue.guid.ToString()); if (!Directory.Exists(folderIssue)) Directory.CreateDirectory(folderIssue); issue.snapshot = Path.Combine(folderIssue, "snapshot.png"); // set the currtent saved viewpoint and then generate sna and BCF viewpoint _oDoc.SavedViewpoints.CurrentSavedViewpoint = sv; issue.viewpoint = generateViewpoint(sv.Viewpoint, elemCheck); generateSnapshot(folderIssue); issue.markup.Topic.Title = sv.DisplayName; issue.markup.Header[0].IfcProject = ""; string projFilename = !string.IsNullOrEmpty(_oDoc.FileName) ? System.IO.Path.GetFileName(_oDoc.FileName) : ""; issue.markup.Header[0].Filename = projFilename; issue.markup.Header[0].Date = DateTime.Now; //comment if (sv.Comments.Any()) { foreach (var comm in sv.Comments) { var c = new CommentBCF { Comment1 = comm.Body, Topic = new CommentTopic { Guid = issue.guid.ToString() } }; ; c.Date = DateTime.Now; c.VerbalStatus = comm.Status.ToString(); c.Author = (string.IsNullOrWhiteSpace(mainPan.jira.Self.displayName)) ? MySettings.Get("BCFusername") : mainPan.jira.Self.displayName; issue.markup.Comment.Add(c); } } issues.Add(issue); issuesJira.Add(issueJira); } // end foreach return new Tuple<List<IssueBCF>, List<Issue>>(issues, issuesJira); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } return null; }
void worker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; XmlSerializer serializerV = new XmlSerializer(typeof(VisualizationInfo)); int newIssueCounter = 0; int updateIssueCounter = 0; int unchangedIssueCounter = 0; for (int i = 0; i < issues.Count(); i++) { try { Markup issue = issues[i]; worker.ReportProgress((100 * i + 1) / issues.Count(), getProgressString(i + 1));// HAS TO BE OUT OF THE DISPATCHER! // check status on each step if (worker.CancellationPending == true) { e.Cancel = true; return; // abort work, if it's cancelled } //CHECK IF ALREADY EXISTING // could use the expression: cf[11600] ~ "aaaa" // = operator not supported string fields = " AND GUID~" + issue.Topic.Guid + "&fields=key,comment"; string query = "search?jql=project=\"" + projectKey + "\"" + fields; var request4 = new RestRequest(query, Method.GET); request4.AddHeader("Content-Type", "application/json"); request4.RequestFormat = Arup.RestSharp.DataFormat.Json; var response4 = JiraClient.Client.Execute <Issues>(request4); if (!RestCallback.Check(response4)) { break; } //DOESN'T exist already if (!response4.Data.issues.Any()) { //files to be uploaded List <string> filesToBeUploaded = new List <string>(); if (File.Exists(Path.Combine(path, issue.Topic.Guid, "markup.bcf"))) { filesToBeUploaded.Add(Path.Combine(path, issue.Topic.Guid, "markup.bcf")); } issue.Viewpoints.ToList().ForEach(vp => { if (!string.IsNullOrWhiteSpace(vp.Snapshot) && File.Exists(Path.Combine(path, issue.Topic.Guid, vp.Snapshot))) { filesToBeUploaded.Add(Path.Combine(path, issue.Topic.Guid, vp.Snapshot)); } if (!string.IsNullOrWhiteSpace(vp.Viewpoint) && File.Exists(Path.Combine(path, issue.Topic.Guid, vp.Viewpoint))) { filesToBeUploaded.Add(Path.Combine(path, issue.Topic.Guid, vp.Viewpoint)); } }); string key = ""; //update view - it might be a new issue (for direct Jira upload) // Serialize the object, and close the TextWriter string viewpoint = Path.Combine(path, issue.Topic.Guid, "viewpoint.bcfv"); if (!File.Exists(viewpoint)) { Stream writerV = new FileStream(viewpoint, FileMode.Create); serializerV.Serialize(writerV, issue.Viewpoints[0].VisInfo); writerV.Close(); } if (filesToBeUploaded.Find(file => file == viewpoint) == null) { filesToBeUploaded.Add(viewpoint); } var request = new RestRequest("issue", Method.POST); request.AddHeader("Content-Type", "application/json"); request.RequestFormat = Arup.RestSharp.DataFormat.Json; newIssueCounter++; var newissue = new { fields = new Dictionary <string, object>() }; newissue.fields.Add("project", new { key = projectKey }); if (!string.IsNullOrWhiteSpace(issuesJira[i].fields.description)) { newissue.fields.Add("description", issuesJira[i].fields.description); } newissue.fields.Add("summary", (string.IsNullOrWhiteSpace(issue.Topic.Title)) ? "no title" : issue.Topic.Title); newissue.fields.Add("issuetype", new { id = issuesJira[i].fields.issuetype.id }); newissue.fields.Add(MySettings.Get("guidfield"), issue.Topic.Guid); // validate assignee name if present if (issuesJira[i].fields.assignee != null) { if (!string.IsNullOrWhiteSpace(issuesJira[i].fields.assignee.name)) { if (isAssigneeAssignable(issuesJira[i].fields.assignee.name, projectKey)) { newissue.fields.Add("assignee", new { name = issuesJira[i].fields.assignee.name, id = issuesJira[i].fields.assignee.accountId }); } else { newissue.fields.Add("assignee", new { name = issuesJira[i].fields.creator.name, id = issuesJira[i].fields.creator.accountId }); } } } if (issuesJira[i].fields.priority != null) { newissue.fields.Add("priority", new { id = issuesJira[i].fields.priority.id }); } if (issuesJira[i].fields.components != null && issuesJira[i].fields.components.Any()) { newissue.fields.Add("components", issuesJira[i].fields.components); } if (issuesJira[i].fields.labels != null && issuesJira[i].fields.labels.Any()) { newissue.fields.Add("labels", issuesJira[i].fields.labels); } request.AddBody(newissue); var response = JiraClient.Client.Execute(request); var responseIssue = new Issue(); if (RestCallback.Check(response)) { responseIssue = Arup.RestSharp.SimpleJson.DeserializeObject <Issue>(response.Content); key = responseIssue.key;//attach and comment sent to the new issue } else { uploadErrors++; break; } //upload all viewpoints and snapshots var request2 = new RestRequest("issue/" + key + "/attachments", Method.POST); request2.AddHeader("X-Atlassian-Token", "nocheck"); request2.RequestFormat = Arup.RestSharp.DataFormat.Json; filesToBeUploaded.ForEach(file => request2.AddFile("file", File.ReadAllBytes(file), Path.GetFileName(file))); var response2 = JiraClient.Client.Execute(request2); RestCallback.Check(response2); //ADD COMMENTS if (issue.Comment.Any()) { issue.Comment = new System.Collections.ObjectModel.ObservableCollection <BCF2.Comment>(issue.Comment.Reverse()); foreach (var c in issue.Comment) { var request3 = new RestRequest("issue/" + key + "/comment", Method.POST); request3.AddHeader("Content-Type", "application/json"); request3.RequestFormat = Arup.RestSharp.DataFormat.Json; var newcomment = new { body = c.Comment1 }; request3.AddBody(newcomment); var response3 = JiraClient.Client.Execute <Comment2>(request3); if (!RestCallback.Check(response3)) { break; } } } if (i == issues.Count() - 1) { worker.ReportProgress(100, getProgressString(i + 1)); } } else //UPDATE ISSUE { var oldIssue = response4.Data.issues.First(); if (issue.Comment.Any()) { issue.Comment = new System.Collections.ObjectModel.ObservableCollection <BCF2.Comment>(issue.Comment.Reverse()); int unmodifiedCommentNumber = 0; foreach (var c in issue.Comment) { //clean all metadata annotations string newComment = cleanAnnotationInComment(c.Comment1); string normalized1 = Regex.Replace(newComment, @"\s", ""); if (oldIssue.fields.comment.comments.Any(o => Regex.Replace(cleanAnnotationInComment(o.body), @"\s", "").Equals(normalized1, StringComparison.OrdinalIgnoreCase))) { unmodifiedCommentNumber++; continue; } var request3 = new RestRequest("issue/" + oldIssue.key + "/comment", Method.POST); request3.AddHeader("Content-Type", "application/json"); request3.RequestFormat = Arup.RestSharp.DataFormat.Json; var newcomment = new { body = c.Comment1 }; request3.AddBody(newcomment); var response3 = JiraClient.Client.Execute <Comment2>(request3); //upload viewpoint and snapshot var request5 = new RestRequest("issue/" + oldIssue.key + "/attachments", Method.POST); request5.AddHeader("X-Atlassian-Token", "nocheck"); request5.RequestFormat = Arup.RestSharp.DataFormat.Json; issue.Viewpoints.ToList().ForEach(vp => { if (c.Viewpoint != null) { if (vp.Guid == c.Viewpoint.Guid) { if (File.Exists(Path.Combine(path, issue.Topic.Guid, vp.Snapshot))) { request5.AddFile("file", File.ReadAllBytes(Path.Combine(path, issue.Topic.Guid, vp.Snapshot)), vp.Snapshot); } if (File.Exists(Path.Combine(path, issue.Topic.Guid, vp.Viewpoint))) { request5.AddFile("file", File.ReadAllBytes(Path.Combine(path, issue.Topic.Guid, vp.Viewpoint)), vp.Viewpoint); } } } }); if (request5.Files.Count > 0) { var response5 = JiraClient.Client.Execute(request5); RestCallback.Check(response5); } if (!RestCallback.Check(response3)) { break; } } if (unmodifiedCommentNumber == issue.Comment.Count) { unchangedIssueCounter++; } else { updateIssueCounter++; } } else { unchangedIssueCounter++; } } } // END TRY catch (System.Exception ex1) { MessageBox.Show("exception: " + ex1); } }// END LOOP string msg = string.Format("{0} new issue(s) added, {1} issue(s) updated, and {2} issue(s) unchanged.", newIssueCounter, updateIssueCounter, unchangedIssueCounter); MessageBox.Show(msg, "Success", MessageBoxButton.OK, MessageBoxImage.Information); }
void worker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; XmlSerializer serializerV = new XmlSerializer(typeof(VisualizationInfo)); for (int i = 0; i < issues.Count(); i++) { try { IssueBCF issue = issues[i]; worker.ReportProgress((100 * i + 1) / issues.Count(), getProgressString(i + 1));// HAS TO BE OUT OF THE DISPATCHER! // check status on each step if (worker.CancellationPending == true) { e.Cancel = true; return; // abort work, if it's cancelled } //CHECK IF ALREADY EXISTING // could use the expression: cf[11600] ~ "aaaa" // = operator not supported string fields = " AND GUID~" + issue.guid.ToString() + "&fields=key,comment"; string query = "search?jql=project=" + projectKey + fields; var request4 = new RestRequest(query, Method.GET); request4.AddHeader("Content-Type", "application/json"); request4.RequestFormat = RestSharp.DataFormat.Json; var response4 = JiraClient.Client.Execute<Issues>(request4); if (!RestCallback.Check(response4)) break; //DOESN'T exist already if (!response4.Data.issues.Any()) { string snapshot = Path.Combine(path, issue.guid.ToString(), "snapshot.png"); string viewpoint = Path.Combine(path, issue.guid.ToString(), "viewpoint.bcfv"); string key = ""; //update view - it might be a new issue // Serialize the object, and close the TextWriter Stream writerV = new FileStream(viewpoint, FileMode.Create); serializerV.Serialize(writerV, issue.viewpoint); writerV.Close(); var request = new RestRequest("issue", Method.POST); request.AddHeader("Content-Type", "application/json"); request.RequestFormat = RestSharp.DataFormat.Json; var newissue = new { fields = new Dictionary<string, object>() }; newissue.fields.Add("project", new { key = projectKey }); newissue.fields.Add("summary", (string.IsNullOrWhiteSpace(issue.markup.Topic.Title)) ? "no title" : issue.markup.Topic.Title); newissue.fields.Add("issuetype", new { id = issuesJira[i].fields.issuetype.id }); newissue.fields.Add(MySettings.Get("guidfield"), issue.guid.ToString()); if (issuesJira[i].fields.assignee != null) newissue.fields.Add("assignee", new { name = issuesJira[i].fields.assignee.name }); if (issuesJira[i].fields.priority != null) newissue.fields.Add("priority", new { id = issuesJira[i].fields.priority.id }); if (issuesJira[i].fields.components != null && issuesJira[i].fields.components.Any()) newissue.fields.Add("components", issuesJira[i].fields.components ); request.AddBody(newissue); var response = JiraClient.Client.Execute(request); var responseIssue = new Issue(); if (RestCallback.Check(response)) { responseIssue = RestSharp.SimpleJson.DeserializeObject<Issue>(response.Content); key = responseIssue.key;//attach and comment sent to the new issue } else { uploadErrors++; break; } //upload viewpoint and snapshot var request2 = new RestRequest("issue/" + key + "/attachments", Method.POST); request2.AddHeader("X-Atlassian-Token", "nocheck"); request2.RequestFormat = RestSharp.DataFormat.Json; request2.AddFile("file", File.ReadAllBytes(snapshot), "snapshot.png"); request2.AddFile("file", File.ReadAllBytes(viewpoint), "viewpoint.bcfv"); var response2 = JiraClient.Client.Execute(request2); RestCallback.Check(response2); //ADD COMMENTS if (issue.markup.Comment.Any()) { issue.markup.Comment = new System.Collections.ObjectModel.ObservableCollection<CommentBCF>(issue.markup.Comment.Reverse()); foreach (var c in issue.markup.Comment) { var request3 = new RestRequest("issue/" + key + "/comment", Method.POST); request3.AddHeader("Content-Type", "application/json"); request3.RequestFormat = RestSharp.DataFormat.Json; var newcomment = new { body = c.Comment1 }; request3.AddBody(newcomment); var response3 = JiraClient.Client.Execute<Comment2>(request3); if(!RestCallback.Check(response3)) break; } } if (i == issues.Count() - 1) { worker.ReportProgress(100, getProgressString(i + 1)); } } else //UPDATE ISSUE { var oldIssue = response4.Data.issues.First(); if (issue.markup.Comment.Any()) { issue.markup.Comment = new System.Collections.ObjectModel.ObservableCollection<CommentBCF>(issue.markup.Comment.Reverse()); foreach (var c in issue.markup.Comment) { string normalized1 = Regex.Replace(c.Comment1, @"\s", ""); if (oldIssue.fields.comment.comments.Any(o => Regex.Replace(o.body, @"\s", "").Equals(normalized1,StringComparison.OrdinalIgnoreCase))) continue; var request3 = new RestRequest("issue/" + oldIssue.key + "/comment", Method.POST); request3.AddHeader("Content-Type", "application/json"); request3.RequestFormat = RestSharp.DataFormat.Json; var newcomment = new { body = c.Comment1 }; request3.AddBody(newcomment); var response3 = JiraClient.Client.Execute<Comment2>(request3); if (!RestCallback.Check(response3)) break; } } } } // END TRY catch (System.Exception ex1) { MessageBox.Show("exception: " + ex1); } }// END LOOP }
/// <summary> /// Add Issue /// </summary> /// <param name="path"></param> /// <param name="isBcf"></param> /// <returns></returns> private Tuple<IssueBCF, Issue> AddIssue(string path, bool isBcf) { try { UIDocument uidoc = uiapp.ActiveUIDocument; Document doc = uidoc.Document; if (!(uidoc.ActiveView is View3D || uidoc.ActiveView is ViewSheet || uidoc.ActiveView is ViewPlan || uidoc.ActiveView is ViewSection || uidoc.ActiveView is ViewDrafting)) { MessageBox.Show("I'm sorry,\nonly 3D and 2D views are supported.", "Error!", MessageBoxButton.OK, MessageBoxImage.Error); return null; } IssueBCF issue = new IssueBCF(); string folderIssue = Path.Combine(path, issue.guid.ToString()); if (!Directory.Exists(folderIssue)) Directory.CreateDirectory(folderIssue); var types = new ObservableCollection<Issuetype>(); var assignees = new List<User>(); var components = new ObservableCollection<IssueTracker.Classes.Component>(); var priorities = new ObservableCollection<Priority>(); var noCom = true; var noPrior = true; var noAssign = true; if (!isBcf) { types = mainPan.jira.TypesCollection; assignees = mainPan.getAssigneesIssue(); components = mainPan.jira.ComponentsCollection; priorities = mainPan.jira.PrioritiesCollection; noCom = mainPan.jira.ProjectsCollection[mainPan.jiraPan.projIndex].issuetypes[0].fields.components == null; noPrior = mainPan.jira.ProjectsCollection[mainPan.jiraPan.projIndex].issuetypes[0].fields.priority == null; noAssign = mainPan.jira.ProjectsCollection[mainPan.jiraPan.projIndex].issuetypes[0].fields.assignee == null; } AddIssueRevit air = new AddIssueRevit(uidoc, folderIssue, types, assignees, components, priorities, noCom, noPrior, noAssign); air.Title = "Add Jira Issue"; if (!isBcf) air.VerbalStatus.Visibility = System.Windows.Visibility.Collapsed; else air.JiraFieldsBox.Visibility = System.Windows.Visibility.Collapsed; air.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen; air.ShowDialog(); if (air.DialogResult.HasValue && air.DialogResult.Value) { issue.snapshot = Path.Combine(folderIssue, "snapshot.png"); int elemCheck = 2; if (air.all.IsChecked.Value) elemCheck = 0; else if (air.selected.IsChecked.Value) elemCheck = 1; Issue issueJira = new Issue(); if (!isBcf) { issueJira.fields = new Fields(); issueJira.fields.issuetype = (Issuetype) air.issueTypeCombo.SelectedItem; issueJira.fields.priority = (Priority) air.priorityCombo.SelectedItem; if (!string.IsNullOrEmpty(air.ChangeAssign.Content.ToString()) && air.ChangeAssign.Content.ToString() != "none") { issueJira.fields.assignee = new User(); issueJira.fields.assignee.name = air.ChangeAssign.Content.ToString(); } if (air.SelectedComponents != null && air.SelectedComponents.Any()) { issueJira.fields.components = air.SelectedComponents; } } issue.viewpoint = generateViewpoint(elemCheck); issue.markup.Topic.Title = air.TitleBox.Text; issue.markup.Header[0].IfcProject = ExporterIFCUtils.CreateProjectLevelGUID(doc, Autodesk.Revit.DB.IFC.IFCProjectLevelGUIDType.Project); string projFilename = (doc.PathName != null && doc.PathName != "") ? System.IO.Path.GetFileName(doc.PathName) : ""; issue.markup.Header[0].Filename = projFilename; issue.markup.Header[0].Date = DateTime.Now; //comment if (!string.IsNullOrWhiteSpace(air.CommentBox.Text)) { CommentBCF c = new CommentBCF(); c.Comment1 = air.CommentBox.Text; c.Topic = new CommentTopic(); c.Topic.Guid = issue.guid.ToString(); ; c.Date = DateTime.Now; c.VerbalStatus = air.VerbalStatus.Text; // if (air.comboStatuses.SelectedIndex != -1) // c.Status = mainPan.getStatus(air.comboStatuses.SelectedValue.ToString()); c.Status = CommentStatus.Unknown; c.Author = (string.IsNullOrWhiteSpace(mainPan.jira.Self.displayName)) ? MySettings.Get("BCFusername") : mainPan.jira.Self.displayName; issue.markup.Comment.Add(c); } return new Tuple<IssueBCF, Issue>(issue, issueJira); } else { mainPan.DeleteDirectory(folderIssue); } } catch (System.Exception ex1) { MessageBox.Show("exception: " + ex1); } return null; }