/*
* JBoss, Home of Professional Open Source.
* Copyright 2011, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.jdr.util;
import org.jboss.vfs.VFS;
import org.jboss.vfs.VirtualFile;
import java.util.List;
public class FSTree {
int directoryCount = 0;
int fileCount = 0;
StringBuilder buf = new StringBuilder();
String topDirectory = null;
String fmt = "%s%s%s %s";
public FSTree(String root) throws Exception {
this.traverse(root, "", true);
}
private static double div(long left, long right) {
return (double)left / (double)right;
}
private static String formatBytes(long size) {
if (size > Utils.ONE_TB) {
return String.format("%.1fT", div(size, Utils.ONE_TB));
} else if (size > Utils.ONE_GB) {
return String.format("%.1fG", div(size, Utils.ONE_GB));
} else if (size > Utils.ONE_MB) {
return String.format("%.1fM", div(size, Utils.ONE_MB));
} else if (size > Utils.ONE_KB) {
return String.format("%.1fK", div(size, Utils.ONE_KB));
} else {
return String.format("%d", size);
}
}
private void traverse(String dir, String padding) throws java.io.IOException {
traverse(dir, padding, false);
}
private void append(VirtualFile f, String padding) {
String baseName = f.getName();
String size = formatBytes(f.getSize());
buf.append(String.format(fmt, padding, "+-- ", size, baseName));
buf.append("\n");
}
private void traverse(String dir, String padding, boolean first)
throws java.io.IOException {
VirtualFile path = VFS.getChild(dir);
if (!first) {
String _p = padding.substring(0, padding.length() -1);
append(path, _p);
padding += " ";
}
else {
buf.append(path.getName());
buf.append("\n");
}
int count = 0;
List<VirtualFile> files = path.getChildren();
for (VirtualFile f : files ) {
count += 1;
if (f.getPathName().startsWith(".")) {
continue;
}
else if (f.isFile()) {
append(f, padding);
}
else if (Utils.isSymlink(f)) {
buf.append(padding);
buf.append("+-- ");
buf.append(f.getName());
buf.append(" -> ");
buf.append(f.getPathName());
buf.append("\n");
}
else if (f.isDirectory()) {
if (count == files.size()) {
traverse(f.getPathName(), padding + " ");
}
else {
traverse(f.getPathName(), padding + "|");
}
}
}
}
public String toString() {
return buf.toString();
}
}