This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 8.5.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/8.5.x by this push:
     new cae270d2a3 Align with 9.0.x onwards
cae270d2a3 is described below

commit cae270d2a3a7381943848efc7959ec5b8e475d0e
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue Aug 8 14:25:58 2023 +0100

    Align with 9.0.x onwards
---
 java/org/apache/catalina/ha/ClusterRuleSet.java    |   5 -
 .../apache/catalina/ha/backend/CollectedInfo.java  |  24 +++--
 .../catalina/ha/backend/HeartbeatListener.java     | 119 +++++++++++++++++++--
 .../catalina/ha/backend/MultiCastSender.java       |   2 +-
 .../apache/catalina/ha/deploy/FarmWarDeployer.java |   6 +-
 .../catalina/ha/deploy/FileMessageFactory.java     |   3 +
 .../catalina/ha/deploy/LocalStrings.properties     |   3 +-
 .../catalina/ha/deploy/LocalStrings_fr.properties  |   2 +
 .../catalina/ha/deploy/LocalStrings_ja.properties  |   2 +
 .../catalina/ha/deploy/LocalStrings_ko.properties  |   2 +
 .../ha/deploy/LocalStrings_zh_CN.properties        |   2 +
 .../ha/session/ClusterSessionListener.java         |   2 +-
 .../apache/catalina/ha/session/DeltaManager.java   |   7 ++
 .../apache/catalina/ha/session/DeltaSession.java   |   2 +-
 .../catalina/ha/tcp/LocalStrings_es.properties     |   1 -
 .../apache/catalina/ha/tcp/SimpleTcpCluster.java   |  23 ++--
 java/org/apache/catalina/util/ToStringUtil.java    |  62 +++++++++++
 17 files changed, 221 insertions(+), 46 deletions(-)

diff --git a/java/org/apache/catalina/ha/ClusterRuleSet.java 
b/java/org/apache/catalina/ha/ClusterRuleSet.java
index 8aed8fefff..a24ed5f29e 100644
--- a/java/org/apache/catalina/ha/ClusterRuleSet.java
+++ b/java/org/apache/catalina/ha/ClusterRuleSet.java
@@ -16,11 +16,9 @@
  */
 package org.apache.catalina.ha;
 
-
 import org.apache.tomcat.util.digester.Digester;
 import org.apache.tomcat.util.digester.RuleSetBase;
 
-
 /**
  * <p>
  * <strong>RuleSet</strong> for processing the contents of a Cluster 
definition element.
@@ -48,9 +46,7 @@ public class ClusterRuleSet extends RuleSetBase {
      * Construct an instance of this <code>RuleSet</code> with the default 
matching pattern prefix.
      */
     public ClusterRuleSet() {
-
         this("");
-
     }
 
 
