package org.apache.maven.surefire.extensions.util;

/*
 * 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.
 */

import javax.annotation.Nonnull;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.Channel;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;

import static org.apache.maven.surefire.util.internal.Channels.newBufferedChannel;

/**
 *
 */
public final class CommandlineStreams implements Closeable
{
    private final ReadableByteChannel stdOutChannel;
    private final ReadableByteChannel stdErrChannel;
    private final WritableByteChannel stdInChannel;
    private volatile boolean closed;

    public CommandlineStreams( @Nonnull Process process )
    {
        InputStream stdOutStream = process.getInputStream();
        stdOutChannel = newBufferedChannel( stdOutStream );

        InputStream stdErrStream = process.getErrorStream();
        stdErrChannel = newBufferedChannel( stdErrStream );

        stdInChannel = newBufferedChannel( process.getOutputStream() );
    }

    public ReadableByteChannel getStdOutChannel()
    {
        return stdOutChannel;
    }

    public ReadableByteChannel getStdErrChannel()
    {
        return stdErrChannel;
    }

    public WritableByteChannel getStdInChannel()
    {
        return stdInChannel;
    }

    @Override
    public void close() throws IOException
    {
        if ( closed )
        {
            return;
        }

        try ( Channel c1 = stdOutChannel;
              Channel c2 = stdErrChannel;
              Channel c3 = stdInChannel )
        {
            closed = true;
        }
        catch ( ClosedChannelException e )
        {
            // already closed externally
        }
    }
}
