blob: e173693c5cc861691882e6d60b190241cef4103d [file] [log] [blame]
// Copyright 2007, 2008 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.tapestry5.internal.grid;
import org.apache.tapestry5.PropertyConduit;
import org.apache.tapestry5.grid.ColumnSort;
import org.apache.tapestry5.grid.GridDataSource;
import org.apache.tapestry5.grid.SortConstraint;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.ioc.internal.util.Defense;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class CollectionGridDataSource implements GridDataSource
{
private final List list;
@SuppressWarnings("unchecked")
public CollectionGridDataSource(final Collection collection)
{
Defense.notNull(collection, "collection");
// Copy the collection so that we can sort it without disturbing the original
list = CollectionFactory.newList(collection);
}
public int getAvailableRows()
{
return list.size();
}
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);
}
}
/**
* Returns the type of the first element in the list, or null if the list is empty.
*/
public Class getRowType()
{
return list.isEmpty() ? null : list.get(0).getClass();
}
public Object getRowValue(int index)
{
return list.get(index);
}
}