| 
              ImagoX Extensions Design Notes  
            Within each XSL transform it is possible to
            define extension elements.  This is a standard mechanism for extending the 
            functionality of the Xalan transformer
            and is documented there.  For our purposes the extension author writes a standard
            extension element.  The only differences are that by calling: 
            context.getTransformer().getParameter( org.xenei.imago.Defaults.IMAGO_DATA ) the extension method can access the ImagoData object, and by calling: 
            context.getTransformer().getParameter( org.xenei.imago.Defaults.IMAGO_FILTER ) the method can access the current Imago filter. 
            The ImagoData object contains all the standard servlet-accessable objects (e.g. HttpServletRequest, HttpServletResponse, HttpSession, etc.). In addition many of the Imago services are also available (e.g. getRawDocument(), getProcessedDocument(), newDocument(), etc.). The ImagoFilter controls any caching functionality. An example of a simple extension element is provided below. Note that all extension elements must have the two parameters in the order listed. The return type may be any Java object however best results are seen when the objects are limited to String, DocumentFragment, int, double, float, or void. /** * Returns one of the servlet request parameter values. * * The 'item' attribute specifies which parameter value to return. * If the item attribute is null or the parameter value specified by the * item attribute is not found a null is returned. * * If the returned value is non-null the XeneiFilter is set to dynamic * thus these requests are not cached and subsequent stylesheet transforms * will not be cached either. * * @return java.lang.String * @param context org.apache.xalan.extensions.XSLProcessorContext * @param element org.apache.xalan.templates.ElemLiteralResult */ public String parameter( org.apache.xalan.extensions.XSLProcessorContext context, org.apache.xalan.templates.ElemExtensionCall element) throws javax.xml.transform.TransformerException { // the return value String value = null; // get the ImagoData ImagoData data = (ImagoData) context.getTransformer().getParameter( org.xenei.imago.Defaults.IMAGO_DATA); // make sure we are running under Imago if (data != null) { HttpServletRequest req = data.getHttpServletRequest(); if (req != null) { // get the "Item" attribute of the "parameter" element // <parameter item="x"/> String item = element.getAttribute( "item", context.getContextNode(), context.getTransformer()); if (item != null) { value = req.getParameter(item); ((ImagoFilter)context.getTransformer().getParameter( org.xenei.imago.Defaults.IMAGO_FILTER )).setDynamic( true ); } } } return value; } Extension elements may be derived from
             org.xenei.imago.extensions.ImagoExtension
            to get access to a numer of convenience methods.  In the above example:ImagoData data = (ImagoData) context.getTransformer().getParameter( org.xenei.imago.Defaults.IMAGO_DATA); would be replaced by: ImagoData data = getImagoData( context ); and: ((ImagoFilter)context.getTransformer().getParameter( org.xenei.imago.Defaults.IMAGO_FILTER)).setDynamic( true ); would be replaced by: setDynamic( true ); There are several static methods in  ImagoExtension that
            could be used without deriving from it. |