in resolver/src/main/java/org/apache/james/jspf/core/MacroExpand.java [323:394]
private String replaceCell(String replaceValue, MacroData macroData, boolean isExplanation) throws PermErrorException, RequireClientDomainException {
String variable = "";
String domainNumber = "";
boolean isReversed = false;
String delimeters = ".";
// Get only command character so that 'r' command and 'r' modifier don't
// clash
String commandCharacter = replaceValue.substring(0, 1);
Matcher cellMatcher;
// Find command
if (isExplanation) {
cellMatcher = macroLettersExpPattern.matcher(commandCharacter);
} else {
cellMatcher = macroLettersPattern.matcher(commandCharacter);
}
if (cellMatcher.find()) {
if (cellMatcher.group().toUpperCase().equals(cellMatcher.group())) {
variable = encodeURL(matchMacro(cellMatcher.group(), macroData));
} else {
variable = matchMacro(cellMatcher.group(), macroData);
}
// Remove Macro code so that r macro code does not clash with r the
// reverse modifier
replaceValue = replaceValue.substring(1);
} else {
throw new PermErrorException("MacroLetter not found: "+replaceValue);
}
// Find number of domains to use
cellPattern = Pattern.compile("\\d+");
cellMatcher = cellPattern.matcher(replaceValue);
while (cellMatcher.find()) {
domainNumber = cellMatcher.group();
if (Integer.parseInt(domainNumber) == 0) {
throw new PermErrorException(
"Digit transformer must be non-zero");
}
}
// find if reversed
cellPattern = Pattern.compile("r");
cellMatcher = cellPattern.matcher(replaceValue);
while (cellMatcher.find()) {
isReversed = true;
}
// find delimeters
cellPattern = Pattern.compile("[\\.\\-\\+\\,\\/\\_\\=]+");
cellMatcher = cellPattern.matcher(replaceValue);
while (cellMatcher.find()) {
delimeters = cellMatcher.group();
}
// Reverse domains as necessary
ArrayList<String> data = split(variable, delimeters);
if (isReversed) {
data = reverse(data);
}
// Truncate domain name to number of sub sections
String returnData;
if (!domainNumber.equals("")) {
returnData = subset(data, Integer.parseInt(domainNumber));
} else {
returnData = subset(data);
}
return returnData;
}