package poc;

import java.io.ObjectInputStream;
import java.net.InetAddress;
import java.util.Collections;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.server.ObjectInputStreamLogEventBridge;
import org.apache.logging.log4j.server.TcpSocketServer;
import org.apache.logging.log4j.util.FilteredObjectInputStream;

/**
 * Minimal launcher for the real Apache logging-log4j-samples receiver.
 * It only selects the serialized-event mode through the product's public factory;
 * all listening, accepting, stream wrapping, readObject, and event processing are
 * performed by TcpSocketServer and ObjectInputStreamLogEventBridge.
 */
public final class SampleReceiverMain {

    private SampleReceiverMain() {}

    private static String source(final Class<?> type) {
        try {
            return type.getProtectionDomain().getCodeSource().getLocation().toString();
        } catch (final Exception ex) {
            return "unavailable:" + ex.getClass().getName();
        }
    }

    public static void main(final String[] args) throws Exception {
        final int port = Integer.parseInt(args[0]);
        System.out.println("[identity] receiver_pid=" + ProcessHandle.current().pid());
        System.out.println("[identity] TcpSocketServer=" + source(TcpSocketServer.class));
        System.out.println("[identity] ObjectInputStreamLogEventBridge=" + source(ObjectInputStreamLogEventBridge.class));
        System.out.println("[identity] FilteredObjectInputStream=" + source(FilteredObjectInputStream.class));
        System.out.println("[identity] Log4jLogEvent=" + source(Log4jLogEvent.class));
        System.out.println("[identity] LogManager.version="
                + LogManager.class.getPackage().getImplementationVersion());
        System.out.println("[identity] InvokerTransformer=" + source(InvokerTransformer.class));

        final TcpSocketServer<ObjectInputStream> server = TcpSocketServer.createSerializedSocketServer(
                port, 50, InetAddress.getByName("0.0.0.0"), Collections.<String>emptyList());
        System.out.println("[receiver] org.apache.logging.log4j.server.TcpSocketServer"
                + ".createSerializedSocketServer() bound to 0.0.0.0:" + port + " (no auth)");
        System.out.flush();
        final Thread serverThread = server.startNewThread();
        serverThread.join();
    }
}
