diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/TokenMgrError.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/TokenMgrError.java new file mode 100644 index 0000000000..90ca6c69e4 --- /dev/null +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/TokenMgrError.java @@ -0,0 +1,148 @@ + +package net.sourceforge.pmd.lang.vf; + +import net.sourceforge.pmd.lang.ast.AbstractTokenManager; + +/** Token Manager Error. */ +public class TokenMgrError extends RuntimeException +{ + + /** + * The version identifier for this Serializable class. + * Increment only if the serialized form of the + * class changes. + */ + private static final long serialVersionUID = 1L; + + /* + * Ordinals for various reasons why an Error of this type can be thrown. + */ + + /** + * Lexical error occurred. + */ + public static final int LEXICAL_ERROR = 0; + + /** + * An attempt was made to create a second instance of a static token manager. + */ + public static final int STATIC_LEXER_ERROR = 1; + + /** + * Tried to change to an invalid lexical state. + */ + public static final int INVALID_LEXICAL_STATE = 2; + + /** + * Detected (and bailed out of) an infinite loop in the token manager. + */ + public static final int LOOP_DETECTED = 3; + + /** + * Indicates the reason why the exception is thrown. It will have + * one of the above 4 values. + */ + int errorCode; + + /** + * Replaces unprintable characters by their escaped (or unicode escaped) + * equivalents in the given string + */ + public static final String addEscapes(String str) { + StringBuffer retval = new StringBuffer(); + char ch; + for (int i = 0; i < str.length(); i++) { + switch (str.charAt(i)) + { + case 0 : + continue; + case '\b': + retval.append("\\b"); + continue; + case '\t': + retval.append("\\t"); + continue; + case '\n': + retval.append("\\n"); + continue; + case '\f': + retval.append("\\f"); + continue; + case '\r': + retval.append("\\r"); + continue; + case '\"': + retval.append("\\\""); + continue; + case '\'': + retval.append("\\\'"); + continue; + case '\\': + retval.append("\\\\"); + continue; + default: + if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { + String s = "0000" + Integer.toString(ch, 16); + retval.append("\\u" + s.substring(s.length() - 4, s.length())); + } else { + retval.append(ch); + } + continue; + } + } + return retval.toString(); + } + + /** + * Returns a detailed message for the Error when it is thrown by the + * token manager to indicate a lexical error. + * Parameters : + * EOFSeen : indicates if EOF caused the lexical error + * curLexState : lexical state in which this error occurred + * errorLine : line number when the error occurred + * errorColumn : column number when the error occurred + * errorAfter : prefix that was seen before this error occurred + * curchar : the offending character + * Note: You can customize the lexical error message by modifying this method. + */ + protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { + return("Lexical error in file " + AbstractTokenManager.getFileName() + " at line " + + errorLine + ", column " + + errorColumn + ". Encountered: " + + (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + + "after : \"" + addEscapes(errorAfter) + "\""); + } + + /** + * You can also modify the body of this method to customize your error messages. + * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not + * of end-users concern, so you can return something like : + * + * "Internal Error : Please file a bug report .... " + * + * from this method for such cases in the release version of your parser. + */ + public String getMessage() { + return super.getMessage(); + } + + /* + * Constructors of various flavors follow. + */ + + /** No arg constructor. */ + public TokenMgrError() { + } + + /** Constructor with message and reason. */ + public TokenMgrError(String message, int reason) { + super(message); + errorCode = reason; + } + + /** Full Constructor. */ + public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { + this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); + } +} +/* JavaCC - OriginalChecksum=c85aad4d5805fc96f6457a5c4cee44ab (do not edit this line) */ diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTExpression.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTExpression.java new file mode 100644 index 0000000000..ec6055597f --- /dev/null +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTExpression.java @@ -0,0 +1,21 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.vf.ast; + +public class ASTExpression extends AbstractVFNode { + public ASTExpression(int id) { + super(id); + } + + public ASTExpression(VfParser p, int id) { + super(p, id); + } + + /** Accept the visitor. **/ + public Object jjtAccept(VfParserVisitor visitor, Object data) { + + return visitor.visit(this, data); + } +} diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTFunctionCall.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTFunctionCall.java new file mode 100644 index 0000000000..5c522c0217 --- /dev/null +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTFunctionCall.java @@ -0,0 +1,21 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.vf.ast; + +public class ASTFunctionCall extends AbstractVFNode { + public ASTFunctionCall(int id) { + super(id); + } + + public ASTFunctionCall(VfParser p, int id) { + super(p, id); + } + + /** Accept the visitor. **/ + public Object jjtAccept(VfParserVisitor visitor, Object data) { + + return visitor.visit(this, data); + } +} diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTIdentifier.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTIdentifier.java new file mode 100644 index 0000000000..1286ee029f --- /dev/null +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTIdentifier.java @@ -0,0 +1,21 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.vf.ast; + +public class ASTIdentifier extends AbstractVFNode { + public ASTIdentifier(int id) { + super(id); + } + + public ASTIdentifier(VfParser p, int id) { + super(p, id); + } + + /** Accept the visitor. **/ + public Object jjtAccept(VfParserVisitor visitor, Object data) { + + return visitor.visit(this, data); + } +} diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTLiteral.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTLiteral.java new file mode 100644 index 0000000000..9694247107 --- /dev/null +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTLiteral.java @@ -0,0 +1,21 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.vf.ast; + +public class ASTLiteral extends AbstractVFNode { + public ASTLiteral(int id) { + super(id); + } + + public ASTLiteral(VfParser p, int id) { + super(p, id); + } + + /** Accept the visitor. **/ + public Object jjtAccept(VfParserVisitor visitor, Object data) { + + return visitor.visit(this, data); + } +} diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java index 06b07ffd51..98aee17a00 100644 --- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java @@ -67,4 +67,20 @@ public class VfParserVisitorAdapter implements VfParserVisitor { public Object visit(ASTHtmlStyle node, Object data) { return visit((VfNode) node, data); } + + @Override + public Object visit(ASTLiteral node, Object data) { + return visit((VfNode) node, data); + } + + @Override + public Object visit(ASTIdentifier node, Object data) { + return visit((VfNode) node, data); + } + + @Override + public Object visit(ASTExpression node, Object data) { + return visit((VfNode) node, data); + } + } diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java index 265d6e37ac..a76e0d691e 100644 --- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java @@ -22,8 +22,12 @@ import net.sourceforge.pmd.lang.vf.ast.ASTDoctypeDeclaration; import net.sourceforge.pmd.lang.vf.ast.ASTDoctypeExternalId; import net.sourceforge.pmd.lang.vf.ast.ASTElExpression; import net.sourceforge.pmd.lang.vf.ast.ASTElement; +import net.sourceforge.pmd.lang.vf.ast.ASTExpression; +import net.sourceforge.pmd.lang.vf.ast.ASTFunctionCall; import net.sourceforge.pmd.lang.vf.ast.ASTHtmlScript; import net.sourceforge.pmd.lang.vf.ast.ASTHtmlStyle; +import net.sourceforge.pmd.lang.vf.ast.ASTIdentifier; +import net.sourceforge.pmd.lang.vf.ast.ASTLiteral; import net.sourceforge.pmd.lang.vf.ast.ASTText; import net.sourceforge.pmd.lang.vf.ast.ASTUnparsedText; import net.sourceforge.pmd.lang.vf.ast.VfNode; @@ -111,4 +115,21 @@ public abstract class AbstractVfRule extends AbstractRule implements VfParserVis public Object visit(ASTHtmlStyle node, Object data) { return visit((VfNode) node, data); } + + public Object visit(ASTLiteral node, Object data) { + return visit((VfNode) node, data); + } + + public Object visit(ASTIdentifier node, Object data) { + return visit((VfNode) node, data); + } + + public Object visit(ASTExpression node, Object data) { + return visit((VfNode) node, data); + } + + public Object visit(ASTFunctionCall node, Object data) { + return visit((VfNode) node, data); + } + } diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/security/VfUnescapeElRule.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/security/VfUnescapeElRule.java index 074c32fbb9..b7959994b1 100644 --- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/security/VfUnescapeElRule.java +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/security/VfUnescapeElRule.java @@ -30,6 +30,7 @@ public class VfUnescapeElRule extends AbstractVfRule { private static final String APEX_SELECT_OPTION = "apex:selectoption "; private static final String FALSE = "false"; + @Override public Object visit(ASTElement node, Object data) { if (doesTagSupportEscaping(node)) {