/*
* Copyright 2012 GitHub Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.mobile.core.code;
import static java.lang.String.CASE_INSENSITIVE_ORDER;
import static org.eclipse.egit.github.core.TreeEntry.TYPE_BLOB;
import static org.eclipse.egit.github.core.TreeEntry.TYPE_TREE;
import android.text.TextUtils;
import com.github.mobile.core.commit.CommitUtils;
import com.github.mobile.core.ref.RefUtils;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.eclipse.egit.github.core.Reference;
import org.eclipse.egit.github.core.Tree;
import org.eclipse.egit.github.core.TreeEntry;
/**
* {@link Tree} with additional information
*/
public class FullTree {
/**
* Entry in a tree
*/
public static class Entry implements Comparable<Entry> {
/**
* Parent folder
*/
public final Folder parent;
/**
* Raw tree entry
*/
public final TreeEntry entry;
/**
* Name
*/
public final String name;
private Entry() {
this.parent = null;
this.entry = null;
this.name = null;
}
private Entry(TreeEntry entry, Folder parent) {
this.entry = entry;
this.parent = parent;
this.name = CommitUtils.getName(entry.getPath());
}
@Override
public int compareTo(Entry another) {
return CASE_INSENSITIVE_ORDER.compare(name, another.name);
}
}
/**
* Folder in a tree
*/
public static class Folder extends Entry {
/**
* Sub folders
*/
public final Map<String, Folder> folders = new TreeMap<String, Folder>(
CASE_INSENSITIVE_ORDER);
/**
* Files
*/
public final Map<String, Entry> files = new TreeMap<String, Entry>(
CASE_INSENSITIVE_ORDER);
private Folder() {
super();
}
private Folder(TreeEntry entry, Folder parent) {
super(entry, parent);
}
private void addFile(TreeEntry entry, String[] pathSegments, int index) {
if (index == pathSegments.length - 1) {
Entry file = new Entry(entry, this);
files.put(file.name, file);
} else {
Folder folder = folders.get(pathSegments[index]);
if (folder != null)
folder.addFile(entry, pathSegments, index + 1);
}
}
private void addFolder(TreeEntry entry, String[] pathSegments, int index) {
if (index == pathSegments.length - 1) {
Folder folder = new Folder(entry, this);
folders.put(folder.name, folder);
} else {
Folder folder = folders.get(pathSegments[index]);
if (folder != null)
folder.addFolder(entry, pathSegments, index + 1);
}
}
private void add(final TreeEntry entry) {
String type = entry.getType();
String path = entry.getPath();
if (TextUtils.isEmpty(path))
return;
if (TYPE_BLOB.equals(type)) {
String[] segments = path.split("/");
if (segments.length > 1) {
Folder folder = folders.get(segments[0]);
if (folder != null)
folder.addFile(entry, segments, 1);
} else if (segments.length == 1) {
Entry file = new Entry(entry, this);
files.put(file.name, file);
}
} else if (TYPE_TREE.equals(type)) {
String[] segments = path.split("/");
if (segments.length > 1) {
Folder folder = folders.get(segments[0]);
if (folder != null)
folder.addFolder(entry, segments, 1);
} else if (segments.length == 1) {
Folder folder = new Folder(entry, this);
folders.put(folder.name, folder);
}
}
}
}
/**
* Tree
*/
public final Tree tree;
/**
* Root folder
*/
public final Folder root;
/**
* Reference
*/
public final Reference reference;
/**
* Branch where tree is present
*/
public final String branch;
/**
* Create tree with branch
*
* @param tree
* @param reference
*/
public FullTree(final Tree tree, final Reference reference) {
this.tree = tree;
this.reference = reference;
this.branch = RefUtils.getName(reference);
root = new Folder();
List<TreeEntry> entries = tree.getTree();
if (entries != null && !entries.isEmpty())
for (TreeEntry entry : entries)
root.add(entry);
}
}