001    package org.trails.page;
002    
003    import org.apache.commons.logging.Log;
004    import org.apache.commons.logging.LogFactory;
005    import org.apache.hivemind.impl.MessageFormatter;
006    import org.apache.hivemind.util.Defense;
007    import org.apache.tapestry.IPage;
008    import org.apache.tapestry.IRequestCycle;
009    import org.apache.tapestry.PageNotFoundException;
010    
011    import java.util.HashMap;
012    import java.util.Map;
013    
014    public class DefaultPageResolver implements PageResolver
015    {
016            private static final Log LOG = LogFactory.getLog(DefaultPageResolver.class);
017    
018            private String defaultPrefix = "Default";
019    
020            private boolean cacheDisabled = System.getProperty("org.apache.tapestry.disable-caching") != null;
021    
022            private Map<PageType, String> postFixMap;
023    
024            public String getPostFix(PageType pageType)
025            {
026                    return getPostFixMap().get(pageType);
027            }
028    
029            public IPage resolvePage(IRequestCycle cycle, Class type, PageType pageType)
030            {
031                    Defense.notNull(type, "type");
032                    Defense.notNull(pageType, "pageType");
033    
034                    String pageName = type.getSimpleName() + getPostFix(pageType);
035                    IPage page = null;
036                    try
037                    {
038                            page = cycle.getPage(pageName);
039    
040                    } catch (PageNotFoundException ae)
041                    {
042                            page = cycle.getPage(getDefaultPrefix() + getPostFix(pageType));
043    
044                            if (!cacheDisabled)
045                            {
046                                    if (LOG.isDebugEnabled())
047                                            LOG.debug(_formatter.format("installing-page", pageName, page.getNamespace(), page.getSpecification()));
048                                    page.getNamespace().installPageSpecification(pageName, page.getSpecification());
049                                    page = cycle.getPage(pageName);
050                            }
051                    }
052                    return page;
053            }
054    
055            public Map<PageType, String> getPostFixMap()
056            {
057                    return postFixMap;
058            }
059    
060            public void setPostFixMap(Map<PageType, String> postFixMap)
061            {
062                    this.postFixMap = postFixMap;
063            }
064    
065            public DefaultPageResolver()
066            {
067                    postFixMap = new HashMap<PageType, String>();
068                    for (PageType pageType : PageType.values())
069                    {
070                            postFixMap.put(pageType, pageType.toString());
071                    }
072            }
073    
074            public String getDefaultPrefix()
075            {
076                    return defaultPrefix;
077            }
078    
079            public void setDefaultPrefix(String defaultPostfix)
080            {
081                    this.defaultPrefix = defaultPostfix;
082            }
083    
084            public void setCacheDisabled(boolean cacheDisabled)
085            {
086                    this.cacheDisabled = cacheDisabled;
087            }
088    
089            private static final MessageFormatter _formatter = new MessageFormatter(LOG, "org.apache.tapestry.resolver.ResolverStrings");
090    }