Tue, 14 May 2013 10:14:55 -0700
8012178: Cleanup use of Util.escapeHtmlChars
Reviewed-by: darcy
1.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java Tue May 14 10:14:55 2013 -0700 1.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java Tue May 14 10:14:55 2013 -0700 1.3 @@ -369,7 +369,7 @@ 1.4 protected void addClassUse(PackageDoc pkg, Content contentTree) throws IOException { 1.5 String classLink = getLink(new LinkInfoImpl(configuration, 1.6 LinkInfoImpl.Kind.CLASS_USE_HEADER, classdoc)).toString(); 1.7 - String pkgLink = getPackageLinkString(pkg, Util.escapeHtmlChars(Util.getPackageName(pkg)), false); 1.8 + String pkgLink = getPackageLink(pkg, Util.getPackageName(pkg)).toString(); 1.9 classSubWriter.addUseInfo(pkgToClassAnnotations.get(pkg.name()), 1.10 configuration.getText("doclet.ClassUse_Annotation", classLink, 1.11 pkgLink), classUseTableSummary, contentTree);
2.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java Tue May 14 10:14:55 2013 -0700 2.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java Tue May 14 10:14:55 2013 -0700 2.3 @@ -991,53 +991,6 @@ 2.4 * 2.5 * @param pkg the package to link to. 2.6 * @param label the label for the link. 2.7 - * @param isStrong true if the label should be strong. 2.8 - * @return the link to the given package. 2.9 - */ 2.10 - public String getPackageLinkString(PackageDoc pkg, String label, 2.11 - boolean isStrong) { 2.12 - return getPackageLinkString(pkg, label, isStrong, ""); 2.13 - } 2.14 - 2.15 - /** 2.16 - * Return the link to the given package. 2.17 - * 2.18 - * @param pkg the package to link to. 2.19 - * @param label the label for the link. 2.20 - * @param isStrong true if the label should be strong. 2.21 - * @param style the font of the package link label. 2.22 - * @return the link to the given package. 2.23 - */ 2.24 - public String getPackageLinkString(PackageDoc pkg, String label, boolean isStrong, 2.25 - String style) { 2.26 - boolean included = pkg != null && pkg.isIncluded(); 2.27 - if (! included) { 2.28 - PackageDoc[] packages = configuration.packages; 2.29 - for (int i = 0; i < packages.length; i++) { 2.30 - if (packages[i].equals(pkg)) { 2.31 - included = true; 2.32 - break; 2.33 - } 2.34 - } 2.35 - } 2.36 - if (included || pkg == null) { 2.37 - return getHyperLinkString(pathString(pkg, DocPaths.PACKAGE_SUMMARY), 2.38 - label, isStrong, style); 2.39 - } else { 2.40 - DocLink crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); 2.41 - if (crossPkgLink != null) { 2.42 - return getHyperLinkString(crossPkgLink, label, isStrong, style); 2.43 - } else { 2.44 - return label; 2.45 - } 2.46 - } 2.47 - } 2.48 - 2.49 - /** 2.50 - * Return the link to the given package. 2.51 - * 2.52 - * @param pkg the package to link to. 2.53 - * @param label the label for the link. 2.54 * @return a content tree for the package link. 2.55 */ 2.56 public Content getPackageLink(PackageDoc pkg, String label) { 2.57 @@ -1302,6 +1255,10 @@ 2.58 String label, boolean strong) { 2.59 return getDocLink(context, classDoc, doc, label, strong, false); 2.60 } 2.61 + public Content getDocLink(LinkInfoImpl.Kind context, ClassDoc classDoc, MemberDoc doc, 2.62 + Content label, boolean strong) { 2.63 + return getDocLink(context, classDoc, doc, label, strong, false); 2.64 + } 2.65 2.66 /** 2.67 * Return the link for the given member. 2.68 @@ -1318,7 +1275,12 @@ 2.69 */ 2.70 public Content getDocLink(LinkInfoImpl.Kind context, ClassDoc classDoc, MemberDoc doc, 2.71 String label, boolean strong, boolean isProperty) { 2.72 - return getDocLink(context, classDoc, doc, new RawHtml(label), strong, isProperty); 2.73 + return getDocLink(context, classDoc, doc, new StringContent(check(label)), strong, isProperty); 2.74 + } 2.75 + 2.76 + String check(String s) { 2.77 + if (s.matches(".*[&<>].*"))throw new IllegalArgumentException(s); 2.78 + return s; 2.79 } 2.80 2.81 public Content getDocLink(LinkInfoImpl.Kind context, ClassDoc classDoc, MemberDoc doc, 2.82 @@ -1487,7 +1449,7 @@ 2.83 text = plainOrCode(plain, new StringContent(refMemName)); 2.84 2.85 return getDocLink(LinkInfoImpl.Kind.SEE_TAG, containing, 2.86 - refMem, (label.isEmpty() ? text: label).toString(), false); 2.87 + refMem, (label.isEmpty() ? text: label), false); 2.88 } 2.89 } 2.90
3.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java Tue May 14 10:14:55 2013 -0700 3.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java Tue May 14 10:14:55 2013 -0700 3.3 @@ -179,16 +179,16 @@ 3.4 classDoc.name()); 3.5 } else if (classDoc.isInterface()){ 3.6 return configuration.getText("doclet.Href_Interface_Title", 3.7 - Util.escapeHtmlChars(Util.getPackageName(classDoc.containingPackage()))); 3.8 + Util.getPackageName(classDoc.containingPackage())); 3.9 } else if (classDoc.isAnnotationType()) { 3.10 return configuration.getText("doclet.Href_Annotation_Title", 3.11 - Util.escapeHtmlChars(Util.getPackageName(classDoc.containingPackage()))); 3.12 + Util.getPackageName(classDoc.containingPackage())); 3.13 } else if (classDoc.isEnum()) { 3.14 return configuration.getText("doclet.Href_Enum_Title", 3.15 - Util.escapeHtmlChars(Util.getPackageName(classDoc.containingPackage()))); 3.16 + Util.getPackageName(classDoc.containingPackage())); 3.17 } else { 3.18 return configuration.getText("doclet.Href_Class_Title", 3.19 - Util.escapeHtmlChars(Util.getPackageName(classDoc.containingPackage()))); 3.20 + Util.getPackageName(classDoc.containingPackage())); 3.21 } 3.22 } 3.23
4.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java Tue May 14 10:14:55 2013 -0700 4.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java Tue May 14 10:14:55 2013 -0700 4.3 @@ -154,7 +154,7 @@ 4.4 Content table = HtmlTree.TABLE(0, 3, 0, useTableSummary, 4.5 getTableCaption(configuration.getText( 4.6 "doclet.ClassUse_Packages.that.use.0", 4.7 - getPackageLinkString(pkgdoc, Util.escapeHtmlChars(Util.getPackageName(pkgdoc)), false)))); 4.8 + getPackageLink(pkgdoc, Util.getPackageName(pkgdoc)).toString()))); 4.9 table.addContent(getSummaryTableHeader(packageTableHeader, "col")); 4.10 Content tbody = new HtmlTree(HtmlTag.TBODY); 4.11 Iterator<String> it = usingPackageToUsedClasses.keySet().iterator(); 4.12 @@ -199,8 +199,8 @@ 4.13 Content table = HtmlTree.TABLE(0, 3, 0, tableSummary, 4.14 getTableCaption(configuration.getText( 4.15 "doclet.ClassUse_Classes.in.0.used.by.1", 4.16 - getPackageLinkString(pkgdoc, Util.escapeHtmlChars(Util.getPackageName(pkgdoc)), false), 4.17 - getPackageLinkString(usingPackage, Util.escapeHtmlChars(Util.getPackageName(usingPackage)), false)))); 4.18 + getPackageLink(pkgdoc, Util.getPackageName(pkgdoc)).toString(), 4.19 + getPackageLink(usingPackage, Util.getPackageName(usingPackage)).toString()))); 4.20 table.addContent(getSummaryTableHeader(classTableHeader, "col")); 4.21 Content tbody = new HtmlTree(HtmlTag.TBODY); 4.22 Iterator<ClassDoc> itc =
5.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java Tue May 14 10:14:55 2013 -0700 5.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java Tue May 14 10:14:55 2013 -0700 5.3 @@ -102,7 +102,7 @@ 5.4 Content tHeading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, true, 5.5 HtmlStyle.title, packageLabel); 5.6 tHeading.addContent(getSpace()); 5.7 - Content packageHead = new RawHtml(heading); 5.8 + Content packageHead = new StringContent(heading); 5.9 tHeading.addContent(packageHead); 5.10 div.addContent(tHeading); 5.11 addDeprecationInfo(div);
6.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java Tue May 14 10:14:55 2013 -0700 6.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java Tue May 14 10:14:55 2013 -0700 6.3 @@ -1,5 +1,5 @@ 6.4 /* 6.5 - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 6.6 + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 6.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 6.8 * 6.9 * This code is free software; you can redistribute it and/or modify it 6.10 @@ -135,10 +135,8 @@ 6.11 * @return the content tree for the method type link 6.12 */ 6.13 public Content getMethodTypeLinks(MethodTypes methodType) { 6.14 - StringBuilder jsShow = new StringBuilder("javascript:show("); 6.15 - jsShow.append(methodType.value()).append(");"); 6.16 - HtmlTree link = HtmlTree.A(jsShow.toString(), 6.17 - new StringContent(methodType.text())); 6.18 + String jsShow = "javascript:show(" + methodType.value() +");"; 6.19 + HtmlTree link = HtmlTree.A(jsShow, new StringContent(methodType.text())); 6.20 return link; 6.21 } 6.22
7.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java Tue May 14 10:14:55 2013 -0700 7.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java Tue May 14 10:14:55 2013 -0700 7.3 @@ -71,25 +71,10 @@ 7.4 */ 7.5 public abstract Configuration configuration(); 7.6 7.7 - /** 7.8 - * Return Html hyperlink string. 7.9 - * 7.10 - * @param link String name of the file. 7.11 - * @param label Tag for the link. 7.12 - * @return String Hyper Link. 7.13 - */ 7.14 - public String getHyperLinkString(DocPath link, String label) { 7.15 - return getHyperLinkString(link, label, false, "", "", ""); 7.16 - } 7.17 - 7.18 public Content getHyperLink(DocPath link, String label) { 7.19 return getHyperLink(link, new StringContent(label), false, "", "", ""); 7.20 } 7.21 7.22 - public String getHyperLinkString(DocLink link, String label) { 7.23 - return getHyperLinkString(link, label, false, "", "", ""); 7.24 - } 7.25 - 7.26 /** 7.27 * Get Html Hyper Link string. 7.28 *
8.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java Tue May 14 10:14:55 2013 -0700 8.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java Tue May 14 10:14:55 2013 -0700 8.3 @@ -78,8 +78,8 @@ 8.4 */ 8.5 public void addAttr(HtmlAttr attrName, String attrValue) { 8.6 if (attrs.isEmpty()) 8.7 - attrs = new LinkedHashMap<HtmlAttr,String>(); 8.8 - attrs.put(nullCheck(attrName), nullCheck(attrValue)); 8.9 + attrs = new LinkedHashMap<HtmlAttr,String>(3); 8.10 + attrs.put(nullCheck(attrName), escapeHtmlChars(attrValue)); 8.11 } 8.12 8.13 /** 8.14 @@ -131,6 +131,35 @@ 8.15 } 8.16 8.17 /** 8.18 + * Given a string, escape all special html characters and 8.19 + * return the result. 8.20 + * 8.21 + * @param s The string to check. 8.22 + * @return the original string with all of the HTML characters escaped. 8.23 + */ 8.24 + private static String escapeHtmlChars(String s) { 8.25 + for (int i = 0; i < s.length(); i++) { 8.26 + char ch = s.charAt(i); 8.27 + switch (ch) { 8.28 + // only start building a new string if we need to 8.29 + case '<': case '>': case '&': 8.30 + StringBuilder sb = new StringBuilder(s.substring(0, i)); 8.31 + for ( ; i < s.length(); i++) { 8.32 + ch = s.charAt(i); 8.33 + switch (ch) { 8.34 + case '<': sb.append("<"); break; 8.35 + case '>': sb.append(">"); break; 8.36 + case '&': sb.append("&"); break; 8.37 + default: sb.append(ch); break; 8.38 + } 8.39 + } 8.40 + return sb.toString(); 8.41 + } 8.42 + } 8.43 + return s; 8.44 + } 8.45 + 8.46 + /** 8.47 * Generates an HTML anchor tag. 8.48 * 8.49 * @param ref reference url for the anchor tag 8.50 @@ -139,7 +168,7 @@ 8.51 */ 8.52 public static HtmlTree A(String ref, Content body) { 8.53 HtmlTree htmltree = new HtmlTree(HtmlTag.A, nullCheck(body)); 8.54 - htmltree.addAttr(HtmlAttr.HREF, Util.escapeHtmlChars(nullCheck(ref))); 8.55 + htmltree.addAttr(HtmlAttr.HREF, ref); 8.56 return htmltree; 8.57 } 8.58 8.59 @@ -324,7 +353,7 @@ 8.60 HtmlStyle styleClass, Content body) { 8.61 HtmlTree htmltree = new HtmlTree(headingTag, nullCheck(body)); 8.62 if (printTitle) 8.63 - htmltree.addAttr(HtmlAttr.TITLE, Util.stripHtml(body.toString())); 8.64 + htmltree.addAttr(HtmlAttr.TITLE, stripHtml(body)); 8.65 if (styleClass != null) 8.66 htmltree.addStyle(styleClass); 8.67 return htmltree; 8.68 @@ -837,4 +866,22 @@ 8.69 return false; 8.70 } 8.71 } 8.72 + 8.73 + /** 8.74 + * Given a Content node, strips all html characters and 8.75 + * return the result. 8.76 + * 8.77 + * @param body The content node to check. 8.78 + * @return the plain text from the content node 8.79 + * 8.80 + */ 8.81 + private static String stripHtml(Content body) { 8.82 + String rawString = body.toString(); 8.83 + // remove HTML tags 8.84 + rawString = rawString.replaceAll("\\<.*?>", " "); 8.85 + // consolidate multiple spaces between a word to a single space 8.86 + rawString = rawString.replaceAll("\\b\\s{2,}\\b", " "); 8.87 + // remove extra whitespaces 8.88 + return rawString.trim(); 8.89 + } 8.90 }
9.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java Tue May 14 10:14:55 2013 -0700 9.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java Tue May 14 10:14:55 2013 -0700 9.3 @@ -197,8 +197,7 @@ 9.4 configuration.getText("doclet.Modifier"), 9.5 configuration.getText("doclet.Type")); 9.6 overviewLabel = getResource("doclet.Overview"); 9.7 - defaultPackageLabel = new RawHtml( 9.8 - Util.escapeHtmlChars(DocletConstants.DEFAULT_PACKAGE_NAME)); 9.9 + defaultPackageLabel = new StringContent(DocletConstants.DEFAULT_PACKAGE_NAME); 9.10 packageLabel = getResource("doclet.Package"); 9.11 profileLabel = getResource("doclet.Profile"); 9.12 useLabel = getResource("doclet.navClassUse");
10.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java Tue May 14 10:14:55 2013 -0700 10.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java Tue May 14 10:14:55 2013 -0700 10.3 @@ -58,8 +58,8 @@ 10.4 * @param initialContent initial content for the object 10.5 */ 10.6 public StringContent(String initialContent) { 10.7 - stringContent = new StringBuilder( 10.8 - Util.escapeHtmlChars(nullCheck(initialContent))); 10.9 + stringContent = new StringBuilder(); 10.10 + appendChars(initialContent); 10.11 } 10.12 10.13 /** 10.14 @@ -81,7 +81,7 @@ 10.15 * @param strContent string content to be added 10.16 */ 10.17 public void addContent(String strContent) { 10.18 - stringContent.append(Util.escapeHtmlChars(nullCheck(strContent))); 10.19 + appendChars(strContent); 10.20 } 10.21 10.22 /** 10.23 @@ -111,4 +111,16 @@ 10.24 out.write(s); 10.25 return s.endsWith(DocletConstants.NL); 10.26 } 10.27 + 10.28 + private void appendChars(String s) { 10.29 + for (int i = 0; i < s.length(); i++) { 10.30 + char ch = s.charAt(i); 10.31 + switch (ch) { 10.32 + case '<': stringContent.append("<"); break; 10.33 + case '>': stringContent.append(">"); break; 10.34 + case '&': stringContent.append("&"); break; 10.35 + default: stringContent.append(ch); break; 10.36 + } 10.37 + } 10.38 + } 10.39 }
11.1 --- a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java Tue May 14 10:14:55 2013 -0700 11.2 +++ b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java Tue May 14 10:14:55 2013 -0700 11.3 @@ -120,8 +120,7 @@ 11.4 * @param contentTree the content tree to which the documentation will be added 11.5 */ 11.6 public void buildPackageDoc(XMLNode node, Content contentTree) throws Exception { 11.7 - contentTree = packageWriter.getPackageHeader( 11.8 - Util.escapeHtmlChars(Util.getPackageName(packageDoc))); 11.9 + contentTree = packageWriter.getPackageHeader(Util.getPackageName(packageDoc)); 11.10 buildChildren(node, contentTree); 11.11 packageWriter.addPackageFooter(contentTree); 11.12 packageWriter.printDocument(contentTree);
12.1 --- a/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java Tue May 14 10:14:55 2013 -0700 12.2 +++ b/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java Tue May 14 10:14:55 2013 -0700 12.3 @@ -1,5 +1,5 @@ 12.4 /* 12.5 - * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. 12.6 + * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. 12.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 12.8 * 12.9 * This code is free software; you can redistribute it and/or modify it 12.10 @@ -28,6 +28,7 @@ 12.11 import java.util.*; 12.12 12.13 import com.sun.javadoc.*; 12.14 +import com.sun.tools.doclets.formats.html.markup.StringContent; 12.15 import com.sun.tools.doclets.internal.toolkit.Configuration; 12.16 import com.sun.tools.doclets.internal.toolkit.util.*; 12.17 12.18 @@ -169,7 +170,7 @@ 12.19 "doclet.value_tag_invalid_reference", tag.text()); 12.20 } else if (field.constantValue() != null) { 12.21 return writer.valueTagOutput(field, 12.22 - Util.escapeHtmlChars(field.constantValueExpression()), 12.23 + field.constantValueExpression(), 12.24 ! field.equals(tag.holder())); 12.25 } else { 12.26 //Referenced field is not a constant.
13.1 --- a/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java Tue May 14 10:14:55 2013 -0700 13.2 +++ b/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java Tue May 14 10:14:55 2013 -0700 13.3 @@ -420,69 +420,6 @@ 13.4 } 13.5 13.6 /** 13.7 - * Given a string, escape all special html characters and 13.8 - * return the result. 13.9 - * 13.10 - * @param s The string to check. 13.11 - * @return the original string with all of the HTML characters escaped. 13.12 - */ 13.13 - public static String escapeHtmlChars(String s) { 13.14 - for (int i = 0; i < s.length(); i++) { 13.15 - char ch = s.charAt(i); 13.16 - switch (ch) { 13.17 - // only start building a new string if we need to 13.18 - case '<': case '>': case '&': 13.19 - StringBuilder sb = new StringBuilder(s.substring(0, i)); 13.20 - for ( ; i < s.length(); i++) { 13.21 - ch = s.charAt(i); 13.22 - switch (ch) { 13.23 - case '<': sb.append("<"); break; 13.24 - case '>': sb.append(">"); break; 13.25 - case '&': sb.append("&"); break; 13.26 - default: sb.append(ch); break; 13.27 - } 13.28 - } 13.29 - return sb.toString(); 13.30 - } 13.31 - } 13.32 - return s; 13.33 - } 13.34 - 13.35 - /** 13.36 - * Escape all special html characters in a string buffer. 13.37 - * 13.38 - * @param sb The string buffer to update 13.39 - */ 13.40 - public static void escapeHtmlChars(StringBuilder sb) { 13.41 - // scan backwards, replacing characters as needed. 13.42 - for (int i = sb.length() - 1; i >= 0; i--) { 13.43 - switch (sb.charAt(i)) { 13.44 - case '<': sb.replace(i, i+1, "<"); break; 13.45 - case '>': sb.replace(i, i+1, ">"); break; 13.46 - case '&': sb.replace(i, i+1, "&"); break; 13.47 - } 13.48 - } 13.49 - } 13.50 - 13.51 - /** 13.52 - * Given a string, strips all html characters and 13.53 - * return the result. 13.54 - * 13.55 - * @param rawString The string to check. 13.56 - * @return the original string with all of the HTML characters 13.57 - * stripped. 13.58 - * 13.59 - */ 13.60 - public static String stripHtml(String rawString) { 13.61 - // remove HTML tags 13.62 - rawString = rawString.replaceAll("\\<.*?>", " "); 13.63 - // consolidate multiple spaces between a word to a single space 13.64 - rawString = rawString.replaceAll("\\b\\s{2,}\\b", " "); 13.65 - // remove extra whitespaces 13.66 - return rawString.trim(); 13.67 - } 13.68 - 13.69 - /** 13.70 * Given an annotation, return true if it should be documented and false 13.71 * otherwise. 13.72 *