115 Arguments.CLIOptions.LINUX_RPM_LICENSE_TYPE.getId(),
116 String.class,
117 params -> I18N.getString("param.license-type.default"),
118 (s, p) -> s
119 );
120
121 public static final BundlerParamInfo<String> XDG_FILE_PREFIX =
122 new StandardBundlerParam<> (
123 I18N.getString("param.xdg-prefix.name"),
124 I18N.getString("param.xdg-prefix.description"),
125 "linux.xdg-prefix",
126 String.class,
127 params -> {
128 try {
129 String vendor;
130 if (params.containsKey(VENDOR.getID())) {
131 vendor = VENDOR.fetchFrom(params);
132 } else {
133 vendor = "jpackage";
134 }
135 String appName = APP_FS_NAME.fetchFrom(params);
136
137 return (vendor + "-" + appName).replaceAll("\\s", "");
138 } catch (Exception e) {
139 if (Log.isDebug()) {
140 e.printStackTrace();
141 }
142 }
143 return "unknown-MimeInfo.xml";
144 },
145 (s, p) -> s);
146
147 private final static String DEFAULT_ICON = "javalogo_white_32.png";
148 private final static String DEFAULT_SPEC_TEMPLATE = "template.spec";
149 private final static String DEFAULT_DESKTOP_FILE_TEMPLATE =
150 "template.desktop";
151
152 public final static String TOOL_RPMBUILD = "rpmbuild";
153 public final static double TOOL_RPMBUILD_MIN_VERSION = 4.0d;
154
155 public static boolean testTool(String toolName, double minVersion) {
281 }
282 }
283
284 private String getLicenseFileString(Map<String, ? super Object> params)
285 throws IOException {
286 StringBuilder sb = new StringBuilder();
287
288 String licenseStr = LICENSE_FILE.fetchFrom(params);
289 if (licenseStr != null) {
290 File licenseFile = new File(licenseStr);
291 File rootDir =
292 LinuxAppBundler.getRootDir(RPM_IMAGE_DIR.fetchFrom(params),
293 params);
294 File target = new File(rootDir + File.separator + "app"
295 + File.separator + licenseFile.getName());
296 Files.copy(licenseFile.toPath(), target.toPath());
297
298 sb.append("%license ");
299 sb.append(LINUX_INSTALL_DIR.fetchFrom(params));
300 sb.append("/");
301 sb.append(APP_FS_NAME.fetchFrom(params));
302 sb.append("/app/");
303 sb.append(licenseFile.getName());
304 }
305
306 return sb.toString();
307 }
308
309 private boolean prepareProjectConfig(Map<String, ? super Object> params)
310 throws IOException {
311 Map<String, String> data = createReplacementData(params);
312 File rootDir =
313 LinuxAppBundler.getRootDir(RPM_IMAGE_DIR.fetchFrom(params), params);
314
315 // prepare installer icon
316 File iconTarget = getConfig_IconFile(rootDir, params);
317 File icon = LinuxAppBundler.ICON_PNG.fetchFrom(params);
318 if (!Arguments.CREATE_JRE_INSTALLER.fetchFrom(params)) {
319 if (icon == null || !icon.exists()) {
320 fetchResource(iconTarget.getName(),
321 I18N.getString("resource.menu-icon"),
473 .append("\n");
474
475 deregistrations.append("xdg-mime uninstall ")
476 .append(LINUX_INSTALL_DIR.fetchFrom(params))
477 .append("/")
478 .append(data.get("APPLICATION_FS_NAME"))
479 .append("/")
480 .append(mimeInfoFile)
481 .append("\n");
482 addedEntry = true;
483 } else {
484 desktopMimes.append(";");
485 }
486 desktopMimes.append(thisMime);
487
488 if (faIcon != null && faIcon.exists()) {
489 int size = getSquareSizeOfImage(faIcon);
490
491 if (size > 0) {
492 File target = new File(rootDir,
493 APP_FS_NAME.fetchFrom(params)
494 + "_fa_" + faIcon.getName());
495 IOUtils.copyFile(faIcon, target);
496
497 // xdg-icon-resource install --context mimetypes
498 // --size 64 awesomeapp_fa_1.png
499 // application-x.vnd-awesome
500 registrations.append(
501 "xdg-icon-resource install "
502 + "--context mimetypes --size ")
503 .append(size)
504 .append(" ")
505 .append(LINUX_INSTALL_DIR.fetchFrom(params))
506 .append("/")
507 .append(data.get("APPLICATION_FS_NAME"))
508 .append("/")
509 .append(target.getName())
510 .append(" ")
511 .append(dashMime)
512 .append("\n");
513
560 // prepare spec file
561 Writer w = new BufferedWriter(
562 new FileWriter(getConfig_SpecFile(params)));
563 String content = preprocessTextResource(
564 getConfig_SpecFile(params).getName(),
565 I18N.getString("resource.rpm-spec-file"),
566 DEFAULT_SPEC_TEMPLATE, data,
567 VERBOSE.fetchFrom(params),
568 RESOURCE_DIR.fetchFrom(params));
569 w.write(content);
570 w.close();
571
572 return true;
573 }
574
575 private Map<String, String> createReplacementData(
576 Map<String, ? super Object> params) throws IOException {
577 Map<String, String> data = new HashMap<>();
578
579 data.put("APPLICATION_NAME", APP_NAME.fetchFrom(params));
580 data.put("APPLICATION_FS_NAME", APP_FS_NAME.fetchFrom(params));
581 data.put("APPLICATION_PACKAGE", BUNDLE_NAME.fetchFrom(params));
582 data.put("APPLICATION_VENDOR", VENDOR.fetchFrom(params));
583 data.put("APPLICATION_VERSION", VERSION.fetchFrom(params));
584 data.put("APPLICATION_LAUNCHER_FILENAME",
585 APP_FS_NAME.fetchFrom(params));
586 data.put("INSTALLATION_DIRECTORY", LINUX_INSTALL_DIR.fetchFrom(params));
587 data.put("XDG_PREFIX", XDG_FILE_PREFIX.fetchFrom(params));
588 data.put("DEPLOY_BUNDLE_CATEGORY", CATEGORY.fetchFrom(params));
589 // TODO rpm categories
590 data.put("APPLICATION_DESCRIPTION", DESCRIPTION.fetchFrom(params));
591 data.put("APPLICATION_SUMMARY", TITLE.fetchFrom(params));
592 data.put("APPLICATION_LICENSE_TYPE", LICENSE_TYPE.fetchFrom(params));
593 data.put("APPLICATION_LICENSE_FILE", getLicenseFileString(params));
594 String deps = LINUX_PACKAGE_DEPENDENCIES.fetchFrom(params);
595 data.put("PACKAGE_DEPENDENCIES",
596 deps.isEmpty() ? "" : "Requires: " + deps);
597 data.put("CREATE_JRE_INSTALLER",
598 Arguments.CREATE_JRE_INSTALLER.fetchFrom(params).toString());
599 return data;
600 }
601
602 private File getConfig_DesktopShortcutFile(File rootDir,
603 Map<String, ? super Object> params) {
604 return new File(rootDir,
605 APP_FS_NAME.fetchFrom(params) + ".desktop");
606 }
607
608 private File getConfig_IconFile(File rootDir,
609 Map<String, ? super Object> params) {
610 return new File(rootDir,
611 APP_FS_NAME.fetchFrom(params) + ".png");
612 }
613
614 private File getConfig_SpecFile(Map<String, ? super Object> params) {
615 return new File(RPM_IMAGE_DIR.fetchFrom(params),
616 APP_FS_NAME.fetchFrom(params) + ".spec");
617 }
618
619 private File buildRPM(Map<String, ? super Object> params,
620 File outdir) throws IOException {
621 Log.verbose(MessageFormat.format(I18N.getString(
622 "message.outputting-bundle-location"),
623 outdir.getAbsolutePath()));
624
625 File broot = new File(BUILD_ROOT.fetchFrom(params), "rmpbuildroot");
626
627 outdir.mkdirs();
628
629 //run rpmbuild
630 ProcessBuilder pb = new ProcessBuilder(
631 TOOL_RPMBUILD,
632 "-bb", getConfig_SpecFile(params).getAbsolutePath(),
633 "--define", "%_sourcedir "
634 + RPM_IMAGE_DIR.fetchFrom(params).getAbsolutePath(),
635 // save result to output dir
636 "--define", "%_rpmdir " + outdir.getAbsolutePath(),
|
115 Arguments.CLIOptions.LINUX_RPM_LICENSE_TYPE.getId(),
116 String.class,
117 params -> I18N.getString("param.license-type.default"),
118 (s, p) -> s
119 );
120
121 public static final BundlerParamInfo<String> XDG_FILE_PREFIX =
122 new StandardBundlerParam<> (
123 I18N.getString("param.xdg-prefix.name"),
124 I18N.getString("param.xdg-prefix.description"),
125 "linux.xdg-prefix",
126 String.class,
127 params -> {
128 try {
129 String vendor;
130 if (params.containsKey(VENDOR.getID())) {
131 vendor = VENDOR.fetchFrom(params);
132 } else {
133 vendor = "jpackage";
134 }
135 String appName = APP_NAME.fetchFrom(params);
136
137 return (vendor + "-" + appName).replaceAll("\\s", "");
138 } catch (Exception e) {
139 if (Log.isDebug()) {
140 e.printStackTrace();
141 }
142 }
143 return "unknown-MimeInfo.xml";
144 },
145 (s, p) -> s);
146
147 private final static String DEFAULT_ICON = "javalogo_white_32.png";
148 private final static String DEFAULT_SPEC_TEMPLATE = "template.spec";
149 private final static String DEFAULT_DESKTOP_FILE_TEMPLATE =
150 "template.desktop";
151
152 public final static String TOOL_RPMBUILD = "rpmbuild";
153 public final static double TOOL_RPMBUILD_MIN_VERSION = 4.0d;
154
155 public static boolean testTool(String toolName, double minVersion) {
281 }
282 }
283
284 private String getLicenseFileString(Map<String, ? super Object> params)
285 throws IOException {
286 StringBuilder sb = new StringBuilder();
287
288 String licenseStr = LICENSE_FILE.fetchFrom(params);
289 if (licenseStr != null) {
290 File licenseFile = new File(licenseStr);
291 File rootDir =
292 LinuxAppBundler.getRootDir(RPM_IMAGE_DIR.fetchFrom(params),
293 params);
294 File target = new File(rootDir + File.separator + "app"
295 + File.separator + licenseFile.getName());
296 Files.copy(licenseFile.toPath(), target.toPath());
297
298 sb.append("%license ");
299 sb.append(LINUX_INSTALL_DIR.fetchFrom(params));
300 sb.append("/");
301 sb.append(APP_NAME.fetchFrom(params));
302 sb.append("/app/");
303 sb.append(licenseFile.getName());
304 }
305
306 return sb.toString();
307 }
308
309 private boolean prepareProjectConfig(Map<String, ? super Object> params)
310 throws IOException {
311 Map<String, String> data = createReplacementData(params);
312 File rootDir =
313 LinuxAppBundler.getRootDir(RPM_IMAGE_DIR.fetchFrom(params), params);
314
315 // prepare installer icon
316 File iconTarget = getConfig_IconFile(rootDir, params);
317 File icon = LinuxAppBundler.ICON_PNG.fetchFrom(params);
318 if (!Arguments.CREATE_JRE_INSTALLER.fetchFrom(params)) {
319 if (icon == null || !icon.exists()) {
320 fetchResource(iconTarget.getName(),
321 I18N.getString("resource.menu-icon"),
473 .append("\n");
474
475 deregistrations.append("xdg-mime uninstall ")
476 .append(LINUX_INSTALL_DIR.fetchFrom(params))
477 .append("/")
478 .append(data.get("APPLICATION_FS_NAME"))
479 .append("/")
480 .append(mimeInfoFile)
481 .append("\n");
482 addedEntry = true;
483 } else {
484 desktopMimes.append(";");
485 }
486 desktopMimes.append(thisMime);
487
488 if (faIcon != null && faIcon.exists()) {
489 int size = getSquareSizeOfImage(faIcon);
490
491 if (size > 0) {
492 File target = new File(rootDir,
493 APP_NAME.fetchFrom(params)
494 + "_fa_" + faIcon.getName());
495 IOUtils.copyFile(faIcon, target);
496
497 // xdg-icon-resource install --context mimetypes
498 // --size 64 awesomeapp_fa_1.png
499 // application-x.vnd-awesome
500 registrations.append(
501 "xdg-icon-resource install "
502 + "--context mimetypes --size ")
503 .append(size)
504 .append(" ")
505 .append(LINUX_INSTALL_DIR.fetchFrom(params))
506 .append("/")
507 .append(data.get("APPLICATION_FS_NAME"))
508 .append("/")
509 .append(target.getName())
510 .append(" ")
511 .append(dashMime)
512 .append("\n");
513
560 // prepare spec file
561 Writer w = new BufferedWriter(
562 new FileWriter(getConfig_SpecFile(params)));
563 String content = preprocessTextResource(
564 getConfig_SpecFile(params).getName(),
565 I18N.getString("resource.rpm-spec-file"),
566 DEFAULT_SPEC_TEMPLATE, data,
567 VERBOSE.fetchFrom(params),
568 RESOURCE_DIR.fetchFrom(params));
569 w.write(content);
570 w.close();
571
572 return true;
573 }
574
575 private Map<String, String> createReplacementData(
576 Map<String, ? super Object> params) throws IOException {
577 Map<String, String> data = new HashMap<>();
578
579 data.put("APPLICATION_NAME", APP_NAME.fetchFrom(params));
580 data.put("APPLICATION_FS_NAME", APP_NAME.fetchFrom(params));
581 data.put("APPLICATION_PACKAGE", BUNDLE_NAME.fetchFrom(params));
582 data.put("APPLICATION_VENDOR", VENDOR.fetchFrom(params));
583 data.put("APPLICATION_VERSION", VERSION.fetchFrom(params));
584 data.put("APPLICATION_LAUNCHER_FILENAME", APP_NAME.fetchFrom(params));
585 data.put("INSTALLATION_DIRECTORY", LINUX_INSTALL_DIR.fetchFrom(params));
586 data.put("XDG_PREFIX", XDG_FILE_PREFIX.fetchFrom(params));
587 data.put("DEPLOY_BUNDLE_CATEGORY", CATEGORY.fetchFrom(params));
588 // TODO rpm categories
589 data.put("APPLICATION_DESCRIPTION", DESCRIPTION.fetchFrom(params));
590 data.put("APPLICATION_SUMMARY", TITLE.fetchFrom(params));
591 data.put("APPLICATION_LICENSE_TYPE", LICENSE_TYPE.fetchFrom(params));
592 data.put("APPLICATION_LICENSE_FILE", getLicenseFileString(params));
593 String deps = LINUX_PACKAGE_DEPENDENCIES.fetchFrom(params);
594 data.put("PACKAGE_DEPENDENCIES",
595 deps.isEmpty() ? "" : "Requires: " + deps);
596 data.put("CREATE_JRE_INSTALLER",
597 Arguments.CREATE_JRE_INSTALLER.fetchFrom(params).toString());
598 return data;
599 }
600
601 private File getConfig_DesktopShortcutFile(File rootDir,
602 Map<String, ? super Object> params) {
603 return new File(rootDir, APP_NAME.fetchFrom(params) + ".desktop");
604 }
605
606 private File getConfig_IconFile(File rootDir,
607 Map<String, ? super Object> params) {
608 return new File(rootDir, APP_NAME.fetchFrom(params) + ".png");
609 }
610
611 private File getConfig_SpecFile(Map<String, ? super Object> params) {
612 return new File(RPM_IMAGE_DIR.fetchFrom(params),
613 APP_NAME.fetchFrom(params) + ".spec");
614 }
615
616 private File buildRPM(Map<String, ? super Object> params,
617 File outdir) throws IOException {
618 Log.verbose(MessageFormat.format(I18N.getString(
619 "message.outputting-bundle-location"),
620 outdir.getAbsolutePath()));
621
622 File broot = new File(BUILD_ROOT.fetchFrom(params), "rmpbuildroot");
623
624 outdir.mkdirs();
625
626 //run rpmbuild
627 ProcessBuilder pb = new ProcessBuilder(
628 TOOL_RPMBUILD,
629 "-bb", getConfig_SpecFile(params).getAbsolutePath(),
630 "--define", "%_sourcedir "
631 + RPM_IMAGE_DIR.fetchFrom(params).getAbsolutePath(),
632 // save result to output dir
633 "--define", "%_rpmdir " + outdir.getAbsolutePath(),
|