Add models for Apache Commons Lang and Text's Str[ing]Substitutor

This commit is contained in:
Chris Smowton
2021-02-18 14:43:23 +00:00
parent f749c31136
commit b0ba0585a7
5 changed files with 687 additions and 0 deletions

View File

@@ -306,3 +306,43 @@ private class ApacheStrLookupTaintGetter extends TaintPreservingCallable {
override predicate returnsTaintFrom(int arg) { arg = -1 }
}
private class ApacheStrSubstitutor extends RefType {
ApacheStrSubstitutor() {
this.hasQualifiedName("org.apache.commons.lang3.text", "StrSubstitutor") or
this.hasQualifiedName("org.apache.commons.text", "StringSubstitutor")
}
}
/**
* A callable declared on Apache Commons `StrSubstitutor` that returns taint.
*/
private class ApacheStrSubstitutorTaintGetter extends TaintPreservingCallable {
ApacheStrSubstitutorTaintGetter() {
this.getSourceDeclaration().getDeclaringType() instanceof ApacheStrSubstitutor and
(
this instanceof Constructor or
this.getName() = "replace"
)
}
override predicate returnsTaintFrom(int arg) {
arg in [0, -1]
or
this.isStatic() and arg = 1
}
}
/**
* A callable declared on Apache Commons `StrSubstitutor` that transfers taint.
*/
private class ApacheStrSubstitutorTaintTransfer extends TaintPreservingCallable {
ApacheStrSubstitutorTaintTransfer() {
this.getSourceDeclaration().getDeclaringType() instanceof ApacheStrSubstitutor and
this.getName() in ["replaceIn", "setVariableResolver"]
}
override predicate transfersTaint(int src, int sink) {
if this.getName() = "replaceIn" then (src = -1 and sink = 0) else (src = 0 and sink = -1)
}
}

View File

