org.apache.juneau.svl.VarResolver Maven / Gradle / Ivy
// ***************************************************************************************************************************
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
// * to you 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. *
// ***************************************************************************************************************************
package org.apache.juneau.svl;
import java.io.*;
import java.util.*;
import org.apache.juneau.svl.vars.*;
/**
* Utility class for resolving variables of the form "$X{key}" in strings.
*
*
* Variables are of the form $X{key}
, where X
can consist of zero or more ASCII characters.
*
The variable key can contain anything, even nested variables that get recursively resolved.
*
*
* Variables are defined through the {@link VarResolverBuilder#vars(Class[])} method.
*
*
* The {@link Var} interface defines how variables are converted to values.
*
*
Example:
*
* public class SystemPropertiesVar extends SimpleVar {
*
* // Must have a no-arg constructor!
* public SystemPropertiesVar() {
* super ("S" );
* }
*
* @Override
* public String resolve(VarResolverSession session, String varVal) {
* return System.getProperty (varVal);
* }
* }
*
* // Create a variable resolver that resolves system properties (e.g. "$S{java.home}")
* VarResolver r = VarResolver.create ().vars(SystemPropertiesVar.class ).build();
*
* // Use it!
* System.out .println(r.resolve("java.home is set to $S{java.home}" ));
*
*
* See Also:
*
* - {@doc juneau-svl.VarResolvers}
*
*/
public class VarResolver {
/**
* Default string variable resolver with support for system properties and environment variables:
*
*
* $S{key[,default]}
- {@link SystemPropertiesVar}
* $E{key[,default]}
- {@link EnvVariablesVar}
* $A{key[,default]}
- {@link ArgsVar}
* $MF{key[,default]}
- {@link ManifestFileVar}
* $IF{arg,then[,else]}
- {@link IfVar}
* $SW{arg,pattern1:then1[,pattern2:then2...]}
- {@link SwitchVar}
* $CO{arg[,arg2...]}
- {@link CoalesceVar}
* $PM{arg,pattern}
- {@link PatternMatchVar}
* $UC{arg}
- {@link UpperCaseVar}
* $LC{arg}
- {@link LowerCaseVar}
* $NE{arg}
- {@link NotEmptyVar}
*
*
* @see SystemPropertiesVar
* @see EnvVariablesVar
*/
public static final VarResolver DEFAULT = new VarResolverBuilder().defaultVars().build();
final VarResolverContext ctx;
/**
* Instantiates a new clean-slate {@link VarResolverBuilder} object.
*
*
* This is equivalent to simply calling new VarResolverBuilder()
.
*
* @return A new {@link VarResolverBuilder} object.
*/
public static VarResolverBuilder create() {
return new VarResolverBuilder();
}
/**
* Constructor.
*
* @param vars The var classes
* @param contextObjects
*/
VarResolver(Class extends Var>[] vars, Map contextObjects) {
this.ctx = new VarResolverContext(vars, contextObjects);
}
/**
* Returns a new builder object using the settings in this resolver as a base.
*
* @return A new var resolver builder.
*/
public VarResolverBuilder builder() {
return new VarResolverBuilder()
.vars(ctx.getVars())
.contextObjects(ctx.getContextObjects());
}
/**
* Returns the read-only properties on this variable resolver.
*
* @return The read-only properties on this variable resolver.
*/
public VarResolverContext getContext() {
return ctx;
}
/**
* Creates a new resolver session with no session objects.
*
*
* Session objects can be associated with the specified session using the {@link VarResolverSession#sessionObject(String, Object)}
* method.
*
* @return A new resolver session.
*/
public VarResolverSession createSession() {
return new VarResolverSession(ctx, null);
}
/**
* Same as {@link #createSession()} except allows you to specify session objects as a map.
*
* @param sessionObjects The session objects to associate with the session.
* @return A new resolver session.
*/
public VarResolverSession createSession(Map sessionObjects) {
return new VarResolverSession(ctx, sessionObjects);
}
/**
* Resolve variables in the specified string.
*
*
* This is a shortcut for calling createSession(null ).resolve(s);
.
*
This method can only be used if the string doesn't contain variables that rely on the existence of session
* variables.
*
* @param s The input string.
* @return The string with variables resolved, or the same string if it doesn't contain any variables to resolve.
*/
public String resolve(String s) {
return createSession(null).resolve(s);
}
/**
* Resolve variables in the specified string and sends the results to the specified writer.
*
*
* This is a shortcut for calling createSession(null ).resolveTo(s, w);
.
*
This method can only be used if the string doesn't contain variables that rely on the existence of session
* variables.
*
* @param s The input string.
* @param w The writer to send the result to.
* @throws IOException
*/
public void resolveTo(String s, Writer w) throws IOException {
createSession(null).resolveTo(s, w);
}
}