package com.wilutions.itol;
import java.text.MessageFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Optional;
import java.util.ResourceBundle;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.wilutions.com.BackgTask;
import com.wilutions.itol.db.Default;
import com.wilutions.itol.db.ProgressCallback;
import de.wim.liccheck.License;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.TextInputDialog;
import javafx.stage.Stage;
public class DlgLicense {
private static Logger log = Logger.getLogger("DlgLicense");
public static void show(IssueTaskPane taskPane) {
if (log.isLoggable(Level.FINE)) log.fine("show(");
Stage owner = (Stage)taskPane.getWindow();
ResourceBundle resb = Globals.getResourceBundle();
LicenseInstall licenseInstall = new LicenseInstall(Globals.getProductName());
License license = licenseInstall.getInstalledLicense();
String expiresAtIso = license.getExpiresAt();
String licenseKey = license.toString();
if (Default.value(licenseKey).isEmpty()) licenseKey = License.CUSTOMER_DEMO;
if (log.isLoggable(Level.INFO)) log.info("Current license=" + licenseKey + ", expiresAtIso=" + expiresAtIso);
// Determine which text to be displayed that describes
// the licensing state: DEMO, INVALID, valid
String headerText = makeLicenseText(resb, expiresAtIso, licenseKey);
TextInputDialog dialog = new TextInputDialog(licenseKey);
dialog.initOwner(owner);
dialog.setTitle(resb.getString("DlgLicense.titel"));
dialog.setHeaderText(headerText + " ");
// Show dialog
Optional<String> result = dialog.showAndWait();
if (result.isPresent()) {
// Set new license key?
String licenseKeyNew = result.get().trim();
if (!licenseKeyNew.equals(licenseKey)) {
if (log.isLoggable(Level.INFO)) log.info("Install new license key=" + licenseKeyNew);
ProgressCallback cb = taskPane.createProgressCallback("Install license");
cb.setFakeProgress(true);
BackgTask.run(() -> {
AtomicBoolean succ = new AtomicBoolean();
AtomicReference<Exception> ex = new AtomicReference<Exception>();
try {
// Uninstall current license
licenseInstall.uninstall(true);
// Install new license
boolean v = licenseInstall.install(licenseKeyNew, true);
succ.set(v);
if (v) {
log.info("Successuflly installed license key=" + licenseKeyNew);
}
else {
log.warning("Wrong license key=" + licenseKeyNew);
}
}
catch (Exception e) {
log.log(Level.SEVERE, "Failed to install license.", e);
ex.set(e);
}
finally {
cb.setFinished();
}
Platform.runLater(() -> {
// Show information or error dialog.
if (succ.get()) {
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle(dialog.getTitle());
License licenseNew = licenseInstall.getInstalledLicense();
String expiresAtIso3 = licenseNew.getExpiresAt();
String headerText3 = expiresAtIso3.isEmpty() ? resb.getString("DlgLicense.headerText.valid") : makeTimeLimitText(resb, expiresAtIso3);
alert.setContentText(headerText3);
alert.initOwner(owner);
alert.showAndWait();
}
else {
Alert alert = new Alert(AlertType.ERROR);
alert.setTitle(dialog.getTitle());
alert.setContentText(resb.getString("DlgLicense.headerText.wrong"));
alert.initOwner(owner);
alert.showAndWait();
}
// Set the license in the IssueTaskPane valid/invalid.
taskPane.setLicenseValid(succ.get());
});
});
}
}
if (log.isLoggable(Level.FINE)) log.fine(")show");
}
private static String makeTimeLimitText(ResourceBundle resb, String expiresAtIso) {
expiresAtIso = expiresAtIso.replace("-", "").replace(" ", "").replaceAll(":", "");
int year = Integer.parseInt(expiresAtIso.substring(0, 4));
int month = Integer.parseInt(expiresAtIso.substring(4, 6));
int day = Integer.parseInt(expiresAtIso.substring(6, 8));
LocalDate date = LocalDate.of(year, month, day);
String expiresAtIsoFormatted = date.format(DateTimeFormatter.ISO_DATE);
String ret = MessageFormat.format(resb.getString("DlgLicense.headerText.demo"), expiresAtIsoFormatted);
return ret;
}
private static String makeLicenseText(ResourceBundle resb, String expiresAtIso, String licenseKey) {
String headerText = "";
switch (licenseKey) {
case "DEMO":
if (expiresAtIso.length() >= 8) {
headerText = resb.getString("DlgLicense.headerText") + "\n" + makeTimeLimitText(resb, expiresAtIso);
break;
}
else {
// fall through
// INVALID
}
case "INVALID":
headerText = resb.getString("DlgLicense.headerText") + "\n" + resb.getString("DlgLicense.headerText.invalid");
break;
default: // VALID license
headerText = resb.getString("DlgLicense.headerText.valid");
break;
}
return headerText;
}
}