/**
   * @param node Node whose value is studied
   * @return
   */
  private static Multimap<SuggestionType, Object> getSuggestionForNode(TreeNode node) {

    // For storing the suggestion type and the payload
    Multimap<SuggestionType, Object> suggestionsMultimap = ArrayListMultimap.create();

    final String EMPTY = "";

    try {
      InitialContext ic = new InitialContext();
      ProjectSimilarityService projectSimilarityService =
          (ProjectSimilarityService) ic.lookup("java:module/ProjectSimilarityService");
      QualityObjectiveSimilarityService qoSimilarityService =
          (QualityObjectiveSimilarityService)
              ic.lookup("java:module/QualityObjectiveSimilarityService");
      // TODO: Finding similar metrics

      if (node instanceof QualityObjective) {
        QualityObjective qo = (QualityObjective) node;
        Float value = qo.getValue();

        // If the value of a quality objective cannot be computed,
        // attempt to obtain a suggestion
        if (value == null || value.isNaN()) {
          // Attempt to find a suitable project
          Project proj = qo.getProject();
          Project similarProject = null;
          if (proj != null) {
            // Get a list of similar projects
            List<Project> similarProjects = projectSimilarityService.getSimilarProjects(proj);
            if (similarProjects != null && similarProjects.size() > 0) {
              // For now obtain the first suitable project
              similarProject = similarProjects.get(0);
            }
          }

          // If a suitable similar project was found, search for similar Quality Objective(s) to be
          // suggested
          if (similarProject != null) {
            // Get similar QOs from a similar project
            List<QualityObjective> qos = qoSimilarityService.getSimilarQOs(qo, similarProject);
            // If results were found, construct a suggestion (for now obtain the first one).
            if (qos != null && qos.size() > 0) {
              suggestionsMultimap.put(SuggestionType.QO_REPLACE, qos.get(0));
              return suggestionsMultimap;
            }
          }

          // Otherwise suggest the QO to be removed
          suggestionsMultimap.put(SuggestionType.QO_REMOVE, null);
          return suggestionsMultimap;
        }
      }
      // if a metric has no value / the value is 0, return a suggestion to
      // remove the metric
      if (node instanceof Metric) {

        Metric metric = (Metric) node;
        Float value = metric.getValue();

        if (value == null || value.isNaN() || value.isInfinite()) {
          suggestionsMultimap.put(SuggestionType.METRIC_REMOVE, null);
          return suggestionsMultimap;
        }
      }
    } catch (NamingException e) {
      e.printStackTrace();
    }

    // If no suggestion is to be provided, return an empty string
    // (overwrite the possible existing suggestion).
    suggestionsMultimap.put(SuggestionType.NO_SUGGESTION, "");
    return suggestionsMultimap;
  }