/* * Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com> * Licensed under the Apache License, Version 2.0 (the "License") * $Id: ElementAware.java 3918 2008-04-14 17:35:35Z gbevin $ */ package com.uwyn.rife.engine; import com.uwyn.rife.engine.exceptions.EngineException; /** * This interface contains all the methods that a class must implement to * become an element for the web engine. * <p>For convenience, you can also extend the abstract {@link Element} class * which gives you the benefit of having local access to all its methods and * having no abstract methods to implement. * <p>Elements are the smallest logical building blocks of a RIFE web * application. They are declared in the site structure and when a request * arrives that maps to an element declaration, a new instance of the * implementation is created. Element instances are thus never shared amongst * requests, unless you are into a continuation tree that is set up to not * clone its variable stack. This makes the logic inside elements fully * thread-safe. * <p>The {@link #processElement} method is the default entry point and will * be called when a request arrives. * <p>You're free to add any other method to this class. RIFE provides a * convention syntax for methods that are supposed to handle submissions. The * name of the submission is capitalized and the "<code>do</code>" literal is * prepended. RIFE then looks for a method with that name, the <code>public * void</code> modifiers and no arguments. When such a method is found, it is * executed instead of <code>processElement()</code>. Nothing prevents you * however from handling submissions conditionally in the * <code>processElement()</code> method though, without isolating the logic in * a separate method. For example, when a submission arrives with the name "<code>storeUser</code>", * RIFE will look for the method: * <pre>public void doStoreUser()</pre> * If it's present, it will be called instead of <code>processElement()</code>. * <p>Often you want to initialize common data structures, both for regular * requests as for submissions. The {@link ElementSupport#initialize()} method * can be used for that. It will be the first element's method that is called * in a fully setup element context. When extending {@link Element}, the * easiest is to simply overload the {@link ElementSupport#initialize()} * method, otherwise an {@link ElementInitializer} has to be registered in the * {@link #noticeElement} method. * <p>RIFE also supports setter-based dependency injection for element * properties, inputs, global variables and submission parameters. If setter * methods are present that correspond to declared variable names, they will * be automatically invoked with the available values. Of course, you can * always retrieve values through the dedicated ElementSupport methods for * {@link ElementSupport#getProperty properties}, {@link * ElementSupport#getInput inputs} and {@link ElementSupport#getParameter * submission parameters}. * * @author Geert Bevin (gbevin[remove] at uwyn dot com) * @version $Revision: 3918 $ * @since 1.0 */ public interface ElementAware { /** * This method is called immediately after the instantiation of the * element to provide the support object that allows the element to * function in the current context. Note that the context is not setup * yet, the bridge object is merely provided at this stage. * <p>It's good practice to store the <code>elementSupport</code> * parameter in a member variable of the element, making it possible to * use it from any method in the element. * <p>This method should also be used to provide the elementSupport * instance with an {@link ElementDeployer}, an {@link ElementInitializer} * and an {@link ElementChildTrigger}, if they are needed. * * @param elementSupport the <code>ElementSupport</code> instance for this * request and this element * @see ElementSupport * @since 1.0 */ public void noticeElement(ElementSupport elementSupport); /** * The default entry point that will be called when a request arrives. * * @since 1.0 */ public void processElement() throws EngineException; }