diff options
| author | Jakob Heher <jakob.heher@iaik.tugraz.at> | 2022-08-10 10:47:13 +0200 | 
|---|---|---|
| committer | Jakob Heher <jakob.heher@iaik.tugraz.at> | 2022-08-10 10:47:13 +0200 | 
| commit | 362ef2282c3efa0a2a8b807218f61c77697c6367 (patch) | |
| tree | 61e333fbb74be72e5354990c000ab0ad650e4629 | |
| parent | d8b153cc7c9f57922d1d6bed4cdbe07e3564a926 (diff) | |
| download | pdf-over-362ef2282c3efa0a2a8b807218f61c77697c6367.tar.gz pdf-over-362ef2282c3efa0a2a8b807218f61c77697c6367.tar.bz2 pdf-over-362ef2282c3efa0a2a8b807218f61c77697c6367.zip | |
offer factory reset if startup fails, or config screen fails to load, cf. #114
6 files changed, 84 insertions, 12 deletions
| diff --git a/pdf-over-commons/src/main/java/at/asit/pdfover/commons/Constants.java b/pdf-over-commons/src/main/java/at/asit/pdfover/commons/Constants.java index fedf0a58..d3864fdf 100644 --- a/pdf-over-commons/src/main/java/at/asit/pdfover/commons/Constants.java +++ b/pdf-over-commons/src/main/java/at/asit/pdfover/commons/Constants.java @@ -76,6 +76,9 @@ public class Constants {  	/** Configuration directory */  	public static final String CONFIG_DIRECTORY = System.getProperty("user.home") + File.separator + ".pdf-over"; +	/** Directory for config backup on factory reset */ +	public static final String CONFIG_BACKUP_DIRECTORY = System.getProperty("user.home") + File.separator + ".pdf-over.old"; +  	/** The default configuration file name */  	public static final String DEFAULT_CONFIG_FILENAME = "PDF-Over.config"; diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/config/ConfigurationManager.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/config/ConfigurationManager.java index 8d2800e7..eda1e59f 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/config/ConfigurationManager.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/config/ConfigurationManager.java @@ -24,6 +24,8 @@ import java.util.Locale;  import java.util.Properties;  import at.asit.pdfover.commons.Profile; + +import org.apache.commons.io.FileUtils;  import org.eclipse.swt.graphics.Point;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory; @@ -75,6 +77,44 @@ public class ConfigurationManager {  		this.configurationOverlay = new ConfigurationDataInMemory();  	} +	static public void factoryResetPersistentConfig() { +		// tell logback to close all file handles +		((ch.qos.logback.classic.LoggerContext)LoggerFactory.getILoggerFactory()).stop(); + +		File configDirectory = new File(Constants.CONFIG_DIRECTORY); +		File backupDirectory = new File(Constants.CONFIG_BACKUP_DIRECTORY); +		 +		// delete existing backup, if any +		FileUtils.deleteQuietly(backupDirectory); + +		// attempt 1: try to move the old config directory to a backup location +		try { +			FileUtils.moveDirectory( +				configDirectory, +				backupDirectory +			); +		} catch (Exception e) { +			System.out.println("Failed move config directory to backup location:"); +			e.printStackTrace(); + +			// attempt 2: try to simply force delete the config directory +			try { +				FileUtils.forceDelete(configDirectory); +			} catch (Exception e2) { +				System.out.println("Failed to delete config directory:"); +				e2.printStackTrace(); + +				// attempt 3: try to schedule the config directory for force deletion on JVM exit +				try { +					FileUtils.forceDeleteOnExit(configDirectory); +				} catch (Exception e3) { +					System.out.println("Failed to schedule config directory for deletion:"); +					e3.printStackTrace(); +				} +			} +		} +	} +  	/* load from disk */  	public void loadFromDisk() throws IOException {  		if (loaded) diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ConfigurationUIState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ConfigurationUIState.java index 74b38410..2aad12c9 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ConfigurationUIState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ConfigurationUIState.java @@ -20,11 +20,15 @@ import org.eclipse.swt.SWT;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory; +import at.asit.pdfover.commons.Messages;  import at.asit.pdfover.gui.MainWindowBehavior;  import at.asit.pdfover.gui.MainWindow.Buttons;  import at.asit.pdfover.gui.composites.ConfigurationComposite; +import at.asit.pdfover.gui.controls.ErrorDialog; +import at.asit.pdfover.gui.controls.Dialog.BUTTONS;  import at.asit.pdfover.gui.workflow.StateMachine;  import at.asit.pdfover.gui.workflow.Status; +import at.asit.pdfover.gui.workflow.config.ConfigurationManager;  /**   * @@ -64,10 +68,29 @@ public class ConfigurationUIState extends State {  	@Override  	public void run() {  		Status status = getStateMachine().status; - -		ConfigurationComposite config = this.getConfigurationComposite(); - -		getStateMachine().display(config); +		 +		ConfigurationComposite config; +		try { +			config = this.getConfigurationComposite(); +			getStateMachine().display(config); +		} catch (Exception e) { +			log.error("Failed to initialize config UI", e); +			ErrorDialog error = new ErrorDialog( +				getStateMachine().getMainShell(), +				Messages.getString("error.ConfigInitialization"), +				BUTTONS.YES_NO +			); + +			int selection = error.open(); +			if (selection == SWT.YES) +			{ +				ConfigurationManager.factoryResetPersistentConfig(); +				getStateMachine().exit(); +				return; +			} + +			throw e; +		}  		if(config.isUserDone())  		{ diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareConfigurationState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareConfigurationState.java index 1a3fd8b5..b6ea9c0b 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareConfigurationState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareConfigurationState.java @@ -348,15 +348,19 @@ public class PrepareConfigurationState extends State {  			setNextState(new OpenState(stateMachine)); -		} catch (InitializationException e) { +		} catch (Exception e) {  			log.error("Failed to initialize: ", e); -			ErrorDialog error = new ErrorDialog(getStateMachine() -					.getMainShell(), -					Messages.getString("error.Initialization"), -					BUTTONS.OK); +			ErrorDialog error = new ErrorDialog( +				getStateMachine().getMainShell(), +				Messages.getString("error.Initialization"), +				BUTTONS.YES_NO +			);  			// error.setException(e);  			// setNextState(error); -			error.open(); +			int selection = error.open(); +			if (selection == SWT.YES) +				ConfigurationManager.factoryResetPersistentConfig(); +  			getStateMachine().exit();  		}  	} diff --git a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties index da1cb68e..d8f0657e 100644 --- a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties +++ b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties @@ -142,7 +142,8 @@ error.FailedToOpenDocument=Failed to open signed document\: %s.  error.FailedToSaveSettings=Failed to save configuration file\!  error.FileNotExist=File %s does not exist\!  error.IOError=Input/Output Error -error.Initialization=Initialization failed. Please check your configuration. +error.Initialization=PDF-Over failed to initialize.\nWe're very sorry for the inconvenience.\n\nIt may be possible to restore functionality by resetting PDF-Over's configuration to factory defaults.\nWould you like to try this now? +error.ConfigInitialization=The options screen failed to initialize.\nWe're very sorry for the inconvenience.\n\nIt may be possible to restore functionality by resetting PDF-Over's configuration to factory defaults.\nWould you like to try this now?  error.InvalidBKU=Invalid CCE selection. Please check.  error.InvalidLocale=Locale not valid  error.InvalidPhoneNumber=Given phone number is invalid\! Example\:+43664123456789 diff --git a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties index b476be9d..ba82ea3e 100644 --- a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties +++ b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties @@ -130,7 +130,8 @@ error.FailedToOpenDocument=Konnte signiertes Dokument nicht öffnen\: %s.  error.FailedToSaveSettings=Konnte Konfigurationsdatei nicht speichern\!  error.FileNotExist=Datei %s existiert nicht\!  error.IOError=Ein-/Ausgabe-Fehler -error.Initialization=Initialisierung fehlgeschlagen. Bitte überprüfen Sie Ihre Konfiguration. +error.Initialization=Initialisierung fehlgeschlagen.\nWir bittem un Verzeihung für die Unannehmlichkeiten.\n\nEventuell lässt sich Ihr Problem beheben, indem Sie PDF-Over auf Werkseinstellungen zurücksetzen.\nMöchten Sie dies nun versuchen? +error.Initialization=Der Einstellungsbildschirm konnte nicht geladen werden.\nWir bittem un Verzeihung für die Unannehmlichkeiten.\n\nEventuell lässt sich Ihr Problem beheben, indem Sie PDF-Over auf Werkseinstellungen zurücksetzen.\nMöchten Sie dies nun versuchen?  error.InvalidBKU=Ungültige BKU-Auswahl. Bitte überprüfen.  error.InvalidLocale=Ungültige Sprache  error.InvalidPhoneNumber=Telefonnummer ungültig\! Beispiel\: +43664123456789 | 
