Ejemplo n.º 1
0
  private static CIPage toCIPage(Page p, String callPath) throws PageException {
    if (p instanceof CIPage) return (CIPage) p;

    if (p != null)
      throw new ApplicationException(
          "invalid component definition ["
              + callPath
              + "] in template ["
              + p.getPageSource().getDisplayPath()
              + "]");

    throw new ApplicationException("invalid component definition [" + callPath + "] ");
  }
Ejemplo n.º 2
0
  private static Object _search(
      PageContext pc,
      PageSource loadingLocation,
      String rawPath,
      Boolean searchLocal,
      Boolean searchRoot,
      boolean executeConstr,
      short returnType,
      Page currP,
      int dialect,
      boolean isExtendedComponent)
      throws PageException {
    ConfigImpl config = (ConfigImpl) pc.getConfig();
    boolean doCache = config.useComponentPathCache();
    String sub = null;
    if (returnType != RETURN_TYPE_PAGE && rawPath.indexOf(':') != -1) {
      int d = rawPath.indexOf(':');
      int s = rawPath.indexOf('.');
      if (d > s) {
        sub = rawPath.substring(d + 1);
        rawPath = rawPath.substring(0, d);
      }
    }

    // app-String appName=pc.getApplicationContext().getName();
    rawPath = rawPath.trim().replace('\\', '/');
    String path = (rawPath.indexOf("./") == -1) ? rawPath.replace('.', '/') : rawPath;

    boolean isRealPath = !StringUtil.startsWith(path, '/');
    // PageSource currPS = pc.getCurrentPageSource();
    // Page currP=currPS.loadPage(pc,false);
    PageSource ps = null;
    CIPage page = null;

    // MUSTMUST improve to handle different extensions
    String pathWithCFC =
        path.concat(
            "."
                + (dialect == CFMLEngine.DIALECT_CFML
                    ? Constants.getCFMLComponentExtension()
                    : Constants.getLuceeComponentExtension()));

    // no cache for per application pathes
    Mapping[] acm = pc.getApplicationContext().getComponentMappings();
    if (!ArrayUtil.isEmpty(acm)) {
      Mapping m;
      for (int y = 0; y < acm.length; y++) {
        m = acm[y];
        ps = m.getPageSource(pathWithCFC);
        page = toCIPage(ps.loadPageThrowTemplateException(pc, false, (Page) null));
        if (page != null) {

          return returnType == RETURN_TYPE_PAGE
              ? page
              : load(
                  pc,
                  page,
                  trim(path.replace('/', '.')),
                  sub,
                  isRealPath,
                  returnType,
                  isExtendedComponent,
                  executeConstr);
        }
      }
    }

    if (searchLocal == null)
      searchLocal =
          Caster.toBoolean(rawPath.indexOf('.') == -1 ? true : config.getComponentLocalSearch());
    if (searchRoot == null) searchRoot = Caster.toBoolean(config.getComponentRootSearch());

    // CACHE
    // check local in cache
    String localCacheName = null;
    if (searchLocal && isRealPath) {
      localCacheName = currP.getPageSource().getDisplayPath().replace('\\', '/');
      localCacheName =
          localCacheName.substring(0, localCacheName.lastIndexOf('/') + 1).concat(pathWithCFC);
      if (doCache) {
        page = config.getCachedPage(pc, localCacheName);
        if (page != null)
          return returnType == RETURN_TYPE_PAGE
              ? page
              : load(
                  pc,
                  page,
                  trim(path.replace('/', '.')),
                  sub,
                  isRealPath,
                  returnType,
                  isExtendedComponent,
                  executeConstr);
      }
    }

    // check import cache
    if (doCache && isRealPath) {
      ImportDefintion impDef = config.getComponentDefaultImport();
      ImportDefintion[] impDefs =
          currP == null ? new ImportDefintion[0] : currP.getImportDefintions();
      int i = -1;
      do {

        if (impDef.isWildcard() || impDef.getName().equalsIgnoreCase(path)) {
          page = config.getCachedPage(pc, "import:" + impDef.getPackageAsPath() + pathWithCFC);
          if (page != null)
            return returnType == RETURN_TYPE_PAGE
                ? page
                : load(
                    pc,
                    page,
                    trim(path.replace('/', '.')),
                    sub,
                    isRealPath,
                    returnType,
                    isExtendedComponent,
                    executeConstr);
        }
        impDef = ++i < impDefs.length ? impDefs[i] : null;
      } while (impDef != null);
    }

    if (doCache) {
      // check global in cache
      page = config.getCachedPage(pc, pathWithCFC);
      if (page != null)
        return returnType == RETURN_TYPE_PAGE
            ? page
            : load(
                pc,
                page,
                trim(path.replace('/', '.')),
                sub,
                isRealPath,
                returnType,
                isExtendedComponent,
                executeConstr);
    }

    // SEARCH
    // search from local
    if (searchLocal && isRealPath) {
      // check realpath
      PageSource[] arr = ((PageContextImpl) pc).getRelativePageSources(pathWithCFC);
      page = toCIPage(PageSourceImpl.loadPage(pc, arr, null));
      if (page != null) {
        if (doCache) config.putCachedPageSource(localCacheName, page.getPageSource());
        return returnType == RETURN_TYPE_PAGE
            ? page
            : load(
                pc,
                page,
                trim(path.replace('/', '.')),
                sub,
                isRealPath,
                returnType,
                isExtendedComponent,
                executeConstr);
      }
    }

    // search with imports
    Mapping[] cMappings = config.getComponentMappings();

    if (isRealPath) {

      ImportDefintion impDef = config.getComponentDefaultImport();
      ImportDefintion[] impDefs =
          currP == null ? new ImportDefintion[0] : currP.getImportDefintions();
      PageSource[] arr;

      int i = -1;
      do {
        if (impDef.isWildcard() || impDef.getName().equalsIgnoreCase(path)) {

          // search from local first
          if (searchLocal) {
            arr =
                ((PageContextImpl) pc)
                    .getRelativePageSources(impDef.getPackageAsPath() + pathWithCFC);
            page = toCIPage(PageSourceImpl.loadPage(pc, arr, null));
            if (page != null) {
              if (doCache)
                config.putCachedPageSource(
                    "import:" + impDef.getPackageAsPath() + pathWithCFC, page.getPageSource());
              return returnType == RETURN_TYPE_PAGE
                  ? page
                  : load(
                      pc,
                      page,
                      trim(path.replace('/', '.')),
                      sub,
                      isRealPath,
                      returnType,
                      isExtendedComponent,
                      executeConstr);
            }
          }

          // search mappings and webroot
          page =
              toCIPage(
                  PageSourceImpl.loadPage(
                      pc,
                      ((PageContextImpl) pc)
                          .getPageSources("/" + impDef.getPackageAsPath() + pathWithCFC),
                      null));
          if (page != null) {
            String key = impDef.getPackageAsPath() + pathWithCFC;
            if (doCache && !((MappingImpl) page.getPageSource().getMapping()).isAppMapping())
              config.putCachedPageSource("import:" + key, page.getPageSource());
            return returnType == RETURN_TYPE_PAGE
                ? page
                : load(
                    pc,
                    page,
                    trim(path.replace('/', '.')),
                    sub,
                    isRealPath,
                    returnType,
                    isExtendedComponent,
                    executeConstr);
          }

          // search component mappings
          Mapping m;
          for (int y = 0; y < cMappings.length; y++) {
            m = cMappings[y];
            ps = m.getPageSource(impDef.getPackageAsPath() + pathWithCFC);
            page = toCIPage(ps.loadPageThrowTemplateException(pc, false, (Page) null));
            if (page != null) {
              if (doCache)
                config.putCachedPageSource(
                    "import:" + impDef.getPackageAsPath() + pathWithCFC, page.getPageSource());
              return returnType == RETURN_TYPE_PAGE
                  ? page
                  : load(
                      pc,
                      page,
                      trim(path.replace('/', '.')),
                      sub,
                      isRealPath,
                      returnType,
                      isExtendedComponent,
                      executeConstr);
            }
          }
        }
        impDef = ++i < impDefs.length ? impDefs[i] : null;
      } while (impDef != null);
    }

    String p;
    if (isRealPath) p = '/' + pathWithCFC;
    else p = pathWithCFC;

    // search mappings and webroot
    page = toCIPage(PageSourceImpl.loadPage(pc, ((PageContextImpl) pc).getPageSources(p), null));
    if (page != null) {
      String key = pathWithCFC;
      if (doCache && !((MappingImpl) page.getPageSource().getMapping()).isAppMapping())
        config.putCachedPageSource(key, page.getPageSource());
      return returnType == RETURN_TYPE_PAGE
          ? page
          : load(
              pc,
              page,
              trim(path.replace('/', '.')),
              sub,
              isRealPath,
              returnType,
              isExtendedComponent,
              executeConstr);
    }

    // search component mappings
    Mapping m;
    for (int i = 0; i < cMappings.length; i++) {
      m = cMappings[i];
      ps = m.getPageSource(p);
      page = toCIPage(ps.loadPageThrowTemplateException(pc, false, (Page) null));

      // recursive search
      if (page == null && config.doComponentDeepSearch() && path.indexOf('/') == -1) {
        ps = MappingUtil.searchMappingRecursive(m, pathWithCFC, true);
        if (ps != null) {
          page = toCIPage(ps.loadPageThrowTemplateException(pc, false, (Page) null));
          if (page != null) doCache = false; // do not cache this, it could be ambigous
        }
      }

      if (page != null) {
        if (doCache) config.putCachedPageSource(pathWithCFC, page.getPageSource());
        return returnType == RETURN_TYPE_PAGE
            ? page
            : load(
                pc,
                page,
                trim(path.replace('/', '.')),
                sub,
                isRealPath,
                returnType,
                isExtendedComponent,
                executeConstr);
      }
    }

    // search relative to active component (this get not cached because the cache get ambigous if we
    // do)
    if (searchLocal && isRealPath) {
      if (loadingLocation == null) {
        Component c = pc.getActiveComponent();
        if (c != null) loadingLocation = c.getPageSource();
      }

      if (loadingLocation != null) {
        ps = loadingLocation.getRealPage(pathWithCFC);
        if (ps != null) {
          page = toCIPage(ps.loadPageThrowTemplateException(pc, false, (Page) null));

          if (page != null) {
            return returnType == RETURN_TYPE_PAGE
                ? page
                : load(
                    pc,
                    page,
                    trim(path.replace('/', '.')),
                    sub,
                    isRealPath,
                    returnType,
                    isExtendedComponent,
                    executeConstr);
          }
        }
      }
    }
    // translate cfide. to org.lucee.cfml
    if (StringUtil.startsWithIgnoreCase(rawPath, "cfide.")) {
      String rpm = Constants.DEFAULT_PACKAGE + "." + rawPath.substring(6);
      try {
        return _search(
            pc,
            loadingLocation,
            rpm,
            searchLocal,
            searchRoot,
            executeConstr,
            returnType,
            currP,
            dialect,
            false);
      } catch (ExpressionException ee) {
        return null;
        // throw new ExpressionException("invalid "+toStringType(returnType)+" definition, can't
        // find "+rawPath+" or "+rpm);
      }
    }
    return null;
    // throw new ExpressionException("invalid "+toStringType(returnType)+" definition, can't find
    // "+toStringType(returnType)+" ["+rawPath+"]");
  }