| Description: | StringTokenizer.nextToken() is invoked without prior check of hasMoreTokens(). This usage may be safe from context, since the tokenized value is an RBG color value which has a known number of tokens. However, the usage is unsafe against invalid values and we, therefore, consider it a misuse. | 
            
                            | Code with Misuse: | class WebColors {
	/**
	 * Gives you a BaseColor based on a name.
	 *
	 * @param name
	 *            a name such as black, violet, cornflowerblue or #RGB or #RRGGBB
     *            or RGB or RRGGBB or rgb(R,G,B)
	 * @return the corresponding BaseColor object.  Never returns null.
	 * @throws IllegalArgumentException
	 *             if the String isn't a know representation of a color.
	 */
	public static BaseColor getRGBColor(String name)
			throws IllegalArgumentException {
		int[] c = { 0, 0, 0, 255 };
		name = name.toLowerCase();
		boolean colorStrWithoutHash = missingHashColorFormat(name);
		if (name.startsWith("#") || colorStrWithoutHash) {
		    if (!colorStrWithoutHash) {
		        name = name.substring(1); // lop off the # to unify hex parsing.
		    }
			if (name.length() == 3) {
			    String s = name.substring(0, 1);
				c[0] = Integer.parseInt(s+s, 16);
				String s2 = name.substring(1, 2);
                c[1] = Integer.parseInt(s2+s2, 16);
				String s3 = name.substring(2);
                c[2] = Integer.parseInt(s3+s3, 16);
				return new BaseColor(c[0], c[1], c[2], c[3]);
			}
			if (name.length() == 6) {
				c[0] = Integer.parseInt(name.substring(0, 2), 16);
				c[1] = Integer.parseInt(name.substring(2, 4), 16);
				c[2] = Integer.parseInt(name.substring(4), 16);
				return new BaseColor(c[0], c[1], c[2], c[3]);
			}
			throw new IllegalArgumentException(MessageLocalization.getComposedMessage("unknown.color.format.must.be.rgb.or.rrggbb"));
		}
        else if (name.startsWith("rgb(")) {
            StringTokenizer tok = new StringTokenizer(name, "rgb(), \t\r\n\f");
            for (int k = 0; k < 3; ++k) {
                String v = tok.nextToken();
                if (v.endsWith("%"))
                    c[k] = Integer.parseInt(v.substring(0, v.length() - 1)) * 255 / 100;
                else
                    c[k] = Integer.parseInt(v);
                if (c[k] < 0)
                    c[k] = 0;
                else if (c[k] > 255)
                    c[k] = 255;
            }
            return new BaseColor(c[0], c[1], c[2], c[3]);
        }
		if (!NAMES.containsKey(name))
			// TODO localize this error message.
			throw new IllegalArgumentException("Color '" + name
					+ "' not found.");
		c = NAMES.get(name);
		return new BaseColor(c[0], c[1], c[2], c[3]);
	}
}
 |