@@ -0,0 +1,82 @@
import org.apache.commons.lang3.text.StrSubstitutor;
import org.apache.commons.lang3.text.StrLookup;
import org.apache.commons.lang3.text.StrMatcher;
import org.apache.commons.lang3.text.StrBuilder;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
class StrSubstitutorTest {
String taint() { return "tainted"; }
void sink(Object o) {}
void test() throws Exception {
Map<String, String> taintedMap = new HashMap<String, String>();
taintedMap.put("key", taint());
StrLookup<String> taintedLookup = StrLookup.mapLookup(taintedMap);
// Test constructors:
StrSubstitutor ss1 = new StrSubstitutor(); ss1.setVariableResolver(taintedLookup); sink(ss1.replace("input")); // $hasTaintFlow=y
StrSubstitutor ss2 = new StrSubstitutor(taintedMap); sink(ss2.replace("input")); // $hasTaintFlow=y
StrSubstitutor ss3 = new StrSubstitutor(taintedMap, "{", "}"); sink(ss3.replace("input")); // $hasTaintFlow=y
StrSubstitutor ss4 = new StrSubstitutor(taintedMap, "{", "}", ' '); sink(ss4.replace("input")); // $hasTaintFlow=y
StrSubstitutor ss5 = new StrSubstitutor(taintedMap, "{", "}", ' ', ","); sink(ss5.replace("input")); // $hasTaintFlow=y
StrSubstitutor ss6 = new StrSubstitutor(taintedLookup); sink(ss6.replace("input")); // $hasTaintFlow=y
StrSubstitutor ss7 = new StrSubstitutor(taintedLookup, "{", "}", ' '); sink(ss7.replace("input")); // $hasTaintFlow=y
StrSubstitutor ss8 = new StrSubstitutor(taintedLookup, "{", "}", ' ', ","); sink(ss8.replace("input")); // $hasTaintFlow=y
StrSubstitutor ss9 = new StrSubstitutor(taintedLookup, (StrMatcher)null, null, ' '); sink(ss9.replace("input")); // $hasTaintFlow=y
StrSubstitutor ss10 = new StrSubstitutor(taintedLookup, (StrMatcher)null, null, ' ', null); sink(ss10.replace("input")); // $hasTaintFlow=y
// Test replace overloads (tainted substitution map):
StrSubstitutor taintedSubst = ss2;
sink(taintedSubst.replace((Object)"input")); // $hasTaintFlow=y
sink(taintedSubst.replace("input")); // $hasTaintFlow=y
sink(taintedSubst.replace("input", 0, 0)); // $hasTaintFlow=y
sink(taintedSubst.replace("input".toCharArray())); // $hasTaintFlow=y
sink(taintedSubst.replace("input".toCharArray(), 0, 0)); // $hasTaintFlow=y
sink(taintedSubst.replace((CharSequence)"input")); // $hasTaintFlow=y
sink(taintedSubst.replace((CharSequence)"input", 0, 0)); // $hasTaintFlow=y
sink(taintedSubst.replace(new StrBuilder("input"))); // $hasTaintFlow=y
sink(taintedSubst.replace(new StrBuilder("input"), 0, 0)); // $hasTaintFlow=y
sink(taintedSubst.replace(new StringBuilder("input"))); // $hasTaintFlow=y
sink(taintedSubst.replace(new StringBuilder("input"), 0, 0)); // $hasTaintFlow=y
sink(taintedSubst.replace(new StringBuffer("input"))); // $hasTaintFlow=y
sink(taintedSubst.replace(new StringBuffer("input"), 0, 0)); // $hasTaintFlow=y
// Test replace overloads (tainted input):
StrSubstitutor untaintedSubst = ss1;
sink(untaintedSubst.replace((Object)taint())); // $hasTaintFlow=y
sink(untaintedSubst.replace(taint())); // $hasTaintFlow=y
sink(untaintedSubst.replace(taint(), 0, 0)); // $hasTaintFlow=y
sink(untaintedSubst.replace(taint().toCharArray())); // $hasTaintFlow=y
sink(untaintedSubst.replace(taint().toCharArray(), 0, 0)); // $hasTaintFlow=y
sink(untaintedSubst.replace((CharSequence)taint())); // $hasTaintFlow=y
sink(untaintedSubst.replace((CharSequence)taint(), 0, 0)); // $hasTaintFlow=y
sink(untaintedSubst.replace(new StrBuilder(taint()))); // $hasTaintFlow=y
sink(untaintedSubst.replace(new StrBuilder(taint()), 0, 0)); // $hasTaintFlow=y
sink(untaintedSubst.replace(new StringBuilder(taint()))); // $hasTaintFlow=y
sink(untaintedSubst.replace(new StringBuilder(taint()), 0, 0)); // $hasTaintFlow=y
sink(untaintedSubst.replace(new StringBuffer(taint()))); // $hasTaintFlow=y
sink(untaintedSubst.replace(new StringBuffer(taint()), 0, 0)); // $hasTaintFlow=y
// Test static replace methods:
sink(StrSubstitutor.replace(taint(), new HashMap<String, String>())); // $hasTaintFlow=y
sink(StrSubstitutor.replace(taint(), new HashMap<String, String>(), "{", "}")); // $hasTaintFlow=y
sink(StrSubstitutor.replace("input", taintedMap)); // $hasTaintFlow=y
sink(StrSubstitutor.replace("input", taintedMap, "{", "}")); // $hasTaintFlow=y
Properties taintedProps = new Properties();
taintedProps.put("key", taint());
sink(StrSubstitutor.replace(taint(), new Properties())); // $hasTaintFlow=y
sink(StrSubstitutor.replace("input", taintedProps)); // $hasTaintFlow=y
// Test replaceIn methods:
StrBuilder strBuilder1 = new StrBuilder(); taintedSubst.replaceIn(strBuilder1); sink(strBuilder1.toString()); // $hasTaintFlow=y
StrBuilder strBuilder2 = new StrBuilder(); taintedSubst.replaceIn(strBuilder2, 0, 0); sink(strBuilder2.toString()); // $hasTaintFlow=y
StringBuilder stringBuilder1 = new StringBuilder(); taintedSubst.replaceIn(stringBuilder1); sink(stringBuilder1.toString()); // $hasTaintFlow=y
StringBuilder stringBuilder2 = new StringBuilder(); taintedSubst.replaceIn(stringBuilder2, 0, 0); sink(stringBuilder2.toString()); // $hasTaintFlow=y
StringBuffer stringBuffer1 = new StringBuffer(); taintedSubst.replaceIn(stringBuffer1); sink(stringBuffer1.toString()); // $hasTaintFlow=y
StringBuffer stringBuffer2 = new StringBuffer(); taintedSubst.replaceIn(stringBuffer2, 0, 0); sink(stringBuffer2.toString()); // $hasTaintFlow=y
}
}