@@ -60,7 +56,6 @@ public class ClusterRuleSet extends RuleSetBase {
      * @param prefix Prefix for matching pattern rules (including the trailing 
slash character)
      */
     public ClusterRuleSet(String prefix) {
-        super();
         this.prefix = prefix;
     }
 
diff --git a/java/org/apache/catalina/ha/backend/CollectedInfo.java 
b/java/org/apache/catalina/ha/backend/CollectedInfo.java
index 235e161df1..ab2436717c 100644
--- a/java/org/apache/catalina/ha/backend/CollectedInfo.java
+++ b/java/org/apache/catalina/ha/backend/CollectedInfo.java
@@ -61,7 +61,13 @@ public class CollectedInfo {
         Set<ObjectInstance> set = mBeanServer.queryMBeans(objectName, null);
         for (ObjectInstance oi : set) {
             objName = oi.getObjectName();
+            String subtype = objName.getKeyProperty("subType");
+            if (subtype != null && subtype.equals("SocketProperties")) {
+                objName = null;
+                continue;
+            }
             String name = objName.getKeyProperty("name");
+            name = name.replace("\"", "");
 
             // Example names:
             // ajp-nio-8009
@@ -71,18 +77,22 @@ public class CollectedInfo {
             String[] elenames = name.split("-");
             String sport = elenames[elenames.length - 1];
             iport = Integer.parseInt(sport);
-            String[] shosts = elenames[1].split("%2F");
-            shost = shosts[0];
+            if (elenames.length == 4) {
+                shost = elenames[2];
+            }
 
             if (port == 0 && host == null) {
                 break; /* Done: take the first one */
             }
-            if (host == null && iport == port) {
-                break; /* Only port done */
-            }
-            if (shost.compareTo(host) == 0) {
-                break; /* Done port and host are the expected ones */
+            if (iport == port) {
+                if (host == null) {
+                    break; /* Done: return the first with the right port */
+                } else if (shost != null && shost.compareTo(host) == 0) {
+                    break; /* Done port and host are the expected ones */
+                }
             }
+            objName = null;
+            shost = null;
         }
         if (objName == null) {
             throw new Exception(sm.getString("collectedInfo.noConnector", 
host, Integer.valueOf(port)));
diff --git a/java/org/apache/catalina/ha/backend/HeartbeatListener.java 
b/java/org/apache/catalina/ha/backend/HeartbeatListener.java
index de6dfcada4..8cd64304b3 100644
--- a/java/org/apache/catalina/ha/backend/HeartbeatListener.java
+++ b/java/org/apache/catalina/ha/backend/HeartbeatListener.java
@@ -38,48 +38,147 @@ public class HeartbeatListener implements 
LifecycleListener, ContainerListener {
     private static final StringManager sm = 
StringManager.getManager(HeartbeatListener.class);
 
     /* To allow to select the connector */
-    private int port = 0;
-    private String host = null;
-
-    /* for multicasting stuff */
-    private final String ip = "224.0.1.105"; /* Multicast IP */
-    private final int multiport = 23364; /* Multicast Port */
-    private final int ttl = 16;
+    protected int port = 8009;
+    protected String host = null;
 
+    /**
+     * @return the host corresponding to the connector we want to proxy.
+     */
     public String getHost() {
-        return host;
+        return this.host;
     }
 
+    /**
+     * Set the host corresponding to the connector.
+     *
+     * @param host the hostname or ip string.
+     */
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    /**
+     * @return the port of the connector we want to proxy.
+     */
+    public int getPort() {
+        return this.port;
+    }
+
+    /**
+     * Set the port corresponding to the connector.
+     *
+     * @param port default 8009 the ajp one.
+     */
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    /* for multicasting stuff */
+    protected String ip = "224.0.1.105"; /* Multicast IP */
+    protected int multiport = 23364; /* Multicast Port */
+    protected int ttl = 16;
+
+    /* corresponding setters and getters */
+
+    /**
+     * @return the Multicast IP we are using for Multicast
+     */
     public String getGroup() {
         return ip;
     }
 
+    /**
+     * Set the Multicast IP to use for Multicast
+     *
+     * @param group the multi address to use.
+     */
+    public void setGroup(String group) {
+        this.ip = group;
+    }
+
+    /**
+     * @return the Multicast Port we are using for Multicast.
+     */
     public int getMultiport() {
         return multiport;
     }
 
+    /**
+     * Set the Port to use for Multicast
+     *
+     * @param port the port to use.
+     */
+    public void setMultiport(int port) {
+        this.multiport = port;
+    }
+
+    /**
+     * @return the TTL for Multicast packets.
+     */
     public int getTtl() {
         return ttl;
     }
 
+    /**
+     * Set the TTL for Multicast packets.
+     *
+     * @param ttl value for TTL.
+     */
+    public void setTtl(int ttl) {
+        this.ttl = ttl;
+    }
+
     /**
      * Proxy list, format "address:port,address:port".
      */
-    private final String proxyList = null;
+    protected String proxyList = null;
 
+    /**
+     * @return the list of proxies that send us requests.
+     */
     public String getProxyList() {
         return proxyList;
     }
 
+    /**
+     * Set the list of Proxies that send is requests, when not empty it 
toggles the multi to off. A SetHandler heartbeat
+     * must be existing in httpd.conf.
+     *
+     * @param proxyList the list of proxy, format "address:port,address:port".
+     */
+    public void setProxyList(String proxyList) {
+        this.proxyList = proxyList;
+    }
+
     /**
      * URL prefix.
      */
-    private final String proxyURL = "/HeartbeatListener";
+    protected String proxyURL = "/HeartbeatListener";
 
+    /**
+     * @return the URL specified in &lt;Location/&gt; for the SetHandler 
heartbeat.
+     */
     public String getProxyURL() {
         return proxyURL;
     }
 
+    /**
+     * Set the URL of receiver in httpd. That is the location used in
+     *
+     * <pre>
+     * &lt;Location "/HeartbeatListener"&gt;
+     *    SetHandler heartbeat
+     * &lt;/Location&gt;
+     * </pre>
+     *
+     * All proxies MUST use the same location.
+     *
+     * @param proxyURL a String with the URL starting with /
+     */
+    public void setProxyURLString(String proxyURL) {
+        this.proxyURL = proxyURL;
+    }
+
     private CollectedInfo coll = null;
 
     private Sender sender = null;
diff --git a/java/org/apache/catalina/ha/backend/MultiCastSender.java 
b/java/org/apache/catalina/ha/backend/MultiCastSender.java
index c8a8e6908b..424ed20a65 100644
--- a/java/org/apache/catalina/ha/backend/MultiCastSender.java
+++ b/java/org/apache/catalina/ha/backend/MultiCastSender.java
@@ -59,7 +59,7 @@ public class MultiCastSender implements Sender {
                 }
 
                 s.setTimeToLive(config.getTtl());
-                s.joinGroup(group);
+                s.joinGroup(new InetSocketAddress(group, 0), null);
             } catch (Exception ex) {
                 log.error(sm.getString("multiCastSender.multiCastFailed"), ex);
                 s = null;
diff --git a/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java 
b/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java
index cfa77cbfe5..27ad2d77cb 100644
--- a/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java
+++ b/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java
@@ -238,7 +238,7 @@ public class FarmWarDeployer extends ClusterListener 
implements ClusterDeployer,
                             
log.error(sm.getString("farmWarDeployer.servicingDeploy", contextName, name));
                         }
                     } catch (Exception ex) {
-                        log.error(ex);
+                        
log.error(sm.getString("farmWarDeployer.fileMessageError"), ex);
                     } finally {
                         removeFactory(fmsg);
                     }
@@ -263,7 +263,7 @@ public class FarmWarDeployer extends ClusterListener 
implements ClusterDeployer,
                         
log.error(sm.getString("farmWarDeployer.servicingUndeploy", contextName));
                     }
                 } catch (Exception ex) {
-                    log.error(ex);
+                    
log.error(sm.getString("farmWarDeployer.undeployMessageError"), ex);
                 }
             }
         } catch (java.io.IOException x) {
@@ -747,7 +747,7 @@ public class FarmWarDeployer extends ClusterListener 
implements ClusterDeployer,
         }
 
         try (java.io.FileInputStream is = new java.io.FileInputStream(from);
-                java.io.FileOutputStream os = new java.io.FileOutputStream(to, 
false);) {
+                java.io.FileOutputStream os = new java.io.FileOutputStream(to, 
false)) {
             byte[] buf = new byte[4096];
             while (true) {
                 int len = is.read(buf);
diff --git a/java/org/apache/catalina/ha/deploy/FileMessageFactory.java 
b/java/org/apache/catalina/ha/deploy/FileMessageFactory.java
index 942b273f30..18c32268e4 100644
--- a/java/org/apache/catalina/ha/deploy/FileMessageFactory.java
+++ b/java/org/apache/catalina/ha/deploy/FileMessageFactory.java
@@ -334,7 +334,10 @@ public class FileMessageFactory {
      * @param args String[], args[0] - read from filename, args[1] write to 
filename
      *
      * @throws Exception An error occurred
+     *
+     * @deprecated This method will be removed in Tomcat 10.0.x
      */
+    @Deprecated
     public static void main(String[] args) throws Exception {
         System.out.println("Usage: FileMessageFactory fileToBeRead 
fileToBeWritten");
         System.out.println("Usage: This will make a copy of the file on the 
local file system");
diff --git a/java/org/apache/catalina/ha/deploy/LocalStrings.properties 
b/java/org/apache/catalina/ha/deploy/LocalStrings.properties
index 57b98534d3..8b2df01de2 100644
--- a/java/org/apache/catalina/ha/deploy/LocalStrings.properties
+++ b/java/org/apache/catalina/ha/deploy/LocalStrings.properties
@@ -18,12 +18,12 @@ farmWarDeployer.delete=Deleted [{0}] before the full file 
was received as the ma
 farmWarDeployer.deleteFail=Failed to delete [{0}]
 farmWarDeployer.deployEnd=Deployment from [{0}] finished.
 farmWarDeployer.fileCopyFail=Unable to copy from [{0}] to [{1}]
+farmWarDeployer.fileMessageError=Error processing file message
 farmWarDeployer.hostOnly=FarmWarDeployer can only work as host cluster 
subelement!
 farmWarDeployer.hostParentEngine=FarmWarDeployer can only work if parent of 
[{0}] is an engine!
 farmWarDeployer.mbeanNameFail=Cannot construct MBean object name for engine 
[{0}] and host [{1}]
 farmWarDeployer.modInstall=Installing webapp [{0}] from [{1}]
 farmWarDeployer.modInstallFail=Unable to install WAR file
-farmWarDeployer.modRemoveFail=No removal
 farmWarDeployer.msgIoe=Unable to read farm deploy file message.
 farmWarDeployer.msgRxDeploy=Receive cluster deployment path [{0}], war [{1}]
 farmWarDeployer.msgRxUndeploy=Receive cluster undeployment from path [{0}]
@@ -43,6 +43,7 @@ farmWarDeployer.started=Cluster FarmWarDeployer started.
 farmWarDeployer.stopped=Cluster FarmWarDeployer stopped.
 farmWarDeployer.undeployEnd=Undeployment from [{0}] finished.
 farmWarDeployer.undeployLocal=Undeploy local context [{0}]
+farmWarDeployer.undeployMessageError=Error processing undeploy message
 farmWarDeployer.watchDir=Cluster deployment is watching [{0}] for changes.
 
 fileMessageFactory.cannotRead=Cannot read message, this factory is writing
diff --git a/java/org/apache/catalina/ha/deploy/LocalStrings_fr.properties 
b/java/org/apache/catalina/ha/deploy/LocalStrings_fr.properties
index 0b2825dbc3..4264fe7ac8 100644
--- a/java/org/apache/catalina/ha/deploy/LocalStrings_fr.properties
+++ b/java/org/apache/catalina/ha/deploy/LocalStrings_fr.properties
@@ -18,6 +18,7 @@ farmWarDeployer.delete=[{0}] a été supprimé avant que le 
fichier complet n''a
 farmWarDeployer.deleteFail=Pas réussi à supprimer [{0}]
 farmWarDeployer.deployEnd=Le déploiement de [{0}] est terminé
 farmWarDeployer.fileCopyFail=Impossible de copier depuis [{0}] vers [{1}]
+farmWarDeployer.fileMessageError=Erreur lors du traitement du message fichier
 farmWarDeployer.hostOnly=Le FarmWarDeployer ne fonctionne qu'en tant que 
sous-élément d'un "host cluster" !
 farmWarDeployer.hostParentEngine=FarmWarDeployer peut fonctionner uniquement 
si le parent de [{0}] est un moteur
 farmWarDeployer.mbeanNameFail=Impossible de construire le nom d''objet du 
mbean pour le moteur [{0}] et l''hôte [{1}]
@@ -42,6 +43,7 @@ farmWarDeployer.started=Le FarmWarDeployer du cluster a 
démarré
 farmWarDeployer.stopped=Le FarmWarDeployer du cluster a été arrêté
 farmWarDeployer.undeployEnd=Retrait de [{0}] terminé
 farmWarDeployer.undeployLocal=Le contexte local [{0}] est retiré
+farmWarDeployer.undeployMessageError=Erreur lors du traitement du message de 
retrait
 farmWarDeployer.watchDir=Le déploiement du cluster surveille [{0}] pour des 
modifications
 
 fileMessageFactory.cannotRead=Impossible de lire un message, cette fabrique 
est en train d'écrire
diff --git a/java/org/apache/catalina/ha/deploy/LocalStrings_ja.properties 
b/java/org/apache/catalina/ha/deploy/LocalStrings_ja.properties
index 0cc9772c39..5c5c28085d 100644
--- a/java/org/apache/catalina/ha/deploy/LocalStrings_ja.properties
+++ b/java/org/apache/catalina/ha/deploy/LocalStrings_ja.properties
@@ -18,6 +18,7 @@ farmWarDeployer.delete=[{1}] 秒の maxValidTime が期限切れになったた
 farmWarDeployer.deleteFail=[{0}] を削除できません。
 farmWarDeployer.deployEnd=[{0}] からの配備が完了しました。
 farmWarDeployer.fileCopyFail=[{0}] から [{1}] へコピーできません。
+farmWarDeployer.fileMessageError=ファイルメッセージ処理中のエラー
 farmWarDeployer.hostOnly=FarmWarDeployer はHostクラスタのサブエレメントとしてのみ機能します
 farmWarDeployer.hostParentEngine=FarmWarDeployer は親 [{0}] が Engine 
のインスタンスでなければ機能しません。
 farmWarDeployer.mbeanNameFail=エンジン [{0}] とホスト [{1}] のMBeanオブジェクト名を構築できません
@@ -42,6 +43,7 @@ farmWarDeployer.started=クラスターの FarmWarDeployer を開始しました
 farmWarDeployer.stopped=Cluster FarmWarDeployer が停止しました。
 farmWarDeployer.undeployEnd=コンテキスト [{0}] の配備解除が完了しました。
 farmWarDeployer.undeployLocal=ローカルコンテキスト [{0}] を配備解除します。
+farmWarDeployer.undeployMessageError=配備解除メッセージ処理中のエラー
 farmWarDeployer.watchDir=クラスタ配備の監視[{0}]が変更されています。
 
 fileMessageFactory.cannotRead=メッセージを読むことができません。このFactoryは書き込み中です。
diff --git a/java/org/apache/catalina/ha/deploy/LocalStrings_ko.properties 
b/java/org/apache/catalina/ha/deploy/LocalStrings_ko.properties
index 0f816aaaab..512827bc11 100644
--- a/java/org/apache/catalina/ha/deploy/LocalStrings_ko.properties
+++ b/java/org/apache/catalina/ha/deploy/LocalStrings_ko.properties
@@ -17,6 +17,7 @@ farmWarDeployer.alreadyDeployed=webapp [{0}](들)이 이미 배치되어 있습
 farmWarDeployer.deleteFail=[{0}]을(를) 삭제하지 못했습니다.
 farmWarDeployer.deployEnd=[{0}](으)로부터의 배치 작업이 완료됐습니다.
 farmWarDeployer.fileCopyFail=[{0}](으)로부터 [{1}](으)로 복사할 수 없습니다.
+farmWarDeployer.fileMessageError=파일 메시지를 처리하는 중 오류 발생
 farmWarDeployer.hostOnly=FarmWarDeployer는 오직 하위 엘리먼트인 호스트 클러스터 엘리먼트에서 존재해야 합니다.
 farmWarDeployer.hostParentEngine=FarmWarDeployer는, 오직 [{0}]의 부모가 엔진일 때에만, 정상 
동작할 수 있습니다!
 farmWarDeployer.mbeanNameFail=엔진 [{0}]와(과) 호스트 [{1}]을(를) 위한 MBean 객체 이름을 구성할 수 
없습니다.
@@ -41,6 +42,7 @@ farmWarDeployer.started=클러스터 FarmWarDeployer가 시작되었습니다.
 farmWarDeployer.stopped=클러스터 FarmWarDeployer가 중지되었습니다.
 farmWarDeployer.undeployEnd=컨텍스트 [{0}]의 배치를 제거했습니다.
 farmWarDeployer.undeployLocal=로컬 컨텍스트 [{0}]의 배치를 제거합니다.
+farmWarDeployer.undeployMessageError=배치를 제거하라는 메시지를 처리 중 오류 발생
 farmWarDeployer.watchDir=클러스터 배치관리자가 변경사항들을 탐지하기 위해 [{0}]을(를) 감시합니다.
 
 fileMessageFactory.cannotRead=팩토리가 쓰고 있는 중이라서, 메시지를 읽을 수 없습니다.
diff --git a/java/org/apache/catalina/ha/deploy/LocalStrings_zh_CN.properties 
b/java/org/apache/catalina/ha/deploy/LocalStrings_zh_CN.properties
index 9cfb6491bd..c5f34cf597 100644
--- a/java/org/apache/catalina/ha/deploy/LocalStrings_zh_CN.properties
+++ b/java/org/apache/catalina/ha/deploy/LocalStrings_zh_CN.properties
@@ -17,6 +17,7 @@ farmWarDeployer.alreadyDeployed=webapp[{0}]已部署。
 farmWarDeployer.deleteFail=无法删除 [{0}]
 farmWarDeployer.deployEnd=[{0}]中的部署已完成。
 farmWarDeployer.fileCopyFail=无法从[{0}]复制到[{1}]
+farmWarDeployer.fileMessageError=处理文件消息时出错
 farmWarDeployer.hostOnly=FarmWarDeployer 只有做为 host cluster 的子元素是才生效
 farmWarDeployer.hostParentEngine=FarmWarDeployer只能在[{0}]的父级是引擎时工作!
 farmWarDeployer.mbeanNameFail=无法为引擎[{0}]和主机[{1}]构造MBean对象名
@@ -41,6 +42,7 @@ farmWarDeployer.started=集群FarmWarDeployer已启动。
 farmWarDeployer.stopped=集群FarmWarDeployer已停止。
 farmWarDeployer.undeployEnd=从[{0}]取消部署完成。
 farmWarDeployer.undeployLocal=不能部署本地上下文[{0}]
+farmWarDeployer.undeployMessageError=处理取消部署消息时出错
 farmWarDeployer.watchDir=集群部署正在监视[{0}]的更改
 
 fileMessageFactory.cannotRead=无法读取消息,此工厂正在写入
diff --git a/java/org/apache/catalina/ha/session/ClusterSessionListener.java 
b/java/org/apache/catalina/ha/session/ClusterSessionListener.java
index 8683fdf24a..efaba44649 100644
--- a/java/org/apache/catalina/ha/session/ClusterSessionListener.java
+++ b/java/org/apache/catalina/ha/session/ClusterSessionListener.java
@@ -54,7 +54,7 @@ public class ClusterSessionListener extends ClusterListener {
         if (myobj instanceof SessionMessage) {
             SessionMessage msg = (SessionMessage) myobj;
             String ctxname = msg.getContextName();
-            // check if the message is a EVT_GET_ALL_SESSIONS,
+            // check if the message is an EVT_GET_ALL_SESSIONS,
             // if so, wait until we are fully started up
             Map<String,ClusterManager> managers = cluster.getManagers();
             if (ctxname == null) {
diff --git a/java/org/apache/catalina/ha/session/DeltaManager.java 
b/java/org/apache/catalina/ha/session/DeltaManager.java
index 979d36444c..4246d2c7c1 100644
--- a/java/org/apache/catalina/ha/session/DeltaManager.java
+++ b/java/org/apache/catalina/ha/session/DeltaManager.java
@@ -529,6 +529,13 @@ public class DeltaManager extends ClusterManagerBase {
         changeSessionId(session, newId, true);
     }
 
+    /**
+     * @param session The session
+     * @param notify  Notify change
+     *
+     * @deprecated Will be removed in Tomcat 10
+     */
+    @Deprecated
     protected void changeSessionId(Session session, boolean notify) {
         String orgSessionID = session.getId();
         super.changeSessionId(session);
diff --git a/java/org/apache/catalina/ha/session/DeltaSession.java 
b/java/org/apache/catalina/ha/session/DeltaSession.java
index fd34e85435..d890a64c28 100644
--- a/java/org/apache/catalina/ha/session/DeltaSession.java
+++ b/java/org/apache/catalina/ha/session/DeltaSession.java
@@ -1071,7 +1071,7 @@ public class DeltaSession extends StandardSession 
implements Externalizable, Clu
             accessCount = new AtomicInteger();
         }
         if (accessCount != null) {
-            super.accessCount.set(count);
+            accessCount.set(count);
         }
     }
 }
diff --git a/java/org/apache/catalina/ha/tcp/LocalStrings_es.properties 
b/java/org/apache/catalina/ha/tcp/LocalStrings_es.properties
index 19711c31b7..4e106ecdee 100644
--- a/java/org/apache/catalina/ha/tcp/LocalStrings_es.properties
+++ b/java/org/apache/catalina/ha/tcp/LocalStrings_es.properties
@@ -25,7 +25,6 @@ ReplicationValve.resetDeltaRequest=Cluster is standalone: 
reset Session Request
 ReplicationValve.send.failure=Unable to perform replication request.
 ReplicationValve.send.invalid.failure=Unable to send session [id={0}] invalid 
message over cluster.
 ReplicationValve.session.found=Context [{0}]: Found session [{1}] but it 
isn''t a ClusterSession.
-ReplicationValve.session.indicator=Context [{0}]: Primarity of session [{0}] 
in request attribute [{1}] is [{2}].
 ReplicationValve.session.invalid=Context [{0}]: Requested session [{1}] is 
invalid, removed or not replicated at this node.
 ReplicationValve.stats=Average request time= [{0}] ms for Cluster overhead 
time=[{1}] ms for [{2}] requests [{3}] filter requests [{4}] send requests 
[{5}] cross context requests (Request=[{6}] ms Cluster=[{7}] ms).
 
diff --git a/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java 
b/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
index 5512b6858a..f2f07c172b 100644
--- a/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
+++ b/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
@@ -20,7 +20,6 @@ import java.beans.PropertyChangeSupport;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -54,6 +53,7 @@ import org.apache.catalina.tribes.group.GroupChannel;
 import 
org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor;
 import org.apache.catalina.tribes.group.interceptors.TcpFailureDetector;
 import org.apache.catalina.util.LifecycleMBeanBase;
+import org.apache.catalina.util.ToStringUtil;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.res.StringManager;
@@ -578,8 +578,8 @@ public class SimpleTcpCluster extends LifecycleMBeanBase
      */
     protected void registerClusterValve() {
         if (container != null) {
-            for (Iterator<Valve> iter = valves.iterator(); iter.hasNext();) {
-                ClusterValve valve = (ClusterValve) iter.next();
+            for (Valve v : valves) {
+                ClusterValve valve = (ClusterValve) v;
                 if (log.isDebugEnabled()) {
                     log.debug("Invoking addValve on " + getContainer() + " 
with class=" + valve.getClass().getName());
                 }
@@ -595,8 +595,8 @@ public class SimpleTcpCluster extends LifecycleMBeanBase
      * unregister all cluster valve to host or engine
      */
     protected void unregisterClusterValve() {
-        for (Iterator<Valve> iter = valves.iterator(); iter.hasNext();) {
-            ClusterValve valve = (ClusterValve) iter.next();
+        for (Valve v : valves) {
+            ClusterValve valve = (ClusterValve) v;
             if (log.isDebugEnabled()) {
                 log.debug("Invoking removeValve on " + getContainer() + " with 
class=" + valve.getClass().getName());
             }
@@ -653,15 +653,7 @@ public class SimpleTcpCluster extends LifecycleMBeanBase
      */
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder(this.getClass().getName());
-        sb.append('[');
-        if (container == null) {
-            sb.append("Container is null");
-        } else {
-            sb.append(container.getName());
-        }
-        sb.append(']');
-        return sb.toString();
+        return ToStringUtil.toString(this);
     }
 
 
@@ -794,8 +786,7 @@ public class SimpleTcpCluster extends LifecycleMBeanBase
         // invoke all the listeners
         boolean accepted = false;
         if (message != null) {
-            for (Iterator<ClusterListener> iter = clusterListeners.iterator(); 
iter.hasNext();) {
-                ClusterListener listener = iter.next();
+            for (ClusterListener listener : clusterListeners) {
                 if (listener.accept(message)) {
                     accepted = true;
                     listener.messageReceived(message);
diff --git a/java/org/apache/catalina/util/ToStringUtil.java 
b/java/org/apache/catalina/util/ToStringUtil.java
new file mode 100644
index 0000000000..d1602bf423
--- /dev/null
+++ b/java/org/apache/catalina/util/ToStringUtil.java
@@ -0,0 +1,62 @@
+/*
+ * 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.catalina.util;
+
+import org.apache.catalina.Contained;
+import org.apache.catalina.Container;
+import org.apache.catalina.Manager;
+
+/**
+ * Utility class used to help generate return values for calls to
+ * {@link Object#toString()}.
+ */
+public class ToStringUtil {
+
+    private ToStringUtil() {
+        // Utility class. Hide default constructor
+    }
+
+
+    public static final String toString(Contained contained) {
+        return toString(contained, contained.getContainer());
+    }
+
+
+    public static final String toString(Object obj, Container container) {
+        return containedToString(obj, container, "Container");
+    }
+
+
+    public static final String toString(Object obj, Manager manager) {
+        return containedToString(obj, manager, "Manager");
+    }
+
+
+    private static String containedToString(Object contained, Object container,
+            String containerTypeName) {
+        StringBuilder sb = new 
StringBuilder(contained.getClass().getSimpleName());
+        sb.append('[');
+        if (container == null) {
+            sb.append(containerTypeName);
+            sb.append(" is null");
+        } else {
+            sb.append(container.toString());
+        }
+        sb.append(']');
+        return sb.toString();
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to