Changeset 3975 for trunk/pfixcore/src

Show
Ignore:
Timestamp:
01/12/09 16:22:06 (3 years ago)
Author:
mtld
Message:

perflogging with aspectj

Location:
trunk/pfixcore/src
Files:
1 added
8 modified

Legend:

Unmodified
Added
Removed
  • trunk/pfixcore/src/de/schlund/pfixcore/util/StateUtil.java

    r3822 r3975  
    4141import de.schlund.pfixxml.ResultDocument; 
    4242import de.schlund.pfixxml.SPDocument; 
    43 import de.schlund.pfixxml.perflogging.PerfEvent; 
    44 import de.schlund.pfixxml.perflogging.PerfEventType; 
    4543 
    4644 
     
    6563     
    6664     
    67     @SuppressWarnings("deprecation") 
    6865    public static void renderContextResources(Context context, ResultDocument resdoc, StateConfig config) throws Exception { 
    6966        Map<String, ?> contextResources = config.getContextResources(); 
     
    7168        for (String nodename : contextResources.keySet()) { 
    7269            Object cr = contextResources.get(nodename); 
    73             String classname = cr.getClass().getName(); 
    74             Class<?> clazz = cr.getClass(); 
    75             if(Enhancer.isEnhanced(clazz)) { 
    76                 clazz = clazz.getSuperclass(); 
    77                 classname = clazz.getName(); 
    78             } 
    79             if (LOG.isDebugEnabled()) { 
    80                 LOG.debug("*** Auto appending status for " + classname + " at node " + nodename); 
    81             } 
    82             PerfEvent pe = new PerfEvent(PerfEventType.CONTEXTRESOURCE_INSERTSTATUS, classname); 
    83             pe.start(); 
    84             if (cr instanceof de.schlund.pfixcore.workflow.ContextResource) { 
    85                 LOG.debug("***** Resource implements ContextResource => calling insertStatus(...) of " + clazz.getName()); 
    86                 ((de.schlund.pfixcore.workflow.ContextResource) cr).insertStatus(resdoc, resdoc.createNode(nodename)); 
    87             } else { 
    88                 boolean found_annotation = false; 
    89                 for (Method m : clazz.getMethods()) { 
    90                     if (m.isAnnotationPresent(InsertStatus.class)) { 
    91                         Class<?>[] params = m.getParameterTypes(); 
    92                         Class<?>  rettype = m.getReturnType(); 
    93                         if (params.length == 0 && rettype != null) { 
    94                             LOG.debug("***** Found @InsertStatus for Object:" + m.getName() + "() of " + clazz.getName()); 
    95                             ResultDocument.addObject(resdoc.createNode(nodename), m.invoke(cr, new Object[] {})); 
    96                         } else if (params.length == 1 && params[0].isAssignableFrom(Element.class)) { 
    97                             LOG.debug("***** Found @InsertStatus for " + m.getName() + "(Element) of " + clazz.getName()); 
    98                             m.invoke(cr, resdoc.createNode(nodename)); 
    99                         } else if (params.length == 2 && params[0].isAssignableFrom(ResultDocument.class) && params[1].isAssignableFrom(Element.class)) { 
    100                             LOG.debug("***** Found @InsertStatus for " + m.getName() + "(ResultDocument, Element) of " + clazz.getName()); 
    101                             m.invoke(cr, resdoc, resdoc.createNode(nodename)); 
    102                         } else { 
    103                             throw new PustefixApplicationException("Exception when trying to call annotated method '@InsertStatus' " + 
    104                                     "of " + clazz.getName() + ": Need either a signature of either " +  
    105                             "method(Element) or method(ResultDocument, Element)"); 
    106                         } 
    107                         found_annotation = true; 
    108                         break; 
     70            renderContextResource(cr, resdoc, nodename); 
     71        } 
     72    } 
     73     
     74    @SuppressWarnings("deprecation") 
     75    private static void renderContextResource(Object cr, ResultDocument resdoc, String nodename) throws Exception { 
     76        String classname = cr.getClass().getName(); 
     77        Class<?> clazz = cr.getClass(); 
     78        if(Enhancer.isEnhanced(clazz)) { 
     79            clazz = clazz.getSuperclass(); 
     80            classname = clazz.getName(); 
     81        } 
     82        if (LOG.isDebugEnabled()) { 
     83            LOG.debug("*** Auto appending status for " + classname + " at node " + nodename); 
     84        } 
     85        if (cr instanceof de.schlund.pfixcore.workflow.ContextResource) { 
     86            LOG.debug("***** Resource implements ContextResource => calling insertStatus(...) of " + clazz.getName()); 
     87            ((de.schlund.pfixcore.workflow.ContextResource) cr).insertStatus(resdoc, resdoc.createNode(nodename)); 
     88        } else { 
     89            boolean found_annotation = false; 
     90            for (Method m : clazz.getMethods()) { 
     91                if (m.isAnnotationPresent(InsertStatus.class)) { 
     92                    Class<?>[] params = m.getParameterTypes(); 
     93                    Class<?>  rettype = m.getReturnType(); 
     94                    if (params.length == 0 && rettype != null) { 
     95                        LOG.debug("***** Found @InsertStatus for Object:" + m.getName() + "() of " + clazz.getName()); 
     96                        ResultDocument.addObject(resdoc.createNode(nodename), m.invoke(cr, new Object[] {})); 
     97                    } else if (params.length == 1 && params[0].isAssignableFrom(Element.class)) { 
     98                        LOG.debug("***** Found @InsertStatus for " + m.getName() + "(Element) of " + clazz.getName()); 
     99                        m.invoke(cr, resdoc.createNode(nodename)); 
     100                    } else if (params.length == 2 && params[0].isAssignableFrom(ResultDocument.class) && params[1].isAssignableFrom(Element.class)) { 
     101                        LOG.debug("***** Found @InsertStatus for " + m.getName() + "(ResultDocument, Element) of " + clazz.getName()); 
     102                        m.invoke(cr, resdoc, resdoc.createNode(nodename)); 
     103                    } else { 
     104                        throw new PustefixApplicationException("Exception when trying to call annotated method '@InsertStatus' " + 
     105                                "of " + clazz.getName() + ": Need either a signature of either " +  
     106                        "method(Element) or method(ResultDocument, Element)"); 
    109107                    } 
    110                 } 
    111                 if (!found_annotation) { 
    112                     LOG.debug("***** Serializing the complete resource " + clazz.getName()); 
    113                     ResultDocument.addObject(resdoc.createNode(nodename), cr); 
     108                    found_annotation = true; 
     109                    break; 
    114110                } 
    115111            } 
    116             pe.save(); 
     112            if (!found_annotation) { 
     113                LOG.debug("***** Serializing the complete resource " + clazz.getName()); 
     114                ResultDocument.addObject(resdoc.createNode(nodename), cr); 
     115            } 
    117116        } 
    118117    } 
  • trunk/pfixcore/src/de/schlund/pfixcore/workflow/app/DefaultIWrapperState.java

    r3832 r3975  
    2222import java.util.Map; 
    2323 
    24 import org.pustefixframework.generated.CoreStatusCodes; 
    2524import org.pustefixframework.config.contextxmlservice.IWrapperConfig; 
    2625import org.pustefixframework.config.contextxmlservice.StateConfig; 
     26import org.pustefixframework.generated.CoreStatusCodes; 
    2727 
    2828import de.schlund.pfixcore.util.TokenManager; 
     
    3636import de.schlund.pfixxml.ResultDocument; 
    3737import de.schlund.pfixxml.XMLException; 
    38 import de.schlund.pfixxml.perflogging.PerfEvent; 
    39 import de.schlund.pfixxml.perflogging.PerfEventType; 
    4038 
    4139/** 
     
    8987        ResdocFinalizer rfinal = getResdocFinalizer(context); 
    9088        ResultDocument  resdoc = new ResultDocument(); 
    91         PerfEvent       pe     = new PerfEvent(PerfEventType.PAGE_INITIWRAPPERS, context.getCurrentPageRequest().toString()); 
    92  
    93         pe.start(); 
     89       
    9490        IWrapperContainer wrp_container =  getIHandlerContainer(context).createIWrapperContainerInstance(context, preq, resdoc); 
    95         pe.save(); 
    9691 
    9792        if (isSubmitTrigger(context, preq)) { 
     
    113108                        context.addPageMessage(CoreStatusCodes.FORM_TOKEN_INVALID, null, null); 
    114109                        if (errorPage.equals("")) { 
    115                             pe = new PerfEvent(PerfEventType.PAGE_RETRIEVECURRENTSTATUS, context.getCurrentPageRequest().toString()); 
    116                             pe.start(); 
    117110                            wrp_container.retrieveCurrentStatus(false); 
    118                             pe.save(); 
    119111                            rfinal.onWorkError(wrp_container); 
    120112                            context.prohibitContinue(); 
     
    131123                if (stateConf != null && stateConf.requiresToken()) { 
    132124                    context.addPageMessage(CoreStatusCodes.FORM_TOKEN_MISSING, null, null); 
    133                     pe = new PerfEvent(PerfEventType.PAGE_RETRIEVECURRENTSTATUS, context.getCurrentPageRequest().toString()); 
    134                     pe.start(); 
    135125                    wrp_container.retrieveCurrentStatus(false); 
    136                     pe.save(); 
    137126                    rfinal.onWorkError(wrp_container); 
    138127                    context.prohibitContinue(); 
     
    142131 
    143132            if (valid) { 
    144                 pe = new PerfEvent(PerfEventType.PAGE_HANDLESUBMITTEDDATA, context.getCurrentPageRequest().toString()); 
    145                 pe.start(); 
    146133                wrp_container.handleSubmittedData(); 
    147                 pe.save(); 
    148134 
    149135                if (wrp_container.errorHappened()) { 
     
    154140                    CAT.debug("    => No error happened during work... end of submit reached successfully."); 
    155141                    CAT.debug("    => retrieving current status."); 
    156                     pe = new PerfEvent(PerfEventType.PAGE_RETRIEVECURRENTSTATUS, context.getCurrentPageRequest().toString()); 
    157                     pe.start(); 
    158142                    wrp_container.retrieveCurrentStatus(false); 
    159                     pe.save(); 
    160143 
    161144                    rfinal.onSuccess(wrp_container); 
     
    165148            CAT.debug(">>> Retrieving current status..."); 
    166149 
    167             pe = new PerfEvent(PerfEventType.PAGE_RETRIEVECURRENTSTATUS, context.getCurrentPageRequest().toString()); 
    168             pe.start(); 
    169150            wrp_container.retrieveCurrentStatus(true); 
    170             pe.save(); 
    171151            if (CAT.isDebugEnabled()) { 
    172152                if (isDirectTrigger(context, preq)) { 
  • trunk/pfixcore/src/de/schlund/pfixcore/workflow/app/IHandlerContainerImpl.java

    r3897 r3975  
    3131import de.schlund.pfixxml.PfixServletRequest; 
    3232import de.schlund.pfixxml.ResultDocument; 
    33 import de.schlund.pfixxml.perflogging.PerfEvent; 
    34 import de.schlund.pfixxml.perflogging.PerfEventType; 
    3533 
    3634/** 
     
    102100        for (Iterator<IHandler> iter = handlers.iterator(); iter.hasNext(); ) { 
    103101            IHandler handler = iter.next(); 
    104             PerfEvent pe = new PerfEvent(PerfEventType.IHANDLER_PREREQUISITESMET, handler.getClass().getName()); 
    105             pe.start(); 
    106102            boolean  test = handler.prerequisitesMet(context); 
    107             pe.save(); 
    108103             
    109104            if (!test) { 
     
    176171     */ 
    177172    private boolean doIsActive(IHandler handler, Context ctx) throws Exception{ 
    178         PerfEvent pe = new PerfEvent(PerfEventType.IHANDLER_ISACTIVE, handler.getClass().getName()); 
    179         pe.start(); 
    180173        boolean  test = handler.isActive(ctx); 
    181         pe.save(); 
    182174        return test; 
    183175    } 
     
    193185     */ 
    194186    private boolean doNeedsData(IHandler handler, Context ctx) throws Exception{ 
    195         PerfEvent pe = new PerfEvent(PerfEventType.IHANDLER_NEEDSDATA, handler.getClass().getName()); 
    196         pe.start(); 
    197187        boolean  test = handler.needsData(ctx); 
    198         pe.save(); 
    199188        return test; 
    200189    } 
  • trunk/pfixcore/src/de/schlund/pfixcore/workflow/app/IWrapperContainerImpl.java

    r3822 r3975  
    4747import de.schlund.pfixxml.ResultDocument; 
    4848import de.schlund.pfixxml.XMLException; 
    49 import de.schlund.pfixxml.perflogging.PerfEvent; 
    50 import de.schlund.pfixxml.perflogging.PerfEventType; 
    5149import de.schlund.pfixxml.resources.FileResource; 
    5250import de.schlund.pfixxml.resources.ResourceUtil; 
     
    6664    private Set<IWrapper>             allsubmit        = new TreeSet<IWrapper>(); 
    6765    private Set<IWrapper>             allretrieve      = new TreeSet<IWrapper>(); 
    68     private Context                   context          = null; 
     66    public Context                   context          = null; 
    6967    private ResultDocument            resdoc           = null; 
    7068    private RequestData               reqdata          = null; 
     
    235233                    wrapper.tryParamLogging(); 
    236234                    if (!wrapper.errorHappened()) { 
    237                         PerfEvent pe = new PerfEvent(PerfEventType.IHANDLER_HANDLESUBMITTEDDATA, handler.getClass().getName()); 
    238                         pe.start(); 
    239235                        handler.handleSubmittedData(context, wrapper); 
    240                         pe.save(); 
    241236                    } 
    242237                } 
  • trunk/pfixcore/src/de/schlund/pfixcore/workflow/context/RequestContextImpl.java

    r3969 r3975  
    6767import de.schlund.pfixxml.SPDocument; 
    6868import de.schlund.pfixxml.Variant; 
    69 import de.schlund.pfixxml.perflogging.PerfEvent; 
    70 import de.schlund.pfixxml.perflogging.PerfEventType; 
    7169import de.schlund.util.statuscodes.StatusCode; 
    7270 
     
    842840        State state = getStateForPageRequest(page); 
    843841 
    844         PerfEvent pe = new PerfEvent(PerfEventType.PAGE_NEEDSDATA, page.getName()); 
    845         pe.start(); 
    846842        boolean retval; 
    847843        try { 
     
    850846            throw new PustefixApplicationException("Exception while running needsData() for page " + page.getName(), e); 
    851847        } 
    852         pe.save(); 
    853848 
    854849        currentpagerequest = saved; 
     
    865860            State state = getStateForPageRequest(page); 
    866861 
    867             PerfEvent pe = new PerfEvent(PerfEventType.PAGE_ISACCESSIBLE, page.getName()); 
    868             pe.start(); 
    869862            boolean retval; 
    870863            try { 
     
    873866                throw new PustefixApplicationException("Got exception from state for page " + page.getName() + " while calling isAccessible()", e); 
    874867            } 
    875             pe.save(); 
    876868 
    877869            return retval; 
  • trunk/pfixcore/src/de/schlund/pfixxml/PfixServletRequestImpl.java

    r3750 r3975  
    3939import de.schlund.pfixxml.multipart.MultipartHandler; 
    4040import de.schlund.pfixxml.multipart.PartData; 
    41 import de.schlund.pfixxml.perflogging.PerfEvent; 
    42 import de.schlund.pfixxml.perflogging.PerfEventType; 
    4341import de.schlund.pfixxml.serverutil.SessionHelper; 
    4442import de.schlund.pfixxml.util.CookieUtils; 
     
    10098     */ 
    10199    public PfixServletRequestImpl(HttpServletRequest req, Properties properties) { 
    102         PerfEvent pe = new PerfEvent(PerfEventType.PFIXSERVLETREQUEST_INIT); 
    103         pe.start(); 
    104          
     100     
    105101        starttime   = System.currentTimeMillis(); 
    106102        getRequestParams(req, properties); 
     
    113109        session     = req.getSession(false); 
    114110 
    115         pe.setIdentfier(uri); 
    116         pe.save(); 
    117111    } 
    118112 
  • trunk/pfixcore/src/org/pustefixframework/http/AbstractPustefixRequestHandler.java

    r3916 r3975  
    5454import de.schlund.pfixxml.exceptionprocessor.ExceptionConfig; 
    5555import de.schlund.pfixxml.exceptionprocessor.ExceptionProcessor; 
    56 import de.schlund.pfixxml.perflogging.PerfEvent; 
    57 import de.schlund.pfixxml.perflogging.PerfEventType; 
    5856import de.schlund.pfixxml.serverutil.SessionAdmin; 
    5957import de.schlund.pfixxml.serverutil.SessionHelper; 
     
    416414        LOG.debug("*** >>> End of redirection management, handling request now.... <<< ***\n"); 
    417415 
    418         PerfEvent pe = new PerfEvent(PerfEventType.XMLSERVER_CALLPROCESS, req.getRequestURI()); 
    419         pe.start(); 
    420416        callProcess(preq, req, res); 
    421         pe.save(); 
    422417    } 
    423418 
  • trunk/pfixcore/src/org/pustefixframework/http/AbstractPustefixXMLRequestHandler.java

    r3906 r3975  
    6363import de.schlund.pfixxml.perflogging.AdditionalTrailInfo; 
    6464import de.schlund.pfixxml.perflogging.AdditionalTrailInfoFactory; 
    65 import de.schlund.pfixxml.perflogging.PerfEvent; 
    66 import de.schlund.pfixxml.perflogging.PerfEventType; 
    6765import de.schlund.pfixxml.resources.FileResource; 
    6866import de.schlund.pfixxml.resources.ResourceUtil; 
     
    389387        if (spdoc == null) { 
    390388             
    391             // Performace tracking 
    392             PerfEvent pe = new PerfEvent(PerfEventType.XMLSERVER_GETDOM); 
    393             pe.start(); 
    394389            currtime        = System.currentTimeMillis(); 
    395390             
     
    407402                } 
    408403            } 
    409              
    410             //Performance tracking 
    411             pe.setIdentfier(spdoc.getPagename()); 
    412             pe.save(); 
    413404             
    414405             
     
    541532        } 
    542533         
    543         //Performance tracking 
    544         PerfEvent pe = new PerfEvent(PerfEventType.XMLSERVER_HANDLEDOCUMENT, spdoc.getPagename()); 
    545         pe.start(); 
    546          
    547534        if (spdoc.docIsUpdateable()) { 
    548535            if (stylesheet.indexOf("::") > 0) { 
     
    570557            setCookies(spdoc,res); 
    571558        } 
     559         
     560        boolean modified_or_no_etag = doHandleDocument(spdoc, stylesheet, paramhash, preq, res, session); 
     561 
     562        long handletime = System.currentTimeMillis() - currtime; 
     563        preq.getRequest().setAttribute(TRAFOTIME, handletime); 
     564         
     565        Map<String, Object> addinfo = addtrailinfo.getData(preq); 
     566         
     567        if (session != null && !spdoc.getTrailLogged()) { 
     568            StringBuffer logbuff = new StringBuffer(); 
     569            logbuff.append(session.getAttribute(VISIT_ID) + "|"); 
     570            logbuff.append(session.getId() + "|"); 
     571            logbuff.append(preq.getRemoteAddr() + "|"); 
     572            logbuff.append(preq.getServerName() + "|"); 
     573            logbuff.append(stylesheet + "|"); 
     574            logbuff.append(preq.getOriginalRequestURI()); 
     575            if (preq.getQueryString() != null) { 
     576                logbuff.append("?" + preq.getQueryString()); 
     577            } 
     578            String flow = (String) paramhash.get("pageflow"); 
     579            if (flow != null) { 
     580                logbuff.append("|" + flow); 
     581            } 
     582            for (Iterator<String> keys = addinfo.keySet().iterator(); keys.hasNext(); ) { 
     583                logbuff.append("|" + addinfo.get(keys.next())); 
     584            } 
     585            LOGGER_TRAIL.warn(logbuff.toString()); 
     586            spdoc.setTrailLogged(); 
     587        } 
     588         
     589        if (LOGGER.isInfoEnabled()) { 
     590            LOGGER.info(">>> Complete handleDocument(...) took " + handletime + "ms" +  
     591                    " (needed xslt: " + modified_or_no_etag + ")"); 
     592        } 
     593         
     594        try { 
     595            if (modified_or_no_etag &&  
     596                    (spdoc.getResponseContentType() == null || spdoc.getResponseContentType().startsWith("text/html"))) { 
     597                OutputStream       out          = res.getOutputStream(); 
     598                OutputStreamWriter writer       = new OutputStreamWriter(out, res.getCharacterEncoding()); 
     599                writer.write("\n<!--"); 
     600                for (Iterator<String> keys = addinfo.keySet().iterator(); keys.hasNext(); ) { 
     601                    String key = keys.next(); 
     602                    writer.write(" " + key + ": " + addinfo.get(key)); 
     603                } 
     604                writer.write(" -->"); 
     605                writer.flush(); 
     606            } 
     607        } catch (Exception e) { 
     608            // ignore 
     609        } 
     610    } 
     611 
     612    private boolean doHandleDocument(SPDocument spdoc, String stylesheet, TreeMap<String, Object> paramhash,  
     613            PfixServletRequest preq, HttpServletResponse res, HttpSession session) throws PustefixCoreException { 
    572614         
    573615        boolean modified_or_no_etag = true; 
     
    582624        } 
    583625         
    584         PerfEvent pe_etag = new PerfEvent(PerfEventType.XMLSERVER_CREATEETAG, spdoc.getPagename()); 
    585         pe_etag.start(); 
    586         String etag_outgoing = MD5Utils.hex_md5(output.toString()); 
    587         pe_etag.save(); 
     626        String etag_outgoing = createETag(output.toString(), spdoc); 
    588627        res.setHeader("ETag", etag_outgoing); 
    589  
     628         
    590629        if (getRendering(preq) == RENDERMODE.RENDER_NORMAL && etag_incoming != null && etag_incoming.equals(etag_outgoing)) { 
    591630            //it's important to reset the content type, because old Apache versions in conjunction 
     
    603642            } 
    604643        } 
    605  
    606         long handletime = System.currentTimeMillis() - currtime; 
    607         preq.getRequest().setAttribute(TRAFOTIME, handletime); 
    608          
    609         Map<String, Object> addinfo = addtrailinfo.getData(preq); 
    610          
    611         if (session != null && !spdoc.getTrailLogged()) { 
    612             StringBuffer logbuff = new StringBuffer(); 
    613             logbuff.append(session.getAttribute(VISIT_ID) + "|"); 
    614             logbuff.append(session.getId() + "|"); 
    615             logbuff.append(preq.getRemoteAddr() + "|"); 
    616             logbuff.append(preq.getServerName() + "|"); 
    617             logbuff.append(stylesheet + "|"); 
    618             logbuff.append(preq.getOriginalRequestURI()); 
    619             if (preq.getQueryString() != null) { 
    620                 logbuff.append("?" + preq.getQueryString()); 
    621             } 
    622             String flow = (String) paramhash.get("pageflow"); 
    623             if (flow != null) { 
    624                 logbuff.append("|" + flow); 
    625             } 
    626             for (Iterator<String> keys = addinfo.keySet().iterator(); keys.hasNext(); ) { 
    627                 logbuff.append("|" + addinfo.get(keys.next())); 
    628             } 
    629             LOGGER_TRAIL.warn(logbuff.toString()); 
    630             spdoc.setTrailLogged(); 
    631         } 
    632  
    633         pe.save(); 
    634          
    635         if (LOGGER.isInfoEnabled()) { 
    636             LOGGER.info(">>> Complete handleDocument(...) took " + handletime + "ms" +  
    637                     " (needed xslt: " + modified_or_no_etag + ")"); 
    638         } 
    639          
    640         try { 
    641             if (modified_or_no_etag &&  
    642                     (spdoc.getResponseContentType() == null || spdoc.getResponseContentType().startsWith("text/html"))) { 
    643                 OutputStream       out          = res.getOutputStream(); 
    644                 OutputStreamWriter writer       = new OutputStreamWriter(out, res.getCharacterEncoding()); 
    645                 writer.write("\n<!--"); 
    646                 for (Iterator<String> keys = addinfo.keySet().iterator(); keys.hasNext(); ) { 
    647                     String key = keys.next(); 
    648                     writer.write(" " + key + ": " + addinfo.get(key)); 
    649                 } 
    650                 writer.write(" -->"); 
    651                 writer.flush(); 
    652             } 
    653         } catch (Exception e) { 
    654             // ignore 
    655         } 
    656     } 
    657  
     644         
     645        return modified_or_no_etag; 
     646    } 
     647     
     648    private String createETag(String output, SPDocument spdoc) { 
     649        String etag_outgoing = MD5Utils.hex_md5(output.toString()); 
     650        return etag_outgoing; 
     651    } 
    658652     
    659653    private void render(SPDocument spdoc, RENDERMODE rendering, HttpServletResponse res, TreeMap<String, Object> paramhash, String stylesheet, OutputStream output) throws RenderingException {