It's all about the answers!

Ask a question

RTC REST API to create a project area


0
1
Sefa Sevtekin (2345) | asked Jul 22 '14, 2:58 p.m.
edited Jul 22 '14, 6:32 p.m. by Jared Burns (4.4k29)
Hi,

I am trying to create a RTC Project Area using the REST API. I am following the documentation on https://jazz.net/wiki/bin/view/Main/DraftTeamProcessRestApi#POST_project_areas_collection. I get a 403 response when I post the request. I am using the RTC admin user the create the project. I believe the issue is with the owningApplicationKey parameter (please see the java code)

Thanks,
Sefa

public static void createRTCProjectArea(String server, String login,
String password, String projectAreaName) {
String rootServices = server + "/rootservices";
String catalogXPath = "/rdf:Description/oslc_cm:cmServiceProviders/@rdf:resource";
String serviceProviderTitleXPath = "//oslc:ServiceProvider/dcterms:title";

System.out.println(" - Root Services URI: " + rootServices);
System.out.println(" - Service Providers catalog XPath expression: "
+ catalogXPath);
System.out.println(" - Service Provider title XPath expression: "
+ serviceProviderTitleXPath);
System.out.println(" - Login: " + login);
System.out.println(" - Password: ******");

// Setup the HttClient
HttpClient httpclient = new DefaultHttpClient();
HttpUtils.setupLazySSLSupport(httpclient);

// Setup the rootServices request
HttpGet rootServiceDoc = new HttpGet(rootServices);
rootServiceDoc.addHeader("Accept", "application/rdf+xml");
rootServiceDoc.addHeader("OSLC-Core-Version", "2.0");

try {
// Request the Root Services document
HttpResponse rootServicesResponse = HttpUtils
.sendGetForSecureDocument(server, rootServiceDoc, login,
password, httpclient);

if (rootServicesResponse.getStatusLine().getStatusCode() == 200) {
// Define the XPath evaluation environment
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(new NamespaceContextMap(new String[] {
"rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"oslc_cm", "http://open-services.net/xmlns/cm/1.0/" }));

// Parse the response body to retrieve the catalog URI
InputSource source = new InputSource(rootServicesResponse
.getEntity().getContent());
Node attribute = (Node) (xpath.evaluate(catalogXPath, source,
XPathConstants.NODE));
String serviceProvidersCatalog = attribute.getTextContent();
rootServicesResponse.getEntity().consumeContent();

// Setup the catalog request
HttpGet catalogDoc = new HttpGet(serviceProvidersCatalog);
catalogDoc.addHeader("Accept", "application/xml");
catalogDoc.addHeader("OSLC-Core-Version", "2.0");

// Access to the Service Providers catalog
HttpResponse catalogResponse = HttpUtils
.sendGetForSecureDocument(server, catalogDoc, login,
password, httpclient);
if (catalogResponse.getStatusLine().getStatusCode() == 200) {
// Define the XPath evaluation environment
XPath xpath2 = factory.newXPath();
xpath2.setNamespaceContext(new NamespaceContextMap(
new String[] { "oslc",
"http://open-services.net/ns/core#",
"dcterms", "http://purl.org/dc/terms/" }));

// Parse the response body to retrieve the Service Provider
source = new InputSource(catalogResponse.getEntity()
.getContent());
NodeList titleNodes = (NodeList) (xpath2.evaluate(
serviceProviderTitleXPath, source,
XPathConstants.NODESET));

// Print out the title of each Service Provider
int length = titleNodes.getLength();
System.out.println(">> Project Areas:");
for (int i = 0; i < length; i++) {
System.out.println(">> \t - "
+ titleNodes.item(i).getTextContent());
}
}
}

rootServicesResponse.getEntity().consumeContent();
final String content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><jp06:project-area xmlns:jp06=\"http://jazz.net/xmlns/prod/jazz/process/0.6/\" jp06:name=\""
+ projectAreaName
+ "Test02\" "
+ "jp06:templateId=\"simple.process.ibm.com\" jp06:templateLocale=\"en_US\"><jp06:summary>The summary</jp06:summary>"
+ "<jp06:summary>The summary</jp06:summary>"
+ "<jp06:description>The description</jp06:description>"
+ "<jp06:visibility jp06:access=\"PUBLIC\"/></jp06:project-area>";
ContentProducer cp = new ContentProducer() {
public void writeTo(OutputStream outstream) throws IOException {
Writer writer = new OutputStreamWriter(outstream,
HTTP.UTF_8);
writer.write(content);
writer.flush();
}
};

HttpEntity entity = new EntityTemplate(cp);
HttpPost post = new HttpPost(server + "/process/project-areas?owningApplicationKey=0106d6fea98e4bdbab1c5e3cd40fb4af");
post.addHeader("Accept", "application/rdf+xml");
post.addHeader("Content-type", "application/xml");
post.addHeader("X-Jazz-CSRF-Prevent","1");
post.setEntity(entity);

HttpResponse paResponse=HttpUtils.sendPostForSecureDocument(server, cp, post, login, password,
httpclient);
entity = paResponse.getEntity();
   String strContent = EntityUtils.toString(entity);
   System.out.println(paResponse.getStatusLine().getStatusCode());
            System.out.println(strContent);

} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
} catch (InvalidCredentialsException e) {
e.printStackTrace();
} finally {
// Shutdown the HTTP connection
httpclient.getConnectionManager().shutdown();
}
}

}


Comments
Jared Burns commented Jul 22 '14, 6:33 p.m.
FORUM ADMINISTRATOR / FORUM MODERATOR / JAZZ DEVELOPER

Administrative note: I edited the summary and description of this question to say "REST" instead of "OSLC". There's no project area concept in OSLC.

Accepted answer


permanent link
Martha (Ruby) Andrews (3.0k43950) | answered Jul 22 '14, 8:19 p.m.
JAZZ DEVELOPER
Hello,
There appears to be a permissions issue with your request. I suspect some piece of information regarding authentication is missing, but I do not know what.

Perhaps one of these will help:
OSLC Workshop
Using Process API with cURL

Ruby

Jared Burns selected this answer as the correct answer

Comments
Sefa Sevtekin commented Jul 23 '14, 11:19 a.m. | edited Aug 11 '14, 6:28 p.m.

 I got it working. My HttpClient was not authenticating. After changing the login process it worked. I only used "X-Jazz-CSRF-Prevent" header.



String jsessionid = "";
for (Cookie cookie : httpClient.getCookieStore().getCookies()) {
if (cookie.getName().equals("JSESSIONID")) {
jsessionid = cookie.getValue();
}
}
post.setHeader("X-Jazz-CSRF-Prevent", jsessionid);

2 other answers



permanent link
Jared Burns (4.4k29) | answered Jul 22 '14, 6:34 p.m.
FORUM ADMINISTRATOR / FORUM MODERATOR / JAZZ DEVELOPER
owningApplicationKey is not a required parameter and is ignored by the CCM server. So that's not the source of your problem.

permanent link
Martha (Ruby) Andrews (3.0k43950) | answered Jul 22 '14, 6:27 p.m.
JAZZ DEVELOPER
Hello,
I notice that the X-Jazz-CSRF-Prevent header value you are sending is not valid. It should be the value of the JSESSONID. This can cause a 403 response.

Ruby
Martha (Ruby) Andrews
Jazz Foundation L3 Team Lead

Comments
Rosa Naranjo commented Feb 06 '17, 1:22 p.m.
FORUM MODERATOR / JAZZ DEVELOPER

Martha,
Is this supported? Does this still apply for versions 6.x?

Your answer


Register or to post your answer.