View File

@@ -0,0 +1,83 @@
import org.apache.commons.text.StringSubstitutor;
import org.apache.commons.text.lookup.StringLookup;
import org.apache.commons.text.lookup.StringLookupFactory;
import org.apache.commons.text.matcher.StringMatcher;
import org.apache.commons.text.TextStringBuilder;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
class StringSubstitutorTextTest {
String taint() { return "tainted"; }
void sink(Object o) {}
void test() throws Exception {
Map<String, String> taintedMap = new HashMap<String, String>();
taintedMap.put("key", taint());
StringLookup taintedLookup = StringLookupFactory.INSTANCE.mapStringLookup(taintedMap);
// Test constructors:
StringSubstitutor ss1 = new StringSubstitutor(); ss1.setVariableResolver(taintedLookup); sink(ss1.replace("input")); // $hasTaintFlow=y
StringSubstitutor ss2 = new StringSubstitutor(taintedMap); sink(ss2.replace("input")); // $hasTaintFlow=y
StringSubstitutor ss3 = new StringSubstitutor(taintedMap, "{", "}"); sink(ss3.replace("input")); // $hasTaintFlow=y
StringSubstitutor ss4 = new StringSubstitutor(taintedMap, "{", "}", ' '); sink(ss4.replace("input")); // $hasTaintFlow=y
StringSubstitutor ss5 = new StringSubstitutor(taintedMap, "{", "}", ' ', ","); sink(ss5.replace("input")); // $hasTaintFlow=y
StringSubstitutor ss6 = new StringSubstitutor(taintedLookup); sink(ss6.replace("input")); // $hasTaintFlow=y
StringSubstitutor ss7 = new StringSubstitutor(taintedLookup, "{", "}", ' '); sink(ss7.replace("input")); // $hasTaintFlow=y
StringSubstitutor ss8 = new StringSubstitutor(taintedLookup, "{", "}", ' ', ","); sink(ss8.replace("input")); // $hasTaintFlow=y
StringSubstitutor ss9 = new StringSubstitutor(taintedLookup, (StringMatcher)null, null, ' '); sink(ss9.replace("input")); // $hasTaintFlow=y
StringSubstitutor ss10 = new StringSubstitutor(taintedLookup, (StringMatcher)null, null, ' ', null); sink(ss10.replace("input")); // $hasTaintFlow=y
// Test replace overloads (tainted substitution map):
StringSubstitutor taintedSubst = ss2;
sink(taintedSubst.replace((Object)"input")); // $hasTaintFlow=y
sink(taintedSubst.replace("input")); // $hasTaintFlow=y
sink(taintedSubst.replace("input", 0, 0)); // $hasTaintFlow=y
sink(taintedSubst.replace("input".toCharArray())); // $hasTaintFlow=y
sink(taintedSubst.replace("input".toCharArray(), 0, 0)); // $hasTaintFlow=y
sink(taintedSubst.replace((CharSequence)"input")); // $hasTaintFlow=y
sink(taintedSubst.replace((CharSequence)"input", 0, 0)); // $hasTaintFlow=y
sink(taintedSubst.replace(new TextStringBuilder("input"))); // $hasTaintFlow=y
sink(taintedSubst.replace(new TextStringBuilder("input"), 0, 0)); // $hasTaintFlow=y
sink(taintedSubst.replace(new StringBuilder("input"))); // $hasTaintFlow=y
sink(taintedSubst.replace(new StringBuilder("input"), 0, 0)); // $hasTaintFlow=y
sink(taintedSubst.replace(new StringBuffer("input"))); // $hasTaintFlow=y
sink(taintedSubst.replace(new StringBuffer("input"), 0, 0)); // $hasTaintFlow=y
// Test replace overloads (tainted input):
StringSubstitutor untaintedSubst = ss1;
sink(untaintedSubst.replace((Object)taint())); // $hasTaintFlow=y
sink(untaintedSubst.replace(taint())); // $hasTaintFlow=y
sink(untaintedSubst.replace(taint(), 0, 0)); // $hasTaintFlow=y
sink(untaintedSubst.replace(taint().toCharArray())); // $hasTaintFlow=y
sink(untaintedSubst.replace(taint().toCharArray(), 0, 0)); // $hasTaintFlow=y
sink(untaintedSubst.replace((CharSequence)taint())); // $hasTaintFlow=y
sink(untaintedSubst.replace((CharSequence)taint(), 0, 0)); // $hasTaintFlow=y
sink(untaintedSubst.replace(new TextStringBuilder(taint()))); // $hasTaintFlow=y
sink(untaintedSubst.replace(new TextStringBuilder(taint()), 0, 0)); // $hasTaintFlow=y
sink(untaintedSubst.replace(new StringBuilder(taint()))); // $hasTaintFlow=y
sink(untaintedSubst.replace(new StringBuilder(taint()), 0, 0)); // $hasTaintFlow=y
sink(untaintedSubst.replace(new StringBuffer(taint()))); // $hasTaintFlow=y
sink(untaintedSubst.replace(new StringBuffer(taint()), 0, 0)); // $hasTaintFlow=y
// Test static replace methods:
sink(StringSubstitutor.replace(taint(), new HashMap<String, String>())); // $hasTaintFlow=y
sink(StringSubstitutor.replace(taint(), new HashMap<String, String>(), "{", "}")); // $hasTaintFlow=y
sink(StringSubstitutor.replace("input", taintedMap)); // $hasTaintFlow=y
sink(StringSubstitutor.replace("input", taintedMap, "{", "}")); // $hasTaintFlow=y
Properties taintedProps = new Properties();
taintedProps.put("key", taint());
sink(StringSubstitutor.replace(taint(), new Properties())); // $hasTaintFlow=y
sink(StringSubstitutor.replace("input", taintedProps)); // $hasTaintFlow=y
// Test replaceIn methods:
TextStringBuilder strBuilder1 = new TextStringBuilder(); taintedSubst.replaceIn(strBuilder1); sink(strBuilder1.toString()); // $hasTaintFlow=y
TextStringBuilder strBuilder2 = new TextStringBuilder(); taintedSubst.replaceIn(strBuilder2, 0, 0); sink(strBuilder2.toString()); // $hasTaintFlow=y
StringBuilder stringBuilder1 = new StringBuilder(); taintedSubst.replaceIn(stringBuilder1); sink(stringBuilder1.toString()); // $hasTaintFlow=y
StringBuilder stringBuilder2 = new StringBuilder(); taintedSubst.replaceIn(stringBuilder2, 0, 0); sink(stringBuilder2.toString()); // $hasTaintFlow=y
StringBuffer stringBuffer1 = new StringBuffer(); taintedSubst.replaceIn(stringBuffer1); sink(stringBuffer1.toString()); // $hasTaintFlow=y
StringBuffer stringBuffer2 = new StringBuffer(); taintedSubst.replaceIn(stringBuffer2, 0, 0); sink(stringBuffer2.toString()); // $hasTaintFlow=y
}
}

