001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.collections4.list;
018
019import java.util.Collection;
020import java.util.Iterator;
021import java.util.List;
022import java.util.ListIterator;
023import java.util.function.Predicate;
024
025import org.apache.commons.collections4.Unmodifiable;
026import org.apache.commons.collections4.iterators.UnmodifiableIterator;
027import org.apache.commons.collections4.iterators.UnmodifiableListIterator;
028
029/**
030 * Decorates another {@code List} to ensure it can't be altered.
031 * <p>
032 * This class is Serializable from Commons Collections 3.1.
033 * </p>
034 * <p>
035 * Attempts to modify it will result in an UnsupportedOperationException.
036 * </p>
037 *
038 * @since 3.0
039 */
040public final class UnmodifiableList<E>
041        extends AbstractSerializableListDecorator<E>
042        implements Unmodifiable {
043
044    /** Serialization version */
045    private static final long serialVersionUID = 6595182819922443652L;
046
047    /**
048     * Factory method to create an unmodifiable list.
049     *
050     * @param <E> the type of the elements in the list
051     * @param list  the list to decorate, must not be null
052     * @return a new unmodifiable list
053     * @throws NullPointerException if list is null
054     * @since 4.0
055     */
056    public static <E> List<E> unmodifiableList(final List<? extends E> list) {
057        if (list instanceof Unmodifiable) {
058            @SuppressWarnings("unchecked") // safe to upcast
059            final List<E> tmpList = (List<E>) list;
060            return tmpList;
061        }
062        return new UnmodifiableList<>(list);
063    }
064
065    /**
066     * Constructor that wraps (not copies).
067     *
068     * @param list  the list to decorate, must not be null
069     * @throws NullPointerException if list is null
070     */
071    @SuppressWarnings("unchecked") // safe to upcast
072    public UnmodifiableList(final List<? extends E> list) {
073        super((List<E>) list);
074    }
075
076    @Override
077    public void add(final int index, final E object) {
078        throw new UnsupportedOperationException();
079    }
080
081    @Override
082    public boolean add(final Object object) {
083        throw new UnsupportedOperationException();
084    }
085
086    @Override
087    public boolean addAll(final Collection<? extends E> coll) {
088        throw new UnsupportedOperationException();
089    }
090
091    @Override
092    public boolean addAll(final int index, final Collection<? extends E> coll) {
093        throw new UnsupportedOperationException();
094    }
095
096    @Override
097    public void clear() {
098        throw new UnsupportedOperationException();
099    }
100
101    @Override
102    public Iterator<E> iterator() {
103        return UnmodifiableIterator.unmodifiableIterator(decorated().iterator());
104    }
105
106    @Override
107    public ListIterator<E> listIterator() {
108        return UnmodifiableListIterator.unmodifiableListIterator(decorated().listIterator());
109    }
110
111    @Override
112    public ListIterator<E> listIterator(final int index) {
113        return UnmodifiableListIterator.unmodifiableListIterator(decorated().listIterator(index));
114    }
115
116    @Override
117    public E remove(final int index) {
118        throw new UnsupportedOperationException();
119    }
120
121    @Override
122    public boolean remove(final Object object) {
123        throw new UnsupportedOperationException();
124    }
125
126    @Override
127    public boolean removeAll(final Collection<?> coll) {
128        throw new UnsupportedOperationException();
129    }
130
131    /**
132     * @since 4.4
133     */
134    @Override
135    public boolean removeIf(final Predicate<? super E> filter) {
136        throw new UnsupportedOperationException();
137    }
138
139    @Override
140    public boolean retainAll(final Collection<?> coll) {
141        throw new UnsupportedOperationException();
142    }
143
144    @Override
145    public E set(final int index, final E object) {
146        throw new UnsupportedOperationException();
147    }
148
149    @Override
150    public List<E> subList(final int fromIndex, final int toIndex) {
151        final List<E> sub = decorated().subList(fromIndex, toIndex);
152        return new UnmodifiableList<>(sub);
153    }
154
155}