001: /*
002: * Hammurapi
003: * Automated Java code review system.
004: * Copyright (C) 2004 Hammurapi Group
005: *
006: * This program is free software; you can redistribute it and/or modify
007: * it under the terms of the GNU General Public License as published by
008: * the Free Software Foundation; either version 2 of the License, or
009: * (at your option) any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: * GNU General Public License for more details.
015: *
016: * You should have received a copy of the GNU General Public License
017: * along with this program; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: *
020: * URL: http://www.hammurapi.org
021: * e-Mail: support@hammurapi.biz
022: */
023: package org.hammurapi.inspectors;
024:
025: import java.util.Iterator;
026:
027: import com.pavelvlasov.config.ConfigurationException;
028: import com.pavelvlasov.config.Parameterizable;
029: import com.pavelvlasov.jsel.LanguageElement;
030: import com.pavelvlasov.jsel.expressions.DoubleConstant;
031: import com.pavelvlasov.jsel.expressions.FloatConstant;
032: import com.pavelvlasov.jsel.expressions.IntegerConstant;
033: import com.pavelvlasov.jsel.expressions.LongConstant;
034:
035: /**
036: * ER-011
037: * Avoid hardwired numeric literals
038: * @author Pavel Vlasov
039: * @version $Revision: 1.2 $
040: */
041: public class HardcodedNumericLiteralsRule extends HardcodedLiteralsRule
042: implements Parameterizable {
043:
044: /**
045: * Reviews the double constant literals, if they are allowed.
046: *
047: * @param element the literal to be reviewed.
048: */
049: public void visit(DoubleConstant element) {
050: if (!isAllowed(element.getValue())) {
051: analyze((LanguageElement) element);
052: }
053: }
054:
055: /**
056: * Reviews the float constant literals, if they are allowed.
057: *
058: * @param element the literal to be reviewed.
059: */
060: public void visit(FloatConstant element) {
061: if (!isAllowed(element.getValue())) {
062: analyze((LanguageElement) element);
063: }
064: }
065:
066: /**
067: * Reviews the int constant literals, if they are allowed.
068: *
069: * @param element the literal to be reviewed.
070: */
071: public void visit(IntegerConstant element) {
072: if (!isAllowed(element.getValue())) {
073: analyze((LanguageElement) element);
074: }
075: }
076:
077: /**
078: * Reviews the long constant literals, if they are allowed.
079: *
080: * @param element the literal to be reviewed.
081: */
082: public void visit(LongConstant element) {
083: if (!isAllowed(element.getValue())) {
084: analyze((LanguageElement) element);
085: }
086: }
087:
088: /**
089: * Stores the setting form the configuration for the allowed
090: * number literals. They are acceptable as double.
091: */
092: private java.util.Set allowedLiterals = new java.util.HashSet();
093:
094: /**
095: * Checks if a double value is in the allowed list.
096: * It looks through the allowed list.
097: *
098: * @param value the value to be checked.
099: * @return true if the value is in the allowed list.
100: */
101: private boolean isAllowed(double value) {
102: return allowedLiterals.contains(new Double(value));
103: }
104:
105: /**
106: * Configures rule. Reads in the values of the parameters containing the
107: * allowed numeric literals. It checks them if they can be parsed as double.
108: *
109: * @param name the name of the parameter being loaded from Hammurapi configuration
110: * @param value the value of the parameter being loaded from Hammurapi configuration
111: * @exception ConfigurationException in case of a not supported parameter name, or value.
112: */
113: public boolean setParameter(String name, Object parameter)
114: throws ConfigurationException {
115: if ("allowed-literal".equals(name)) {
116: allowedLiterals.add(parameter);
117: return true;
118: } else {
119: throw new ConfigurationException("Parameter '" + name
120: + "' is not supported by " + getClass().getName());
121: }
122: }
123:
124: /**
125: * Gives back the preconfigured values.
126: */
127: public String getConfigInfo() {
128: StringBuffer ret = new StringBuffer(
129: "Allowed numeric literals:\n");
130: Iterator it = allowedLiterals.iterator();
131: while (it.hasNext()) {
132: ret.append("\t");
133: ret.append(it.next());
134: ret.append("\n");
135: }
136: return ret.toString();
137: }
138: }
|