1 package org.codehaus.plexus.interpolation; 2 3 /* 4 * Copyright 2001-2008 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.Collections; 20 import java.util.List; 21 import java.util.Stack; 22 23 /** 24 * Simplest implementation of a {@link RecursionInterceptor}, which checks whether 25 * the existing interpolation effort is already attempting to resolve an exact 26 * expression, but has not finished. This will not catch synonym expressions, as 27 * are found in Maven (${project.build.directory}, ${pom.build.directory}, and 28 * ${build.directory} are synonyms). 29 * 30 * @author jdcasey 31 */ 32 public class SimpleRecursionInterceptor implements RecursionInterceptor { 33 34 private Stack expressions = new Stack(); 35 36 /** 37 * {@inheritDoc} 38 */ 39 public void expressionResolutionFinished(String expression) { 40 expressions.pop(); 41 } 42 43 /** 44 * {@inheritDoc} 45 */ 46 public void expressionResolutionStarted(String expression) { 47 expressions.push(expression); 48 } 49 50 /** 51 * Check whether the current expression is already present in the in-process 52 * stack. 53 */ 54 public boolean hasRecursiveExpression(String expression) { 55 return expressions.contains(expression); 56 } 57 58 /** 59 * When an expression is determined to be a recursive reference, this method 60 * returns the sublist of tracked expressions that participate in this cycle. 61 * Otherwise, if the expression isn't present in the in-process stack, return 62 * {@link Collections#EMPTY_LIST}. 63 */ 64 public List getExpressionCycle(String expression) { 65 int idx = expressions.indexOf(expression); 66 if (idx < 0) { 67 return Collections.EMPTY_LIST; 68 } else { 69 return expressions.subList(idx, expressions.size()); 70 } 71 } 72 73 public void clear() { 74 expressions.clear(); 75 } 76 }