feat: scripts

This commit is contained in:
2025-04-05 16:57:26 +08:00
parent bd4fe63cdc
commit 3e996ffab3
62 changed files with 4905 additions and 0 deletions

161
scripts/runjshelp.js Normal file
View 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();