From c9ee54321b81ed91a1089768164a19b6608604f5 Mon Sep 17 00:00:00 2001 From: Timofey Gorshkov Date: Mon, 27 May 2019 17:51:23 +0300 Subject: [PATCH] Add FeedbackingValueSource --- .../interpolation/FeedbackingValueSource.java | 48 ++++++++++++++ .../FeedbackingValueSourceTest.java | 62 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 src/main/java/org/codehaus/plexus/interpolation/FeedbackingValueSource.java create mode 100644 src/test/java/org/codehaus/plexus/interpolation/FeedbackingValueSourceTest.java diff --git a/src/main/java/org/codehaus/plexus/interpolation/FeedbackingValueSource.java b/src/main/java/org/codehaus/plexus/interpolation/FeedbackingValueSource.java new file mode 100644 index 0000000..5cb6bdc --- /dev/null +++ b/src/main/java/org/codehaus/plexus/interpolation/FeedbackingValueSource.java @@ -0,0 +1,48 @@ +package org.codehaus.plexus.interpolation; + +/* + * Copyright 2001-2008 Codehaus Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Adds feedback on any {@link #getValue(String) getValue(String)} call. + *

One of the obvious usages is to add FeedbackingValueSource as last value source to {@link Interpolator} + * to add feedback messages indicating not resolved expressions.

+ */ +public class FeedbackingValueSource extends AbstractValueSource +{ + private final String messagePattern; + + public FeedbackingValueSource() + { + this( "'${expression}' not resolved" ); + } + + /** + * @param messagePattern could contain ${expression} placeholder + */ + public FeedbackingValueSource( String messagePattern ) + { + super( true ); + this.messagePattern = messagePattern; + } + + @Override + public Object getValue( String expression ) + { + addFeedback( messagePattern.replace( "${expression}", expression ) ); + return null; + } +} diff --git a/src/test/java/org/codehaus/plexus/interpolation/FeedbackingValueSourceTest.java b/src/test/java/org/codehaus/plexus/interpolation/FeedbackingValueSourceTest.java new file mode 100644 index 0000000..5755e7d --- /dev/null +++ b/src/test/java/org/codehaus/plexus/interpolation/FeedbackingValueSourceTest.java @@ -0,0 +1,62 @@ +package org.codehaus.plexus.interpolation; + +/* + * Copyright 2001-2008 Codehaus Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import junit.framework.TestCase; + +import static java.util.Collections.singletonMap; + +public class FeedbackingValueSourceTest + extends TestCase +{ + + public void testStandalone() + { + ValueSource valueSource = new FeedbackingValueSource(); + assertNull( valueSource.getValue( "test" ) ); + assertEquals( 1, valueSource.getFeedback().size() ); + assertEquals( "'test' not resolved", valueSource.getFeedback().iterator().next() ); + } + + public void testAfterResolvedExpression() throws InterpolationException + { + StringSearchInterpolator interpolator = new StringSearchInterpolator(); + interpolator.addValueSource( new MapBasedValueSource( singletonMap( "key", "val" ) ) ); + interpolator.addValueSource( new FeedbackingValueSource() ); + assertEquals( "val", interpolator.interpolate( "${key}" ) ); + assertTrue( interpolator.getFeedback().isEmpty() ); + } + + public void testBeforeResolvedExpression() throws InterpolationException + { + StringSearchInterpolator interpolator = new StringSearchInterpolator(); + interpolator.addValueSource( new FeedbackingValueSource("Resolving ${expression}") ); + interpolator.addValueSource( new MapBasedValueSource( singletonMap( "key", "val" ) ) ); + assertEquals( "val", interpolator.interpolate( "${key}" ) ); + assertEquals( 1, interpolator.getFeedback().size() ); + assertEquals( "Resolving key", interpolator.getFeedback().iterator().next() ); + } + + public void testAfterNotResolvedExpression() throws InterpolationException + { + StringSearchInterpolator interpolator = new StringSearchInterpolator(); + interpolator.addValueSource( new MapBasedValueSource( singletonMap( "key", "val" ) ) ); + interpolator.addValueSource( new FeedbackingValueSource() ); + assertEquals( "${other-key}", interpolator.interpolate( "${other-key}" ) ); + assertEquals( 1, interpolator.getFeedback().size() ); + } +}