/* * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package com.sun.javafx.collections; import java.util.AbstractMap; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import javafx.beans.InvalidationListener; import javafx.collections.MapChangeListener; import javafx.collections.MapChangeListener.Change; import javafx.collections.ObservableMap; import javafx.collections.WeakMapChangeListener; import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection; /** * ObservableMap wrapper that does not allow changes to the underlying container. */ public class UnmodifiableObservableMap extends AbstractMap implements javafx.collections.ObservableMap { private MapListenerHelper listenerHelper; private final ObservableMap backingMap; private final MapChangeListener listener; private Set keyset; private Collection values; private Set> entryset; public UnmodifiableObservableMap(ObservableMap map) { this.backingMap = map; listener = c -> { callObservers(new MapAdapterChange(UnmodifiableObservableMap.this, c)); }; this.backingMap.addListener(new WeakMapChangeListener(listener)); } private void callObservers(Change c) { MapListenerHelper.fireValueChangedEvent(listenerHelper, c); } @Override public void addListener(InvalidationListener listener) { listenerHelper = MapListenerHelper.addListener(listenerHelper, listener); } @Override public void removeListener(InvalidationListener listener) { listenerHelper = MapListenerHelper.removeListener(listenerHelper, listener); } @Override public void addListener(MapChangeListener observer) { listenerHelper = MapListenerHelper.addListener(listenerHelper, observer); } @Override public void removeListener(MapChangeListener observer) { listenerHelper = MapListenerHelper.removeListener(listenerHelper, observer); } @Override public int size() { return backingMap.size(); } @Override public boolean isEmpty() { return backingMap.isEmpty(); } @Override public boolean containsKey(Object key) { return backingMap.containsKey(key); } @Override public boolean containsValue(Object value) { return backingMap.containsValue(value); } @Override public V get(Object key) { return backingMap.get(key); } @Override @ReturnsUnmodifiableCollection public Set keySet() { if (keyset == null) { keyset = Collections.unmodifiableSet(backingMap.keySet()); } return keyset; } @Override @ReturnsUnmodifiableCollection public Collection values() { if (values == null) { values = Collections.unmodifiableCollection(backingMap.values()); } return values; } @Override @ReturnsUnmodifiableCollection public Set> entrySet() { if (entryset == null) { entryset = Collections.unmodifiableMap(backingMap).entrySet(); } return entryset; } }