package org.skyscreamer.yoga.view; import java.io.OutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.skyscreamer.yoga.listener.RenderingListenerRegistry; import org.skyscreamer.yoga.mapper.ResultTraverser; import org.skyscreamer.yoga.mapper.YogaRequestContext; import org.skyscreamer.yoga.selector.CoreSelector; import org.skyscreamer.yoga.selector.SelectorResolver; import org.skyscreamer.yoga.selector.parser.SelectorParser; import org.skyscreamer.yoga.util.ClassFinderStrategy; import org.skyscreamer.yoga.util.NameUtil; /** * This class represents the entry point to yoga. It integrates with view * technologies such as Spring Views and JAX-RS MessageBodyWriters. This objects * sets up the yoga related context information (listeners, the selector, the * suffix) and passes it along to the children to render. * * @see org.skyscreamer.yoga.view.JsonSelectorView * @see org.skyscreamer.yoga.view.XmlSelectorView * @see org.skyscreamer.yoga.view.XhtmlSelectorView * * @author Solomon Duskis */ public abstract class AbstractYogaView { protected ResultTraverser _resultTraverser = new ResultTraverser(); protected SelectorResolver _selectorResolver = new SelectorResolver(); protected RenderingListenerRegistry _registry = new RenderingListenerRegistry(); public void setResultTraverser( ResultTraverser resultTraverser ) { this._resultTraverser = resultTraverser; } @Deprecated /** use setSelectorResolver instead */ public void setSelectorParser( SelectorParser selectorParser ) { this._selectorResolver.setSelectorParser( selectorParser ); } @Deprecated /** use setSelectorResolver instead */ public void setSelector( CoreSelector selector ) { this._selectorResolver.setBaseSelector( selector ); } public void setRegistry( RenderingListenerRegistry registry ) { this._registry = registry; } public void setSelectorResolver( SelectorResolver selectorResolver ) { this._selectorResolver = selectorResolver; } public SelectorResolver getSelectorResolver() { return _selectorResolver; } public ResultTraverser getResultTraverser() { return _resultTraverser; } public ClassFinderStrategy getClassFinderStrategy() { return _resultTraverser.getClassFinderStrategy(); } public void setClassFinderStrategy( ClassFinderStrategy classFinderStrategy ) { _resultTraverser.setClassFinderStrategy( classFinderStrategy ); } public RenderingListenerRegistry getRegistry() { return _registry; } public final void render( HttpServletRequest request, HttpServletResponse response, Object value, OutputStream os ) throws Exception { YogaRequestContext context = new YogaRequestContext( getHrefSuffix(), getSelectorResolver(), request, response, _registry.getListeners() ); render( value, context, os ); } protected String getClassName( Object obj ) { Class<?> type = getClassFinderStrategy().findClass( obj ); return NameUtil.getName( type ); } public abstract String getContentType(); protected abstract void render( Object value, YogaRequestContext context, OutputStream os ) throws Exception; public abstract String getHrefSuffix(); }