package org.bonitasoft.livingapps.menu;
import java.util.ArrayList;
import java.util.List;
import org.bonitasoft.engine.api.ApplicationAPI;
import org.bonitasoft.engine.business.application.ApplicationMenu;
import org.bonitasoft.engine.business.application.ApplicationPageNotFoundException;
import org.bonitasoft.engine.exception.SearchException;
public class MenuFactory {
public interface Collector {
public boolean isCollectible(ApplicationMenu item);
}
private final ApplicationAPI applicationApi;
public MenuFactory(final ApplicationAPI applicationApi) {
this.applicationApi = applicationApi;
}
public List<Menu> create(final List<ApplicationMenu> menuList) throws ApplicationPageNotFoundException, SearchException {
return collect(menuList, new RootMenuCollector());
}
private Menu create(final ApplicationMenu menu, final List<ApplicationMenu> menuList) throws ApplicationPageNotFoundException, SearchException {
if(menu.getApplicationPageId() == null) {
return new MenuContainer(menu,
collect(menuList, new ChildrenMenuCollector(menu.getId())));
}
return new MenuLink(menu, applicationApi.getApplicationPage(menu.getApplicationPageId()).getToken());
}
private List<Menu> collect(final List<ApplicationMenu> items, final Collector collector)
throws ApplicationPageNotFoundException, SearchException {
final List<Menu> menuList = new ArrayList<Menu>();
for (final ApplicationMenu item : items) {
if(collector.isCollectible(item)) {
menuList.add(create(item, items));
}
}
return menuList;
}
}