23 * questions. |
23 * questions. |
24 */ |
24 */ |
25 |
25 |
26 package jdk.jpackage.internal; |
26 package jdk.jpackage.internal; |
27 |
27 |
28 import java.io.BufferedWriter; |
|
29 import java.io.File; |
28 import java.io.File; |
30 import java.io.FileInputStream; |
29 import java.io.FileInputStream; |
31 import java.io.FileOutputStream; |
|
32 import java.io.FileWriter; |
|
33 import java.io.IOException; |
30 import java.io.IOException; |
34 import java.io.InputStream; |
31 import java.io.InputStream; |
35 import java.io.OutputStream; |
|
36 import java.io.OutputStreamWriter; |
|
37 import java.io.UncheckedIOException; |
|
38 import java.io.Writer; |
32 import java.io.Writer; |
39 import java.math.BigInteger; |
33 import java.math.BigInteger; |
40 import java.nio.file.Files; |
34 import java.nio.file.Files; |
41 import java.nio.file.Path; |
35 import java.nio.file.Path; |
42 import java.nio.file.StandardCopyOption; |
36 import java.nio.file.StandardCopyOption; |
61 import javax.xml.xpath.XPathFactory; |
55 import javax.xml.xpath.XPathFactory; |
62 |
56 |
63 import static jdk.jpackage.internal.StandardBundlerParam.*; |
57 import static jdk.jpackage.internal.StandardBundlerParam.*; |
64 import static jdk.jpackage.internal.MacBaseInstallerBundler.*; |
58 import static jdk.jpackage.internal.MacBaseInstallerBundler.*; |
65 import static jdk.jpackage.internal.MacAppBundler.*; |
59 import static jdk.jpackage.internal.MacAppBundler.*; |
|
60 import static jdk.jpackage.internal.OverridableResource.createResource; |
66 |
61 |
67 public class MacAppImageBuilder extends AbstractAppImageBuilder { |
62 public class MacAppImageBuilder extends AbstractAppImageBuilder { |
68 |
63 |
69 private static final ResourceBundle I18N = ResourceBundle.getBundle( |
64 private static final ResourceBundle I18N = ResourceBundle.getBundle( |
70 "jdk.jpackage.internal.resources.MacResources"); |
65 "jdk.jpackage.internal.resources.MacResources"); |
310 |
298 |
311 // Copy class path entries to Java folder |
299 // Copy class path entries to Java folder |
312 copyClassPathEntries(appDir, params); |
300 copyClassPathEntries(appDir, params); |
313 |
301 |
314 /*********** Take care of "config" files *******/ |
302 /*********** Take care of "config" files *******/ |
315 File icon = ICON_ICNS.fetchFrom(params); |
303 |
316 |
304 createResource(TEMPLATE_BUNDLE_ICON, params) |
317 InputStream in = locateResource( |
305 .setCategory("icon") |
318 APP_NAME.fetchFrom(params) + ".icns", |
306 .setExternal(ICON_ICNS.fetchFrom(params)) |
319 "icon", |
307 .saveToFile(resourcesDir.resolve(APP_NAME.fetchFrom(params) |
320 DEFAULT_ICNS_ICON.fetchFrom(params), |
308 + ".icns")); |
321 icon, |
|
322 VERBOSE.fetchFrom(params), |
|
323 RESOURCE_DIR.fetchFrom(params)); |
|
324 Files.copy(in, |
|
325 resourcesDir.resolve(APP_NAME.fetchFrom(params) + ".icns"), |
|
326 StandardCopyOption.REPLACE_EXISTING); |
|
327 |
309 |
328 // copy file association icons |
310 // copy file association icons |
329 for (Map<String, ? |
311 for (Map<String, ? |
330 super Object> fa : FILE_ASSOCIATIONS.fetchFrom(params)) { |
312 super Object> fa : FILE_ASSOCIATIONS.fetchFrom(params)) { |
331 File f = FA_ICON.fetchFrom(fa); |
313 File f = FA_ICON.fetchFrom(fa); |
455 getBundleName(params): "Java Runtime Image"; |
437 getBundleName(params): "Java Runtime Image"; |
456 data.put("CF_BUNDLE_NAME", name); |
438 data.put("CF_BUNDLE_NAME", name); |
457 data.put("CF_BUNDLE_VERSION", VERSION.fetchFrom(params)); |
439 data.put("CF_BUNDLE_VERSION", VERSION.fetchFrom(params)); |
458 data.put("CF_BUNDLE_SHORT_VERSION_STRING", VERSION.fetchFrom(params)); |
440 data.put("CF_BUNDLE_SHORT_VERSION_STRING", VERSION.fetchFrom(params)); |
459 |
441 |
460 try (Writer w = Files.newBufferedWriter(file.toPath())) { |
442 createResource(TEMPLATE_RUNTIME_INFO_PLIST, params) |
461 w.write(preprocessTextResource("Runtime-Info.plist", |
443 .setPublicName("Runtime-Info.plist") |
462 I18N.getString("resource.runtime-info-plist"), |
444 .setCategory(I18N.getString("resource.runtime-info-plist")) |
463 TEMPLATE_RUNTIME_INFO_PLIST, |
445 .setSubstitutionData(data) |
464 data, |
446 .saveToFile(file); |
465 VERBOSE.fetchFrom(params), |
|
466 RESOURCE_DIR.fetchFrom(params))); |
|
467 } |
|
468 } |
447 } |
469 |
448 |
470 private void writeInfoPlist(File file, Map<String, ? super Object> params) |
449 private void writeInfoPlist(File file, Map<String, ? super Object> params) |
471 throws IOException { |
450 throws IOException { |
472 Log.verbose(MessageFormat.format(I18N.getString( |
451 Log.verbose(MessageFormat.format(I18N.getString( |
662 } else { |
641 } else { |
663 associationData = ""; |
642 associationData = ""; |
664 } |
643 } |
665 data.put("DEPLOY_FILE_ASSOCIATIONS", associationData); |
644 data.put("DEPLOY_FILE_ASSOCIATIONS", associationData); |
666 |
645 |
667 |
646 createResource(TEMPLATE_INFO_PLIST_LITE, params) |
668 try (Writer w = Files.newBufferedWriter(file.toPath())) { |
647 .setCategory(I18N.getString("resource.app-info-plist")) |
669 w.write(preprocessTextResource( |
648 .setSubstitutionData(data) |
670 // getConfig_InfoPlist(params).getName(), |
649 .setPublicName("Info.plist") |
671 "Info.plist", |
650 .saveToFile(file); |
672 I18N.getString("resource.app-info-plist"), |
|
673 TEMPLATE_INFO_PLIST_LITE, |
|
674 data, VERBOSE.fetchFrom(params), |
|
675 RESOURCE_DIR.fetchFrom(params))); |
|
676 } |
|
677 } |
651 } |
678 |
652 |
679 private void writePkgInfo(File file) throws IOException { |
653 private void writePkgInfo(File file) throws IOException { |
680 //hardcoded as it does not seem we need to change it ever |
654 //hardcoded as it does not seem we need to change it ever |
681 String signature = "????"; |
655 String signature = "????"; |