/*
 * 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 customplugin;

import java.util.Collections;
import java.util.Map;

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.layout.AbstractStringLayout;

@Plugin(name = "FixedString", category = "Core", elementType = "layout", printObject = true)
public class FixedStringLayout extends AbstractStringLayout {

    private String fixedString;

    @PluginFactory
    public static FixedStringLayout createLayout(
            @PluginAttribute("fixedString") final String fixedString) {
        return new FixedStringLayout(fixedString);
    }

    public FixedStringLayout(String fixedString) {
        super(null, null, null);
        this.fixedString = fixedString;
    }

    @Override
    public String toSerializable(LogEvent event) {
        return fixedString;
    }

    @Override
    public Map<String, String> getContentFormat() {
        return Collections.emptyMap();
    }
}
