package oraloganalyzer.editor; import java.util.ArrayList; import java.util.List; import oraloganalyzer.model.OraErrorType; import oraloganalyzer.model.OraLineError; import oraloganalyzer.model.ParsingResult; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.rules.BufferedRuleBasedScanner; import org.eclipse.jface.text.rules.EndOfLineRule; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.PatternRule; import org.eclipse.jface.text.rules.SingleLineRule; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WhitespaceRule; import org.eclipse.jface.text.rules.WordRule; public class OraLogScanner extends BufferedRuleBasedScanner { private static String[] sqlKeywords = { "CREATE", "SELECT", "DELETE", "INSERT", "UPDATE", "FROM", "SET", "TABLE", "COLUMN", "VALUES", "WHERE", "ORDER", "BY", "ASC", "DESC", "BETWEEN", "GROUP", "HAVING", "INTO", "GRANT", "REVOKE", "MERGE", "ALTER", "VIEW", "PACKAGE", "BODY", "TRIGGER", "AFTER", "BEFORE", "FUNCTION", "PROCEDURE", "DROP", "CONSTRAINT", "USING", "INDEX", "ON", "COMMENT", "PRIMARY", "FOREIGN", "KEY", "UNIQUE", "NOT", "BEGIN", "END", "AND", "OR", "CASE", "WHEN", "CONNECT", "DISCONNECT" }; private static String[] sqlTypes = { "VARCHAR", "VARCHAR2", "CHAR", "NUMBER", "DATE", "INTEGER", "BYTE", "BLOB", "TEXT", "REAL", "DECIMAL", }; private static String[] sqlConstants = { "TRUE", "FALSE", "NULL" }; //Tokens private final IToken KEYWORD_TOKEN; private final IToken TYPE_TOKEN; private final IToken STRING_TOKEN; private final IToken COMMENT_TOKEN; private final IToken OTHER_TOKEN; private final IToken ORA_ERROR_TOKEN; private List<IRule> basicRules; public OraLogScanner(SyntaxColorProvider colorProvider) { super(5000); //create Tokens KEYWORD_TOKEN = new Token(new TextAttribute(colorProvider .getColor(SyntaxColorProvider.KEYWORD))); TYPE_TOKEN = new Token(new TextAttribute(colorProvider .getColor(SyntaxColorProvider.TYPE))); STRING_TOKEN = new Token(new TextAttribute(colorProvider .getColor(SyntaxColorProvider.STRING))); COMMENT_TOKEN = new Token(new TextAttribute(colorProvider .getColor(SyntaxColorProvider.SINGLE_LINE_COMMENT))); OTHER_TOKEN = new Token(new TextAttribute(colorProvider .getColor(SyntaxColorProvider.DEFAULT))); ORA_ERROR_TOKEN = new Token(new TextAttribute(colorProvider .getColor(SyntaxColorProvider.RED))); //create BasicRules basicRules = new ArrayList<IRule>(); basicRules.add(new WhitespaceRule(new WhitespaceDetector())); basicRules.addAll(createSQLRules()); //ruleList.addAll(createGenericLogErrorRules()); } @Override public void setRules(IRule[] rules) { List<IRule> ruleList = new ArrayList<IRule>(); //Add given Rules for (IRule rule : rules) { ruleList.add(rule); } //Add Basic Rules ruleList.addAll(this.basicRules); super.setRules(toArray(ruleList)); } public IRule[] createGivenOffsetRules(ParsingResult pr) { List<IRule> ruleList = new ArrayList<IRule>(); for (OraLineError ole : pr.getResults()) { GivenOffsetRule gor = new GivenOffsetRule(ORA_ERROR_TOKEN, ole.getOffset(), ole.getMessage().length()); ruleList.add(gor); } return toArray(ruleList); } private final List<IRule> createGenericLogErrorRules() { List<IRule> rules = new ArrayList<IRule>(); for (OraErrorType errType : OraErrorType.values()) { for (int i = 0; i < 3; i++) { rules.add(new PatternRule(errType.getTypename() + i, null, ORA_ERROR_TOKEN, ':', true)); } } return rules; } private final List<IRule> createSQLRules() { List<IRule> rules = new ArrayList<IRule>(); // Add rule for single line comments. rules.add(new EndOfLineRule("--", COMMENT_TOKEN)); // Add rule for strings and character constants. rules.add(new SingleLineRule("\"", "\"", STRING_TOKEN, '\\')); rules.add(new SingleLineRule("'", "'", STRING_TOKEN, '\\')); // Add word rule for keywords, types, and constants. WordRule wordRule = new WordRule(new WordDetector(), OTHER_TOKEN); for (String sqlKeyword : sqlKeywords) { wordRule.addWord(sqlKeyword.toLowerCase(), KEYWORD_TOKEN); wordRule.addWord(sqlKeyword.toUpperCase(), KEYWORD_TOKEN); } for (String sqlType : sqlTypes) { wordRule.addWord(sqlType.toLowerCase(), TYPE_TOKEN); wordRule.addWord(sqlType.toUpperCase(), TYPE_TOKEN); } for (String sqlConstant : sqlConstants) { wordRule.addWord(sqlConstant.toLowerCase(), TYPE_TOKEN); wordRule.addWord(sqlConstant.toUpperCase(), TYPE_TOKEN); } rules.add(wordRule); return rules; } private IRule[] toArray(List<IRule> ruleList) { IRule[] rules = new IRule[ruleList.size()]; return ruleList.toArray(rules); } // @Override // public IToken nextToken() // { // System.out.println("TokenOffset: " + super.getTokenOffset()); // return super.nextToken(); // } }