diff --git a/core/src/test/java/com/google/zxing/InvertedLuminanceSourceTestCase.java b/core/src/test/java/com/google/zxing/InvertedLuminanceSourceTestCase.java
new file mode 100644
index 000000000..932a7e2ab
--- /dev/null
+++ b/core/src/test/java/com/google/zxing/InvertedLuminanceSourceTestCase.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2020 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.zxing;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.awt.image.BufferedImage;
+
+/**
+ * Tests {@link InvertedLuminanceSource}.
+ */
+public final class InvertedLuminanceSourceTestCase extends Assert {
+
+ @Test
+ public void testInverted() {
+ BufferedImage image = new BufferedImage(2, 1, BufferedImage.TYPE_INT_RGB);
+ image.setRGB(0, 0, 0xFFFFFF);
+ LuminanceSource source = new BufferedImageLuminanceSource(image);
+ assertArrayEquals(new byte[] { (byte) 0xFF, 0 }, source.getRow(0, null));
+ LuminanceSource inverted = new InvertedLuminanceSource(source);
+ assertArrayEquals(new byte[] { 0, (byte) 0xFF }, inverted.getRow(0, null));
+ }
+
+}
diff --git a/core/src/test/java/com/google/zxing/common/BitMatrixTestCase.java b/core/src/test/java/com/google/zxing/common/BitMatrixTestCase.java
index 2aeca625b..b92705e3a 100644
--- a/core/src/test/java/com/google/zxing/common/BitMatrixTestCase.java
+++ b/core/src/test/java/com/google/zxing/common/BitMatrixTestCase.java
@@ -19,6 +19,8 @@ package com.google.zxing.common;
import org.junit.Assert;
import org.junit.Test;
+import java.util.Arrays;
+
/**
* @author Sean Owen
* @author dswitkin@google.com (Daniel Switkin)
@@ -226,6 +228,25 @@ public final class BitMatrixTestCase extends Assert {
assertEquals(centerMatrix, BitMatrix.parse(centerMatrix.toString("x", "."), "x", "."));
}
+ @Test
+ public void testParseBoolean() {
+ BitMatrix emptyMatrix = new BitMatrix(3, 3);
+ BitMatrix fullMatrix = new BitMatrix(3, 3);
+ fullMatrix.setRegion(0, 0, 3, 3);
+ BitMatrix centerMatrix = new BitMatrix(3, 3);
+ centerMatrix.setRegion(1, 1, 1, 1);
+ BitMatrix emptyMatrix24 = new BitMatrix(2, 4);
+
+ boolean[][] matrix = new boolean[3][3];
+ assertEquals(emptyMatrix, BitMatrix.parse(matrix));
+ matrix[1][1] = true;
+ assertEquals(centerMatrix, BitMatrix.parse(matrix));
+ for (boolean[] arr : matrix) {
+ Arrays.fill(arr, true);
+ }
+ assertEquals(fullMatrix, BitMatrix.parse(matrix));
+ }
+
@Test
public void testUnset() {
BitMatrix emptyMatrix = new BitMatrix(3, 3);
diff --git a/core/src/test/java/com/google/zxing/common/StringUtilsTestCase.java b/core/src/test/java/com/google/zxing/common/StringUtilsTestCase.java
index 6440209b9..355586935 100644
--- a/core/src/test/java/com/google/zxing/common/StringUtilsTestCase.java
+++ b/core/src/test/java/com/google/zxing/common/StringUtilsTestCase.java
@@ -19,14 +19,23 @@ package com.google.zxing.common;
import org.junit.Assert;
import org.junit.Test;
-import java.nio.charset.StandardCharsets;
import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.Random;
/**
* Tests {@link StringUtils}.
*/
public final class StringUtilsTestCase extends Assert {
+ @Test
+ public void testRandom() {
+ Random r = new Random(1234L);
+ byte[] bytes = new byte[1000];
+ r.nextBytes(bytes);
+ assertEquals(Charset.defaultCharset(), StringUtils.guessCharset(bytes, null));
+ }
+
@Test
public void testShortShiftJIS1() {
// 金魚
diff --git a/javase/src/main/java/com/google/zxing/client/j2se/HtmlAssetTranslator.java b/javase/src/main/java/com/google/zxing/client/j2se/HtmlAssetTranslator.java
index 7d401c1c8..f8b10899a 100644
--- a/javase/src/main/java/com/google/zxing/client/j2se/HtmlAssetTranslator.java
+++ b/javase/src/main/java/com/google/zxing/client/j2se/HtmlAssetTranslator.java
@@ -52,16 +52,18 @@ import java.util.regex.Pattern;
* as a comma-separated list. Specify "all" for language to try to translate for all existing translations.
* Each argument after this is the name of a file to translate; if the first one is "all", all files will
* be translated.
- *
+ *
* Usage: {@code HtmlAssetTranslator android/assets/ (all|lang1[,lang2 ...]) (all|file1.html[ file2.html ...])}
*
- * {@code android/assets/ es all} will translate .html files in subdirectory html-en to
- * directory html-es, for example. Note that only text nodes in the HTML document are translated.
- * Any text that is a child of a node with {@code class="notranslate"} will not be translated. It will
+ *
{@code android/assets/ es all} will translate .html files in subdirectory html-en to
+ * directory html-es, for example. Note that only text nodes in the HTML document are translated.
+ * Any text that is a child of a node with {@code class="notranslate"} will not be translated. It will
* also add a note at the end of the translated page that indicates it was automatically translated.
*
* @author Sean Owen
+ * @deprecated without replacement since 3.4.2
*/
+@Deprecated
public final class HtmlAssetTranslator {
private static final Pattern COMMA = Pattern.compile(",");
diff --git a/javase/src/main/java/com/google/zxing/client/j2se/StringsResourceTranslator.java b/javase/src/main/java/com/google/zxing/client/j2se/StringsResourceTranslator.java
index 95f81a2c7..47185ea66 100644
--- a/javase/src/main/java/com/google/zxing/client/j2se/StringsResourceTranslator.java
+++ b/javase/src/main/java/com/google/zxing/client/j2se/StringsResourceTranslator.java
@@ -49,7 +49,9 @@ import java.util.regex.Pattern;
* You must set your Google Translate API key into the environment with -DtranslateAPI.key=...
*
* @author Sean Owen
+ * @deprecated without replacement since 3.4.2
*/
+@Deprecated
public final class StringsResourceTranslator {
private static final String API_KEY = System.getProperty("translateAPI.key");
@@ -58,7 +60,7 @@ public final class StringsResourceTranslator {
throw new IllegalArgumentException("translateAPI.key is not specified");
}
}
-
+
private static final Pattern ENTRY_PATTERN = Pattern.compile("([^<]+)");
private static final Pattern STRINGS_FILE_NAME_PATTERN = Pattern.compile("values-(.+)");
private static final Pattern TRANSLATE_RESPONSE_PATTERN = Pattern.compile("translatedText\":\\s*\"([^\"]+)\"");
diff --git a/javase/src/test/java/com/google/zxing/client/j2se/CommandLineRunnerTestCase.java b/javase/src/test/java/com/google/zxing/client/j2se/CommandLineRunnerTestCase.java
index 648acde74..1fee0dae9 100644
--- a/javase/src/test/java/com/google/zxing/client/j2se/CommandLineRunnerTestCase.java
+++ b/javase/src/test/java/com/google/zxing/client/j2se/CommandLineRunnerTestCase.java
@@ -26,7 +26,8 @@ public final class CommandLineRunnerTestCase extends Assert {
@Test
public void testCommandLineRunner() throws Exception {
- String[] args = { "--pure_barcode", DecodeWorkerTestCase.IMAGE_DATA_URI };
+ String[] args = { "--pure_barcode", "--try_harder",
+ DecodeWorkerTestCase.IMAGE_DATA_URI, DecodeWorkerTestCase.IMAGE_NOBARCODE_DATA_URI };
// Not a lot to do here but make sure it runs
CommandLineRunner.main(args);
}
diff --git a/javase/src/test/java/com/google/zxing/client/j2se/DecodeWorkerTestCase.java b/javase/src/test/java/com/google/zxing/client/j2se/DecodeWorkerTestCase.java
index 66ecd0061..d05d64732 100644
--- a/javase/src/test/java/com/google/zxing/client/j2se/DecodeWorkerTestCase.java
+++ b/javase/src/test/java/com/google/zxing/client/j2se/DecodeWorkerTestCase.java
@@ -36,6 +36,25 @@ public final class DecodeWorkerTestCase extends Assert {
"988HQPUfPVaqA0XKz%2BgD9bIk1AP1fgwvB7KlS9VBdqXbA82PT9AH2fiaH2SXGdDM71fDgeIfhIvKsbkTTAIAKYVr0N" +
"z5IloAAAAASUVORK5CYII=";
+ static final String IMAGE_NOBARCODE_DATA_URI =
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACE1BMVEUAAAAYsPIXsPL//+" +
+ "2J6/CI6vB74/Alt/IXr/LL/++M7PD//+UZsPIXr/ISrfIRrPIXsPIYsPIYsPIKqfIQrPITrvIZsfImt/IouPImt/IZsf" +
+ "IXr/IXsPIbsfIWr/IcsvInuPImuPIvvPJt3PB54vBt3PAasfIXsPIXr/IUrvIYsPIwvfJx3vB54vCE6PCS7/B64/Bt3P" +
+ "AktvIXr/IYsPIYsPIasfIlt/IwvPKJ6/CM7PCW8fCQ7vCB5vAmt/IXr/IYsPIYsPIXsPKI6vCI6vCI6vAYsfMYsPIYsP" +
+ "KI6vCI6vCI6vAYrO0YsPGI6vCI6vCI6vCJ6/CH6vBw3vB64/CE6PAwvPJr2/FLy/ESrfIYsPIjtvIasfIYsPIYsPIYsP" +
+ "IYsPIYsPIYsPIYsPIYsPIYre4vvPIktvJ64/Bx3vCI6vAitfJj1/F74/CH6vAbsfI7wvF/5fCJ6vAXsPJw3fAWmNEYre" +
+ "0mt/J85PCJ6/Bw3vAXqukYr/EYsPIZsPIwvPJ95PAjtvIVksgWmtQYre4VlMsXpuUVkccWl9AXquouu/Jy3/AWl88Wm9" +
+ "QXpuQYrO0ZsfIVkcgVlMwWmNAXqekVisIVkMcVkscWm9UTXaQVgr0VisMVlcwTT5oTVZ4TXKMVhL4TTpoTTZoTW6MVg7" +
+ "4Vj8YVicIVkMYVi8MUfbkTVZ8UfLkUY6gTVJ4Vg70TT5sTVp/hyCW0AAAAZnRSTlMAAAAAAAAAAAAAAAACGx8fHxsCAh" +
+ "k2yeTi4uLJMgEZNsnm++fi5s80GTbJ5v3NNhzJ4uCvFwHJ5v3mNgIbHx8cBDHN/ckZOcz+5jYC5f3k4Bzk/f3NMv7NNh" +
+ "0f/eTg4jYd/eQZ5v3GzkXBAAAByUlEQVQ4y73TvW4TQRSG4e/dtbHx2hv/FBEIEBWIEgmLhoaGittJRYeEfAUUFBS+Ai" +
+ "qIoIBQgGQRFKWwoAxgKYog3vXf2uvx7lAkBDvyio7TnkffnDOaQf8o/h/4C+06gOQB1oHgnEASosZZ9VYFQvLqp837vO" +
+ "NnsAqQdwXg3oeTI+DzOXDn8DLcZo8OdwF4vwqaZW4BXdiRrAPxuRkewE3gC7wxa+/hITfGlXkXdrQebJHkoLvICBBbJO" +
+ "PG+BsvlQEeAbAfZydccCI//jrMnOExxMDrWtYWT4iI/LiTtQYtGIsybwd7GLMOKB84UqUDrxbzNe+hJeNNY+F2AbYJlp" +
+ "r2BKQX6UvR1U/AbpP5aXebQLKipRIQxlJUknr8GYPdZu5FINGSpNSPRsVZcVhYyu+5H5vMxVMIJZHW+5VJ2UxiqTArep" +
+ "NZcXaUGIlnYAaS0sR1lG5O+X4tjiuWUT2yhXBW5DlwWA3PktPNo8RN8sZN3MT1RwFtrMO0FNaCoXzVDyTper8WVF17IO" +
+ "OWaUsLTDWsTfIyc+eXr6EuWS+oM/shX9CWhKmGeVPRtHxcMtqIbIqpOmNKAxnaS1/E+migDR3nJGnR0GDR+A23fMFDA8" +
+ "6WRQAAAABJRU5ErkJggg==";
@Test
public void testWorker() throws Exception {
@@ -46,5 +65,5 @@ public final class DecodeWorkerTestCase extends Assert {
DecodeWorker worker = new DecodeWorker(config, inputs);
assertEquals(1, worker.call().intValue());
}
-
+
}
diff --git a/pom.xml b/pom.xml
index bbc488b50..f1562425a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -467,6 +467,7 @@
**/*.properties
**/*.cfg
**/*.config
+ **/*.yml
**/*.yaml
**/gen/**
**/resources/**
diff --git a/zxingorg/pom.xml b/zxingorg/pom.xml
index 3bd4d14a4..ada770926 100644
--- a/zxingorg/pom.xml
+++ b/zxingorg/pom.xml
@@ -49,7 +49,13 @@
org.springframework
spring-test
- 5.3.1
+ ${spring.version}
+ test
+
+
+ org.springframework
+ spring-web
+ ${spring.version}
test
@@ -66,6 +72,10 @@
3.4.2-SNAPSHOT
+
+ 5.3.1
+
+
diff --git a/zxingorg/src/main/java/com/google/zxing/web/ChartServlet.java b/zxingorg/src/main/java/com/google/zxing/web/ChartServlet.java
index bdee82281..60cbcf54e 100644
--- a/zxingorg/src/main/java/com/google/zxing/web/ChartServlet.java
+++ b/zxingorg/src/main/java/com/google/zxing/web/ChartServlet.java
@@ -114,7 +114,7 @@ public final class ChartServlet extends HttpServlet {
} else {
imageFormat = "PNG";
}
-
+
String contentType;
switch (imageFormat) {
case "PNG":
@@ -129,7 +129,7 @@ public final class ChartServlet extends HttpServlet {
default:
throw new IllegalArgumentException("Unknown format " + imageFormat);
}
-
+
ByteArrayOutputStream imageOut = new ByteArrayOutputStream(1024);
MatrixToImageWriter.writeToStream(matrix, imageFormat, imageOut);
byte[] imageData = imageOut.toByteArray();
@@ -143,7 +143,8 @@ public final class ChartServlet extends HttpServlet {
private static ChartServletRequestParameters doParseParameters(ServletRequest request, boolean readBody)
throws IOException {
- Preconditions.checkArgument("qr".equals(request.getParameter("cht")), "Bad type");
+ String chartType = request.getParameter("cht");
+ Preconditions.checkArgument(chartType == null || "qr".equals(chartType), "Bad type");
String widthXHeight = request.getParameter("chs");
Preconditions.checkNotNull(widthXHeight, "No size");
@@ -156,8 +157,10 @@ public final class ChartServlet extends HttpServlet {
Preconditions.checkArgument(width <= MAX_DIMENSION && height <= MAX_DIMENSION, "Bad size");
String outputEncodingName = request.getParameter("choe");
- Charset outputEncoding = StandardCharsets.UTF_8;
- if (outputEncodingName != null) {
+ Charset outputEncoding;
+ if (outputEncodingName == null) {
+ outputEncoding = StandardCharsets.UTF_8;
+ } else {
outputEncoding = Charset.forName(outputEncodingName);
Preconditions.checkArgument(SUPPORTED_OUTPUT_ENCODINGS.contains(outputEncoding), "Bad output encoding");
}
diff --git a/zxingorg/src/main/java/com/google/zxing/web/OutputUtils.java b/zxingorg/src/main/java/com/google/zxing/web/OutputUtils.java
index 7d31fc87c..191acf102 100644
--- a/zxingorg/src/main/java/com/google/zxing/web/OutputUtils.java
+++ b/zxingorg/src/main/java/com/google/zxing/web/OutputUtils.java
@@ -18,7 +18,7 @@ package com.google.zxing.web;
/**
* Utility functions for {@code decoderesult.jspx}.
- *
+ *
* @author Sean Owen
*/
public final class OutputUtils {
@@ -42,17 +42,14 @@ public final class OutputUtils {
} else if (i % HALF_BYTES_PER_LINE == 0) {
result.append(" ");
} else {
- result.append(' ');
+ result.append(' ');
}
}
return result.toString();
}
-
+
private static char hexChar(int value) {
- if (value < 0 || value > 15) {
- throw new IllegalArgumentException("Bad hex digit value " + value);
- }
return (char) (value < 10 ? ('0' + value) : ('a' + (value - 10)));
}
-
+
}
diff --git a/zxingorg/src/test/java/com/google/zxing/web/ChartServletTestCase.java b/zxingorg/src/test/java/com/google/zxing/web/ChartServletTestCase.java
new file mode 100644
index 000000000..1fe34f0a7
--- /dev/null
+++ b/zxingorg/src/test/java/com/google/zxing/web/ChartServletTestCase.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2020 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.zxing.web;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Tests {@link ChartServlet}.
+ */
+public final class ChartServletTestCase extends Assert {
+
+ @Test
+ public void testChart() throws Exception {
+ ChartServlet servlet = new ChartServlet();
+
+ for (String contentType : new String[] { "png", "jpeg", "gif"}) {
+ MockHttpServletRequest request = new MockHttpServletRequest();
+ request.setRequestURI("image." + contentType);
+ Map params = new HashMap<>();
+ params.put("chl", "foo");
+ params.put("chs", "100x100");
+ params.put("chld", "M");
+ request.setParameters(params);
+
+ MockHttpServletResponse response = new MockHttpServletResponse();
+
+ servlet.doGet(request, response);
+
+ assertEquals(HttpServletResponse.SC_OK, response.getStatus());
+ assertEquals("image/" + contentType, response.getContentType());
+ assertTrue(response.getContentAsByteArray().length > 0);
+ }
+
+ servlet.destroy();
+ }
+
+}
diff --git a/zxingorg/src/test/java/com/google/zxing/web/DecodeServletTestCase.java b/zxingorg/src/test/java/com/google/zxing/web/DecodeServletTestCase.java
new file mode 100644
index 000000000..01b41a005
--- /dev/null
+++ b/zxingorg/src/test/java/com/google/zxing/web/DecodeServletTestCase.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2020 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.zxing.web;
+
+import com.google.common.net.MediaType;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.mock.web.MockServletConfig;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Tests {@link DecodeServlet}.
+ */
+public final class DecodeServletTestCase extends Assert {
+
+ private static final String IMAGE_DATA_URI =
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAhAQAAAAB/n//CAAAAkklEQVR42mP4DwQNDJjkB4" +
+ "E77A0M369N/d7A8CV6rjiQjPMFkWG1QPL7RVGg%2BAfREKCa/5/vA9V/nFSQ3sDwb7/KdiDJqX4dSH4pXN/A8DfyDVD2" +
+ "988HQPUfPVaqA0XKz%2BgD9bIk1AP1fgwvB7KlS9VBdqXbA82PT9AH2fiaH2SXGdDM71fDgeIfhIvKsbkTTAIAKYVr0N" +
+ "z5IloAAAAASUVORK5CYII=";
+
+ @Test
+ public void testDataURI() throws Exception {
+ MockServletConfig config = new MockServletConfig();
+ config.addInitParameter("maxAccessPerTime", "100");
+ config.addInitParameter("accessTimeSec", "100");
+ config.addInitParameter("maxEntries", "100");
+
+ DecodeServlet servlet = new DecodeServlet();
+ servlet.init(config);
+
+ MockHttpServletRequest request = new MockHttpServletRequest();
+ Map params = new HashMap<>();
+ params.put("u", IMAGE_DATA_URI);
+ params.put("full", "false");
+ request.setParameters(params);
+
+ MockHttpServletResponse response = new MockHttpServletResponse();
+
+ servlet.doGet(request, response);
+
+ assertEquals(HttpServletResponse.SC_OK, response.getStatus());
+ assertEquals(MediaType.PLAIN_TEXT_UTF_8.toString(), response.getContentType());
+ assertEquals("--error-correction_level\n", response.getContentAsString());
+
+ servlet.destroy();
+ }
+
+}
diff --git a/zxingorg/src/test/java/com/google/zxing/web/ServletContextLogHandlerTestCase.java b/zxingorg/src/test/java/com/google/zxing/web/ServletContextLogHandlerTestCase.java
new file mode 100644
index 000000000..f613134e1
--- /dev/null
+++ b/zxingorg/src/test/java/com/google/zxing/web/ServletContextLogHandlerTestCase.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2020 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.zxing.web;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.mock.web.MockServletContext;
+
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+/**
+ * Tests {@link ServletContextLogHandler}.
+ */
+public final class ServletContextLogHandlerTestCase extends Assert {
+
+ @Test
+ public void testLogHandler() {
+ // Can't test much here
+ MockServletContext context = new MockServletContext();
+ ServletContextLogHandler handler = new ServletContextLogHandler(context);
+ handler.publish(new LogRecord(Level.INFO, "test log message"));
+ handler.flush();
+ handler.close();
+ }
+
+}