Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Create a groovy class. Example shown below has the methods implemented.
  • We are using Zendesk as a usecase
  • All properties defined are available as groovy binding variables. For example, properties can be accessed directly like BMC_DOMAIN_NAME, BMC_SALESFORCE_HOST_NAME or BMC_USER_NAME etc
Expand
titleSource Code


Code Block
languagegroovy
themeEmacs
titleExample groovy ZendeskGroovyIntegration .groovy
linenumberstrue
import flexagon.fd.model.integration.cms.api.CMSObject;
import flexagon.fd.model.integration.cms.api.ChangeManagementSystem;
import flexagon.fd.model.integration.util.ApiException;

import java.io.Serializable;
import java.io.StringReader;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonReader;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.HttpUrlConnectorProvider;
import org.glassfish.jersey.filter.LoggingFilter;
import flexagon.fd.model.integration.cms.impl.CMSObjectImpl


class ZendeskGroovyIntegration {
  def className = ZendeskGroovyIntegration.class.getName();
  String mAccessToken;
  Client mRestClient;
  def now = new Date();  
  
    private void getOAuthAccessToken(String pScope)
    throws ApiException
  {
    JsonObjectBuilder zenOAuthRequestJson = Json.createObjectBuilder();
    zenOAuthRequestJson.add("grant_type", "password");
    zenOAuthRequestJson.add("client_id", getClientId());
    zenOAuthRequestJson.add("client_secret", getClientSecret());
    zenOAuthRequestJson.add("username", getUserName());
    zenOAuthRequestJson.add("password", getPassword());
    zenOAuthRequestJson.add("scope", pScope);
    String payLoad = zenOAuthRequestJson.build().toString();
    Response clientResponse =
      getRestClient().target(getZendeskDomain()).path(getOAuthURI()).request(MediaType.APPLICATION_JSON_TYPE).accept(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(payLoad));
    checkResponse(clientResponse);
    JsonObject jsonResponseObject = readJsonObject(clientResponse.readEntity(String.class));
    System.out.println("OAuth Response " + jsonResponseObject);
    mAccessToken = jsonResponseObject.getString("access_token");
  }
  
    private void checkResponse(Response clientResponse)
    throws ApiException
  {
    String methodName = "checkResponse";
    log.logFinestEntering(methodName, clientResponse);  
    print(methodName + String.format(" Invoked connection URL %s", clientResponse));
    int statusCode = clientResponse.getStatusInfo().getStatusCode();
    if (statusCode == 401)
    {
      throw new ApiException("Invalid credentials.", "");
    }
    if (!(clientResponse.getStatusInfo().getFamily() == Response.Status.Family.SUCCESSFUL))
    {
      throw new ApiException(clientResponse.toString(), clientResponse.getStatusInfo().getReasonPhrase());
    }
    log.logFinestExiting(methodName);  
  }
  
  def createTicket(Map<String,Serializable> pTicketFields)
  {
    String methodName = "createTicket";  
    log.logFinestEntering(methodName, pTicketFields);  
    CMSObject ticket = postTicket("request", ZD_REQUEST_CREATE_PATTERN, "question", "requests:write read", pTicketFields);
    log.logFinestExiting(methodName, ticket);  
    return ticket;
  }
  
    private CMSObject postTicket(String pObjectType, String pURLKey, String pTicketType, String pScope, Map<String, Serializable> pTicketFields)
    throws ApiException
  {
    String methodName = "postTicket";
    log.logFinestEntering(methodName, pTicketFields);  
    JsonObjectBuilder zenInputJson = Json.createObjectBuilder();
	Serializable requestor = pTicketFields.remove("requester_id");
	JsonObjectBuilder reqParamJsonBuider = null
	if(requestor != null)
	{
	  reqParamJsonBuider = Json.createObjectBuilder();
	  reqParamJsonBuider.add("name", requestor.toString())
	}
	Serializable description = pTicketFields.remove("description");
	JsonObjectBuilder desParamJsonBuider = null
	if(description != null)
	{
	  desParamJsonBuider = Json.createObjectBuilder();
	  desParamJsonBuider.add("body", description.toString())
	}
	JsonObjectBuilder inputJsonObject = buildJsonRequest(pTicketFields)
	if(requestor != null)
	{
		inputJsonObject.add("requester", reqParamJsonBuider.build())
	}
	if(description != null)
	{
		inputJsonObject.add("comment", desParamJsonBuider.build())
	}
    zenInputJson.add(pObjectType,  inputJsonObject);

    WebTarget postRequest = getWebResource(pURLKey);//getPropertyAsString(pURLKey)
    String payLoad = zenInputJson.build().toString();
    print(methodName + String.format(" Creating new %s %s", pObjectType, payLoad));
    Response clientResponse = postRequest.request(MediaType.APPLICATION_JSON_TYPE).accept(MediaType.APPLICATION_JSON_TYPE).header("Authorization", getAccessToken(pScope)).post(Entity.json(payLoad));
    checkResponse(clientResponse);
    JsonObject jsonResponseObject = readJsonObject(clientResponse.readEntity(String.class));
    JsonObject requestResponseJson = jsonResponseObject.getJsonObject(pObjectType);
    CMSObject request = createTicketFromJson(requestResponseJson, ChangeManagementSystem.CMSObjectType.TICKET);
    print(methodName + String.format(" Successfully created ticket %s", request.getNumber()));
    log.logFinestExiting(methodName, request);  
    return request;
  }
  
