/******************************************************************************* * * Copyright (c) 2004-2009 Oracle Corporation. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * * Kohsuke Kawaguchi * * *******************************************************************************/ package hudson.util; import java.util.Collection; import java.util.Map; /** * Resolves variables to its value, while encapsulating how that resolution * happens. * * @author Kohsuke Kawaguchi */ public interface VariableResolver<V> { /** * Receives a variable name and obtains the value associated with the name. * * <p> This can be implemented simply on top of a {@link Map} (see * {@link ByMap}), or this can be used like an expression evaluator. * * @param name Name of the variable to be resolved. Never null, never empty. * The name shouldn't include the syntactic marker of an expression. IOW, it * should be "foo" but not "${foo}". A part of the goal of this design is to * abstract away the expression marker syntax. * @return Object referenced by the name. Null if not found. */ public abstract V resolve(String name); /** * Empty resolver that always returns null. */ public static final VariableResolver NONE = new VariableResolver() { public Object resolve(String name) { return null; } }; /** * {@link VariableResolver} backed by a {@link Map}. */ public static final class ByMap<V> implements VariableResolver<V> { private final Map<String, V> data; public ByMap(Map<String, V> data) { this.data = data; } public V resolve(String name) { return data.get(name); } } /** * Union of multiple {@link VariableResolver}. */ public static final class Union<V> implements VariableResolver<V> { private final VariableResolver<? extends V>[] resolvers; public Union(VariableResolver<? extends V>... resolvers) { this.resolvers = resolvers.clone(); } public Union(Collection<? extends VariableResolver<? extends V>> resolvers) { this.resolvers = resolvers.toArray(new VariableResolver[resolvers.size()]); } public V resolve(String name) { for (VariableResolver<? extends V> r : resolvers) { V v = r.resolve(name); if (v != null) { return v; } } return null; } } }