feat: scripts
This commit is contained in:
161
scripts/runjshelp.js
Normal file
161
scripts/runjshelp.js
Normal file
@@ -0,0 +1,161 @@
|
||||
#! /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();
|
||||
Reference in New Issue
Block a user