Search in sources :

Example 1 with Controller

use of org.apache.struts.tiles.Controller in project sonar-java by SonarSource.

the class TilesPreProcessor method execute.

// ---------------------------------------------------------- Public Methods
/**
 * <p>If the current <code>ForwardConfig</code> is using "tiles",
 * perform necessary pre-processing to set up the <code>TilesContext</code>
 * and substitute a new <code>ForwardConfig</code> which is understandable
 * to a <code>RequestDispatcher</code>.</p>
 *
 * <p>Note that if the command finds a previously existing
 * <code>ComponentContext</code> in the request, then it
 * infers that it has been called from within another tile,
 * so instead of changing the <code>ForwardConfig</code> in the chain
 * <code>Context</code>, the command uses <code>RequestDispatcher</code>
 * to <em>include</em> the tile, and returns true, indicating that the processing
 * chain is complete.</p>
 *
 * @param context The <code>Context</code> for the current request
 *
 * @return <code>false</code> in most cases, but true if we determine
 * that we're processing in "include" mode.
 */
public boolean execute(Context context) throws Exception {
    // Is there a Tiles Definition to be processed?
    ServletActionContext sacontext = (ServletActionContext) context;
    ForwardConfig forwardConfig = sacontext.getForwardConfig();
    if (forwardConfig == null || forwardConfig.getPath() == null) {
        log.debug("No forwardConfig or no path, so pass to next command.");
        return (false);
    }
    ComponentDefinition definition = null;
    try {
        definition = TilesUtil.getDefinition(forwardConfig.getPath(), sacontext.getRequest(), sacontext.getContext());
    } catch (FactoryNotFoundException ex) {
        // this is not a serious error, so log at low priority
        log.debug("Tiles DefinitionFactory not found, so pass to next command.");
        return false;
    } catch (NoSuchDefinitionException ex) {
        // ignore not found
        log.debug("NoSuchDefinitionException " + ex.getMessage());
    }
    // Do we do a forward (original behavior) or an include ?
    boolean doInclude = false;
    ComponentContext tileContext = null;
    // Get current tile context if any.
    // If context exists, or if the response has already been committed we will do an include
    tileContext = ComponentContext.getContext(sacontext.getRequest());
    doInclude = (tileContext != null || sacontext.getResponse().isCommitted());
    // Controller associated to a definition, if any
    Controller controller = null;
    // Computed uri to include
    String uri = null;
    if (definition != null) {
        // We have a "forward config" definition.
        // We use it to complete missing attribute in context.
        // We also get uri, controller.
        uri = definition.getPath();
        controller = definition.getOrCreateController();
        if (tileContext == null) {
            tileContext = new ComponentContext(definition.getAttributes());
            ComponentContext.setContext(tileContext, sacontext.getRequest());
        } else {
            tileContext.addMissing(definition.getAttributes());
        }
    }
    // Process definition set in Action, if any.  This may override the
    // values for uri or controller found using the ForwardConfig, and
    // may augment the tileContext with additional attributes.
    // :FIXME: the class DefinitionsUtil is deprecated, but I can't find
    // the intended alternative to use.
    definition = DefinitionsUtil.getActionDefinition(sacontext.getRequest());
    if (definition != null) {
        // We also overload uri and controller if set in definition.
        if (definition.getPath() != null) {
            log.debug("Override forward uri " + uri + " with action uri " + definition.getPath());
            uri = definition.getPath();
        }
        if (definition.getOrCreateController() != null) {
            log.debug("Override forward controller with action controller");
            controller = definition.getOrCreateController();
        }
        if (tileContext == null) {
            tileContext = new ComponentContext(definition.getAttributes());
            ComponentContext.setContext(tileContext, sacontext.getRequest());
        } else {
            tileContext.addMissing(definition.getAttributes());
        }
    }
    if (uri == null) {
        log.debug("no uri computed, so pass to next command");
        return false;
    }
    // Execute controller associated to definition, if any.
    if (controller != null) {
        log.trace("Execute controller: " + controller);
        controller.execute(tileContext, sacontext.getRequest(), sacontext.getResponse(), sacontext.getContext());
    }
    if (doInclude) {
        log.info("Tiles process complete; doInclude with " + uri);
        doInclude(sacontext, uri);
    } else {
        log.info("Tiles process complete; forward to " + uri);
        doForward(sacontext, uri);
    }
    log.debug("Tiles processed, so clearing forward config from context.");
    sacontext.setForwardConfig(null);
    return (false);
}
Also used : FactoryNotFoundException(org.apache.struts.tiles.FactoryNotFoundException) NoSuchDefinitionException(org.apache.struts.tiles.NoSuchDefinitionException) ComponentContext(org.apache.struts.tiles.ComponentContext) ServletActionContext(org.apache.struts.chain.contexts.ServletActionContext) ForwardConfig(org.apache.struts.config.ForwardConfig) Controller(org.apache.struts.tiles.Controller) ComponentDefinition(org.apache.struts.tiles.ComponentDefinition)

Example 2 with Controller

use of org.apache.struts.tiles.Controller in project sonar-java by SonarSource.

the class InsertTag method processDefinition.

/**
 * End of Process tag attribute "definition".
 * Overload definition with tag attributes "template" and "role".
 * Then, create appropriate tag handler.
 * @param definition Definition to process.
 * @return Appropriate TagHandler.
 * @throws JspException InstantiationException Can't create requested controller
 */
protected TagHandler processDefinition(ComponentDefinition definition) throws JspException {
    // Declare local variable in order to not change Tag attribute values.
    String role = this.role;
    String page = this.page;
    Controller controller = null;
    try {
        controller = definition.getOrCreateController();
        // Overload definition with tag's template and role.
        if (role == null) {
            role = definition.getRole();
        }
        if (page == null) {
            page = definition.getTemplate();
        }
        if (controllerName != null) {
            controller = ComponentDefinition.createController(controllerName, controllerType);
        }
        // Can check if page is set
        return new InsertHandler(definition.getAttributes(), page, role, controller);
    } catch (InstantiationException ex) {
        throw new JspException(ex);
    }
}
Also used : JspException(javax.servlet.jsp.JspException) Controller(org.apache.struts.tiles.Controller)

Aggregations

Controller (org.apache.struts.tiles.Controller)2 JspException (javax.servlet.jsp.JspException)1 ServletActionContext (org.apache.struts.chain.contexts.ServletActionContext)1 ForwardConfig (org.apache.struts.config.ForwardConfig)1 ComponentContext (org.apache.struts.tiles.ComponentContext)1 ComponentDefinition (org.apache.struts.tiles.ComponentDefinition)1 FactoryNotFoundException (org.apache.struts.tiles.FactoryNotFoundException)1 NoSuchDefinitionException (org.apache.struts.tiles.NoSuchDefinitionException)1