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

commit 886c988a25872eec14766e89e0a9a19f309381bb
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Mon Jan 15 13:33:59 2024 +0000

    Align with 9.0.x onwards
---
 .../apache/catalina/ssi/ExpressionParseTree.java   |  8 ++--
 .../apache/catalina/ssi/LocalStrings.properties    | 46 ++++++++++++++++++++++
 .../apache/catalina/ssi/LocalStrings_fr.properties | 46 ++++++++++++++++++++++
 .../apache/catalina/ssi/LocalStrings_ja.properties | 46 ++++++++++++++++++++++
 .../apache/catalina/ssi/LocalStrings_ko.properties | 46 ++++++++++++++++++++++
 .../catalina/ssi/LocalStrings_zh_CN.properties     | 46 ++++++++++++++++++++++
 .../catalina/ssi/ResponseIncludeWrapper.java       |  6 +--
 java/org/apache/catalina/ssi/SSIConfig.java        |  6 ++-
 java/org/apache/catalina/ssi/SSIEcho.java          |  9 +++--
 java/org/apache/catalina/ssi/SSIExec.java          |  8 ++--
 java/org/apache/catalina/ssi/SSIFilter.java        |  2 +-
 java/org/apache/catalina/ssi/SSIFlastmod.java      |  9 +++--
 java/org/apache/catalina/ssi/SSIFsize.java         | 11 ++++--
 java/org/apache/catalina/ssi/SSIInclude.java       | 10 +++--
 java/org/apache/catalina/ssi/SSIMediator.java      | 19 ++++-----
 java/org/apache/catalina/ssi/SSIServlet.java       |  2 -
 .../catalina/ssi/SSIServletExternalResolver.java   | 24 +++++------
 java/org/apache/catalina/ssi/SSISet.java           | 10 +++--
 18 files changed, 303 insertions(+), 51 deletions(-)

diff --git a/java/org/apache/catalina/ssi/ExpressionParseTree.java 
b/java/org/apache/catalina/ssi/ExpressionParseTree.java
index c79623814a..1199f6b1f7 100644
--- a/java/org/apache/catalina/ssi/ExpressionParseTree.java
+++ b/java/org/apache/catalina/ssi/ExpressionParseTree.java
@@ -24,6 +24,7 @@ import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
 import org.apache.tomcat.util.ExceptionUtils;
