diff --git a/src/main/java/de/szimnau/zeitlaeufer/Main.java b/src/main/java/de/szimnau/zeitlaeufer/Main.java new file mode 100644 index 0000000..85d1f01 --- /dev/null +++ b/src/main/java/de/szimnau/zeitlaeufer/Main.java @@ -0,0 +1,87 @@ +package de.szimnau.zeitlaeufer; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.InvocationTargetException; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static de.szimnau.zeitlaeufer.tools.CommonTools.print; +import static de.szimnau.zeitlaeufer.tools.CommonTools.println; + +public class Main { + + public static void main(String[] args) throws IOException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { + if (args.length == 0) { + askParametersAndRun(); + } else { + parseParametersAndRun(args); + } + } + + + private static void askParametersAndRun() throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + var br = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)); + Map> classes = getAllrelevantClasses(); + String printedClasses = classes.entrySet().stream() + .map(e -> e.getKey() + ": " + e.getValue().getCanonicalName().substring(e.getValue().getCanonicalName().lastIndexOf('.') + 1)) + .reduce("", (a, b) -> a + "\n" + b); + print("Welcher Zeitläufer soll verwendet werden? " + printedClasses + "\n: "); + var num = Integer.parseInt(br.readLine()); + Class selectedClass = classes.get(num); + var mainMethod = selectedClass.getMethod("main", String[].class); + mainMethod.invoke(null, (Object) new String[0]); + } + + + private static Map> getAllrelevantClasses() { + InputStream stream = ClassLoader.getSystemClassLoader() + .getResourceAsStream("de/szimnau/zeitlaeufer"); + var br = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)); + var increment = new AtomicInteger(); + return Collections.unmodifiableSortedMap(new TreeMap<>( + br.lines() + .filter(line -> line.endsWith(".class") && !"Main.class".equals(line)) + .sorted() + .map(Main::getClass) + .filter(Objects::nonNull) + .filter(clazz -> + Arrays.stream(clazz.getMethods()).anyMatch(m -> + "main".equals(m.getName()) && m.getParameterCount() == 1 && m.getParameterTypes()[0] == String[].class + ) + ) + .collect(Collectors.toMap(c -> increment.incrementAndGet(), Function.identity())) + )); + } + + + private static Class getClass(String className) { + return getClassForName(className.substring(0, className.lastIndexOf('.'))); + } + + + private static Class getClassForName(String className) { + String fqnClassName = "de.szimnau.zeitlaeufer." + className; + try { + return Class.forName(fqnClassName); + } catch (ClassNotFoundException cnfe) { + println("ERROR: could not find Class for Name: de.szimnau.zeitlaeufer." + fqnClassName); + } + return null; + } + + + private static void parseParametersAndRun(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class selectedClass = getClassForName(args[0]); + if (selectedClass == null) { + System.exit(1); + } + var mainMethod = selectedClass.getMethod("main", String[].class); + mainMethod.invoke(null, (Object) Arrays.copyOfRange(args, 1, args.length)); + } +}