
hudson.util.VariableResolver Maven / Gradle / Ivy
Show all versions of hudson-core Show documentation
/*******************************************************************************
*
* 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 {
/**
* Receives a variable name and obtains the value associated with the name.
*
*
* 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 implements VariableResolver {
private final Map data;
public ByMap(Map data) {
this.data = data;
}
public V resolve(String name) {
return data.get(name);
}
}
/**
* Union of multiple {@link VariableResolver}.
*/
public static final class Union implements VariableResolver {
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;
}
}
}