1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.model;
20  
21  import java.util.AbstractList;
22  import java.util.ArrayList;
23  import java.util.List;
24  import java.util.Objects;
25  import java.util.function.Consumer;
26  import java.util.function.Function;
27  import java.util.function.Supplier;
28  
29  class WrapperList<T, U> extends AbstractList<T> {
30      private final Supplier<List<U>> getter;
31      private final Consumer<List<U>> setter;
32      private final Function<U, T> mapper;
33      private final Function<T, U> revMapper;
34  
35      WrapperList(List<U> list, Function<U, T> mapper, Function<T, U> revMapper) {
36          this(() -> list, null, mapper, revMapper);
37      }
38  
39      WrapperList(Supplier<List<U>> getter, Consumer<List<U>> setter, Function<U, T> mapper, Function<T, U> revMapper) {
40          this.getter = getter;
41          this.setter = setter;
42          this.mapper = mapper;
43          this.revMapper = revMapper;
44      }
45  
46      @Override
47      public T get(int index) {
48          return mapper.apply(getter.get().get(index));
49      }
50  
51      @Override
52      public int size() {
53          return getter.get().size();
54      }
55  
56      @Override
57      public boolean add(T t) {
58          Objects.requireNonNull(t);
59          if (setter != null) {
60              List<U> list = new ArrayList<>(getter.get());
61              boolean ret = list.add(revMapper.apply(t));
62              setter.accept(list);
63              return ret;
64          } else {
65              return getter.get().add(revMapper.apply(t));
66          }
67      }
68  
69      @Override
70      public T set(int index, T element) {
71          Objects.requireNonNull(element);
72          if (setter != null) {
73              List<U> list = new ArrayList<>(getter.get());
74              U ret = list.set(index, revMapper.apply(element));
75              setter.accept(list);
76              return mapper.apply(ret);
77          } else {
78              return mapper.apply(getter.get().set(index, revMapper.apply(element)));
79          }
80      }
81  
82      @Override
83      public void add(int index, T element) {
84          Objects.requireNonNull(element);
85          if (setter != null) {
86              List<U> list = new ArrayList<>(getter.get());
87              list.add(index, revMapper.apply(element));
88              setter.accept(list);
89          } else {
90              getter.get().add(index, revMapper.apply(element));
91          }
92      }
93  
94      @Override
95      public T remove(int index) {
96          if (setter != null) {
97              List<U> list = new ArrayList<>(getter.get());
98              U ret = list.remove(index);
99              setter.accept(list);
100             return mapper.apply(ret);
101         } else {
102             return mapper.apply(getter.get().remove(index));
103         }
104     }
105 }