+import org.apache.tomcat.util.res.StringManager;
 
 /**
  * Represents a parsed expression.
@@ -31,6 +32,7 @@ import org.apache.tomcat.util.ExceptionUtils;
  * @author Paul Speed
  */
 public class ExpressionParseTree {
+    private static final StringManager sm = 
StringManager.getManager(ExpressionParseTree.class);
     /**
      * Contains the current set of completed nodes. This is a workspace for 
the parser. Needs to be LinkedList since it
      * can contain {@code null}s.
@@ -214,13 +216,13 @@ public class ExpressionParseTree {
         // Finish off the rest of the opps
         resolveGroup();
         if (nodeStack.size() == 0) {
-            throw new ParseException("No nodes created.", et.getIndex());
+            throw new 
ParseException(sm.getString("expressionParseTree.noNodes"), et.getIndex());
         }
         if (nodeStack.size() > 1) {
-            throw new ParseException("Extra nodes created.", et.getIndex());
+            throw new 
ParseException(sm.getString("expressionParseTree.extraNodes"), et.getIndex());
         }
         if (oppStack.size() != 0) {
-            throw new ParseException("Unused opp nodes exist.", et.getIndex());
+            throw new 
ParseException(sm.getString("expressionParseTree.unusedOpCodes"), 
et.getIndex());
         }
         root = nodeStack.get(0);
     }
diff --git a/java/org/apache/catalina/ssi/LocalStrings.properties 
b/java/org/apache/catalina/ssi/LocalStrings.properties
new file mode 100644
index 0000000000..68736ee66d
--- /dev/null
+++ b/java/org/apache/catalina/ssi/LocalStrings.properties
@@ -0,0 +1,46 @@
+# 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.
+
+expressionParseTree.extraNodes=Extra nodes created
+expressionParseTree.invalidExpression=Invalid expression [{0}]
+expressionParseTree.noNodes=No nodes created
+expressionParseTree.unusedOpCodes=Unused nodes exist
+
+ssiCommand.invalidAttribute=Invalid attribute [{0}]
+
+ssiEcho.invalidEncoding=Invalid encoding [{0}]
+
+ssiExec.executeFailed=Cannot execute file [{0}]
+
+ssiFlastmod.noLastModified=Cannot get last modification date for file [{0}]
+
+ssiFsize.invalidNumChars=The number of characters cannot be negative
+ssiFsize.noSize=Cannot get size for file [{0}]
+
+ssiInclude.includeFailed=Cannot include file [{0}]
+
+ssiMediator.unknownEncoding=Unknown encoding [{0}]
+
+ssiServletExternalResolver.absoluteNonVirtualPath=Non virtual [{0}] path 
cannot be absolute
+ssiServletExternalResolver.noContext=No context for path normalized to [{0}]
+ssiServletExternalResolver.noFile=File [{0}] not found
+ssiServletExternalResolver.noIncludeFile=Include file [{0}] not found
+ssiServletExternalResolver.noResource=Context did not contain resource [{0}]
+ssiServletExternalResolver.normalizationError=Normalization returned null for 
path [{0}]
+ssiServletExternalResolver.pathTraversalNonVirtualPath=Non virtual path [{0}] 
cannot contain path traversal sequences
+ssiServletExternalResolver.removeFilenameError=Cannot remove filename from 
path [{0}]
+ssiServletExternalResolver.requestDispatcherError=Cannot get request 
dispatcher for path [{0}]
+
+ssiSet.noVariable=No variable specified
diff --git a/java/org/apache/catalina/ssi/LocalStrings_fr.properties 
b/java/org/apache/catalina/ssi/LocalStrings_fr.properties
new file mode 100644
index 0000000000..b85636645c
--- /dev/null
+++ b/java/org/apache/catalina/ssi/LocalStrings_fr.properties
@@ -0,0 +1,46 @@
+# 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.
+
+expressionParseTree.extraNodes=Des nœuds supplémentaires ont été crées
+expressionParseTree.invalidExpression=L''expression [{0}] est invalide
+expressionParseTree.noNodes=Aucun nœud n'a été crée
+expressionParseTree.unusedOpCodes=Il y a des nœuds non utilisés
+
+ssiCommand.invalidAttribute=L''attribut [{0}] est invalide
+
+ssiEcho.invalidEncoding=L''encodage [{0}] est invalide
+
+ssiExec.executeFailed=Impossible d''exécuter le fichier [{0}]
+
+ssiFlastmod.noLastModified=Impossible d''obtenir la date de dernière 
modification du fichier [{0}]
+
+ssiFsize.invalidNumChars=Le nombre de caractères ne peut être négatif
+ssiFsize.noSize=Impossible d''obtenir la taille du fichier [{0}]
+
+ssiInclude.includeFailed=Impossible d''inclure le fichier [{0}]
+
+ssiMediator.unknownEncoding=L''encodage [{0}] est inconnu
+
+ssiServletExternalResolver.absoluteNonVirtualPath=Le chemin non virtuel [{0}] 
ne peut être absolu
+ssiServletExternalResolver.noContext=Pas de contexte dans chemin normalisé en 
[{0}]
+ssiServletExternalResolver.noFile=Le fichier [{0}] n''a pas été trouvé
+ssiServletExternalResolver.noIncludeFile=Le fichier inclus [{0}] n''a pas été 
trouvé
+ssiServletExternalResolver.noResource=Le contexte ne contenait pas la 
ressource [{0}]
+ssiServletExternalResolver.normalizationError=La normalisation du chemin [{0}] 
a retourné null
+ssiServletExternalResolver.pathTraversalNonVirtualPath=Le chemin non virtuel 
[{0}] ne peut contenir des séquences de navigation dans le chemin
+ssiServletExternalResolver.removeFilenameError=Impossible de supprimer le nom 
de fichier du chemin [{0}]
+ssiServletExternalResolver.requestDispatcherError=Impossible d''obtenir le 
dispatcher de requêtes pour le chemin [{0}]
+
+ssiSet.noVariable=Une variable n'a pas été spécifiée
diff --git a/java/org/apache/catalina/ssi/LocalStrings_ja.properties 
b/java/org/apache/catalina/ssi/LocalStrings_ja.properties
new file mode 100644
index 0000000000..c445dbf419
--- /dev/null
+++ b/java/org/apache/catalina/ssi/LocalStrings_ja.properties
@@ -0,0 +1,46 @@
+# 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.
+
+expressionParseTree.extraNodes=余分なノードが作成されました
+expressionParseTree.invalidExpression=無効な式[{0}]
+expressionParseTree.noNodes=ノードが作成されませんでした
+expressionParseTree.unusedOpCodes=未使用のノードが存在します
+
+ssiCommand.invalidAttribute=無効な属性[{0}]
+
+ssiEcho.invalidEncoding=無効なエンコード [{0}]
+
+ssiExec.executeFailed=ファイル[{0}]を実行できません
+
+ssiFlastmod.noLastModified=ファイル[{0}]の最終変更日を取得できません
+
+ssiFsize.invalidNumChars=文字数は負数にすることはできません
+ssiFsize.noSize=ファイル[{0}]のサイズを取得できません
+
+ssiInclude.includeFailed=ファイル[{0}]を含めることができません
+
+ssiMediator.unknownEncoding=不明なエンコード [{0}]
+
+ssiServletExternalResolver.absoluteNonVirtualPath=非仮想[{0}]パスを絶対パスにすることはできません。
+ssiServletExternalResolver.noContext=[{0}]に正規化されたパスのコンテキストがありません。
+ssiServletExternalResolver.noFile=ファイル[{0}]が見つかりません
+ssiServletExternalResolver.noIncludeFile=インクルードファイル[{0}]が見つかりません
+ssiServletExternalResolver.noResource=コンテキストにリソース [{0}] が含まれていません
+ssiServletExternalResolver.normalizationError=パス [{0}] の正規化によってNULLが返されました
+ssiServletExternalResolver.pathTraversalNonVirtualPath=非仮想パス [{0}] 
にはパストラバーサルシーケンスを含めることはできません
+ssiServletExternalResolver.removeFilenameError=パス [{0}] のファイル名を削除できません
+ssiServletExternalResolver.requestDispatcherError=パス [{0}] 
のリクエストディスパッチャを取得できません
+
+ssiSet.noVariable=変数が指定されていません
diff --git a/java/org/apache/catalina/ssi/LocalStrings_ko.properties 
b/java/org/apache/catalina/ssi/LocalStrings_ko.properties
new file mode 100644
index 0000000000..e6da65c8be
--- /dev/null
+++ b/java/org/apache/catalina/ssi/LocalStrings_ko.properties
@@ -0,0 +1,46 @@
+# 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.
+
+expressionParseTree.extraNodes=파싱 처리 중 생성된 노드들의 여분이 처리되지 않고 남아있습니다.
+expressionParseTree.invalidExpression=유효하지 않은 표현식 [{0}]
+expressionParseTree.noNodes=파싱 처리 중 어떤 노드도 생성되지 않았습니다.
+expressionParseTree.unusedOpCodes=파싱 처리 중 사용되지 않은 노드들이 존재합니다.
+
+ssiCommand.invalidAttribute=유효하지 않은 속성 [{0}]
+
+ssiEcho.invalidEncoding=유효하지 않은 인코딩 [{0}]
+
+ssiExec.executeFailed=파일 [{0}]을(를) 실행할 수 없습니다.
+
+ssiFlastmod.noLastModified=파일 [{0}]의 최종 변경 일자를 구할 수 없습니다.
+
+ssiFsize.invalidNumChars=문자들의 개수가 음수일 수는 없습니다.
+ssiFsize.noSize=파일 [{0}]의 크기를 구할 수 없습니다.
+
+ssiInclude.includeFailed=파일 [{0}]을(를) include할 수 없습니다.
+
+ssiMediator.unknownEncoding=알 수 없는 인코딩 [{0}]
+
+ssiServletExternalResolver.absoluteNonVirtualPath=비가상경로 [{0}]은(는) 절대 경로이어서는 
안됩니다.
+ssiServletExternalResolver.noContext=[{0}](으)로 정규화된 경로를 위한 컨텍스트가 없습니다.
+ssiServletExternalResolver.noFile=파일 [{0}]을(를) 찾을 수 없습니다.
+ssiServletExternalResolver.noIncludeFile=Include할 파일 [{0}]을(를) 찾을 수 없습니다.
+ssiServletExternalResolver.noResource=컨텍스트가 리소스 [{0}]을(를) 포함하지 않았습니다.
+ssiServletExternalResolver.normalizationError=경로 [{0}]을(를) 위한 정규화가 널을 반환했습니다.
+ssiServletExternalResolver.pathTraversalNonVirtualPath=비가상경로 [{0}]은(는), 디렉토리를 
이동하는 문자열 시퀀스를 포함해서는 안됩니다.
+ssiServletExternalResolver.removeFilenameError=경로 [{0}](으)로부터, 파일 이름을 제외한 나머지 
경로를 구할 수 없습니다.
+ssiServletExternalResolver.requestDispatcherError=경로 [{0}]을(를) 위한 요청 디스패처를 얻을 
수 없습니다.
+
+ssiSet.noVariable=변수 이름이 지정되지 않았습니다.
diff --git a/java/org/apache/catalina/ssi/LocalStrings_zh_CN.properties 
b/java/org/apache/catalina/ssi/LocalStrings_zh_CN.properties
new file mode 100644
index 0000000000..69617f18e4
--- /dev/null
+++ b/java/org/apache/catalina/ssi/LocalStrings_zh_CN.properties
@@ -0,0 +1,46 @@
+# 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.
+
+expressionParseTree.extraNodes=创建额外节点
+expressionParseTree.invalidExpression=无效表达式[{0}]
+expressionParseTree.noNodes=未创建节点
+expressionParseTree.unusedOpCodes=存在未使用的节点
+
+ssiCommand.invalidAttribute=无效属性[{0}]
+
+ssiEcho.invalidEncoding=无效编码[{0}]
+
+ssiExec.executeFailed=无法执行文件[{0}]
+
+ssiFlastmod.noLastModified=无法获取文件[{0}]的最后修改日期
+
+ssiFsize.invalidNumChars=字符数不能为负
+ssiFsize.noSize=无法获取文件[{0}]的大小
+
+ssiInclude.includeFailed=不能包含文件[{0}]
+
+ssiMediator.unknownEncoding=未知编码[{0}]
+
+ssiServletExternalResolver.absoluteNonVirtualPath=非虚[{0}]路径不能是绝对路径
+ssiServletExternalResolver.noContext=没有将路径规范化为[{0}]的上下文
+ssiServletExternalResolver.noFile=找不到文件[{0}]
+ssiServletExternalResolver.noIncludeFile=未找到包含文件[{0}]
+ssiServletExternalResolver.noResource=上下文不包含资源[{0}]
+ssiServletExternalResolver.normalizationError=规范化为路径[{0}]返回了空值
+ssiServletExternalResolver.pathTraversalNonVirtualPath=非虚拟路径[{0}]不能包含路径遍历序列
+ssiServletExternalResolver.removeFilenameError=无法从路径[{0}]中删除文件名
+ssiServletExternalResolver.requestDispatcherError=无法获取路径[{0}]的请求调度程序
+
+ssiSet.noVariable=未指定变量
diff --git a/java/org/apache/catalina/ssi/ResponseIncludeWrapper.java 
b/java/org/apache/catalina/ssi/ResponseIncludeWrapper.java
index 9b2faa4835..3410a82c7a 100644
--- a/java/org/apache/catalina/ssi/ResponseIncludeWrapper.java
+++ b/java/org/apache/catalina/ssi/ResponseIncludeWrapper.java
@@ -87,7 +87,7 @@ public class ResponseIncludeWrapper extends 
HttpServletResponseWrapper {
 
 
     /**
-     * Return a printwriter, throws and exception if a OutputStream already 
been returned.
+     * Return a printwriter, throws and exception if an OutputStream already 
been returned.
      *
      * @return a PrintWriter object
      *
@@ -108,9 +108,9 @@ public class ResponseIncludeWrapper extends 
HttpServletResponseWrapper {
 
 
     /**
-     * Return a OutputStream, throws and exception if a printwriter already 
been returned.
+     * Return an OutputStream, throws and exception if a printwriter already 
been returned.
      *
-     * @return a OutputStream object
+     * @return an OutputStream object
      *
      * @exception java.io.IOException if the printwriter already been called
      */
diff --git a/java/org/apache/catalina/ssi/SSIConfig.java 
b/java/org/apache/catalina/ssi/SSIConfig.java
index 874c8e762c..e0331551bb 100644
--- a/java/org/apache/catalina/ssi/SSIConfig.java
+++ b/java/org/apache/catalina/ssi/SSIConfig.java
@@ -19,6 +19,8 @@ package org.apache.catalina.ssi;
 
 import java.io.PrintWriter;
 
+import org.apache.tomcat.util.res.StringManager;
+
 /**
  * Implements the Server-side #exec command
  *
@@ -28,6 +30,8 @@ import java.io.PrintWriter;
  * @author David Becker
  */
 public final class SSIConfig implements SSICommand {
+    private static final StringManager sm = 
StringManager.getManager(SSIConfig.class);
+
     /**
      * @see SSICommand
      */
@@ -45,7 +49,7 @@ public final class SSIConfig implements SSICommand {
             } else if (paramName.equalsIgnoreCase("timefmt")) {
                 ssiMediator.setConfigTimeFmt(substitutedValue);
             } else {
-                ssiMediator.log("#config--Invalid attribute: " + paramName);
+                ssiMediator.log(sm.getString("ssiCommand.invalidAttribute", 
paramName));
                 // We need to fetch this value each time, since it may change 
during the loop
                 String configErrMsg = ssiMediator.getConfigErrMsg();
                 writer.write(configErrMsg);
diff --git a/java/org/apache/catalina/ssi/SSIEcho.java 
b/java/org/apache/catalina/ssi/SSIEcho.java
index 14ebaef767..d4f762ac29 100644
--- a/java/org/apache/catalina/ssi/SSIEcho.java
+++ b/java/org/apache/catalina/ssi/SSIEcho.java
@@ -19,6 +19,8 @@ package org.apache.catalina.ssi;
 
 import java.io.PrintWriter;
 
+import org.apache.tomcat.util.res.StringManager;
+
 /**
  * Return the result associated with the supplied Server Variable.
  *
@@ -28,6 +30,7 @@ import java.io.PrintWriter;
  * @author David Becker
  */
 public class SSIEcho implements SSICommand {
+    private static final StringManager sm = 
StringManager.getManager(SSIEcho.class);
     protected static final String DEFAULT_ENCODING = 
SSIMediator.ENCODING_ENTITY;
     protected static final String MISSING_VARIABLE_VALUE = "(none)";
 
@@ -50,11 +53,11 @@ public class SSIEcho implements SSICommand {
                 if (isValidEncoding(paramValue)) {
                     encoding = paramValue;
                 } else {
-                    ssiMediator.log("#echo--Invalid encoding: " + paramValue);
+                    ssiMediator.log(sm.getString("ssiEcho.invalidEncoding", 
paramValue));
                     writer.write(ssiMediator.encode(errorMessage, 
SSIMediator.ENCODING_ENTITY));
                 }
             } else {
-                ssiMediator.log("#echo--Invalid attribute: " + paramName);
+                ssiMediator.log(sm.getString("ssiCommand.invalidAttribute", 
paramName));
                 writer.write(ssiMediator.encode(errorMessage, 
SSIMediator.ENCODING_ENTITY));
             }
         }
@@ -73,4 +76,4 @@ public class SSIEcho implements SSICommand {
                 encoding.equalsIgnoreCase(SSIMediator.ENCODING_ENTITY) ||
                 encoding.equalsIgnoreCase(SSIMediator.ENCODING_NONE);
     }
-}
\ No newline at end of file
+}
diff --git a/java/org/apache/catalina/ssi/SSIExec.java 
b/java/org/apache/catalina/ssi/SSIExec.java
index 80d8d2a6c6..6c597d1c51 100644
--- a/java/org/apache/catalina/ssi/SSIExec.java
+++ b/java/org/apache/catalina/ssi/SSIExec.java
@@ -22,6 +22,7 @@ import java.io.InputStreamReader;
 import java.io.PrintWriter;
 
 import org.apache.catalina.util.IOTools;
+import org.apache.tomcat.util.res.StringManager;
 
 /**
  * Implements the Server-side #exec command
@@ -33,6 +34,7 @@ import org.apache.catalina.util.IOTools;
  * @author David Becker
  */
 public class SSIExec implements SSICommand {
+    private static final StringManager sm = 
StringManager.getManager(SSIExec.class);
     protected final SSIInclude ssiInclude = new SSIInclude();
     protected static final int BUFFER_SIZE = 1024;
 
@@ -67,14 +69,14 @@ public class SSIExec implements SSICommand {
                 proc.waitFor();
                 lastModified = System.currentTimeMillis();
             } catch (InterruptedException e) {
-                ssiMediator.log("Couldn't exec file: " + substitutedValue, e);
+                ssiMediator.log(sm.getString("ssiExec.executeFailed", 
substitutedValue), e);
                 writer.write(configErrMsg);
             } catch (IOException e) {
                 if (!foundProgram) {
-                    // apache doesn't output an error message if it can't find
+                    // Apache doesn't output an error message if it can't find
                     // a program
                 }
-                ssiMediator.log("Couldn't exec file: " + substitutedValue, e);
+                ssiMediator.log(sm.getString("ssiExec.executeFailed", 
substitutedValue), e);
             }
         }
         return lastModified;
diff --git a/java/org/apache/catalina/ssi/SSIFilter.java 
b/java/org/apache/catalina/ssi/SSIFilter.java
index 40141c9baf..2b47267ddc 100644
--- a/java/org/apache/catalina/ssi/SSIFilter.java
+++ b/java/org/apache/catalina/ssi/SSIFilter.java
@@ -140,7 +140,7 @@ public class SSIFilter implements Filter {
 
             Matcher shtmlMatcher = 
shtmlRegEx.matcher(responseIncludeWrapper.getContentType());
             if (shtmlMatcher.matches()) {
-                // Convert shtml mime type to ordinary html mime type but 
preserve
+                // Convert SHTML mime type to ordinary HTML mime type but 
preserve
                 // encoding, if any.
                 String enc = shtmlMatcher.group(1);
                 res.setContentType("text/html" + ((enc != null) ? enc : ""));
diff --git a/java/org/apache/catalina/ssi/SSIFlastmod.java 
b/java/org/apache/catalina/ssi/SSIFlastmod.java
index 5d37899608..8947972912 100644
--- a/java/org/apache/catalina/ssi/SSIFlastmod.java
+++ b/java/org/apache/catalina/ssi/SSIFlastmod.java
@@ -22,6 +22,7 @@ import java.util.Date;
 import java.util.Locale;
 
 import org.apache.catalina.util.Strftime;
+import org.apache.tomcat.util.res.StringManager;
 
 /**
  * Implements the Server-side #flastmod command
@@ -32,6 +33,8 @@ import org.apache.catalina.util.Strftime;
  * @author David Becker
  */
 public final class SSIFlastmod implements SSICommand {
+    private static final StringManager sm = 
StringManager.getManager(SSIFlastmod.class);
+
     /**
      * @see SSICommand
      */
@@ -52,11 +55,11 @@ public final class SSIFlastmod implements SSICommand {
                     String configTimeFmt = ssiMediator.getConfigTimeFmt();
                     writer.write(formatDate(date, configTimeFmt));
                 } else {
-                    ssiMediator.log("#flastmod--Invalid attribute: " + 
paramName);
+                    
ssiMediator.log(sm.getString("ssiCommand.invalidAttribute", paramName));
                     writer.write(configErrMsg);
                 }
             } catch (IOException e) {
-                ssiMediator.log("#flastmod--Couldn't get last modified for 
file: " + substitutedValue, e);
+                ssiMediator.log(sm.getString("ssiFlastmod.noLastModified", 
substitutedValue), e);
                 writer.write(configErrMsg);
             }
         }
@@ -68,4 +71,4 @@ public final class SSIFlastmod implements SSICommand {
         Strftime strftime = new Strftime(configTimeFmt, Locale.US);
         return strftime.format(date);
     }
-}
\ No newline at end of file
+}
diff --git a/java/org/apache/catalina/ssi/SSIFsize.java 
b/java/org/apache/catalina/ssi/SSIFsize.java
index 6c5042f8ef..adf8dde9ab 100644
--- a/java/org/apache/catalina/ssi/SSIFsize.java
+++ b/java/org/apache/catalina/ssi/SSIFsize.java
@@ -21,6 +21,8 @@ import java.io.IOException;
 import java.io.PrintWriter;
 import java.text.DecimalFormat;
 
+import org.apache.tomcat.util.res.StringManager;
+
 /**
  * Implements the Server-side #fsize command
  *
@@ -30,6 +32,7 @@ import java.text.DecimalFormat;
  * @author David Becker
  */
 public final class SSIFsize implements SSICommand {
+    private static final StringManager sm = 
StringManager.getManager(SSIFsize.class);
     static final int ONE_KIBIBYTE = 1024;
     static final int ONE_MEBIBYTE = 1024 * 1024;
 
@@ -54,11 +57,11 @@ public final class SSIFsize implements SSICommand {
                     String configSizeFmt = ssiMediator.getConfigSizeFmt();
                     writer.write(formatSize(size, configSizeFmt));
                 } else {
-                    ssiMediator.log("#fsize--Invalid attribute: " + paramName);
+                    
ssiMediator.log(sm.getString("ssiCommand.invalidAttribute", paramName));
                     writer.write(configErrMsg);
                 }
             } catch (IOException e) {
-                ssiMediator.log("#fsize--Couldn't get size for file: " + 
substitutedValue, e);
+                ssiMediator.log(sm.getString("ssiFsize.noSize", 
substitutedValue), e);
                 writer.write(configErrMsg);
             }
         }
