You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2017/03/21 11:14:19 UTC

svn commit: r1787938 - in /tomcat/trunk: java/org/apache/catalina/core/ java/org/apache/catalina/manager/host/ java/org/apache/catalina/security/ java/org/apache/catalina/users/ java/org/apache/coyote/http11/ java/org/apache/coyote/http2/ java/org/apac...

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>&lt;request-character-encoding&gt;</code> and
         <code>&lt;response-character-encoding&gt;</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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org