/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.web.registry;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.Validate;
import org.apache.wicket.markup.html.WebPage;
import org.projectforge.core.BaseDao;
import org.projectforge.registry.DaoRegistry;
import org.projectforge.registry.Registry;
import org.projectforge.web.LoginPage;
import org.projectforge.web.access.AccessEditPage;
import org.projectforge.web.access.AccessListPage;
import org.projectforge.web.address.AddressEditPage;
import org.projectforge.web.address.AddressListPage;
import org.projectforge.web.address.AddressMobileEditPage;
import org.projectforge.web.address.AddressMobileListPage;
import org.projectforge.web.address.AddressMobileViewPage;
import org.projectforge.web.address.AddressViewPage;
import org.projectforge.web.address.PhoneCallPage;
import org.projectforge.web.address.SendSmsPage;
import org.projectforge.web.admin.AdminPage;
import org.projectforge.web.admin.SetupPage;
import org.projectforge.web.admin.SystemUpdatePage;
import org.projectforge.web.book.BookEditPage;
import org.projectforge.web.book.BookListPage;
import org.projectforge.web.calendar.CalendarPage;
import org.projectforge.web.core.ConfigurationListPage;
import org.projectforge.web.core.SearchPage;
import org.projectforge.web.doc.DocumentationPage;
import org.projectforge.web.doc.TutorialPage;
import org.projectforge.web.fibu.AccountingRecordEditPage;
import org.projectforge.web.fibu.AccountingRecordListPage;
import org.projectforge.web.fibu.AuftragEditPage;
import org.projectforge.web.fibu.AuftragListPage;
import org.projectforge.web.fibu.CustomerEditPage;
import org.projectforge.web.fibu.CustomerListPage;
import org.projectforge.web.fibu.DatevImportPage;
import org.projectforge.web.fibu.EingangsrechnungEditPage;
import org.projectforge.web.fibu.EingangsrechnungListPage;
import org.projectforge.web.fibu.EmployeeEditPage;
import org.projectforge.web.fibu.EmployeeListPage;
import org.projectforge.web.fibu.EmployeeSalaryEditPage;
import org.projectforge.web.fibu.EmployeeSalaryListPage;
import org.projectforge.web.fibu.KontoEditPage;
import org.projectforge.web.fibu.KontoListPage;
import org.projectforge.web.fibu.Kost1EditPage;
import org.projectforge.web.fibu.Kost1ListPage;
import org.projectforge.web.fibu.Kost2ArtEditPage;
import org.projectforge.web.fibu.Kost2ArtListPage;
import org.projectforge.web.fibu.Kost2EditPage;
import org.projectforge.web.fibu.Kost2ListPage;
import org.projectforge.web.fibu.MonthlyEmployeeReportPage;
import org.projectforge.web.fibu.ProjektEditPage;
import org.projectforge.web.fibu.ProjektListPage;
import org.projectforge.web.fibu.RechnungEditPage;
import org.projectforge.web.fibu.RechnungListPage;
import org.projectforge.web.fibu.ReportObjectivesPage;
import org.projectforge.web.gantt.GanttChartEditPage;
import org.projectforge.web.gantt.GanttChartListPage;
import org.projectforge.web.humanresources.HRListPage;
import org.projectforge.web.humanresources.HRPlanningEditPage;
import org.projectforge.web.humanresources.HRPlanningListPage;
import org.projectforge.web.imagecropper.ImageCropperPage;
import org.projectforge.web.meb.MebEditPage;
import org.projectforge.web.meb.MebListPage;
import org.projectforge.web.mobile.LoginMobilePage;
import org.projectforge.web.mobile.MenuMobilePage;
import org.projectforge.web.orga.ContractEditPage;
import org.projectforge.web.orga.ContractListPage;
import org.projectforge.web.orga.PostausgangEditPage;
import org.projectforge.web.orga.PostausgangListPage;
import org.projectforge.web.orga.PosteingangEditPage;
import org.projectforge.web.orga.PosteingangListPage;
import org.projectforge.web.scripting.ScriptEditPage;
import org.projectforge.web.scripting.ScriptExecutePage;
import org.projectforge.web.scripting.ScriptListPage;
import org.projectforge.web.scripting.ScriptingPage;
import org.projectforge.web.statistics.PersonalStatisticsPage;
import org.projectforge.web.statistics.SystemStatisticsPage;
import org.projectforge.web.task.TaskEditPage;
import org.projectforge.web.task.TaskListPage;
import org.projectforge.web.task.TaskTreePage;
import org.projectforge.web.timesheet.TimesheetEditPage;
import org.projectforge.web.timesheet.TimesheetListPage;
import org.projectforge.web.user.ChangePasswordPage;
import org.projectforge.web.user.GroupEditPage;
import org.projectforge.web.user.GroupListPage;
import org.projectforge.web.user.MyAccountEditPage;
import org.projectforge.web.user.UserEditPage;
import org.projectforge.web.user.UserListPage;
import org.projectforge.web.user.UserPrefEditPage;
import org.projectforge.web.user.UserPrefListPage;
import org.projectforge.web.wicket.ErrorPage;
import org.projectforge.web.wicket.FeedbackPage;
import org.projectforge.web.wicket.IListPageColumnsCreator;
/**
* Registry for dao's. Here you can register additional daos and plugins (extensions of ProjectForge). This registry is used e. g. by the
* general SearchPage.
* @author Kai Reinhard (k.reinhard@micromata.de)
*
*/
public class WebRegistry
{
public static final String BOOKMARK_LOGIN = "login";
private static final String BOOKMARK_MOBILE_PREFIX = "m-";
public static final String BOOKMARK_MOBILE_LOGIN = BOOKMARK_MOBILE_PREFIX + BOOKMARK_LOGIN;
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(WebRegistry.class);
private static final WebRegistry instance = new WebRegistry();
private final Map<String, WebRegistryEntry> map = new HashMap<String, WebRegistryEntry>();
private final List<WebRegistryEntry> orderedList = new ArrayList<WebRegistryEntry>();
private final Map<String, Class< ? extends WebPage>> mountPages = new HashMap<String, Class< ? extends WebPage>>();
public static WebRegistry instance()
{
return instance;
}
/**
* Creates a new WebRegistryEntry and registers it. Id must be found in {@link Registry}.
* @param id
*/
public WebRegistryEntry register(final String id)
{
return register(new WebRegistryEntry(id));
}
/**
* Creates a new WebRegistryEntry and registers it. Id must be found in {@link Registry}.
* @param id
* @param listPageColumnsCreatorClass Needed by SearchPage.
*/
public WebRegistryEntry register(final String id, final Class< ? extends IListPageColumnsCreator< ? >> listPageColumnsCreatorClass)
{
return register(new WebRegistryEntry(id, listPageColumnsCreatorClass));
}
public WebRegistryEntry register(final WebRegistryEntry entry)
{
Validate.notNull(entry);
map.put(entry.getId(), entry);
orderedList.add(entry);
return entry;
}
/**
* Creates a new WebRegistryEntry and registers it. Id must be found in {@link Registry}.
* @param id
*/
public WebRegistryEntry register(final String id, final boolean insertBefore, final WebRegistryEntry entry)
{
return register(new WebRegistryEntry(id), insertBefore, entry);
}
/**
* Creates a new WebRegistryEntry and registers it. Id must be found in {@link Registry}.
* @param id
*/
public WebRegistryEntry register(final String id, final Class< ? extends IListPageColumnsCreator< ? >> listPageColumnsCreatorClass,
final boolean insertBefore, final WebRegistryEntry entry)
{
return register(new WebRegistryEntry(id, listPageColumnsCreatorClass), insertBefore, entry);
}
/**
* @param existingEntry
* @param insertBefore If true then the given entry will be inserted before the existing entry, otherwise after.
* @param entry
* @return
*/
public WebRegistryEntry register(final WebRegistryEntry existingEntry, final boolean insertBefore, final WebRegistryEntry entry)
{
Validate.notNull(existingEntry);
Validate.notNull(entry);
map.put(entry.getId(), entry);
final int idx = orderedList.indexOf(existingEntry);
if (idx < 0) {
log.error("Registry entry '" + existingEntry.getId() + "' not found. Appending the given entry to the list.");
orderedList.add(entry);
} else if (insertBefore == true) {
orderedList.add(idx, entry);
} else {
orderedList.add(idx + 1, entry);
}
return entry;
}
public WebRegistryEntry getEntry(final String id)
{
return map.get(id);
}
public List<WebRegistryEntry> getOrderedList()
{
return orderedList;
}
public BaseDao< ? > getDao(final String id)
{
final WebRegistryEntry entry = getEntry(id);
return entry != null ? entry.getDao() : null;
}
/**
* Adds the page class as mount page.
* @param mountPage
* @param pageClass
* @return this for chaining.
*/
public WebRegistry addMountPage(final String mountPage, final Class< ? extends WebPage> pageClass)
{
this.mountPages.put(mountPage, pageClass);
return this;
}
/**
* Adds the both page classes as mount pages: mountPageBasename + "{List,Edit}.
* @param mountPageBasename
* @param pageListClass
* @param pageEditClass
* @return this for chaining.
*/
public WebRegistry addMountPages(final String mountPageBasename, final Class< ? extends WebPage> pageListClass,
final Class< ? extends WebPage> pageEditClass)
{
addMountPage(mountPageBasename + "List", pageListClass);
addMountPage(mountPageBasename + "Edit", pageEditClass);
return this;
}
/**
* Adds all page classes as mount pages: mountPageBasename + "{List,Edit,View}.
* @param mountPageBasename
* @param pageListClass
* @param pageEditClass
* @param pageViewClass
* @return this for chaining.
*/
public WebRegistry addMountPages(final String mountPageBasename, final Class< ? extends WebPage> pageListClass,
final Class< ? extends WebPage> pageEditClass, final Class< ? extends WebPage> pageViewClass)
{
addMountPage(mountPageBasename + "List", pageListClass);
addMountPage(mountPageBasename + "Edit", pageEditClass);
addMountPage(mountPageBasename + "View", pageViewClass);
return this;
}
public Map<String, Class< ? extends WebPage>> getMountPages()
{
return mountPages;
}
private WebRegistry()
{
// This order is used by SearchPage:
register(DaoRegistry.ADDRESS, AddressListPage.class);
addMountPages(DaoRegistry.ADDRESS, AddressListPage.class, AddressEditPage.class);
addMountPage(DaoRegistry.ADDRESS + "View", AddressViewPage.class);
register(DaoRegistry.BOOK, BookListPage.class);
addMountPages(DaoRegistry.BOOK, BookListPage.class, BookEditPage.class);
register(DaoRegistry.TASK, TaskListPage.class);
addMountPages(DaoRegistry.TASK, TaskListPage.class, TaskEditPage.class);
register(DaoRegistry.TIMESHEET, TimesheetListPage.class);
addMountPages(DaoRegistry.TIMESHEET, TimesheetListPage.class, TimesheetEditPage.class);
register(DaoRegistry.USER, UserListPage.class);
addMountPages(DaoRegistry.USER, UserListPage.class, UserEditPage.class);
register(DaoRegistry.GROUP, GroupListPage.class);
addMountPages(DaoRegistry.GROUP, GroupListPage.class, GroupEditPage.class);
register(DaoRegistry.ORDERBOOK, AuftragListPage.class);
addMountPages(DaoRegistry.ORDERBOOK, AuftragListPage.class, AuftragEditPage.class);
register(DaoRegistry.CONTRACT, ContractListPage.class);
addMountPages(DaoRegistry.CONTRACT, ContractListPage.class, ContractEditPage.class);
register(DaoRegistry.INCOMING_INVOICE, EingangsrechnungListPage.class);
addMountPages(DaoRegistry.INCOMING_INVOICE, EingangsrechnungListPage.class, EingangsrechnungEditPage.class);
register(DaoRegistry.OUTGOING_INVOICE, RechnungListPage.class);
addMountPages(DaoRegistry.OUTGOING_INVOICE, RechnungListPage.class, RechnungEditPage.class);
register(DaoRegistry.INCOMING_MAIL, PosteingangListPage.class);
addMountPages(DaoRegistry.INCOMING_MAIL, PosteingangListPage.class, PosteingangEditPage.class);
register(DaoRegistry.OUTGOING_MAIL, PostausgangListPage.class);
addMountPages(DaoRegistry.OUTGOING_MAIL, PostausgangListPage.class, PostausgangEditPage.class);
register(DaoRegistry.ACCESS, AccessListPage.class);
addMountPages(DaoRegistry.ACCESS, AccessListPage.class, AccessEditPage.class);
register(DaoRegistry.ACCOUNT, KontoListPage.class);
addMountPages(DaoRegistry.ACCOUNT, KontoListPage.class, KontoEditPage.class);
register(DaoRegistry.ACCOUNTING_RECORD, AccountingRecordListPage.class);
addMountPages(DaoRegistry.ACCOUNTING_RECORD, AccountingRecordListPage.class, AccountingRecordEditPage.class);
register(DaoRegistry.COST1, Kost1ListPage.class);
addMountPages(DaoRegistry.COST1, Kost1ListPage.class, Kost1EditPage.class);
register(DaoRegistry.COST2, Kost2ListPage.class);
addMountPages(DaoRegistry.COST2, Kost2ListPage.class, Kost2EditPage.class);
register(DaoRegistry.COST2_Type, Kost2ArtListPage.class);
addMountPages(DaoRegistry.COST2_Type, Kost2ArtListPage.class, Kost2ArtEditPage.class);
register(DaoRegistry.CUSTOMER, CustomerListPage.class);
addMountPages(DaoRegistry.CUSTOMER, CustomerListPage.class, CustomerEditPage.class);
register(DaoRegistry.EMPLOYEE, EmployeeListPage.class);
addMountPages(DaoRegistry.EMPLOYEE, EmployeeListPage.class, EmployeeEditPage.class);
register(DaoRegistry.MEB, MebListPage.class);
addMountPages(DaoRegistry.MEB, MebListPage.class, MebEditPage.class);
register(DaoRegistry.PROJECT, ProjektListPage.class);
addMountPages(DaoRegistry.PROJECT, ProjektListPage.class, ProjektEditPage.class);
addMountPages(DaoRegistry.EMPLOYEE_SALARY, EmployeeSalaryListPage.class, EmployeeSalaryEditPage.class);
addMountPages(DaoRegistry.GANTT, GanttChartListPage.class, GanttChartEditPage.class);
addMountPages(DaoRegistry.HR_PLANNING, HRPlanningListPage.class, HRPlanningEditPage.class);
addMountPage(DaoRegistry.HR_LIST, HRListPage.class);
addMountPages(DaoRegistry.SCRIPT, ScriptListPage.class, ScriptEditPage.class);
addMountPages(DaoRegistry.USER_PREF, UserPrefListPage.class, UserPrefEditPage.class);
addMountPage("admin", AdminPage.class);
addMountPage("imageCropper", ImageCropperPage.class);
addMountPage("calendar", CalendarPage.class);
addMountPage("changePassword", ChangePasswordPage.class);
addMountPage("configuration", ConfigurationListPage.class);
addMountPage("datevImport", DatevImportPage.class);
addMountPage("doc", DocumentationPage.class);
addMountPage("error", ErrorPage.class);
addMountPage("feedback", FeedbackPage.class);
addMountPage(BOOKMARK_LOGIN, LoginPage.class);
addMountPage("monthlyEmployeeReport", MonthlyEmployeeReportPage.class);
addMountPage("myAccount", MyAccountEditPage.class);
addMountPage("personalStatistics", PersonalStatisticsPage.class);
addMountPage("phoneCall", PhoneCallPage.class);
addMountPage("reportObjectives", ReportObjectivesPage.class);
addMountPage("scriptExecute", ScriptExecutePage.class);
addMountPage("scripting", ScriptingPage.class);
addMountPage("search", SearchPage.class);
addMountPage("sendSms", SendSmsPage.class);
addMountPage("setup", SetupPage.class);
addMountPage("systemStatistics", SystemStatisticsPage.class);
addMountPage("systemUpdate", SystemUpdatePage.class);
addMountPage("taskTree", TaskTreePage.class);
addMountPage("tutorial", TutorialPage.class);
addMountPages(BOOKMARK_MOBILE_PREFIX + "address", AddressMobileListPage.class, AddressMobileEditPage.class, AddressMobileViewPage.class);
addMountPage(BOOKMARK_MOBILE_LOGIN, LoginMobilePage.class);
addMountPage(BOOKMARK_MOBILE_PREFIX + "menu", MenuMobilePage.class);
}
}