package org.molgenis.ui.menumanager;
import com.google.gson.GsonBuilder;
import org.molgenis.data.settings.AppSettings;
import org.molgenis.framework.ui.MolgenisPlugin;
import org.molgenis.framework.ui.MolgenisPluginRegistry;
import org.molgenis.ui.MenuType;
import org.molgenis.ui.Molgenis;
import org.molgenis.ui.PluginType;
import org.molgenis.ui.XmlMolgenisUiLoader;
import org.molgenis.ui.menu.Menu;
import org.molgenis.ui.menu.MenuItem;
import org.molgenis.ui.menu.MenuItemType;
import org.molgenis.ui.menu.MenuReaderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static java.util.Objects.requireNonNull;
public class MenuManagerServiceImpl implements MenuManagerService
{
private static final Logger LOG = LoggerFactory.getLogger(MenuManagerServiceImpl.class);
private final MenuReaderService menuReaderService;
private final AppSettings appSettings;
private final MolgenisPluginRegistry molgenisPluginRegistry;
@Autowired
public MenuManagerServiceImpl(MenuReaderService menuReaderService, AppSettings appSettings,
MolgenisPluginRegistry molgenisPluginRegistry)
{
this.menuReaderService = requireNonNull(menuReaderService);
this.appSettings = requireNonNull(appSettings);
this.molgenisPluginRegistry = requireNonNull(molgenisPluginRegistry);
}
@Override
@PreAuthorize("hasAnyRole('ROLE_SYSTEM, ROLE_SU, ROLE_PLUGIN_READ_menumanager')")
@Transactional(readOnly = true)
public Menu getMenu()
{
return menuReaderService.getMenu();
}
@Override
@PreAuthorize("hasAnyRole('ROLE_SYSTEM, ROLE_SU, ROLE_PLUGIN_READ_menumanager')")
@Transactional(readOnly = true)
public Iterable<MolgenisPlugin> getPlugins()
{
return molgenisPluginRegistry;
}
@Override
@PreAuthorize("hasAnyRole('ROLE_SYSTEM, ROLE_SU, ROLE_PLUGIN_WRITE_menumanager')")
@Transactional
public void saveMenu(Menu molgenisMenu)
{
String menuJson = new GsonBuilder().create().toJson(molgenisMenu);
appSettings.setMenu(menuJson);
}
public String getDefaultMenuValue()
{
Molgenis molgenis;
try
{
molgenis = new XmlMolgenisUiLoader().load();
}
catch (IOException e)
{
// default menu does not exist, no op
return null;
}
Menu defaultMenu = loadDefaultMenu(molgenis);
return defaultMenu != null ? new GsonBuilder().create().toJson(defaultMenu) : null;
}
private Menu loadDefaultMenu(Molgenis molgenis)
{
Menu molgenisMenu = new Menu();
parseDefaultMenuRec(molgenisMenu, molgenis.getMenu());
return molgenisMenu;
}
private void parseDefaultMenuRec(MenuItem menuItem, Object defaultMenuObj)
{
if (defaultMenuObj instanceof MenuType)
{
MenuType menuType = (MenuType) defaultMenuObj;
menuItem.setId(menuType.getName());
menuItem.setLabel(menuType.getLabel());
menuItem.setType(MenuItemType.MENU);
List<Object> defaultMenuItems = menuType.getMenuOrPlugin();
if (defaultMenuItems != null)
{
List<MenuItem> items = new ArrayList<MenuItem>(defaultMenuItems.size());
for (Object defaultSubMenuObj : defaultMenuItems)
{
MenuItem subMenuItem = new MenuItem();
parseDefaultMenuRec(subMenuItem, defaultSubMenuObj);
items.add(subMenuItem);
}
menuItem.setItems(items);
}
}
else if (defaultMenuObj instanceof PluginType)
{
PluginType pluginType = (PluginType) defaultMenuObj;
menuItem.setId(pluginType.getId());
menuItem.setLabel(pluginType.getName());
menuItem.setType(MenuItemType.PLUGIN);
String url = pluginType.getUrl();
int idx;
if ((idx = url.indexOf('?')) != -1)
{
String params = url.substring(idx + 1);
menuItem.setParams(params);
}
}
else
{
throw new RuntimeException("Unknown menu object class [" + defaultMenuObj.getClass().getName() + "]");
}
}
}