LUtils.java revision 10967:e336cbd8b15e
138032Speter/*
238032Speter * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
338032Speter * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
438032Speter *
538032Speter * This code is free software; you can redistribute it and/or modify it
638032Speter * under the terms of the GNU General Public License version 2 only, as
738032Speter * published by the Free Software Foundation.
838032Speter *
938032Speter * This code is distributed in the hope that it will be useful, but WITHOUT
1038032Speter * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1138032Speter * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1238032Speter * version 2 for more details (a copy is included in the LICENSE file that
1338032Speter * accompanied this code).
1438032Speter *
1538032Speter * You should have received a copy of the GNU General Public License version
1638032Speter * 2 along with this work; if not, write to the Free Software Foundation,
1738032Speter * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1838032Speter *
1938032Speter * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2038032Speter * or visit www.oracle.com if you need additional information or have any
2138032Speter * questions.
2238032Speter */
2338032Speter
2438032Speterimport java.io.BufferedReader;
2538032Speterimport java.io.File;
2638032Speterimport java.io.IOException;
2738032Speterimport java.io.InputStreamReader;
2838032Speterimport java.io.PrintWriter;
2938032Speterimport java.io.StringWriter;
3038032Speterimport java.nio.charset.Charset;
3138032Speterimport java.nio.file.Files;
3238032Speterimport java.util.ArrayList;
3338032Speterimport java.util.List;
3438032Speterimport java.util.Map;
3538032Speter
3638032Speter/*
3738032Speter * support infrastructure to invoke a java class from the command line
3838032Speter */
3938032Speterclass LUtils {
4038032Speter    static final com.sun.tools.javac.Main javac =
4138032Speter            new com.sun.tools.javac.Main();
4238032Speter    static final File cwd = new File(".").getAbsoluteFile();
4338032Speter    static final String JAVAHOME = System.getProperty("java.home");
4438032Speter    static final boolean isWindows =
4538032Speter            System.getProperty("os.name", "unknown").startsWith("Windows");
4638032Speter    static final File JAVA_BIN_FILE = new File(JAVAHOME, "bin");
4738032Speter    static final File JAVA_CMD = new File(JAVA_BIN_FILE,
4838032Speter            isWindows ? "java.exe" : "java");
4938032Speter    static final File JAR_BIN_FILE = new File(JAVAHOME, "bin");
5038032Speter    static final File JAR_CMD = new File(JAR_BIN_FILE,
5138032Speter            isWindows ? "jar.exe" : "jar");
5238032Speter
5338032Speter    protected LUtils() {
5438032Speter    }
5538032Speter
5638032Speter    public static void compile(String... args) {
5738032Speter        if (javac.compile(args) != 0) {
5838032Speter            throw new RuntimeException("compilation fails");
5938032Speter        }
6038032Speter    }
6138032Speter
6238032Speter    static void createFile(File outFile, List<String> content) {
6338032Speter        try {
6438032Speter            Files.write(outFile.getAbsoluteFile().toPath(), content,
6538032Speter                    Charset.defaultCharset());
6638032Speter        } catch (IOException ex) {
6738032Speter            throw new RuntimeException(ex);
6838032Speter        }
6938032Speter    }
7038032Speter
7138032Speter    static File getClassFile(File javaFile) {
7238032Speter        return javaFile.getName().endsWith(".java")
7338032Speter                ? new File(javaFile.getName().replace(".java", ".class"))
7438032Speter                : null;
7538032Speter    }
7638032Speter
7738032Speter    static String getSimpleName(File inFile) {
7838032Speter        String fname = inFile.getName();
7938032Speter        return fname.substring(0, fname.indexOf("."));
8038032Speter    }
8138032Speter
8238032Speter    static TestResult doExec(String... cmds) {
8338032Speter        return doExec(null, null, cmds);
8438032Speter    }
8538032Speter
8638032Speter    /*
8738032Speter     * A method which executes a java cmd and returns the results in a container
8838032Speter     */
8938032Speter    static TestResult doExec(Map<String, String> envToSet,
9038032Speter            java.util.Set<String> envToRemove, String... cmds) {
9138032Speter        String cmdStr = "";
9238032Speter        for (String x : cmds) {
9338032Speter            cmdStr = cmdStr.concat(x + " ");
9438032Speter        }
9538032Speter        ProcessBuilder pb = new ProcessBuilder(cmds);
9638032Speter        Map<String, String> env = pb.environment();
9738032Speter        if (envToRemove != null) {
9838032Speter            for (String key : envToRemove) {
9938032Speter                env.remove(key);
10038032Speter            }
10138032Speter        }
10238032Speter        if (envToSet != null) {
10338032Speter            env.putAll(envToSet);
10438032Speter        }
10538032Speter        BufferedReader rdr = null;
10638032Speter        try {
10738032Speter            List<String> outputList = new ArrayList<>();
10838032Speter            pb.redirectErrorStream(true);
10938032Speter            Process p = pb.start();
11038032Speter            rdr = new BufferedReader(new InputStreamReader(p.getInputStream()));
11138032Speter            String in = rdr.readLine();
11238032Speter            while (in != null) {
11338032Speter                outputList.add(in);
11438032Speter                in = rdr.readLine();
11538032Speter            }
11638032Speter            p.waitFor();
11738032Speter            p.destroy();
11838032Speter
11938032Speter            return new TestResult(cmdStr, p.exitValue(), outputList,
12038032Speter                    env, new Throwable("current stack of the test"));
12138032Speter        } catch (Exception ex) {
12238032Speter            ex.printStackTrace();
12338032Speter            throw new RuntimeException(ex.getMessage());
12438032Speter        }
12538032Speter    }
12638032Speter
12738032Speter    static class TestResult {
12838032Speter        String cmd;
12938032Speter        int exitValue;
13038032Speter        List<String> testOutput;
13138032Speter        Map<String, String> env;
13238032Speter        Throwable t;
13338032Speter
13438032Speter        public TestResult(String str, int rv, List<String> oList,
13538032Speter                Map<String, String> env, Throwable t) {
13638032Speter            cmd = str;
13738032Speter            exitValue = rv;
13838032Speter            testOutput = oList;
13938032Speter            this.env = env;
14038032Speter            this.t = t;
14138032Speter        }
14238032Speter
14338032Speter        void assertZero(String message) {
14438032Speter            if (exitValue != 0) {
14538032Speter                System.err.println(this);
14638032Speter                throw new RuntimeException(message);
14738032Speter            }
14838032Speter        }
14938032Speter
15038032Speter        @Override
15138032Speter        public String toString() {
15238032Speter            StringWriter sw = new StringWriter();
15338032Speter            PrintWriter status = new PrintWriter(sw);
15438032Speter            status.println("Cmd: " + cmd);
15538032Speter            status.println("Return code: " + exitValue);
15638032Speter            status.println("Environment variable:");
15738032Speter            for (String x : env.keySet()) {
15838032Speter                status.println("\t" + x + "=" + env.get(x));
15938032Speter            }
16038032Speter            status.println("Output:");
16138032Speter            for (String x : testOutput) {
16238032Speter                status.println("\t" + x);
16338032Speter            }
16438032Speter            status.println("Exception:");
16538032Speter            status.println(t.getMessage());
16638032Speter            t.printStackTrace(status);
16738032Speter
16838032Speter            return sw.getBuffer().toString();
16938032Speter        }
17038032Speter    }
17138032Speter}
17238032Speter