diff --git a/core/src/main/scala/kafka/tools/ConsoleConsumer.scala b/core/src/main/scala/kafka/tools/ConsoleConsumer.scala index 42c5c5bae1baa..9a8c64842aa9e 100755 --- a/core/src/main/scala/kafka/tools/ConsoleConsumer.scala +++ b/core/src/main/scala/kafka/tools/ConsoleConsumer.scala @@ -509,9 +509,9 @@ class DefaultMessageFormatter extends MessageFormatter { output.write(lineSeparator) } - def write(deserializer: Option[Deserializer[_]], sourceBytes: Array[Byte]) { + def write(deserializer: Option[Deserializer[_]], sourceBytes: Array[Byte], topic: String) { val nonNullBytes = Option(sourceBytes).getOrElse("null".getBytes(StandardCharsets.UTF_8)) - val convertedBytes = deserializer.map(_.deserialize(null, nonNullBytes).toString. + val convertedBytes = deserializer.map(_.deserialize(topic, nonNullBytes).toString. getBytes(StandardCharsets.UTF_8)).getOrElse(nonNullBytes) output.write(convertedBytes) } @@ -527,12 +527,12 @@ class DefaultMessageFormatter extends MessageFormatter { } if (printKey) { - write(keyDeserializer, key) + write(keyDeserializer, key, topic) writeSeparator(printValue) } if (printValue) { - write(valueDeserializer, value) + write(valueDeserializer, value, topic) output.write(lineSeparator) } } diff --git a/core/src/test/scala/kafka/tools/CustomDeserializerTest.scala b/core/src/test/scala/kafka/tools/CustomDeserializerTest.scala new file mode 100644 index 0000000000000..37b5b79a868ec --- /dev/null +++ b/core/src/test/scala/kafka/tools/CustomDeserializerTest.scala @@ -0,0 +1,53 @@ +/** + * 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. + */ + +package kafka.tools + +import java.io.PrintStream + +import org.apache.kafka.clients.consumer.ConsumerRecord +import org.apache.kafka.common.serialization.Deserializer +import org.hamcrest.CoreMatchers +import org.junit.Test +import org.junit.Assert.assertThat +import org.scalatest.mockito.MockitoSugar + +class CustomDeserializer extends Deserializer[String] { + override def configure(configs: java.util.Map[String, _], isKey: Boolean): Unit = { + } + + override def deserialize(topic: String, data: Array[Byte]): String = { + assertThat("topic must not be null", topic, CoreMatchers.notNullValue()) + new String(data) + } + + override def close(): Unit = { + } +} + +class CustomDeserializerTest extends MockitoSugar { + + @Test + def checkDeserializerTopicIsNotNull(): Unit = { + val formatter = new DefaultMessageFormatter() + formatter.keyDeserializer = Some(new CustomDeserializer) + + formatter.writeTo(new ConsumerRecord("topic_test", 1, 1l, "key".getBytes, "value".getBytes), mock[PrintStream]) + + formatter.close() + } +}