import java.util.List;
import java.util.Objects;

import static java.lang.String.format;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;

public class FileSystemPlayground {
    static int counter = 0;

    static Ordner findFirstOrdnerWithName(Ordner ordner, String name) {
        System.out.println(format("%02d | searching in %s ", ++counter, ordner.name));
        if (ordner.name == name) {
            return ordner;
        }

        if (isNull(ordner.els) || ordner.els.isEmpty()) {
            return null;
        }

        return ordner.els.stream()
                .filter(el -> el instanceof Ordner)
                .map(o -> (Ordner) o)
                .map(realOrdner -> findFirstOrdnerWithName(realOrdner, name))
                .filter(Objects::nonNull)
                .findFirst()
                .orElse(null);
    }

    public static void main(String[] args) {
        final Ordner root = generateFileSystemStructure();
        final String goalName = "goal";
        final Ordner goal = findFirstOrdnerWithName(root, goalName);

        System.out.printf("\nFound : \'%s\' after searching %d folders",
                nonNull(goal) ? goal.name : null,
                counter);
    }


    static Ordner generateFileSystemStructure() {
        Ordner root = new Ordner();
        root.name = "root";

        Ordner o_1 = new Ordner();
        o_1.name = "o_1";

        Ordner o_2 = new Ordner();
        o_2.name = "o_2";

        Ordner o_1_1 = new Ordner();
        o_1_1.name = "o_1_1";

        Ordner o_1_2 = new Ordner();
        o_1_2.name = "o_1_2";

        Ordner o_1_2_1 = new Ordner();
        o_1_2_1.name = "o_1_2_1";

        Ordner o_2_1_1 = new Ordner();
        o_2_1_1.name = "o_2_1_1";

        Ordner o_2_2 = new Ordner();
        o_2_2.name = "o_2_2";

        Ordner o_2_2_1 = new Ordner();
        o_2_2_1.name = "o_2_2_1";

        Ordner o_2_2_2 = new Ordner();
        o_2_2_2.name = "o_2_2_2";

        Ordner o_2_2_3 = new Ordner();
        o_2_2_3.name = "o_2_2_3";

        Ordner o_2_2_4 = new Ordner();
        o_2_2_4.name = "o_2_2_4";

        Ordner goal = new Ordner();
        goal.name = "goal";

        Ordner goal1 = new Ordner();
        goal1.name = "goal1";

        Ordner goal2 = new Ordner();
        goal2.name = "goal2";

        Datei datei = new Datei();
        datei.name = "datei";

        goal.els = List.of(goal1, goal2, datei);

        o_1_2_1.els = List.of(goal, o_2_1_1);
        o_2_2.els = List.of(o_2_2_1, o_2_2_2, o_2_2_3, o_2_2_4);

        o_1.els = List.of(o_1_1, o_1_2);
        o_2.els = List.of(o_1_2_1, o_2_2);

        root.els = List.of(o_1, o_2);

        return root;
    }

    static class FSElement {
        String name;
    }

    static class Ordner extends FSElement {
        List<FSElement> els;
    }

    static class Datei extends FSElement {
        Long groesse;
    }
}