    private CMSObject createTicketFromJson(JsonObject jsonObject, ChangeManagementSystem.CMSObjectType pType)
  {
    String methodName = "createTicketFromJson";
     log.logFinestEntering(methodName, jsonObject, pType);  

    CMSObject ticket = CMSObjectImpl.getInstance(String.valueOf(jsonObject.getInt("id")), pType, jsonObject, jsonObject.getString("description"));

    log.logFinestExiting(methodName, ticket);  
    return ticket;
  }

  private JsonObject readJsonObject(String source)
  {
    String methodName = "readJsonObject";
    log.logFinestEntering(methodName, source);  
    JsonReader jsonReader = Json.createReader(new StringReader(source));
    JsonObject object = null;
    try
    {
      object = jsonReader.readObject();
      print(methodName + String.format(" Json object created for response = %s", source));
    }
    catch (Exception e)
    {
      print(methodName + String.format(" Exception while creating response json object, error %s, response = %s", e.getMessage(), source));
      print(methodName + " - " + e.getStackTrace());
    }
    finally
    {
      if (jsonReader != null)
      {
        jsonReader.close();
      }
    }
    log.logFinestExiting(methodName, object);  
    return object;
  }
  
  def createIncident(Map<String,Serializable> pIncidentFields)
  {
    String methodName = "createIncident";  
    log.logFinestEntering(methodName, pIncidentFields);
    CMSObject incident = postTicket("ticket", ZD_TICKET_CREATE_PATTERN, "incident", "tickets:write read", pIncidentFields);
    log.logFinestExiting(methodName, incident);
    return incident;
  }
  
  def findCMSObjectByType(String pCMSObjectNumber, ChangeManagementSystem.CMSObjectType pCMSObjectType)
  {
    String methodName = "findCMSObjectByType";
    log.logFinestEntering(methodName, pCMSObjectNumber, pCMSObjectType);
	CMSObject ticket = getChangeRequest(pCMSObjectNumber);
    log.logFinestExiting(methodName, ticket);
    return ticket;
  }
  
    private CMSObject getChangeRequest(String pRequestNumber)
    throws ApiException
  {
    return getTicket("request", ZD_REQUEST_GET_PATTERN, pRequestNumber, "{ZENDESK_REQUEST}");
  }
  
    private CMSObject getTicket(String pObjectType, String pURLKey, String pRequestNumber, String pSearchPattern)
    throws ApiException
  {
    String methodName = "getTicket";
    log.logFinestEntering(methodName);

    String urlString = pURLKey;//getPropertyAsString(pURLKey);

    urlString = urlString.replace(pSearchPattern, pRequestNumber);
    Response clientResponse = getWebResource(urlString).request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", getAccessToken("tickets:write read")).get(Response.class);
    checkResponse(clientResponse);
    JsonObject jsonResponseObject = readJsonObject(clientResponse.readEntity(String.class));
    JsonObject ticketResponseJson = jsonResponseObject.getJsonObject(pObjectType);
    CMSObject ticket = createTicketFromJson(ticketResponseJson, ChangeManagementSystem.CMSObjectType.TICKET);
    print(methodName + String.format(" Successfully found ticket %s", ticket.getNumber()));
    log.logFinestExiting(methodName, ticket);
    return ticket;
  }
  
  def findTicketByType(String pTicketNumber)
  {
    String methodName = "findTicketByType";
    log.logFinestEntering(methodName, pTicketNumber);
    CMSObject ticket = findCMSObjectByType(pTicketNumber, ChangeManagementSystem.CMSObjectType.TICKET);
    log.logFinestExiting(methodName, ticket);
    return ticket;
  }

  def isTicketApproved(CMSObject pTicket, String pEnvironmentCode)
  {
    String methodName = "isTicketApproved";
    log.logFinestEntering(methodName, pTicket, pEnvironmentCode);
    CMSObject findRequest = pTicket;
    Boolean approved = false;
    try
    {
      if (findRequest != null)
      {
        String status = findRequest.getJson().getString("status");
        print(String.format("#[%s] status [%s]", pTicket.getNumber(), status));
        if ("solved".equalsIgnoreCase(status))
        {
          approved = true;
        }
      }
    }
    catch (Exception e)
    {
      // TODO: Add catch code
    }
    log.logFinestExiting(methodName, approved);
    return approved;
  }
  
