package org.odata4j.core; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.core4j.Enumerable; import org.odata4j.core.OCollection.Builder; import org.odata4j.edm.EdmType; /** * A static factory to create immutable {@link OCollection} instances. */ public class OCollections { /** Starts a new {@link OCollection} builder using a given edm type. */ public static <T extends OObject> OCollection.Builder<T> newBuilder(EdmType type) { return new BuilderImpl<T>(type); } private static class BuilderImpl<T extends OObject> implements OCollection.Builder<T> { private final EdmType type; private final List<T> values = new LinkedList<T>(); BuilderImpl(EdmType type) { this.type = type; } @Override public Builder<T> add(T value) { values.add(value); return this; } @Override public OCollection<T> build() { return new OCollectionImpl<T>(type, values); } } private static class OCollectionImpl<T extends OObject> implements OCollection<T> { private final EdmType type; private final List<T> values; OCollectionImpl(EdmType type, List<T> values) { this.type = type; this.values = values; } @Override public EdmType getType() { return type; } @Override public Iterator<T> iterator() { return values.iterator(); } @Override public int size() { return values.size(); } @Override public String toString() { return String.format("OCollection[%s,%s]", type, Enumerable.create(values).join(",")); } } }