View Javadoc
1   package org.codehaus.plexus.interpolation.fixed;
2   
3   /*
4    * Copyright 2014 Codehaus Foundation.
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *      http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  import java.util.List;
20  
21  import org.codehaus.plexus.interpolation.util.ValueSourceUtils;
22  
23  /**
24   * {@link org.codehaus.plexus.interpolation.fixed.FixedValueSource} implementation which simply wraps another
25   * value source, and trims any of a set of possible expression prefixes before delegating the
26   * modified expression to be resolved by the real value source.
27   *
28   * @author jdcasey
29   * @author krosenvold
30   */
31  public class PrefixedValueSourceWrapper implements FixedValueSource {
32  
33      private final FixedValueSource valueSource;
34  
35      private final String[] possiblePrefixes;
36  
37      private boolean allowUnprefixedExpressions;
38  
39      private String lastExpression;
40  
41      /**
42       * Wrap the given value source, but first trim the given prefix from any
43       * expressions before they are passed along for resolution. If an expression
44       * doesn't start with the given prefix, do not resolve it.
45       *
46       * @param valueSource The {@link org.codehaus.plexus.interpolation.ValueSource} to wrap.
47       * @param prefix      The expression prefix to trim.
48       */
49      public PrefixedValueSourceWrapper(FixedValueSource valueSource, String prefix) {
50          this.valueSource = valueSource;
51          possiblePrefixes = new String[] {prefix};
52      }
53  
54      /**
55       * Wrap the given value source, but first trim the given prefix from any
56       * expressions before they are passed along for resolution. If an expression
57       * doesn't start with the given prefix and the allowUnprefixedExpressions flag
58       * is set to true, simply pass the expression through to the nested value source
59       * unchanged. If this flag is false, only allow resolution of those expressions
60       * that start with the specified prefix.
61       *
62       * @param valueSource                The {@link org.codehaus.plexus.interpolation.ValueSource} to wrap.
63       * @param prefix                     The expression prefix to trim.
64       * @param allowUnprefixedExpressions Flag telling the wrapper whether to
65       *                                   continue resolving expressions that don't start with the prefix it tracks.
66       */
67      public PrefixedValueSourceWrapper(FixedValueSource valueSource, String prefix, boolean allowUnprefixedExpressions) {
68          this.valueSource = valueSource;
69          possiblePrefixes = new String[] {prefix};
70          this.allowUnprefixedExpressions = allowUnprefixedExpressions;
71      }
72  
73      /**
74       * Wrap the given value source, but first trim one of the given prefixes from any
75       * expressions before they are passed along for resolution. If an expression
76       * doesn't start with one of the given prefixes, do not resolve it.
77       *
78       * @param valueSource      The {@link org.codehaus.plexus.interpolation.ValueSource} to wrap.
79       * @param possiblePrefixes The List of expression prefixes to trim.
80       */
81      public PrefixedValueSourceWrapper(FixedValueSource valueSource, List<String> possiblePrefixes) {
82          this.valueSource = valueSource;
83          this.possiblePrefixes = possiblePrefixes.toArray(new String[possiblePrefixes.size()]);
84      }
85  
86      /**
87       * Wrap the given value source, but first trim one of the given prefixes from any
88       * expressions before they are passed along for resolution. If an expression
89       * doesn't start with the given prefix and the allowUnprefixedExpressions flag
90       * is set to true, simply pass the expression through to the nested value source
91       * unchanged. If this flag is false, only allow resolution of those expressions
92       * that start with the specified prefix.
93       *
94       * @param valueSource                The {@link org.codehaus.plexus.interpolation.ValueSource} to wrap.
95       * @param possiblePrefixes           The List of expression prefixes to trim.
96       * @param allowUnprefixedExpressions Flag telling the wrapper whether to
97       *                                   continue resolving expressions that don't start with one of the prefixes it tracks.
98       */
99      public PrefixedValueSourceWrapper(
100             FixedValueSource valueSource, List<String> possiblePrefixes, boolean allowUnprefixedExpressions) {
101         this.valueSource = valueSource;
102         this.possiblePrefixes = possiblePrefixes.toArray(new String[possiblePrefixes.size()]);
103         this.allowUnprefixedExpressions = allowUnprefixedExpressions;
104     }
105 
106     public Object getValue(String expression, InterpolationState interpolationState) {
107         expression = ValueSourceUtils.trimPrefix(expression, possiblePrefixes, allowUnprefixedExpressions);
108 
109         if (expression == null) {
110             return null;
111         }
112 
113         return valueSource.getValue(expression, interpolationState);
114     }
115 }