/**
   * Create a cluster for publications, based on language and year
   *
   * @param author
   * @param publicationClustersMap
   */
  public void constructPublicationClusterByLanguageAndYear(
      Author author, Map<String, PublicationClusterHelper> publicationClustersMap) {
    // fill publication clusters
    // prepare calendar for publication year
    Calendar calendar = Calendar.getInstance();
    // get all publications from specific author and put it into cluster
    for (Publication publication : author.getPublications()) {
      // only proceed publication that have date, language and abstract
      if (publication.getAbstractText() == null || publication.getAbstractText().equals(""))
        continue;
      if (publication.getPublicationDate() == null) continue;
      if (publication.getLanguage() == null) continue;

      // get publication year
      calendar.setTime(publication.getPublicationDate());

      // construct clusterMap key
      String clusterMapKey = publication.getLanguage() + calendar.get(Calendar.YEAR);

      // construct publication map
      if (publicationClustersMap.get(clusterMapKey) == null) {
        // not exist create new cluster
        PublicationClusterHelper publicationCluster = new PublicationClusterHelper();
        publicationCluster.setLangauge(publication.getLanguage());
        publicationCluster.setYear(calendar.get(Calendar.YEAR));
        publicationCluster.addPublicationAndUpdate(publication);

        // add into map
        publicationClustersMap.put(clusterMapKey, publicationCluster);

      } else {
        // exist on map, get the cluster
        PublicationClusterHelper publicationCluster = publicationClustersMap.get(clusterMapKey);
        publicationCluster.addPublicationAndUpdate(publication);
      }
    }
  }