Exemple #1
0
  public static synchronized UDF loadUDF(
      PageContext pc, String filename, Collection.Key name, boolean isweb) throws PageException {
    ConfigWebImpl config = (ConfigWebImpl) pc.getConfig();
    String key = isweb ? name.getString() + config.getId() : name.getString();
    UDF udf = config.getFromFunctionCache(key);
    if (udf != null) return udf;

    Mapping mapping = isweb ? config.getFunctionMapping() : config.getServerFunctionMapping();
    PageSourceImpl ps = (PageSourceImpl) mapping.getPageSource(filename);
    Page p = ps.loadPage(pc, pc.getConfig());

    // execute page
    Variables old = pc.variablesScope();
    pc.setVariablesScope(VAR);
    boolean wasSilent = pc.setSilent();
    try {
      p.call(pc);
      Object o = pc.variablesScope().get(name, null);
      if (o instanceof UDF) {
        udf = (UDF) o;
        config.putToFunctionCache(key, udf);
        return udf;
      }
      throw new ExpressionException(
          "there is no Function defined with name ["
              + name
              + "] in template ["
              + mapping.getStrPhysical()
              + File.separator
              + filename
              + "]");
    } catch (Throwable t) {
      throw Caster.toPageException(t);
    } finally {
      pc.setVariablesScope(old);
      if (!wasSilent) pc.unsetSilent();
    }
  }
  protected void _onRequest(
      PageContext pc, PageSource requestedPage, PageSource appPS, RequestListener rl)
      throws PageException {
    PageContextImpl pci = (PageContextImpl) pc;
    if (appPS != null) {
      String callPath = appPS.getComponentName();

      ComponentAccess app = ComponentLoader.loadComponent(pci, null, appPS, callPath, false, false);

      // init
      initApplicationContext(pci, app);

      apps.put(pc.getApplicationContext().getName(), app);

      if (!pci.initApplicationContext()) return;

      if (rl != null) {
        requestedPage = rl.execute(pc, requestedPage);
        if (requestedPage == null) return;
      }

      String targetPage = requestedPage.getFullRealpath();
      boolean doOnRequestEnd = true;

      // onRequestStart
      if (app.contains(pc, ON_REQUEST_START)) {
        Object rtn = call(app, pci, ON_REQUEST_START, new Object[] {targetPage}, true);
        if (!Caster.toBooleanValue(rtn, true)) return;
      }

      // onRequest
      boolean isCFC =
          ResourceUtil.getExtension(targetPage, "")
              .equalsIgnoreCase(pc.getConfig().getCFCExtension());
      Object method;
      if (isCFC
          && app.contains(pc, ON_CFCREQUEST)
          && (method = pc.urlFormScope().get(ComponentPage.METHOD, null)) != null) {

        Struct url = (Struct) Duplicator.duplicate(pc.urlFormScope(), true);

        url.removeEL(KeyConstants._fieldnames);
        url.removeEL(ComponentPage.METHOD);
        Object args = url.get(KeyConstants._argumentCollection, null);
        Object returnFormat = url.removeEL(KeyConstants._returnFormat);
        Object queryFormat = url.removeEL(KeyConstants._queryFormat);

        if (args == null) {
          args = pc.getHttpServletRequest().getAttribute("argumentCollection");
        }

        if (args instanceof String) {
          args = new JSONExpressionInterpreter().interpret(pc, (String) args);
        }

        if (args != null) {
          if (Decision.isCastableToStruct(args)) {
            Struct sct = Caster.toStruct(args, false);
            // Key[] keys = url.keys();
            Iterator<Entry<Key, Object>> it = url.entryIterator();
            Entry<Key, Object> e;
            while (it.hasNext()) {
              e = it.next();
              sct.setEL(e.getKey(), e.getValue());
            }
            args = sct;
          } else if (Decision.isCastableToArray(args)) {
            args = Caster.toArray(args);
          } else {
            Array arr = new ArrayImpl();
            arr.appendEL(args);
            args = arr;
          }
        } else args = url;

        Object rtn =
            call(
                app,
                pci,
                ON_CFCREQUEST,
                new Object[] {requestedPage.getComponentName(), method, args},
                true);

        if (rtn != null) {
          if (pc.getHttpServletRequest().getHeader("AMF-Forward") != null) {
            pc.variablesScope().setEL("AMF-Forward", rtn);
            // ThreadLocalWDDXResult.set(rtn);
          } else {
            try {
              pc.forceWrite(
                  ComponentPage.convertResult(
                      pc, app, method.toString(), returnFormat, queryFormat, rtn));
            } catch (Exception e) {
              throw Caster.toPageException(e);
            }
          }
        }

      }
      // else if(!isCFC && app.contains(pc,ON_REQUEST)) {}
      else {
        // TODO impl die nicht so generisch ist
        try {

          if (!isCFC && app.contains(pc, ON_REQUEST))
            call(app, pci, ON_REQUEST, new Object[] {targetPage}, false);
          else pci.doInclude(requestedPage);
        } catch (PageException pe) {
          if (!Abort.isSilentAbort(pe)) {
            if (pe instanceof MissingIncludeException) {
              if (((MissingIncludeException) pe).getPageSource().equals(requestedPage)) {
                if (app.contains(pc, ON_MISSING_TEMPLATE)) {
                  if (!Caster.toBooleanValue(
                      call(app, pci, ON_MISSING_TEMPLATE, new Object[] {targetPage}, true), true))
                    throw pe;
                } else throw pe;
              } else throw pe;
            } else throw pe;
          } else {
            doOnRequestEnd = false;
            if (app.contains(pc, ON_ABORT)) {
              call(app, pci, ON_ABORT, new Object[] {targetPage}, true);
            }
          }
        }
      }

      // onRequestEnd
      if (doOnRequestEnd && app.contains(pc, ON_REQUEST_END)) {
        call(app, pci, ON_REQUEST_END, new Object[] {targetPage}, true);
      }
    } else {
      apps.put(pc.getApplicationContext().getName(), null);
      pc.doInclude(requestedPage);
    }
  }