package org.molgenis.ui;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.HandlerMapping;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.text.SimpleDateFormat;
import java.util.Date;
import static org.molgenis.ui.MolgenisMenuController.URI;
import static org.molgenis.ui.MolgenisPluginAttributes.KEY_CONTEXT_URL;
@Controller
@RequestMapping(URI)
public class MolgenisMenuController
{
private static final Logger LOG = LoggerFactory.getLogger(MolgenisMenuController.class);
public static final String URI = "/menu";
static final String KEY_MENU_ID = "menu_id";
static final String KEY_MOLGENIS_VERSION = "molgenis_version";
static final String KEY_MOLGENIS_BUILD_DATE = "molgenis_build_date";
private final MolgenisUi molgenisUi;
private final String molgenisVersion;
private final String molgenisBuildData;
@Autowired
public MolgenisMenuController(MolgenisUi molgenisUi, @Value("${molgenis.version}") String molgenisVersion,
@Value("${molgenis.build.date}") String molgenisBuildData)
{
if (molgenisUi == null) throw new IllegalArgumentException("molgenisUi is null");
if (molgenisVersion == null) throw new IllegalArgumentException("molgenisVersion is null");
if (molgenisBuildData == null) throw new IllegalArgumentException("molgenisBuildDate is null");
this.molgenisUi = molgenisUi;
this.molgenisVersion = molgenisVersion;
// workaround for Eclipse bug: https://github.com/molgenis/molgenis/issues/2667
this.molgenisBuildData = molgenisBuildData.equals("${maven.build.timestamp}") ?
new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()) + " by Eclipse" : molgenisBuildData;
}
@RequestMapping
public String forwardDefaultMenuDefaultPlugin(Model model)
{
MolgenisUiMenu menu = molgenisUi.getMenu();
if (menu == null) throw new RuntimeException("main menu does not exist");
String menuId = menu.getId();
model.addAttribute(KEY_MENU_ID, menuId);
MolgenisUiMenuItem activeItem = menu.getActiveItem();
if (activeItem == null)
{
LOG.warn("main menu does not contain any (accessible) items");
return "forward:/login";
}
String pluginId = activeItem.getId();
String contextUri = new StringBuilder(URI).append('/').append(menuId).append('/').append(pluginId).toString();
model.addAttribute(KEY_CONTEXT_URL, contextUri);
model.addAttribute(KEY_MOLGENIS_VERSION, molgenisVersion);
model.addAttribute(KEY_MOLGENIS_BUILD_DATE, molgenisBuildData);
return getForwardPluginUri(activeItem.getUrl(), null);
}
@RequestMapping("/{menuId}")
public String forwardMenuDefaultPlugin(@Valid @NotNull @PathVariable String menuId, Model model)
{
MolgenisUiMenu menu = molgenisUi.getMenu(menuId);
if (menu == null) throw new RuntimeException("menu with id [" + menuId + "] does not exist");
model.addAttribute(KEY_MENU_ID, menuId);
MolgenisUiMenuItem activeItem = menu.getActiveItem();
String pluginId = activeItem != null ? activeItem.getId() : VoidPluginController.ID;
String contextUri = new StringBuilder(URI).append('/').append(menuId).append('/').append(pluginId).toString();
model.addAttribute(KEY_CONTEXT_URL, contextUri);
model.addAttribute(KEY_MOLGENIS_VERSION, molgenisVersion);
model.addAttribute(KEY_MOLGENIS_BUILD_DATE, molgenisBuildData);
return getForwardPluginUri(pluginId, null);
}
@RequestMapping("/{menuId}/{pluginId}/**")
public String forwardMenuPlugin(HttpServletRequest request, @Valid @NotNull @PathVariable String menuId,
@Valid @NotNull @PathVariable String pluginId, Model model)
{
String contextUri = new StringBuilder(URI).append('/').append(menuId).append('/').append(pluginId).toString();
String mappingUri = (String) (request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE));
String remainder = mappingUri.substring(contextUri.length());
model.addAttribute(KEY_CONTEXT_URL, contextUri);
model.addAttribute(KEY_MOLGENIS_VERSION, molgenisVersion);
model.addAttribute(KEY_MOLGENIS_BUILD_DATE, molgenisBuildData);
model.addAttribute(KEY_MENU_ID, menuId);
return getForwardPluginUri(pluginId, remainder);
}
private String getForwardPluginUri(String pluginId, String pathRemainder)
{
StringBuilder strBuilder = new StringBuilder("forward:");
strBuilder.append(MolgenisPluginController.PLUGIN_URI_PREFIX).append(pluginId);
if (pathRemainder != null) strBuilder.append(pathRemainder);
return strBuilder.toString();
}
/**
* Plugin without content
*/
@Controller
@RequestMapping(VoidPluginController.URI)
public static class VoidPluginController extends MolgenisPluginController
{
public static final String ID = "void";
public static final String URI = MolgenisPluginController.PLUGIN_URI_PREFIX + ID;
public VoidPluginController()
{
super(URI);
}
@RequestMapping
public String init()
{
return "view-void";
}
}
}