/*
 * 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.logging.log4j.server;

import java.io.IOException;
import java.io.InputStream;

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.LogEventListener;
import org.apache.logging.log4j.core.parser.ParseException;

/**
 * Reads {@link LogEvent}s from the given input stream and logs them as they are discovered on the given logger.
 * 
 * <p>
 * Should be stateless.
 * </p>
 * 
 * @param <T>
 *            The kind of {@link InputStream} to wrap and read.
 */
public interface LogEventBridge<T extends InputStream> {

    /**
     * Reads {@link LogEvent}s from the given input stream and logs them as they are discovered on the given logger.
     * 
     * @param inputStream
     *            the input stream to read
     * @param logEventListener
     *            TODO
     */
    void logEvents(T inputStream, LogEventListener logEventListener) throws IOException, ParseException;

    /**
     * Wraps the given stream if needed.
     * 
     * @param inputStream
     *            the stream to wrap
     * @return the wrapped stream or the given stream.
     */
    T wrapStream(InputStream inputStream) throws IOException;
}
