/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.rice.core.util.jaxb;
import java.io.Serializable;
import java.util.AbstractList;
import java.util.List;
/**
* Custom subclass of AbstractList that, whenever the "get" method is called, will pass an
* internally-stored list's object to the given listener for conversion into another object matching
* the list's type. This allows for the marshalling process to discard generated items after they
* have been marshalled.
*
* <p>These lists are constructed by passing in another list containing the unconverted items,
* as well as a listener that will create items of this list's type upon each invocation of
* the "get" method.
*
* <p>This is similar to the "streaming" unmarshalling strategy used in the RiceXmlImportList
* class, except that this list has been adapted for marshalling instead.
*
* @param E The type that the list is expected to return.
* @param T The type that the list stores internally and passes to the listener for conversion as needed.
*
* @author Kuali Rice Team (rice.collab@kuali.org)
*/
public final class RiceXmlExportList<E,T> extends AbstractList<E> implements Serializable {
private static final long serialVersionUID = 1L;
private final List<? extends T> sourceList;
private final RiceXmlListGetterListener<E,T> listGetterListener;
/**
* Constructs a new export list that will rely on the given listener for converting the provided
* list's items into the appropriate type.
*
* @param sourceList The list of objects to convert.
* @param listGetterListener The listener to use.
* @throws IllegalArgumentException if sourceList or listGetterListener are null.
*/
public RiceXmlExportList(List<? extends T> sourceList, RiceXmlListGetterListener<E,T> listGetterListener) {
super();
if (sourceList == null) {
throw new IllegalArgumentException("sourceList cannot be null");
} else if (listGetterListener == null) {
throw new IllegalArgumentException("listGetterListener cannot be null");
}
this.sourceList = sourceList;
this.listGetterListener = listGetterListener;
}
/**
* Passes the item at the given index of the internal list to the listener, and then returns
* the listener's result.
*
* @param index The unconverted item's index in the internal list.
* @return The item converted by the listener at the given list index.
*/
@Override
public E get(int index) {
return listGetterListener.gettingNextItem(sourceList.get(index), index);
}
/**
* Returns the size of the internal list.
*
* @return The size of the internal list.
*/
@Override
public int size() {
return sourceList.size();
}
}