8029800: Flags.java uses String.toLowerCase without specifying Locale

Introducing StringUtils.toLowerCase/toUpperCase independent on the default locale, converting almost all usages of String.toLowerCase/toUpperCase to use the new methods.

Reviewed-by: jjg, bpatel
This commit is contained in:
Jan Lahoda 2013-12-17 10:55:59 +01:00
parent b06d1bfb55
commit 8ebb81fb7a
28 changed files with 336 additions and 67 deletions

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,6 +25,8 @@
package com.sun.tools.classfile; package com.sun.tools.classfile;
import java.util.Locale;
/** /**
* See JVMS, chapter 6. * See JVMS, chapter 6.
* *
@ -211,7 +213,7 @@ public class Instruction {
if (opcode == null) if (opcode == null)
return "bytecode " + getUnsignedByte(0); return "bytecode " + getUnsignedByte(0);
else else
return opcode.toString().toLowerCase(); return opcode.toString().toLowerCase(Locale.US);
} }
/** Get the length, in bytes, of this instruction, including the opcode /** Get the length, in bytes, of this instruction, including the opcode

View file

@ -37,6 +37,7 @@ import com.sun.tools.doclets.internal.toolkit.util.*;
import com.sun.tools.doclint.DocLint; import com.sun.tools.doclint.DocLint;
import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.StringUtils;
import com.sun.tools.javadoc.RootDocImpl; import com.sun.tools.javadoc.RootDocImpl;
/** /**
@ -237,7 +238,7 @@ public class ConfigurationImpl extends Configuration {
public void setSpecificDocletOptions(String[][] options) { public void setSpecificDocletOptions(String[][] options) {
for (int oi = 0; oi < options.length; ++oi) { for (int oi = 0; oi < options.length; ++oi) {
String[] os = options[oi]; String[] os = options[oi];
String opt = os[0].toLowerCase(); String opt = StringUtils.toLowerCase(os[0]);
if (opt.equals("-footer")) { if (opt.equals("-footer")) {
footer = os[1]; footer = os[1];
} else if (opt.equals("-header")) { } else if (opt.equals("-header")) {
@ -325,7 +326,7 @@ public class ConfigurationImpl extends Configuration {
return result; return result;
} }
// otherwise look for the options we have added // otherwise look for the options we have added
option = option.toLowerCase(); option = StringUtils.toLowerCase(option);
if (option.equals("-nodeprecatedlist") || if (option.equals("-nodeprecatedlist") ||
option.equals("-noindex") || option.equals("-noindex") ||
option.equals("-notree") || option.equals("-notree") ||
@ -389,7 +390,7 @@ public class ConfigurationImpl extends Configuration {
// otherwise look at our options // otherwise look at our options
for (int oi = 0; oi < options.length; ++oi) { for (int oi = 0; oi < options.length; ++oi) {
String[] os = options[oi]; String[] os = options[oi];
String opt = os[0].toLowerCase(); String opt = StringUtils.toLowerCase(os[0]);
if (opt.equals("-helpfile")) { if (opt.equals("-helpfile")) {
if (nohelp == true) { if (nohelp == true) {
reporter.printError(getText("doclet.Option_conflict", reporter.printError(getText("doclet.Option_conflict",

View file

@ -34,6 +34,7 @@ import com.sun.tools.doclets.formats.html.markup.*;
import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.*;
import com.sun.tools.doclets.internal.toolkit.taglets.*; import com.sun.tools.doclets.internal.toolkit.taglets.*;
import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.util.*;
import com.sun.tools.javac.util.StringUtils;
/** /**
* Class for the Html Format Code Generation specific to JavaDoc. * Class for the Html Format Code Generation specific to JavaDoc.
@ -138,17 +139,17 @@ public class HtmlDocletWriter extends HtmlDocWriter {
if (index < 0) { if (index < 0) {
return htmlstr; return htmlstr;
} }
String lowerHtml = htmlstr.toLowerCase(); String lowerHtml = StringUtils.toLowerCase(htmlstr);
final String docroot = "{@docroot}";
// Return index of first occurrence of {@docroot} // Return index of first occurrence of {@docroot}
// Note: {@docRoot} is not case sensitive when passed in w/command line option // Note: {@docRoot} is not case sensitive when passed in w/command line option
index = lowerHtml.indexOf("{@docroot}", index); index = lowerHtml.indexOf(docroot, index);
if (index < 0) { if (index < 0) {
return htmlstr; return htmlstr;
} }
StringBuilder buf = new StringBuilder(); StringBuilder buf = new StringBuilder();
int previndex = 0; int previndex = 0;
while (true) { while (true) {
final String docroot = "{@docroot}";
// Search for lowercase version of {@docRoot} // Search for lowercase version of {@docRoot}
index = lowerHtml.indexOf(docroot, previndex); index = lowerHtml.indexOf(docroot, previndex);
// If next {@docRoot} tag not found, append rest of htmlstr and exit loop // If next {@docRoot} tag not found, append rest of htmlstr and exit loop
@ -1689,13 +1690,13 @@ public class HtmlDocletWriter extends HtmlDocWriter {
} }
//Redirect all relative links. //Redirect all relative links.
int end, begin = text.toLowerCase().indexOf("<a"); int end, begin = StringUtils.toLowerCase(text).indexOf("<a");
if(begin >= 0){ if(begin >= 0){
StringBuilder textBuff = new StringBuilder(text); StringBuilder textBuff = new StringBuilder(text);
while(begin >=0){ while(begin >=0){
if (textBuff.length() > begin + 2 && ! Character.isWhitespace(textBuff.charAt(begin+2))) { if (textBuff.length() > begin + 2 && ! Character.isWhitespace(textBuff.charAt(begin+2))) {
begin = textBuff.toString().toLowerCase().indexOf("<a", begin + 1); begin = StringUtils.toLowerCase(textBuff.toString()).indexOf("<a", begin + 1);
continue; continue;
} }
@ -1722,15 +1723,16 @@ public class HtmlDocletWriter extends HtmlDocWriter {
} }
} }
String relativeLink = textBuff.substring(begin, end); String relativeLink = textBuff.substring(begin, end);
if (!(relativeLink.toLowerCase().startsWith("mailto:") || String relativeLinkLowerCase = StringUtils.toLowerCase(relativeLink);
relativeLink.toLowerCase().startsWith("http:") || if (!(relativeLinkLowerCase.startsWith("mailto:") ||
relativeLink.toLowerCase().startsWith("https:") || relativeLinkLowerCase.startsWith("http:") ||
relativeLink.toLowerCase().startsWith("file:"))) { relativeLinkLowerCase.startsWith("https:") ||
relativeLinkLowerCase.startsWith("file:"))) {
relativeLink = "{@"+(new DocRootTaglet()).getName() + "}/" relativeLink = "{@"+(new DocRootTaglet()).getName() + "}/"
+ redirectPathFromRoot.resolve(relativeLink).getPath(); + redirectPathFromRoot.resolve(relativeLink).getPath();
textBuff.replace(begin, end, relativeLink); textBuff.replace(begin, end, relativeLink);
} }
begin = textBuff.toString().toLowerCase().indexOf("<a", begin + 1); begin = StringUtils.toLowerCase(textBuff.toString()).indexOf("<a", begin + 1);
} }
return textBuff.toString(); return textBuff.toString();
} }
@ -1771,7 +1773,7 @@ public class HtmlDocletWriter extends HtmlDocWriter {
break main; break main;
ch = text.charAt(currPos); ch = text.charAt(currPos);
} }
if (ch == '>' && blockTags.contains(text.substring(tagPos, currPos).toLowerCase())) { if (ch == '>' && blockTags.contains(StringUtils.toLowerCase(text.substring(tagPos, currPos)))) {
result.append(text, startPos, lessThanPos); result.append(text, startPos, lessThanPos);
startPos = currPos + 1; startPos = currPos + 1;
} }

View file

@ -31,6 +31,7 @@ import com.sun.javadoc.*;
import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.formats.html.markup.*;
import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.*;
import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.util.*;
import com.sun.tools.javac.util.StringUtils;
/** /**
* Writes method documentation in HTML format. * Writes method documentation in HTML format.
@ -338,7 +339,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
return ""; return "";
} }
String lc = tag.toLowerCase(); String lc = StringUtils.toLowerCase(tag);
int begin = lc.indexOf("<code>"); int begin = lc.indexOf("<code>");
int end = lc.indexOf("</code>"); int end = lc.indexOf("</code>");
if(begin == -1 || end == -1 || end <= begin){ if(begin == -1 || end == -1 || end <= begin){

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,6 +25,8 @@
package com.sun.tools.doclets.formats.html.markup; package com.sun.tools.doclets.formats.html.markup;
import com.sun.tools.javac.util.StringUtils;
/** /**
* Enum representing HTML tag attributes. * Enum representing HTML tag attributes.
* *
@ -64,7 +66,7 @@ public enum HtmlAttr {
private final String value; private final String value;
HtmlAttr() { HtmlAttr() {
this.value = name().toLowerCase(); this.value = StringUtils.toLowerCase(name());
} }
HtmlAttr(String name) { HtmlAttr(String name) {

View file

@ -25,7 +25,7 @@
package com.sun.tools.doclets.formats.html.markup; package com.sun.tools.doclets.formats.html.markup;
import java.util.Locale; import com.sun.tools.javac.util.StringUtils;
/** /**
* Enum representing HTML tags. * Enum representing HTML tags.
@ -117,7 +117,7 @@ public enum HtmlTag {
HtmlTag(BlockType blockType, EndTag endTag ) { HtmlTag(BlockType blockType, EndTag endTag ) {
this.blockType = blockType; this.blockType = blockType;
this.endTag = endTag; this.endTag = endTag;
this.value = name().toLowerCase(Locale.US); this.value = StringUtils.toLowerCase(name());
} }
/** /**

View file

@ -29,6 +29,7 @@ import java.io.*;
import java.util.*; import java.util.*;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.tools.JavaFileManager;
import com.sun.javadoc.*; import com.sun.javadoc.*;
import com.sun.tools.javac.sym.Profiles; import com.sun.tools.javac.sym.Profiles;
@ -36,7 +37,7 @@ import com.sun.tools.javac.jvm.Profile;
import com.sun.tools.doclets.internal.toolkit.builders.BuilderFactory; import com.sun.tools.doclets.internal.toolkit.builders.BuilderFactory;
import com.sun.tools.doclets.internal.toolkit.taglets.*; import com.sun.tools.doclets.internal.toolkit.taglets.*;
import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.util.*;
import javax.tools.JavaFileManager; import com.sun.tools.javac.util.StringUtils;
/** /**
* Configure the output based on the options. Doclets should sub-class * Configure the output based on the options. Doclets should sub-class
@ -337,7 +338,7 @@ public abstract class Configuration {
* Negative value means error occurred. * Negative value means error occurred.
*/ */
public int optionLength(String option) { public int optionLength(String option) {
option = option.toLowerCase(); option = StringUtils.toLowerCase(option);
if (option.equals("-author") || if (option.equals("-author") ||
option.equals("-docfilessubdirs") || option.equals("-docfilessubdirs") ||
option.equals("-javafx") || option.equals("-javafx") ||
@ -454,7 +455,7 @@ public abstract class Configuration {
// the output directory has already been created: so do that first. // the output directory has already been created: so do that first.
for (int oi = 0; oi < options.length; ++oi) { for (int oi = 0; oi < options.length; ++oi) {
String[] os = options[oi]; String[] os = options[oi];
String opt = os[0].toLowerCase(); String opt = StringUtils.toLowerCase(os[0]);
if (opt.equals("-d")) { if (opt.equals("-d")) {
destDirName = addTrailingFileSep(os[1]); destDirName = addTrailingFileSep(os[1]);
docFileDestDirName = destDirName; docFileDestDirName = destDirName;
@ -465,7 +466,7 @@ public abstract class Configuration {
for (int oi = 0; oi < options.length; ++oi) { for (int oi = 0; oi < options.length; ++oi) {
String[] os = options[oi]; String[] os = options[oi];
String opt = os[0].toLowerCase(); String opt = StringUtils.toLowerCase(os[0]);
if (opt.equals("-docfilessubdirs")) { if (opt.equals("-docfilessubdirs")) {
copydocfilesubdirs = true; copydocfilesubdirs = true;
} else if (opt.equals("-docencoding")) { } else if (opt.equals("-docencoding")) {
@ -708,7 +709,7 @@ public abstract class Configuration {
String encoding = ""; String encoding = "";
for (int oi = 0; oi < options.length; oi++) { for (int oi = 0; oi < options.length; oi++) {
String[] os = options[oi]; String[] os = options[oi];
String opt = os[0].toLowerCase(); String opt = StringUtils.toLowerCase(os[0]);
if (opt.equals("-docencoding")) { if (opt.equals("-docencoding")) {
docencodingfound = true; docencodingfound = true;
if (!checkOutputFileEncoding(os[1], reporter)) { if (!checkOutputFileEncoding(os[1], reporter)) {

View file

@ -384,13 +384,13 @@ public class MemberSummaryBuilder extends AbstractMemberBuilder {
commentTextBuilder.append( commentTextBuilder.append(
MessageFormat.format( MessageFormat.format(
configuration.getText("doclet.PropertySetterWithName"), configuration.getText("doclet.PropertySetterWithName"),
Util.propertyNameFromMethodName(member.name()))); Util.propertyNameFromMethodName(configuration, member.name())));
} }
if (isGetter) { if (isGetter) {
commentTextBuilder.append( commentTextBuilder.append(
MessageFormat.format( MessageFormat.format(
configuration.getText("doclet.PropertyGetterWithName"), configuration.getText("doclet.PropertyGetterWithName"),
Util.propertyNameFromMethodName(member.name()))); Util.propertyNameFromMethodName(configuration, member.name())));
} }
if (propertyDoc.commentText() != null if (propertyDoc.commentText() != null
&& !propertyDoc.commentText().isEmpty()) { && !propertyDoc.commentText().isEmpty()) {

View file

@ -31,6 +31,7 @@ import java.util.*;
import com.sun.javadoc.*; import com.sun.javadoc.*;
import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.*;
import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.util.*;
import com.sun.tools.javac.util.StringUtils;
/** /**
* Builds the serialized form. * Builds the serialized form.
@ -567,7 +568,7 @@ public class SerializedFormBuilder extends AbstractBuilder {
} }
Tag[] serial = doc.tags("serial"); Tag[] serial = doc.tags("serial");
if (serial.length > 0) { if (serial.length > 0) {
String serialtext = serial[0].text().toLowerCase(); String serialtext = StringUtils.toLowerCase(serial[0].text());
if (serialtext.indexOf("exclude") >= 0) { if (serialtext.indexOf("exclude") >= 0) {
return false; return false;
} else if (serialtext.indexOf("include") >= 0) { } else if (serialtext.indexOf("include") >= 0) {

View file

@ -28,6 +28,7 @@ package com.sun.tools.doclets.internal.toolkit.taglets;
import com.sun.javadoc.*; import com.sun.javadoc.*;
import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.Content;
import com.sun.tools.doclets.internal.toolkit.util.DocFinder; import com.sun.tools.doclets.internal.toolkit.util.DocFinder;
import com.sun.tools.javac.util.StringUtils;
/** /**
* A simple single argument custom tag. * A simple single argument custom tag.
@ -110,7 +111,7 @@ public class SimpleTaglet extends BaseTaglet implements InheritableTaglet {
public SimpleTaglet(String tagName, String header, String locations) { public SimpleTaglet(String tagName, String header, String locations) {
this.tagName = tagName; this.tagName = tagName;
this.header = header; this.header = header;
locations = locations.toLowerCase(); locations = StringUtils.toLowerCase(locations);
if (locations.indexOf(ALL) != -1 && locations.indexOf(EXCLUDED) == -1) { if (locations.indexOf(ALL) != -1 && locations.indexOf(EXCLUDED) == -1) {
this.locations = PACKAGE + TYPE + FIELD + METHOD + CONSTRUCTOR + OVERVIEW; this.locations = PACKAGE + TYPE + FIELD + METHOD + CONSTRUCTOR + OVERVIEW;
} else { } else {

View file

@ -35,6 +35,7 @@ import javax.tools.JavaFileManager;
import com.sun.javadoc.*; import com.sun.javadoc.*;
import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.util.*;
import com.sun.tools.javac.util.StringUtils;
/** /**
* Manages the<code>Taglet</code>s used by doclets. * Manages the<code>Taglet</code>s used by doclets.
@ -304,7 +305,7 @@ public class TagletManager {
return; return;
} }
Taglet tag = customTags.get(tagName); Taglet tag = customTags.get(tagName);
locations = locations.toLowerCase(); locations = StringUtils.toLowerCase(locations);
if (tag == null || header != null) { if (tag == null || header != null) {
customTags.remove(tagName); customTags.remove(tagName);
customTags.put(tagName, new SimpleTaglet(tagName, header, locations)); customTags.put(tagName, new SimpleTaglet(tagName, header, locations));
@ -375,7 +376,7 @@ public class TagletManager {
name = name.substring(1, name.length()); name = name.substring(1, name.length());
} }
if (! (standardTags.contains(name) || customTags.containsKey(name))) { if (! (standardTags.contains(name) || customTags.containsKey(name))) {
if (standardTagsLowercase.contains(name.toLowerCase())) { if (standardTagsLowercase.contains(StringUtils.toLowerCase(name))) {
message.warning(tags[i].position(), "doclet.UnknownTagLowercase", tags[i].name()); message.warning(tags[i].position(), "doclet.UnknownTagLowercase", tags[i].name());
continue; continue;
} else { } else {
@ -708,7 +709,7 @@ public class TagletManager {
private void initStandardTagsLowercase() { private void initStandardTagsLowercase() {
Iterator<String> it = standardTags.iterator(); Iterator<String> it = standardTags.iterator();
while (it.hasNext()) { while (it.hasNext()) {
standardTagsLowercase.add(it.next().toLowerCase()); standardTagsLowercase.add(StringUtils.toLowerCase(it.next()));
} }
} }

View file

@ -28,11 +28,12 @@ package com.sun.tools.doclets.internal.toolkit.util;
import java.io.*; import java.io.*;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.util.*; import java.util.*;
import javax.tools.StandardLocation;
import com.sun.javadoc.*; import com.sun.javadoc.*;
import com.sun.javadoc.AnnotationDesc.ElementValuePair; import com.sun.javadoc.AnnotationDesc.ElementValuePair;
import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.*;
import javax.tools.StandardLocation; import com.sun.tools.javac.util.StringUtils;
/** /**
* Utilities Class for Doclets. * Utilities Class for Doclets.
@ -253,8 +254,8 @@ public class Util {
*/ */
private static class TypeComparator implements Comparator<Type> { private static class TypeComparator implements Comparator<Type> {
public int compare(Type type1, Type type2) { public int compare(Type type1, Type type2) {
return type1.qualifiedTypeName().toLowerCase().compareTo( return type1.qualifiedTypeName().compareToIgnoreCase(
type2.qualifiedTypeName().toLowerCase()); type2.qualifiedTypeName());
} }
} }
@ -589,7 +590,7 @@ public class Util {
typeName = "doclet.Enum"; typeName = "doclet.Enum";
} }
return config.getText( return config.getText(
lowerCaseOnly ? typeName.toLowerCase() : typeName); lowerCaseOnly ? StringUtils.toLowerCase(typeName) : typeName);
} }
/** /**
@ -724,7 +725,7 @@ public class Util {
* @param name name of the getter or setter method. * @param name name of the getter or setter method.
* @return the name of the property of the given setter of getter. * @return the name of the property of the given setter of getter.
*/ */
public static String propertyNameFromMethodName(String name) { public static String propertyNameFromMethodName(Configuration configuration, String name) {
String propertyName = null; String propertyName = null;
if (name.startsWith("get") || name.startsWith("set")) { if (name.startsWith("get") || name.startsWith("set")) {
propertyName = name.substring(3); propertyName = name.substring(3);
@ -734,7 +735,7 @@ public class Util {
if ((propertyName == null) || propertyName.isEmpty()){ if ((propertyName == null) || propertyName.isEmpty()){
return ""; return "";
} }
return propertyName.substring(0, 1).toLowerCase() return propertyName.substring(0, 1).toLowerCase(configuration.getLocale())
+ propertyName.substring(1); + propertyName.substring(1);
} }

View file

@ -702,7 +702,7 @@ public class VisibleMemberMap {
private boolean isPropertyGetterOrSetter(MethodDoc[] members, private boolean isPropertyGetterOrSetter(MethodDoc[] members,
MethodDoc methodDoc) { MethodDoc methodDoc) {
boolean found = false; boolean found = false;
String propertyName = Util.propertyNameFromMethodName(methodDoc.name()); String propertyName = Util.propertyNameFromMethodName(configuration, methodDoc.name());
if (!propertyName.isEmpty()) { if (!propertyName.isEmpty()) {
String propertyMethodName = propertyName + "Property"; String propertyMethodName = propertyName + "Property";
for (MethodDoc member: members) { for (MethodDoc member: members) {

View file

@ -80,6 +80,7 @@ import com.sun.source.util.DocTreePathScanner;
import com.sun.source.util.TreePath; import com.sun.source.util.TreePath;
import com.sun.tools.doclint.HtmlTag.AttrKind; import com.sun.tools.doclint.HtmlTag.AttrKind;
import com.sun.tools.javac.tree.DocPretty; import com.sun.tools.javac.tree.DocPretty;
import com.sun.tools.javac.util.StringUtils;
import static com.sun.tools.doclint.Messages.Group.*; import static com.sun.tools.doclint.Messages.Group.*;
@ -243,7 +244,7 @@ public class Checker extends DocTreePathScanner<Void, Void> {
markEnclosingTag(Flag.HAS_TEXT); markEnclosingTag(Flag.HAS_TEXT);
String name = tree.getName().toString(); String name = tree.getName().toString();
if (name.startsWith("#")) { if (name.startsWith("#")) {
int v = name.toLowerCase().startsWith("#x") int v = StringUtils.toLowerCase(name).startsWith("#x")
? Integer.parseInt(name.substring(2), 16) ? Integer.parseInt(name.substring(2), 16)
: Integer.parseInt(name.substring(1), 10); : Integer.parseInt(name.substring(1), 10);
if (!Entity.isValid(v)) { if (!Entity.isValid(v)) {

View file

@ -44,6 +44,7 @@ import com.sun.source.util.SourcePositions;
import com.sun.source.util.TreePath; import com.sun.source.util.TreePath;
import com.sun.tools.javac.model.JavacTypes; import com.sun.tools.javac.model.JavacTypes;
import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.util.StringUtils;
/** /**
* Utility container for current execution environment, * Utility container for current execution environment,
@ -66,7 +67,7 @@ public class Env {
static boolean accepts(String opt) { static boolean accepts(String opt) {
for (AccessKind g: values()) for (AccessKind g: values())
if (opt.equals(g.name().toLowerCase())) return true; if (opt.equals(StringUtils.toLowerCase(g.name()))) return true;
return false; return false;
} }

View file

@ -36,6 +36,7 @@ import java.util.Map;
import javax.lang.model.element.Name; import javax.lang.model.element.Name;
import static com.sun.tools.doclint.HtmlTag.Attr.*; import static com.sun.tools.doclint.HtmlTag.Attr.*;
import com.sun.tools.javac.util.StringUtils;
/** /**
* Enum representing HTML tags. * Enum representing HTML tags.
@ -352,7 +353,7 @@ public enum HtmlTag {
WIDTH; WIDTH;
public String getText() { public String getText() {
return toLowerCase(name()); return StringUtils.toLowerCase(name());
} }
static final Map<String,Attr> index = new HashMap<String,Attr>(); static final Map<String,Attr> index = new HashMap<String,Attr>();
@ -431,11 +432,11 @@ public enum HtmlTag {
} }
public String getText() { public String getText() {
return toLowerCase(name()); return StringUtils.toLowerCase(name());
} }
public Attr getAttr(Name attrName) { public Attr getAttr(Name attrName) {
return Attr.index.get(toLowerCase(attrName.toString())); return Attr.index.get(StringUtils.toLowerCase(attrName.toString()));
} }
public AttrKind getAttrKind(Name attrName) { public AttrKind getAttrKind(Name attrName) {
@ -457,10 +458,7 @@ public enum HtmlTag {
} }
static HtmlTag get(Name tagName) { static HtmlTag get(Name tagName) {
return index.get(toLowerCase(tagName.toString())); return index.get(StringUtils.toLowerCase(tagName.toString()));
} }
private static String toLowerCase(String s) {
return s.toLowerCase(Locale.US);
}
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -42,6 +42,7 @@ import javax.tools.Diagnostic;
import com.sun.source.doctree.DocTree; import com.sun.source.doctree.DocTree;
import com.sun.source.tree.Tree; import com.sun.source.tree.Tree;
import com.sun.tools.doclint.Env.AccessKind; import com.sun.tools.doclint.Env.AccessKind;
import com.sun.tools.javac.util.StringUtils;
/** /**
* Message reporting for DocLint. * Message reporting for DocLint.
@ -67,7 +68,7 @@ public class Messages {
SYNTAX, SYNTAX,
REFERENCE; REFERENCE;
String optName() { return name().toLowerCase(); } String optName() { return StringUtils.toLowerCase(name()); }
String notOptName() { return "-" + optName(); } String notOptName() { return "-" + optName(); }
static boolean accepts(String opt) { static boolean accepts(String opt) {
@ -158,7 +159,7 @@ public class Messages {
static boolean isValidOptions(String opts) { static boolean isValidOptions(String opts) {
for (String opt: opts.split(",")) { for (String opt: opts.split(",")) {
if (!isValidOption(opt.trim().toLowerCase())) if (!isValidOption(StringUtils.toLowerCase(opt.trim())))
return false; return false;
} }
return true; return true;
@ -203,7 +204,7 @@ public class Messages {
setOption(ALL, Env.AccessKind.PRIVATE); setOption(ALL, Env.AccessKind.PRIVATE);
else { else {
for (String opt: opts.split(",")) for (String opt: opts.split(","))
setOption(opt.trim().toLowerCase()); setOption(StringUtils.toLowerCase(opt.trim()));
} }
} }
@ -215,7 +216,7 @@ public class Messages {
int sep = arg.indexOf("/"); int sep = arg.indexOf("/");
if (sep > 0) { if (sep > 0) {
Env.AccessKind ak = Env.AccessKind.valueOf(arg.substring(sep + 1).toUpperCase()); Env.AccessKind ak = Env.AccessKind.valueOf(StringUtils.toUpperCase(arg.substring(sep + 1)));
setOption(arg.substring(0, sep), ak); setOption(arg.substring(0, sep), ak);
} else { } else {
setOption(arg, null); setOption(arg, null);
@ -290,7 +291,7 @@ public class Messages {
out.println("By diagnostic kind..."); out.println("By diagnostic kind...");
Table dkindTable = new Table(); Table dkindTable = new Table();
for (Diagnostic.Kind k : Diagnostic.Kind.values()) { for (Diagnostic.Kind k : Diagnostic.Kind.values()) {
dkindTable.put(k.toString().toLowerCase(), dkindCounts[k.ordinal()]); dkindTable.put(StringUtils.toLowerCase(k.toString()), dkindCounts[k.ordinal()]);
} }
dkindTable.print(out); dkindTable.print(out);
out.println(); out.println();

View file

@ -33,6 +33,7 @@ import java.util.Set;
import javax.lang.model.element.Modifier; import javax.lang.model.element.Modifier;
import com.sun.tools.javac.util.Assert; import com.sun.tools.javac.util.Assert;
import com.sun.tools.javac.util.StringUtils;
/** Access flags and other modifiers for Java classes and members. /** Access flags and other modifiers for Java classes and members.
* *
@ -388,7 +389,7 @@ public class Flags {
Flag(long flag) { Flag(long flag) {
this.value = flag; this.value = flag;
this.lowercaseName = name().toLowerCase(); this.lowercaseName = StringUtils.toLowerCase(name());
} }
@Override @Override

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -51,6 +51,7 @@ import com.sun.tools.javac.main.Option;
import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.ListBuffer;
import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.Log;
import com.sun.tools.javac.util.Options; import com.sun.tools.javac.util.Options;
import com.sun.tools.javac.util.StringUtils;
import javax.tools.JavaFileManager; import javax.tools.JavaFileManager;
import javax.tools.StandardJavaFileManager; import javax.tools.StandardJavaFileManager;
@ -717,7 +718,7 @@ public class Locations {
/** Is this the name of an archive file? */ /** Is this the name of an archive file? */
private boolean isArchive(File file) { private boolean isArchive(File file) {
String n = file.getName().toLowerCase(); String n = StringUtils.toLowerCase(file.getName());
return fsInfo.isFile(file) return fsInfo.isFile(file)
&& (n.endsWith(".jar") || n.endsWith(".zip")); && (n.endsWith(".jar") || n.endsWith(".zip"));
} }

View file

@ -47,6 +47,7 @@ import com.sun.tools.javac.util.Log;
import com.sun.tools.javac.util.Log.PrefixKind; import com.sun.tools.javac.util.Log.PrefixKind;
import com.sun.tools.javac.util.Log.WriterKind; import com.sun.tools.javac.util.Log.WriterKind;
import com.sun.tools.javac.util.Options; import com.sun.tools.javac.util.Options;
import com.sun.tools.javac.util.StringUtils;
import static com.sun.tools.javac.main.Option.ChoiceKind.*; import static com.sun.tools.javac.main.Option.ChoiceKind.*;
import static com.sun.tools.javac.main.Option.OptionGroup.*; import static com.sun.tools.javac.main.Option.OptionGroup.*;
import static com.sun.tools.javac.main.Option.OptionKind.*; import static com.sun.tools.javac.main.Option.OptionKind.*;
@ -713,7 +714,7 @@ public enum Option {
String v = options.get(XPKGINFO); String v = options.get(XPKGINFO);
return (v == null return (v == null
? PkgInfo.LEGACY ? PkgInfo.LEGACY
: PkgInfo.valueOf(v.toUpperCase())); : PkgInfo.valueOf(StringUtils.toUpperCase(v)));
} }
} }

View file

@ -57,6 +57,7 @@ import com.sun.tools.javac.util.Name;
import com.sun.tools.javac.util.Names; import com.sun.tools.javac.util.Names;
import com.sun.tools.javac.util.Options; import com.sun.tools.javac.util.Options;
import com.sun.tools.javac.util.Position; import com.sun.tools.javac.util.Position;
import com.sun.tools.javac.util.StringUtils;
import static com.sun.tools.javac.util.LayoutCharacters.*; import static com.sun.tools.javac.util.LayoutCharacters.*;
/** /**
@ -993,7 +994,7 @@ public class DocCommentParser {
"h1", "h2", "h3", "h4", "h5", "h6", "p", "pre")); "h1", "h2", "h3", "h4", "h5", "h6", "p", "pre"));
protected boolean isSentenceBreak(Name n) { protected boolean isSentenceBreak(Name n) {
return htmlBlockTags.contains(n.toString().toLowerCase()); return htmlBlockTags.contains(StringUtils.toLowerCase(n.toString()));
} }
protected boolean isSentenceBreak(DCTree t) { protected boolean isSentenceBreak(DCTree t) {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -36,6 +36,7 @@ import javax.lang.model.util.*;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.Writer; import java.io.Writer;
import java.util.*; import java.util.*;
import com.sun.tools.javac.util.StringUtils;
/** /**
* A processor which prints out elements. Used to implement the * A processor which prints out elements. Used to implement the
@ -202,7 +203,7 @@ public class PrintingProcessor extends AbstractProcessor {
writer.print("@interface"); writer.print("@interface");
break; break;
default: default:
writer.print(kind.toString().toLowerCase()); writer.print(StringUtils.toLowerCase(kind.toString()));
} }
writer.print(" "); writer.print(" ");
writer.print(e.getSimpleName()); writer.print(e.getSimpleName());

View file

@ -0,0 +1,53 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.javac.util;
import java.util.Locale;
/** A collection of utilities for String manipulation.
*
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
* This code and its internal interfaces are subject to change or
* deletion without notice.</b>
*/
public class StringUtils {
/**Converts the given String to lower case using the {@link Locale#US US Locale}. The result
* is independent of the default Locale in the current JVM instance.
*/
public static String toLowerCase(String source) {
return source.toLowerCase(Locale.US);
}
/**Converts the given String to upper case using the {@link Locale#US US Locale}. The result
* is independent of the default Locale in the current JVM instance.
*/
public static String toUpperCase(String source) {
return source.toUpperCase(Locale.US);
}
}

View file

@ -62,6 +62,7 @@ import com.sun.tools.classfile.StackMap_attribute;
import com.sun.tools.classfile.Synthetic_attribute; import com.sun.tools.classfile.Synthetic_attribute;
import static com.sun.tools.classfile.AccessFlags.*; import static com.sun.tools.classfile.AccessFlags.*;
import com.sun.tools.javac.util.StringUtils;
/* /*
* A writer for writing Attributes as text. * A writer for writing Attributes as text.
@ -717,14 +718,14 @@ public class AttributeWriter extends BasicWriter
} }
static String toHex(int i) { static String toHex(int i) {
return Integer.toString(i, 16).toUpperCase(); return StringUtils.toUpperCase(Integer.toString(i, 16));
} }
static String toHex(int i, int w) { static String toHex(int i, int w) {
String s = Integer.toHexString(i).toUpperCase(); String s = StringUtils.toUpperCase(Integer.toHexString(i));
while (s.length() < w) while (s.length() < w)
s = "0" + s; s = "0" + s;
return s.toUpperCase(); return StringUtils.toUpperCase(s);
} }
private AnnotationWriter annotationWriter; private AnnotationWriter annotationWriter;

View file

@ -37,6 +37,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.sun.tools.javac.util.StringUtils;
/** /**
* Annotate instructions with details about type annotations. * Annotate instructions with details about type annotations.
@ -115,7 +116,7 @@ public class TypeAnnotationWriter extends InstructionDetailWriter {
print("@"); print("@");
annotationWriter.write(n.anno, false, true); annotationWriter.write(n.anno, false, true);
print(", "); print(", ");
println(n.kind.toString().toLowerCase()); println(StringUtils.toLowerCase(n.kind.toString()));
} }
} }
} }

View file

@ -49,6 +49,7 @@ import javax.tools.StandardJavaFileManager;
import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.Log;
import com.sun.tools.javac.util.BaseFileManager; import com.sun.tools.javac.util.BaseFileManager;
import com.sun.tools.javac.util.StringUtils;
import com.sun.tools.sjavac.comp.Dependencies; import com.sun.tools.sjavac.comp.Dependencies;
import com.sun.tools.sjavac.comp.JavaCompilerWithDeps; import com.sun.tools.sjavac.comp.JavaCompilerWithDeps;
import com.sun.tools.sjavac.comp.SmartFileManager; import com.sun.tools.sjavac.comp.SmartFileManager;
@ -256,7 +257,7 @@ public class CompilerThread implements Runnable {
// Load visible sources // Load visible sources
Set<URI> visibleSources = new HashSet<URI>(); Set<URI> visibleSources = new HashSet<URI>();
boolean fix_drive_letter_case = boolean fix_drive_letter_case =
System.getProperty("os.name").toLowerCase().startsWith("windows"); StringUtils.toLowerCase(System.getProperty("os.name")).startsWith("windows");
for (;;) { for (;;) {
String l = in.readLine(); String l = in.readLine();
if (l == null) if (l == null)

View file

@ -0,0 +1,128 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8029800
* @summary String.toLowerCase()/toUpperCase is generally dangerous, check it is not used in langtools
*/
import java.io.*;
import java.util.*;
import javax.tools.*;
import com.sun.tools.classfile.*;
import com.sun.tools.classfile.ConstantPool.CONSTANT_Methodref_info;
public class NoStringToLower {
public static void main(String... args) throws Exception {
NoStringToLower c = new NoStringToLower();
if (c.run(args))
return;
if (is_jtreg())
throw new Exception(c.errors + " errors occurred");
else
System.exit(1);
}
static boolean is_jtreg() {
return (System.getProperty("test.src") != null);
}
/**
* Main entry point.
*/
boolean run(String... args) throws Exception {
JavaCompiler c = ToolProvider.getSystemJavaCompiler();
JavaFileManager fm = c.getStandardFileManager(null, null, null);
JavaFileManager.Location javacLoc = findJavacLocation(fm);
String[] pkgs = {
"javax.annotation.processing",
"javax.lang.model",
"javax.tools",
"com.sun.source",
"com.sun.tools"
};
for (String pkg: pkgs) {
for (JavaFileObject fo: fm.list(javacLoc,
pkg, EnumSet.of(JavaFileObject.Kind.CLASS), true)) {
scan(fo);
}
}
return (errors == 0);
}
// depending on how the test is run, javac may be on bootclasspath or classpath
JavaFileManager.Location findJavacLocation(JavaFileManager fm) {
JavaFileManager.Location[] locns =
{ StandardLocation.PLATFORM_CLASS_PATH, StandardLocation.CLASS_PATH };
try {
for (JavaFileManager.Location l: locns) {
JavaFileObject fo = fm.getJavaFileForInput(l,
"com.sun.tools.javac.Main", JavaFileObject.Kind.CLASS);
if (fo != null)
return l;
}
} catch (IOException e) {
throw new Error(e);
}
throw new IllegalStateException("Cannot find javac");
}
/**
* Verify there are no references to String.toLowerCase() in a class file.
*/
void scan(JavaFileObject fo) throws IOException {
InputStream in = fo.openInputStream();
try {
ClassFile cf = ClassFile.read(in);
for (ConstantPool.CPInfo cpinfo: cf.constant_pool.entries()) {
if (cpinfo.getTag() == ConstantPool.CONSTANT_Methodref) {
CONSTANT_Methodref_info ref = (CONSTANT_Methodref_info) cpinfo;
String methodDesc = ref.getClassInfo().getName() + "." + ref.getNameAndTypeInfo().getName() + ":" + ref.getNameAndTypeInfo().getType();
if ("java/lang/String.toLowerCase:()Ljava/lang/String;".equals(methodDesc)) {
error("found reference to String.toLowerCase() in: " + fo.getName());
}
if ("java/lang/String.toUpperCase:()Ljava/lang/String;".equals(methodDesc)) {
error("found reference to String.toLowerCase() in: " + fo.getName());
}
}
}
} catch (ConstantPoolException ignore) {
} finally {
in.close();
}
}
/**
* Report an error.
*/
void error(String msg) {
System.err.println("Error: " + msg);
errors++;
}
int errors;
}

View file

@ -0,0 +1,66 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8029800
* @summary Unit test StringUtils
* @run main StringUtilsTest
*/
import java.util.Locale;
import java.util.Objects;
import com.sun.tools.javac.util.StringUtils;
public class StringUtilsTest {
public static void main(String... args) throws Exception {
new StringUtilsTest().run();
}
void run() throws Exception {
Locale.setDefault(new Locale("tr", "TR"));
//verify the properties of the default locale:
assertEquals("\u0131", "I".toLowerCase());
assertEquals("\u0130", "i".toUpperCase());
//verify the StringUtils does what it should
assertEquals("i", StringUtils.toLowerCase("I"));
assertEquals("I", StringUtils.toUpperCase("i"));
//verify we can use index from indexOf of toLowerCase String in the original:
assertEquals(2, StringUtils.toLowerCase("\u0130\u0130lookFor").indexOf("lookfor"));
}
void assertEquals(String expected, String actual) {
if (!Objects.equals(expected, actual)) {
throw new IllegalStateException("expected=" + expected + "; actual=" + actual);
}
}
void assertEquals(int expected, int actual) {
if (expected != actual) {
throw new IllegalStateException("expected=" + expected + "; actual=" + actual);
}
}
}