public static synchronized void deserialize() throws DatabaseException {
    for (String user : UserNodeKeywordsDAO.findUsers()) {
      Map<String, UserNodeKeywords> udkMap = new HashMap<String, UserNodeKeywords>();

      for (UserNodeKeywords udk : UserNodeKeywordsDAO.findByUser(user)) {
        udkMap.put(udk.getNode(), udk);
      }

      userNodeKeywordsMgr.put(user, udkMap);
    }
  }
  /** Add keyword */
  public static synchronized void add(String user, String nodeUuid, String keyword) {
    log.info("add({}, {}, {})", new Object[] {user, nodeUuid, keyword});
    Map<String, UserNodeKeywords> usrDocs = get(user);
    UserNodeKeywords udk = usrDocs.get(nodeUuid);

    if (udk == null) {
      udk = new UserNodeKeywords();
      udk.setUser(user);
      udk.setNode(nodeUuid);
      usrDocs.put(nodeUuid, udk);
      userNodeKeywordsMgr.put(user, usrDocs);
    }

    udk.getKeywords().add(keyword);
  }
  /** Remove keyword */
  public static synchronized void remove(String user, String nodeUuid, String keyword) {
    Map<String, UserNodeKeywords> usrDocs = get(user);
    UserNodeKeywords udk = usrDocs.get(nodeUuid);

    if (udk == null) {
      udk = new UserNodeKeywords();
      udk.setUser(user);
      udk.setNode(nodeUuid);
      usrDocs.put(nodeUuid, udk);
      userNodeKeywordsMgr.put(user, usrDocs);
    }

    udk.getKeywords().remove(keyword);

    if (udk.getKeywords().isEmpty()) {
      usrDocs.remove(nodeUuid);
    }
  }