/******************************************************************************* * Copyright (c) 2012 xored software, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * xored software, Inc. - initial API and implementation (Ivan Lobachev) ******************************************************************************/ package com.xored.glance.ui.ccvs; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.Path; import org.eclipse.team.internal.ccvs.core.CVSTag; import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation; import org.eclipse.team.internal.ccvs.core.resources.RemoteFile; import org.eclipse.team.internal.ccvs.core.resources.RemoteFolderTree; @SuppressWarnings("restriction") public class CVSHistoryTree/* extends TreeContent */implements ICVSHistoryNode { // public static CVSHistoryTree tree; private final ICVSRepositoryLocation repository; private final CVSTag tag; private final Map<String, ICVSHistoryNode> elements; public CVSHistoryTree(ICVSRepositoryLocation repository, CVSTag tag) { if (tag == null) tag = new CVSTag(); this.tag = tag; this.repository = repository; this.elements = new HashMap<String, ICVSHistoryNode>(); } // @Override // public TreeItemContent getContent(TreeCell cell) { // return null; // } public ICVSRepositoryLocation getRepository() { return this.repository; } public ICVSHistoryNode[] getNodeChildren() { ICVSHistoryNode[] res = elements.values().toArray( new ICVSHistoryNode[0]); Arrays.sort(res, new Comparator() { public int compare(Object arg0, Object arg1) { return ((ICVSHistoryNode) arg0).getElementName().compareTo( ((ICVSHistoryNode) arg1).getElementName()); } }); return res; // elements.values().toArray(new ICVSHistoryNode[0]); } public ICVSHistoryNode createFolder(String fullName) { int ind = fullName.indexOf("/"); String curFolder = fullName; String childFolder = null; if (ind != -1) { curFolder = fullName.substring(0, ind); childFolder = fullName.substring(ind + 1); } ICVSHistoryNode elem = elements.get(curFolder); if (elem == null) { elem = new CVSHistoryElement(curFolder, ICVSHistoryNode.FOLDER, this, null); elements.put(curFolder, elem); } if (childFolder != null) { return elem.createFolder(childFolder); } return elem; } public ICVSHistoryNode findFolder(String fullName) { fullName = fullName.replace(getRepository().toString() + "/", "") /* .replace(tag.getName() + "/", "") */; int ind = fullName.indexOf("/"); String curFolder = fullName; String childFolder = null; if (ind != -1) { curFolder = fullName.substring(0, ind); childFolder = fullName.substring(ind + 1); } ICVSHistoryNode elem = elements.get(curFolder); if (elem != null && elem.getCount() == 1) { if (childFolder == null) { return elem; } return elem.findFolder(childFolder); } return null; } public ICVSHistoryNode findFile(String fileName, String fullPath) { ICVSHistoryNode folder = findFolder(fullPath); if (folder != null) { ICVSHistoryNode elem = folder.findFile(fileName); if (elem != null && elem.getType() == ICVSHistoryNode.FILE && elem.getCount() == 1) { return elem; } } return null; } public void createFile(String name, String fullPath, String revision) { ICVSHistoryNode folderElement = createFolder(fullPath); folderElement.createFile(name, revision); } public void removeFile(String name, String fullPath) { ICVSHistoryNode elem = createFolder(fullPath); if (elem != null) { elem.removeFile(name); } } public void accept(IHistoryTreeVisitor visitor) { Set<String> keys = elements.keySet(); if (keys != null) { for (String key : keys) { elements.get(key).accept(visitor); } } } public RemoteFolderTree buildRemoteTree(final String elementName, boolean reset) { final HistoryTreeBuilder historyTreeBuilder = new HistoryTreeBuilder( repository, tag); if (reset) { historyTreeBuilder.reset(); } ICVSHistoryNode elem = null; ICVSHistoryNode head = getChild(tag.getName()); if (head != null) { elem = head.getChild(elementName); } if (elem != null) { elem.accept(new IHistoryTreeVisitor() { public boolean visit(ICVSHistoryNode element) { if (element.getType() == ICVSHistoryNode.FILE) { String elementPath = element.getFullPath().substring( repository.toString().length() + tag.getName().length() + 2); historyTreeBuilder.newFile((new Path(elementPath .substring(elementName.length() + 1))), RemoteFile.create(elementPath, repository, tag, element.getRevision())); return false; } return true; } }); } return historyTreeBuilder.getTree(); } public RemoteFolderTree buildRemoteTree() { RemoteFolderTree tree = null; for (String elemName : elements.keySet()) { tree = buildRemoteTree(elemName, false); } return tree; } public void updateFileRevision(String name, String fullPath, String revision) { ICVSHistoryNode folderElement = createFolder(fullPath); ICVSHistoryNode elem = folderElement.findPhantomFile(name); if (elem == null) { folderElement.createFile(name, revision); elem = folderElement.findPhantomFile(name); elem.removed(); } if (elem != null && elem.getType() == ICVSHistoryNode.FILE) { elem.updateRevision(revision); } } public List<ICVSHistoryNode> getAllElements() { Collection<ICVSHistoryNode> elems = elements.values(); List<ICVSHistoryNode> finalCollection = new ArrayList<ICVSHistoryNode>(); finalCollection.addAll(elems); for (ICVSHistoryNode elem : elems) { finalCollection.addAll(elem.getAllElements()); } return finalCollection; } public String getElementName() { return repository.toString(); } public String getFullPath() { return getElementName()/* + "/HEAD" */; } public ICVSHistoryNode getParent() { return null; } public int getType() { return ICVSHistoryNode.REPOSITORY; } public void added() { } public void createFile(String fileName, String revision) { } public ICVSHistoryNode findFile(String fileName) { return null; } public ICVSHistoryNode findPhantomFile(String fileName) { // TODO Auto-generated method stub return null; } public int getCount() { return 1; } public void removeFile(String name) { } public void removed() { } public String getText() { return getElementName(); } public String getRevision() { return ""; } public void setRevision(String revision) { } public void updateRevision(String revision) { } public ICVSHistoryNode getChild(String name) { return elements.get(name); } }