Author: markt Date: Tue Mar 21 11:14:19 2017 New Revision: 1787938 URL: http://svn.apache.org/viewvc?rev=1787938&view=rev Log: Refactoring Single utility class for X -> comma separated list
Added: tomcat/trunk/java/org/apache/tomcat/util/buf/StringUtils.java (with props) Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java tomcat/trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java tomcat/trunk/java/org/apache/catalina/security/SecurityListener.java tomcat/trunk/java/org/apache/catalina/users/MemoryGroup.java tomcat/trunk/java/org/apache/catalina/users/MemoryUser.java tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Protocol.java tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java tomcat/trunk/java/org/apache/tomcat/buildutil/SignCode.java tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java tomcat/trunk/java/org/apache/tomcat/util/modeler/ManagedBean.java tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Tue Mar 21 11:14:19 2017 @@ -114,6 +114,7 @@ import org.apache.tomcat.InstanceManager import org.apache.tomcat.JarScanner; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.IntrospectionUtils; +import org.apache.tomcat.util.buf.StringUtils; import org.apache.tomcat.util.descriptor.XmlIdentifiers; import org.apache.tomcat.util.descriptor.web.ApplicationParameter; import org.apache.tomcat.util.descriptor.web.ErrorPage; @@ -1029,17 +1030,7 @@ public class StandardContext extends Con @Override public String getResourceOnlyServlets() { - StringBuilder result = new StringBuilder(); - boolean first = true; - for (String servletName : resourceOnlyServlets) { - if (first) { - first = false; - } else { - result.append(','); - } - result.append(servletName); - } - return result.toString(); + return StringUtils.join(resourceOnlyServlets); } Modified: tomcat/trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java (original) +++ tomcat/trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java Tue Mar 21 11:14:19 2017 @@ -44,6 +44,7 @@ import org.apache.catalina.core.Containe import org.apache.catalina.core.StandardHost; import org.apache.catalina.startup.HostConfig; import org.apache.tomcat.util.ExceptionUtils; +import org.apache.tomcat.util.buf.StringUtils; import org.apache.tomcat.util.res.StringManager; /** @@ -519,15 +520,8 @@ public class HostManagerServlet Host host = (Host) hosts[i]; String name = host.getName(); String[] aliases = host.findAliases(); - StringBuilder buf = new StringBuilder(); - if (aliases.length > 0) { - buf.append(aliases[0]); - for (int j = 1; j < aliases.length; j++) { - buf.append(',').append(aliases[j]); - } - } writer.println(smClient.getString("hostManagerServlet.listitem", - name, buf.toString())); + name, StringUtils.join(aliases))); } } Modified: tomcat/trunk/java/org/apache/catalina/security/SecurityListener.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/security/SecurityListener.java?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/security/SecurityListener.java (original) +++ tomcat/trunk/java/org/apache/catalina/security/SecurityListener.java Tue Mar 21 11:14:19 2017 @@ -17,7 +17,6 @@ package org.apache.catalina.security; import java.util.HashSet; -import java.util.Iterator; import java.util.Locale; import java.util.Set; @@ -26,6 +25,7 @@ import org.apache.catalina.LifecycleEven import org.apache.catalina.LifecycleListener; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.util.buf.StringUtils; import org.apache.tomcat.util.res.StringManager; public class SecurityListener implements LifecycleListener { @@ -97,18 +97,7 @@ public class SecurityListener implements * @return A comma separated list of operating system user names. */ public String getCheckedOsUsers() { - if (checkedOsUsers.size() == 0) { - return ""; - } - - StringBuilder result = new StringBuilder(); - Iterator<String> iter = checkedOsUsers.iterator(); - result.append(iter.next()); - while (iter.hasNext()) { - result.append(','); - result.append(iter.next()); - } - return result.toString(); + return StringUtils.join(checkedOsUsers); } Modified: tomcat/trunk/java/org/apache/catalina/users/MemoryGroup.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/users/MemoryGroup.java?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/users/MemoryGroup.java (original) +++ tomcat/trunk/java/org/apache/catalina/users/MemoryGroup.java Tue Mar 21 11:14:19 2017 @@ -25,6 +25,7 @@ import java.util.Iterator; import org.apache.catalina.Role; import org.apache.catalina.User; import org.apache.catalina.UserDatabase; +import org.apache.tomcat.util.buf.StringUtils; /** @@ -200,22 +201,11 @@ public class MemoryGroup extends Abstrac synchronized (roles) { if (roles.size() > 0) { sb.append(" roles=\""); - int n = 0; - Iterator<Role> values = roles.iterator(); - while (values.hasNext()) { - if (n > 0) { - sb.append(','); - } - n++; - sb.append((values.next()).getRolename()); - } + StringUtils.join(roles, ',', (x) -> x.getRolename(), sb); sb.append("\""); } } sb.append("/>"); return (sb.toString()); - } - - } Modified: tomcat/trunk/java/org/apache/catalina/users/MemoryUser.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/users/MemoryUser.java?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/users/MemoryUser.java (original) +++ tomcat/trunk/java/org/apache/catalina/users/MemoryUser.java Tue Mar 21 11:14:19 2017 @@ -26,6 +26,7 @@ import org.apache.catalina.Group; import org.apache.catalina.Role; import org.apache.catalina.UserDatabase; import org.apache.catalina.util.RequestUtil; +import org.apache.tomcat.util.buf.StringUtils; /** * <p>Concrete implementation of {@link org.apache.catalina.User} for the @@ -271,38 +272,22 @@ public class MemoryUser extends Abstract synchronized (groups) { if (groups.size() > 0) { sb.append(" groups=\""); - int n = 0; - Iterator<Group> values = groups.iterator(); - while (values.hasNext()) { - if (n > 0) { - sb.append(','); - } - n++; - sb.append(RequestUtil.filter(values.next().getGroupname())); - } + StringUtils.join(groups, ',', (x) -> RequestUtil.filter(x.getGroupname()), sb); sb.append("\""); } } synchronized (roles) { if (roles.size() > 0) { sb.append(" roles=\""); - int n = 0; - Iterator<Role> values = roles.iterator(); - while (values.hasNext()) { - if (n > 0) { - sb.append(','); - } - n++; - sb.append(RequestUtil.filter(values.next().getRolename())); - } + StringUtils.join(roles, ',', (x) -> RequestUtil.filter(x.getRolename()), sb); sb.append("\""); } } sb.append("/>"); - return (sb.toString()); - + return sb.toString(); } + /** * <p>Return a String representation of this user.</p> */ @@ -320,35 +305,17 @@ public class MemoryUser extends Abstract synchronized (groups) { if (groups.size() > 0) { sb.append(", groups=\""); - int n = 0; - Iterator<Group> values = groups.iterator(); - while (values.hasNext()) { - if (n > 0) { - sb.append(','); - } - n++; - sb.append(RequestUtil.filter(values.next().getGroupname())); - } + StringUtils.join(groups, ',', (x) -> RequestUtil.filter(x.getGroupname()), sb); sb.append("\""); } } synchronized (roles) { if (roles.size() > 0) { sb.append(", roles=\""); - int n = 0; - Iterator<Role> values = roles.iterator(); - while (values.hasNext()) { - if (n > 0) { - sb.append(','); - } - n++; - sb.append(RequestUtil.filter(values.next().getRolename())); - } + StringUtils.join(roles, ',', (x) -> RequestUtil.filter(x.getRolename()), sb); sb.append("\""); } } - return (sb.toString()); + return sb.toString(); } - - } Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Protocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Protocol.java?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Protocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Protocol.java Tue Mar 21 11:14:19 2017 @@ -37,6 +37,7 @@ import org.apache.coyote.UpgradeToken; import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler; import org.apache.coyote.http11.upgrade.UpgradeProcessorExternal; import org.apache.coyote.http11.upgrade.UpgradeProcessorInternal; +import org.apache.tomcat.util.buf.StringUtils; import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.SSLHostConfig; import org.apache.tomcat.util.net.SocketWrapperBase; @@ -417,17 +418,7 @@ public abstract class AbstractHttp11Prot // sync is unnecessary. List<String> copy = new ArrayList<>(allowedTrailerHeaders.size()); copy.addAll(allowedTrailerHeaders); - StringBuilder result = new StringBuilder(); - boolean first = true; - for (String header : copy) { - if (first) { - first = false; - } else { - result.append(','); - } - result.append(header); - } - return result.toString(); + return StringUtils.join(copy); } public void addAllowedTrailerHeader(String header) { if (header != null) { Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java Tue Mar 21 11:14:19 2017 @@ -33,6 +33,7 @@ import org.apache.coyote.UpgradeProtocol import org.apache.coyote.UpgradeToken; import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler; import org.apache.coyote.http11.upgrade.UpgradeProcessorInternal; +import org.apache.tomcat.util.buf.StringUtils; import org.apache.tomcat.util.net.SocketWrapperBase; public class Http2Protocol implements UpgradeProtocol { @@ -226,17 +227,7 @@ public class Http2Protocol implements Up // sync is unnecessary. List<String> copy = new ArrayList<>(allowedTrailerHeaders.size()); copy.addAll(allowedTrailerHeaders); - StringBuilder result = new StringBuilder(); - boolean first = true; - for (String header : copy) { - if (first) { - first = false; - } else { - result.append(','); - } - result.append(header); - } - return result.toString(); + return StringUtils.join(copy); } Modified: tomcat/trunk/java/org/apache/tomcat/buildutil/SignCode.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/buildutil/SignCode.java?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/buildutil/SignCode.java (original) +++ tomcat/trunk/java/org/apache/tomcat/buildutil/SignCode.java Tue Mar 21 11:14:19 2017 @@ -41,6 +41,7 @@ import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; +import org.apache.tomcat.util.buf.StringUtils; import org.apache.tomcat.util.codec.binary.Base64; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; @@ -172,7 +173,7 @@ public class SignCode extends Task { SOAPElement commaDelimitedFileNames = requestSigningRequest.addChildElement("commaDelimitedFileNames", NS); - commaDelimitedFileNames.addTextNode(listToString(fileNames)); + commaDelimitedFileNames.addTextNode(StringUtils.join(fileNames)); SOAPElement application = requestSigningRequest.addChildElement("application", NS); @@ -214,21 +215,6 @@ public class SignCode extends Task { } - private String listToString(List<String> list) { - StringBuilder sb = new StringBuilder(list.size() * 6); - boolean doneFirst = false; - for (String s : list) { - if (doneFirst) { - sb.append(','); - } else { - doneFirst = true; - } - sb.append(s); - } - return sb.toString(); - } - - private void downloadSignedFiles(List<File> filesToSign, String id) throws SOAPException, IOException { Added: tomcat/trunk/java/org/apache/tomcat/util/buf/StringUtils.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/buf/StringUtils.java?rev=1787938&view=auto ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/buf/StringUtils.java (added) +++ tomcat/trunk/java/org/apache/tomcat/util/buf/StringUtils.java Tue Mar 21 11:14:19 2017 @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomcat.util.buf; + +import java.util.Arrays; +import java.util.Collection; +import java.util.function.Function; + +/** + * Utility methods to build a separated list from a given set (not + * java.util.Set) of inputs and return that list as a string or append it to an + * existing StringBuilder. + */ +public final class StringUtils { + + private static final String EMPTY_STRING = ""; + + private StringUtils() { + // Utility class + } + + + public static String join(String[] array) { + return join(Arrays.asList(array)); + } + + + public static String join(Collection<String> collection) { + return join(collection, ','); + } + + + public static String join(Collection<String> collection, char separator) { + // Shortcut + if (collection.isEmpty()) { + return EMPTY_STRING; + } + + StringBuilder result = new StringBuilder(); + join(collection, separator, result); + return result.toString(); + } + + + public static void join(Iterable<String> iterable, char separator, StringBuilder sb) { + join(iterable, separator, (x) -> x, sb); + } + + + public static <T> void join(T[] array, char separator, Function<T,String> function, + StringBuilder sb) { + join(Arrays.asList(array), separator, function, sb); + } + + + public static <T> void join(Iterable<T> iterable, char separator, Function<T,String> function, + StringBuilder sb) { + boolean first = true; + for (T value : iterable) { + if (first) { + first = false; + } else { + sb.append(separator); + } + sb.append(function.apply(value)); + } + } +} Propchange: tomcat/trunk/java/org/apache/tomcat/util/buf/StringUtils.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java Tue Mar 21 11:14:19 2017 @@ -31,6 +31,7 @@ import org.apache.juli.logging.LogFactor import org.apache.tomcat.util.buf.B2CConverter; import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.buf.MessageBytes; +import org.apache.tomcat.util.buf.StringUtils; import org.apache.tomcat.util.buf.UDecoder; import org.apache.tomcat.util.log.UserDataHelper; import org.apache.tomcat.util.res.StringManager; @@ -513,10 +514,7 @@ public final class Parameters { StringBuilder sb = new StringBuilder(); for (Map.Entry<String, ArrayList<String>> e : paramHashValues.entrySet()) { sb.append(e.getKey()).append('='); - ArrayList<String> values = e.getValue(); - for (String value : values) { - sb.append(value).append(','); - } + StringUtils.join(e.getValue(), ',', sb); sb.append('\n'); } return sb.toString(); Modified: tomcat/trunk/java/org/apache/tomcat/util/modeler/ManagedBean.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/modeler/ManagedBean.java?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/modeler/ManagedBean.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/modeler/ManagedBean.java Tue Mar 21 11:14:19 2017 @@ -38,6 +38,8 @@ import javax.management.ReflectionExcept import javax.management.RuntimeOperationsException; import javax.management.ServiceNotFoundException; +import org.apache.tomcat.util.buf.StringUtils; + /** * <p>Internal configuration information for a managed bean (MBean) @@ -565,26 +567,17 @@ public class ManagedBean implements java private String createOperationKey(OperationInfo operation) { StringBuilder key = new StringBuilder(operation.getName()); key.append('('); - for (ParameterInfo parameterInfo: operation.getSignature()) { - key.append(parameterInfo.getType()); - // Note: A trailing ',' does not matter in this case - key.append(','); - } + StringUtils.join(operation.getSignature(), ',', (x) -> x.getType(), key); key.append(')'); return key.toString(); } - private String createOperationKey(String methodName, - String[] parameterTypes) { + private String createOperationKey(String methodName, String[] parameterTypes) { StringBuilder key = new StringBuilder(methodName); key.append('('); - for (String parameter: parameterTypes) { - key.append(parameter); - // Note: A trailing ',' does not matter in this case - key.append(','); - } + StringUtils.join(parameterTypes); key.append(')'); return key.toString(); Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java Tue Mar 21 11:14:19 2017 @@ -67,6 +67,7 @@ import javax.websocket.WebSocketContaine import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.InstanceManager; +import org.apache.tomcat.util.buf.StringUtils; import org.apache.tomcat.util.codec.binary.Base64; import org.apache.tomcat.util.collections.CaseInsensitiveKeyMap; import org.apache.tomcat.util.res.StringManager; @@ -628,21 +629,13 @@ public class WsWebSocketContainer implem private static void addHeader(ByteBuffer result, String key, List<String> values) { - StringBuilder sb = new StringBuilder(); - - Iterator<String> iter = values.iterator(); - if (!iter.hasNext()) { + if (values.isEmpty()) { return; } - sb.append(iter.next()); - while (iter.hasNext()) { - sb.append(','); - sb.append(iter.next()); - } result.put(key.getBytes(StandardCharsets.ISO_8859_1)); result.put(": ".getBytes(StandardCharsets.ISO_8859_1)); - result.put(sb.toString().getBytes(StandardCharsets.ISO_8859_1)); + result.put(StringUtils.join(values).getBytes(StandardCharsets.ISO_8859_1)); result.put(crlf); } Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1787938&r1=1787937&r2=1787938&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Tue Mar 21 11:14:19 2017 @@ -84,6 +84,11 @@ for <code><request-character-encoding></code> and <code><response-character-encoding></code>. (markt) </update> + <scode> + Refactor the various implementations of X to comma separated list to a + single utility class and update the code to use the new utility class. + (markt) + </scode> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org