162 lines
5.2 KiB
JavaScript
162 lines
5.2 KiB
JavaScript
#! /usr/bin/env runjs
|
|
var System = java.lang.System;
|
|
var JarFile = java.util.jar.JarFile;
|
|
var StringUtil = Packages.me.hatter.tools.commons.string.StringUtil;
|
|
var StandaloneMainInteractive = Packages.me.hatter.tools.jssp.main.StandaloneMainInteractive;
|
|
var ConsoleReadTool = Packages.me.hatter.tools.commons.console.ConsoleReadTool;
|
|
var ClassLoaderUtil = Packages.me.hatter.tools.commons.classloader.ClassLoaderUtil;
|
|
var ReflectUtil = Packages.me.hatter.tools.commons.reflect.ReflectUtil;
|
|
|
|
var searchClasses = (systemClassLoader) => {
|
|
var classes = [];
|
|
$ARRAY(systemClassLoader.getURLs()).forEach((u) => {
|
|
var jarFile = new JarFile(u.getFile());
|
|
var jarEntryEnum = jarFile.entries();
|
|
while (jarEntryEnum.hasMoreElements()) {
|
|
var jarFileEntry = jarEntryEnum.nextElement();
|
|
var jarFileEntryName = jarFileEntry.getName();
|
|
if (jarFileEntryName.endsWith('.class')) {
|
|
classes.push(jarFileEntryName);
|
|
}
|
|
}
|
|
});
|
|
return classes;
|
|
};
|
|
|
|
var convertFileNameToClasName = (c) => {
|
|
if (c.endsWith('.class')) {
|
|
c = c.substring(0, c.length - 6);
|
|
}
|
|
if (c.contains('/')) {
|
|
c = c.replace(/\//g, '.');
|
|
}
|
|
return c;
|
|
};
|
|
|
|
var getShortClassName = (c) => {
|
|
var lastDot = c.lastIndexOf('.');
|
|
return c.substring(lastDot + 1);
|
|
};
|
|
|
|
var isMatchCommandFilter = (c, fullCommandLines) => {
|
|
if (fullCommandLines.length > 1) {
|
|
for (var i = 1; i < fullCommandLines.length; i++) {
|
|
var filterCmd = fullCommandLines[i];
|
|
var isMatchShortClassName = filterCmd.startsWith('S');
|
|
filterCmd = filterCmd.substring(1);
|
|
var matchClassName = isMatchShortClassName? getShortClassName(convertFileNameToClasName(c)): c;
|
|
if (!matchClassName.toLowerCase().contains(filterCmd.toLowerCase())) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
|
|
var main = () => {
|
|
StandaloneMainInteractive.initJLine();
|
|
var systemClassLoader = ClassLoaderUtil.getSystemClassLoader();
|
|
|
|
ConsoleReadTool.from('usage> ').loop((ln) => {
|
|
var fullCommandLine = $STR(ln);
|
|
var fullCommandLines = fullCommandLine.split(/\s+/);
|
|
var cmd = fullCommandLines[0];
|
|
if ($$.asList('ls', 'll', 'list').contains(cmd)) {
|
|
$ARRAY(systemClassLoader.getURLs()).forEach((u) => {
|
|
println(u);
|
|
});
|
|
} else if ($$.asList('exit', 'quit').contains(cmd)) {
|
|
println('+ Bye!');
|
|
System.exit(0);
|
|
} else if ($$.asList('desc', 'describe').contains(cmd)) {
|
|
if (fullCommandLines.length == 1) {
|
|
println('Cmd format error.')
|
|
} else {
|
|
var c = convertFileNameToClasName(fullCommandLines[1]);
|
|
try {
|
|
var cls = $$.clazz(c);
|
|
var fields = $ARRAY(ReflectUtil.getDeclaredFields(cls));
|
|
if (fields && (fields.length > 0)) {
|
|
println('Field(s):');
|
|
fields.forEach((f) => {
|
|
println(' ' + f);
|
|
});
|
|
}
|
|
var methods = $ARRAY(ReflectUtil.getDeclaredMethods(cls));
|
|
if (methods && (methods.length > 0)) {
|
|
println('Method(s):');
|
|
methods.forEach((m) => {
|
|
println(' ' + m);
|
|
});
|
|
}
|
|
} catch (e) {
|
|
println('Error in desc : ' + c);
|
|
}
|
|
}
|
|
} else if ($$.asList('search').contains(cmd)) {
|
|
searchClasses(systemClassLoader).forEach((c) => {
|
|
if (!isMatchCommandFilter(c, fullCommandLines)) {
|
|
return;
|
|
}
|
|
println(c);
|
|
});
|
|
} else if ($$.asList('import').contains(cmd)) {
|
|
searchClasses(systemClassLoader).forEach((c) => {
|
|
if (!isMatchCommandFilter(c, fullCommandLines)) {
|
|
return;
|
|
}
|
|
var className = convertFileNameToClasName(c);
|
|
var showClassName = getShortClassName(className);
|
|
println('var ' + showClassName + ' = ' + (className.startsWith('java.')? '': 'Packages.') + className + ';');
|
|
});
|
|
} else if ($$.asList('require').contains(cmd)) {
|
|
if (fullCommandLines.length == 1) {
|
|
println('Cmd format error.');
|
|
} else {
|
|
for (var i = 1; i < fullCommandLines.length; i++) {
|
|
requireJAR(fullCommandLines[i]);
|
|
}
|
|
}
|
|
} else if ($$.asList('tree').contains(cmd)) {
|
|
var classMap = $$.treeMap();
|
|
searchClasses(systemClassLoader).forEach((c) => {
|
|
if (!isMatchCommandFilter(c, fullCommandLines)) {
|
|
return;
|
|
}
|
|
var className = c.substring(0, c.length - 6);
|
|
var classNames = className.split('\/');
|
|
var baseMap = classMap;
|
|
$ARRAY(classNames).forEach((p) => {
|
|
var m = baseMap.get(p);
|
|
if (m == null) {
|
|
m = $$.treeMap();
|
|
baseMap.put(p, m);
|
|
}
|
|
baseMap = m;
|
|
});
|
|
});
|
|
var depth = 0;
|
|
var printMap = (m) => {
|
|
$ARRAY(m.keySet()).forEach((p) => {
|
|
var m2 = m.get(p);
|
|
var hasSub = (m2 != null) && (!m2.isEmpty());
|
|
println(StringUtil.repeat(' ', depth) + p + (hasSub? '.': ''));
|
|
if (hasSub) {
|
|
depth += p.length + 1;
|
|
printMap(m2);
|
|
depth -= p.length + 1;
|
|
}
|
|
});
|
|
};
|
|
println(classMap.size());
|
|
printMap(classMap);
|
|
} else {
|
|
if (cmd != '') {
|
|
println('Unknow command: ' + cmd);
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
main();
|