langtools/test/tools/lib/toolbox/ToolBox.java
author ksrini
Wed, 19 Oct 2016 14:51:20 -0700
changeset 41633 eec0f5b0465f
parent 39105 956490b8da9c
permissions -rw-r--r--
8167383: Javadoc does not handle packages correctly when used with module option. Reviewed-by: bpatel, jjg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36778
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
     1
/*
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
     2
 * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
     4
 *
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
     7
 * published by the Free Software Foundation.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
     8
 *
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    13
 * accompanied this code).
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    14
 *
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    18
 *
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    21
 * questions.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    22
 */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    23
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    24
package toolbox;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    25
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    26
import java.io.BufferedWriter;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    27
import java.io.ByteArrayOutputStream;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    28
import java.io.FilterOutputStream;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    29
import java.io.FilterWriter;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    30
import java.io.IOException;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    31
import java.io.OutputStream;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    32
import java.io.PrintStream;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    33
import java.io.StringWriter;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    34
import java.io.Writer;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    35
import java.net.URI;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    36
import java.nio.charset.Charset;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    37
import java.nio.file.FileVisitResult;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    38
import java.nio.file.Files;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    39
import java.nio.file.Path;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    40
import java.nio.file.Paths;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    41
import java.nio.file.SimpleFileVisitor;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    42
import java.nio.file.StandardCopyOption;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    43
import java.nio.file.attribute.BasicFileAttributes;
37758
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
    44
import java.util.ArrayList;
36778
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    45
import java.util.Arrays;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    46
import java.util.Collections;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    47
import java.util.HashMap;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    48
import java.util.List;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    49
import java.util.Locale;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    50
import java.util.Map;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    51
import java.util.Objects;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    52
import java.util.Set;
37758
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
    53
import java.util.TreeSet;
36778
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    54
import java.util.regex.Matcher;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    55
import java.util.regex.Pattern;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    56
import java.util.stream.Collectors;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    57
import java.util.stream.StreamSupport;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    58
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    59
import javax.tools.FileObject;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    60
import javax.tools.ForwardingJavaFileManager;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    61
import javax.tools.JavaFileManager;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    62
import javax.tools.JavaFileObject;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    63
import javax.tools.JavaFileObject.Kind;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    64
import javax.tools.JavaFileManager.Location;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    65
import javax.tools.SimpleJavaFileObject;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    66
import javax.tools.ToolProvider;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    67
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    68
/**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    69
 * Utility methods and classes for writing jtreg tests for
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    70
 * javac, javah, javap, and sjavac. (For javadoc support,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    71
 * see JavadocTester.)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    72
 *
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    73
 * <p>There is support for common file operations similar to
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    74
 * shell commands like cat, cp, diff, mv, rm, grep.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    75
 *
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    76
 * <p>There is also support for invoking various tools, like
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    77
 * javac, javah, javap, jar, java and other JDK tools.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    78
 *
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    79
 * <p><em>File separators</em>: for convenience, many operations accept strings
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    80
 * to represent filenames. On all platforms on which JDK is supported,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    81
 * "/" is a legal filename component separator. In particular, even
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    82
 * on Windows, where the official file separator is "\", "/" is a legal
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    83
 * alternative. It is therefore recommended that any client code using
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    84
 * strings to specify filenames should use "/".
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    85
 *
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    86
 * @author Vicente Romero (original)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    87
 * @author Jonathan Gibbons (revised)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    88
 */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    89
