📄 validationmanager.java
字号:
/**
*
*/
package com.asterix.validation;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.antlr.runtime.ANTLRInputStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.tree.CommonTree;
import com.asterix.validation.antlr.ValidationLexer;
import com.asterix.validation.antlr.ValidationParser;
import com.asterix.validation.antlr.ValidationParser.parse_return;
import com.asterix.validation.predicate.Predicate;
/**
* @author Andrei A Adamian
*
*/
public class ValidationManager {
private ValidationConfiguration config;
public ValidationManager() {
}
public void initialize(String file) {
try {
initialize(new FileInputStream(file));
} catch (FileNotFoundException e) {
}
}
public void initialize(InputStream stream) {
try {
ValidationLexer lexer = new ValidationLexer(new ANTLRInputStream(stream));
ValidationParser parser = new ValidationParser(new CommonTokenStream(lexer));
parse_return parse = parser.parse();
CommonTree tree = (CommonTree) parse.getTree();
System.out.println(tree.toStringTree());
config = new ValidationConfiguration(tree);
} catch (Throwable t) {
new RuntimeException(t);
}
}
public List<IValidationError> validate(String name, Object target) {
CommonTree group = config.getGroup(name);
if (group == null) {
throw new IllegalArgumentException("Unknown group " + name);
}
return runValidation(group, target);
}
private List<IValidationError> runValidation(CommonTree tree, Object target) {
List<IValidationError> errors = Predicate.singleList(null);
for (int i = 0; i < tree.getChildCount(); i++) {
CommonTree child = (CommonTree) tree.getChild(i);
int token = child.getToken().getType();
if (ValidationLexer.RULE == token) {
String name = getObjectName(child);
RuntimeMethod rule = config.getRule(name);
if (rule == null) {
throw new IllegalArgumentException("Unknown rule " + name);
}
rule.getTarget().setContext(RuleContext.newContext(this));
IValidationError error = rule.invoke(target);
if (error != null) {
errors.add(error);
}
} else if (ValidationLexer.GROUP == token) {
String name = getObjectName(child);
CommonTree group = config.getGroup(name);
if (group == null) {
throw new IllegalArgumentException("Unknown group " + name);
}
errors.addAll(runValidation(group, target));
} else if (ValidationLexer.ITERATOR == token) {
String name = getObjectName((CommonTree) child.getChild(0));
IteratorMethod iterator = config.getIterator(name);
if (iterator == null) {
new IllegalArgumentException("Unknown iterator " + name);
}
iterator.getTarget().setContext(RuleContext.newContext(this));
Iterator iter = iterator.invoke(target);
ArrayList<String> messageModifiers = new ArrayList<String>(iterator.getTarget().getContext().getMessageParameters());
while (iter.hasNext()) {
Object next = iter.next();
name = getObjectName((CommonTree) child.getChild(1));
List<IValidationError> iErrors = new ArrayList<IValidationError>();
if (child.getChild(1).getType() == ValidationLexer.GROUP) {
CommonTree group = config.getGroup(name);
if (group == null) {
throw new IllegalArgumentException("Unknown group " + name);
}
iErrors.addAll(runValidation(group, next));
} else {
RuntimeMethod rule = config.getRule(name);
if (rule == null) {
throw new IllegalArgumentException("Unknown rule " + name);
}
rule.getTarget().setContext(RuleContext.newContext(this));
IValidationError error = rule.invoke(next);
if (error != null) {
iErrors.add(error);
}
}
String message = iterator.getMessage();
if (!"".equals(message)) {
for (IValidationError error : iErrors) {
messageModifiers.add(0, error.getMessage());
error.setMessage(MessageFormat.format(message, messageModifiers.toArray()));
}
}
errors.addAll(iErrors);
}
} else if (ValidationLexer.BREAK == token) {
if (errors.size()>0) {
break;
}
}
}
return errors;
}
private String getObjectName(CommonTree tree) {
String name = "";
for (int i = 0; i < tree.getChildCount(); i++) {
name += tree.getChild(i).getText();
}
return name;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -