0

タペストリーチュートリアルからタペストリーを学ぼうとしていますが、その一部が古くなっています。

そのためのGridDataSourceコードの使用は次のとおりです。

package com.packtpub.celebrities.util;
import com.packtpub.celebrities.data.IDataSource;
import com.packtpub.celebrities.model.Celebrity;
import java.util.List;
import org.apache.tapestry.beaneditor.PropertyModel;
import org.apache.tapestry.grid.GridDataSource;

public class CelebritySource implements GridDataSource {
  private IDataSource dataSource;
  private List<Celebrity> selection;
  private int indexFrom;

  public CelebritySource(IDataSource ds) {
    this.dataSource = ds;
  }

  public int getAvailableRows() {
    return dataSource.getAllCelebrities().size();
  }

  public void prepare(int indexFrom, int indexTo, PropertyModel propertyModel, boolean ascending) {
    String propertyName = propertyModel == null ? null : propertyModel.getPropertyName();

    System.out.println("Preparing selection.");
    System.out.println("Index from " + indexFrom + " to " + indexTo);        
    System.out.println("Property name is: " + propertyName);
    System.out.println("Sorting order ascending: " + ascending);

    this.selection = dataSource.getRange(indexFrom, indexTo);
    this.indexFrom = indexFrom;
  }

  public Object getRowValue(int i) {
    System.out.println("Getting value for row " + i);
    return selection.get(i - this.indexFrom);
  }

  public Class getRowType() {
    return Celebrity.class;
  }
}

メソッド実装の準備が変更され、次のようになりました

public void prepare(int startIndex, int endIndex, List<SortConstraint> sortConstraints) {}

新しいメソッドの実装を示すgoogle.comの数少ない例の1つは次のとおりです。

public void prepare(int startIndex, int endIndex, List<SortConstraint> sortConstraints) {
  for (SortConstraint constraint : sortConstraints) {
    final ColumnSort sort = constraint.getColumnSort();

    if (sort == ColumnSort.UNSORTED) continue;

    final PropertyConduit conduit = constraint.getPropertyModel().getConduit();

    final Comparator valueComparator = new Comparator<Comparable>() {
      public int compare(Comparable o1, Comparable o2) {
        // Simplify comparison, and handle case where both are nulls.
        if (o1 == o2) return 0;
        if (o2 == null) return 1;
        if (o1 == null) return -1;
        return o1.compareTo(o2);
      }
    };

    final Comparator rowComparator = new Comparator() {
      public int compare(Object row1, Object row2) {
        Comparable value1 = (Comparable) conduit.get(row1);
        Comparable value2 = (Comparable) conduit.get(row2);
        return valueComparator.compare(value1, value2);
      }
    };

    final Comparator reverseComparator = new Comparator() {
      public int compare(Object o1, Object o2) {
        int modifier = sort == ColumnSort.ASCENDING ? 1 : -1;
        return modifier * rowComparator.compare(o1, o2);
      }
    };

    // We can freely sort this list because its just a copy.
    Collections.sort(_list, reverseComparator);
  }
}

現在のprepareメソッドを使用して古いコード作業の機能を作成する方法はありますか?

public void prepare(int startIndex, int endIndex, List<SortConstraint> sortConstraints) {}

また、この問題に対する他の解決策をいただければ幸いです。

4

1 に答える 1

1

古いprepare()方法では1つの基準でしか並べ替えることができませんが、新しいprepare()方法では多くの基準で並べ替えることができます。(つまり、2次ソートを指定できます。)

propertyModelと昇順/降順の列挙型がオブジェクトに保持されるようになりましたがSortConstraint、コードを見ると、そのどれも使用されていません。したがって、例を機能させるには、次のことを試してください。

public void prepare(int startIndex, int endIndex, List<SortConstraint> sortConstraints) {
  this.selection = dataSource.getRange(startIndex, endIndex);
  this.indexFrom = startIndex;
}

properyModel(デバッグ用に)必要な場合は、次の場所からアクセスできる必要があります。

PropertyModel propertyModel = sortConstraints.get(0).getPropertyModel();
于 2012-09-01T11:16:11.430 に答える