View File

@@ -0,0 +1,227 @@
/*
* 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.commons.lang3.text;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class StrSubstitutor {
public static <V> String replace(final Object source, final Map<String, V> valueMap) {
return null;
}
public static <V> String replace(final Object source, final Map<String, V> valueMap, final String prefix, final String suffix) {
return null;
}
public static String replace(final Object source, final Properties valueProperties) {
return null;
}
public static String replaceSystemProperties(final Object source) {
return null;
}
public StrSubstitutor() {
}
public <V> StrSubstitutor(final Map<String, V> valueMap) {
}
public <V> StrSubstitutor(final Map<String, V> valueMap, final String prefix, final String suffix) {
}
public <V> StrSubstitutor(final Map<String, V> valueMap, final String prefix, final String suffix,
final char escape) {
}
public <V> StrSubstitutor(final Map<String, V> valueMap, final String prefix, final String suffix,
final char escape, final String valueDelimiter) {
}
public StrSubstitutor(final StrLookup<?> variableResolver) {
}
public StrSubstitutor(final StrLookup<?> variableResolver, final String prefix, final String suffix,
final char escape) {
}
public StrSubstitutor(final StrLookup<?> variableResolver, final String prefix, final String suffix,
final char escape, final String valueDelimiter) {
}
public StrSubstitutor(
final StrLookup<?> variableResolver, final StrMatcher prefixMatcher, final StrMatcher suffixMatcher,
final char escape) {
}
public StrSubstitutor(
final StrLookup<?> variableResolver, final StrMatcher prefixMatcher, final StrMatcher suffixMatcher,
final char escape, final StrMatcher valueDelimiterMatcher) {
}
public String replace(final String source) {
return null;
}
public String replace(final String source, final int offset, final int length) {
return null;
}
public String replace(final char[] source) {
return null;
}
public String replace(final char[] source, final int offset, final int length) {
return null;
}
public String replace(final StringBuffer source) {
return null;
}
public String replace(final StringBuffer source, final int offset, final int length) {
return null;
}
public String replace(final CharSequence source) {
return null;
}
public String replace(final CharSequence source, final int offset, final int length) {
return null;
}
public String replace(final StrBuilder source) {
return null;
}
public String replace(final StrBuilder source, final int offset, final int length) {
return null;
}
public String replace(final Object source) {
return null;
}
public boolean replaceIn(final StringBuffer source) {
return false;
}
public boolean replaceIn(final StringBuffer source, final int offset, final int length) {
return false;
}
public boolean replaceIn(final StringBuilder source) {
return false;
}
public boolean replaceIn(final StringBuilder source, final int offset, final int length) {
return false;
}
public boolean replaceIn(final StrBuilder source) {
return false;
}
public boolean replaceIn(final StrBuilder source, final int offset, final int length) {
return false;
}
public char getEscapeChar() {
return 0;
}
public void setEscapeChar(final char escapeCharacter) {
}
public StrMatcher getVariablePrefixMatcher() {
return null;
}
public StrSubstitutor setVariablePrefixMatcher(final StrMatcher prefixMatcher) {
return null;
}
public StrSubstitutor setVariablePrefix(final char prefix) {
return null;
}
public StrSubstitutor setVariablePrefix(final String prefix) {
return null;
}
public StrMatcher getVariableSuffixMatcher() {
return null;
}
public StrSubstitutor setVariableSuffixMatcher(final StrMatcher suffixMatcher) {
return null;
}
public StrSubstitutor setVariableSuffix(final char suffix) {
return null;
}
public StrSubstitutor setVariableSuffix(final String suffix) {
return null;
}
public StrMatcher getValueDelimiterMatcher() {
return null;
}
public StrSubstitutor setValueDelimiterMatcher(final StrMatcher valueDelimiterMatcher) {
return null;
}
public StrSubstitutor setValueDelimiter(final char valueDelimiter) {
return null;
}
public StrSubstitutor setValueDelimiter(final String valueDelimiter) {
return null;
}
public StrLookup<?> getVariableResolver() {
return null;
}
public void setVariableResolver(final StrLookup<?> variableResolver) {
}
public boolean isEnableSubstitutionInVariables() {
return false;
}
public void setEnableSubstitutionInVariables(
final boolean enableSubstitutionInVariables) {
}
public boolean isPreserveEscapes() {
return false;
}
public void setPreserveEscapes(final boolean preserveEscapes) {
}
}

View File

@@ -0,0 +1,255 @@
/*
* 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.commons.text;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import org.apache.commons.text.lookup.StringLookup;
import org.apache.commons.text.matcher.StringMatcher;
public class StringSubstitutor {
public static StringSubstitutor createInterpolator() {
return null;
}
public static <V> String replace(final Object source, final Map<String, V> valueMap) {
return null;
}
public static <V> String replace(final Object source, final Map<String, V> valueMap, final String prefix,
final String suffix) {
return null;
}
public static String replace(final Object source, final Properties valueProperties) {
return null;
}
public static String replaceSystemProperties(final Object source) {
return null;
}
public StringSubstitutor() {
}
public <V> StringSubstitutor(final Map<String, V> valueMap) {
}
public <V> StringSubstitutor(final Map<String, V> valueMap, final String prefix, final String suffix) {
}
public <V> StringSubstitutor(final Map<String, V> valueMap, final String prefix, final String suffix,
final char escape) {
}
public <V> StringSubstitutor(final Map<String, V> valueMap, final String prefix, final String suffix,
final char escape, final String valueDelimiter) {
}
public StringSubstitutor(final StringLookup variableResolver) {
}
public StringSubstitutor(final StringLookup variableResolver, final String prefix, final String suffix,
final char escape) {
}
public StringSubstitutor(final StringLookup variableResolver, final String prefix, final String suffix,
final char escape, final String valueDelimiter) {
}
public StringSubstitutor(final StringLookup variableResolver, final StringMatcher prefixMatcher,
final StringMatcher suffixMatcher, final char escape) {
}
public StringSubstitutor(final StringLookup variableResolver, final StringMatcher prefixMatcher,
final StringMatcher suffixMatcher, final char escape, final StringMatcher valueDelimiterMatcher) {
}
public StringSubstitutor(final StringSubstitutor other) {
}
public char getEscapeChar() {
return 0;
}
public StringLookup getStringLookup() {
return null;
}
public StringMatcher getValueDelimiterMatcher() {
return null;
}
public StringMatcher getVariablePrefixMatcher() {
return null;
}
public StringMatcher getVariableSuffixMatcher() {
return null;
}
public boolean isDisableSubstitutionInValues() {
return false;
}
public boolean isEnableSubstitutionInVariables() {
return false;
}
public boolean isEnableUndefinedVariableException() {
return false;
}
public boolean isPreserveEscapes() {
return false;
}
public String replace(final char[] source) {
return null;
}
public String replace(final char[] source, final int offset, final int length) {
return null;
}
public String replace(final CharSequence source) {
return null;
}
public String replace(final CharSequence source, final int offset, final int length) {
return null;
}
public String replace(final Object source) {
return null;
}
public String replace(final String source) {
return null;
}
public String replace(final String source, final int offset, final int length) {
return null;
}
public String replace(final StringBuffer source) {
return null;
}
public String replace(final StringBuffer source, final int offset, final int length) {
return null;
}
public String replace(final TextStringBuilder source) {
return null;
}
public String replace(final TextStringBuilder source, final int offset, final int length) {
return null;
}
public boolean replaceIn(final StringBuffer source) {
return false;
}
public boolean replaceIn(final StringBuffer source, final int offset, final int length) {
return false;
}
public boolean replaceIn(final StringBuilder source) {
return false;
}
public boolean replaceIn(final StringBuilder source, final int offset, final int length) {
return false;
}
public boolean replaceIn(final TextStringBuilder source) {
return false;
}
public boolean replaceIn(final TextStringBuilder source, final int offset, final int length) {
return false;
}
public StringSubstitutor setDisableSubstitutionInValues(final boolean disableSubstitutionInValues) {
return null;
}
public StringSubstitutor setEnableSubstitutionInVariables(final boolean enableSubstitutionInVariables) {
return null;
}
public StringSubstitutor setEnableUndefinedVariableException(final boolean failOnUndefinedVariable) {
return null;
}
public StringSubstitutor setEscapeChar(final char escapeCharacter) {
return null;
}
public StringSubstitutor setPreserveEscapes(final boolean preserveEscapes) {
return null;
}
public StringSubstitutor setValueDelimiter(final char valueDelimiter) {
return null;
}
public StringSubstitutor setValueDelimiter(final String valueDelimiter) {
return null;
}
public StringSubstitutor setValueDelimiterMatcher(final StringMatcher valueDelimiterMatcher) {
return null;
}
public StringSubstitutor setVariablePrefix(final char prefix) {
return null;
}
public StringSubstitutor setVariablePrefix(final String prefix) {
return null;
}
public StringSubstitutor setVariablePrefixMatcher(final StringMatcher prefixMatcher) {
return null;
}
public StringSubstitutor setVariableResolver(final StringLookup variableResolver) {
return null;
}
public StringSubstitutor setVariableSuffix(final char suffix) {
return null;
}
public StringSubstitutor setVariableSuffix(final String suffix) {
return null;
}
public StringSubstitutor setVariableSuffixMatcher(final StringMatcher suffixMatcher) {
return null;
}
}