package fr.openwide.core.wicket.more.console.template;
import java.util.List;
import java.util.Set;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.UrlUtils;
import org.apache.wicket.request.resource.ResourceReference;
import org.springframework.util.StringUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import fr.openwide.core.wicket.more.console.common.model.ConsoleMenuItem;
import fr.openwide.core.wicket.more.console.common.model.ConsoleMenuItemRelatedPage;
import fr.openwide.core.wicket.more.console.common.model.ConsoleMenuSection;
import fr.openwide.core.wicket.more.console.maintenance.authentication.page.ConsoleMaintenanceAuthenticationPage;
import fr.openwide.core.wicket.more.console.maintenance.ehcache.page.ConsoleMaintenanceEhCachePage;
import fr.openwide.core.wicket.more.console.maintenance.file.page.ConsoleMaintenanceFilePage;
import fr.openwide.core.wicket.more.console.maintenance.gestion.page.ConsoleMaintenanceGestionPage;
import fr.openwide.core.wicket.more.console.maintenance.search.page.ConsoleMaintenanceSearchPage;
import fr.openwide.core.wicket.more.console.maintenance.task.page.ConsoleMaintenanceTaskDescriptionPage;
import fr.openwide.core.wicket.more.console.maintenance.task.page.ConsoleMaintenanceTaskListPage;
import fr.openwide.core.wicket.more.console.maintenance.upgrade.page.ConsoleMaintenanceDonneesPage;
import fr.openwide.core.wicket.more.console.template.style.ConsoleLessCssResourceReference;
import fr.openwide.core.wicket.more.link.descriptor.parameter.CommonParameters;
import fr.openwide.core.wicket.more.markup.html.link.InvisibleLink;
public final class ConsoleConfiguration {
private static final ConsoleConfiguration INSTANCE = new ConsoleConfiguration();
private final List<ConsoleMenuSection> menuSections = Lists.newArrayList();
private String baseUrl = null;
private String consolePageTitleKey;
private Set<ResourceReference> cssResourcesReferences = Sets.newLinkedHashSet();
public static ConsoleConfiguration get() {
if (!StringUtils.hasText(INSTANCE.baseUrl)) {
throw new IllegalStateException("La console doit ĂȘtre initialisĂ©e par l'application avec une url de base.");
}
return INSTANCE;
}
public static ConsoleConfiguration build(String baseUrl) {
return build(baseUrl, "console.pageTitle", true);
}
public static ConsoleConfiguration build(String baseUrl, String consolePageTitleKey, boolean buildDefault) {
INSTANCE.setBaseUrl(UrlUtils.normalizePath(baseUrl));
INSTANCE.setConsolePageTitleKey(consolePageTitleKey);
if (buildDefault) {
ConsoleMenuSection maintenanceMenuSection = new ConsoleMenuSection("maintenanceMenuSection",
"console.maintenance", "maintenance", ConsoleMaintenanceSearchPage.class);
ConsoleMenuItem maintenanceSearchMenuItem = new ConsoleMenuItem("maintenanceSearchMenuItem",
"console.maintenance.search", "search", ConsoleMaintenanceSearchPage.class);
maintenanceMenuSection.addMenuItem(maintenanceSearchMenuItem);
ConsoleMenuItem maintenanceGestionMenuItem = new ConsoleMenuItem("maintenanceGestionMenuItem",
"console.maintenance.gestion", "gestion", ConsoleMaintenanceGestionPage.class);
maintenanceMenuSection.addMenuItem(maintenanceGestionMenuItem);
ConsoleMenuItem maintenanceEhcacheMenuItem = new ConsoleMenuItem("maintenanceEhcacheMenuItem",
"console.maintenance.ehcache", "ehcache", ConsoleMaintenanceEhCachePage.class);
maintenanceMenuSection.addMenuItem(maintenanceEhcacheMenuItem);
ConsoleMenuItem maintenanceDonneesMenuItem = new ConsoleMenuItem("maintenanceDonneesMenuItem",
"console.maintenance.donnees", "donnees", ConsoleMaintenanceDonneesPage.class);
maintenanceMenuSection.addMenuItem(maintenanceDonneesMenuItem);
ConsoleMenuItem authenticationMenuItem = new ConsoleMenuItem("signInAsMenuItem",
"console.maintenance.authentication", "authentication", ConsoleMaintenanceAuthenticationPage.class);
maintenanceMenuSection.addMenuItem(authenticationMenuItem);
ConsoleMenuItem maintenanceTasksMenuItem = new ConsoleMenuItem("maintenanceTasksMenuItem",
"console.maintenance.tasks", "tasks", ConsoleMaintenanceTaskListPage.class);
ConsoleMenuItemRelatedPage maintenanceTaskDetailsPage = new ConsoleMenuItemRelatedPage(
"${" + CommonParameters.ID + "}/", ConsoleMaintenanceTaskDescriptionPage.class);
maintenanceTasksMenuItem.addRelatedPage(maintenanceTaskDetailsPage);
maintenanceMenuSection.addMenuItem(maintenanceTasksMenuItem);
ConsoleMenuItem fileMenuItem = new ConsoleMenuItem("fileMenuItem",
"console.maintenance.file", "file", ConsoleMaintenanceFilePage.class);
maintenanceMenuSection.addMenuItem(fileMenuItem);
INSTANCE.addMenuSection(maintenanceMenuSection);
INSTANCE.addCssResourceReference(ConsoleLessCssResourceReference.get());
}
return INSTANCE;
}
public Link<Void> getConsoleLink(String wicketId) {
if (!menuSections.isEmpty()) {
return new BookmarkablePageLink<Void>(wicketId, menuSections.get(0).getPageClass());
} else {
return new InvisibleLink<Void>(wicketId);
}
}
public void mountPages(WebApplication webApplication) {
// First section is mounted behind the base url (ie. /console/)
if (!menuSections.isEmpty()) {
webApplication.mountPage(getBaseUrl() + "/", menuSections.get(0).getPageClass());
}
// Each section is mounted with its items
for (ConsoleMenuSection menuSection : menuSections) {
mountMenuSection(menuSection, webApplication);
}
}
private void mountMenuSection(ConsoleMenuSection menuSection, WebApplication webApplication) {
String menuSectionBaseUrl = getBaseUrl() + menuSection.getUrlFragment();
webApplication.mountPage(menuSectionBaseUrl + "/", menuSection.getPageClass());
for (ConsoleMenuItem menuItem : menuSection.getMenuItems()) {
webApplication.mountPage(menuSectionBaseUrl + menuItem.getUrlFragment() + "/", menuItem.getPageClass());
for (ConsoleMenuItemRelatedPage relatedPage : menuItem.getRelatedPages()) {
webApplication.mountPage(menuSectionBaseUrl + menuItem.getUrlFragment() + relatedPage.getUrlFragment()
+ "/", relatedPage.getPageClass());
}
}
}
public List<ConsoleMenuSection> getMenuSections() {
return menuSections;
}
public void addMenuSection(ConsoleMenuSection menuSection) {
menuSections.add(menuSection);
}
public String getBaseUrl() {
return baseUrl;
}
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
public String getConsolePageTitleKey() {
return consolePageTitleKey;
}
public void setConsolePageTitleKey(String consolePageTitleKey) {
this.consolePageTitleKey = consolePageTitleKey;
}
public Set<ResourceReference> getCssResourcesReferences() {
return cssResourcesReferences;
}
public boolean addCssResourceReference(ResourceReference cssResourceReference) {
return cssResourcesReferences.add(cssResourceReference);
}
private ConsoleConfiguration() {
}
}