diff options
4 files changed, 121 insertions, 13 deletions
diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Pane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Pane.java index 4081b35ae9..ce0a8067dd 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Pane.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Pane.java @@ -306,7 +306,7 @@ public abstract class Pane<T extends Model> { /** * Convenience method for sub-classes. - * Wrap the pane's {@link #subjectModel} in a {@link #buildIsNotNullModel(PropertyValueModel)}; + * Wrap the pane's {@link #subjectModel} in a {@link PropertyValueModelTools#valueIsNotNull(PropertyValueModel)}; * i.e. a model that returns whether the subject is <code>null</code>. */ protected PropertyValueModel<Boolean> buildSubjectIsNotNullModel() { diff --git a/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/PropertyValueModelTools.java b/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/PropertyValueModelTools.java index 877af5f51a..f8de8fc4e4 100644 --- a/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/PropertyValueModelTools.java +++ b/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/PropertyValueModelTools.java @@ -31,7 +31,7 @@ public final class PropertyValueModelTools { * is <code>null</code>. */ public static PropertyValueModel<Boolean> valueIsNull(PropertyValueModel<?> propertyModel) { - return valueIsInSet(propertyModel, PredicateTools.isNull()); + return valueIsInSet_(propertyModel, PredicateTools.isNull()); } /** @@ -40,7 +40,7 @@ public final class PropertyValueModelTools { * is <em>not</em> <code>null</code>. */ public static PropertyValueModel<Boolean> valueIsNotNull(PropertyValueModel<?> propertyModel) { - return valueIsInSet(propertyModel, PredicateTools.isNotNull()); + return valueIsInSet_(propertyModel, PredicateTools.isNotNull()); } /** @@ -49,7 +49,7 @@ public final class PropertyValueModelTools { * equals the specified value. */ public static PropertyValueModel<Boolean> valueEquals(PropertyValueModel<?> propertyModel, Object value) { - return valueIsInSet(propertyModel, PredicateTools.isEqual(value)); + return valueIsInSet_(propertyModel, PredicateTools.isEqual(value)); } /** @@ -58,7 +58,7 @@ public final class PropertyValueModelTools { * does <em>not</em> equal the specified value. */ public static PropertyValueModel<Boolean> valueNotEquals(PropertyValueModel<?> propertyModel, Object value) { - return valueIsInSet(propertyModel, PredicateTools.isNotEqual(value)); + return valueIsInSet_(propertyModel, PredicateTools.isNotEqual(value)); } /** @@ -67,7 +67,7 @@ public final class PropertyValueModelTools { * is <em>identical</em> to the specified value. */ public static PropertyValueModel<Boolean> valueIsIdentical(PropertyValueModel<?> propertyModel, Object value) { - return valueIsInSet(propertyModel, PredicateTools.isIdentical(value)); + return valueIsInSet_(propertyModel, PredicateTools.isIdentical(value)); } /** @@ -76,16 +76,52 @@ public final class PropertyValueModelTools { * is <em>not identical</em> to the specified value. */ public static PropertyValueModel<Boolean> valueIsNotIdentical(PropertyValueModel<?> propertyModel, Object value) { - return valueIsInSet(propertyModel, PredicateTools.isNotIdentical(value)); + return valueIsInSet_(propertyModel, PredicateTools.isNotIdentical(value)); } /** * Construct a property value model adapter for the specified * property value model that returns whether the property's value * is in the set defined by the specified predicate. + * <p> + * <strong>NB:</strong> If specified model's value is <code>null</code>, + * the returned model's value will also be a <code>null</code> + * {@link Boolean}; and the value will never be passed to the specified + * predicate. + * @see #valueIsInSet_(PropertyValueModel, Predicate) + * @see #valueIsInSet(PropertyValueModel, Predicate, Boolean) */ public static <V> PropertyValueModel<Boolean> valueIsInSet(PropertyValueModel<? extends V> propertyModel, Predicate<? super V> predicate) { - return transform(propertyModel, TransformerTools.adapt(predicate)); + return valueIsInSet(propertyModel, predicate, null); + } + + /** + * Construct a property value model adapter for the specified + * property value model that returns whether the property's value + * is in the set defined by the specified predicate. + * <p> + * <strong>NB:</strong> If specified model's value is <code>null</code>, + * the returned model's value will be the specified null result; + * and the value will never be passed to the specified predicate. + * @see #valueIsInSet(PropertyValueModel, Predicate) + * @see #valueIsInSet_(PropertyValueModel, Predicate) + */ + public static <V> PropertyValueModel<Boolean> valueIsInSet(PropertyValueModel<? extends V> propertyModel, Predicate<? super V> predicate, Boolean nullResult) { + return transform_(propertyModel, TransformerTools.adapt(predicate, nullResult)); + } + + /** + * Construct a property value model adapter for the specified + * property value model that returns whether the property's value + * is in the set defined by the specified predicate. + * <p> + * <strong>NB:</strong> The specified predicate must be able to + * handle a <code>null</code> variable. + * @see #valueIsInSet(PropertyValueModel, Predicate) + * @see #valueIsInSet(PropertyValueModel, Predicate, Boolean) + */ + public static <V> PropertyValueModel<Boolean> valueIsInSet_(PropertyValueModel<? extends V> propertyModel, Predicate<? super V> predicate) { + return transform_(propertyModel, TransformerTools.adapt(predicate)); } @@ -155,7 +191,7 @@ public final class PropertyValueModelTools { * @see PluggablePropertyValueModel */ public static <V> PropertyValueModel<V> nullCheck(PropertyValueModel<? extends V> propertyModel, V nullValue) { - return transform(propertyModel, TransformerTools.nullCheck(nullValue)); + return transform_(propertyModel, TransformerTools.nullCheck(nullValue)); } @@ -165,6 +201,9 @@ public final class PropertyValueModelTools { * Construct a property value model that wraps the specified * property value model and transforms its value with the specified * transformer. + * <p> + * <strong>NB:</strong> The specified transformer will never be passed a <code>null</code> input. + * Instead, a <code>null</code> input will be transformed into a <code>null</code> output. * @see PluggablePropertyValueModel */ public static <V1, V2> PropertyValueModel<V2> transform(PropertyValueModel<? extends V1> propertyModel, Transformer<? super V1, ? extends V2> transformer) { @@ -172,9 +211,24 @@ public final class PropertyValueModelTools { } /** + * Construct a property value model that wraps the specified + * property value model and transforms its value with the specified + * transformer. + * <p> + * <strong>NB:</strong> The specified transformer must be able to handle a <code>null</code> input. + * @see PluggablePropertyValueModel + */ + public static <V1, V2> PropertyValueModel<V2> transform_(PropertyValueModel<? extends V1> propertyModel, Transformer<? super V1, ? extends V2> transformer) { + return propertyValueModel(pluggablePropertyValueModelAdapterFactory_(propertyModel, transformer)); + } + + /** * Construct a modifiable property value model that wraps the specified * property value model and transforms its value with the specified * transformer. The specified closure is invoked when the model's value is set. + * <p> + * <strong>NB:</strong> The specified transformer will never be passed a <code>null</code> input. + * Instead, a <code>null</code> input will be transformed into a <code>null</code> output. * @see PluggablePropertyValueModel */ public static <V1, V2> ModifiablePropertyValueModel<V2> transform(PropertyValueModel<? extends V1> propertyModel, Transformer<? super V1, ? extends V2> transformer, Closure<? super V2> setValueClosure) { @@ -182,11 +236,37 @@ public final class PropertyValueModelTools { } /** + * Construct a modifiable property value model that wraps the specified + * property value model and transforms its value with the specified + * transformer. The specified closure is invoked when the model's value is set. + * <p> + * <strong>NB:</strong> The specified transformer must be able to handle a <code>null</code> input. + * @see PluggablePropertyValueModel + */ + public static <V1, V2> ModifiablePropertyValueModel<V2> transform_(PropertyValueModel<? extends V1> propertyModel, Transformer<? super V1, ? extends V2> transformer, Closure<? super V2> setValueClosure) { + return pluggableModifiablePropertyValueModel(pluggablePropertyValueModelAdapterFactory_(propertyModel, transformer), setValueClosure); + } + + /** * Construct a pluggable property value model adapter factory for the specified * property value model and transformer. + * <p> + * <strong>NB:</strong> The specified transformer will never be passed a <code>null</code> input. + * Instead, a <code>null</code> input will be transformed into a <code>null</code> output. * @see PluggablePropertyValueModel */ public static <V1, V2> PluggablePropertyValueModel.Adapter.Factory<V2> pluggablePropertyValueModelAdapterFactory(PropertyValueModel<? extends V1> propertyModel, Transformer<? super V1, ? extends V2> transformer) { + return pluggablePropertyValueModelAdapterFactory_(propertyModel, TransformerTools.nullCheck(transformer)); + } + + /** + * Construct a pluggable property value model adapter factory for the specified + * property value model and transformer. + * <p> + * <strong>NB:</strong> The specified transformer must be able to handle a <code>null</code> input. + * @see PluggablePropertyValueModel + */ + public static <V1, V2> PluggablePropertyValueModel.Adapter.Factory<V2> pluggablePropertyValueModelAdapterFactory_(PropertyValueModel<? extends V1> propertyModel, Transformer<? super V1, ? extends V2> transformer) { return new PropertyPluggablePropertyValueModelAdapter.Factory<>(propertyModel, transformer); } @@ -194,6 +274,9 @@ public final class PropertyValueModelTools { * Construct a property value model that wraps the specified * property value model and transforms its value with the specified * transformer. + * <p> + * <strong>NB:</strong> The specified transformers will never be passed a <code>null</code> input. + * Instead, a <code>null</code> input will be transformed into a <code>null</code> output. * @see PluggablePropertyValueModel */ public static <V1, V2> ModifiablePropertyValueModel<V2> transform(ModifiablePropertyValueModel<V1> propertyModel, Transformer<? super V1, ? extends V2> getTransformer, Transformer<? super V2, ? extends V1> setTransformer) { @@ -201,11 +284,37 @@ public final class PropertyValueModelTools { } /** + * Construct a property value model that wraps the specified + * property value model and transforms its value with the specified + * transformer. + * <p> + * <strong>NB:</strong> The specified transformers must be able to handle a <code>null</code> input. + * @see PluggablePropertyValueModel + */ + public static <V1, V2> ModifiablePropertyValueModel<V2> transform_(ModifiablePropertyValueModel<V1> propertyModel, Transformer<? super V1, ? extends V2> getTransformer, Transformer<? super V2, ? extends V1> setTransformer) { + return modifiablePropertyValueModel(pluggableModifiablePropertyValueModelAdapterFactory_(propertyModel, getTransformer, setTransformer)); + } + + /** * Construct a pluggable property value model adapter factory for the specified * property value model and transformer. + * <p> + * <strong>NB:</strong> The specified transformers will never be passed a <code>null</code> input. + * Instead, a <code>null</code> input will be transformed into a <code>null</code> output. * @see PluggablePropertyValueModel */ public static <V1, V2> PluggableModifiablePropertyValueModel.Adapter.Factory<V2> pluggableModifiablePropertyValueModelAdapterFactory(ModifiablePropertyValueModel<V1> propertyModel, Transformer<? super V1, ? extends V2> getTransformer, Transformer<? super V2, ? extends V1> setTransformer) { + return pluggableModifiablePropertyValueModelAdapterFactory_(propertyModel, TransformerTools.nullCheck(getTransformer), TransformerTools.nullCheck(setTransformer)); + } + + /** + * Construct a pluggable property value model adapter factory for the specified + * property value model and transformer. + * <p> + * <strong>NB:</strong> The specified transformers must be able to handle a <code>null</code> input. + * @see PluggablePropertyValueModel + */ + public static <V1, V2> PluggableModifiablePropertyValueModel.Adapter.Factory<V2> pluggableModifiablePropertyValueModelAdapterFactory_(ModifiablePropertyValueModel<V1> propertyModel, Transformer<? super V1, ? extends V2> getTransformer, Transformer<? super V2, ? extends V1> setTransformer) { return new PropertyPluggableModifiablePropertyValueModelAdapter.Factory<>(propertyModel, getTransformer, setTransformer); } @@ -297,6 +406,8 @@ public final class PropertyValueModelTools { /** * Return a transformer that converts a property value model to its value. + * If the property value model is <code>null</code>, the transformer throws + * a {@link NullPointerException}. * @see PropertyValueModel#VALUE_TRANSFORMER */ @SuppressWarnings("unchecked") diff --git a/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/swing/RadioButtonModelAdapter.java b/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/swing/RadioButtonModelAdapter.java index 33fcb3213b..2e4c9ec29f 100644 --- a/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/swing/RadioButtonModelAdapter.java +++ b/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/swing/RadioButtonModelAdapter.java @@ -128,7 +128,7 @@ public class RadioButtonModelAdapter<V> } private static <V> PluggablePropertyValueModel.Adapter.Factory<Boolean> buildAdapterFactory(PropertyValueModel<V> sharedValueModel, V buttonValue) { - return PropertyValueModelTools.pluggablePropertyValueModelAdapterFactory(sharedValueModel, new GetTransformer<>(buttonValue)); + return PropertyValueModelTools.pluggablePropertyValueModelAdapterFactory_(sharedValueModel, new GetTransformer<>(buttonValue)); } public void setValue(Boolean value) { diff --git a/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/DoublePropertyValueModelTests.java b/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/DoublePropertyValueModelTests.java index d896e6c6c9..c933411190 100644 --- a/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/DoublePropertyValueModelTests.java +++ b/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/DoublePropertyValueModelTests.java @@ -62,9 +62,6 @@ public class DoublePropertyValueModelTests } protected SimplePropertyValueModel<String> getValueModel(String key) { - if (key == null) { - return null; - } SimplePropertyValueModel<String> valueModel = this.valueModels.get(key); if (valueModel == null) { valueModel = new SimplePropertyValueModel<>(key + key); |