/*==========================================================================*\
| $Id: OgnlPartitionScanner.java,v 1.1 2010/05/11 15:52:46 aallowat Exp $
|*-------------------------------------------------------------------------*|
| Copyright (C) 2006-2008 Virginia Tech
|
| This file is part of Web-CAT.
|
| Web-CAT is free software; you can redistribute it and/or modify
| it under the terms of the GNU Affero General Public License as published
| by the Free Software Foundation; either version 3 of the License, or
| (at your option) any later version.
|
| Web-CAT is distributed in the hope that it will be useful,
| but WITHOUT ANY WARRANTY; without even the implied warranty of
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| GNU General Public License for more details.
|
| You should have received a copy of the GNU Affero General Public License
| along with Web-CAT; if not, see <http://www.gnu.org/licenses/>.
\*==========================================================================*/
package org.webcat.oda.designer.ognl;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IPredicateRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.IWordDetector;
import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
import org.eclipse.jface.text.rules.SingleLineRule;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WordRule;
//------------------------------------------------------------------------
/**
* TODO: real description
*
* @author Tony Allevato (Virginia Tech Computer Science)
* @version $Id: OgnlPartitionScanner.java,v 1.1 2010/05/11 15:52:46 aallowat Exp $
*/
public class OgnlPartitionScanner extends RuleBasedPartitionScanner
{
//~ Constructor ...........................................................
// ----------------------------------------------------------
/**
* Creates a new OgnlPartitionScanner object.
*/
public OgnlPartitionScanner()
{
List<IPredicateRule> rules = new ArrayList<IPredicateRule>();
rules.add(new SingleLineRule("\"", "\"", TOKEN_STRING, '\\')); //$NON-NLS-1$ //$NON-NLS-2$
rules.add(new SingleLineRule("'", "'", TOKEN_STRING, '\\')); //$NON-NLS-1$ //$NON-NLS-2$
PredicateWordRule keywordRule = new PredicateWordRule(
new IWordDetector()
{
public boolean isWordStart(char c)
{
return Character.isJavaIdentifierStart(c);
}
public boolean isWordPart(char c)
{
return Character.isJavaIdentifierPart(c);
}
}, TOKEN_DEFAULT);
keywordRule.addWords(keywordTokens, TOKEN_KEYWORD);
rules.add(keywordRule);
PredicateWordRule staticMethodRule = new PredicateWordRule(
new IWordDetector()
{
public boolean isWordStart(char c)
{
return c == '@';
}
public boolean isWordPart(char c)
{
return c == '@' || c == '.'
|| Character.isJavaIdentifierPart(c);
}
}, TOKEN_STATIC_METHOD);
rules.add(staticMethodRule);
PredicateWordRule variableRule = new PredicateWordRule(
new IWordDetector()
{
public boolean isWordStart(char c)
{
return c == '#';
}
public boolean isWordPart(char c)
{
return Character.isJavaIdentifierStart(c)
|| Character.isJavaIdentifierPart(c);
}
}, TOKEN_VARIABLE);
rules.add(variableRule);
setRuleList(rules);
}
//~ Methods ...............................................................
// ----------------------------------------------------------
private void setRuleList(List<IPredicateRule> rules)
{
IPredicateRule[] result = new IPredicateRule[rules.size()];
rules.toArray(result);
setPredicateRules(result);
}
// ----------------------------------------------------------
protected void addWords(WordRule rule, String[] tokens, IToken token)
{
for (int i = 0; i < tokens.length; i++)
{
rule.addWord(tokens[i], token);
}
}
//~ Nested classes ........................................................
// ----------------------------------------------------------
private class PredicateWordRule extends WordRule implements IPredicateRule
{
//~ Constructor .......................................................
// ----------------------------------------------------------
public PredicateWordRule(IWordDetector detector, IToken defaultToken)
{
super(detector, defaultToken);
}
//~ Methods ...........................................................
// ----------------------------------------------------------
public IToken getSuccessToken()
{
return Token.UNDEFINED;
}
// ----------------------------------------------------------
public IToken evaluate(ICharacterScanner scanner, boolean resume)
{
return null;
}
// ----------------------------------------------------------
private void addWords(String[] tokens, IToken token)
{
for (int i = 0; i < tokens.length; i++)
{
addWord(tokens[i], token);
}
}
}
//~ Static/instance variables .............................................
public final static String OGNL_DEFAULT = "__ognl_default"; //$NON-NLS-1$
public final static String OGNL_KEYWORD = "__ognl_keyword"; //$NON-NLS-1$
public final static String OGNL_STRING = "__ognl_string"; //$NON-NLS-1$
public final static String OGNL_STATIC_METHOD = "__ognl_static_method"; //$NON-NLS-1$
public final static String OGNL_VARIABLE = "__ognl_variable"; //$NON-NLS-1$
public final static IToken TOKEN_STRING = new Token(OGNL_STRING);
public final static IToken TOKEN_DEFAULT = new Token(OGNL_DEFAULT);
public final static IToken TOKEN_KEYWORD = new Token(OGNL_KEYWORD);
public final static IToken TOKEN_STATIC_METHOD = new Token(
OGNL_STATIC_METHOD);
public final static IToken TOKEN_VARIABLE = new Token(OGNL_VARIABLE);
/** Array of keyword token strings. */
private static String[] keywordTokens = { "and", //$NON-NLS-1$
"band", //$NON-NLS-1$
"bor", //$NON-NLS-1$
"eq", //$NON-NLS-1$
"false", //$NON-NLS-1$
"gt", //$NON-NLS-1$
"gte", //$NON-NLS-1$
"in", //$NON-NLS-1$
"instanceof", //$NON-NLS-1$
"lt", //$NON-NLS-1$
"lte", //$NON-NLS-1$
"neq", //$NON-NLS-1$
"new", //$NON-NLS-1$
"not", //$NON-NLS-1$
"null", //$NON-NLS-1$
"or", //$NON-NLS-1$
"shl", //$NON-NLS-1$
"shr", //$NON-NLS-1$
"ushr", //$NON-NLS-1$
// "this", //$NON-NLS-1$
"true", //$NON-NLS-1$
"xor", //$NON-NLS-1$
};
}