package com.google.gwt.gwtpages.client.page.loader; import java.util.HashMap; import java.util.Iterator; import com.google.gwt.gwtpages.client.Pages; import com.google.gwt.gwtpages.client.message.exceptions.PageNotFoundException; import com.google.gwt.gwtpages.client.page.Page; import com.google.gwt.gwtpages.client.page.PageAttributes; public abstract class AbstractPageLoader implements PageLoader { private HashMap<String, PageRegistry> registeredTokens = new HashMap<String, PageRegistry>(); public Iterator<String> getValidPageTokens() { return registeredTokens.keySet().iterator(); } public boolean isValidPageToken(String pageToken) { return (null != registeredTokens.get(pageToken)); } public PageAttributes getPageAttributes(String pageToken) throws PageNotFoundException { PageRegistry register = registeredTokens.get(pageToken); if (null == register) throw new PageNotFoundException(pageToken); else return register.pageAttributes; } /** * Register a page * * @param token * the page token * @param pageClass * the page class (presenter and view are same class) */ public <P extends Page> void registerPage(String token, Class<P> pageClass) { registerPage(token, pageClass, null, null); } /** * * Register a page * * @param token * the page token * @param pageClass * the page class (presenter and view are same class) * @param pageAttributes * the {@link PageAttributes} */ public <P extends Page> void registerPage(String token, Class<P> pageClass, PageAttributes pageAttributes) { registerPage(token, pageClass, null, pageAttributes); } /** * * Register a page * * @param token * the page token * @param pageClass * the page (presenter) class * @param displayClass * the view class */ public <P extends Page> void registerPage(String token, Class<P> presenterClass, Class displayClass) { registerPage(token, presenterClass, displayClass, null); } /** * * Register a page * * @param token * the page token * @param pageClass * the page class * @param pageAttributes * the {@link PageAttributes} */ public <P extends Page> void registerPage(String token, Class<P> pageClass, Class viewClass, PageAttributes pageAttributes) { PageRegistry<P> register = new PageRegistry<P>(token, pageClass, viewClass, pageAttributes); registeredTokens.put(token, register); } public Class<? extends Page> getPageClass(String pageToken) { PageRegistry register = registeredTokens.get(pageToken); if (null == register) return null; else return register.pageClass; } /** * Calls registerPages - this works this way so you can reference GWT.create in init * but not in registerPages because registerPages is called during compilation */ public void init(Pages settings) { registerPages(); } /** * Register all pages in this method. Do not use GWT.create here - override the init method * to do that but make sure to call super.init */ public abstract void registerPages(); public PageRegistry getPageRegister(String pageToken) { return registeredTokens.get(pageToken); } protected Page newInstance(String pageToken) throws PageNotFoundException { // this method will be replaced with the generator throw new RuntimeException( "You must use GWT.create() to create an instance of " + getClass().getName()); } public class PageRegistry<P extends Page> { private String pageToken; private Class<P> pageClass; private Class viewClass; private PageAttributes pageAttributes; public PageRegistry(String pageToken, Class<P> pageClass, Class viewClass, PageAttributes pageAttributes) { this.pageToken = pageToken; this.pageClass = pageClass; this.viewClass = viewClass; this.pageAttributes = pageAttributes; } public String getPageToken() { return pageToken; } public Class<P> getPageClass() { return pageClass; } public Class getDisplayClass() { return viewClass; } public PageAttributes getPageAttributes() { return pageAttributes; } } }