@Test
  public void testGetController() throws Exception {
    final HttpServletRequest req = createCommonHttpServletRequest();

    final NiFiServiceFacade serviceFacade = mock(NiFiServiceFacade.class);
    final ControllerEntity controllerEntity = new ControllerEntity();
    final ControllerDTO controller = new ControllerDTO();
    controllerEntity.setController(controller);

    controller.setRemoteSiteHttpListeningPort(8080);
    controller.setRemoteSiteListeningPort(9990);

    doReturn(controller).when(serviceFacade).getSiteToSiteDetails();

    final SiteToSiteResource resource = getSiteToSiteResource(serviceFacade);
    final Response response = resource.getSiteToSiteDetails(req);

    ControllerEntity resultEntity = (ControllerEntity) response.getEntity();

    assertEquals(200, response.getStatus());
    assertEquals(
        "remoteSiteHttpListeningPort should be retained",
        new Integer(8080),
        resultEntity.getController().getRemoteSiteHttpListeningPort());
    assertEquals(
        "Other fields should be retained.",
        new Integer(9990),
        controllerEntity.getController().getRemoteSiteListeningPort());
  }
  @Test
  public void testGetControllerForOlderVersion() throws Exception {
    final HttpServletRequest req = mock(HttpServletRequest.class);
    final NiFiServiceFacade serviceFacade = mock(NiFiServiceFacade.class);
    final ControllerEntity controllerEntity = new ControllerEntity();
    final ControllerDTO controller = new ControllerDTO();
    controllerEntity.setController(controller);

    controller.setRemoteSiteHttpListeningPort(8080);
    controller.setRemoteSiteListeningPort(9990);

    doReturn(controller).when(serviceFacade).getSiteToSiteDetails();

    final SiteToSiteResource resource = getSiteToSiteResource(serviceFacade);
    final Response response = resource.getSiteToSiteDetails(req);

    ControllerEntity resultEntity = (ControllerEntity) response.getEntity();

    assertEquals(200, response.getStatus());
    assertNull(
        "remoteSiteHttpListeningPort should be null since older version doesn't recognize this field"
            + " and throws JSON mapping exception.",
        resultEntity.getController().getRemoteSiteHttpListeningPort());
    assertEquals(
        "Other fields should be retained.",
        new Integer(9990),
        controllerEntity.getController().getRemoteSiteListeningPort());
  }
  /**
   * Returns the details of this NiFi.
   *
   * @return A controllerEntity.
   */
  @GET
  @Consumes(MediaType.WILDCARD)
  @Produces(MediaType.APPLICATION_JSON)
  @ApiOperation(
      value = "Returns the details about this NiFi necessary to communicate via site to site",
      response = ControllerEntity.class,
      authorizations = {@Authorization(value = "Read - /site-to-site", type = "")})
  @ApiResponses(
      value = {
        @ApiResponse(
            code = 400,
            message =
                "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."),
        @ApiResponse(code = 401, message = "Client could not be authenticated."),
        @ApiResponse(code = 403, message = "Client is not authorized to make this request."),
        @ApiResponse(
            code = 409,
            message =
                "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.")
      })
  public Response getSiteToSiteDetails(@Context HttpServletRequest req) {

    authorizeSiteToSite();

    if (isReplicateRequest()) {
      return replicate(HttpMethod.GET);
    }

    // get the controller dto
    final ControllerDTO controller = serviceFacade.getSiteToSiteDetails();

    // build the response entity
    final ControllerEntity entity = new ControllerEntity();
    entity.setController(controller);

    if (isEmpty(req.getHeader(HttpHeaders.PROTOCOL_VERSION))) {
      // This indicates the client uses older NiFi version,
      // which strictly read JSON properties and fail with unknown properties.
      // Convert result entity so that old version clients can understand.
      logger.debug("Converting result to provide backward compatibility...");
      controller.setRemoteSiteHttpListeningPort(null);
    }

    // generate the response
    return clusterContext(noCache(Response.ok(entity))).build();
  }