For trivial things where the concept of the "view" is the same, but the details are different I simply create my own View implementation which takes a collection of delegate views and delegates to the appropriate one.
Code:
public final class PagePermissionsView implements View {
private PageResolver pageResolver;
private PermissionsResolver permissionsResolver;
private View readView;
private View editView;
public void render(
final Map model,
final HttpServletRequest request,
final HttpServletResponse response) throws Exception {
ServletRequestAttributeAccessor accessor = new ServletRequestAttributeAccessor(request);
Page page = pageResolver.findPage(accessor);
SiteDataRequestInfo info = SiteDataRequestInfo.getSiteDataRequestInfo(accessor);
User user = info.getCurrentUser();
boolean canEdit = permissionsResolver.canPerform(new Permission[]{Permission.ADMIN}, user, page);
if (canEdit) {
editView.render(model, request, response);
} else {
readView.render(model, request, response);
}
}
public void setEditView(final View detailsView) {
this.editView = detailsView;
}
public void setReadView(final View simpleView) {
this.readView = simpleView;
}
public void setPermissionsResolver(final PermissionsResolver resolver) {
this.permissionsResolver = resolver;
}
public void setPageResolver(final PageResolver pageResolver) {
this.pageResolver = pageResolver;
}
}
Ironically; this functionality should probably *not* be implemented as a view, but you get the idea.