@@ -68,7 +71,7 @@ public final class SSIFsize implements SSICommand {
 
     public String repeat(char aChar, int numChars) {
         if (numChars < 0) {
-            throw new IllegalArgumentException("Num chars can't be negative");
+            throw new 
IllegalArgumentException(sm.getString("ssiFsize.invalidNumChars"));
         }
         StringBuilder buf = new StringBuilder();
         for (int i = 0; i < numChars; i++) {
@@ -117,4 +120,4 @@ public final class SSIFsize implements SSICommand {
         }
         return retString;
     }
-}
\ No newline at end of file
+}
diff --git a/java/org/apache/catalina/ssi/SSIInclude.java 
b/java/org/apache/catalina/ssi/SSIInclude.java
index b48fb25f46..c1d5fad3f4 100644
--- a/java/org/apache/catalina/ssi/SSIInclude.java
+++ b/java/org/apache/catalina/ssi/SSIInclude.java
@@ -20,6 +20,8 @@ package org.apache.catalina.ssi;
 import java.io.IOException;
 import java.io.PrintWriter;
 
+import org.apache.tomcat.util.res.StringManager;
+
 /**
  * Implements the Server-side #include command
  *
@@ -29,6 +31,8 @@ import java.io.PrintWriter;
  * @author David Becker
  */
 public final class SSIInclude implements SSICommand {
+    private static final StringManager sm = 
StringManager.getManager(SSIInclude.class);
+
     /**
      * @see SSICommand
      */
@@ -48,14 +52,14 @@ public final class SSIInclude implements SSICommand {
                     String text = ssiMediator.getFileText(substitutedValue, 
virtual);
                     writer.write(text);
                 } else {
-                    ssiMediator.log("#include--Invalid attribute: " + 
paramName);
+                    
ssiMediator.log(sm.getString("ssiCommand.invalidAttribute", paramName));
                     writer.write(configErrMsg);
                 }
             } catch (IOException e) {
-                ssiMediator.log("#include--Couldn't include file: " + 
substitutedValue, e);
+                ssiMediator.log(sm.getString("ssiInclude.includeFailed", 
substitutedValue), e);
                 writer.write(configErrMsg);
             }
         }
         return lastModified;
     }
