/* * Copyright (C) 2014 The Android Open Source Project * * 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 com.android.build.gradle.internal.api; import com.android.annotations.NonNull; import com.android.builder.model.ProductFlavor; import java.lang.reflect.Array; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; /** * Implementation of List that create read-only ProductFlavor on the fly as they are * queried. The list itself is immutable. */ public class ImmutableFlavorList implements List<ProductFlavor> { @NonNull private final List<? extends ProductFlavor> list; @NonNull private final ReadOnlyObjectProvider immutableObjectProvider; ImmutableFlavorList( @NonNull List<? extends ProductFlavor> list, @NonNull ReadOnlyObjectProvider immutableObjectProvider) { this.list = list; this.immutableObjectProvider = immutableObjectProvider; } @Override public int size() { return list.size(); } @Override public boolean isEmpty() { return list.isEmpty(); } @Override public boolean contains(Object o) { return list.contains(o); } @NonNull @Override public Iterator<ProductFlavor> iterator() { final Iterator<? extends ProductFlavor> baseIterator = list.iterator(); return new Iterator<ProductFlavor>() { @Override public boolean hasNext() { return baseIterator.hasNext(); } @Override public ProductFlavor next() { return immutableObjectProvider.getProductFlavor(baseIterator.next()); } @Override public void remove() { throw new UnsupportedOperationException(); } }; } @NonNull @Override public Object[] toArray() { final int count = list.size(); Object[] array = new Object[list.size()]; for (int i = 0 ; i < count ; i++) { array[i] = immutableObjectProvider.getProductFlavor(list.get(i)); } return array; } @NonNull @Override public <T> T[] toArray(@NonNull T[] array) { final int count = list.size(); if (array.length < count) { //noinspection unchecked array = (T[]) Array.newInstance(array.getClass().getComponentType(), count); } for (int i = 0 ; i < count ; i++) { //noinspection unchecked array[i] = (T) immutableObjectProvider.getProductFlavor(list.get(i)); } for (int i = count ; i < array.length; i++) { array[i] = null; } return array; } @Override public boolean add(ProductFlavor e) { throw new UnsupportedOperationException(); } @Override public boolean remove(Object o) { throw new UnsupportedOperationException(); } @Override public boolean containsAll(@NonNull Collection<?> objects) { return list.containsAll(objects); } @Override public boolean addAll(@NonNull Collection<? extends ProductFlavor> es) { throw new UnsupportedOperationException(); } @Override public boolean addAll(int i, @NonNull Collection<? extends ProductFlavor> es) { throw new UnsupportedOperationException(); } @Override public boolean removeAll(@NonNull Collection<?> objects) { throw new UnsupportedOperationException(); } @Override public boolean retainAll(@NonNull Collection<?> objects) { throw new UnsupportedOperationException(); } @Override public void clear() { throw new UnsupportedOperationException(); } @Override public ProductFlavor get(int i) { ProductFlavor gpf = list.get(i); return immutableObjectProvider.getProductFlavor(gpf); } @Override public ProductFlavor set(int i, ProductFlavor e) { throw new UnsupportedOperationException(); } @Override public void add(int i, ProductFlavor e) { throw new UnsupportedOperationException(); } @Override public ProductFlavor remove(int i) { throw new UnsupportedOperationException(); } @Override public int indexOf(Object o) { if (o instanceof ReadOnlyProductFlavor) { return list.indexOf(((ReadOnlyProductFlavor) o).productFlavor); } return list.indexOf(o); } @Override public int lastIndexOf(Object o) { if (o instanceof ReadOnlyProductFlavor) { return list.lastIndexOf(((ReadOnlyProductFlavor) o).productFlavor); } return list.lastIndexOf(o); } @NonNull @Override public ListIterator<ProductFlavor> listIterator() { final ListIterator<? extends ProductFlavor> baseIterator = list.listIterator(); return new ListIterator<ProductFlavor>() { @Override public boolean hasNext() { return baseIterator.hasNext(); } @Override public ProductFlavor next() { return immutableObjectProvider.getProductFlavor(baseIterator.next()); } @Override public boolean hasPrevious() { return baseIterator.hasPrevious(); } @Override public ProductFlavor previous() { return immutableObjectProvider.getProductFlavor(baseIterator.previous()); } @Override public int nextIndex() { return baseIterator.nextIndex(); } @Override public int previousIndex() { return baseIterator.previousIndex(); } @Override public void remove() { throw new UnsupportedOperationException(); } @Override public void set(ProductFlavor productFlavor) { throw new UnsupportedOperationException(); } @Override public void add(ProductFlavor productFlavor) { throw new UnsupportedOperationException(); } }; } @NonNull @Override public ListIterator<ProductFlavor> listIterator(int i) { final ListIterator<? extends ProductFlavor> baseIterator = list.listIterator(i); return new ListIterator<ProductFlavor>() { @Override public boolean hasNext() { return baseIterator.hasNext(); } @Override public ProductFlavor next() { return immutableObjectProvider.getProductFlavor(baseIterator.next()); } @Override public boolean hasPrevious() { return baseIterator.hasPrevious(); } @Override public ProductFlavor previous() { return immutableObjectProvider.getProductFlavor(baseIterator.previous()); } @Override public int nextIndex() { return baseIterator.nextIndex(); } @Override public int previousIndex() { return baseIterator.previousIndex(); } @Override public void remove() { throw new UnsupportedOperationException(); } @Override public void set(ProductFlavor productFlavor) { throw new UnsupportedOperationException(); } @Override public void add(ProductFlavor productFlavor) { throw new UnsupportedOperationException(); } }; } @NonNull @Override public List<ProductFlavor> subList(int i, int i2) { throw new UnsupportedOperationException(); } }