Esempio n. 1
0
  /**
   * Adds the current header to the table model calling addColumn in the parent table tag. This
   * method should be called only at first iteration.
   *
   * @param tableTag parent table tag
   * @throws DecoratorInstantiationException for error during column decorator instantiation
   * @throws ObjectLookupException for errors in looking up values
   */
  private void addHeaderToTable(TableTag tableTag)
      throws DecoratorInstantiationException, ObjectLookupException {
    // don't modify "title" directly
    String evalTitle = this.title;

    // title has precedence over titleKey
    if (evalTitle == null && (this.titleKey != null || this.property != null)) {
      // handle title i18n
      evalTitle =
          tableTag
              .getProperties()
              .geResourceProvider()
              .getResource(this.titleKey, this.property, tableTag, this.pageContext);
    }

    HeaderCell headerCell = new HeaderCell();
    headerCell.setHeaderAttributes((HtmlAttributeMap) this.headerAttributeMap.clone());
    headerCell.setHtmlAttributes((HtmlAttributeMap) this.attributeMap.clone());
    headerCell.setTitle(evalTitle);
    headerCell.setSortable(this.sortable);

    List<DisplaytagColumnDecorator> decorators = new ArrayList<DisplaytagColumnDecorator>();

    // handle multiple chained decorators, whitespace separated
    if (StringUtils.isNotEmpty(this.decorator)) {
      String[] decoratorNames = StringUtils.split(this.decorator);
      for (int j = 0; j < decoratorNames.length; j++) {
        decorators.add(
            tableTag
                .getProperties()
                .getDecoratorFactoryInstance()
                .loadColumnDecorator(this.pageContext, decoratorNames[j]));
      }
    }

    // "special" decorators
    if (this.escapeXml) {
      decorators.add(EscapeXmlColumnDecorator.INSTANCE);
    }
    if (this.autolink) {
      decorators.add(AutolinkColumnDecorator.INSTANCE);
    }
    if (StringUtils.isNotBlank(this.format)) {
      decorators.add(
          new MessageFormatColumnDecorator(this.format, tableTag.getProperties().getLocale()));
    }

    headerCell.setColumnDecorators(
        decorators.toArray(new DisplaytagColumnDecorator[decorators.size()]));

    headerCell.setBeanPropertyName(this.property);
    headerCell.setShowNulls(this.nulls);
    headerCell.setMaxLength(this.maxLength);
    headerCell.setMaxWords(this.maxWords);
    headerCell.setGroup(this.group);
    headerCell.setSortProperty(this.sortProperty);
    headerCell.setTotaled(this.totaled);

    Comparator<Object> headerComparator =
        (comparator != null) ? comparator : tableTag.getProperties().getDefaultComparator();

    headerCell.setComparator(headerComparator);
    headerCell.setDefaultSortOrder(this.defaultorder);
    headerCell.setSortName(this.sortName);

    // href and parameter, create link
    if (this.href != null) {
      Href colHref;

      // empty base url, use href with parameters from parent table
      if (StringUtils.isEmpty(this.href.getBaseUrl())) {
        colHref = (Href) tableTag.getBaseHref().clone();
      } else {
        colHref = (Href) this.href.clone();
      }

      if (this.paramId != null) {
        // parameter value is in a different object than the iterated one
        if (this.paramName != null || this.paramScope != null) {
          // create a complete string for compatibility with previous version before expression
          // evaluation.
          // this approach is optimized for new expressions, not for previous property/scope
          // parameters
          StringBuffer expression = new StringBuffer();

          // append scope
          if (StringUtils.isNotBlank(this.paramScope)) {
            expression.append(this.paramScope).append("Scope.");
          }

          // base bean name
          if (this.paramId != null) {
            expression.append(this.paramName);
          } else {
            expression.append(tableTag.getName());
          }

          // append property
          if (StringUtils.isNotBlank(this.paramProperty)) {
            expression.append('.').append(this.paramProperty);
          }

          // evaluate expression.
          // note the value is fixed, not based on any object created during iteration
          // this is here for compatibility with the old version mainly
          Object paramValue = tableTag.evaluateExpression(expression.toString());

          // add parameter
          colHref.addParameter(this.paramId, paramValue);
        } else {
          // set id
          headerCell.setParamName(this.paramId);

          // set property
          headerCell.setParamProperty(this.paramProperty);
        }
      }

      // sets the base href
      headerCell.setHref(colHref);
    }

    tableTag.addColumn(headerCell);

    if (log.isDebugEnabled()) {
      log.debug("columnTag.addHeaderToTable() :: first iteration - adding header " + headerCell);
    }
  }