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 11ed237be6c27e035c00cd38c55e398789f2c7ac Author: Mark Thomas <ma...@apache.org> AuthorDate: Sat Dec 7 20:58:03 2019 +0000 Align with 8.5.x to aid back-ports --- java/org/apache/catalina/Manager.java | 43 +++--- .../catalina/session/LocalStrings.properties | 1 + .../catalina/session/LocalStrings_fr.properties | 1 + .../catalina/session/LocalStrings_ja.properties | 1 + .../catalina/session/LocalStrings_ko.properties | 1 + .../catalina/session/LocalStrings_zh_CN.properties | 1 + java/org/apache/catalina/session/ManagerBase.java | 169 ++++++++++----------- 7 files changed, 114 insertions(+), 103 deletions(-) diff --git a/java/org/apache/catalina/Manager.java b/java/org/apache/catalina/Manager.java index 8322f25..3f02f6e 100644 --- a/java/org/apache/catalina/Manager.java +++ b/java/org/apache/catalina/Manager.java @@ -14,15 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.catalina; - import java.beans.PropertyChangeListener; import java.io.IOException; - /** * A <b>Manager</b> manages the pool of Sessions that are associated with a * particular Container. Different Manager implementations may support @@ -43,12 +39,12 @@ import java.io.IOException; */ public interface Manager { - // ------------------------------------------------------------- Properties - /** - * Return the Container with which this Manager is associated. + * Get the Container with which this Manager is associated. + * + * @return The associated Container */ public Container getContainer(); @@ -71,7 +67,7 @@ public interface Manager { * this Manager. * * @deprecated Ignored. {@link Context#getDistributable()} always takes - * precedence. Will be removed in Tomcat 9.0.x. + * precedence. Will be removed in Tomcat 8.5.x. */ @Deprecated public boolean getDistributable(); @@ -85,7 +81,7 @@ public interface Manager { * @param distributable The new distributable flag * * @deprecated Ignored. {@link Context#getDistributable()} always takes - * precedence. Will be removed in Tomcat 9.0.x. + * precedence. Will be removed in Tomcat 8.5.x. */ @Deprecated public void setDistributable(boolean distributable); @@ -104,7 +100,7 @@ public interface Manager { * for Sessions created by this Manager. * * @deprecated Ignored. {@link Context#getSessionTimeout()} always takes - * precedence. Will be removed in Tomcat 9.0.x. + * precedence. Will be removed in Tomcat 8.5.x. */ @Deprecated public int getMaxInactiveInterval(); @@ -117,7 +113,7 @@ public interface Manager { * @param interval The new default value * * @deprecated Ignored. {@link Context#getSessionTimeout()} always takes - * precedence. Will be removed in Tomcat 9.0.x. + * precedence. Will be removed in Tomcat 8.5.x. */ @Deprecated public void setMaxInactiveInterval(int interval); @@ -256,9 +252,10 @@ public interface Manager { * @return The current rate (in sessions per minute) of session expiration */ public int getSessionExpireRate(); - // --------------------------------------------------------- Public Methods + // --------------------------------------------------------- Public Methods + /** * Add this Session to the set of active Sessions for this Manager. * @@ -288,6 +285,8 @@ public interface Manager { * Get a session from the recycled ones or create a new empty one. * The PersistentManager manager does not need to create session data * because it reads it from the Store. + * + * @return An empty Session object */ public Session createEmptySession(); @@ -305,6 +304,9 @@ public interface Manager { * method of the returned session. * @exception IllegalStateException if a new session cannot be * instantiated for any reason + * + * @return An empty Session object with the given ID or a newly created + * session ID if none was specified */ public Session createSession(String sessionId); @@ -319,6 +321,9 @@ public interface Manager { * instantiated for any reason * @exception IOException if an input/output error occurs while * processing this request + * + * @return the request session or {@code null} if a session with the + * requested ID could not be found */ public Session findSession(String id) throws IOException; @@ -326,6 +331,8 @@ public interface Manager { /** * Return the set of active Sessions associated with this Manager. * If this Manager has no active Sessions, a zero-length array is returned. + * + * @return All the currently active sessions managed by this manager */ public Session[] findSessions(); @@ -376,13 +383,13 @@ public interface Manager { */ public void unload() throws IOException; - /** - * This method will be invoked by the context/container on a periodic - * basis and allows the manager to implement - * a method that executes periodic tasks, such as expiring sessions etc. - */ - public void backgroundProcess(); + /** + * This method will be invoked by the context/container on a periodic + * basis and allows the manager to implement + * a method that executes periodic tasks, such as expiring sessions etc. + */ + public void backgroundProcess(); /** diff --git a/java/org/apache/catalina/session/LocalStrings.properties b/java/org/apache/catalina/session/LocalStrings.properties index 1b55ca9..2429627 100644 --- a/java/org/apache/catalina/session/LocalStrings.properties +++ b/java/org/apache/catalina/session/LocalStrings.properties @@ -41,6 +41,7 @@ managerBase.createRandom=Created random number generator for session ID generati managerBase.createSession.ise=createSession: Too many active sessions managerBase.sessionAttributeNameFilter=Skipped session attribute named [{0}] because it did not match the name filter [{1}] managerBase.sessionAttributeValueClassNameFilter=Skipped session attribute named [{0}] because the value type [{1}] did not match the filter [{2}] +managerBase.sessionNotFound=The session [{0}] was not found managerBase.sessionTimeout=Invalid session timeout setting [{0}] managerBase.setContextNotNew=It is illegal to call setContext() to change the Context associated with a Manager if the Manager is not in the NEW state managerBase.setMaxInactiveIntervalUnused=Manager.setMaxInactiveInterval() is deprecated and calls to this method are ignored. Session timeouts should be configured in web.xml or via Context.setSessionTimeout(int timeoutInMinutes) diff --git a/java/org/apache/catalina/session/LocalStrings_fr.properties b/java/org/apache/catalina/session/LocalStrings_fr.properties index eed03cd..066360b 100644 --- a/java/org/apache/catalina/session/LocalStrings_fr.properties +++ b/java/org/apache/catalina/session/LocalStrings_fr.properties @@ -39,6 +39,7 @@ fileStore.saving=Sauvegarde de la Session [{0}] vers le fichier [{1}] managerBase.createSession.ise="createSession": Trop de sessions actives managerBase.sessionAttributeNameFilter=L''attribut de session nommé [{0}] sera sauté car il ne correspond pas au filtre sur les noms [{1}] managerBase.sessionAttributeValueClassNameFilter=L''attribut de session nommé [{0}] a été passé parce que le type [{1}] de la valeur ne correspond pas au filtre [{2}] +managerBase.sessionNotFound=La session [{0}] n''a pas été trouvée managerBase.sessionTimeout=Réglage du délai d''inactivité (timeout) de session invalide [{0}] managerBase.setContextNotNew=Il est illégal d'appeler setContext() pour changer le contexte associé avec un gestionnaire (Manager) si le genstionnaire n'est pas dans l'état nouveau diff --git a/java/org/apache/catalina/session/LocalStrings_ja.properties b/java/org/apache/catalina/session/LocalStrings_ja.properties index 8f008b7..0cfbbd1 100644 --- a/java/org/apache/catalina/session/LocalStrings_ja.properties +++ b/java/org/apache/catalina/session/LocalStrings_ja.properties @@ -39,6 +39,7 @@ fileStore.saving=セッション [{0}] をファイル [{1}] に保存します managerBase.createSession.ise=createSession: アクティブセッションが多すぎます managerBase.sessionAttributeNameFilter=名前フィルタ[{1}]と一致しなかったため、[{0}]というセッション属性をスキップしました。 managerBase.sessionAttributeValueClassNameFilter=値タイプ[{1}]がフィルタ[{2}]と一致しなかったため、[{0}]という名前のセッション属性をスキップしました。 +managerBase.sessionNotFound=セッション [{0}] が見つかりません。 managerBase.sessionTimeout=無効なセッションタイムアウト設定です [{0}] managerBase.setContextNotNew=NEW 状態ではないマネージャーに関連付けられた Context を変更するために setContext() を呼び出すことは禁止されています。 diff --git a/java/org/apache/catalina/session/LocalStrings_ko.properties b/java/org/apache/catalina/session/LocalStrings_ko.properties index e8057d5..2d0bacc 100644 --- a/java/org/apache/catalina/session/LocalStrings_ko.properties +++ b/java/org/apache/catalina/session/LocalStrings_ko.properties @@ -36,6 +36,7 @@ fileStore.saving=세션 [{0}]을(를) 파일 [{1}]에 저장합니다. managerBase.createSession.ise=createSession: 활성화된 세션이 너무 많습니다. managerBase.sessionAttributeNameFilter=이름 필터 [{1}]와(과) 부합되지 않기 때문에, [{0}](이)라는 이름의 세션 속성을 건너뛰었습니다. managerBase.sessionAttributeValueClassNameFilter=값의 타입 [{1}]이(가) 필터 [{2}]와(과) 부합하지 않기 때문에, [{0}](이)라는 이름의 세션 속성을 건너뛰었습니다. +managerBase.sessionNotFound=세션 [{0}]을(를) 찾을 수 없었습니다. managerBase.sessionTimeout=유효하지 않은, 세션 제한 시간 초과 설정입니다: [{0}] managerBase.setContextNotNew=만일 매니저가 NEW 상태에 있지 않다면, 매니저와 연관된 컨텍스트를 변경하기 위해 setContext()를 호출하는 것은 불허됩니다. diff --git a/java/org/apache/catalina/session/LocalStrings_zh_CN.properties b/java/org/apache/catalina/session/LocalStrings_zh_CN.properties index 30cda59..1b05442 100644 --- a/java/org/apache/catalina/session/LocalStrings_zh_CN.properties +++ b/java/org/apache/catalina/session/LocalStrings_zh_CN.properties @@ -26,6 +26,7 @@ fileStore.deleteFailed=无法删除阻止创建会话存储位置的文件 [{0}] fileStore.deleteSessionFailed=无法删除不再需要的文件[{0}] managerBase.createSession.ise=createSession:活跃session过多 +managerBase.sessionNotFound=找不到会话 [{0}] managerBase.setContextNotNew=如果Manager未处于NEW状态,则调用setContext()以更改与Manager关联的Context是非法的 persistentManager.deserializeError=错误反序列化会话[{0}]: [{1}] diff --git a/java/org/apache/catalina/session/ManagerBase.java b/java/org/apache/catalina/session/ManagerBase.java index bcb94bf..e4121a6 100644 --- a/java/org/apache/catalina/session/ManagerBase.java +++ b/java/org/apache/catalina/session/ManagerBase.java @@ -14,20 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.catalina.session; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Date; import java.util.Deque; import java.util.Enumeration; import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -80,7 +78,7 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager * session controlled by this Manager must be Serializable. * * @deprecated Ignored. {@link Context#getDistributable()} always takes - * precedence. Will be removed in Tomcat 9.0.x. + * precedence. Will be removed in Tomcat 8.5.x. */ @Deprecated protected boolean distributable; @@ -103,7 +101,7 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager * this Manager. * * @deprecated Ignored. {@link Context#getSessionTimeout()} always takes - * precedence. Will be removed in Tomcat 9.0.x. + * precedence. Will be removed in Tomcat 8.5.x. */ @Deprecated protected int maxInactiveInterval = 30 * 60; @@ -278,6 +276,13 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager } + /** + * Provides {@link #getSessionAttributeNameFilter()} as a pre-compiled + * regular expression pattern. + * + * @return The pre-compiled pattern used to filter session attributes based + * on attribute name. {@code null} means no filter is applied. + */ protected Pattern getSessionAttributeNamePattern() { return sessionAttributeNamePattern; } @@ -487,12 +492,20 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager return sessionIdGenerator; } else if (sessionIdGeneratorClass != null) { try { - sessionIdGenerator = sessionIdGeneratorClass.newInstance(); + sessionIdGenerator = sessionIdGeneratorClass.getConstructor().newInstance(); return sessionIdGenerator; } catch(IllegalAccessException ex) { // Ignore } catch(InstantiationException ex) { // Ignore + } catch (IllegalArgumentException e) { + // Ignore + } catch (SecurityException e) { + // Ignore + } catch (InvocationTargetException e) { + // Ignore + } catch (NoSuchMethodException e) { + // Ignore } } return null; @@ -509,18 +522,14 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager * @return The descriptive short name of this Manager implementation. */ public String getName() { - - return (name); - + return name; } /** * @return The secure random number generator class name. */ public String getSecureRandomClass() { - - return (this.secureRandomClass); - + return this.secureRandomClass; } @@ -608,9 +617,7 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager * @return The frequency of manager checks. */ public int getProcessExpiresFrequency() { - - return (this.processExpiresFrequency); - + return this.processExpiresFrequency; } /** @@ -782,14 +789,13 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager sessionCreationTiming.add(timing); sessionCreationTiming.poll(); } - return (session); - + return session; } @Override public Session createEmptySession() { - return (getNewSession()); + return getNewSession(); } @@ -905,6 +911,7 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager /** * Get new session class to be used in the doLoad() method. + * @return a new session for use with this manager */ protected StandardSession getNewSession() { return new StandardSession(this); @@ -913,6 +920,7 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager /** * Generate and return a new session identifier. + * @return a new session id */ protected String generateSessionId() { @@ -1019,9 +1027,7 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager * limit. */ public int getMaxActiveSessions() { - - return (this.maxActiveSessions); - + return this.maxActiveSessions; } @@ -1090,11 +1096,9 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager // Init int counter = 0; int result = 0; - Iterator<SessionTiming> iter = copy.iterator(); // Calculate average - while (iter.hasNext()) { - SessionTiming timing = iter.next(); + for (SessionTiming timing : copy) { if (timing != null) { int timeAlive = timing.getDuration(); counter++; @@ -1114,37 +1118,13 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager */ @Override public int getSessionCreateRate() { - long now = System.currentTimeMillis(); // Copy current stats List<SessionTiming> copy = new ArrayList<SessionTiming>(); synchronized (sessionCreationTiming) { copy.addAll(sessionCreationTiming); } - // Init - long oldest = now; - int counter = 0; - int result = 0; - Iterator<SessionTiming> iter = copy.iterator(); - - // Calculate rate - while (iter.hasNext()) { - SessionTiming timing = iter.next(); - if (timing != null) { - counter++; - if (timing.getTimestamp() < oldest) { - oldest = timing.getTimestamp(); - } - } - } - if (counter > 0) { - if (oldest < now) { - result = (1000*60*counter)/(int) (now - oldest); - } else { - result = Integer.MAX_VALUE; - } - } - return result; + return calculateRate(copy); } @@ -1158,22 +1138,25 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager */ @Override public int getSessionExpireRate() { - long now = System.currentTimeMillis(); // Copy current stats List<SessionTiming> copy = new ArrayList<SessionTiming>(); synchronized (sessionExpirationTiming) { copy.addAll(sessionExpirationTiming); } + return calculateRate(copy); + } + + + private static int calculateRate(List<SessionTiming> sessionTiming) { // Init + long now = System.currentTimeMillis(); long oldest = now; int counter = 0; int result = 0; - Iterator<SessionTiming> iter = copy.iterator(); // Calculate rate - while (iter.hasNext()) { - SessionTiming timing = iter.next(); + for (SessionTiming timing : sessionTiming) { if (timing != null) { counter++; if (timing.getTimestamp() < oldest) { @@ -1200,9 +1183,8 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager */ public String listSessionIds() { StringBuilder sb = new StringBuilder(); - Iterator<String> keys = sessions.keySet().iterator(); - while (keys.hasNext()) { - sb.append(keys.next()).append(" "); + for (String s : sessions.keySet()) { + sb.append(s).append(" "); } return sb.toString(); } @@ -1219,9 +1201,10 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager */ public String getSessionAttribute( String sessionId, String key ) { Session s = sessions.get(sessionId); - if( s==null ) { - if(log.isInfoEnabled()) - log.info("Session not found " + sessionId); + if (s == null) { + if (log.isInfoEnabled()) { + log.info(sm.getString("managerBase.sessionNotFound", sessionId)); + } return null; } Object o=s.getSession().getAttribute(key); @@ -1246,7 +1229,7 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager Session s = sessions.get(sessionId); if (s == null) { if (log.isInfoEnabled()) { - log.info("Session not found " + sessionId); + log.info(sm.getString("managerBase.sessionNotFound", sessionId)); } return null; } @@ -1267,63 +1250,79 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager public void expireSession( String sessionId ) { - Session s=sessions.get(sessionId); - if( s==null ) { - if(log.isInfoEnabled()) - log.info("Session not found " + sessionId); + Session s = sessions.get(sessionId); + if (s == null) { + if (log.isInfoEnabled()) { + log.info(sm.getString("managerBase.sessionNotFound", sessionId)); + } return; } s.expire(); } public long getThisAccessedTimestamp( String sessionId ) { - Session s=sessions.get(sessionId); - if(s== null) - return -1 ; + Session s = sessions.get(sessionId); + if (s == null) { + if (log.isInfoEnabled()) { + log.info(sm.getString("managerBase.sessionNotFound", sessionId)); + } + return -1; + } return s.getThisAccessedTime(); } public String getThisAccessedTime( String sessionId ) { - Session s=sessions.get(sessionId); - if( s==null ) { - if(log.isInfoEnabled()) - log.info("Session not found " + sessionId); + Session s = sessions.get(sessionId); + if (s == null) { + if (log.isInfoEnabled()) { + log.info(sm.getString("managerBase.sessionNotFound", sessionId)); + } return ""; } return new Date(s.getThisAccessedTime()).toString(); } public long getLastAccessedTimestamp( String sessionId ) { - Session s=sessions.get(sessionId); - if(s== null) - return -1 ; + Session s = sessions.get(sessionId); + if (s == null) { + if (log.isInfoEnabled()) { + log.info(sm.getString("managerBase.sessionNotFound", sessionId)); + } + return -1; + } return s.getLastAccessedTime(); } public String getLastAccessedTime( String sessionId ) { - Session s=sessions.get(sessionId); - if( s==null ) { - if(log.isInfoEnabled()) - log.info("Session not found " + sessionId); + Session s = sessions.get(sessionId); + if (s == null) { + if (log.isInfoEnabled()) { + log.info(sm.getString("managerBase.sessionNotFound", sessionId)); + } return ""; } return new Date(s.getLastAccessedTime()).toString(); } public String getCreationTime( String sessionId ) { - Session s=sessions.get(sessionId); - if( s==null ) { - if(log.isInfoEnabled()) - log.info("Session not found " + sessionId); + Session s = sessions.get(sessionId); + if (s == null) { + if (log.isInfoEnabled()) { + log.info(sm.getString("managerBase.sessionNotFound", sessionId)); + } return ""; } return new Date(s.getCreationTime()).toString(); } public long getCreationTimestamp( String sessionId ) { - Session s=sessions.get(sessionId); - if(s== null) - return -1 ; + Session s = sessions.get(sessionId); + if (s == null) { + if (log.isInfoEnabled()) { + log.info(sm.getString("managerBase.sessionNotFound", sessionId)); + } + return -1; + } return s.getCreationTime(); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org