  def isTicketRejected(CMSObject pTicket, String pEnvironmentCode)
  {
    String methodName = "isTicketRejected()";
    log.logFinestEntering(methodName, pTicket, pEnvironmentCode);
    CMSObject findRequest = pTicket;
    Boolean rejected = false;
    try
    {
      if (findRequest != null)
      {
        String status = findRequest.getJson().getString("status");
        print(String.format("#[%s] status [%s] script[%s]", pTicket.getNumber(), status, ZD_REJECTED_SCRIPT));
        if ((!"New".equalsIgnoreCase(status)) && ("on-hold".equalsIgnoreCase(status) || "pending".equalsIgnoreCase(status)))
        {
          rejected = true;
        }
      }
    }
    catch (Exception e)
    {
      // TODO: Add catch code
    }
    log.logFinestExiting(methodName, rejected);
    return rejected;
  }
  
  def isDoPolling()
  {
    String methodName = "isDoPolling()";
    log.logFinestEntering(methodName);
	boolean flag = true;
    log.logFinestExiting(methodName, flag);
	return flag;
  }
  
    private void print(String pText)
  {
    System.out.println(String.format("%s %s", now.toString(), pText));
  }

  private String getUserName()
  {
    return ZD_USER_NAME;
  }


  private String getPassword()
  {
    return ZD_PASSWORD;
  }
  
  def checkConnection()
  {
    String methodName = "checkConnection()";
    log.logFinestEntering(methodName);
    try  
    {
		print(methodName + " getting user details to check connection");
		Response clientResponse = getWebResource("/api/v2/users/me.json").request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", getAccessToken("organizations:write read")).get(Response.class);
		checkResponse(clientResponse);
		print(methodName + " Test connection response code looks valid, check content of response");
		String responseString = clientResponse.readEntity(String.class);
		print(methodName + "responseString=" + responseString + ", Validated that JSON data was received from test connction URL invocation.");
    }
    catch (Exception e)
    {
      log.logInfo(methodName, " Test connection failed " + e.getMessage() + " " + e)
      throw new ApiException("Connection failed. " + e.getMessage());  
    }
    log.logFinestExiting(methodName);
  }
  
    private Client getRestClient()
    throws ApiException
  {
    if (mRestClient == null)
    {
      ClientBuilder builder;
      builder = ClientBuilder.newBuilder().withConfig(new ClientConfig().register(LoggingFilter.class)).property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true);
      mRestClient = builder.build();
      mRestClient.property(ClientProperties.CONNECT_TIMEOUT, 10000);
      mRestClient.property(ClientProperties.READ_TIMEOUT, 20000);
    }
    return mRestClient;
  }
  
    private WebTarget getWebResource(String resource)
    throws ApiException
  {
    if (resource != null && !resource.isEmpty() && !resource.startsWith("/"))
    {
      resource += "/" + resource;
    }
    WebTarget webResource = null;
    try
    {
      webResource = getRestClient().target(getZendeskDomain()).path(resource);
    }
    catch (Exception e)
    {
      throw new ApiException(e.getMessage(), e.getMessage());
    }

    return webResource;
  }

  private String getAccessToken(String pScope)
    throws ApiException
  {
    getOAuthAccessToken(pScope);
    return "Bearer " + mAccessToken;
  }

  private String getOAuthURI()
  {
    return ZD_OAUTH_URI;
  }

  private String getClientId()
  {
    return ZD_CLIENT_ID;
  }

  private String getClientSecret()
  {
    return ZD_CLIENT_SECRET;
  }
  
    protected JsonObjectBuilder buildJsonRequest(Map<String, Serializable> pFields)
  {
    String methodName = "buildJsonRequest";
    JsonObjectBuilder jsonBuider = Json.createObjectBuilder();

    for (String fieldKey: pFields.keySet())
    {
      Serializable fieldValue = pFields.get(fieldKey);

      if (fieldValue != null)
      {
        if (fieldValue instanceof String)
        {
          jsonBuider.add(fieldKey, (String) fieldValue);
        }
        else if (fieldValue instanceof Boolean)
        {
          jsonBuider.add(fieldKey, (Boolean) fieldValue);
        }
        else if (fieldValue instanceof Integer)
        {
          jsonBuider.add(fieldKey, (Integer) fieldValue);
        }
        else if (fieldValue instanceof Float)
        {
          jsonBuider.add(fieldKey, (Float) fieldValue);
        }
        else if (fieldValue instanceof Double)
        {
          jsonBuider.add(fieldKey, (Double) fieldValue);
        }
        else if (fieldValue instanceof Long)
        {
          jsonBuider.add(fieldKey, (Long) fieldValue);
        }
        else
        {
          // convert to String if type unknown
          jsonBuider.add(fieldKey, fieldValue.toString());
        }
      }
    }
    return jsonBuider;
  }
  
    private String getZendeskDomain()
  {
    return getZendeskURLBuilder().toString();
  }

  private StringBuilder getZendeskURLBuilder()
  {
    StringBuilder urlBuilder = new StringBuilder(ZD_DOMAIN_NAME);
    return urlBuilder;
  }
}



  • Implement all the methods described in the table in the API Implementation section
  • For any failure connecting to the system or if any issues with the data, then you can throw exception. For example throw new ApiException("Invalid credentials.", "");

...