author | goetz |
Tue, 16 Jan 2018 08:48:34 +0100 | |
changeset 48543 | 7067fe4e054e |
parent 47216 | 71c04702a3d5 |
child 48913 | 7f9c3cd11e97 |
permissions | -rw-r--r-- |
36511 | 1 |
/* |
48543
7067fe4e054e
8189102: All tools should support -?, -h and --help
goetz
parents:
47216
diff
changeset
|
2 |
* Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. |
36511 | 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. Oracle designates this |
|
8 |
* particular file as subject to the "Classpath" exception as provided |
|
9 |
* by Oracle in the LICENSE file that accompanied this code. |
|
10 |
* |
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
15 |
* accompanied this code). |
|
16 |
* |
|
17 |
* You should have received a copy of the GNU General Public License version |
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 |
* |
|
21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
22 |
* or visit www.oracle.com if you need additional information or have any |
|
23 |
* questions. |
|
24 |
*/ |
|
25 |
||
26 |
package jdk.tools.jimage; |
|
27 |
||
28 |
import java.io.File; |
|
29 |
import java.io.IOException; |
|
30 |
import java.io.PrintWriter; |
|
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
31 |
import java.nio.file.FileSystem; |
36511 | 32 |
import java.nio.file.Files; |
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
33 |
import java.nio.file.PathMatcher; |
38870 | 34 |
import java.util.ArrayList; |
42174
fa763b059501
8168256: Plugin alias options in jlink --help output seems to be in an arbitrary order
jlaskey
parents:
41919
diff
changeset
|
35 |
import java.util.Arrays; |
36511 | 36 |
import java.util.LinkedList; |
37 |
import java.util.List; |
|
44367
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
38 |
import java.util.Locale; |
38869 | 39 |
import java.util.MissingResourceException; |
38870 | 40 |
import java.util.function.Predicate; |
44367
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
41 |
import java.util.stream.Collectors; |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
42 |
import java.util.stream.Stream; |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
43 |
|
36511 | 44 |
import jdk.internal.jimage.BasicImageReader; |
45 |
import jdk.internal.jimage.ImageHeader; |
|
46 |
import jdk.internal.jimage.ImageLocation; |
|
39762
935ffb4260ba
8158407: jimage: verify should do more extensive test
jlaskey
parents:
39150
diff
changeset
|
47 |
import jdk.internal.org.objectweb.asm.ClassReader; |
935ffb4260ba
8158407: jimage: verify should do more extensive test
jlaskey
parents:
39150
diff
changeset
|
48 |
import jdk.internal.org.objectweb.asm.tree.ClassNode; |
36511 | 49 |
import jdk.tools.jlink.internal.ImageResourcesTree; |
50 |
import jdk.tools.jlink.internal.TaskHelper; |
|
51 |
import jdk.tools.jlink.internal.TaskHelper.BadArgs; |
|
52 |
import static jdk.tools.jlink.internal.TaskHelper.JIMAGE_BUNDLE; |
|
53 |
import jdk.tools.jlink.internal.TaskHelper.Option; |
|
54 |
import jdk.tools.jlink.internal.TaskHelper.OptionsHelper; |
|
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
55 |
import jdk.tools.jlink.internal.Utils; |
36511 | 56 |
|
57 |
class JImageTask { |
|
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
58 |
private static final Option<?>[] RECOGNIZED_OPTIONS = { |
38869 | 59 |
new Option<JImageTask>(true, (task, option, arg) -> { |
36511 | 60 |
task.options.directory = arg; |
61 |
}, "--dir"), |
|
38870 | 62 |
|
63 |
new Option<JImageTask>(true, (task, option, arg) -> { |
|
39150
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
64 |
task.options.include = arg; |
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
65 |
}, "--include"), |
38870 | 66 |
|
38869 | 67 |
new Option<JImageTask>(false, (task, option, arg) -> { |
36511 | 68 |
task.options.fullVersion = true; |
40261
86a49ba76f52
8136930: Simplify use of module-system options by custom launchers
mchung
parents:
39762
diff
changeset
|
69 |
}, true, "--full-version"), |
38870 | 70 |
|
38869 | 71 |
new Option<JImageTask>(false, (task, option, arg) -> { |
36511 | 72 |
task.options.help = true; |
48543
7067fe4e054e
8189102: All tools should support -?, -h and --help
goetz
parents:
47216
diff
changeset
|
73 |
}, "--help", "-h", "-?"), |
38870 | 74 |
|
38869 | 75 |
new Option<JImageTask>(false, (task, option, arg) -> { |
36511 | 76 |
task.options.verbose = true; |
77 |
}, "--verbose"), |
|
38870 | 78 |
|
38869 | 79 |
new Option<JImageTask>(false, (task, option, arg) -> { |
36511 | 80 |
task.options.version = true; |
81 |
}, "--version") |
|
82 |
}; |
|
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
83 |
private static final TaskHelper TASK_HELPER |
36511 | 84 |
= new TaskHelper(JIMAGE_BUNDLE); |
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
85 |
private static final OptionsHelper<JImageTask> OPTION_HELPER |
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
86 |
= TASK_HELPER.newOptionsHelper(JImageTask.class, RECOGNIZED_OPTIONS); |
38870 | 87 |
private static final String PROGNAME = "jimage"; |
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
88 |
private static final FileSystem JRT_FILE_SYSTEM = Utils.jrtFileSystem(); |
38870 | 89 |
|
90 |
private final OptionsValues options; |
|
39150
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
91 |
private final List<Predicate<String>> includePredicates; |
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
92 |
private PrintWriter log; |
38870 | 93 |
|
94 |
JImageTask() { |
|
95 |
this.options = new OptionsValues(); |
|
39150
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
96 |
this.includePredicates = new ArrayList<>(); |
38870 | 97 |
log = null; |
98 |
} |
|
99 |
||
100 |
void setLog(PrintWriter out) { |
|
101 |
log = out; |
|
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
102 |
TASK_HELPER.setLog(log); |
38870 | 103 |
} |
36511 | 104 |
|
105 |
static class OptionsValues { |
|
44367
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
106 |
Task task = null; |
36511 | 107 |
String directory = "."; |
39150
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
108 |
String include = ""; |
36511 | 109 |
boolean fullVersion; |
110 |
boolean help; |
|
111 |
boolean verbose; |
|
112 |
boolean version; |
|
113 |
List<File> jimages = new LinkedList<>(); |
|
114 |
} |
|
115 |
||
116 |
enum Task { |
|
117 |
EXTRACT, |
|
118 |
INFO, |
|
119 |
LIST, |
|
120 |
VERIFY |
|
121 |
}; |
|
122 |
||
123 |
private String pad(String string, int width, boolean justifyRight) { |
|
124 |
int length = string.length(); |
|
125 |
||
126 |
if (length == width) { |
|
127 |
return string; |
|
128 |
} |
|
129 |
||
130 |
if (length > width) { |
|
131 |
return string.substring(0, width); |
|
132 |
} |
|
133 |
||
134 |
int padding = width - length; |
|
135 |
||
136 |
StringBuilder sb = new StringBuilder(width); |
|
137 |
if (justifyRight) { |
|
138 |
for (int i = 0; i < padding; i++) { |
|
139 |
sb.append(' '); |
|
140 |
} |
|
141 |
} |
|
142 |
||
143 |
sb.append(string); |
|
144 |
||
145 |
if (!justifyRight) { |
|
146 |
for (int i = 0; i < padding; i++) { |
|
147 |
sb.append(' '); |
|
148 |
} |
|
149 |
} |
|
150 |
||
151 |
return sb.toString(); |
|
152 |
} |
|
153 |
||
154 |
private String pad(String string, int width) { |
|
155 |
return pad(string, width, false); |
|
156 |
} |
|
157 |
||
158 |
private String pad(long value, int width) { |
|
159 |
return pad(Long.toString(value), width, true); |
|
160 |
} |
|
161 |
||
162 |
private static final int EXIT_OK = 0; // No errors. |
|
163 |
private static final int EXIT_ERROR = 1; // Completed but reported errors. |
|
164 |
private static final int EXIT_CMDERR = 2; // Bad command-line arguments and/or switches. |
|
165 |
private static final int EXIT_SYSERR = 3; // System error or resource exhaustion. |
|
166 |
private static final int EXIT_ABNORMAL = 4; // Terminated abnormally. |
|
167 |
||
168 |
int run(String[] args) { |
|
169 |
if (log == null) { |
|
38869 | 170 |
setLog(new PrintWriter(System.out, true)); |
36511 | 171 |
} |
38870 | 172 |
|
37613
2040f359c9b1
8082537: jimage should print usage when started with no args
jlaskey
parents:
36511
diff
changeset
|
173 |
if (args.length == 0) { |
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
174 |
log.println(TASK_HELPER.getMessage("main.usage.summary", PROGNAME)); |
37613
2040f359c9b1
8082537: jimage should print usage when started with no args
jlaskey
parents:
36511
diff
changeset
|
175 |
return EXIT_ABNORMAL; |
2040f359c9b1
8082537: jimage should print usage when started with no args
jlaskey
parents:
36511
diff
changeset
|
176 |
} |
38870 | 177 |
|
36511 | 178 |
try { |
44367
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
179 |
String command; |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
180 |
String[] remaining = args; |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
181 |
try { |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
182 |
command = args[0]; |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
183 |
options.task = Enum.valueOf(Task.class, args[0].toUpperCase(Locale.ENGLISH)); |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
184 |
remaining = args.length > 1 ? Arrays.copyOfRange(args, 1, args.length) |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
185 |
: new String[0]; |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
186 |
} catch (IllegalArgumentException ex) { |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
187 |
command = null; |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
188 |
options.task = null; |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
189 |
} |
38870 | 190 |
|
44367
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
191 |
// process arguments |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
192 |
List<String> unhandled = OPTION_HELPER.handleOptions(this, remaining); |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
193 |
for (String f : unhandled) { |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
194 |
options.jimages.add(new File(f)); |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
195 |
} |
38870 | 196 |
|
44367
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
197 |
if (options.task == null && !options.help && !options.version && !options.fullVersion) { |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
198 |
throw TASK_HELPER.newBadArgs("err.not.a.task", |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
199 |
command != null ? command : "<unspecified>"); |
36511 | 200 |
} |
38870 | 201 |
|
36511 | 202 |
if (options.help) { |
44367
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
203 |
if (options.task == null) { |
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
204 |
log.println(TASK_HELPER.getMessage("main.usage", PROGNAME)); |
42174
fa763b059501
8168256: Plugin alias options in jlink --help output seems to be in an arbitrary order
jlaskey
parents:
41919
diff
changeset
|
205 |
Arrays.asList(RECOGNIZED_OPTIONS).stream() |
fa763b059501
8168256: Plugin alias options in jlink --help output seems to be in an arbitrary order
jlaskey
parents:
41919
diff
changeset
|
206 |
.filter(option -> !option.isHidden()) |
fa763b059501
8168256: Plugin alias options in jlink --help output seems to be in an arbitrary order
jlaskey
parents:
41919
diff
changeset
|
207 |
.sorted() |
fa763b059501
8168256: Plugin alias options in jlink --help output seems to be in an arbitrary order
jlaskey
parents:
41919
diff
changeset
|
208 |
.forEach(option -> { |
fa763b059501
8168256: Plugin alias options in jlink --help output seems to be in an arbitrary order
jlaskey
parents:
41919
diff
changeset
|
209 |
log.println(TASK_HELPER.getMessage(option.resourceName())); |
fa763b059501
8168256: Plugin alias options in jlink --help output seems to be in an arbitrary order
jlaskey
parents:
41919
diff
changeset
|
210 |
}); |
39150
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
211 |
log.println(TASK_HELPER.getMessage("main.opt.footer")); |
38869 | 212 |
} else { |
213 |
try { |
|
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
214 |
log.println(TASK_HELPER.getMessage("main.usage." + |
38870 | 215 |
options.task.toString().toLowerCase())); |
38869 | 216 |
} catch (MissingResourceException ex) { |
44367
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
217 |
throw TASK_HELPER.newBadArgs("err.not.a.task", command); |
38869 | 218 |
} |
219 |
} |
|
220 |
return EXIT_OK; |
|
36511 | 221 |
} |
38870 | 222 |
|
36511 | 223 |
if (options.version || options.fullVersion) { |
44367
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
224 |
if (options.task == null && !unhandled.isEmpty()) { |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
225 |
throw TASK_HELPER.newBadArgs("err.not.a.task", |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
226 |
Stream.of(args).collect(Collectors.joining(" "))); |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
227 |
} |
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
228 |
|
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
229 |
TASK_HELPER.showVersion(options.fullVersion); |
38869 | 230 |
if (unhandled.isEmpty()) { |
231 |
return EXIT_OK; |
|
232 |
} |
|
36511 | 233 |
} |
38870 | 234 |
|
39150
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
235 |
processInclude(options.include); |
38870 | 236 |
|
38869 | 237 |
return run() ? EXIT_OK : EXIT_ERROR; |
36511 | 238 |
} catch (BadArgs e) { |
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
239 |
TASK_HELPER.reportError(e.key, e.args); |
38870 | 240 |
|
36511 | 241 |
if (e.showUsage) { |
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
242 |
log.println(TASK_HELPER.getMessage("main.usage.summary", PROGNAME)); |
36511 | 243 |
} |
38870 | 244 |
|
36511 | 245 |
return EXIT_CMDERR; |
246 |
} catch (Exception x) { |
|
247 |
x.printStackTrace(); |
|
38870 | 248 |
|
36511 | 249 |
return EXIT_ABNORMAL; |
250 |
} finally { |
|
251 |
log.flush(); |
|
252 |
} |
|
253 |
} |
|
254 |
||
39150
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
255 |
private void processInclude(String include) { |
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
256 |
if (include.isEmpty()) { |
38870 | 257 |
return; |
258 |
} |
|
259 |
||
39150
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
260 |
for (String filter : include.split(",")) { |
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
261 |
final PathMatcher matcher = Utils.getPathMatcher(JRT_FILE_SYSTEM, filter); |
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
262 |
Predicate<String> predicate = (path) -> matcher.matches(JRT_FILE_SYSTEM.getPath(path)); |
39150
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
263 |
includePredicates.add(predicate); |
38870 | 264 |
} |
265 |
} |
|
266 |
||
36511 | 267 |
private void listTitle(File file, BasicImageReader reader) { |
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
268 |
log.println("jimage: " + file); |
36511 | 269 |
} |
270 |
||
271 |
private interface JImageAction { |
|
272 |
public void apply(File file, BasicImageReader reader) throws IOException, BadArgs; |
|
273 |
} |
|
274 |
||
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
275 |
private interface ModuleAction { |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
276 |
public void apply(BasicImageReader reader, |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
277 |
String oldModule, String newModule) throws IOException, BadArgs; |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
278 |
} |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
279 |
|
36511 | 280 |
private interface ResourceAction { |
281 |
public void apply(BasicImageReader reader, String name, |
|
282 |
ImageLocation location) throws IOException, BadArgs; |
|
283 |
} |
|
284 |
||
285 |
private void extract(BasicImageReader reader, String name, |
|
286 |
ImageLocation location) throws IOException, BadArgs { |
|
287 |
File directory = new File(options.directory); |
|
288 |
byte[] bytes = reader.getResource(location); |
|
289 |
File resource = new File(directory, name); |
|
290 |
File parent = resource.getParentFile(); |
|
291 |
||
292 |
if (parent.exists()) { |
|
293 |
if (!parent.isDirectory()) { |
|
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
294 |
throw TASK_HELPER.newBadArgs("err.cannot.create.dir", |
38870 | 295 |
parent.getAbsolutePath()); |
36511 | 296 |
} |
297 |
} else if (!parent.mkdirs()) { |
|
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
298 |
throw TASK_HELPER.newBadArgs("err.cannot.create.dir", |
38870 | 299 |
parent.getAbsolutePath()); |
36511 | 300 |
} |
301 |
||
302 |
if (!ImageResourcesTree.isTreeInfoResource(name)) { |
|
303 |
Files.write(resource.toPath(), bytes); |
|
304 |
} |
|
305 |
} |
|
306 |
||
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
307 |
private static final int OFFSET_WIDTH = 12; |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
308 |
private static final int SIZE_WIDTH = 10; |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
309 |
private static final int COMPRESSEDSIZE_WIDTH = 10; |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
310 |
|
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
311 |
private String trimModule(String name) { |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
312 |
int offset = name.indexOf('/', 1); |
36511 | 313 |
|
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
314 |
if (offset != -1 && offset + 1 < name.length()) { |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
315 |
return name.substring(offset + 1); |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
316 |
} |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
317 |
|
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
318 |
return name; |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
319 |
} |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
320 |
|
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
321 |
private void print(String name, ImageLocation location) { |
36511 | 322 |
log.print(pad(location.getContentOffset(), OFFSET_WIDTH) + " "); |
323 |
log.print(pad(location.getUncompressedSize(), SIZE_WIDTH) + " "); |
|
324 |
log.print(pad(location.getCompressedSize(), COMPRESSEDSIZE_WIDTH) + " "); |
|
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
325 |
log.println(trimModule(name)); |
36511 | 326 |
} |
327 |
||
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
328 |
private void print(BasicImageReader reader, String name) { |
36511 | 329 |
if (options.verbose) { |
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
330 |
print(name, reader.findLocation(name)); |
36511 | 331 |
} else { |
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
332 |
log.println(" " + trimModule(name)); |
36511 | 333 |
} |
334 |
} |
|
335 |
||
336 |
private void info(File file, BasicImageReader reader) throws IOException { |
|
337 |
ImageHeader header = reader.getHeader(); |
|
338 |
||
339 |
log.println(" Major Version: " + header.getMajorVersion()); |
|
340 |
log.println(" Minor Version: " + header.getMinorVersion()); |
|
38869 | 341 |
log.println(" Flags: " + Integer.toHexString(header.getFlags())); |
36511 | 342 |
log.println(" Resource Count: " + header.getResourceCount()); |
343 |
log.println(" Table Length: " + header.getTableLength()); |
|
344 |
log.println(" Offsets Size: " + header.getOffsetsSize()); |
|
345 |
log.println(" Redirects Size: " + header.getRedirectSize()); |
|
346 |
log.println(" Locations Size: " + header.getLocationsSize()); |
|
347 |
log.println(" Strings Size: " + header.getStringsSize()); |
|
348 |
log.println(" Index Size: " + header.getIndexSize()); |
|
349 |
} |
|
350 |
||
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
351 |
private void listModule(BasicImageReader reader, String oldModule, String newModule) { |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
352 |
log.println(); |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
353 |
log.println("Module: " + newModule); |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
354 |
|
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
355 |
if (options.verbose) { |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
356 |
log.print(pad("Offset", OFFSET_WIDTH) + " "); |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
357 |
log.print(pad("Size", SIZE_WIDTH) + " "); |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
358 |
log.print(pad("Compressed", COMPRESSEDSIZE_WIDTH) + " "); |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
359 |
log.println("Entry"); |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
360 |
} |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
361 |
} |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
362 |
|
36511 | 363 |
private void list(BasicImageReader reader, String name, ImageLocation location) { |
364 |
print(reader, name); |
|
365 |
} |
|
366 |
||
38869 | 367 |
void verify(BasicImageReader reader, String name, ImageLocation location) { |
39762
935ffb4260ba
8158407: jimage: verify should do more extensive test
jlaskey
parents:
39150
diff
changeset
|
368 |
if (name.endsWith(".class") && !name.endsWith("module-info.class")) { |
935ffb4260ba
8158407: jimage: verify should do more extensive test
jlaskey
parents:
39150
diff
changeset
|
369 |
try { |
935ffb4260ba
8158407: jimage: verify should do more extensive test
jlaskey
parents:
39150
diff
changeset
|
370 |
byte[] bytes = reader.getResource(location); |
41919
612b698f8b8f
8159393: jlink should print a warning that a signed modular JAR will be treated as unsigned
jlaskey
parents:
40261
diff
changeset
|
371 |
ClassReader cr = new ClassReader(bytes); |
39762
935ffb4260ba
8158407: jimage: verify should do more extensive test
jlaskey
parents:
39150
diff
changeset
|
372 |
ClassNode cn = new ClassNode(); |
41919
612b698f8b8f
8159393: jlink should print a warning that a signed modular JAR will be treated as unsigned
jlaskey
parents:
40261
diff
changeset
|
373 |
cr.accept(cn, 0); |
39762
935ffb4260ba
8158407: jimage: verify should do more extensive test
jlaskey
parents:
39150
diff
changeset
|
374 |
} catch (Exception ex) { |
935ffb4260ba
8158407: jimage: verify should do more extensive test
jlaskey
parents:
39150
diff
changeset
|
375 |
log.println("Error(s) in Class: " + name); |
36511 | 376 |
} |
377 |
} |
|
378 |
} |
|
379 |
||
380 |
private void iterate(JImageAction jimageAction, |
|
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
381 |
ModuleAction moduleAction, |
36511 | 382 |
ResourceAction resourceAction) throws IOException, BadArgs { |
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
383 |
if (options.jimages.isEmpty()) { |
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
384 |
throw TASK_HELPER.newBadArgs("err.no.jimage"); |
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
385 |
} |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
386 |
|
36511 | 387 |
for (File file : options.jimages) { |
388 |
if (!file.exists() || !file.isFile()) { |
|
38871
ec08bf1979d4
8158402: jlink: should use regex for all pattern operations (--order-resources or --exclude-resources)
jlaskey
parents:
38870
diff
changeset
|
389 |
throw TASK_HELPER.newBadArgs("err.not.a.jimage", file.getName()); |
36511 | 390 |
} |
391 |
||
392 |
try (BasicImageReader reader = BasicImageReader.open(file.toPath())) { |
|
393 |
if (jimageAction != null) { |
|
394 |
jimageAction.apply(file, reader); |
|
395 |
} |
|
396 |
||
397 |
if (resourceAction != null) { |
|
398 |
String[] entryNames = reader.getEntryNames(); |
|
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
399 |
String oldModule = ""; |
36511 | 400 |
|
401 |
for (String name : entryNames) { |
|
39150
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
402 |
boolean match = includePredicates.isEmpty(); |
38870 | 403 |
|
39150
cb99396625b4
8159172: Update usage of jlink/jimage/jmod to show option patterns
jlaskey
parents:
38871
diff
changeset
|
404 |
for (Predicate<String> predicate : includePredicates) { |
38870 | 405 |
if (predicate.test(name)) { |
406 |
match = true; |
|
407 |
break; |
|
408 |
} |
|
409 |
} |
|
410 |
||
411 |
if (!match) { |
|
412 |
continue; |
|
413 |
} |
|
414 |
||
36511 | 415 |
if (!ImageResourcesTree.isTreeInfoResource(name)) { |
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
416 |
if (moduleAction != null) { |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
417 |
int offset = name.indexOf('/', 1); |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
418 |
|
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
419 |
String newModule = offset != -1 ? |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
420 |
name.substring(1, offset) : |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
421 |
"<unknown>"; |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
422 |
|
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
423 |
if (!oldModule.equals(newModule)) { |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
424 |
moduleAction.apply(reader, oldModule, newModule); |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
425 |
oldModule = newModule; |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
426 |
} |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
427 |
} |
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
428 |
|
36511 | 429 |
ImageLocation location = reader.findLocation(name); |
430 |
resourceAction.apply(reader, name, location); |
|
431 |
} |
|
432 |
} |
|
433 |
} |
|
434 |
} |
|
435 |
} |
|
436 |
} |
|
437 |
||
438 |
private boolean run() throws Exception, BadArgs { |
|
439 |
switch (options.task) { |
|
440 |
case EXTRACT: |
|
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
441 |
iterate(null, null, this::extract); |
36511 | 442 |
break; |
443 |
case INFO: |
|
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
444 |
iterate(this::info, null, null); |
36511 | 445 |
break; |
446 |
case LIST: |
|
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
447 |
iterate(this::listTitle, this::listModule, this::list); |
36511 | 448 |
break; |
449 |
case VERIFY: |
|
37616
d7794846510d
8069079: jimage extract / list to organize classes by modules
jlaskey
parents:
37615
diff
changeset
|
450 |
iterate(this::listTitle, null, this::verify); |
36511 | 451 |
break; |
452 |
default: |
|
44367
a81c9c6619fb
8174826: jlink support for linking in service provider modules
mchung
parents:
42174
diff
changeset
|
453 |
throw TASK_HELPER.newBadArgs("err.not.a.task", |
38870 | 454 |
options.task.name()).showUsage(true); |
36511 | 455 |
} |
456 |
return true; |
|
457 |
} |
|
458 |
} |