001: /*
002: * $Id: DataViewBase.java 459915 2006-03-21 00:46:35Z jonl $ $Revision: 459915 $
003: * $Date: 2006-03-21 01:46:35 +0100 (Tue, 21 Mar 2006) $
004: *
005: * ==================================================================== Licensed
006: * under the Apache License, Version 2.0 (the "License"); you may not use this
007: * file except in compliance with the License. You may obtain a copy of the
008: * License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
014: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
015: * License for the specific language governing permissions and limitations under
016: * the License.
017: */
018: package wicket.extensions.markup.html.repeater.data;
019:
020: import java.util.Iterator;
021:
022: import wicket.extensions.markup.html.repeater.pageable.AbstractPageableView;
023: import wicket.extensions.markup.html.repeater.refreshing.RefreshingView;
024: import wicket.markup.html.navigation.paging.IPageable;
025: import wicket.model.IDetachable;
026:
027: /**
028: * Base class for data views.
029: *
030: * Data views aim to make it very simple to populate your repeating view from a
031: * database by utilizing {@link IDataProvider} to act as an interface between
032: * the database and the dataview.
033: *
034: * @see IDataProvider
035: * @see DataView
036: * @see IPageable
037: * @see RefreshingView
038: *
039: * @author Igor Vaynberg (ivaynberg)
040: *
041: */
042: public abstract class DataViewBase extends AbstractPageableView {
043: private IDataProvider dataProvider;
044:
045: /**
046: * @param id
047: * component id
048: * @param dataProvider
049: * data provider
050: */
051: public DataViewBase(String id, IDataProvider dataProvider) {
052: super (id);
053: if (dataProvider == null) {
054: throw new IllegalArgumentException(
055: "argument [dataProvider] cannot be null");
056: }
057: this .dataProvider = dataProvider;
058: }
059:
060: /**
061: * @return data provider associated with this view
062: */
063: protected final IDataProvider internalGetDataProvider() {
064: return dataProvider;
065: }
066:
067: protected final Iterator getItemModels(int offset, int count) {
068: return new ModelIterator(internalGetDataProvider(), offset,
069: count);
070: }
071:
072: /**
073: * Helper class that converts input from IDataProvider to an iterator over
074: * view items.
075: *
076: * @author Igor Vaynberg (ivaynberg)
077: *
078: */
079: private static final class ModelIterator implements Iterator {
080: private Iterator items;
081: private IDataProvider dataProvider;
082: private int max;
083: private int index;
084:
085: /**
086: * Constructor
087: *
088: * @param dataProvider
089: * data provider
090: * @param offset
091: * index of first item
092: * @param count
093: * max number of items to return
094: */
095: public ModelIterator(IDataProvider dataProvider, int offset,
096: int count) {
097: this .items = dataProvider.iterator(offset, count);
098: this .dataProvider = dataProvider;
099: this .max = count;
100: }
101:
102: /**
103: * @see java.util.Iterator#remove()
104: */
105: public void remove() {
106: throw new UnsupportedOperationException();
107: }
108:
109: /**
110: * @see java.util.Iterator#hasNext()
111: */
112: public boolean hasNext() {
113: return items.hasNext() && (index < max);
114: }
115:
116: /**
117: * @see java.util.Iterator#next()
118: */
119: public Object next() {
120: index++;
121: return dataProvider.model(items.next());
122: }
123: }
124:
125: protected final int internalGetItemCount() {
126: return internalGetDataProvider().size();
127: }
128:
129: protected void onDetach() {
130: super .onDetach();
131: if (dataProvider instanceof IDetachable) {
132: ((IDetachable) dataProvider).detach();
133: }
134: }
135: }
|