0
\$\begingroup\$

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.

\$\endgroup\$

1 Answer 1

1
\$\begingroup\$

Regarding the signature of your service, I don't see anything wrong.

The improvements are into the method implementation and specially the way you are buildig your payload.

You can use a Payload[Builder|Formatter|Writer] and a Response[Parser|Reader] to hide the string building and parsing details.

private static final String CREATE_URL = "https://foo/REST/1.0/ticket/new?user=x&pass=y";

public String createTicket(Principal principal, RRResource rrResource, UUID ticketReference, String subject) {
    PayloadBuilder builder = new PayloadBuilder()
        .setQueue("foo")
        .setRequestor(principal)
        .setSubject(subject)
        .addText("sponsor ID", rrResource.getGtlUserId())
        .addText("Resource Name", rrResource.getResourceName())
        .addText("Resource Reference", rrResource.getTicketReference())
        ...;

    TicketResponse response = sendTicketRequest(builder.build(), CREATE_URL);
    return response.getTicketNumber();
}

For the logging, it is just a matter of choixe but Slf4j seems to be the most used logging library. And it will not add any complexity to your code.

\$\endgroup\$

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.