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