3737import java .util .HashMap ;
3838import java .util .LinkedHashMap ;
3939import java .util .Map ;
40+ import java .util .NavigableMap ;
4041import java .util .Set ;
42+ import java .util .SortedMap ;
4143import java .util .TreeMap ;
4244
4345/**
@@ -64,9 +66,17 @@ protected CopyOnWriteMap() {
6466 update (Collections .emptyMap ());
6567 }
6668
69+ protected Map <K , V > getView () {
70+ return view ;
71+ }
72+
73+ protected Map <K , V > createView () {
74+ return Collections .unmodifiableMap (core );
75+ }
76+
6777 protected void update (Map <K , V > m ) {
6878 core = m ;
69- view = Collections . unmodifiableMap ( core );
79+ view = createView ( );
7080 }
7181
7282 /**
@@ -214,7 +224,7 @@ public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingC
214224 /**
215225 * {@link CopyOnWriteMap} backed by {@link TreeMap}.
216226 */
217- public static final class Tree <K , V > extends CopyOnWriteMap <K , V > {
227+ public static final class Tree <K , V > extends CopyOnWriteMap <K , V > implements SortedMap < K , V > {
218228 private final Comparator <K > comparator ;
219229
220230 public Tree (Map <K , V > core , Comparator <K > comparator ) {
@@ -232,7 +242,7 @@ public Tree() {
232242 }
233243
234244 @ Override
235- protected Map <K , V > copy () {
245+ protected TreeMap <K , V > copy () {
236246 TreeMap <K , V > m = new TreeMap <>(comparator );
237247 m .putAll (core );
238248 return m ;
@@ -243,6 +253,50 @@ public synchronized void clear() {
243253 update (new TreeMap <>(comparator ));
244254 }
245255
256+ @ Override
257+ protected NavigableMap <K , V > createView () {
258+ return Collections .unmodifiableNavigableMap ((NavigableMap <K , V >) core );
259+ }
260+
261+ @ Override
262+ public NavigableMap <K , V > getView () {
263+ return (NavigableMap <K , V >) super .getView ();
264+ }
265+
266+ public NavigableMap <K , V > descendingMap () {
267+ return getView ().descendingMap ();
268+ }
269+
270+ @ Override
271+ public Comparator <? super K > comparator () {
272+ return getView ().comparator ();
273+ }
274+
275+ @ Override
276+ public SortedMap <K , V > subMap (K fromKey , K toKey ) {
277+ return getView ().subMap (fromKey , toKey );
278+ }
279+
280+ @ Override
281+ public SortedMap <K , V > headMap (K toKey ) {
282+ return getView ().headMap (toKey );
283+ }
284+
285+ @ Override
286+ public SortedMap <K , V > tailMap (K fromKey ) {
287+ return getView ().tailMap (fromKey );
288+ }
289+
290+ @ Override
291+ public K firstKey () {
292+ return getView ().firstKey ();
293+ }
294+
295+ @ Override
296+ public K lastKey () {
297+ return getView ().lastKey ();
298+ }
299+
246300 public static class ConverterImpl extends TreeMapConverter {
247301 public ConverterImpl (Mapper mapper ) {
248302 super (mapper );
0 commit comments