@Test
  public void should_return_notFound_if_attempt_doesnt_exist() {

    final String uri = String.format(URI, "type", "key");

    Response response = invoke(uri).get();
    assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());

    JsonObject token1 = response.readEntity(JsonObject.class);
    JsonArray jsonArray = token1.getJsonObject("errors").getJsonArray("messages");

    for (int i = 0; jsonArray.size() > i; i++) {
      JsonObject item = jsonArray.getJsonObject(i);

      assertEquals(
          NotFoundEnum.ATTEMPT.getCode().longValue(), item.getJsonNumber("code").longValue());
      assertNull(item.getJsonString("field"));
      assertEquals("attempt_not_found", item.getJsonString("message").getString());
    }
  }
  ObservableList<Question> getObservableList() throws IOException {
    String url = "http://api.stackexchange.com/2.2/search?tagged=javafx&site=stackoverflow";
    URL host = new URL(url);
    JsonReader jr = Json.createReader(new GZIPInputStream(host.openConnection().getInputStream()));

    JsonObject jsonObject = jr.readObject();
    JsonArray jsonArray = jsonObject.getJsonArray("items");
    ObservableList<Question> answer = FXCollections.observableArrayList();

    jsonArray
        .iterator()
        .forEachRemaining(
            (JsonValue e) -> {
              JsonObject obj = (JsonObject) e;
              JsonString name = obj.getJsonObject("owner").getJsonString("display_name");
              JsonString quest = obj.getJsonString("title");
              JsonNumber jsonNumber = obj.getJsonNumber("creation_date");
              Question q =
                  new Question(name.getString(), quest.getString(), jsonNumber.longValue() * 1000);
              answer.add(q);
            });
    return answer;
  }
  /**
   * This methods print outs public profile informations of given user sets the plusProfile with all
   * those information. getPlusProfile() can be used to get the information.
   *
   * @param userName : user name of a Google plus user to crawl the public profile informations.
   * @return no return value
   */
  public void startCrawling(String userName) {
    try {

      InputStream is =
          new URL("https://www.googleapis.com/plus/v1/people/" + userName + "?key=" + API_KEY)
              .openStream();

      JsonReader rdr = Json.createReader(is);
      JsonObject obj = rdr.readObject();

      // retrieve user's profile information

      System.out.println("\nGoogle+ Profile crawler started...\n");
      System.out.println("____________________________________");
      System.out.println("         Profile");
      System.out.println("====================================");
      String displayName = obj.getJsonString("displayName").getString();
      System.out.println("Name: " + displayName);
      getPlusProfile().setName(displayName);

      String user_id = obj.getJsonString("id").getString();
      System.out.println("ID: " + user_id);
      // getPlusProfile().setUserId(user_id);//number format user id
      getPlusProfile().setUserId(userName);

      if (obj.containsKey("gender")) {
        String gender = obj.getJsonString("gender").getString();
        System.out.println("Gender: " + gender);
        getPlusProfile().setGender(gender);
      } else {
        System.out.println("Gender: " + "");
        getPlusProfile().setGender("");
      }

      getPlusProfile().setDateOfBirth("");
      JsonString occupationJson = obj.getJsonString("occupation");
      if (occupationJson != null) {
        String occupation = obj.getJsonString("occupation").getString();
        System.out.println("Occupation: " + occupation);
      }

      // retrieve user's work and education information
      JsonArray results = obj.getJsonArray("placesLived");
      if (results != null) {
        System.out.println("____________________________________");
        System.out.println("         Locations Lived");
        System.out.println("====================================");
        int i = 0;
        for (JsonObject result : results.getValuesAs(JsonObject.class)) {
          String location = result.getString("value");
          System.out.println(location);
          if (i == 0) getPlusProfile().setCurrentLocation(location);
          else getPlusProfile().setHomeLocation(location);

          i++;
        }
        if (i == 1) getPlusProfile().setHomeLocation(getPlusProfile().getCurrentLocation());

      } else {
        System.out.println("Location info NOT AVAILABLE");
        getPlusProfile().setCurrentLocation("");
        getPlusProfile().setHomeLocation("");
      }

      // retrieve user's work and education information
      Set<String> wrkEdu = new TreeSet<String>();
      results = obj.getJsonArray("organizations");
      if (results != null) {
        System.out.println("____________________________________");
        System.out.println("         Work and Education");
        System.out.println("====================================");
        for (JsonObject result : results.getValuesAs(JsonObject.class)) {

          if (result.containsKey("name")) {
            String workEdu = result.getString("name");
            System.out.println(workEdu);
          } else {
            wrkEdu.add("");
            System.out.println("Company name NOT AVAILABLE");
          }
        }

        getPlusProfile().setEmployer(wrkEdu);
        getPlusProfile().setEducation(wrkEdu);
      } else {
        System.out.println("Work and Education info NOT AVAILABLE");
        getPlusProfile().setEmployer(wrkEdu);
        getPlusProfile().setEducation(wrkEdu);
      }
      List<String> languages = new ArrayList<String>();
      getPlusProfile().setLanguages(languages);

      firefoxDriver = new FirefoxDriver();
      firefoxDriver.get("https://plus.google.com/" + userName + "/about");
      Thread.sleep(3000);

      // get list of circles
      List<WebElement> circle = firefoxDriver.findElements(By.className("bkb"));
      Set<String> circles = new TreeSet<String>();

      if (circle.size() != 0) {
        String circleText = circle.get(0).getText();
        System.out.println(circleText);
        String circleCountstr = circleText.split("\\s+")[0];
        if (circleCountstr.contains(",")) {
          circleCountstr = circleCountstr.replace(",", "");
        }
        int circleCount = Integer.parseInt(circleCountstr);
        System.out.println("Circle Count:" + circleCount);

        WebElement circleLink =
            firefoxDriver.findElement(By.xpath("//span[contains(text(),'" + circleText + "')]"));
        circleLink.click();
        Thread.sleep(3000);

        WebElement friendListBox = firefoxDriver.findElement(By.className("G-q-B"));

        Robot robot = new Robot();

        int loop = 0;
        while (loop < circleCount / 10) {
          if (circles.size() == circleCount) break;

          Thread.sleep(3000);

          List<WebElement> friendList = friendListBox.findElements(By.tagName("a"));

          for (WebElement friend : friendList) {
            System.out.println(friend.getText());
            circles.add(friend.getText());
          }

          int count = 0;
          while (count < 500) {
            robot.keyPress(java.awt.event.KeyEvent.VK_DOWN);
            count++;
          }

          loop++;
        }
      }
      List<String> friends = new ArrayList<String>();
      for (String friend : circles) {
        friends.add(friend);
      }
      getPlusProfile().setFriends(friends);

      System.out.println(
          "_________________________________________________________________________________________");

      System.out.println("Finish Crawling...");
      closePlusWebDriverNode();

    } catch (AWTException ex) {
      System.out.println("Problem in key press:" + ex);
    } catch (IOException ex) {
      System.out.println(ex);
    } catch (InterruptedException ex) {
      System.out.println();
    }
  }
  public void logController(String topic, MqttMessage mqttMessage) {
    // get deviceId
    String[] split = topic.split("log/");
    String deviceId = split[1];

    // parse log
    try {
      JsonReader reader = Json.createReader(new StringReader(mqttMessage.toString()));
      JsonObject jsonMessage = reader.readObject();
      String logType = jsonMessage.getString("type");
      switch (logType) {
        case LOG_NORMAL:
          int temperature = 0;
          int timer = jsonMessage.getInt("time");
          try {
            temperature = jsonMessage.getInt("temperature");
          } catch (Exception se1) {
            // @todo: warning
            break;
          }
          JsonString subDeviceId = jsonMessage.getJsonString("subId");
          if (subDeviceId == null) sessionHandle.drawTemperature(deviceId, timer, temperature);
          else sessionHandle.drawTemperature(deviceId, timer, temperature, subDeviceId.toString());
          break;
        case LOG_WARNING:
          timer = jsonMessage.getInt("time");
          subDeviceId = jsonMessage.getJsonString("subId");
          int subdeviceNo = jsonMessage.getInt("number");
          String deviceState = jsonMessage.getString("value");
          String msg;
          switch (subdeviceNo) {
            case 1:
              msg = ("0".equals(deviceState)) ? "Button release" : "Button clicked";
              break;
            case 2:
              msg = ("0".equals(deviceState)) ? "Cửa cuốn được cuộn lên" : "Đang thả cửa cuốn";
              break;
            default:
              msg = DEFAULT_ALERT_MSG;
              break;
          }
          if (subDeviceId == null) sessionHandle.doAlert(deviceId, timer, msg);
          else sessionHandle.doAlert(deviceId, timer, msg, subDeviceId.toString());
          break;
        case LOG_CONTROL:
          String state = jsonMessage.getString("light");
          subdeviceNo = jsonMessage.getInt("no");
          sessionHandle.updateLightState(deviceId, subdeviceNo, state);
          break;
        case LOG_ACK:
          subdeviceNo = jsonMessage.getInt("number");
          deviceState = jsonMessage.getString("value");
          state = ("0".equals(deviceState)) ? "off" : "on";
          sessionHandle.ackLightState(deviceId, subdeviceNo, state);
          break;
        case LOG_DEVICE_STATUS:
          JsonArray lstDevice = jsonMessage.getJsonArray("status");
          System.out.println("Update status:");
          for (int i = 0; i < lstDevice.size(); i++) {
            JsonObject device = (JsonObject) lstDevice.get(i);
            System.out.println(device.toString());
            subdeviceNo = device.getInt("no");
            int intState = device.getInt("value");
            state = (intState == 0) ? "off" : "on";
            sessionHandle.updateLightState(deviceId, subdeviceNo, state);
          }
          sessionHandle.finishUpdateDeviceStatus();
          break;
        default:
      }

    } catch (Exception ex) {
      System.out.println("Parse error");
      System.out.println(topic);
      System.out.println(mqttMessage);
      System.out.println(ex.getMessage());
    }
  }
  private static boolean loadATMSwitchConfig(String connId) throws Exception {

    InputStream is = null;
    boolean isLoadedFlag = false;
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    is = classLoader.getResource(atmSwitchConfigFileName).openStream();

    if (is == null) {
      throw new Exception("Unable to load config file - " + atmSwitchConfigFileName);
    }

    try {
      JsonReader jsonReader = Json.createReader(is);
      JsonObject allConfigs = jsonReader.readObject();
      JsonString logFileLocation = allConfigs.getJsonString(logFileLocationKey);
      if (logFileLocation == null) {
        throw new Exception(logFileLocationKey + " parameter missing in the configuration....");
      }
      if ("".equals(connId))
        logger =
            (new AsynchLogger(logFileLocation.toString() + "/ISOSysLog", Level.INFO))
                .getLogger("ISOSysLog");

      JsonArray serverConfigs = allConfigs.getJsonArray(serverConfigKey);
      if (serverConfigs == null) {
        throw new Exception(
            serverConfigKey + " parameter missing. No server Configurations specified....");
      }
      logger.info("Initializing ATM Switch Configuration....");

      if (manifestAttrs != null && "".equals(connId)) {

        logger.info(
            "Build version "
                + manifestAttrs.getValue("Implementation-Version")
                + " Build Date "
                + manifestAttrs.getValue("Build-Time"));
      }

      for (int i = 0; i < serverConfigs.size(); i++) {

        JsonObject serverConfig = serverConfigs.getJsonObject(i);
        JsonString host = serverConfig.getJsonString(serverHostKey);
        JsonNumber port = serverConfig.getJsonNumber(portKey);
        JsonNumber connTimeOut = serverConfig.getJsonNumber(connTimeOutKey);
        JsonNumber readTimeOut = serverConfig.getJsonNumber(readTimeOutKey);
        JsonNumber retry = serverConfig.getJsonNumber(retryKey);
        JsonNumber threadTimeOut = serverConfig.getJsonNumber(threadTimeOutKey);
        JsonString logLevelJson = serverConfig.getJsonString(loglevelKey);
        JsonNumber echoTimeInterval = serverConfig.getJsonNumber(echoTimeIntervalKey);
        JsonString uidFormat = serverConfig.getJsonString("uidFormat");

        if (host == null || port == null) {
          logger.error(
              serverConfig
                  + " Bad configuration for connection ( Host OR Port is missing ). Not Loading this connection....");
          continue;
        }
        if (uidFormat == null) {
          logger.error(
              serverConfig
                  + " Bad configuration for connection ( uidFormat is missing ). Not Loading this connection....");
          continue;
        }

        Level level = null;
        if (logLevelJson == null) {
          level = Level.INFO;
        } else {
          String logLevel = logLevelJson.getString();
          if (logLevel.equalsIgnoreCase("TRACE")) {
            level = Level.TRACE;
          } else if (logLevel.equalsIgnoreCase("DEBUG")) {
            level = Level.DEBUG;
          } else {
            level = Level.INFO;
          }
        }
        MessageUIDGenerator messageUIDGenerator =
            MessageUIDGeneratorFactory.getMessageUIDGenerator(uidFormat.toString());
        if (!"".equals(connId)) {
          if (!connId.equalsIgnoreCase(host.getString() + "_" + port.intValue())) {
            continue;
          }
        }
        ATMSwitchTCPHandler.manualStopPool.put(
            host.getString() + "_" + String.valueOf(port.intValue()), Boolean.FALSE);
        ConnectionBean bean =
            new ConnectionBean(
                host.getString(),
                port.intValue(),
                (connTimeOut == null ? 8000 : connTimeOut.intValue()),
                (readTimeOut == null ? 8000 : readTimeOut.intValue()),
                (threadTimeOut == null ? 5000 : threadTimeOut.intValue()),
                (retry == null ? 3 : retry.intValue()),
                (echoTimeInterval == null ? 0 : echoTimeInterval.intValue()));

        ServerContainer container =
            new ServerContainer(bean, logFileLocation.getString(), level, messageUIDGenerator);
        try {
          if (container.connect(false)) {
            logger.info(bean.toString() + " Loaded....");
            isLoadedFlag = true;
          } else {
            logger.warn(bean.toString() + " could not be loaded....");
          }
        } catch (InterruptedException e) {
          logger.error(
              "( "
                  + bean.getUniqueName()
                  + " ,loadAllClientConnection(, ,) ) Interrupted Exception",
              e);
        } catch (ExecutionException e) {
          logger.error(
              "( " + bean.getUniqueName() + " ,loadAllClientConnection(, ,) ) ExecutionException",
              e);
        } catch (IOException e) {
          logger.error(
              "( " + bean.getUniqueName() + " ,loadAllClientConnection(, ,) ) IOException", e);
        } catch (Exception e) {
          logger.error(
              "( " + bean.getUniqueName() + " ,loadAllClientConnection(, ,) ) Exception", e);
        }
      }

    } finally {
      if (is != null) {
        try {
          is.close();
        } catch (IOException e) {
          logger.error("IOException in closing the stream for JSON config property file....", e);
        }
      }
    }
    return isLoadedFlag;
  }