package eu.dnetlib.uoaadmintools.services; import eu.dnetlib.uoaadmintools.dao.MenuItemDAO; import eu.dnetlib.uoaadmintools.entities.menu.MenuItem; import eu.dnetlib.uoaadmintools.entities.menu.MenuItemFull; import eu.dnetlib.uoaadmintoolslibrary.handlers.MismatchingContentException; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service public class MenuItemService { private final Logger log = Logger.getLogger(this.getClass()); @Autowired private MenuItemDAO menuItemDAO; public MenuItem getMenuItem(String id) { return menuItemDAO.findById(id); } public MenuItemFull getMenuItemFull(String id) { return this.getMenuItemFull(id, 1); } public MenuItemFull getMenuItemFull(String id, int maxDepth) { MenuItem menuItem = menuItemDAO.findById(id); MenuItemFull menuItemFull = new MenuItemFull(menuItem); if(maxDepth == 0) { menuItemFull.setItems(new ArrayList<>()); return menuItemFull; } List menuItemsFull = new ArrayList<>(); for(String menuItemString : menuItem.getItems()) { menuItemsFull.add(this.getMenuItemFull(menuItemString, maxDepth-1)); } menuItemFull.setItems(menuItemsFull); return menuItemFull; } public List getMenuItems(String portalPid) { if(portalPid != null) { return menuItemDAO.findByPortalPid(portalPid); } else { return menuItemDAO.findAll(); } } public List getMenuItemsByParent(String parentId, String portalPid) { if(portalPid != null) { return menuItemDAO.findByParentItemIdAndPortalPid(parentId, portalPid); } else { return menuItemDAO.findByParentItemId(parentId); } } public List getRootMenuItemsFull(String portalPid) { List rootMenuItems = this.getMenuItemsByParent(null, portalPid); List rootMenuItemsFull = new ArrayList<>(); for(MenuItem rootMenuItem : rootMenuItems) { MenuItemFull rootMenuItemFull = new MenuItemFull(rootMenuItem); List childrenMenuItemsFull = new ArrayList<>(); for(String childMenuItemString : rootMenuItem.getItems()) { childrenMenuItemsFull.add(this.getMenuItemFull(childMenuItemString)); } rootMenuItemFull.setItems(childrenMenuItemsFull); rootMenuItemsFull.add(rootMenuItemFull); } return rootMenuItemsFull; } // public MenuItemFull saveAndReturn(MenuItemFull menuItemFull) { // menuItemFull.setId(save(menuItemFull)); // return menuItemFull; // } public MenuItemFull insertMenuItem(MenuItem menuItem, String portalPid) { // for(MenuItemFull childMenuItemFull : menuItemFull.getItems()) { // childMenuItemFull.setId(this.save(childMenuItemFull)); // } // MenuItem menuItem = getMenuItemByMenuItemFull(menuItemFull); // menuItemDAO.save(menuItem); // // return menuItem.getId(); MenuItem parent = null; if(menuItem.getParentItemId() != null && !menuItem.getParentItemId().equals("")) { parent = getMenuItem(menuItem.getParentItemId()); if (!parent.getPortalPid().equals(portalPid)) { // EXCEPTION - MismatchingContent throw new MismatchingContentException("insertMenuItem: parent ("+parent.getParentItemId()+") of MenuItem has portalPid: " + parent.getPortalPid() + " instead of " + portalPid); } } else { menuItem.setParentItemId(null); } // MenuItem menuItem = getMenuItemByMenuItemFull(menuItemFull); if(menuItem.getItems() == null) { List menuItems = new ArrayList(); menuItem.setItems(menuItems); } menuItemDAO.save(menuItem); if(parent != null) { List siblingsOfNew = parent.getItems(); siblingsOfNew.add(menuItem.getId()); parent.setItems(siblingsOfNew); menuItemDAO.save(parent); } MenuItemFull menuItemFull = new MenuItemFull(menuItem); menuItemFull.setItems(new ArrayList<>()); return menuItemFull; } public MenuItemFull updateMenuItem(MenuItemFull menuItemFull) { MenuItem menuItem = getMenuItemByMenuItemFull(menuItemFull); // Update should not affect parent or children - only basic info can be updated MenuItem oldMenuItem = getMenuItem(menuItemFull.getId()); menuItem.setItems(oldMenuItem.getItems()); menuItem.setParentItemId(oldMenuItem.getParentItemId()); menuItemDAO.save(menuItem); menuItemFull = getMenuItemFull(menuItem.getId()); return menuItemFull; } public Boolean deleteMenuItem(String id, String portalPid) throws Exception { // menuItemDAO.delete(id); log.debug("delete menu item; "+id); List menuItems = new ArrayList<>(); menuItems.add(id); return deleteMenuItems(menuItems, portalPid); } public Boolean deleteMenuItems(List menuItems, String portalPid) throws Exception { if(menuItems == null) { return true; } for (String id: menuItems) { MenuItem menuItem = menuItemDAO.findById(id); if(!portalPid.equals(menuItem.getPortalPid())) { // EXCEPTION - MismatchingContent throw new MismatchingContentException("Delete Menu Items: MenuItem with id: "+id+" has portalPid: "+menuItem.getPortalPid()+" instead of "+portalPid); } deleteMenuItems(menuItem.getItems(), portalPid); if(menuItem.getParentItemId() != null && !menuItem.getParentItemId().equals("")) { MenuItem parent = menuItemDAO.findById(menuItem.getParentItemId()); List siblingsOfDeleted = parent.getItems(); siblingsOfDeleted.remove(id); parent.setItems(siblingsOfDeleted); menuItemDAO.save(parent); } menuItemDAO.delete(id); } return true; } private MenuItem getMenuItemByMenuItemFull(MenuItemFull menuItemFull) { MenuItem menuItem = new MenuItem(); menuItem.setId(menuItemFull.getId()); menuItem.setTitle(menuItemFull.getTitle()); menuItem.setUrl(menuItemFull.getUrl()); menuItem.setType(menuItemFull.getType()); menuItem.setRoute(menuItemFull.getRoute()); menuItem.setPortalPid(menuItemFull.getPortalPid()); menuItem.setParentItemId(menuItemFull.getParentItemId()); List menuItemsFull = menuItemFull.getItems(); List menuItems = new ArrayList(); if(menuItemsFull != null) { for (MenuItemFull childMenuItemFull : menuItemsFull) { menuItems.add(childMenuItemFull.getId()); } } menuItem.setItems(menuItems); return menuItem; } }