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

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

commit 5721fb0d0f5a5551de60a6d5c561b1dd9aa65c5c
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Nov 13 19:24:19 2019 +0000

    Align with 9.0.x/8.5.x. Identified during SpotBugs back-ports.
---
 .../catalina/ant/jmx/JMXAccessorConditionBase.java |   4 +-
 .../catalina/core/ApplicationFilterConfig.java     |   2 +-
 .../apache/catalina/ha/tcp/ReplicationValve.java   | 133 ++++++++++++---------
 .../catalina/manager/LocalStrings.properties       |   1 +
 .../catalina/manager/LocalStrings_fr.properties    |   1 +
 .../catalina/manager/LocalStrings_ja.properties    |   1 +
 .../catalina/manager/LocalStrings_ko.properties    |   1 +
 .../catalina/manager/LocalStrings_ru.properties    |   1 +
 .../catalina/manager/LocalStrings_zh_CN.properties |   1 +
 .../apache/catalina/manager/ManagerServlet.java    |  39 +++---
 .../catalina/manager/StatusManagerServlet.java     |   7 --
 .../mbeans/JmxRemoteLifecycleListener.java         |  27 +++++
 java/org/apache/catalina/tribes/Member.java        |   7 +-
 13 files changed, 136 insertions(+), 89 deletions(-)

diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java 
b/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java
index 8348213..a13fe90 100644
--- a/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java
+++ b/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java
@@ -150,8 +150,8 @@ public abstract class JMXAccessorConditionBase extends 
ProjectComponent implemen
      * from jmxOpen Task).
      *
      * @return active JMXConnection
-     * @throws MalformedURLException
-     * @throws IOException
+     * @throws MalformedURLException Invalid URL for JMX server
+     * @throws IOException Connection error
      */
     protected MBeanServerConnection getJMXConnection()
             throws MalformedURLException, IOException {
diff --git a/java/org/apache/catalina/core/ApplicationFilterConfig.java 
b/java/org/apache/catalina/core/ApplicationFilterConfig.java
index 39c85ae..47f65be 100644
--- a/java/org/apache/catalina/core/ApplicationFilterConfig.java
+++ b/java/org/apache/catalina/core/ApplicationFilterConfig.java
@@ -62,7 +62,7 @@ public final class ApplicationFilterConfig implements 
FilterConfig, Serializable
     static final StringManager sm =
         StringManager.getManager(Constants.Package);
 
-    private final Log log = LogFactory.getLog(ApplicationFilterConfig.class); 
// must not be static
+    private transient Log log = 
LogFactory.getLog(ApplicationFilterConfig.class); // must not be static
 
     /**
      * Empty String collection to serve as the basis for empty enumerations.
diff --git a/java/org/apache/catalina/ha/tcp/ReplicationValve.java 
b/java/org/apache/catalina/ha/tcp/ReplicationValve.java
index 8874119..5690350 100644
--- a/java/org/apache/catalina/ha/tcp/ReplicationValve.java
+++ b/java/org/apache/catalina/ha/tcp/ReplicationValve.java
@@ -42,6 +42,8 @@ import org.apache.catalina.ha.ClusterValve;
 import org.apache.catalina.ha.session.DeltaManager;
 import org.apache.catalina.ha.session.DeltaSession;
 import org.apache.catalina.valves.ValveBase;
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -58,14 +60,12 @@ import org.apache.tomcat.util.res.StringManager;
  * </p>
  *
  * @author Craig R. McClanahan
- * @author Filip Hanik
  * @author Peter Rossbach
  */
 public class ReplicationValve
     extends ValveBase implements ClusterValve {
 
-    private static final org.apache.juli.logging.Log log =
-        org.apache.juli.logging.LogFactory.getLog( ReplicationValve.class );
+    private static final Log log = LogFactory.getLog(ReplicationValve.class);
 
     // ----------------------------------------------------- Instance Variables
 
@@ -100,13 +100,21 @@ public class ReplicationValve
      */
     protected boolean doProcessingStats = false;
 
-    protected long totalRequestTime = 0;
-    protected long totalSendTime = 0;
-    protected long nrOfRequests = 0;
-    protected long lastSendTime = 0;
-    protected long nrOfFilterRequests = 0;
-    protected long nrOfSendRequests = 0;
-    protected long nrOfCrossContextSendRequests = 0;
+    /*
+     * Note: The statistics are volatile to ensure the concurrent updates do 
not
+     *       corrupt them but it is still possible that:
+     *       - some updates may be lost;
+     *       - the individual statistics may not be consistent which each 
other.
+     *       This is a deliberate design choice to reduce the requirement for
+     *       synchronization.
+     */
+    protected volatile long totalRequestTime = 0;
+    protected volatile long totalSendTime = 0;
+    protected volatile long nrOfRequests = 0;
+    protected volatile long lastSendTime = 0;
+    protected volatile long nrOfFilterRequests = 0;
+    protected volatile long nrOfSendRequests = 0;
+    protected volatile long nrOfCrossContextSendRequests = 0;
 
     /**
      * must primary change indicator set
@@ -135,7 +143,7 @@ public class ReplicationValve
     }
 
     /**
-     * @return Returns the cluster.
+     * @return the cluster.
      */
     @Override
     public CatalinaCluster getCluster() {
@@ -151,7 +159,7 @@ public class ReplicationValve
     }
 
     /**
-     * @return Returns the filter
+     * @return the filter
      */
     public String getFilter() {
        if (filter == null) {
@@ -167,8 +175,9 @@ public class ReplicationValve
      *            The filter to set.
      */
     public void setFilter(String filter) {
-        if (log.isDebugEnabled())
+        if (log.isDebugEnabled()) {
             log.debug(sm.getString("ReplicationValve.filter.loading", filter));
+        }
 
         if (filter == null || filter.length() == 0) {
             this.filter = null;
@@ -183,7 +192,7 @@ public class ReplicationValve
     }
 
     /**
-     * @return Returns the primaryIndicator.
+     * @return the primaryIndicator.
      */
     public boolean isPrimaryIndicator() {
         return primaryIndicator;
@@ -197,7 +206,7 @@ public class ReplicationValve
     }
 
     /**
-     * @return Returns the primaryIndicatorName.
+     * @return the primaryIndicatorName.
      */
     public String getPrimaryIndicatorName() {
         return primaryIndicatorName;
@@ -212,6 +221,7 @@ public class ReplicationValve
 
     /**
      * Calc processing stats
+     * @return <code>true</code> if statistics are enabled
      */
     public boolean doStatistics() {
         return doProcessingStats;
@@ -219,6 +229,8 @@ public class ReplicationValve
 
     /**
      * Set Calc processing stats
+     *
+     * @param doProcessingStats New flag value
      * @see #resetStatistics()
      */
     public void setStatistics(boolean doProcessingStats) {
@@ -226,49 +238,49 @@ public class ReplicationValve
     }
 
     /**
-     * @return Returns the lastSendTime.
+     * @return the lastSendTime.
      */
     public long getLastSendTime() {
         return lastSendTime;
     }
 
     /**
-     * @return Returns the nrOfRequests.
+     * @return the nrOfRequests.
      */
     public long getNrOfRequests() {
         return nrOfRequests;
     }
 
     /**
-     * @return Returns the nrOfFilterRequests.
+     * @return the nrOfFilterRequests.
      */
     public long getNrOfFilterRequests() {
         return nrOfFilterRequests;
     }
 
     /**
-     * @return Returns the nrOfCrossContextSendRequests.
+     * @return the nrOfCrossContextSendRequests.
      */
     public long getNrOfCrossContextSendRequests() {
         return nrOfCrossContextSendRequests;
     }
 
     /**
-     * @return Returns the nrOfSendRequests.
+     * @return the nrOfSendRequests.
      */
     public long getNrOfSendRequests() {
         return nrOfSendRequests;
     }
 
     /**
-     * @return Returns the totalRequestTime.
+     * @return the totalRequestTime.
      */
     public long getTotalRequestTime() {
         return totalRequestTime;
     }
 
     /**
-     * @return Returns the totalSendTime.
+     * @return the totalSendTime.
      */
     public long getTotalSendTime() {
         return totalSendTime;
@@ -287,10 +299,11 @@ public class ReplicationValve
         List<DeltaSession> sessions = crossContextSessions.get();
         if(sessions != null) {
             if(!sessions.contains(session)) {
-                if(log.isDebugEnabled())
+                if(log.isDebugEnabled()) {
                     
log.debug(sm.getString("ReplicationValve.crossContext.registerSession",
                         session.getIdInternal(),
                         session.getManager().getContainer().getName()));
+                }
                 sessions.add(session);
             }
         }
@@ -325,8 +338,9 @@ public class ReplicationValve
                 && ((StandardContext) context).getCrossContext();
         try {
             if(isCrossContext) {
-                if(log.isDebugEnabled())
+                if(log.isDebugEnabled()) {
                     
log.debug(sm.getString("ReplicationValve.crossContext.add"));
+                }
                 //FIXME add Pool of Arraylists
                 crossContextSessions.set(new ArrayList<DeltaSession>());
             }
@@ -337,8 +351,9 @@ public class ReplicationValve
 
                 // valve cluster can access manager - other cluster handle 
replication
                 // at host level - hopefully!
-                if(cluster.getManager(clusterManager.getName()) == null)
+                if(cluster.getManager(clusterManager.getName()) == null) {
                     return ;
+                }
                 if(cluster.hasMembers()) {
                     sendReplicationMessage(request, totalstart, 
isCrossContext, clusterManager, cluster);
                 } else {
@@ -349,8 +364,9 @@ public class ReplicationValve
             // Array must be remove: Current master request send endAccess at 
recycle.
             // Don't register this request session again!
             if(isCrossContext) {
-                if(log.isDebugEnabled())
+                if(log.isDebugEnabled()) {
                     
log.debug(sm.getString("ReplicationValve.crossContext.remove"));
+                }
                 // crossContextSessions.remove() only exist at Java 5
                 // register ArrayList at a pool
                 crossContextSessions.set(null);
@@ -363,11 +379,11 @@ public class ReplicationValve
      * reset the active statistics
      */
     public void resetStatistics() {
-        totalRequestTime = 0 ;
-        totalSendTime = 0 ;
-        lastSendTime = 0 ;
-        nrOfFilterRequests = 0 ;
-        nrOfRequests = 0 ;
+        totalRequestTime = 0;
+        totalSendTime = 0;
+        lastSendTime = 0;
+        nrOfFilterRequests = 0;
+        nrOfRequests = 0;
         nrOfSendRequests = 0;
         nrOfCrossContextSendRequests = 0;
     }
@@ -397,13 +413,6 @@ public class ReplicationValve
 
     // --------------------------------------------------------- Protected 
Methods
 
-    /**
-     * @param request
-     * @param totalstart
-     * @param isCrossContext
-     * @param clusterManager
-     * @param containerCluster
-     */
     protected void sendReplicationMessage(Request request, long totalstart, 
boolean isCrossContext, ClusterManager clusterManager, CatalinaCluster 
containerCluster) {
         //this happens after the request
         long start = 0;
@@ -413,12 +422,14 @@ public class ReplicationValve
         try {
             // send invalid sessions
             // DeltaManager returns String[0]
-            if (!(clusterManager instanceof DeltaManager))
+            if (!(clusterManager instanceof DeltaManager)) {
                 sendInvalidSessions(clusterManager, containerCluster);
+            }
             // send replication
             sendSessionReplicationMessage(request, clusterManager, 
containerCluster);
-            if(isCrossContext)
+            if(isCrossContext) {
                 sendCrossContextSession(containerCluster);
+            }
         } catch (Exception x) {
             // FIXME we have a lot of sends, but the trouble with one node 
stops the correct replication to other nodes!
             log.error(sm.getString("ReplicationValve.send.failure"), x);
@@ -437,11 +448,11 @@ public class ReplicationValve
     protected void sendCrossContextSession(CatalinaCluster containerCluster) {
         List<DeltaSession> sessions = crossContextSessions.get();
         if(sessions != null && sessions.size() >0) {
-            for(Iterator<DeltaSession> iter = sessions.iterator(); 
iter.hasNext() ;) {
-                Session session = iter.next();
-                if(log.isDebugEnabled())
+            for (DeltaSession session : sessions) {
+                if(log.isDebugEnabled()) {
                     
log.debug(sm.getString("ReplicationValve.crossContext.sendDelta",
                             session.getManager().getContainer().getName() ));
+                }
                 
sendMessage(session,(ClusterManager)session.getManager(),containerCluster);
                 if(doStatistics()) {
                     nrOfCrossContextSendRequests++;
@@ -468,8 +479,9 @@ public class ReplicationValve
                 for(; iter.hasNext() ;) {
                     Session session = iter.next();
                     resetDeltaRequest(session);
-                    if(session instanceof DeltaSession)
+                    if(session instanceof DeltaSession) {
                         ((DeltaSession)contextSession).setPrimarySession(true);
+                    }
 
                 }
             }
@@ -501,12 +513,14 @@ public class ReplicationValve
             String uri = request.getDecodedRequestURI();
             // request without session change
             if (!isRequestWithoutSessionChange(uri)) {
-                if (log.isDebugEnabled())
+                if (log.isDebugEnabled()) {
                     log.debug(sm.getString("ReplicationValve.invoke.uri", 
uri));
+                }
                 sendMessage(session,manager,cluster);
             } else
-                if(doStatistics())
+                if(doStatistics()) {
                     nrOfFilterRequests++;
+                }
         }
 
     }
@@ -537,14 +551,15 @@ public class ReplicationValve
         ClusterMessage msg = manager.requestCompleted(sessionId);
         if (msg != null) {
             cluster.send(msg);
-            if(doStatistics())
+            if(doStatistics()) {
                 nrOfSendRequests++;
+            }
         }
     }
 
     /**
      * check for session invalidations
-     * @param manager
+     * @param manager Associated manager
      * @param cluster
      */
     protected void sendInvalidSessions(ClusterManager manager, CatalinaCluster 
cluster) {
@@ -572,18 +587,17 @@ public class ReplicationValve
 
     /**
      * Protocol cluster replications stats
-     * @param requestTime
-     * @param clusterTime
+     * @param requestTime Request time
+     * @param clusterTime Cluster time
      */
     protected  void updateStats(long requestTime, long clusterTime) {
         // TODO: Async requests may trigger multiple replication requests. How,
         //       if at all, should the stats handle this?
-        synchronized(this) {
-            lastSendTime=System.currentTimeMillis();
-            totalSendTime+=lastSendTime - clusterTime;
-            totalRequestTime+=lastSendTime - requestTime;
-            nrOfRequests++;
-        }
+        long currentTime = System.currentTimeMillis();
+        lastSendTime = currentTime;
+        totalSendTime += currentTime - clusterTime;
+        totalRequestTime += currentTime - requestTime;
+        nrOfRequests++;
         if(log.isInfoEnabled()) {
             if ( (nrOfRequests % 100) == 0 ) {
                  log.info(sm.getString("ReplicationValve.stats",
@@ -605,8 +619,8 @@ public class ReplicationValve
      * Mark Request that processed at primary node with attribute
      * primaryIndicatorName
      *
-     * @param request
-     * @throws IOException
+     * @param request The Servlet request
+     * @throws IOException IO error finding session
      */
     protected void createPrimaryIndicator(Request request) throws IOException {
         String id = request.getRequestedSessionId();
@@ -615,11 +629,12 @@ public class ReplicationValve
             Session session = manager.findSession(id);
             if (session instanceof ClusterSession) {
                 ClusterSession cses = (ClusterSession) session;
-                if (log.isDebugEnabled())
+                if (log.isDebugEnabled()) {
                     log.debug(sm.getString(
                             "ReplicationValve.session.indicator", 
request.getContext().getName(),id,
                             primaryIndicatorName,
                             Boolean.valueOf(cses.isPrimarySession())));
+                }
                 request.setAttribute(primaryIndicatorName, 
cses.isPrimarySession()?Boolean.TRUE:Boolean.FALSE);
             } else {
                 if (log.isDebugEnabled()) {
diff --git a/java/org/apache/catalina/manager/LocalStrings.properties 
b/java/org/apache/catalina/manager/LocalStrings.properties
index bdb9bd5..08b485c 100644
--- a/java/org/apache/catalina/manager/LocalStrings.properties
+++ b/java/org/apache/catalina/manager/LocalStrings.properties
@@ -137,6 +137,7 @@ managerServlet.notDeployed=FAIL - Context [{0}] is defined 
in server.xml and may
 managerServlet.objectNameFail=FAIL - Unable to register object name [{0}] for 
Manager Servlet
 managerServlet.postCommand=FAIL - Tried to use command [{0}] via a GET request 
but POST is required
 managerServlet.reloaded=OK - Reloaded application at context path [{0}]
+managerServlet.renameFail=FAIL - Unable to rename [{0}] to [{1}]. This may 
cause problems for future deployments.
 managerServlet.resourcesAll=OK - Listed global resources of all types
 managerServlet.resourcesType=OK - Listed global resources of type [{0}]
 managerServlet.saveFail=FAIL - Configuration save failed: [{0}]
diff --git a/java/org/apache/catalina/manager/LocalStrings_fr.properties 
b/java/org/apache/catalina/manager/LocalStrings_fr.properties
index 8a99c05..b9624b1 100644
--- a/java/org/apache/catalina/manager/LocalStrings_fr.properties
+++ b/java/org/apache/catalina/manager/LocalStrings_fr.properties
@@ -135,6 +135,7 @@ managerServlet.notDeployed=ECHEC - Le contexte [{0}] est 
défini dans server.xml
 managerServlet.objectNameFail=ECHEC - Le nom d''objet [{0}] n''a pas pu être 
enregistré pour le Servlet de Gestion
 managerServlet.postCommand=ECHEC - Tentative d''utilisation de la commande 
[{0}] via une requête GET, mais POST est requis
 managerServlet.reloaded=OK - L''application associée au chemin de contexte 
[{0}] a été rechargée
+managerServlet.renameFail=ECHEC - N''a pas pu renommer [{0}] vers [{1}], cela 
pourrait causer des problèmes pour de prochains déploiements
 managerServlet.resourcesAll=OK - Liste des ressources globales de tout type
 managerServlet.resourcesType=OK - Liste des ressources globales de type [{0}]
 managerServlet.saveFail=ECHEC - La sauvegarde de la configuration a échoué: 
[{0}]
diff --git a/java/org/apache/catalina/manager/LocalStrings_ja.properties 
b/java/org/apache/catalina/manager/LocalStrings_ja.properties
index f11c7a0..efc732c 100644
--- a/java/org/apache/catalina/manager/LocalStrings_ja.properties
+++ b/java/org/apache/catalina/manager/LocalStrings_ja.properties
@@ -137,6 +137,7 @@ managerServlet.notDeployed=FAIL  - 
Context[{0}]はserver.xmlで定義されて
 managerServlet.objectNameFail=FAIL - オブジェクト名 [{0}] を ManagerServlet として登録できません。
 managerServlet.postCommand=FAIL - コマンド [{0}] を GET リクエストで実行しようとしましたが、POST 
リクエストでなければなりません。
 managerServlet.reloaded=OK - コンテキストパス [{0}] のアプリケーションを再ロードしました
+managerServlet.renameFail=FAIL  -  [{0}]の名前を[{1}]に変更できません。 
これにより、今後の展開で問題が発生する可能性があります。
 managerServlet.resourcesAll=OK - すべてのタイプのグローバルリソースを列挙しました
 managerServlet.resourcesType=OK - タイプ [{0}] のグローバルリソースを列挙しました
 managerServlet.saveFail=FAIL - 設定の保存に失敗しました: [{0}]
diff --git a/java/org/apache/catalina/manager/LocalStrings_ko.properties 
b/java/org/apache/catalina/manager/LocalStrings_ko.properties
index 06afaba..3c93728 100644
--- a/java/org/apache/catalina/manager/LocalStrings_ko.properties
+++ b/java/org/apache/catalina/manager/LocalStrings_ko.properties
@@ -126,6 +126,7 @@ managerServlet.notDeployed=실패 - 컨텍스트 [{0}]이(가) server.xml에 정
 managerServlet.objectNameFail=실패 - 매니저 서블릿을 위한 객체 이름 [{0}]을(를) 등록할 수 없습니다.
 managerServlet.postCommand=실패 - GET 요청을 통해 명령 [{0}]을(를) 사용하려 시도했으나, POST 요청이 
요구됩니다.
 managerServlet.reloaded=OK - 컨텍스트 경로 [{0}]의 애플리케이션을 다시 로드했습니다.
+managerServlet.renameFail=실패 - [{0}]을(를) [{1}](으)로 이름을 변경할 수 없습니다. 이는 이후의 배치 
작업들에서 문제들을 일으킬 수 있습니다.
 managerServlet.resourcesAll=OK - 모든 타입들의 글로벌 리소스들이 목록으로 표시되었습니다.
 managerServlet.resourcesType=OK - 타입이 [{0}]인 글로벌 리소스들의 목록을 표시했습니다.
 managerServlet.saveFail=실패 - 설정을 저장하지 못했습니다: [{0}]
diff --git a/java/org/apache/catalina/manager/LocalStrings_ru.properties 
b/java/org/apache/catalina/manager/LocalStrings_ru.properties
index a2437dc..db7320e 100644
--- a/java/org/apache/catalina/manager/LocalStrings_ru.properties
+++ b/java/org/apache/catalina/manager/LocalStrings_ru.properties
@@ -128,6 +128,7 @@ managerServlet.notDeployed=ОШИБКА - [{0}] определен в файле
 managerServlet.objectNameFail=ОШИБКА - Не удалось зарегистрировать имя объекта 
[{0}] для Manager Servlet
 managerServlet.postCommand=ОШИБКА - Попытка использовать команду [{0}] через 
запрос GET но требуется POST
 managerServlet.reloaded=OK - Приложение по пути контекста [{0}] было 
перезагружено
+managerServlet.renameFail=ОШИБКА - Невозможно переименовать [{0}] в [{1}]. Это 
может вызвать проблемы для будущих развертываний.
 managerServlet.resourcesAll=OK - Перечислены глобальные ресурсы всех видов
 managerServlet.resourcesType=OK - Перечислены глобальные ресурсы вида [{0}]
 managerServlet.saveFail=ОШИБКА - Не удалось сохранить настройки: [{0}]
diff --git a/java/org/apache/catalina/manager/LocalStrings_zh_CN.properties 
b/java/org/apache/catalina/manager/LocalStrings_zh_CN.properties
index 2330cf5..8212d1a 100644
--- a/java/org/apache/catalina/manager/LocalStrings_zh_CN.properties
+++ b/java/org/apache/catalina/manager/LocalStrings_zh_CN.properties
@@ -125,6 +125,7 @@ managerServlet.notDeployed=失败 - 上下文[{0}]定义在server.xml中且可
 managerServlet.objectNameFail=FAIL - 不能将为Manager Servlet 注册 object name  [{0}]
 managerServlet.postCommand=失败 - 尝试通过GET请求使用命令[{0}],但需要POST
 managerServlet.reloaded=OK - 上下文路径[{0}]重新加载应用程序
+managerServlet.renameFail=失败 - 无法重命名[{0}]为[{1}],这可能这未来部署时出现问题。
 managerServlet.resourcesAll=OK - 列出所有类型的全部资源
 managerServlet.resourcesType=OK - [{0}]类型全局资源列入清单
 managerServlet.saveFail=失败 - 配置保存失败:[{0}]
diff --git a/java/org/apache/catalina/manager/ManagerServlet.java 
b/java/org/apache/catalina/manager/ManagerServlet.java
index 9b45ae0..660463f 100644
--- a/java/org/apache/catalina/manager/ManagerServlet.java
+++ b/java/org/apache/catalina/manager/ManagerServlet.java
@@ -14,11 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-
 package org.apache.catalina.manager;
 
-
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -257,9 +254,7 @@ public class ManagerServlet extends HttpServlet implements 
ContainerServlet {
      */
     @Override
     public Wrapper getWrapper() {
-
-        return (this.wrapper);
-
+        return this.wrapper;
     }
 
 
@@ -541,6 +536,10 @@ public class ManagerServlet extends HttpServlet implements 
ContainerServlet {
 
     /**
      * Find potential memory leaks caused by web application reload.
+     *
+     * @param statusLine Print a status line
+     * @param writer The output writer
+     * @param smClient StringManager for the client's locale
      */
     protected void findleaks(boolean statusLine, PrintWriter writer,
             StringManager smClient) {
@@ -571,9 +570,11 @@ public class ManagerServlet extends HttpServlet implements 
ContainerServlet {
 
 
     /**
-     * Write some VM info
+     * Write some VM info.
      *
-     * @param writer
+     * @param writer The output writer
+     * @param smClient StringManager for the client's locale
+     * @param requestedLocales the client's locales
      */
     protected void vmInfo(PrintWriter writer, StringManager smClient,
             Enumeration<Locale> requestedLocales) {
@@ -582,9 +583,11 @@ public class ManagerServlet extends HttpServlet implements 
ContainerServlet {
     }
 
     /**
-     * Write a JVM thread dump
+     * Write a JVM thread dump.
      *
-     * @param writer
+     * @param writer The output writer
+     * @param smClient StringManager for the client's locale
+     * @param requestedLocales the client's locales
      */
     protected void threadDump(PrintWriter writer, StringManager smClient,
             Enumeration<Locale> requestedLocales) {
@@ -596,10 +599,11 @@ public class ManagerServlet extends HttpServlet 
implements ContainerServlet {
     /**
      * Store server configuration.
      *
-     * @param path Optional context path to save
+     * @param writer   Destination for any user message(s) during this 
operation
+     * @param path     Optional context path to save
+     * @param smClient i18n support for current client's locale
      */
-    protected synchronized void save(PrintWriter writer, String path,
-            StringManager smClient) {
+    protected synchronized void save(PrintWriter writer, String path, 
StringManager smClient) {
 
         Server server = ((Engine)host.getParent()).getService().getServer();
 
@@ -617,7 +621,6 @@ public class ManagerServlet extends HttpServlet implements 
ContainerServlet {
                 log("managerServlet.storeConfig", e);
                 writer.println(smClient.getString("managerServlet.exception",
                         e.toString()));
-                return;
             }
         } else {
             String contextPath = path;
@@ -638,10 +641,8 @@ public class ManagerServlet extends HttpServlet implements 
ContainerServlet {
                 log("managerServlet.save[" + path + "]", e);
                 writer.println(smClient.getString("managerServlet.exception",
                         e.toString()));
-                return;
             }
         }
-
     }
 
 
@@ -728,7 +729,11 @@ public class ManagerServlet extends HttpServlet implements 
ContainerServlet {
                             return;
                         }
                         // Rename uploaded WAR file
-                        uploadedWar.renameTo(deployedWar);
+                        if (!uploadedWar.renameTo(deployedWar)) {
+                            
writer.println(smClient.getString("managerServlet.renameFail",
+                                    uploadedWar, deployedWar));
+                            return;
+                        }
                     }
                     if (tag != null) {
                         // Copy WAR to the host's appBase
diff --git a/java/org/apache/catalina/manager/StatusManagerServlet.java 
b/java/org/apache/catalina/manager/StatusManagerServlet.java
index 2de3859..ef3d200 100644
--- a/java/org/apache/catalina/manager/StatusManagerServlet.java
+++ b/java/org/apache/catalina/manager/StatusManagerServlet.java
@@ -396,14 +396,7 @@ public class StatusManagerServlet
                         requestProcessors.removeElement(objectName);
                     }
                 }
-                String j2eeType = objectName.getKeyProperty("j2eeType");
-                if (j2eeType != null) {
-
-                }
             }
         }
-
     }
-
-
 }
diff --git a/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java 
b/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java
index dbb4ed2..3b18001 100644
--- a/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java
+++ b/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java
@@ -468,5 +468,32 @@ public class JmxRemoteLifecycleListener implements 
LifecycleListener {
             sslServerSocket.setNeedClientAuth(getNeedClientAuth());
             return sslServerSocket;
         }
+
+        // Super class defines hashCode() and equals(). Probably not used in
+        // Tomcat but for safety, override them here.
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = super.hashCode();
+            result = prime * result + ((bindAddress == null) ? 0 : 
bindAddress.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (!super.equals(obj))
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            SslRmiServerBindSocketFactory other = 
(SslRmiServerBindSocketFactory) obj;
+            if (bindAddress == null) {
+                if (other.bindAddress != null)
+                    return false;
+            } else if (!bindAddress.equals(other.bindAddress))
+                return false;
+            return true;
+        }
     }
 }
diff --git a/java/org/apache/catalina/tribes/Member.java 
b/java/org/apache/catalina/tribes/Member.java
index c2c96d3..a1c0990 100644
--- a/java/org/apache/catalina/tribes/Member.java
+++ b/java/org/apache/catalina/tribes/Member.java
@@ -17,6 +17,8 @@
 
 package org.apache.catalina.tribes;
 
+import java.io.Serializable;
+
 /**
  * The Member interface, defines a member in the group.
  * Each member can carry a set of properties, defined by the actual 
implementation.<BR>
@@ -26,9 +28,8 @@ package org.apache.catalina.tribes;
  * The uniqueId defines the session id for the member. This is an important 
feature
  * since a member that has crashed and the starts up again on the same 
port/host is
  * not guaranteed to be the same member, so no state transfers will ever be 
confused
- * @author Filip Hanik
  */
-public interface Member {
+public interface Member extends Serializable {
 
     /**
      * When a member leaves the cluster, the payload of the memberDisappeared 
member
@@ -37,7 +38,7 @@ public interface Member {
     public static final byte[] SHUTDOWN_PAYLOAD = new byte[] {66, 65, 66, 89, 
45, 65, 76, 69, 88};
 
     /**
-     * Returns the name of this node, should be unique within the group.
+     * @return the name of this node, should be unique within the group.
      */
     public String getName();
 


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

Reply via email to