1 /******************************************************************************* 2 * Copyright (c) 2008, 2015 Matthew Hall and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * Matthew Hall - initial API and implementation (bug 195222) 13 * Matthew Hall - bug 264307 14 ******************************************************************************/ 15 16 package org.eclipse.core.internal.databinding.beans; 17 18 import java.beans.PropertyDescriptor; 19 import java.util.Map; 20 21 import org.eclipse.core.databinding.beans.IBeanMapProperty; 22 import org.eclipse.core.databinding.beans.IBeanValueProperty; 23 import org.eclipse.core.databinding.beans.typed.PojoProperties; 24 import org.eclipse.core.databinding.observable.Realm; 25 import org.eclipse.core.databinding.observable.map.IObservableMap; 26 import org.eclipse.core.databinding.observable.map.MapDiff; 27 import org.eclipse.core.databinding.observable.value.IObservableValue; 28 import org.eclipse.core.databinding.property.map.IMapProperty; 29 import org.eclipse.core.databinding.property.map.MapProperty; 30 31 /** 32 * @param <S> type of the source object 33 * @param <K> type of the keys to the map 34 * @param <V> type of the values in the map 35 * 36 * @since 3.3 37 * 38 */ 39 public class PojoMapPropertyDecorator<S, K, V> extends MapProperty<S, K, V> implements IBeanMapProperty<S, K, V> { 40 private final IMapProperty<S, K, V> delegate; 41 private final PropertyDescriptor propertyDescriptor; 42 43 /** 44 * @param delegate 45 * @param propertyDescriptor 46 */ PojoMapPropertyDecorator(IMapProperty<S, K, V> delegate, PropertyDescriptor propertyDescriptor)47 public PojoMapPropertyDecorator(IMapProperty<S, K, V> delegate, PropertyDescriptor propertyDescriptor) { 48 this.delegate = delegate; 49 this.propertyDescriptor = propertyDescriptor; 50 } 51 52 @Override getKeyType()53 public Object getKeyType() { 54 return delegate.getKeyType(); 55 } 56 57 @Override getValueType()58 public Object getValueType() { 59 return delegate.getValueType(); 60 } 61 62 @Override doGetMap(S source)63 protected Map<K, V> doGetMap(S source) { 64 return delegate.getMap(source); 65 } 66 67 @Override doSetMap(S source, Map<K, V> map)68 protected void doSetMap(S source, Map<K, V> map) { 69 delegate.setMap(source, map); 70 } 71 72 @Override doUpdateMap(S source, MapDiff<K, V> diff)73 protected void doUpdateMap(S source, MapDiff<K, V> diff) { 74 delegate.updateMap(source, diff); 75 } 76 77 @Override getPropertyDescriptor()78 public PropertyDescriptor getPropertyDescriptor() { 79 return propertyDescriptor; 80 } 81 82 @Override values(String propertyName)83 public <V2> IBeanMapProperty<S, K, V2> values(String propertyName) { 84 return values(propertyName, null); 85 } 86 87 @Override values(String propertyName, Class<V2> valueType)88 public <V2> IBeanMapProperty<S, K, V2> values(String propertyName, Class<V2> valueType) { 89 @SuppressWarnings("unchecked") 90 Class<V> beanClass = (Class<V>) delegate.getValueType(); 91 return values(PojoProperties.value(beanClass, propertyName, valueType)); 92 } 93 94 @Override values(IBeanValueProperty<? super V, V2> property)95 public <V2> IBeanMapProperty<S, K, V2> values(IBeanValueProperty<? super V, V2> property) { 96 return new PojoMapPropertyDecorator<>(super.values(property), property.getPropertyDescriptor()); 97 } 98 99 @Override observe(S source)100 public IObservableMap<K, V> observe(S source) { 101 return new BeanObservableMapDecorator<>(delegate.observe(source), propertyDescriptor); 102 } 103 104 @Override observe(Realm realm, S source)105 public IObservableMap<K, V> observe(Realm realm, S source) { 106 return new BeanObservableMapDecorator<>(delegate.observe(realm, source), propertyDescriptor); 107 } 108 109 @Override observeDetail(IObservableValue<U> master)110 public <U extends S> IObservableMap<K, V> observeDetail(IObservableValue<U> master) { 111 return new BeanObservableMapDecorator<>(delegate.observeDetail(master), propertyDescriptor); 112 } 113 114 @Override toString()115 public String toString() { 116 return delegate.toString(); 117 } 118 } 119