@Test void getPath() { assertEquals(of(asList("root/p1_0".split("/"))), menu.getPath("p1_0")); assertEquals(of(asList("root/p1_1".split("/"))), menu.getPath("p1_1")); assertEquals(of(asList("p1_1/p2_0".split("/"))), menu.getPath("p2_0")); assertEquals(of(asList("p1_1/p2_1".split("/"))), menu.getPath("p2_1")); assertEquals(of(asList("p2_0/p3_0".split("/"))), menu.getPath("p3_0")); assertEquals(of(asList("p2_0/p3_1".split("/"))), menu.getPath("p3_1")); assertEquals(empty(), menu.getPath("non_existing")); }
@Override public Optional<List<String>> getPath(String id) { return id.equals(getId()) ? Optional.of(ImmutableList.of(id)) : filter(menu -> containsMenuItem(menu, id)) .filter(menu -> !((Menu) menu).getItems().isEmpty()) .flatMap(menu -> ((Menu) menu).getItems().get(0).getPath(id)) .map(this::prefixId); }
Menu implements MenuNode { @Override public Optional<List<String>> getPath(String id) { return id.equals(getId()) ? Optional.of(ImmutableList.of(id)) : filter(menu -> containsMenuItem(menu, id)) .filter(menu -> !((Menu) menu).getItems().isEmpty()) .flatMap(menu -> ((Menu) menu).getItems().get(0).getPath(id)) .map(this::prefixId); } }
Menu implements MenuNode { @Override public Optional<List<String>> getPath(String id) { return id.equals(getId()) ? Optional.of(ImmutableList.of(id)) : filter(menu -> containsMenuItem(menu, id)) .filter(menu -> !((Menu) menu).getItems().isEmpty()) .flatMap(menu -> ((Menu) menu).getItems().get(0).getPath(id)) .map(this::prefixId); }  }
Menu implements MenuNode { @Override public Optional<List<String>> getPath(String id) { return id.equals(getId()) ? Optional.of(ImmutableList.of(id)) : filter(menu -> containsMenuItem(menu, id)) .filter(menu -> !((Menu) menu).getItems().isEmpty()) .flatMap(menu -> ((Menu) menu).getItems().get(0).getPath(id)) .map(this::prefixId); }  abstract List<MenuNode> getItems(); @Override Optional<MenuNode> filter(Predicate<MenuNode> predicate); @Override boolean isMenu(); @Override Optional<List<String>> getPath(String id); @Override boolean contains(Predicate<MenuNode> predicate); Optional<MenuItem> firstItem(); Optional<Menu> findMenu(String menuId); static Menu create(String id, String label, List<MenuNode> items); }
Menu implements MenuNode { @Override public Optional<List<String>> getPath(String id) { return id.equals(getId()) ? Optional.of(ImmutableList.of(id)) : filter(menu -> containsMenuItem(menu, id)) .filter(menu -> !((Menu) menu).getItems().isEmpty()) .flatMap(menu -> ((Menu) menu).getItems().get(0).getPath(id)) .map(this::prefixId); }  abstract List<MenuNode> getItems(); @Override Optional<MenuNode> filter(Predicate<MenuNode> predicate); @Override boolean isMenu(); @Override Optional<List<String>> getPath(String id); @Override boolean contains(Predicate<MenuNode> predicate); Optional<MenuItem> firstItem(); Optional<Menu> findMenu(String menuId); static Menu create(String id, String label, List<MenuNode> items);  }