package org.riotfamily.pages.mapping; import java.util.Collection; import java.util.Date; import java.util.List; import org.riotfamily.common.collection.TypedList; import org.riotfamily.components.model.ContentContainerOwner; import org.riotfamily.pages.config.VirtualPageType; import org.riotfamily.pages.model.Page; import org.riotfamily.pages.model.Site; import org.riotfamily.pages.model.VirtualPage; public abstract class VirtualPageResolver<T extends ContentContainerOwner> implements ChildPageResolver { public Page resolvePage(VirtualPageType type, Page parent, String pathComponent) { T entity = load(parent, pathComponent); if (entity == null) { return null; } return new VirtualPage(type, parent, entity, pathComponent, getTitle(entity)); } @SuppressWarnings("unchecked") public Page getPage(VirtualPageType type, Site site, Object object) { T entity = (T) object; Page parent = type.getParent().getPage(site, getParent(entity)); return new VirtualPage(type, parent, entity, getPathComponent(entity), getTitle(entity)); } protected Object getParent(T object) { return null; } public Collection<Page> listChildren(VirtualPageType type, Page parent) { Collection<T> children = getChildren(parent); if (children == null) { return null; } List<Page> pages = TypedList.newInstance(children); for (T entity : children) { pages.add(new VirtualPage(type, parent, entity, getPathComponent(entity), getTitle(entity))); } return pages; } @SuppressWarnings("unchecked") public Date getLastPublished(VirtualPageType type, Page parent, Object object) { T entity = (T) object; return getLastPublished(entity); } protected Date getLastPublished(T entity) { return entity.getContentContainer().getLastPublished(); } protected abstract T load(Page parent, String pathComponent); protected abstract String getPathComponent(T entity); protected abstract String getTitle(T entity); protected abstract Collection<T> getChildren(Page parent); }