package foundation.variant.expression;
|
|
public class VariantParser {
|
|
private static char DefaultFlag_Variant = '@';
|
private static char DefaultFlag_LeftQuote = '{';
|
private static char DefaultFlag_RightQuote = '}';
|
private char Flag_Variant;
|
private char Flag_LeftQuote;
|
private char Flag_RightQuote;
|
private IVariantParseListener listener;
|
|
public VariantParser(IVariantParseListener listener) {
|
this.listener = listener;
|
this.Flag_Variant = DefaultFlag_Variant;
|
this.Flag_LeftQuote = DefaultFlag_LeftQuote;
|
this.Flag_RightQuote = DefaultFlag_RightQuote;
|
}
|
|
public void parse(String expression) throws Exception {
|
if (expression == null) {
|
return;
|
}
|
|
int length = expression.length();
|
|
String segmentString;
|
int variantLength = 0;
|
int begin = 0;
|
char curr;
|
|
for (int i = 0; i < length; i++) {
|
curr = expression.charAt(i);
|
|
if (isKey(curr)) {
|
if (Flag_LeftQuote != expression.charAt(Math.min(i + 1, length - 1))) {
|
continue;
|
}
|
|
segmentString = expression.substring(begin, i);
|
onFindSegment(segmentString);
|
|
variantLength = getVariantLength(expression, i + 1, length);
|
segmentString = expression.substring(i + 2, i + 2 + variantLength);
|
|
onFindVariant(curr, segmentString);
|
|
i = i + 2 + variantLength;
|
begin = i + 1;
|
}
|
}
|
|
if (begin <= length - 1) {
|
segmentString = expression.substring(begin, length);
|
onFindSegment(segmentString);
|
}
|
}
|
|
public static String getVariantName(String value) {
|
if (value == null) {
|
return null;
|
}
|
|
int begin = value.indexOf("@{") + 2;
|
int end = value.indexOf("}", begin);
|
|
if (end <= begin) {
|
return null;
|
}
|
|
return value.substring(begin, end);
|
}
|
|
public static String toSegmentString(String name) {
|
return "@{" + name + "}";
|
}
|
|
protected boolean isKey(char value) {
|
return Flag_Variant == value;
|
}
|
|
protected void onFindSegment(String segment) throws Exception {
|
if (listener != null) {
|
listener.onSegment(segment);
|
}
|
}
|
|
protected void onFindVariant(char key, String variant) throws Exception {
|
if (listener != null) {
|
listener.addVariant(variant);
|
}
|
}
|
|
private int getVariantLength(String expression, int pos, int max) throws Exception {
|
if (Flag_LeftQuote == expression.charAt(pos)) {
|
for (int i = pos + 1; i < max; i++) {
|
if (Flag_RightQuote == expression.charAt(i)) {
|
return i - pos - 1;
|
}
|
}
|
}
|
else {
|
throw new Exception("error parse param expression (" + pos + "):" + expression);
|
}
|
|
throw new Exception("error parse param expression (" + pos + "):" + expression);
|
}
|
|
public void setFlag_Variant(char value) {
|
Flag_Variant = value;
|
}
|
|
public void setFlag_LeftQuote(char value) {
|
Flag_LeftQuote = value;
|
}
|
|
public void setFlag_RightQuote(char value) {
|
Flag_RightQuote = value;
|
}
|
|
public static void main(String[] args) {
|
System.out.println(getVariantName("123@{456}789"));
|
}
|
|
}
|