// Path: logging/src/main/java/io/confluent/common/logging/LogRecordBuilder.java
// public interface LogRecordBuilder<T> {
//   String FIELD_LOGGER = "logger";
//   String FIELD_LEVEL = "level";
//   String FIELD_TIME = "time";
//   String FIELD_MESSAGE = "message";
// 
//   String NAMESPACE = "io.confluent.common.logging.";
// 
//   static SchemaBuilder baseSchemaBuilder() {
//     return SchemaBuilder.struct()
//         .name(NAMESPACE + "StructuredLogRecord")
//         .field(FIELD_LOGGER, Schema.OPTIONAL_STRING_SCHEMA)
//         .field(FIELD_LEVEL, Schema.OPTIONAL_STRING_SCHEMA)
//         .field(FIELD_TIME, Schema.OPTIONAL_INT64_SCHEMA);
//   }
// 
//   LogRecordBuilder<T> withLevel(final String level);
// 
//   LogRecordBuilder<T> withTimeMs(final long timeMs);
// 
//   LogRecordBuilder<T> withLoggerName(final String loggerName);
// 
//   LogRecordBuilder<T> withMessageSchemaAndValue(final SchemaAndValue message);
// 
//   LogRecordBuilder<T> withMessageJson(final String message);
// 
//   public T build();
// }
// 
// Path: logging/src/main/java/io/confluent/common/logging/LogRecordStructBuilder.java
// public final class LogRecordStructBuilder implements LogRecordBuilder<Struct> {
//   private String level = null;
//   private Long timeMs = null;
//   private String loggerName = null;
//   private SchemaAndValue messageWithSchema = null;
// 
//   @Override
//   public LogRecordStructBuilder withLevel(final String level) {
//     this.level = level;
//     return this;
//   }
// 
//   @Override
//   public LogRecordStructBuilder withTimeMs(final long timeMs) {
//     this.timeMs = timeMs;
//     return this;
//   }
// 
//   @Override
//   public LogRecordStructBuilder withLoggerName(final String loggerName) {
//     this.loggerName = loggerName;
//     return this;
//   }
// 
//   @Override
//   public LogRecordStructBuilder withMessageSchemaAndValue(final SchemaAndValue messageWithSchema) {
//     this.messageWithSchema = messageWithSchema;
//     return this;
//   }
// 
//   @Override
//   public LogRecordBuilder<Struct> withMessageJson(String message) {
//     throw new RuntimeException("not implemented");
//   }
// 
//   public Struct build() {
//     final Schema logRecordSchema = LogRecordBuilder.baseSchemaBuilder()
//         .field(FIELD_MESSAGE, messageWithSchema.schema())
//         .build();
//     final Struct logRecord = new Struct(logRecordSchema);
//     logRecord.put(FIELD_LOGGER, loggerName);
//     logRecord.put(FIELD_LEVEL, level);
//     logRecord.put(FIELD_TIME, timeMs);
//     logRecord.put(FIELD_MESSAGE, messageWithSchema.value());
//     return logRecord;
//   }
// }
// 
// Path: logging/src/main/java/io/confluent/common/logging/StructuredLogMessage.java
// public interface StructuredLogMessage {
//   SchemaAndValue getMessage();
// }


