package org.cagrid.core.resource; import java.util.Iterator; import javax.xml.soap.SOAPElement; import org.cagrid.wsrf.properties.ResourceProperty; import org.cagrid.wsrf.properties.ResourcePropertyMetaData; import org.w3c.dom.Element; public abstract class AbstractResourceProperty<T> implements ResourceProperty<T> { protected final Class<?> resourcePropertyClass; protected final ResourcePropertyMetaData<T> resourcePropertyMetaData; protected AbstractResourceProperty( ResourcePropertyDescriptor<T> resourcePropertyDescriptor) { resourcePropertyClass = resourcePropertyDescriptor .getResourcePropertyClass(); resourcePropertyMetaData = createMetaData(resourcePropertyDescriptor); } @Override public abstract T get(int index); @Override public Iterator<T> iterator() { return new PropertyIterator<T>(this); } @Override public SOAPElement[] toSOAPElements() { // TODO Auto-generated method stub return null; } @Override public Element[] toElements() { // TODO Auto-generated method stub return null; } @Override public ResourcePropertyMetaData<T> getMetaData() { return resourcePropertyMetaData; } protected abstract ResourcePropertyMetaData<T> createMetaData( ResourcePropertyDescriptor<T> resourcePropertyDescriptor); protected final T checkPropertyType(Object property, String operation) { if (!resourcePropertyClass.isInstance(property)) { String argumentClassName = (property != null) ? property.getClass() .getName() : "null"; throw new IllegalArgumentException(operation + " expected " + resourcePropertyClass.getName() + ", was " + argumentClassName); } @SuppressWarnings("unchecked") T t = (T) property; return t; } protected static class PropertyIterator<T> implements Iterator<T> { private final AbstractResourceProperty<T> resourceProperty; private int nextIndex = 0; private T currentValue = null; public PropertyIterator(AbstractResourceProperty<T> resourceProperty) { this.resourceProperty = resourceProperty; } @Override public boolean hasNext() { return (nextIndex < resourceProperty.size()); } @Override public T next() { currentValue = resourceProperty.get(nextIndex++); return currentValue; } @Override public void remove() { resourceProperty.remove(currentValue); } } }