Below is the class definition which I created as a POC for some project, at present the class does too much thing and I don't know how to what would be a good design i.e. which object to use as DI etc.
I know that I would like to have some good logging mechanism in case of refactoring things instead of System.out.println at the same time I don't want to do over engineering.
Code:
package com.foobar;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import com.Resource;
import com.ResourceTypeEntity;
import com.UserEntity;
import java.security.Principal;
import java.util.UUID;
@Component
public class TicketService
{
private RestTemplate restTemplate;
private static final String DEFAULT_RESOURCE_URL = "http://foo/bar/";
@Autowired
public TicketService(RestTemplateBuilder restTemplate)
{
this.restTemplate = restTemplate.build();
}
// Rest client to create ticket
public String createTicket(Principal principal, RRResource rrResource, UUID ticketReference, String subject)
{
String delimiter = " , ";
String stringBuilder = " \n sponser ID==>> " + rrResource.getGtlUserId() +
" \n Resource Name ==>> " + rrResource.getResourceName() +
" \n Resource Reference ==>> " + rrResource.getTicketReference() +
" \n Requestor ID ==>> " + principal.getName() +
" \n More Info ==>> " + rrResource.getMoreInfo() +
" \n Service Name ==>> " + rrResource.getServiceName() +
" \n Project Name ==>> " + rrResource.getProjectName() +
" \n Details Of Requested Resource on URL ==>> " + DEFAULT_RESOURCE_URL+ticketReference + delimiter+
" \n Request Details ==>> " + rrResource.getResourceRequestCont();
String content = "queue: foo\nRequestor: " + principal.getName() + "bar\nSubject: " + subject + "\nText: " + stringBuilder;
String url = "https://foo/REST/1.0/ticket/new?user=x&pass=y";
String response = sendTicketRequest(content, url);
return response.trim().substring(27,32);// parsing to get just ticket number out of response
}
// Rest client to edit ticket
public String editTicket(RRResource rrResource, UUID ticketReference) {
String status = "";
System.out.println("status --------" + rrResource.getStatus());
if (rrResource.getStatus().equals("resolved") || rrResource.getStatus().equals("cancelled") ) {
status = "resolved";
}
String s = " \n Status ==>>" + rrResource.getStatus() + " \n Assign Resource Name ==>> " + rrResource.getResourceName() +
" \n sponser ID==>>" + rrResource.getGtlUserId() + " \n requestor ID ==>> " + rrResource.getRequestorName() +
" \n Requested Resource content ==>> " + rrResource.getResourceRequestCont() + " \n More Info ==>> " + rrResource.getMoreInfo() +
" \n Service Name ==>> " + rrResource.getServiceName() + " \n Project Name ==>> " + rrResource.getProjectName() +
" \n Details Of Resource Requested ==>> " + DEFAULT_RESOURCE_URL+ticketReference ;
String url = "https:foo/REST/1.0/ticket/" + rrResource.getTicketNo() + "/comment?x=rup&pass=y";
String content = "Action: comment\nStatus: " + status + "\nText: " + s;
String response = sendTicketRequest(content, url);
return response;
}
private String sendTicketRequest(String content, String url) {
System.out.println("Ticket Content: " + content);
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
parts.add("content", content);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(parts);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
System.out.println("response.getBody()" + response.getBody());
return response.getBody();
}
}
PS: I have uglified some name for the sake of project anonymity.