import io.confluent.common.logging.LogRecordBuilder;
import io.confluent.common.logging.LogRecordStructBuilder;
import org.apache.kafka.connect.data.Struct;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.layout.AbstractLayout;
import io.confluent.common.logging.StructuredLogMessage;
import java.util.function.Function;
import java.util.function.Supplier;
/*
 * Copyright 2018 Confluent Inc.
 *
 * 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 io.confluent.common.logging.log4j2;




final class StructuredLayout extends AbstractLayout<byte[]> {
  private static final byte[] EMPTY_BYTES = new byte[0];

  private final Function<Struct, byte[]> serializer;
  private final Supplier<LogRecordBuilder<Struct>> logRecordStructBuilderFactory;

  public byte[] toByteArray(final LogEvent event) {
    if (event.getMessage().getParameters().length != 1
        || !(event.getMessage().getParameters()[0] instanceof StructuredLogMessage)) {
      throw new IllegalArgumentException(
          "LogEvent must contain a single parameter of type StructuredLogMessage");
    }
    final StructuredLogMessage schemaAndValue
        = (StructuredLogMessage) event.getMessage().getParameters()[0];
    final Struct logRecord = logRecordStructBuilderFactory.get()
        .withLoggerName(event.getLoggerName())
        .withLevel(event.getLevel().name())
        .withTimeMs(event.getTimeMillis())
        .withMessageSchemaAndValue(schemaAndValue.getMessage())
        .build();
// Path: logging/src/main/java/io/confluent/common/logging/LogRecordBuilder.java
// public interface LogRecordBuilder<T> {
//   String FIELD_LOGGER = "logger";
//   String FIELD_LEVEL = "level";
//   String FIELD_TIME = "time";
//   String FIELD_MESSAGE = "message";
// 
//   String NAMESPACE = "io.confluent.common.logging.";
// 
//   static SchemaBuilder baseSchemaBuilder() {
//     return SchemaBuilder.struct()
//         .name(NAMESPACE + "StructuredLogRecord")
//         .field(FIELD_LOGGER, Schema.OPTIONAL_STRING_SCHEMA)
//         .field(FIELD_LEVEL, Schema.OPTIONAL_STRING_SCHEMA)
//         .field(FIELD_TIME, Schema.OPTIONAL_INT64_SCHEMA);
//   }
// 
//   LogRecordBuilder<T> withLevel(final String level);
// 
//   LogRecordBuilder<T> withTimeMs(final long timeMs);
// 
//   LogRecordBuilder<T> withLoggerName(final String loggerName);
// 
//   LogRecordBuilder<T> withMessageSchemaAndValue(final SchemaAndValue message);
// 
//   LogRecordBuilder<T> withMessageJson(final String message);
// 
//   public T build();
// }
// 
// Path: logging/src/main/java/io/confluent/common/logging/LogRecordStructBuilder.java
// public final class LogRecordStructBuilder implements LogRecordBuilder<Struct> {
//   private String level = null;
//   private Long timeMs = null;
//   private String loggerName = null;
//   private SchemaAndValue messageWithSchema = null;
// 
//   @Override
//   public LogRecordStructBuilder withLevel(final String level) {
//     this.level = level;
//     return this;
//   }
// 
//   @Override
//   public LogRecordStructBuilder withTimeMs(final long timeMs) {
//     this.timeMs = timeMs;
//     return this;
//   }
// 
//   @Override
//   public LogRecordStructBuilder withLoggerName(final String loggerName) {
//     this.loggerName = loggerName;
//     return this;
//   }
// 
//   @Override
//   public LogRecordStructBuilder withMessageSchemaAndValue(final SchemaAndValue messageWithSchema) {
//     this.messageWithSchema = messageWithSchema;
//     return this;
//   }
// 
//   @Override
//   public LogRecordBuilder<Struct> withMessageJson(String message) {
//     throw new RuntimeException("not implemented");
//   }
// 
//   public Struct build() {
//     final Schema logRecordSchema = LogRecordBuilder.baseSchemaBuilder()
//         .field(FIELD_MESSAGE, messageWithSchema.schema())
//         .build();
//     final Struct logRecord = new Struct(logRecordSchema);
//     logRecord.put(FIELD_LOGGER, loggerName);
//     logRecord.put(FIELD_LEVEL, level);
//     logRecord.put(FIELD_TIME, timeMs);
//     logRecord.put(FIELD_MESSAGE, messageWithSchema.value());
//     return logRecord;
//   }
// }
// 
// Path: logging/src/main/java/io/confluent/common/logging/StructuredLogMessage.java
// public interface StructuredLogMessage {
//   SchemaAndValue getMessage();
// }


// Path: log4j2-extensions/src/main/java/io/confluent/common/logging/log4j2/StructuredLayout.java
import io.confluent.common.logging.LogRecordBuilder;
import io.confluent.common.logging.LogRecordStructBuilder;
import org.apache.kafka.connect.data.Struct;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.layout.AbstractLayout;
import io.confluent.common.logging.StructuredLogMessage;
import java.util.function.Function;
import java.util.function.Supplier;

/*
 * Copyright 2018 Confluent Inc.
 *
 * 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 io.confluent.common.logging.log4j2;




final class StructuredLayout extends AbstractLayout<byte[]> {
  private static final byte[] EMPTY_BYTES = new byte[0];

  private final Function<Struct, byte[]> serializer;
  private final Supplier<LogRecordBuilder<Struct>> logRecordStructBuilderFactory;

  public byte[] toByteArray(final LogEvent event) {
    if (event.getMessage().getParameters().length != 1
        || !(event.getMessage().getParameters()[0] instanceof StructuredLogMessage)) {
      throw new IllegalArgumentException(
          "LogEvent must contain a single parameter of type StructuredLogMessage");
    }
    final StructuredLogMessage schemaAndValue
        = (StructuredLogMessage) event.getMessage().getParameters()[0];
    final Struct logRecord = logRecordStructBuilderFactory.get()
        .withLoggerName(event.getLoggerName())
        .withLevel(event.getLevel().name())
        .withTimeMs(event.getTimeMillis())
        .withMessageSchemaAndValue(schemaAndValue.getMessage())
        .build();
    return serializer.apply(logRecord);