-}
\ No newline at end of file
+}
diff --git a/java/org/apache/catalina/ssi/SSIMediator.java 
b/java/org/apache/catalina/ssi/SSIMediator.java
index b6ef502fda..680b5669e4 100644
--- a/java/org/apache/catalina/ssi/SSIMediator.java
+++ b/java/org/apache/catalina/ssi/SSIMediator.java
@@ -28,6 +28,7 @@ import java.util.TimeZone;
 
 import org.apache.catalina.util.Strftime;
 import org.apache.catalina.util.URLEncoder;
+import org.apache.tomcat.util.res.StringManager;
 import org.apache.tomcat.util.security.Escape;
 
 /**
@@ -40,6 +41,8 @@ import org.apache.tomcat.util.security.Escape;
  * @author David Becker
  */
 public class SSIMediator {
+    private static final StringManager sm = 
StringManager.getManager(SSIMediator.class);
+
     protected static final String ENCODING_NONE = "none";
     protected static final String ENCODING_ENTITY = "entity";
     protected static final String ENCODING_URL = "url";
@@ -166,9 +169,7 @@ public class SSIMediator {
         String lowerCaseVariableName = 
variableName.toLowerCase(Locale.ENGLISH);
         String variableValue = null;
         if (!isNameReserved(lowerCaseVariableName)) {
-            // Try getting it externally first, if it fails, try getting the
-            // 'built-in'
-            // value
+            // Try getting it externally first, if it fails, try getting the 
'built-in' value
             variableValue = ssiExternalResolver.getVariableValue(variableName);
             if (variableValue == null) {
                 variableName = variableName.toUpperCase(Locale.ENGLISH);
@@ -190,8 +191,7 @@ public class SSIMediator {
      * @return the value after variable substitution
      */
     public String substituteVariables(String val) {
-        // If it has no references or HTML entities then no work
-        // need to be done
+        // If it has no references or HTML entities then no work need to be 
done
         if (val.indexOf('$') < 0 && val.indexOf('&') < 0) {
             return val;
         }
@@ -262,8 +262,7 @@ public class SSIMediator {
             }
             // Replace the var name with its value
             sb.replace(start, end, value);
-            // Start searching for the next $ after the value
-            // that was just substituted.
+            // Start searching for the next $ after the value that was just 
substituted.
             i = start + value.length();
         }
         return sb.toString();
@@ -273,9 +272,7 @@ public class SSIMediator {
     protected String formatDate(Date date, TimeZone timeZone) {
         String retVal;
         if (timeZone != null) {
-            // we temporarily change strftime. Since SSIMediator is inherently
-            // single-threaded, this
-            // isn't a problem
+            // we temporarily change strftime. Since SSIMediator is inherently 
single-threaded, this isn't a problem
             TimeZone oldTimeZone = strftime.getTimeZone();
             strftime.setTimeZone(timeZone);
             retVal = strftime.format(date);
@@ -297,7 +294,7 @@ public class SSIMediator {
             retVal = Escape.htmlElementContent(value);
         } else {
             // This shouldn't be possible
-            throw new IllegalArgumentException("Unknown encoding: " + 
encoding);
+            throw new 
IllegalArgumentException(sm.getString("ssiMediator.unknownEncoding", encoding));
         }
         return retVal;
     }
diff --git a/java/org/apache/catalina/ssi/SSIServlet.java 
b/java/org/apache/catalina/ssi/SSIServlet.java
index e767b978b6..fabc3f9c45 100644
--- a/java/org/apache/catalina/ssi/SSIServlet.java
+++ b/java/org/apache/catalina/ssi/SSIServlet.java
@@ -152,13 +152,11 @@ public class SSIServlet extends HttpServlet {
         if (path == null || 
path.toUpperCase(Locale.ENGLISH).startsWith("/WEB-INF") ||
                 path.toUpperCase(Locale.ENGLISH).startsWith("/META-INF")) {
             res.sendError(HttpServletResponse.SC_NOT_FOUND);
-            log("Can't serve file: " + path);
             return;
         }
         URL resource = servletContext.getResource(path);
         if (resource == null) {
             res.sendError(HttpServletResponse.SC_NOT_FOUND);
-            log("Can't find file: " + path);
             return;
         }
         String resourceMimeType = servletContext.getMimeType(path);
diff --git a/java/org/apache/catalina/ssi/SSIServletExternalResolver.java 
b/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
index 1219713762..cbf2492490 100644
--- a/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
+++ b/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
@@ -39,6 +39,7 @@ import org.apache.coyote.Constants;
 import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.UDecoder;
 import org.apache.tomcat.util.http.RequestUtil;
+import org.apache.tomcat.util.res.StringManager;
 
 /**
  * An implementation of SSIExternalResolver that is used with servlets.
@@ -47,6 +48,7 @@ import org.apache.tomcat.util.http.RequestUtil;
  * @author David Becker
  */
 public class SSIServletExternalResolver implements SSIExternalResolver {
+    private static final StringManager sm = 
StringManager.getManager(SSIServletExternalResolver.class);
     protected final String VARIABLE_NAMES[] = { "AUTH_TYPE", "CONTENT_LENGTH", 
"CONTENT_TYPE", "DOCUMENT_NAME",
             "DOCUMENT_URI", "GATEWAY_INTERFACE", "HTTP_ACCEPT", 
"HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE",
             "HTTP_CONNECTION", "HTTP_HOST", "HTTP_REFERER", "HTTP_USER_AGENT", 
"PATH_INFO", "PATH_TRANSLATED",
@@ -363,12 +365,12 @@ public class SSIServletExternalResolver implements 
SSIExternalResolver {
         String pathWithoutContext = SSIServletRequestUtil.getRelativePath(req);
         String prefix = getPathWithoutFileName(pathWithoutContext);
         if (prefix == null) {
-            throw new IOException("Couldn't remove filename from path: " + 
pathWithoutContext);
+            throw new 
IOException(sm.getString("ssiServletExternalResolver.removeFilenameError", 
pathWithoutContext));
         }
         String fullPath = prefix + path;
         String retVal = RequestUtil.normalize(fullPath);
         if (retVal == null) {
-            throw new IOException("Normalization yielded null on path: " + 
fullPath);
+            throw new 
IOException(sm.getString("ssiServletExternalResolver.normalizationError", 
fullPath));
         }
         return retVal;
     }
@@ -377,10 +379,11 @@ public class SSIServletExternalResolver implements 
SSIExternalResolver {
     protected ServletContextAndPath 
getServletContextAndPathFromNonVirtualPath(String nonVirtualPath)
             throws IOException {
         if (nonVirtualPath.startsWith("/") || nonVirtualPath.startsWith("\\")) 
{
-            throw new IOException("A non-virtual path can't be absolute: " + 
nonVirtualPath);
+            throw new 
IOException(sm.getString("ssiServletExternalResolver.absoluteNonVirtualPath", 
nonVirtualPath));
         }
-        if (nonVirtualPath.indexOf("../") >= 0) {
-            throw new IOException("A non-virtual path can't contain '../' : " 
+ nonVirtualPath);
+        if (nonVirtualPath.contains("../")) {
+            throw new IOException(
+                    
sm.getString("ssiServletExternalResolver.pathTraversalNonVirtualPath", 
nonVirtualPath));
         }
         String path = getAbsolutePath(nonVirtualPath);
         ServletContextAndPath csAndP = new ServletContextAndPath(context, 
path);
@@ -401,7 +404,7 @@ public class SSIServletExternalResolver implements 
SSIExternalResolver {
 
         ServletContext normContext = context.getContext(normalized);
         if (normContext == null) {
-            throw new IOException("Couldn't get context for path: " + 
normalized);
+            throw new 
IOException(sm.getString("ssiServletExternalResolver.noContext", normalized));
         }
         // If it's the root context, then there is no context element to 
remove.
         // ie: '/file1.shtml' vs '/appName1/file1.shtml'
@@ -446,7 +449,7 @@ public class SSIServletExternalResolver implements 
SSIExternalResolver {
         String path = csAndP.getPath();
         URL url = context.getResource(path);
         if (url == null) {
-            throw new IOException("Context did not contain resource: " + path);
+            throw new 
IOException(sm.getString("ssiServletExternalResolver.noResource", path));
         }
         URLConnection urlConnection = url.openConnection();
         return urlConnection;
@@ -491,7 +494,7 @@ public class SSIServletExternalResolver implements 
SSIExternalResolver {
             String path = csAndP.getPath();
             RequestDispatcher rd = context.getRequestDispatcher(path);
             if (rd == null) {
-                throw new IOException("Couldn't get request dispatcher for 
path: " + path);
+                throw new 
IOException(sm.getString("ssiServletExternalResolver.requestDispatcherError", 
path));
             }
             ByteArrayServletOutputStream basos = new 
ByteArrayServletOutputStream();
             ResponseIncludeWrapper responseIncludeWrapper = new 
ResponseIncludeWrapper(res, basos);
@@ -513,12 +516,11 @@ public class SSIServletExternalResolver implements 
SSIExternalResolver {
              * included, but not sure how else to tell.
              */
             if (retVal.equals("") && 
!req.getMethod().equalsIgnoreCase("HEAD")) {
-                throw new IOException("Couldn't find file: " + path);
+                throw new 
IOException(sm.getString("ssiServletExternalResolver.noFile", path));
             }
             return retVal;
         } catch (ServletException e) {
-            throw new IOException(
-                    "Couldn't include file: " + originalPath + " because of 
ServletException: " + e.getMessage());
+            throw new 
IOException(sm.getString("ssiServletExternalResolver.noIncludeFile", 
originalPath), e);
         }
     }
 
diff --git a/java/org/apache/catalina/ssi/SSISet.java 
b/java/org/apache/catalina/ssi/SSISet.java
index 8af6dc3877..fd30f018ab 100644
--- a/java/org/apache/catalina/ssi/SSISet.java
+++ b/java/org/apache/catalina/ssi/SSISet.java
@@ -19,6 +19,8 @@ package org.apache.catalina.ssi;
 
 import java.io.PrintWriter;
 
+import org.apache.tomcat.util.res.StringManager;
+
 /**
  * Implements the Server-side #set command
  *
@@ -27,6 +29,8 @@ import java.io.PrintWriter;
  * @author David Becker
  */
 public class SSISet implements SSICommand {
+    private static final StringManager sm = 
StringManager.getManager(SSISet.class);
+
     /**
      * @see SSICommand
      */
@@ -47,16 +51,16 @@ public class SSISet implements SSICommand {
                     ssiMediator.setVariableValue(variableName, 
substitutedValue);
                     lastModified = System.currentTimeMillis();
                 } else {
-                    ssiMediator.log("#set--no variable specified");
+                    ssiMediator.log(sm.getString("ssiSet.noVariable"));
                     writer.write(errorMessage);
                     throw new SSIStopProcessingException();
                 }
             } else {
-                ssiMediator.log("#set--Invalid attribute: " + paramName);
+                ssiMediator.log(sm.getString("ssiCommand.invalidAttribute", 
paramName));
                 writer.write(errorMessage);
                 throw new SSIStopProcessingException();
             }
         }
         return lastModified;
     }
-}
\ No newline at end of file
+}


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


Reply via email to