package org.apache.maven.plugin.surefire.booterclient;

/*
 * 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 org.apache.maven.plugin.surefire.JdkAttributes;
import org.apache.maven.surefire.booter.SystemUtils;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RunnableFuture;

import static org.apache.maven.surefire.api.util.internal.DaemonThreadFactory.newDaemonThread;

/**
 * Loads platform specifics.
 *
 * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
 * @since 2.20.1
 */
public final class Platform
{
    private final RunnableFuture<Long> pluginPidJob;

    private final JdkAttributes jdk;

    public Platform()
    {
        // the job may take 50 or 80 ms
        this( new FutureTask<>( pidJob() ), null );
        newDaemonThread( pluginPidJob ).start();
    }

    private Platform( RunnableFuture<Long> pluginPidJob, JdkAttributes jdk )
    {
        this.pluginPidJob = pluginPidJob;
        this.jdk = jdk;
    }

    public Long getPluginPid()
    {
        try
        {
            return pluginPidJob.get();
        }
        catch ( Exception e )
        {
            return null;
        }
    }

    public JdkAttributes getJdkExecAttributesForTests()
    {
        return jdk;
    }

    public Platform withJdkExecAttributesForTests( JdkAttributes jdk )
    {
        return new Platform( pluginPidJob, jdk );
    }

    private static Callable<Long> pidJob()
    {
        return new Callable<Long>()
        {
            @Override
            public Long call() throws Exception
            {
                return SystemUtils.pid();
            }
        };
    }
}
