/**
  * finds the component with the given id that is located in the same NamingContainer as a given
  * component
  *
  * @param fc the FacesContext
  * @param componentId the component id
  * @param nearComponent a component within the same naming container from which to start the
  *     search (optional)
  * @return the component or null if no component was found
  */
 public UIComponent findComponent(FacesContext fc, String componentId, UIComponent nearComponent) {
   if (StringUtils.isEmpty(componentId))
     throw new InvalidArgumentException("componentId", componentId);
   // Begin search near given component (if any)
   UIComponent component = null;
   if (nearComponent != null) { // Search below the nearest naming container
     component = nearComponent.findComponent(componentId);
     if (component == null) { // Recurse upwards
       UIComponent nextParent = nearComponent;
       while (true) {
         nextParent = nextParent.getParent();
         // search NamingContainers only
         while (nextParent != null && !(nextParent instanceof NamingContainer)) {
           nextParent = nextParent.getParent();
         }
         if (nextParent == null) {
           break;
         } else {
           component = nextParent.findComponent(componentId);
         }
         if (component != null) {
           break;
         }
       }
     }
   }
   // Not found. Search the entire tree
   if (component == null) component = findChildComponent(fc.getViewRoot(), componentId);
   // done
   return component;
 }
 public static String decodeActionParam(String param) {
   ParameterMap pm = FacesUtils.getParameterMap(FacesUtils.getContext());
   if (pm == null) return param;
   String action = StringUtils.toString(pm.get(ACTION_PARAMETER_TYPE, param));
   if (action == null) log.warn("no action available for param {}.", param);
   return action;
 }
  /**
   * Creates an Oracle specific select statement that supports special features of the Oracle DBMS
   * like e.g. CONNECT BY PRIOR
   *
   * @param buf the SQL statement
   */
  @Override
  public synchronized void getSelect(StringBuilder buf) {
    List<DBAliasExpr> aliases = new ArrayList<DBAliasExpr>();
    resetParamUsage();
    if (select == null) throw new ObjectNotValidException(this);

    // Prepares statement
    if ((limitRows != null) || (skipRows != null)) {
      // add aliases
      Iterator<DBColumnExpr> iter = select.iterator();
      int i = 0;
      while (iter.hasNext()) {
        i++;
        aliases.add(new DBAliasExpr(iter.next(), "alias" + i));
      }

      buf.append("SELECT * FROM (\r\n");
    }

    buf.append("SELECT ");
    if (StringUtils.isNotEmpty(optimizerHint)) { // Append an optimizer hint
      // to the select
      // statement e.g. SELECT
      // /*+ RULE */
      buf.append("/*+ ").append(optimizerHint).append(" */ ");
    }
    if (selectDistinct) buf.append("DISTINCT ");

    // Add Select Expressions
    if ((limitRows != null) || (skipRows != null)) {
      addListExpr(buf, aliases, CTX_ALL, ", ");
      buf.append(", row_number() over (");
      insertOrderBy(buf);
      buf.append(") as rownumber ");
    } else {
      addListExpr(buf, select, CTX_ALL, ", ");
    }

    addFrom(buf);
    // Where

    addWhere(buf);
    // Connect By
    if (connectBy != null) { // Add 'Connect By Prior' Expression
      buf.append("\r\nCONNECT BY PRIOR ");
      connectBy.addSQL(buf, CTX_DEFAULT | CTX_NOPARENTHESES);
      // Start With
      if (startWith != null) { // Add 'Start With' Expression
        buf.append("\r\nSTART WITH ");
        startWith.addSQL(buf, CTX_DEFAULT);
      }
    }
    // Grouping
    addGrouping(buf);
    // Order
    if ((skipRows == null) && (limitRows == null)) {
      insertOrderBy(buf);
    } else {
      buf.append(") WHERE (");
      if (skipRows != null) {
        buf.append("rownumber>" + skipRows.toString());
      }

      if (limitRows != null) {
        if (skipRows != null) {
          buf.append(" AND ");
        }
        Integer outputLimit = new Integer(limitRows.intValue());
        if (skipRows != null) {
          outputLimit += skipRows;
        }

        buf.append("rownumber<=" + outputLimit.toString());
      }
      buf.append("\r\n)");
    }
  }
 public PageOutcome getRedirectWithViewParams(String action) {
   PageOutcome outcome = getRedirectWithViewParams();
   if (StringUtils.isNotEmpty(action))
     outcome = outcome.addParam("action", encodeActionParam(action));
   return outcome;
 }
 public PageOutcome getOutcome(String action) {
   PageOutcome outcome = getOutcome();
   if (StringUtils.isNotEmpty(action))
     outcome = outcome.addParam("action", encodeActionParam(action));
   return outcome;
 }