// two methods for the RenderSystemDecoder interface
 public void normalizeRequestMap(Map requestparams) {
   String key = RenderUtil.findCommandParams(requestparams);
   if (key != null) {
     String params = key.substring(FossilizedConverter.COMMAND_LINK_PARAMETERS.length());
     RenderUtil.unpackCommandLink(params, requestparams);
     requestparams.remove(key);
   }
 }
  // This method is almost entirely dialect-invariant - awaiting final
  // factorisation of RenderSystem
  public int renderComponent(
      RenderSystemContext rsc, UIContainer context, UIComponent torendero, XMLLump lump) {
    int lumpindex = lump.lumpindex;
    XMLLump[] lumps = lump.parent.lumps;
    int nextpos = -1;
    XMLLump outerendopen = lump.open_end;
    XMLLump outerclose = lump.close_tag;

    nextpos = outerclose.lumpindex + 1;

    XMLLumpList payloadlist =
        lump.downmap == null ? null : lump.downmap.headsForID(XMLLump.PAYLOAD_COMPONENT);
    XMLLump payload = payloadlist == null ? null : payloadlist.lumpAt(0);

    boolean iselide = lump.rsfID.startsWith(XMLLump.ELISION_PREFIX);

    XMLLump endopen = outerendopen;
    XMLLump close = outerclose;
    XMLLump uselump = lump;

    HashMap attrcopy = new HashMap();
    attrcopy.putAll((payload == null ? uselump : payload).attributemap);
    attrcopy.remove(XMLLump.ID_ATTRIBUTE);

    TagRenderContext rendercontext =
        new TagRenderContext(
            attrcopy, uselump, endopen, close, rsc.pos, rsc.xmlw, nextpos, iselide);

    idRelationRewriter.rewrite(rsc.idrewritemap, rendercontext, context);

    // if there is no peer component, it might still be a static resource holder
    // that needs URLs rewriting.
    // we assume there is no payload component here, since there is no producer
    // ID that might govern selection. So we use "outer" indices.
    if (torendero == null) {
      if (lump.rsfID.indexOf(XMLLump.SCR_PREFIX) == (iselide ? 1 : 0)) {
        String scrname = lump.rsfID.substring(XMLLump.SCR_PREFIX.length() + (iselide ? 1 : 0));
        StaticComponentRenderer scr = scrc.getSCR(scrname);
        if (scr == null) {
          Logger.log.info(
              "Warning: unrecognised static component renderer reference with key "
                  + scrname
                  + " at lump "
                  + lump.toString());
          scr = NullRewriteSCR.instance;
        }
        int tagtype = RenderUtil.renderSCR(scr, rsc.collecteds, rendercontext);
        nextpos =
            tagtype == ComponentRenderer.LEAF_TAG
                ? outerclose.lumpindex + 1
                : outerendopen.lumpindex + 1;
      } else {
        if (rsc.debugrender) {
          renderDebugMessage(
              rsc,
              "Leaf component missing which was expected with template id "
                  + lump.rsfID
                  + " at "
                  + lump.toString());
        }
      }
    } else {
      // else there IS a component and we are going to render it. First make
      // sure we render any preamble.

      if (payload != null) {
        rendercontext.endopen = payload.open_end;
        rendercontext.close = payload.close_tag;
        rendercontext.uselump = payload;
        RenderUtil.dumpTillLump(lumps, lumpindex, payload.lumpindex, rsc.pos);
        lumpindex = payload.lumpindex;
      }

      rsc.IDassigner.adjustForID(attrcopy, torendero);
      decoratormanager.decorate(torendero.decorators, uselump.getTag(), attrcopy);

      // ALWAYS dump the tag name, this can never be rewritten. (probably?!)
      rendercontext.openTag();

      if (torendero instanceof UIBasicListMember) {
        torendero = RenderUtil.resolveListMember(rsc.view, (UIBasicListMember) torendero);
      }
      try {
        componentRenderer.renderComponent(torendero, rsc.view, rendercontext);
      } catch (Exception e) {
        throw UniversalRuntimeException.accumulate(
            e,
            "Error rendering component "
                + torendero.getClass()
                + " with full ID "
                + torendero.getFullID()
                + " at template location "
                + rendercontext.uselump);
      }
      // if there is a payload, dump the postamble.
      if (payload != null) {
        // the default case is initialised to tag close
        if (rendercontext.nextpos == nextpos) {
          RenderUtil.dumpTillLump(
              lumps, rendercontext.close.lumpindex + 1, outerclose.lumpindex + 1, rsc.pos);
        }
      }
      nextpos = rendercontext.nextpos;
    }

    return nextpos;
  }