public class ToolBox {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    90
    /** The platform line separator. */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    91
    public static final String lineSeparator = System.getProperty("line.separator");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    92
    /** The platform OS name. */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    93
    public static final String osName = System.getProperty("os.name");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    94
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    95
    /** The location of the class files for this test, or null if not set. */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    96
    public static final String testClasses = System.getProperty("test.classes");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    97
    /** The location of the source files for this test, or null if not set. */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    98
    public static final String testSrc = System.getProperty("test.src");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
    99
    /** The location of the test JDK for this test, or null if not set. */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   100
    public static final String testJDK = System.getProperty("test.jdk");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   101
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   102
    /** The current directory. */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   103
    public static final Path currDir = Paths.get(".");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   104
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   105
    /** The stream used for logging output. */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   106
    public PrintStream out = System.err;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   107
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   108
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   109
     * Checks if the host OS is some version of Windows.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   110
     * @return true if the host OS is some version of Windows
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   111
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   112
    public boolean isWindows() {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   113
        return osName.toLowerCase(Locale.ENGLISH).startsWith("windows");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   114
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   115
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   116
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   117
     * Splits a string around matches of the given regular expression.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   118
     * If the string is empty, an empty list will be returned.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   119
     * @param text the string to be split
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   120
     * @param sep  the delimiting regular expression
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   121
     * @return the strings between the separators
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   122
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   123
    public List<String> split(String text, String sep) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   124
        if (text.isEmpty())
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   125
            return Collections.emptyList();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   126
        return Arrays.asList(text.split(sep));
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   127
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   128
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   129
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   130
     * Checks if two lists of strings are equal.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   131
     * @param l1 the first list of strings to be compared
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   132
     * @param l2 the second list of strings to be compared
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   133
     * @throws Error if the lists are not equal
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   134
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   135
    public void checkEqual(List<String> l1, List<String> l2) throws Error {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   136
        if (!Objects.equals(l1, l2)) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   137
            // l1 and l2 cannot both be null
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   138
            if (l1 == null)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   139
                throw new Error("comparison failed: l1 is null");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   140
            if (l2 == null)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   141
                throw new Error("comparison failed: l2 is null");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   142
            // report first difference
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   143
            for (int i = 0; i < Math.min(l1.size(), l2.size()); i++) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   144
                String s1 = l1.get(i);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   145
                String s2 = l1.get(i);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   146
                if (!Objects.equals(s1, s2)) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   147
                    throw new Error("comparison failed, index " + i +
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   148
                            ", (" + s1 + ":" + s2 + ")");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   149
                }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   150
            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   151
            throw new Error("comparison failed: l1.size=" + l1.size() + ", l2.size=" + l2.size());
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   152
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   153
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   154
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   155
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   156
     * Filters a list of strings according to the given regular expression.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   157
     * @param regex the regular expression
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   158
     * @param lines the strings to be filtered
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   159
     * @return the strings matching the regular expression
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   160
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   161
    public List<String> grep(String regex, List<String> lines) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   162
        return grep(Pattern.compile(regex), lines);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   163
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   164
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   165
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   166
     * Filters a list of strings according to the given regular expression.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   167
     * @param pattern the regular expression
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   168
     * @param lines the strings to be filtered
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   169
     * @return the strings matching the regular expression
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   170
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   171
    public List<String> grep(Pattern pattern, List<String> lines) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   172
        return lines.stream()
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   173
                .filter(s -> pattern.matcher(s).find())
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   174
                .collect(Collectors.toList());
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   175
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   176
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   177
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   178
     * Copies a file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   179
     * If the given destination exists and is a directory, the copy is created
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   180
     * in that directory.  Otherwise, the copy will be placed at the destination,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   181
     * possibly overwriting any existing file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   182
     * <p>Similar to the shell "cp" command: {@code cp from to}.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   183
     * @param from the file to be copied
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   184
     * @param to where to copy the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   185
     * @throws IOException if any error occurred while copying the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   186
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   187
    public void copyFile(String from, String to) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   188
        copyFile(Paths.get(from), Paths.get(to));
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   189
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   190
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   191
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   192
     * Copies a file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   193
     * If the given destination exists and is a directory, the copy is created
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   194
     * in that directory.  Otherwise, the copy will be placed at the destination,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   195
     * possibly overwriting any existing file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   196
     * <p>Similar to the shell "cp" command: {@code cp from to}.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   197
     * @param from the file to be copied
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   198
     * @param to where to copy the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   199
     * @throws IOException if an error occurred while copying the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   200
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   201
    public void copyFile(Path from, Path to) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   202
        if (Files.isDirectory(to)) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   203
            to = to.resolve(from.getFileName());
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   204
        } else {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   205
            Files.createDirectories(to.getParent());
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   206
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   207
        Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   208
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   209
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   210
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   211
     * Creates one of more directories.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   212
     * For each of the series of paths, a directory will be created,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   213
     * including any necessary parent directories.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   214
     * <p>Similar to the shell command: {@code mkdir -p paths}.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   215
     * @param paths the directories to be created
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   216
     * @throws IOException if an error occurred while creating the directories
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   217
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   218
    public void createDirectories(String... paths) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   219
        if (paths.length == 0)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   220
            throw new IllegalArgumentException("no directories specified");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   221
        for (String p : paths)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   222
            Files.createDirectories(Paths.get(p));
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   223
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   224
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   225
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   226
     * Creates one or more directories.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   227
     * For each of the series of paths, a directory will be created,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   228
     * including any necessary parent directories.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   229
     * <p>Similar to the shell command: {@code mkdir -p paths}.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   230
     * @param paths the directories to be created
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   231
     * @throws IOException if an error occurred while creating the directories
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   232
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   233
    public void createDirectories(Path... paths) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   234
        if (paths.length == 0)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   235
            throw new IllegalArgumentException("no directories specified");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   236
        for (Path p : paths)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   237
            Files.createDirectories(p);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   238
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   239
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   240
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   241
     * Deletes one or more files.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   242
     * Any directories to be deleted must be empty.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   243
     * <p>Similar to the shell command: {@code rm files}.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   244
     * @param files the files to be deleted
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   245
     * @throws IOException if an error occurred while deleting the files
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   246
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   247
    public void deleteFiles(String... files) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   248
        if (files.length == 0)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   249
            throw new IllegalArgumentException("no files specified");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   250
        for (String file : files)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   251
            Files.delete(Paths.get(file));
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   252
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   253
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   254
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   255
     * Deletes all content of a directory (but not the directory itself).
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   256
     * @param root the directory to be cleaned
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   257
     * @throws IOException if an error occurs while cleaning the directory
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   258
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   259
    public void cleanDirectory(Path root) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   260
        if (!Files.isDirectory(root)) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   261
            throw new IOException(root + " is not a directory");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   262
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   263
        Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   264
            @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   265
            public FileVisitResult visitFile(Path file, BasicFileAttributes a) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   266
                Files.delete(file);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   267
                return FileVisitResult.CONTINUE;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   268
            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   269
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   270
            @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   271
            public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   272
                if (e != null) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   273
                    throw e;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   274
                }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   275
                if (!dir.equals(root)) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   276
                    Files.delete(dir);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   277
                }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   278
                return FileVisitResult.CONTINUE;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   279
            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   280
        });
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   281
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   282
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   283
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   284
     * Moves a file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   285
     * If the given destination exists and is a directory, the file will be moved
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   286
     * to that directory.  Otherwise, the file will be moved to the destination,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   287
     * possibly overwriting any existing file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   288
     * <p>Similar to the shell "mv" command: {@code mv from to}.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   289
     * @param from the file to be moved
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   290
     * @param to where to move the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   291
     * @throws IOException if an error occurred while moving the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   292
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   293
    public void moveFile(String from, String to) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   294
        moveFile(Paths.get(from), Paths.get(to));
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   295
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   296
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   297
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   298
     * Moves a file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   299
     * If the given destination exists and is a directory, the file will be moved
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   300
     * to that directory.  Otherwise, the file will be moved to the destination,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   301
     * possibly overwriting any existing file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   302
     * <p>Similar to the shell "mv" command: {@code mv from to}.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   303
     * @param from the file to be moved
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   304
     * @param to where to move the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   305
     * @throws IOException if an error occurred while moving the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   306
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   307
    public void moveFile(Path from, Path to) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   308
        if (Files.isDirectory(to)) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   309
            to = to.resolve(from.getFileName());
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   310
        } else {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   311
            Files.createDirectories(to.getParent());
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   312
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   313
        Files.move(from, to, StandardCopyOption.REPLACE_EXISTING);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   314
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   315
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   316
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   317
     * Reads the lines of a file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   318
     * The file is read using the default character encoding.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   319
     * @param path the file to be read
37758
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   320
     * @return the lines of the file
36778
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   321
     * @throws IOException if an error occurred while reading the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   322
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   323
    public List<String> readAllLines(String path) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   324
        return readAllLines(path, null);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   325
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   326
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   327
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   328
     * Reads the lines of a file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   329
     * The file is read using the default character encoding.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   330
     * @param path the file to be read
37758
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   331
     * @return the lines of the file
36778
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   332
     * @throws IOException if an error occurred while reading the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   333
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   334
    public List<String> readAllLines(Path path) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   335
        return readAllLines(path, null);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   336
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   337
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   338
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   339
     * Reads the lines of a file using the given encoding.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   340
     * @param path the file to be read
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   341
     * @param encoding the encoding to be used to read the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   342
     * @return the lines of the file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   343
     * @throws IOException if an error occurred while reading the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   344
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   345
    public List<String> readAllLines(String path, String encoding) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   346
        return readAllLines(Paths.get(path), encoding);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   347
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   348
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   349
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   350
     * Reads the lines of a file using the given encoding.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   351
     * @param path the file to be read
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   352
     * @param encoding the encoding to be used to read the file
37758
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   353
     * @return the lines of the file
36778
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   354
     * @throws IOException if an error occurred while reading the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   355
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   356
    public List<String> readAllLines(Path path, String encoding) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   357
        return Files.readAllLines(path, getCharset(encoding));
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   358
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   359
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   360
    private Charset getCharset(String encoding) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   361
        return (encoding == null) ? Charset.defaultCharset() : Charset.forName(encoding);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   362
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   363
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   364
    /**
37758
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   365
     * Find .java files in one or more directories.
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   366
     * <p>Similar to the shell "find" command: {@code find paths -name \*.java}.
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   367
     * @param paths the directories in which to search for .java files
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   368
     * @return the .java files found
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   369
     * @throws IOException if an error occurred while searching for files
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   370
     */
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   371
    public Path[] findJavaFiles(Path... paths) throws IOException {
39105
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   372
        return findFiles(".java", paths);
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   373
    }
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   374
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   375
    /**
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   376
     * Find files matching the file extension, in one or more directories.
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   377
     * <p>Similar to the shell "find" command: {@code find paths -name \*.ext}.
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   378
     * @param fileExtension the extension to search for
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   379
     * @param paths the directories in which to search for files
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   380
     * @return the files matching the file extension
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   381
     * @throws IOException if an error occurred while searching for files
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   382
     */
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   383
    public Path[] findFiles(String fileExtension, Path... paths) throws IOException {
37758
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   384
        Set<Path> files = new TreeSet<>();  // use TreeSet to force a consistent order
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   385
        for (Path p : paths) {
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   386
            Files.walkFileTree(p, new SimpleFileVisitor<Path>() {
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   387
                @Override
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   388
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   389
                        throws IOException {
39105
956490b8da9c 8159756: javadoc tests needs a tool invoker
ksrini
parents: 37758
diff changeset
   390
                    if (file.getFileName().toString().endsWith(fileExtension)) {
37758
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   391
                        files.add(file);
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   392
                    }
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   393
                    return FileVisitResult.CONTINUE;
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   394
                }
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   395
            });
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   396
        }
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   397
        return files.toArray(new Path[files.size()]);
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   398
    }
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   399
3ecf9b414e05 8155774: move code from ModuleTestBase to toolbox
jjg
parents: 36778
diff changeset
   400
    /**
36778
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   401
     * Writes a file containing the given content.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   402
     * Any necessary directories for the file will be created.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   403
     * @param path where to write the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   404
     * @param content the content for the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   405
     * @throws IOException if an error occurred while writing the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   406
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   407
    public void writeFile(String path, String content) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   408
        writeFile(Paths.get(path), content);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   409
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   410
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   411
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   412
     * Writes a file containing the given content.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   413
     * Any necessary directories for the file will be created.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   414
     * @param path where to write the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   415
     * @param content the content for the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   416
     * @throws IOException if an error occurred while writing the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   417
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   418
    public void writeFile(Path path, String content) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   419
        Path dir = path.getParent();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   420
        if (dir != null)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   421
            Files.createDirectories(dir);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   422
        try (BufferedWriter w = Files.newBufferedWriter(path)) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   423
            w.write(content);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   424
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   425
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   426
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   427
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   428
     * Writes one or more files containing Java source code.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   429
     * For each file to be written, the filename will be inferred from the
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   430
     * given base directory, the package declaration (if present) and from the
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   431
     * the name of the first class, interface or enum declared in the file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   432
     * <p>For example, if the base directory is /my/dir/ and the content
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   433
     * contains "package p; class C { }", the file will be written to
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   434
     * /my/dir/p/C.java.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   435
     * <p>Note: the content is analyzed using regular expressions;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   436
     * errors can occur if any contents have initial comments that might trip
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   437
     * up the analysis.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   438
     * @param dir the base directory
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   439
     * @param contents the contents of the files to be written
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   440
     * @throws IOException if an error occurred while writing any of the files.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   441
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   442
    public void writeJavaFiles(Path dir, String... contents) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   443
        if (contents.length == 0)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   444
            throw new IllegalArgumentException("no content specified for any files");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   445
        for (String c : contents) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   446
            new JavaSource(c).write(dir);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   447
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   448
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   449
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   450
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   451
     * Returns the path for the binary of a JDK tool within {@link testJDK}.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   452
     * @param tool the name of the tool
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   453
     * @return the path of the tool
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   454
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   455
    public Path getJDKTool(String tool) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   456
        return Paths.get(testJDK, "bin", tool);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   457
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   458
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   459
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   460
     * Returns a string representing the contents of an {@code Iterable} as a list.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   461
     * @param <T> the type parameter of the {@code Iterable}
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   462
     * @param items the iterable
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   463
     * @return the string
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   464
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   465
    <T> String toString(Iterable<T> items) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   466
        return StreamSupport.stream(items.spliterator(), false)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   467
                .map(Objects::toString)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   468
                .collect(Collectors.joining(",", "[", "]"));
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   469
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   470
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   471
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   472
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   473
     * An in-memory Java source file.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   474
     * It is able to extract the file name from simple source text using
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   475
     * regular expressions.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   476
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   477
    public static class JavaSource extends SimpleJavaFileObject {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   478
        private final String source;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   479
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   480
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   481
         * Creates a in-memory file object for Java source code.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   482
         * @param className the name of the class
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   483
         * @param source the source text
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   484
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   485
        public JavaSource(String className, String source) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   486
            super(URI.create(className), JavaFileObject.Kind.SOURCE);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   487
            this.source = source;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   488
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   489
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   490
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   491
         * Creates a in-memory file object for Java source code.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   492
         * The name of the class will be inferred from the source code.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   493
         * @param source the source text
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   494
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   495
        public JavaSource(String source) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   496
            super(URI.create(getJavaFileNameFromSource(source)),
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   497
                    JavaFileObject.Kind.SOURCE);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   498
            this.source = source;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   499
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   500
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   501
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   502
         * Writes the source code to a file in the current directory.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   503
         * @throws IOException if there is a problem writing the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   504
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   505
        public void write() throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   506
            write(currDir);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   507
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   508
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   509
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   510
         * Writes the source code to a file in a specified directory.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   511
         * @param dir the directory
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   512
         * @throws IOException if there is a problem writing the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   513
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   514
        public void write(Path dir) throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   515
            Path file = dir.resolve(getJavaFileNameFromSource(source));
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   516
            Files.createDirectories(file.getParent());
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   517
            try (BufferedWriter out = Files.newBufferedWriter(file)) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   518
                out.write(source.replace("\n", lineSeparator));
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   519
            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   520
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   521
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   522
        @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   523
        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   524
            return source;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   525
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   526
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   527
        private static Pattern modulePattern =
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   528
                Pattern.compile("module\\s+((?:\\w+\\.)*)");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   529
        private static Pattern packagePattern =
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   530
                Pattern.compile("package\\s+(((?:\\w+\\.)*)(?:\\w+))");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   531
        private static Pattern classPattern =
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   532
                Pattern.compile("(?:public\\s+)?(?:class|enum|interface)\\s+(\\w+)");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   533
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   534
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   535
         * Extracts the Java file name from the class declaration.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   536
         * This method is intended for simple files and uses regular expressions,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   537
         * so comments matching the pattern can make the method fail.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   538
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   539
        static String getJavaFileNameFromSource(String source) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   540
            String packageName = null;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   541
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   542
            Matcher matcher = modulePattern.matcher(source);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   543
            if (matcher.find())
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   544
                return "module-info.java";
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   545
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   546
            matcher = packagePattern.matcher(source);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   547
            if (matcher.find())
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   548
                packageName = matcher.group(1).replace(".", "/");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   549
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   550
            matcher = classPattern.matcher(source);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   551
            if (matcher.find()) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   552
                String className = matcher.group(1) + ".java";
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   553
                return (packageName == null) ? className : packageName + "/" + className;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   554
            } else if (packageName != null) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   555
                return packageName + "/package-info.java";
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   556
            } else {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   557
                throw new Error("Could not extract the java class " +
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   558
                        "name from the provided source");
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   559
            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   560
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   561
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   562
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   563
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   564
     * Extracts the Java file name from the class declaration.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   565
     * This method is intended for simple files and uses regular expressions,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   566
     * so comments matching the pattern can make the method fail.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   567
     * @deprecated This is a legacy method for compatibility with ToolBox v1.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   568
     *      Use {@link JavaSource#getName JavaSource.getName} instead.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   569
     * @param source the source text
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   570
     * @return the Java file name inferred from the source
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   571
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   572
    @Deprecated
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   573
    public static String getJavaFileNameFromSource(String source) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   574
        return JavaSource.getJavaFileNameFromSource(source);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   575
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   576
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   577
    /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   578
     * A memory file manager, for saving generated files in memory.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   579
     * The file manager delegates to a separate file manager for listing and
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   580
     * reading input files.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   581
     */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   582
    public static class MemoryFileManager extends ForwardingJavaFileManager {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   583
        private interface Content {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   584
            byte[] getBytes();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   585
            String getString();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   586
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   587
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   588
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   589
         * Maps binary class names to generated content.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   590
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   591
        private final Map<Location, Map<String, Content>> files;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   592
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   593
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   594
         * Construct a memory file manager which stores output files in memory,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   595
         * and delegates to a default file manager for input files.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   596
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   597
        public MemoryFileManager() {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   598
            this(ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null));
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   599
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   600
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   601
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   602
         * Construct a memory file manager which stores output files in memory,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   603
         * and delegates to a specified file manager for input files.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   604
         * @param fileManager the file manager to be used for input files
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   605
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   606
        public MemoryFileManager(JavaFileManager fileManager) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   607
            super(fileManager);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   608
            files = new HashMap<>();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   609
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   610
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   611
        @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   612
        public JavaFileObject getJavaFileForOutput(Location location,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   613
                                                   String name,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   614
                                                   JavaFileObject.Kind kind,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   615
                                                   FileObject sibling)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   616
        {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   617
            return new MemoryFileObject(location, name, kind);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   618
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   619
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   620
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   621
         * Returns the set of names of files that have been written to a given
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   622
         * location.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   623
         * @param location the location
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   624
         * @return the set of file names
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   625
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   626
        public Set<String> getFileNames(Location location) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   627
            Map<String, Content> filesForLocation = files.get(location);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   628
            return (filesForLocation == null)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   629
                ? Collections.emptySet() : filesForLocation.keySet();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   630
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   631
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   632
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   633
         * Returns the content written to a file in a given location,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   634
         * or null if no such file has been written.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   635
         * @param location the location
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   636
         * @param name the name of the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   637
         * @return the content as an array of bytes
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   638
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   639
        public byte[] getFileBytes(Location location, String name) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   640
            Content content = getFile(location, name);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   641
            return (content == null) ? null : content.getBytes();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   642
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   643
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   644
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   645
         * Returns the content written to a file in a given location,
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   646
         * or null if no such file has been written.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   647
         * @param location the location
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   648
         * @param name the name of the file
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   649
         * @return the content as a string
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   650
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   651
        public String getFileString(Location location, String name) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   652
            Content content = getFile(location, name);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   653
            return (content == null) ? null : content.getString();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   654
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   655
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   656
        private Content getFile(Location location, String name) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   657
            Map<String, Content> filesForLocation = files.get(location);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   658
            return (filesForLocation == null) ? null : filesForLocation.get(name);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   659
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   660
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   661
        private void save(Location location, String name, Content content) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   662
            Map<String, Content> filesForLocation = files.get(location);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   663
            if (filesForLocation == null)
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   664
                files.put(location, filesForLocation = new HashMap<>());
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   665
            filesForLocation.put(name, content);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   666
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   667
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   668
        /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   669
         * A writable file object stored in memory.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   670
         */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   671
        private class MemoryFileObject extends SimpleJavaFileObject {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   672
            private final Location location;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   673
            private final String name;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   674
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   675
            /**
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   676
             * Constructs a memory file object.
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   677
             * @param name binary name of the class to be stored in this file object
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   678
             */
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   679
            MemoryFileObject(Location location, String name, JavaFileObject.Kind kind) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   680
                super(URI.create("mfm:///" + name.replace('.','/') + kind.extension),
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   681
                      Kind.CLASS);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   682
                this.location = location;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   683
                this.name = name;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   684
            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   685
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   686
            @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   687
            public OutputStream openOutputStream() {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   688
                return new FilterOutputStream(new ByteArrayOutputStream()) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   689
                    @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   690
                    public void close() throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   691
                        out.close();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   692
                        byte[] bytes = ((ByteArrayOutputStream) out).toByteArray();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   693
                        save(location, name, new Content() {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   694
                            @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   695
                            public byte[] getBytes() {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   696
                                return bytes;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   697
                            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   698
                            @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   699
                            public String getString() {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   700
                                return new String(bytes);
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   701
                            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   702
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   703
                        });
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   704
                    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   705
                };
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   706
            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   707
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   708
            @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   709
            public Writer openWriter() {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   710
                return new FilterWriter(new StringWriter()) {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   711
                    @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   712
                    public void close() throws IOException {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   713
                        out.close();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   714
                        String text = ((StringWriter) out).toString();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   715
                        save(location, name, new Content() {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   716
                            @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   717
                            public byte[] getBytes() {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   718
                                return text.getBytes();
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   719
                            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   720
                            @Override
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   721
                            public String getString() {
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   722
                                return text;
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   723
                            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   724
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   725
                        });
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   726
                    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   727
                };
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   728
            }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   729
        }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   730
    }
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   731
}
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents:
diff changeset
   732