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 20 import org.eclipse.core.databinding.beans.IBeanListProperty; 21 import org.eclipse.core.databinding.beans.IBeanMapProperty; 22 import org.eclipse.core.databinding.beans.IBeanSetProperty; 23 import org.eclipse.core.databinding.beans.IBeanValueProperty; 24 import org.eclipse.core.databinding.beans.typed.PojoProperties; 25 import org.eclipse.core.databinding.observable.Realm; 26 import org.eclipse.core.databinding.observable.list.IObservableList; 27 import org.eclipse.core.databinding.observable.map.IObservableMap; 28 import org.eclipse.core.databinding.observable.set.IObservableSet; 29 import org.eclipse.core.databinding.observable.value.IObservableValue; 30 import org.eclipse.core.databinding.property.value.IValueProperty; 31 import org.eclipse.core.databinding.property.value.ValueProperty; 32 33 /** 34 * @param <S> type of the source object 35 * @param <T> type of the value of the property 36 * 37 * @since 3.3 38 * 39 */ 40 public class PojoValuePropertyDecorator<S, T> extends ValueProperty<S, T> implements IBeanValueProperty<S, T> { 41 private final IValueProperty<S, T> delegate; 42 private final PropertyDescriptor propertyDescriptor; 43 44 /** 45 * @param delegate 46 * @param propertyDescriptor 47 */ PojoValuePropertyDecorator(IValueProperty<S, T> delegate, PropertyDescriptor propertyDescriptor)48 public PojoValuePropertyDecorator(IValueProperty<S, T> delegate, PropertyDescriptor propertyDescriptor) { 49 this.delegate = delegate; 50 this.propertyDescriptor = propertyDescriptor; 51 } 52 53 @Override getPropertyDescriptor()54 public PropertyDescriptor getPropertyDescriptor() { 55 return propertyDescriptor; 56 } 57 58 @Override getValueType()59 public Object getValueType() { 60 return delegate.getValueType(); 61 } 62 63 @Override doGetValue(S source)64 protected T doGetValue(S source) { 65 return delegate.getValue(source); 66 } 67 68 @Override doSetValue(S source, T value)69 protected void doSetValue(S source, T value) { 70 delegate.setValue(source, value); 71 } 72 73 @Override value(String propertyName)74 public IBeanValueProperty<S, Object> value(String propertyName) { 75 return value(propertyName, null); 76 } 77 78 @Override value(String propertyName, Class<V> valueType)79 public <V> IBeanValueProperty<S, V> value(String propertyName, Class<V> valueType) { 80 @SuppressWarnings("unchecked") 81 Class<T> beanClass = (Class<T>) delegate.getValueType(); 82 return value(PojoProperties.value(beanClass, propertyName, valueType)); 83 } 84 85 @Override value(IBeanValueProperty<? super T, T2> property)86 public <T2> IBeanValueProperty<S, T2> value(IBeanValueProperty<? super T, T2> property) { 87 return new PojoValuePropertyDecorator<>(super.value(property), property.getPropertyDescriptor()); 88 } 89 90 @Override list(String propertyName)91 public IBeanListProperty<S, Object> list(String propertyName) { 92 return list(propertyName, null); 93 } 94 95 @Override list(String propertyName, Class<E> elementType)96 public <E> IBeanListProperty<S, E> list(String propertyName, Class<E> elementType) { 97 @SuppressWarnings("unchecked") 98 Class<T> beanClass = (Class<T>) delegate.getValueType(); 99 return list(PojoProperties.list(beanClass, propertyName, elementType)); 100 } 101 102 @Override list(IBeanListProperty<? super T, E> property)103 public <E> IBeanListProperty<S, E> list(IBeanListProperty<? super T, E> property) { 104 return new BeanListPropertyDecorator<>(super.list(property), property.getPropertyDescriptor()); 105 } 106 107 @Override set(String propertyName)108 public IBeanSetProperty<S, Object> set(String propertyName) { 109 return set(propertyName, null); 110 } 111 112 @Override set(String propertyName, Class<E> elementType)113 public <E> IBeanSetProperty<S, E> set(String propertyName, Class<E> elementType) { 114 @SuppressWarnings("unchecked") 115 Class<T> beanClass = (Class<T>) delegate.getValueType(); 116 return set(PojoProperties.set(beanClass, propertyName, elementType)); 117 } 118 119 @Override set(IBeanSetProperty<? super T, E> property)120 public <E> IBeanSetProperty<S, E> set(IBeanSetProperty<? super T, E> property) { 121 return new BeanSetPropertyDecorator<>(super.set(property), property.getPropertyDescriptor()); 122 } 123 124 @Override map(String propertyName)125 public IBeanMapProperty<S, Object, Object> map(String propertyName) { 126 return map(propertyName, null, null); 127 } 128 129 @Override map(String propertyName, Class<K> keyType, Class<V> valueType)130 public <K, V> IBeanMapProperty<S, K, V> map(String propertyName, Class<K> keyType, Class<V> valueType) { 131 @SuppressWarnings("unchecked") 132 Class<T> beanClass = (Class<T>) delegate.getValueType(); 133 return map(PojoProperties.map(beanClass, propertyName, keyType, valueType)); 134 } 135 136 @Override map(IBeanMapProperty<? super T, K, V> property)137 public <K, V> IBeanMapProperty<S, K, V> map(IBeanMapProperty<? super T, K, V> property) { 138 return new BeanMapPropertyDecorator<>(super.map(property), property.getPropertyDescriptor()); 139 } 140 141 @Override observe(S source)142 public IObservableValue<T> observe(S source) { 143 return new BeanObservableValueDecorator<>(delegate.observe(source), propertyDescriptor); 144 } 145 146 @Override observe(Realm realm, S source)147 public IObservableValue<T> observe(Realm realm, S source) { 148 return new BeanObservableValueDecorator<>(delegate.observe(realm, source), propertyDescriptor); 149 } 150 151 @Override observeDetail(IObservableValue<M> master)152 public <M extends S> IObservableValue<T> observeDetail(IObservableValue<M> master) { 153 return new BeanObservableValueDecorator<>(delegate.observeDetail(master), propertyDescriptor); 154 } 155 156 @Override observeDetail(IObservableList<M> master)157 public <M extends S> IObservableList<T> observeDetail(IObservableList<M> master) { 158 return new BeanObservableListDecorator<>(delegate.observeDetail(master), propertyDescriptor); 159 } 160 161 @Override observeDetail(IObservableSet<M> master)162 public <M extends S> IObservableMap<M, T> observeDetail(IObservableSet<M> master) { 163 return new BeanObservableMapDecorator<>(delegate.observeDetail(master), propertyDescriptor); 164 } 165 166 @Override observeDetail(IObservableMap<K, V> master)167 public <K, V extends S> IObservableMap<K, T> observeDetail(IObservableMap<K, V> master) { 168 return new BeanObservableMapDecorator<>(delegate.observeDetail(master), propertyDescriptor); 169 } 170 171 @Override toString()172 public String toString() { 173 return delegate.toString(); 174 } 175 } 176