#! /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();