1 /*
2 * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package org.openjdk.asmtools.common;
24
25
26 import java.io.DataInputStream;
27 import java.io.FileInputStream;
28 import java.io.IOException;
29 import java.io.PrintWriter;
30 import java.net.URI;
31 import java.net.URISyntaxException;
32 import java.net.URL;
33 import java.net.URLConnection;
34 import java.util.function.BooleanSupplier;
35 import java.util.function.Consumer;
36
37 public abstract class Tool {
38
39 // Name of the program.
40 protected final String programName;
41 // Errors counter.
42 protected int nerrors = 0;
43 // The stream where error message are printed.
44 protected PrintWriter err;
45
46 // Output stream
47 protected PrintWriter out;
48
49 // A consumer to print a error message if the tool can't read a file
50 protected Consumer<String> printCannotReadMsg;
51
52 // A supplier to get a status of a debug flag
53 protected BooleanSupplier DebugFlag = () -> false;
54
55 public Tool(PrintWriter out, String programName) {
56 this(out, out, programName);
57 }
58
59 public Tool(PrintWriter out, PrintWriter err, String programName) {
60 this.out = out;
61 this.err = err;
62 this.programName = programName;
63 }
64
65
66 public String getError(String msg) {
67 return programName + ": " + msg;
68 }
69
70 /**
71 * Top level error message
72 */
73 public void error(String msg) {
74 err.println(getError(msg));
75 err.flush();
76 }
77
78 /**
79 * Top level print message
80 */
81 public void println(String msg) {
82 out.println(msg);
83 out.flush();
84 }
85
86 public void println() {
87 println("");
88 }
89
90 public void print(String msg) {
91 out.print(getError(msg));
92 out.flush();
93 }
94
95 /**
96 * @param fname file name
97 * @return DataInputStream or null if the method can't read a file
98 */
99 public DataInputStream getDataInputStream(String fname) {
100 try {
101 return new DataInputStream(new FileInputStream(fname));
102 } catch (IOException ex) {
103 if (fname.matches("^[A-Za-z]+:.*")) {
104 try {
105 final URI uri = new URI(fname);
106 final URL url = uri.toURL();
107 final URLConnection conn = url.openConnection();
108 conn.setUseCaches(false);
109 return new DataInputStream(conn.getInputStream());
110 } catch (URISyntaxException | IOException e) {
111 if (DebugFlag.getAsBoolean())
112 e.printStackTrace();
113 }
114 }
115 if (printCannotReadMsg != null)
116 printCannotReadMsg.accept(fname);
117 }
118 return null;
119 }
120
121 /**
122 * Usage
123 */
124 protected abstract void usage();
125 }