32 import java.nio.file.attribute.PosixFilePermission;
33 import java.nio.file.attribute.PosixFilePermissions;
34 import java.text.MessageFormat;
35 import java.util.*;
36 import java.util.logging.Level;
37 import java.util.logging.Logger;
38 import java.util.regex.Pattern;
39
40 import static jdk.jpackage.internal.StandardBundlerParam.*;
41 import static jdk.jpackage.internal.LinuxAppBundler.ICON_PNG;
42 import static jdk.jpackage.internal.LinuxAppBundler.LINUX_INSTALL_DIR;
43 import static jdk.jpackage.internal.LinuxAppBundler.LINUX_PACKAGE_DEPENDENCIES;
44
45 public class LinuxDebBundler extends AbstractBundler {
46
47 private static final ResourceBundle I18N = ResourceBundle.getBundle(
48 "jdk.jpackage.internal.resources.LinuxResources");
49
50 public static final BundlerParamInfo<LinuxAppBundler> APP_BUNDLER =
51 new StandardBundlerParam<>(
52 I18N.getString("param.deb-app-bundler.name"),
53 I18N.getString("param.deb-app-bundler.description"),
54 "linux.app.bundler",
55 LinuxAppBundler.class,
56 params -> new LinuxAppBundler(),
57 (s, p) -> null);
58
59 // Debian rules for package naming are used here
60 // https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Source
61 //
62 // Package names must consist only of lower case letters (a-z),
63 // digits (0-9), plus (+) and minus (-) signs, and periods (.).
64 // They must be at least two characters long and
65 // must start with an alphanumeric character.
66 //
67 private static final Pattern DEB_BUNDLE_NAME_PATTERN =
68 Pattern.compile("^[a-z][a-z\\d\\+\\-\\.]+");
69
70 public static final BundlerParamInfo<String> BUNDLE_NAME =
71 new StandardBundlerParam<> (
72 I18N.getString("param.bundle-name.name"),
73 I18N.getString("param.bundle-name.description"),
74 Arguments.CLIOptions.LINUX_BUNDLE_NAME.getId(),
75 String.class,
76 params -> {
77 String nm = APP_NAME.fetchFrom(params);
78
79 if (nm == null) return null;
80
81 // make sure to lower case and spaces/underscores become dashes
82 nm = nm.toLowerCase().replaceAll("[ _]", "-");
83 return nm;
84 },
85 (s, p) -> {
86 if (!DEB_BUNDLE_NAME_PATTERN.matcher(s).matches()) {
87 throw new IllegalArgumentException(new ConfigException(
88 MessageFormat.format(I18N.getString(
89 "error.invalid-value-for-package-name"), s),
90 I18N.getString(
91 "error.invalid-value-for-package-name.advice")));
92 }
93
94 return s;
95 });
96
97 public static final BundlerParamInfo<String> FULL_PACKAGE_NAME =
98 new StandardBundlerParam<> (
99 I18N.getString("param.full-package-name.name"),
100 I18N.getString("param.full-package-name.description"),
101 "linux.deb.fullPackageName",
102 String.class,
103 params -> BUNDLE_NAME.fetchFrom(params) + "-"
104 + VERSION.fetchFrom(params),
105 (s, p) -> s);
106
107 public static final BundlerParamInfo<File> DEB_IMAGE_DIR =
108 new StandardBundlerParam<>(
109 I18N.getString("param.image-dir.name"),
110 I18N.getString("param.image-dir.description"),
111 "linux.deb.imageDir",
112 File.class,
113 params -> {
114 File imagesRoot = IMAGES_ROOT.fetchFrom(params);
115 if (!imagesRoot.exists()) imagesRoot.mkdirs();
116 return new File(new File(imagesRoot, "linux-deb.image"),
117 FULL_PACKAGE_NAME.fetchFrom(params));
118 },
119 (s, p) -> new File(s));
120
121 public static final BundlerParamInfo<File> APP_IMAGE_ROOT =
122 new StandardBundlerParam<>(
123 I18N.getString("param.app-image-root.name"),
124 I18N.getString("param.app-image-root.description"),
125 "linux.deb.imageRoot",
126 File.class,
127 params -> {
128 File imageDir = DEB_IMAGE_DIR.fetchFrom(params);
129 return new File(imageDir, LINUX_INSTALL_DIR.fetchFrom(params));
130 },
131 (s, p) -> new File(s));
132
133 public static final BundlerParamInfo<File> CONFIG_DIR =
134 new StandardBundlerParam<>(
135 I18N.getString("param.config-dir.name"),
136 I18N.getString("param.config-dir.description"),
137 "linux.deb.configDir",
138 File.class,
139 params -> new File(DEB_IMAGE_DIR.fetchFrom(params), "DEBIAN"),
140 (s, p) -> new File(s));
141
142 public static final BundlerParamInfo<String> EMAIL =
143 new StandardBundlerParam<> (
144 I18N.getString("param.maintainer-email.name"),
145 I18N.getString("param.maintainer-email.description"),
146 BundleParams.PARAM_EMAIL,
147 String.class,
148 params -> "Unknown",
149 (s, p) -> s);
150
151 public static final BundlerParamInfo<String> MAINTAINER =
152 new StandardBundlerParam<> (
153 I18N.getString("param.maintainer-name.name"),
154 I18N.getString("param.maintainer-name.description"),
155 Arguments.CLIOptions.LINUX_DEB_MAINTAINER.getId(),
156 String.class,
157 params -> VENDOR.fetchFrom(params) + " <"
158 + EMAIL.fetchFrom(params) + ">",
159 (s, p) -> s);
160
161 public static final BundlerParamInfo<String> LICENSE_TEXT =
162 new StandardBundlerParam<> (
163 I18N.getString("param.license-text.name"),
164 I18N.getString("param.license-text.description"),
165 "linux.deb.licenseText",
166 String.class,
167 params -> {
168 try {
169 String licenseFile = LICENSE_FILE.fetchFrom(params);
170 if (licenseFile != null) {
171 return Files.readString(new File(licenseFile).toPath());
172 }
173 } catch (Exception e) {
174 Log.verbose(e);
175 }
176 return "Unknown";
177 },
178 (s, p) -> s);
179
180 public static final BundlerParamInfo<String> XDG_FILE_PREFIX =
181 new StandardBundlerParam<> (
182 I18N.getString("param.xdg-prefix.name"),
183 I18N.getString("param.xdg-prefix.description"),
184 "linux.xdg-prefix",
185 String.class,
186 params -> {
187 try {
188 String vendor;
189 if (params.containsKey(VENDOR.getID())) {
190 vendor = VENDOR.fetchFrom(params);
191 } else {
192 vendor = "jpackage";
193 }
194 String appName = APP_NAME.fetchFrom(params);
195
196 return (appName + "-" + vendor).replaceAll("\\s", "");
197 } catch (Exception e) {
198 Log.verbose(e);
199 }
200 return "unknown-MimeInfo.xml";
201 },
202 (s, p) -> s);
203
393 for (File file : children) {
394 if (file.isFile()) {
395 count += file.length();
396 }
397 else if (file.isDirectory()) {
398 count += getInstalledSizeKB(file);
399 }
400 }
401 }
402 return count;
403 }
404
405 private boolean prepareProjectConfig(Map<String, ? super Object> params)
406 throws IOException {
407 Map<String, String> data = createReplacementData(params);
408 File rootDir = LinuxAppBundler.getRootDir(APP_IMAGE_ROOT.fetchFrom(
409 params), params);
410
411 File iconTarget = getConfig_IconFile(rootDir, params);
412 File icon = ICON_PNG.fetchFrom(params);
413 if (!RUNTIME_INSTALLER.fetchFrom(params)) {
414 // prepare installer icon
415 if (icon == null || !icon.exists()) {
416 fetchResource(iconTarget.getName(),
417 I18N.getString("resource.menu-icon"),
418 DEFAULT_ICON,
419 iconTarget,
420 VERBOSE.fetchFrom(params),
421 RESOURCE_DIR.fetchFrom(params));
422 } else {
423 fetchResource(iconTarget.getName(),
424 I18N.getString("resource.menu-icon"),
425 icon,
426 iconTarget,
427 VERBOSE.fetchFrom(params),
428 RESOURCE_DIR.fetchFrom(params));
429 }
430 }
431
432 StringBuilder installScripts = new StringBuilder();
433 StringBuilder removeScripts = new StringBuilder();
434 for (Map<String, ? super Object> secondaryLauncher :
435 SECONDARY_LAUNCHERS.fetchFrom(params)) {
436 Map<String, String> secondaryLauncherData =
437 createReplacementData(secondaryLauncher);
438 secondaryLauncherData.put("APPLICATION_FS_NAME",
439 data.get("APPLICATION_FS_NAME"));
440 secondaryLauncherData.put("DESKTOP_MIMES", "");
441
442 if (!RUNTIME_INSTALLER.fetchFrom(params)) {
443 // prepare desktop shortcut
444 Writer w = new BufferedWriter(new FileWriter(
445 getConfig_DesktopShortcutFile(
446 rootDir, secondaryLauncher)));
447 String content = preprocessTextResource(
448 getConfig_DesktopShortcutFile(rootDir,
449 secondaryLauncher).getName(),
450 I18N.getString("resource.menu-shortcut-descriptor"),
451 DEFAULT_DESKTOP_FILE_TEMPLATE,
452 secondaryLauncherData,
453 VERBOSE.fetchFrom(params),
454 RESOURCE_DIR.fetchFrom(params));
455 w.write(content);
456 w.close();
457 }
458
459 // prepare installer icon
460 iconTarget = getConfig_IconFile(rootDir, secondaryLauncher);
461 icon = ICON_PNG.fetchFrom(secondaryLauncher);
462 if (icon == null || !icon.exists()) {
463 fetchResource(iconTarget.getName(),
464 I18N.getString("resource.menu-icon"),
465 DEFAULT_ICON,
466 iconTarget,
467 VERBOSE.fetchFrom(params),
468 RESOURCE_DIR.fetchFrom(params));
469 } else {
470 fetchResource(iconTarget.getName(),
471 I18N.getString("resource.menu-icon"),
472 icon,
473 iconTarget,
474 VERBOSE.fetchFrom(params),
475 RESOURCE_DIR.fetchFrom(params));
476 }
477
478 // postinst copying of desktop icon
479 installScripts.append(
480 " xdg-desktop-menu install --novendor ");
481 installScripts.append(LINUX_INSTALL_DIR.fetchFrom(params));
482 installScripts.append("/");
483 installScripts.append(data.get("APPLICATION_FS_NAME"));
484 installScripts.append("/");
485 installScripts.append(
486 secondaryLauncherData.get("APPLICATION_LAUNCHER_FILENAME"));
487 installScripts.append(".desktop\n");
488
489 // postrm cleanup of desktop icon
490 removeScripts.append(
491 " xdg-desktop-menu uninstall --novendor ");
492 removeScripts.append(LINUX_INSTALL_DIR.fetchFrom(params));
493 removeScripts.append("/");
494 removeScripts.append(data.get("APPLICATION_FS_NAME"));
495 removeScripts.append("/");
496 removeScripts.append(
497 secondaryLauncherData.get("APPLICATION_LAUNCHER_FILENAME"));
498 removeScripts.append(".desktop\n");
499 }
500 data.put("SECONDARY_LAUNCHERS_INSTALL", installScripts.toString());
501 data.put("SECONDARY_LAUNCHERS_REMOVE", removeScripts.toString());
502
503 List<Map<String, ? super Object>> associations =
504 FILE_ASSOCIATIONS.fetchFrom(params);
505 data.put("FILE_ASSOCIATION_INSTALL", "");
506 data.put("FILE_ASSOCIATION_REMOVE", "");
507 data.put("DESKTOP_MIMES", "");
508 if (associations != null) {
509 String mimeInfoFile = XDG_FILE_PREFIX.fetchFrom(params)
510 + "-MimeInfo.xml";
511 StringBuilder mimeInfo = new StringBuilder(
512 "<?xml version=\"1.0\"?>\n<mime-info xmlns="
513 + "'http://www.freedesktop.org/standards/shared-mime-info'>\n");
514 StringBuilder registrations = new StringBuilder();
515 StringBuilder deregistrations = new StringBuilder();
516 StringBuilder desktopMimes = new StringBuilder("MimeType=");
517 boolean addedEntry = false;
518
519 for (Map<String, ? super Object> assoc : associations) {
520 // <mime-type type="application/x-vnd.awesome">
521 // <comment>Awesome document</comment>
623 .append(target.getName())
624 .append(" ")
625 .append(dashMime)
626 .append("\n");
627 }
628 }
629 }
630 mimeInfo.append("</mime-info>");
631
632 if (addedEntry) {
633 Writer w = new BufferedWriter(new FileWriter(
634 new File(rootDir, mimeInfoFile)));
635 w.write(mimeInfo.toString());
636 w.close();
637 data.put("FILE_ASSOCIATION_INSTALL", registrations.toString());
638 data.put("FILE_ASSOCIATION_REMOVE", deregistrations.toString());
639 data.put("DESKTOP_MIMES", desktopMimes.toString());
640 }
641 }
642
643 if (!RUNTIME_INSTALLER.fetchFrom(params)) {
644 //prepare desktop shortcut
645 Writer w = new BufferedWriter(new FileWriter(
646 getConfig_DesktopShortcutFile(rootDir, params)));
647 String content = preprocessTextResource(
648 getConfig_DesktopShortcutFile(
649 rootDir, params).getName(),
650 I18N.getString("resource.menu-shortcut-descriptor"),
651 DEFAULT_DESKTOP_FILE_TEMPLATE,
652 data,
653 VERBOSE.fetchFrom(params),
654 RESOURCE_DIR.fetchFrom(params));
655 w.write(content);
656 w.close();
657 }
658 // prepare control file
659 Writer w = new BufferedWriter(new FileWriter(
660 getConfig_ControlFile(params)));
661 String content = preprocessTextResource(
662 getConfig_ControlFile(params).getName(),
663 I18N.getString("resource.deb-control-file"),
740 data.put("APPLICATION_FS_NAME", APP_NAME.fetchFrom(params));
741 data.put("APPLICATION_PACKAGE", BUNDLE_NAME.fetchFrom(params));
742 data.put("APPLICATION_VENDOR", VENDOR.fetchFrom(params));
743 data.put("APPLICATION_MAINTAINER", MAINTAINER.fetchFrom(params));
744 data.put("APPLICATION_VERSION", VERSION.fetchFrom(params));
745 data.put("APPLICATION_LAUNCHER_FILENAME", APP_NAME.fetchFrom(params));
746 data.put("INSTALLATION_DIRECTORY", LINUX_INSTALL_DIR.fetchFrom(params));
747 data.put("XDG_PREFIX", XDG_FILE_PREFIX.fetchFrom(params));
748 data.put("DEPLOY_BUNDLE_CATEGORY", CATEGORY.fetchFrom(params));
749 data.put("APPLICATION_DESCRIPTION", DESCRIPTION.fetchFrom(params));
750 data.put("APPLICATION_SUMMARY", TITLE.fetchFrom(params));
751 data.put("APPLICATION_COPYRIGHT", COPYRIGHT.fetchFrom(params));
752 data.put("APPLICATION_LICENSE_TEXT", LICENSE_TEXT.fetchFrom(params));
753 data.put("APPLICATION_ARCH", getArch());
754 data.put("APPLICATION_INSTALLED_SIZE",
755 Long.toString(getInstalledSizeKB(params)));
756 String deps = LINUX_PACKAGE_DEPENDENCIES.fetchFrom(params);
757 data.put("PACKAGE_DEPENDENCIES",
758 deps.isEmpty() ? "" : "Depends: " + deps);
759 data.put("RUNTIME_INSTALLER",
760 RUNTIME_INSTALLER.fetchFrom(params).toString());
761
762 return data;
763 }
764
765 private File getConfig_DesktopShortcutFile(File rootDir,
766 Map<String, ? super Object> params) {
767 return new File(rootDir, APP_NAME.fetchFrom(params) + ".desktop");
768 }
769
770 private File getConfig_IconFile(File rootDir,
771 Map<String, ? super Object> params) {
772 return new File(rootDir, APP_NAME.fetchFrom(params) + ".png");
773 }
774
775 private File getConfig_InitScriptFile(Map<String, ? super Object> params) {
776 return new File(LinuxAppBundler.getRootDir(
777 APP_IMAGE_ROOT.fetchFrom(params), params),
778 BUNDLE_NAME.fetchFrom(params) + ".init");
779 }
780
|
32 import java.nio.file.attribute.PosixFilePermission;
33 import java.nio.file.attribute.PosixFilePermissions;
34 import java.text.MessageFormat;
35 import java.util.*;
36 import java.util.logging.Level;
37 import java.util.logging.Logger;
38 import java.util.regex.Pattern;
39
40 import static jdk.jpackage.internal.StandardBundlerParam.*;
41 import static jdk.jpackage.internal.LinuxAppBundler.ICON_PNG;
42 import static jdk.jpackage.internal.LinuxAppBundler.LINUX_INSTALL_DIR;
43 import static jdk.jpackage.internal.LinuxAppBundler.LINUX_PACKAGE_DEPENDENCIES;
44
45 public class LinuxDebBundler extends AbstractBundler {
46
47 private static final ResourceBundle I18N = ResourceBundle.getBundle(
48 "jdk.jpackage.internal.resources.LinuxResources");
49
50 public static final BundlerParamInfo<LinuxAppBundler> APP_BUNDLER =
51 new StandardBundlerParam<>(
52 "linux.app.bundler",
53 LinuxAppBundler.class,
54 params -> new LinuxAppBundler(),
55 (s, p) -> null);
56
57 // Debian rules for package naming are used here
58 // https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Source
59 //
60 // Package names must consist only of lower case letters (a-z),
61 // digits (0-9), plus (+) and minus (-) signs, and periods (.).
62 // They must be at least two characters long and
63 // must start with an alphanumeric character.
64 //
65 private static final Pattern DEB_BUNDLE_NAME_PATTERN =
66 Pattern.compile("^[a-z][a-z\\d\\+\\-\\.]+");
67
68 public static final BundlerParamInfo<String> BUNDLE_NAME =
69 new StandardBundlerParam<> (
70 Arguments.CLIOptions.LINUX_BUNDLE_NAME.getId(),
71 String.class,
72 params -> {
73 String nm = APP_NAME.fetchFrom(params);
74
75 if (nm == null) return null;
76
77 // make sure to lower case and spaces/underscores become dashes
78 nm = nm.toLowerCase().replaceAll("[ _]", "-");
79 return nm;
80 },
81 (s, p) -> {
82 if (!DEB_BUNDLE_NAME_PATTERN.matcher(s).matches()) {
83 throw new IllegalArgumentException(new ConfigException(
84 MessageFormat.format(I18N.getString(
85 "error.invalid-value-for-package-name"), s),
86 I18N.getString(
87 "error.invalid-value-for-package-name.advice")));
88 }
89
90 return s;
91 });
92
93 public static final BundlerParamInfo<String> FULL_PACKAGE_NAME =
94 new StandardBundlerParam<> (
95 "linux.deb.fullPackageName",
96 String.class,
97 params -> BUNDLE_NAME.fetchFrom(params) + "-"
98 + VERSION.fetchFrom(params),
99 (s, p) -> s);
100
101 public static final BundlerParamInfo<File> DEB_IMAGE_DIR =
102 new StandardBundlerParam<>(
103 "linux.deb.imageDir",
104 File.class,
105 params -> {
106 File imagesRoot = IMAGES_ROOT.fetchFrom(params);
107 if (!imagesRoot.exists()) imagesRoot.mkdirs();
108 return new File(new File(imagesRoot, "linux-deb.image"),
109 FULL_PACKAGE_NAME.fetchFrom(params));
110 },
111 (s, p) -> new File(s));
112
113 public static final BundlerParamInfo<File> APP_IMAGE_ROOT =
114 new StandardBundlerParam<>(
115 "linux.deb.imageRoot",
116 File.class,
117 params -> {
118 File imageDir = DEB_IMAGE_DIR.fetchFrom(params);
119 return new File(imageDir, LINUX_INSTALL_DIR.fetchFrom(params));
120 },
121 (s, p) -> new File(s));
122
123 public static final BundlerParamInfo<File> CONFIG_DIR =
124 new StandardBundlerParam<>(
125 "linux.deb.configDir",
126 File.class,
127 params -> new File(DEB_IMAGE_DIR.fetchFrom(params), "DEBIAN"),
128 (s, p) -> new File(s));
129
130 public static final BundlerParamInfo<String> EMAIL =
131 new StandardBundlerParam<> (
132 BundleParams.PARAM_EMAIL,
133 String.class,
134 params -> "Unknown",
135 (s, p) -> s);
136
137 public static final BundlerParamInfo<String> MAINTAINER =
138 new StandardBundlerParam<> (
139 Arguments.CLIOptions.LINUX_DEB_MAINTAINER.getId(),
140 String.class,
141 params -> VENDOR.fetchFrom(params) + " <"
142 + EMAIL.fetchFrom(params) + ">",
143 (s, p) -> s);
144
145 public static final BundlerParamInfo<String> LICENSE_TEXT =
146 new StandardBundlerParam<> (
147 "linux.deb.licenseText",
148 String.class,
149 params -> {
150 try {
151 String licenseFile = LICENSE_FILE.fetchFrom(params);
152 if (licenseFile != null) {
153 return Files.readString(new File(licenseFile).toPath());
154 }
155 } catch (Exception e) {
156 Log.verbose(e);
157 }
158 return "Unknown";
159 },
160 (s, p) -> s);
161
162 public static final BundlerParamInfo<String> XDG_FILE_PREFIX =
163 new StandardBundlerParam<> (
164 "linux.xdg-prefix",
165 String.class,
166 params -> {
167 try {
168 String vendor;
169 if (params.containsKey(VENDOR.getID())) {
170 vendor = VENDOR.fetchFrom(params);
171 } else {
172 vendor = "jpackage";
173 }
174 String appName = APP_NAME.fetchFrom(params);
175
176 return (appName + "-" + vendor).replaceAll("\\s", "");
177 } catch (Exception e) {
178 Log.verbose(e);
179 }
180 return "unknown-MimeInfo.xml";
181 },
182 (s, p) -> s);
183
373 for (File file : children) {
374 if (file.isFile()) {
375 count += file.length();
376 }
377 else if (file.isDirectory()) {
378 count += getInstalledSizeKB(file);
379 }
380 }
381 }
382 return count;
383 }
384
385 private boolean prepareProjectConfig(Map<String, ? super Object> params)
386 throws IOException {
387 Map<String, String> data = createReplacementData(params);
388 File rootDir = LinuxAppBundler.getRootDir(APP_IMAGE_ROOT.fetchFrom(
389 params), params);
390
391 File iconTarget = getConfig_IconFile(rootDir, params);
392 File icon = ICON_PNG.fetchFrom(params);
393 if (!StandardBundlerParam.isRuntimeInstaller(params)) {
394 // prepare installer icon
395 if (icon == null || !icon.exists()) {
396 fetchResource(iconTarget.getName(),
397 I18N.getString("resource.menu-icon"),
398 DEFAULT_ICON,
399 iconTarget,
400 VERBOSE.fetchFrom(params),
401 RESOURCE_DIR.fetchFrom(params));
402 } else {
403 fetchResource(iconTarget.getName(),
404 I18N.getString("resource.menu-icon"),
405 icon,
406 iconTarget,
407 VERBOSE.fetchFrom(params),
408 RESOURCE_DIR.fetchFrom(params));
409 }
410 }
411
412 StringBuilder installScripts = new StringBuilder();
413 StringBuilder removeScripts = new StringBuilder();
414 for (Map<String, ? super Object> addLauncher :
415 ADD_LAUNCHERS.fetchFrom(params)) {
416 Map<String, String> addLauncherData =
417 createReplacementData(addLauncher);
418 addLauncherData.put("APPLICATION_FS_NAME",
419 data.get("APPLICATION_FS_NAME"));
420 addLauncherData.put("DESKTOP_MIMES", "");
421
422 if (!StandardBundlerParam.isRuntimeInstaller(params)) {
423 // prepare desktop shortcut
424 Writer w = new BufferedWriter(new FileWriter(
425 getConfig_DesktopShortcutFile(
426 rootDir, addLauncher)));
427 String content = preprocessTextResource(
428 getConfig_DesktopShortcutFile(rootDir,
429 addLauncher).getName(),
430 I18N.getString("resource.menu-shortcut-descriptor"),
431 DEFAULT_DESKTOP_FILE_TEMPLATE,
432 addLauncherData,
433 VERBOSE.fetchFrom(params),
434 RESOURCE_DIR.fetchFrom(params));
435 w.write(content);
436 w.close();
437 }
438
439 // prepare installer icon
440 iconTarget = getConfig_IconFile(rootDir, addLauncher);
441 icon = ICON_PNG.fetchFrom(addLauncher);
442 if (icon == null || !icon.exists()) {
443 fetchResource(iconTarget.getName(),
444 I18N.getString("resource.menu-icon"),
445 DEFAULT_ICON,
446 iconTarget,
447 VERBOSE.fetchFrom(params),
448 RESOURCE_DIR.fetchFrom(params));
449 } else {
450 fetchResource(iconTarget.getName(),
451 I18N.getString("resource.menu-icon"),
452 icon,
453 iconTarget,
454 VERBOSE.fetchFrom(params),
455 RESOURCE_DIR.fetchFrom(params));
456 }
457
458 // postinst copying of desktop icon
459 installScripts.append(
460 " xdg-desktop-menu install --novendor ");
461 installScripts.append(LINUX_INSTALL_DIR.fetchFrom(params));
462 installScripts.append("/");
463 installScripts.append(data.get("APPLICATION_FS_NAME"));
464 installScripts.append("/");
465 installScripts.append(
466 addLauncherData.get("APPLICATION_LAUNCHER_FILENAME"));
467 installScripts.append(".desktop\n");
468
469 // postrm cleanup of desktop icon
470 removeScripts.append(
471 " xdg-desktop-menu uninstall --novendor ");
472 removeScripts.append(LINUX_INSTALL_DIR.fetchFrom(params));
473 removeScripts.append("/");
474 removeScripts.append(data.get("APPLICATION_FS_NAME"));
475 removeScripts.append("/");
476 removeScripts.append(
477 addLauncherData.get("APPLICATION_LAUNCHER_FILENAME"));
478 removeScripts.append(".desktop\n");
479 }
480 data.put("ADD_LAUNCHERS_INSTALL", installScripts.toString());
481 data.put("ADD_LAUNCHERS_REMOVE", removeScripts.toString());
482
483 List<Map<String, ? super Object>> associations =
484 FILE_ASSOCIATIONS.fetchFrom(params);
485 data.put("FILE_ASSOCIATION_INSTALL", "");
486 data.put("FILE_ASSOCIATION_REMOVE", "");
487 data.put("DESKTOP_MIMES", "");
488 if (associations != null) {
489 String mimeInfoFile = XDG_FILE_PREFIX.fetchFrom(params)
490 + "-MimeInfo.xml";
491 StringBuilder mimeInfo = new StringBuilder(
492 "<?xml version=\"1.0\"?>\n<mime-info xmlns="
493 + "'http://www.freedesktop.org/standards/shared-mime-info'>\n");
494 StringBuilder registrations = new StringBuilder();
495 StringBuilder deregistrations = new StringBuilder();
496 StringBuilder desktopMimes = new StringBuilder("MimeType=");
497 boolean addedEntry = false;
498
499 for (Map<String, ? super Object> assoc : associations) {
500 // <mime-type type="application/x-vnd.awesome">
501 // <comment>Awesome document</comment>
603 .append(target.getName())
604 .append(" ")
605 .append(dashMime)
606 .append("\n");
607 }
608 }
609 }
610 mimeInfo.append("</mime-info>");
611
612 if (addedEntry) {
613 Writer w = new BufferedWriter(new FileWriter(
614 new File(rootDir, mimeInfoFile)));
615 w.write(mimeInfo.toString());
616 w.close();
617 data.put("FILE_ASSOCIATION_INSTALL", registrations.toString());
618 data.put("FILE_ASSOCIATION_REMOVE", deregistrations.toString());
619 data.put("DESKTOP_MIMES", desktopMimes.toString());
620 }
621 }
622
623 if (!StandardBundlerParam.isRuntimeInstaller(params)) {
624 //prepare desktop shortcut
625 Writer w = new BufferedWriter(new FileWriter(
626 getConfig_DesktopShortcutFile(rootDir, params)));
627 String content = preprocessTextResource(
628 getConfig_DesktopShortcutFile(
629 rootDir, params).getName(),
630 I18N.getString("resource.menu-shortcut-descriptor"),
631 DEFAULT_DESKTOP_FILE_TEMPLATE,
632 data,
633 VERBOSE.fetchFrom(params),
634 RESOURCE_DIR.fetchFrom(params));
635 w.write(content);
636 w.close();
637 }
638 // prepare control file
639 Writer w = new BufferedWriter(new FileWriter(
640 getConfig_ControlFile(params)));
641 String content = preprocessTextResource(
642 getConfig_ControlFile(params).getName(),
643 I18N.getString("resource.deb-control-file"),
720 data.put("APPLICATION_FS_NAME", APP_NAME.fetchFrom(params));
721 data.put("APPLICATION_PACKAGE", BUNDLE_NAME.fetchFrom(params));
722 data.put("APPLICATION_VENDOR", VENDOR.fetchFrom(params));
723 data.put("APPLICATION_MAINTAINER", MAINTAINER.fetchFrom(params));
724 data.put("APPLICATION_VERSION", VERSION.fetchFrom(params));
725 data.put("APPLICATION_LAUNCHER_FILENAME", APP_NAME.fetchFrom(params));
726 data.put("INSTALLATION_DIRECTORY", LINUX_INSTALL_DIR.fetchFrom(params));
727 data.put("XDG_PREFIX", XDG_FILE_PREFIX.fetchFrom(params));
728 data.put("DEPLOY_BUNDLE_CATEGORY", CATEGORY.fetchFrom(params));
729 data.put("APPLICATION_DESCRIPTION", DESCRIPTION.fetchFrom(params));
730 data.put("APPLICATION_SUMMARY", TITLE.fetchFrom(params));
731 data.put("APPLICATION_COPYRIGHT", COPYRIGHT.fetchFrom(params));
732 data.put("APPLICATION_LICENSE_TEXT", LICENSE_TEXT.fetchFrom(params));
733 data.put("APPLICATION_ARCH", getArch());
734 data.put("APPLICATION_INSTALLED_SIZE",
735 Long.toString(getInstalledSizeKB(params)));
736 String deps = LINUX_PACKAGE_DEPENDENCIES.fetchFrom(params);
737 data.put("PACKAGE_DEPENDENCIES",
738 deps.isEmpty() ? "" : "Depends: " + deps);
739 data.put("RUNTIME_INSTALLER",
740 StandardBundlerParam.isRuntimeInstaller(params).toString());
741
742 return data;
743 }
744
745 private File getConfig_DesktopShortcutFile(File rootDir,
746 Map<String, ? super Object> params) {
747 return new File(rootDir, APP_NAME.fetchFrom(params) + ".desktop");
748 }
749
750 private File getConfig_IconFile(File rootDir,
751 Map<String, ? super Object> params) {
752 return new File(rootDir, APP_NAME.fetchFrom(params) + ".png");
753 }
754
755 private File getConfig_InitScriptFile(Map<String, ? super Object> params) {
756 return new File(LinuxAppBundler.getRootDir(
757 APP_IMAGE_ROOT.fetchFrom(params), params),
758 BUNDLE_NAME.fetchFrom(params) + ".init");
759 }
760
|