Adding comments using OSLC
Accepted answer
private void updateComments(List<String> comments, final ChangeRequest changeRequest) throws IOException {
for (final String comment : comments) {
ContentProducer cp = new ContentProducer() {
public void writeTo(OutputStream outstream) throws IOException {
Writer out = new OutputStreamWriter(outstream, HTTP.UTF_8);
out.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
out.append("<rdf:RDF\n");
out.append("\t\txmlns:rtc_ext=\"http://jazz.net/xmlns/prod/jazz/rtc/ext/1.0/\"\n");
out.append("\t\txmlns:rtc_cm=\"http://jazz.net/xmlns/prod/jazz/rtc/cm/1.0/\"\n");
out.append("\t\txmlns:oslc_cm=\"http://open-services.net/ns/cm#\"\n");
out.append("\t\txmlns:dcterms=\"http://purl.org/dc/terms/\"\n");
out.append("\t\txmlns:oslc_cmx=\"http://open-services.net/ns/cm-x#\"\n");
out.append("\t\txmlns:oslc=\"http://open-services.net/ns/core#\"\n");
out.append("\t\txmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n");
out.append("\t<rdf:Description \n");
out.append("\n\t\trdf:about=\"" + changeRequest.getAbout() + "\">\n");
out.append("\t<dcterms:description><![CDATA[" + comment + "]]> </dcterms:description>");
out.append("\t</rdf:Description>\n");
out.append("</rdf:RDF>\n");
out.flush();
}
};
HttpEntity entity = new EntityTemplate(cp);
HttpPost post = new HttpPost(changeRequest.getDiscussedBy() + "/oslc:comment");
post.addHeader("Accept", "application/rdf+xml");
post.addHeader("Content-type", "application/rdf+xml");
post.addHeader("OSLC-Core-Version", "2.0");
post.setEntity(entity);
// Call the PUT method against the Change Request URI
HttpResponse response = client.getHttpClient().execute(post);
response.getEntity().consumeContent();
}
}
Comments
Hi,
I was looking to your code, but what is ChangeRequest.getDsicussedBy(), and and why are are we putting in HttpPost. I am using the workitem url in HttpPost and trying to add comments. Can you please explain?
The method ChangeRequest.getDiscussedBy() returns the workitem URI. The URI follow this pattern:
7 other answers
Comments
Hi Donanld,
I had a look in the above wiki page, For adding comments, we need to use the comment url but at the time of creating the url , how can I get this comment url
</rdf:Description> <rdf:Description rdf:about="https://localhost:9443/jazz/resource/itemOid/ com.ibm.team.workitem.WorkItem/_xoNikpHMEeC_rYSykUtXXA/rtc_cm:comments/oslc:comment/1"> <rdf:type rdf:resource="http://open-services.net/ns/core#Comment"/> <dcterms:created>2011-07-06T15:09:47.574Z</dcterms:created> <dcterms:creator rdf:resource="https://localhost:9443/jazz/oslc/users/_KGRY4CFWEdq-WY5y7lROQw"/> <dcterms:description rdf:parseType="Literal">Another Comment</dcterms:description> <dcterms:identifier>__Qo2YKfhEeCBC4EUCjDhXA</dcterms:identifier> <oslc:discussion rdf:resource="https://localhost:9443/jazz/resource/itemOid/ com.ibm.team.workitem.WorkItem/_xoNikpHMEeC_rYSykUtXXA/rtc_cm:comments"/> </rdf:Description>
This above code will work when we need to fetch the comments for a particular workitem, but while creating a workitem, how to add comments?
If you mean that you want to add the comment at the same time as creating the work item, I don't think you can. I believe you will need to create the work item first, get the reference, and then add the comment(s).
1 vote
I'm currently facing the same issue. I would like to add a comment while creating a workitem over OSLC.
The web interface allows me to write a comment when creating a new work item, so the OSLC interface should be capable of doing this as well.
@dnong and @sudipto: Has one of you ever found a solution on this?
The web interface does not use OSLC API, so you cannot claim that it "should be capable of" doing what you want.
The web interface uses internal API, and sends the comment content with the attribute "internalComment" which is not exposed in the OSLC API.
As I said before, you need at least two steps - this should not be a big problem when you use codes.
2 votes
In my eyes, it is unnecessary overhead to send two HTTP requests where one would suffice. It's not obvious why comments cannot be created in the same request.
But anyway, thank you for confirming that it's not possible to achieve this in a single request. Is there already an enhancement request regarding this (couldn't find one on jazz.net)?
You can raise an enhancement request here:
https://www.ibm.com/developerworks/rfe/
But I doubt such request will ever be implemented. Currently we have the "one request" solution - using the internal API. For OSLC API, the specification does not dictate such operations must be carried out in one single request, so it will very likely remain as is.
I've been following the link that Donald Nong provide: https://jazz.net/wiki/bin/view/Main/WorkItemAPIsForOSLCCM20#Adding_comments
I just appended "/oslc:comment" at the end according to the documentation.
Adding comments through the OSLC interface can be done like this:
/post one single comment to one work item@params {string} discussedByUri: a URI pointing to a work item discussion,can be taken e.g. from a 'oslc:discussedBy' field.@params {string} comment: a string that will be added to the work item comments section@returns {promise} a promise that indicates whether the creation was successful or not*/postComment: function(discussedByUri, comment) {if(typeof discussedByUri === "string" && discussedByUri.endsWith("/rtc_cm:comments") &&typeof comment === "string") {var commentObject = {"dcterms:description": comment};return XHR.oslcJsonPostRequest(discussedByUri + "/oslc:comment", commentObject);}},
oslcJsonPostRequest: function(url, data) {return this.xhr("POST", {url: url,headers: {"OSLC-Core-Version": "2.0","Accept": "application/json","Content-Type": "application/json"},postData: JSON.stringify(data),handleAs: "json"}, false);}
Hi Lucas,
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://[ServerName]/oslc/workitems/_q8RqoJoQEee2N-g-o1qd6A/rtc_cm:comments/oslc:comment" );request.Method = "POST";request.AllowAutoRedirect = true;request.KeepAlive = true;request.Timeout = 480000;request.Credentials = context.Credential;request.Headers.Add(context.AuthHeader);request.Headers.Add("OSLC-Core-Version", "2.0");request.Accept = "application/json";request.ContentType = "application/json";request.CookieContainer = context.Cookie;using (var streamWriter = new StreamWriter(request.GetRequestStream())){streamWriter.Write(json);streamWriter.Flush();}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Is possible to set the creation date? I'm setting it, but its not having effect. Comment on work item is being created, but not setting the date I sent:
For those reading here in 2021...I've still 6.0.2 and it works in this way:
After many hours, I finally looked at the ccm.log file. The response was saying my account did not have the required group memberships. The ccm.log clarified that my account did have the necessary group memberships, but that the request was blocked because it might have been malicious and said I had to use the JSESSION ID in a CRSF Prevent header. My tool was not retrieving any such JSESSIONID in the header, so I found you could get around the check by specifying User-Agent. HERE is how I got it to work in 7.0.2: