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