Package org.intellij.vcs.mks.history

Source Code of org.intellij.vcs.mks.history.MksMemberHistoryAsTreeProvider

package org.intellij.vcs.mks.history;

import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.history.HistoryAsTreeProvider;
import com.intellij.openapi.vcs.history.VcsFileRevision;
import com.intellij.openapi.vcs.history.VcsRevisionNumber;
import com.intellij.util.TreeItem;
import org.intellij.vcs.mks.MksRevisionNumber;

import java.util.*;

public class MksMemberHistoryAsTreeProvider implements HistoryAsTreeProvider {
  private final Logger LOGGER = Logger.getInstance(getClass().getName());

  public MksMemberHistoryAsTreeProvider() {
  }

  /**
   * It seems we should only return roots
   *
   * @param allRevisions all the revisions to be viewed as a tree (will become node/treeitems)
   * @return a list of the roots, usually the only root (aka revision 1.1)
   */
  public List<TreeItem<VcsFileRevision>> createTreeOn(List<VcsFileRevision> allRevisions) {
    Map<VcsRevisionNumber, TreeItem<VcsFileRevision>> treeItemMap =
        new HashMap<VcsRevisionNumber, TreeItem<VcsFileRevision>>();
    Map<VcsRevisionNumber, VcsFileRevision> revisionsByRevNumber =
        new HashMap<VcsRevisionNumber, VcsFileRevision>();
    for (VcsFileRevision revision : allRevisions) {
      revisionsByRevNumber.put(revision.getRevisionNumber(), revision);
    }
    // first order the revisions, so we can simply process the list and be sure
    // parent revisions have been processed first
    List<VcsRevisionNumber> orderedRevisions = new ArrayList<VcsRevisionNumber>(revisionsByRevNumber.keySet());
    List<TreeItem<VcsFileRevision>> result = new ArrayList<TreeItem<VcsFileRevision>>(orderedRevisions.size());
    Collections.sort(orderedRevisions);
    for (VcsRevisionNumber revisionNumber : orderedRevisions) {
      VcsFileRevision revision = revisionsByRevNumber.get(revisionNumber);
      TreeItem<VcsFileRevision> treeItem = new TreeItem<VcsFileRevision>(revision);
      treeItemMap.put(revisionNumber, treeItem);
      // now look for parents and set parent/child relationships
      String parentRevString = ((MksRevisionNumber) revisionNumber).getParentRevision();
      try {
        TreeItem<VcsFileRevision> parentItem = "".equals(parentRevString) ?
            null : treeItemMap.get(MksRevisionNumber.createRevision(parentRevString));
        if (null == parentItem) {
          result.add(treeItem);
        } else {
          // we want to keep newer revisions on top, thus reverse the order
          parentItem.addChild(treeItem);
        }
      } catch (VcsException e) {
        LOGGER.error("should not happen", e);
      } catch (RuntimeException e) {
        LOGGER.error(e);
        throw e;
      }
    }
    // put more recent entries on the top
    reorderRevisions(result);
    return result;

  }

  private void reorderRevisions(List<TreeItem<VcsFileRevision>> nodes) {
    Collections.reverse(nodes);
    for (TreeItem<VcsFileRevision> node : nodes) {
      if (!node.getChildren().isEmpty()) {
        Collections.reverse(node.getChildren());
      }
    }
  }
}
TOP

Related Classes of org.intellij.vcs.mks.history.MksMemberHistoryAsTreeProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.