@Test
  public void testProcessDocument() {
    ContextExtractor extractor = new TopicModelContextExtractor();
    MockWordsi wordsi = new MockWordsi(null, extractor);

    String text = "foxes.n.123 1 1.0 5 2.0 2 4.0 3 4.5 4 0.0 0 0.0";

    extractor.processDocument(new BufferedReader(new StringReader(text)), wordsi);
    assertEquals(6, extractor.getVectorLength());
  }
  ClientWebSocket(
      WebSocket.In<JsonNode> in, WebSocket.Out<JsonNode> out, ElasticSearchServer elasticServer) {

    Logger.info("New ClientWebSocket");
    this.socketIn = in;
    this.socketOut = out;
    this.elasticServer = elasticServer;
    ctxEx = ContextExtractor.getInstance();
    socketIn.onMessage(
        new Callback<JsonNode>() { // msg z socketu
          @Override
          public void invoke(JsonNode event) {
            handleEvent(event);
          }
        });

    socketIn.onClose(
        new Callback0() { // socket sie zamkna
          @Override
          public void invoke() {
            // stop actor
            getContext().stop(getSelf());
          }
        });
  }
  protected void handleEvent(JsonNode event) { // obslug eventow z websocketa

    if (!event.has("request")) {
      return;
    }

    String request = event.get("request").asText();

    if (request.equals("geolocation")) {
      handleGeolocation(event);
      return;
    } else if (request.equals("search")) {

      // get request data
      String pattern = event.get("pattern").asText();
      Boolean limit = event.get("limit").asText().equals("true");
      List<String> tagList = ctxEx.extractTags(pattern);
      String searchPattern = ctxEx.stripTags(pattern);

      Logger.info("searching for:" + pattern + " with" + (limit ? "out" : "") + " limit");
      Logger.info("search:" + searchPattern + "\ntags:" + tagList.toString());

      ArrayList<ArrayList<String>> searchResult = search(searchPattern, limit);

      if (!tagList.isEmpty()) searchResult = filterOutByTags(searchResult, tagList);

      if (searchResult == null) {
        sendEmptyResults();
      } else {
        Logger.info(String.valueOf(searchResult.size()) + " found");

        ObjectNode message = Json.newObject(); // create message

        ArrayNode results = message.putArray("result"); // results array in message
        Set<String> tagsSet = new HashSet<>();

        for (ArrayList<String> result : searchResult) {
          ObjectNode innerMsg = Json.newObject(); // inner message (file info)
          innerMsg.put("file", result.get(0));
          innerMsg.put("link", result.get(1));
          innerMsg.put("size", result.get(2));

          ArrayNode tags = innerMsg.putArray("tags"); // tags array in innerMsg (for this file)
          // odejmujemy 4 ze wzgledu na to ze na poczatku sa 4 elementy ktore nie sa tagami
          int tagcount = result.size() - 4;
          for (int tagnr = 0; tagnr < tagcount - 2; tagnr++) {
            tags.add(result.get(4 + tagnr));
            tagsSet.add("\"" + result.get(4 + tagnr) + "\"");
          }
          String tempCont = ctxEx.getContext(result.get(3), searchPattern);
          innerMsg.put("context", tempCont);
          innerMsg.put("lat", result.get(result.size() - 2));
          innerMsg.put("lng", result.get(result.size() - 1));
          results.add(innerMsg);
        }
        int temp = searchResult.size();
        String temp2 = "" + temp;
        message.put("resultsCount", temp2);
        message.put("tagList", tagsSet.toString());
        socketOut.write(message);
      }
    }
  }