private void updateData(MavenProgressIndicator progress, File newDataDir, boolean fullUpdate)
      throws MavenIndexException {

    IndexData newData = new IndexData(newDataDir);
    try {
      doUpdateIndexData(newData, progress);
      newData.flush();
    } catch (Throwable e) {
      newData.close(true);
      FileUtil.delete(newDataDir);

      if (e instanceof MavenServerIndexerException) throw new MavenIndexException(e);
      if (e instanceof IOException) throw new MavenIndexException(e);
      throw new RuntimeException(e);
    }

    synchronized (this) {
      IndexData oldData = myData;

      myData = newData;
      myDataDirName = newDataDir.getName();

      if (fullUpdate) {
        myUpdateTimestamp = System.currentTimeMillis();
      }

      oldData.close(true);

      for (File each : FileUtil.notNullize(myDir.listFiles())) {
        if (each.getName().startsWith(DATA_DIR_PREFIX) && !each.getName().equals(myDataDirName)) {
          FileUtil.delete(each);
        }
      }
    }
  }
 public synchronized void close(boolean releaseIndexContext) {
   try {
     if (myData != null) myData.close(releaseIndexContext);
   } catch (MavenIndexException e) {
     MavenLog.LOG.warn(e);
   }
   myData = null;
 }
  private void updateData(MavenProgressIndicator progress) throws MavenIndexException {
    String newDataDirName;
    IndexData newData;

    newDataDirName = findAvailableDataDirName();
    try {
      FileUtil.copyDir(getUpdateDir(), getDataContextDir(getDataDir(newDataDirName)));
    } catch (IOException e) {
      throw new MavenIndexException(e);
    }
    newData = openData(newDataDirName);

    try {
      doUpdateIndexData(newData, progress);
      newData.flush();
    } catch (Throwable e) {
      newData.close(true);
      FileUtil.delete(getDataDir(newDataDirName));

      if (e instanceof MavenServerIndexerException) throw new MavenIndexException(e);
      if (e instanceof IOException) throw new MavenIndexException(e);
      throw new RuntimeException(e);
    }

    synchronized (this) {
      IndexData oldData = myData;

      myData = newData;
      myDataDirName = newDataDirName;

      myUpdateTimestamp = System.currentTimeMillis();

      oldData.close(true);

      File[] children = myDir.listFiles();
      if (children != null) {
        for (File each : children) {
          if (each.getName().startsWith(DATA_DIR_PREFIX)
              && !each.getName().equals(newDataDirName)) {
            FileUtil.delete(each);
          }
        }
      }
    }
  }
  private void doUpdateIndexData(IndexData data, MavenProgressIndicator progress)
      throws IOException, MavenServerIndexerException {
    final Map<String, Set<String>> groupToArtifactMap = new THashMap<String, Set<String>>();
    final Map<String, Set<String>> groupWithArtifactToVersionMap =
        new THashMap<String, Set<String>>();

    final StringBuilder builder = new StringBuilder();

    progress.pushState();
    progress.setIndeterminate(true);

    try {
      data.processArtifacts(
          new MavenIndicesProcessor() {
            @Override
            public void processArtifacts(Collection<MavenId> artifacts) {
              for (MavenId each : artifacts) {
                String groupId = each.getGroupId();
                String artifactId = each.getArtifactId();
                String version = each.getVersion();

                builder.setLength(0);

                builder.append(groupId).append(":").append(artifactId);
                String ga = builder.toString();

                getOrCreate(groupToArtifactMap, groupId).add(artifactId);
                getOrCreate(groupWithArtifactToVersionMap, ga).add(version);
              }
            }
          });

      persist(groupToArtifactMap, data.groupToArtifactMap);
      persist(groupWithArtifactToVersionMap, data.groupWithArtifactToVersionMap);
    } finally {
      progress.popState();
    }
  }