package ch.unibe.scg.cc.regex;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class ReplacementString implements Serializable {
final private static long serialVersionUID = 1L;
final List<Segment> contents = new ArrayList<>();
private static final Pattern p = Pattern.compile("\\$(\\d+)");
public ReplacementString(String with) {
Matcher m = p.matcher(with);
int lastFind = 0;
while (m.find()) {
addUnlessEmpty(contents, new LiteralSegment(with.substring(lastFind, m.start(1) - 1)));
contents.add(new PlaceHolderSegment(Integer.parseInt(m.group(1))));
lastFind = m.end();
}
addUnlessEmpty(contents, new LiteralSegment(with.substring(lastFind, with.length())));
}
// Called from constructor and therefore final.
final void addUnlessEmpty(List<Segment> list, LiteralSegment segment) {
if (segment.s.equals("")) {
return;
}
list.add(segment);
}
public String fillIn(MatchResult matchResult) {
StringBuilder sb = new StringBuilder();
for (Segment s : contents) {
sb.append(s.fillIn(matchResult));
}
return sb.toString();
}
static abstract class Segment implements Serializable {
final private static long serialVersionUID = 1L;
abstract String fillIn(MatchResult matchResult);
}
static class PlaceHolderSegment extends Segment {
final private static long serialVersionUID = 1L;
final int placeHolderNumber;
public PlaceHolderSegment(int placeHolderNumber) {
this.placeHolderNumber = placeHolderNumber;
}
@Override
String fillIn(MatchResult m) {
return m.group(placeHolderNumber);
}
}
static class LiteralSegment extends Segment {
final private static long serialVersionUID = 1L;
final String s;
public LiteralSegment(String s) {
this.s = s;
}
@Override
String fillIn(MatchResult m) {
return s;
}
}
}