/*
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package sun.jvmstat;

import java.io.File;
import java.lang.reflect.Constructor;
import java.util.List;
import jdk.internal.vm.VMSupport;

/*
 * Support routines handling temp directory locating
 * and process ID extraction.
 */
public class PlatformSupport {
    private static final String tmpDirName;
    static {
        /*
         * For this to work, the target VM and this code need to use
         * the same directory. Instead of guessing which directory the
         * VM is using, we will ask.
         */
        String tmpdir = VMSupport.getVMTemporaryDirectory();

        /*
         * Assure that the string returned has a trailing File.separator
         * character. This check was added because the Linux implementation
         * changed such that the java.io.tmpdir string no longer terminates
         * with a File.separator character.
         */
        if (tmpdir.lastIndexOf(File.separator) != (tmpdir.length()-1)) {
            tmpdir = tmpdir + File.separator;
        }
        tmpDirName = tmpdir;
    }

    public static PlatformSupport getInstance() {
        try {
            Class<?> c = Class.forName("sun.jvmstat.PlatformSupportImpl");
            @SuppressWarnings("unchecked")
            Constructor<PlatformSupport> cntr = (Constructor<PlatformSupport>) c.getConstructor();
            return cntr.newInstance();
        } catch (ClassNotFoundException e) {
            return new PlatformSupport();
        } catch (ReflectiveOperationException e) {
            throw new InternalError(e);
        }
    }

    // package-private
    PlatformSupport() {}

    /*
     * Return the OS specific temporary directory
     */
    public static String getTemporaryDirectory() {
        return tmpDirName;
    }

    /*
     * Return a list of the temporary directories that the VM uses
     * for the attach and perf data files.  This function returns
     * the traditional temp directory in addition to any paths
     * accessible by the host which map to temp directories used
     * by containers. The container functionality is only currently
     * supported on Linux platforms.
     *
     * It is important that this directory is well-known and the
     * same for all VM instances. It cannot be affected by configuration
     * variables such as java.io.tmpdir.
     */
    public List<String> getTemporaryDirectories(int vmid) {
        // Add the default temporary directory only
        return List.of(tmpDirName);
    }

    /*
     * Extract the host PID from a file path.
     */
    public int getLocalVmId(File file) throws NumberFormatException {
        return Integer.parseInt(file.getName());
    }


    /*
     * Return the inner most namespaced PID if there is one,
     * otherwise return the original PID.
     */
    public int getNamespaceVmId(int pid) {
        return pid;
    }
}