앞서 했던 모든 class를 활용하여 구문을 각 block 영역으로 재 구성하고 각각을 계산하여
최종적인 참 거짓을 가져오기 위한 class 입니다.
public class BraceSyntaxBaseDTO extends SyntaxBaseDTO {
private Map<String,SyntaxBaseDTO> braceDtoMap
= new LinkedHashMap<String,SyntaxBaseDTO>();;
public BraceSyntaxBaseDTO(String syntax) {
super(syntax);
initResource();
}
private void initResource() {
if ( CommonBaseUtility.isEmptyValue(syntax) ) {
return;
}
parseCurrentSyntaxValue();
}
@Override
public boolean parseCurrentSyntaxValue() {
// TODO Auto-generated method stub
this.setMainType(MAIN_TYPE.BRACE_TYPE);
if (CommonBaseUtility.isEmptyValue(syntax)) {
return false;
}
if ( isConstValue() ) {
return true;
}
specialKeySet = CommonParserUtility.parseSpecialKeyValues(syntax);
variableMap = CommonParserUtility.parseVariableValues(syntax);
if ( CommonParserUtility.hasBrasceValue(syntax) ) {
Map<String,String> braceMap = CommonParserUtility.parseStringBraceBlocks(syntax);
for ( String keyStr : braceMap.keySet() ) {
String v = braceMap.get(keyStr);
if ( CommonParserUtility.hasLogicalValue(v ) ) {
LogicSyntaxBaseDTO cDto = new LogicSyntaxBaseDTO(v);
braceDtoMap.put(keyStr, cDto);
} else if ( CommonParserUtility.hasCompareValue(v)) {
CompareSyntaxBaseDTO cDto = new CompareSyntaxBaseDTO(v);
braceDtoMap.put(keyStr, cDto);
} else if ( CommonParserUtility.hasCalculationValue(v)) {
CalculationSyntaxBaseDTO cDto = new CalculationSyntaxBaseDTO(v);
braceDtoMap.put(keyStr, cDto);
}
}
} else {
if ( CommonParserUtility.hasLogicalValue(syntax) ) {
braceDtoMap.put("FINAL", new LogicSyntaxBaseDTO(syntax));
} else if ( CommonParserUtility.hasCompareValue(syntax)) {
braceDtoMap.put("FINAL", new CompareSyntaxBaseDTO(syntax));
} else if ( CommonParserUtility.hasCalculationValue(syntax)) {
braceDtoMap.put("FINAL", new CalculationSyntaxBaseDTO(syntax));
}
}
return true;
}
@Override
public String getValue(Map<String, String> transMap) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean getLogicalValue(Map<String, String> transMap) {
// TODO Auto-generated method stub
if ( this.braceDtoMap == null || braceDtoMap.isEmpty() )
return false;
String finalKey = null;
for ( String s : braceDtoMap.keySet()) {
SyntaxBaseDTO dto = braceDtoMap.get(s);
if ( dto.getMainType() == MAIN_TYPE.CALCULATION_TYPE ) {
String v = dto.getValue(transMap);
transMap.put(s, v);
} else if ( dto.getMainType() == MAIN_TYPE.COMPARE_TYPE ) {
boolean v = dto.getLogicalValue(transMap);
transMap.put(s, v+"");
} else if ( dto.getMainType() == MAIN_TYPE.LOGIC_TYPE ) {
boolean v = dto.getLogicalValue(transMap);
transMap.put(s, v+"");
}
finalKey = s;
}
return braceDtoMap.get(finalKey).getLogicalValue(transMap);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "(a+b > 29.9 && ( c < 10 or d >= 10) ) == false";
System.out.println ( String.format("Original Syntax : [%s]", str));
System.out.println ( String.format("Each varialbe value is assigned - [%s]", 10));
BraceSyntaxBaseDTO dto = new BraceSyntaxBaseDTO(str);
Map<String,Map<String,String>> variableMap = CommonParserUtility.parseVariableValues(str);
Map<String,String> transMap = new HashMap<String,String>();
for ( String s : variableMap.keySet()) {
transMap.put(s,"10");
}
System.out.println ( "FINAL RESULT : " + dto.getLogicalValue(transMap));
}
}
Main Block 에 보면 (a+b > 29.9 && ( c < 10 or d >= 10) ) == false 의 문자열이 있고,
각 변수에 10을 할당하는 방법을 사용하였습니다.
결국 (10+10 > 29.9 && (10 < 10 or 10 >= 10)) == false 의 구문으로 구성되고,
( false && (true)) == false => false == false 가 되어 최종 결과는 true 입니다.
댓글 없음:
댓글 쓰기