/*
 * 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 org.apache.camel.kafkaconnector.logsink;

import java.util.Map;
import javax.annotation.Generated;
import org.apache.camel.kafkaconnector.CamelSinkConnectorConfig;
import org.apache.kafka.common.config.ConfigDef;

@Generated("This class has been generated by camel-kafka-connector-generator-maven-plugin, remove this annotation to prevent it from being generated.")
public class CamelLogsinkSinkConnectorConfig extends CamelSinkConnectorConfig {

    public static final String CAMEL_SINK_LOGSINK_KAMELET_LOGGER_NAME_CONF = "camel.kamelet.log-sink.loggerName";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_LOGGER_NAME_DOC = "Name of the logging category to use";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_LOGGER_NAME_DEFAULT = "log-sink";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_LEVEL_CONF = "camel.kamelet.log-sink.level";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_LEVEL_DOC = "Logging level to use";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_LEVEL_DEFAULT = "INFO";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_LOG_MASK_CONF = "camel.kamelet.log-sink.logMask";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_LOG_MASK_DOC = "Mask sensitive information like password or passphrase in the log";
    public static final Boolean CAMEL_SINK_LOGSINK_KAMELET_LOG_MASK_DEFAULT = false;
    public static final String CAMEL_SINK_LOGSINK_KAMELET_MARKER_CONF = "camel.kamelet.log-sink.marker";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_MARKER_DOC = "An optional Marker name to use";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_MARKER_DEFAULT = null;
    public static final String CAMEL_SINK_LOGSINK_KAMELET_MULTILINE_CONF = "camel.kamelet.log-sink.multiline";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_MULTILINE_DOC = "If enabled then each information is outputted on a newline";
    public static final Boolean CAMEL_SINK_LOGSINK_KAMELET_MULTILINE_DEFAULT = false;
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_ALL_PROPERTIES_CONF = "camel.kamelet.log-sink.showAllProperties";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_ALL_PROPERTIES_DOC = "Show all of the exchange properties (both internal and custom)";
    public static final Boolean CAMEL_SINK_LOGSINK_KAMELET_SHOW_ALL_PROPERTIES_DEFAULT = false;
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_CONF = "camel.kamelet.log-sink.showBody";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_DOC = "Show the message body";
    public static final Boolean CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_DEFAULT = true;
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_TYPE_CONF = "camel.kamelet.log-sink.showBodyType";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_TYPE_DOC = "Show the body Java type";
    public static final Boolean CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_TYPE_DEFAULT = true;
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_EXCHANGE_PATTERN_CONF = "camel.kamelet.log-sink.showExchangePattern";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_EXCHANGE_PATTERN_DOC = "Shows the Message Exchange Pattern (or MEP for short)";
    public static final Boolean CAMEL_SINK_LOGSINK_KAMELET_SHOW_EXCHANGE_PATTERN_DEFAULT = true;
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_HEADERS_CONF = "camel.kamelet.log-sink.showHeaders";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_HEADERS_DOC = "Show the headers received";
    public static final Boolean CAMEL_SINK_LOGSINK_KAMELET_SHOW_HEADERS_DEFAULT = false;
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_PROPERTIES_CONF = "camel.kamelet.log-sink.showProperties";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_PROPERTIES_DOC = "Show the exchange properties (only custom). Use showAllProperties to show both internal and custom properties.";
    public static final Boolean CAMEL_SINK_LOGSINK_KAMELET_SHOW_PROPERTIES_DEFAULT = false;
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_STREAMS_CONF = "camel.kamelet.log-sink.showStreams";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_STREAMS_DOC = "Show the stream bodies (they may not be available in following steps)";
    public static final Boolean CAMEL_SINK_LOGSINK_KAMELET_SHOW_STREAMS_DEFAULT = false;
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_CACHED_STREAMS_CONF = "camel.kamelet.log-sink.showCachedStreams";
    public static final String CAMEL_SINK_LOGSINK_KAMELET_SHOW_CACHED_STREAMS_DOC = "Whether Camel should show cached stream bodies or not.";
    public static final Boolean CAMEL_SINK_LOGSINK_KAMELET_SHOW_CACHED_STREAMS_DEFAULT = true;

    public CamelLogsinkSinkConnectorConfig(
            ConfigDef config,
            Map<String, String> parsedConfig) {
        super(config, parsedConfig);
    }

    public CamelLogsinkSinkConnectorConfig(Map<String, String> parsedConfig) {
        this(conf(), parsedConfig);
    }

    public static ConfigDef conf() {
        ConfigDef conf = new ConfigDef(CamelSinkConnectorConfig.conf());
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_LOGGER_NAME_CONF, ConfigDef.Type.STRING, CAMEL_SINK_LOGSINK_KAMELET_LOGGER_NAME_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_LOGGER_NAME_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_LEVEL_CONF, ConfigDef.Type.STRING, CAMEL_SINK_LOGSINK_KAMELET_LEVEL_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_LEVEL_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_LOG_MASK_CONF, ConfigDef.Type.BOOLEAN, CAMEL_SINK_LOGSINK_KAMELET_LOG_MASK_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_LOG_MASK_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_MARKER_CONF, ConfigDef.Type.STRING, CAMEL_SINK_LOGSINK_KAMELET_MARKER_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_MARKER_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_MULTILINE_CONF, ConfigDef.Type.BOOLEAN, CAMEL_SINK_LOGSINK_KAMELET_MULTILINE_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_MULTILINE_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_SHOW_ALL_PROPERTIES_CONF, ConfigDef.Type.BOOLEAN, CAMEL_SINK_LOGSINK_KAMELET_SHOW_ALL_PROPERTIES_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_SHOW_ALL_PROPERTIES_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_CONF, ConfigDef.Type.BOOLEAN, CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_TYPE_CONF, ConfigDef.Type.BOOLEAN, CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_TYPE_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_SHOW_BODY_TYPE_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_SHOW_EXCHANGE_PATTERN_CONF, ConfigDef.Type.BOOLEAN, CAMEL_SINK_LOGSINK_KAMELET_SHOW_EXCHANGE_PATTERN_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_SHOW_EXCHANGE_PATTERN_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_SHOW_HEADERS_CONF, ConfigDef.Type.BOOLEAN, CAMEL_SINK_LOGSINK_KAMELET_SHOW_HEADERS_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_SHOW_HEADERS_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_SHOW_PROPERTIES_CONF, ConfigDef.Type.BOOLEAN, CAMEL_SINK_LOGSINK_KAMELET_SHOW_PROPERTIES_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_SHOW_PROPERTIES_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_SHOW_STREAMS_CONF, ConfigDef.Type.BOOLEAN, CAMEL_SINK_LOGSINK_KAMELET_SHOW_STREAMS_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_SHOW_STREAMS_DOC);
        conf.define(CAMEL_SINK_LOGSINK_KAMELET_SHOW_CACHED_STREAMS_CONF, ConfigDef.Type.BOOLEAN, CAMEL_SINK_LOGSINK_KAMELET_SHOW_CACHED_STREAMS_DEFAULT, ConfigDef.Importance.MEDIUM, CAMEL_SINK_LOGSINK_KAMELET_SHOW_CACHED_STREAMS_DOC);
        return conf;
    }
}