opends/resource/upgrade.bat
@@ -60,7 +60,7 @@ goto callJava :callLaunch "%DIR_HOME%\lib\winlauncher.exe" launch "%DIR_HOME%" "%JAVA_BIN%" %JAVA_ARGS% org.opends.quicksetup.uninstaller.UninstallLauncher "%DIR_HOME%\lib\winlauncher.exe" launch "%DIR_HOME%" "%JAVA_BIN%" %JAVA_ARGS% org.opends.quicksetup.upgrader.UpgradeLauncher goto end :callJava opends/src/quicksetup/org/opends/quicksetup/Application.java
@@ -61,7 +61,7 @@ Logger.getLogger(Application.class.getName()); /** The currently displayed wizard step. */ private Step displayedStep; private WizardStep displayedStep; /** Represents current install state. */ protected CurrentInstallStatus installStatus; @@ -608,7 +608,7 @@ * Returns the initial wizard step. * @return Step representing the first step to show in the wizard */ public abstract Step getFirstWizardStep(); public abstract WizardStep getFirstWizardStep(); /** * Called by the quicksetup controller when the user advances to @@ -619,7 +619,7 @@ * @param userData UserData representing the data specified by the user * @param dlg QuickSetupDialog hosting the wizard */ protected void setDisplayedWizardStep(Step step, protected void setDisplayedWizardStep(WizardStep step, UserData userData, QuickSetupDialog dlg) { this.displayedStep = step; @@ -639,7 +639,7 @@ */ protected abstract void setWizardDialogState(QuickSetupDialog dlg, UserData userData, Step step); WizardStep step); /** * Returns the installation path. @@ -760,21 +760,173 @@ * Returns the set of wizard steps used in this application's wizard. * @return Set of Step objects representing wizard steps */ abstract public Set<Step> getWizardSteps(); abstract public Set<WizardStep> getWizardSteps(); /** * Creates a wizard panel given a specific step. * @param step for which a panel representation should be created * @return QuickSetupStepPanel for representing the <code>step</code> */ abstract public QuickSetupStepPanel createWizardStepPanel(Step step); abstract public QuickSetupStepPanel createWizardStepPanel(WizardStep step); /** * Gets the next step in the wizard given a current step. * @param step Step the current step * @return Step the next step */ abstract public Step getNextWizardStep(Step step); abstract public WizardStep getNextWizardStep(WizardStep step); /** * Gets the previous step in the wizard given a current step. * @param step Step the current step * @return Step the previous step */ abstract public WizardStep getPreviousWizardStep(WizardStep step); /** * Indicates whether or not the user is allowed to return to a previous * step from <code>step</code>. * @param step WizardStep for which the the return value indicates whether * or not the user can return to a previous step * @return boolean where true indicates the user can return to a previous * step from <code>step</code> */ public boolean canGoBack(WizardStep step) { return !getFirstWizardStep().equals(step); } /** * Indicates whether or not the user is allowed to move to a new * step from <code>step</code>. * @param step WizardStep for which the the return value indicates whether * or not the user can move to a new step * @return boolean where true indicates the user can move to a new * step from <code>step</code> */ public boolean canGoForward(WizardStep step) { return getNextWizardStep(step) != null; } /** * Inidicates whether or not the user is allowed to finish the wizard from * <code>step</code>. * @param step WizardStep for which the the return value indicates whether * or not the user can finish the wizard * @return boolean where true indicates the user can finish the wizard */ public boolean canFinish(WizardStep step) { return getNextWizardStep(step) != null; } /** * Inidicates whether or not the user is allowed to quit the wizard from * <code>step</code>. * @param step WizardStep for which the the return value indicates whether * or not the user can quit the wizard * @return boolean where true indicates the user can quit the wizard */ public boolean canQuit(WizardStep step) { return false; } /** * Inidicates whether or not the user is allowed to close the wizard from * <code>step</code>. * @param step WizardStep for which the the return value indicates whether * or not the user can close the wizard * @return boolean where true indicates the user can close the wizard */ public boolean canClose(WizardStep step) { return false; } /** * Inidicates whether or not the user is allowed to cancel the wizard from * <code>step</code>. * @param step WizardStep for which the the return value indicates whether * or not the user can cancel the wizard * @return boolean where true indicates the user can cancel the wizard */ public boolean canCancel(WizardStep step) { return false; } /** * Called when the user has clicked the 'previous' button. * @param cStep WizardStep at which the user clicked the previous button * @param qs QuickSetup controller */ public abstract void previousClicked(WizardStep cStep, QuickSetup qs); /** * Called when the user has clicked the 'finish' button. * @param cStep WizardStep at which the user clicked the previous button * @param qs QuickSetup controller */ public abstract void finishClicked(final WizardStep cStep, final QuickSetup qs); /** * Called when the user has clicked the 'next' button. * @param cStep WizardStep at which the user clicked the next button * @param qs QuickSetup controller */ public abstract void nextClicked(WizardStep cStep, QuickSetup qs); /** * Called when the user has clicked the 'close' button. * @param cStep WizardStep at which the user clicked the close button * @param qs QuickSetup controller */ public abstract void closeClicked(WizardStep cStep, QuickSetup qs); /** * Called when the user has clicked the 'cancel' button. * @param cStep WizardStep at which the user clicked the cancel button * @param qs QuickSetup controller */ public abstract void cancelClicked(WizardStep cStep, QuickSetup qs); /** * Called when the user has clicked the 'quit' button. * @param step WizardStep at which the user clicked the quit button * @param qs QuickSetup controller */ abstract public void quitClicked(WizardStep step, QuickSetup qs); /** * Called whenever this application should update its user data from * values found in QuickSetup. * @param cStep current wizard step * @param qs QuickSetup controller * @throws UserDataException if there is a problem with the data */ abstract protected void updateUserData(WizardStep cStep, QuickSetup qs) throws UserDataException; /** * Gets the key for the close button's tool tip text. * @return String key of the text in the resource bundle */ public String getCloseButtonToolTip() { return "close-button-tooltip"; } /** * Gets the key for the finish button's tool tip text. * @return String key of the text in the resource bundle */ public String getFinishButtonToolTip() { return "finish-button-tooltip"; } /** * Gets the key for the finish button's label. * @return String key of the text in the resource bundle */ public String getFinishButtonLabel() { return "finish-button-label"; } /** * This class is used to read the standard error and standard output of the opends/src/quicksetup/org/opends/quicksetup/QuickSetup.java
@@ -35,7 +35,6 @@ import org.opends.quicksetup.installer.FieldName; import org.opends.quicksetup.ui.QuickSetupDialog; import org.opends.quicksetup.ui.UIFactory; import org.opends.quicksetup.uninstaller.UninstallUserData; import org.opends.quicksetup.util.BackgroundTask; import org.opends.quicksetup.util.ProgressMessageFormatter; import org.opends.quicksetup.util.Utils; @@ -77,7 +76,7 @@ private CurrentInstallStatus installStatus; private Step currentStep = Step.WELCOME; private WizardStep currentStep; private QuickSetupDialog dialog; @@ -89,17 +88,6 @@ private ProgressDescriptor descriptorToDisplay; // Constants used to do checks private static final int MIN_DIRECTORY_MANAGER_PWD = 1; private static final int MIN_PORT_VALUE = 1; private static final int MAX_PORT_VALUE = 65535; private static final int MIN_NUMBER_ENTRIES = 1; private static final int MAX_NUMBER_ENTRIES = 10000; // Update period of the dialogs. private static final int UPDATE_PERIOD = 500; @@ -246,47 +234,19 @@ } catch (Exception ex) { } synchronized (this) { if (Utils.isUninstall()) { final ProgressDescriptor desc = descriptorToDisplay; if (desc != null) { if (desc != lastDisplayedDescriptor) { lastDisplayedDescriptor = desc; synchronized (this) { final ProgressDescriptor desc = descriptorToDisplay; if (desc != null) { if (desc != lastDisplayedDescriptor) { lastDisplayedDescriptor = desc; SwingUtilities.invokeLater(new Runnable() { public void run() { getDialog().displayProgress(desc); } }); } doPool = desc != lastDescriptor; SwingUtilities.invokeLater(new Runnable() { public void run() { getDialog().displayProgress(desc); } }); } } else { final ProgressDescriptor desc = descriptorToDisplay; if (desc != null) { if (desc != lastDisplayedDescriptor) { lastDisplayedDescriptor = desc; SwingUtilities.invokeLater(new Runnable() { public void run() { getDialog().displayProgress(desc); } }); } doPool = desc != lastDescriptor; } doPool = desc != lastDescriptor; } } } @@ -298,55 +258,37 @@ */ private void nextClicked() { final Step cStep = getCurrentStep(); switch (cStep) { case PROGRESS: throw new IllegalStateException( "Cannot click on next from progress step"); case REVIEW: throw new IllegalStateException("Cannot click on next from review step"); default: BackgroundTask worker = new BackgroundTask() { public Object processBackgroundTask() throws UserDataException { try { updateUserData(cStep); } catch (UserDataException uide) { throw uide; } catch (Throwable t) { throw new UserDataException(cStep, getThrowableMsg("bug-msg", t)); } return null; final WizardStep cStep = getCurrentStep(); application.nextClicked(cStep, this); BackgroundTask worker = new BackgroundTask() { public Object processBackgroundTask() throws UserDataException { try { application.updateUserData(cStep, QuickSetup.this); } public void backgroundTaskCompleted(Object returnValue, Throwable throwable) { getDialog().workerFinished(); if (throwable != null) { UserDataException ude = (UserDataException)throwable; displayError(ude.getLocalizedMessage(), getMsg("error-title")); } else { setCurrentStep(nextStep(cStep)); } catch (UserDataException uide) { throw uide; } }; getDialog().workerStarted(); worker.startBackgroundTask(); } catch (Throwable t) { throw new UserDataException(cStep, getThrowableMsg("bug-msg", t)); } return null; } public void backgroundTaskCompleted(Object returnValue, Throwable throwable) { getDialog().workerFinished(); if (throwable != null) { UserDataException ude = (UserDataException) throwable; displayError(ude.getLocalizedMessage(), getMsg("error-title")); } else { setCurrentStep(application.getNextWizardStep(cStep)); } } }; getDialog().workerStarted(); worker.startBackgroundTask(); } /** @@ -355,82 +297,8 @@ */ private void finishClicked() { final Step cStep = getCurrentStep(); switch (cStep) { case REVIEW: updateUserDataForReviewPanel(); launchInstallation(); setCurrentStep(Step.PROGRESS); break; case CONFIRM_UNINSTALL: BackgroundTask worker = new BackgroundTask() { public Object processBackgroundTask() throws UserDataException { try { updateUserUninstallDataForConfirmUninstallPanel(); } catch (UserDataException uude) { throw uude; } catch (Throwable t) { throw new UserDataException(cStep, getThrowableMsg("bug-msg", t)); } return CurrentInstallStatus.isServerRunning(); } public void backgroundTaskCompleted(Object returnValue, Throwable throwable) { getDialog().workerFinished(); if (throwable != null) { displayError(throwable.getLocalizedMessage(), getMsg("error-title")); } else { boolean serverRunning = (Boolean) returnValue; if (!serverRunning) { application.getUserData().setStopServer(false); if (displayConfirmation( getMsg("confirm-uninstall-server-not-running-msg"), getMsg("confirm-uninstall-server-not-running-title"))) { launchUninstallation(); setCurrentStep(nextStep(cStep)); } } else { if (displayConfirmation( getMsg("confirm-uninstall-server-running-msg"), getMsg("confirm-uninstall-server-running-title"))) { application.getUserData().setStopServer(true); launchUninstallation(); setCurrentStep(nextStep(cStep)); } else { application.getUserData().setStopServer(false); } } } } }; getDialog().workerStarted(); worker.startBackgroundTask(); break; default: throw new IllegalStateException( "Cannot click on finish when we are not in the Review window"); } final WizardStep cStep = getCurrentStep(); application.finishClicked(cStep, this); } /** @@ -439,20 +307,9 @@ */ private void previousClicked() { Step cStep = getCurrentStep(); switch (cStep) { case WELCOME: throw new IllegalStateException( "Cannot click on previous from progress step"); case PROGRESS: throw new IllegalStateException( "Cannot click on previous from progress step"); default: setCurrentStep(previousStep(cStep)); } WizardStep cStep = getCurrentStep(); application.previousClicked(cStep, this); setCurrentStep(application.getPreviousWizardStep(cStep)); } /** @@ -461,28 +318,8 @@ */ private void quitClicked() { Step cStep = getCurrentStep(); switch (cStep) { case PROGRESS: throw new IllegalStateException( "Cannot click on quit from progress step"); default: if (Utils.isUninstall()) { quit(); } else if (installStatus.isInstalled()) { quit(); } else if (displayConfirmation(getMsg("confirm-quit-install-msg"), getMsg("confirm-quit-install-title"))) { quit(); } } WizardStep cStep = getCurrentStep(); application.quitClicked(cStep, this); } /** @@ -491,18 +328,10 @@ */ private void continueInstallClicked() { Step cStep = getCurrentStep(); switch (cStep) { case WELCOME: application.forceToDisplay(); getDialog().forceToDisplay(); setCurrentStep(Step.WELCOME); break; default: throw new IllegalStateException( "Continue only can be clicked on WELCOME step"); } // TODO: move this stuff to Installer? application.forceToDisplay(); getDialog().forceToDisplay(); setCurrentStep(Step.WELCOME); } /** @@ -511,35 +340,8 @@ */ private void closeClicked() { Step cStep = getCurrentStep(); switch (cStep) { case PROGRESS: if (Utils.isUninstall()) { boolean finished = application.isFinished(); if (finished || displayConfirmation(getMsg("confirm-close-uninstall-msg"), getMsg("confirm-close-uninstall-title"))) { quit(); } } else { boolean finished = application.isFinished(); if (finished || displayConfirmation(getMsg("confirm-close-install-msg"), getMsg("confirm-close-install-title"))) { quit(); } } break; default: throw new IllegalStateException( "Close only can be clicked on PROGRESS step"); } WizardStep cStep = getCurrentStep(); application.closeClicked(cStep, this); } /** @@ -548,17 +350,8 @@ */ private void cancelClicked() { Step cStep = getCurrentStep(); switch (cStep) { case CONFIRM_UNINSTALL: quit(); break; default: throw new IllegalStateException( "Cancel only can be clicked on CONFIRM_UNINSTALL step"); } WizardStep cStep = getCurrentStep(); application.cancelClicked(cStep, this); } private void launchStatusPanelClicked() @@ -626,402 +419,17 @@ * quit the program. * */ private void quit() public void quit() { System.exit(0); } /** * These methods validate the data provided by the user in the panels and * update the userData object according to that content. * * @param cStep * the current step of the wizard * * @throws UserDataException if the data provided by the user is not * valid. * */ private void updateUserData(Step cStep) throws UserDataException { switch (cStep) { case SERVER_SETTINGS: updateUserDataForServerSettingsPanel(); break; case DATA_OPTIONS: updateUserDataForDataOptionsPanel(); break; case REVIEW: updateUserDataForReviewPanel(); break; } } /** * Validate the data provided by the user in the server settings panel and * update the userData object according to that content. * * @throws UserDataException if the data provided by the user is not * valid. * */ private void updateUserDataForServerSettingsPanel() throws UserDataException { ArrayList<String> errorMsgs = new ArrayList<String>(); if (isWebStart()) { // Check the server location String serverLocation = getFieldStringValue(FieldName.SERVER_LOCATION); if ((serverLocation == null) || ("".equals(serverLocation.trim()))) { errorMsgs.add(getMsg("empty-server-location")); displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else if (!Utils.parentDirectoryExists(serverLocation)) { String[] arg = { serverLocation }; errorMsgs.add(getMsg("parent-directory-does-not-exist", arg)); displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else if (Utils.fileExists(serverLocation)) { String[] arg = { serverLocation }; errorMsgs.add(getMsg("file-exists", arg)); displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else if (Utils.directoryExistsAndIsNotEmpty(serverLocation)) { String[] arg = { serverLocation }; errorMsgs.add(getMsg("directory-exists-not-empty", arg)); displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else if (!Utils.canWrite(serverLocation)) { String[] arg = { serverLocation }; errorMsgs.add(getMsg("directory-not-writable", arg)); displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else if (!Utils.hasEnoughSpace(serverLocation, getRequiredInstallSpace())) { long requiredInMb = getRequiredInstallSpace() / (1024 * 1024); String[] args = { serverLocation, String.valueOf(requiredInMb) }; errorMsgs.add(getMsg("not-enough-disk-space", args)); displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else { application.getUserData().setServerLocation(serverLocation); displayFieldInvalid(FieldName.SERVER_LOCATION, false); } } // Check the port String sPort = getFieldStringValue(FieldName.SERVER_PORT); try { int port = Integer.parseInt(sPort); if ((port < MIN_PORT_VALUE) || (port > MAX_PORT_VALUE)) { String[] args = { String.valueOf(MIN_PORT_VALUE), String.valueOf(MAX_PORT_VALUE) }; errorMsgs.add(getMsg("invalid-port-value-range", args)); displayFieldInvalid(FieldName.SERVER_PORT, true); } else if (!Utils.canUseAsPort(port)) { if (Utils.isPriviledgedPort(port)) { errorMsgs.add(getMsg("cannot-bind-priviledged-port", new String[] { String.valueOf(port) })); } else { errorMsgs.add(getMsg("cannot-bind-port", new String[] { String.valueOf(port) })); } displayFieldInvalid(FieldName.SERVER_PORT, true); } else { application.getUserData().setServerPort(port); displayFieldInvalid(FieldName.SERVER_PORT, false); } } catch (NumberFormatException nfe) { String[] args = { String.valueOf(MIN_PORT_VALUE), String.valueOf(MAX_PORT_VALUE) }; errorMsgs.add(getMsg("invalid-port-value-range", args)); displayFieldInvalid(FieldName.SERVER_PORT, true); } // Check the Directory Manager DN String dmDn = getFieldStringValue(FieldName.DIRECTORY_MANAGER_DN); if ((dmDn == null) || (dmDn.trim().length() == 0)) { errorMsgs.add(getMsg("empty-directory-manager-dn")); displayFieldInvalid(FieldName.DIRECTORY_MANAGER_DN, true); } else if (!Utils.isDn(dmDn)) { errorMsgs.add(getMsg("not-a-directory-manager-dn")); displayFieldInvalid(FieldName.DIRECTORY_MANAGER_DN, true); } else if (Utils.isConfigurationDn(dmDn)) { errorMsgs.add(getMsg("directory-manager-dn-is-config-dn")); displayFieldInvalid(FieldName.DIRECTORY_MANAGER_DN, true); } else { application.getUserData().setDirectoryManagerDn(dmDn); displayFieldInvalid(FieldName.DIRECTORY_MANAGER_DN, false); } // Check the provided passwords String pwd1 = getFieldStringValue(FieldName.DIRECTORY_MANAGER_PWD); String pwd2 = getFieldStringValue(FieldName.DIRECTORY_MANAGER_PWD_CONFIRM); if (pwd1 == null) { pwd1 = ""; } boolean pwdValid = true; if (!pwd1.equals(pwd2)) { errorMsgs.add(getMsg("not-equal-pwd")); displayFieldInvalid(FieldName.DIRECTORY_MANAGER_PWD_CONFIRM, true); pwdValid = false; } if (pwd1.length() < MIN_DIRECTORY_MANAGER_PWD) { errorMsgs.add(getMsg(("pwd-too-short"), new String[] { String.valueOf(MIN_DIRECTORY_MANAGER_PWD) })); displayFieldInvalid(FieldName.DIRECTORY_MANAGER_PWD, true); if ((pwd2 == null) || (pwd2.length() < MIN_DIRECTORY_MANAGER_PWD)) { displayFieldInvalid(FieldName.DIRECTORY_MANAGER_PWD_CONFIRM, true); } pwdValid = false; } if (pwdValid) { application.getUserData().setDirectoryManagerPwd(pwd1); displayFieldInvalid(FieldName.DIRECTORY_MANAGER_PWD, false); displayFieldInvalid(FieldName.DIRECTORY_MANAGER_PWD_CONFIRM, false); } int defaultJMXPort = UserData.getDefaultJMXPort(); if (defaultJMXPort != -1) { application.getUserData().setServerJMXPort(defaultJMXPort); } if (errorMsgs.size() > 0) { throw new UserDataException(Step.SERVER_SETTINGS, Utils.getStringFromCollection(errorMsgs, "\n")); } } /** * Validate the data provided by the user in the data options panel and update * the userData object according to that content. * * @throws UserDataException if the data provided by the user is not * valid. * */ private void updateUserDataForDataOptionsPanel() throws UserDataException { ArrayList<String> errorMsgs = new ArrayList<String>(); DataOptions dataOptions = null; // Check the base dn boolean validBaseDn = false; String baseDn = getFieldStringValue(FieldName.DIRECTORY_BASE_DN); if ((baseDn == null) || (baseDn.trim().length() == 0)) { errorMsgs.add(getMsg("empty-base-dn")); displayFieldInvalid(FieldName.DIRECTORY_BASE_DN, true); } else if (!Utils.isDn(baseDn)) { errorMsgs.add(getMsg("not-a-base-dn")); displayFieldInvalid(FieldName.DIRECTORY_BASE_DN, true); } else if (Utils.isConfigurationDn(baseDn)) { errorMsgs.add(getMsg("base-dn-is-configuration-dn")); displayFieldInvalid(FieldName.DIRECTORY_BASE_DN, true); } else { displayFieldInvalid(FieldName.DIRECTORY_BASE_DN, false); validBaseDn = true; } // Check the data options DataOptions.Type type = (DataOptions.Type) getFieldValue(FieldName.DATA_OPTIONS); switch (type) { case IMPORT_FROM_LDIF_FILE: String ldifPath = getFieldStringValue(FieldName.LDIF_PATH); if ((ldifPath == null) || (ldifPath.trim().equals(""))) { errorMsgs.add(getMsg("no-ldif-path")); displayFieldInvalid(FieldName.LDIF_PATH, true); } else if (!Utils.fileExists(ldifPath)) { errorMsgs.add(getMsg("ldif-file-does-not-exist")); displayFieldInvalid(FieldName.LDIF_PATH, true); } else if (validBaseDn) { dataOptions = new DataOptions(type, baseDn, ldifPath); displayFieldInvalid(FieldName.LDIF_PATH, false); } break; case IMPORT_AUTOMATICALLY_GENERATED_DATA: // variable used to know if everything went ok during these // checks int startErrors = errorMsgs.size(); // Check the number of entries String nEntries = getFieldStringValue(FieldName.NUMBER_ENTRIES); if ((nEntries == null) || (nEntries.trim().equals(""))) { errorMsgs.add(getMsg("no-number-entries")); displayFieldInvalid(FieldName.NUMBER_ENTRIES, true); } else { boolean nEntriesValid = false; try { int n = Integer.parseInt(nEntries); nEntriesValid = n >= MIN_NUMBER_ENTRIES && n <= MAX_NUMBER_ENTRIES; } catch (NumberFormatException nfe) { } if (!nEntriesValid) { String[] args = { String.valueOf(MIN_NUMBER_ENTRIES), String.valueOf(MAX_NUMBER_ENTRIES) }; errorMsgs.add(getMsg("invalid-number-entries-range", args)); displayFieldInvalid(FieldName.NUMBER_ENTRIES, true); } else { displayFieldInvalid(FieldName.NUMBER_ENTRIES, false); } } if (startErrors == errorMsgs.size() && validBaseDn) { // No validation errors dataOptions = new DataOptions(type, baseDn, new Integer(nEntries)); } break; default: displayFieldInvalid(FieldName.LDIF_PATH, false); displayFieldInvalid(FieldName.NUMBER_ENTRIES, false); if (validBaseDn) { dataOptions = new DataOptions(type, baseDn); } } if (dataOptions != null) { application.getUserData().setDataOptions(dataOptions); } if (errorMsgs.size() > 0) { throw new UserDataException(Step.DATA_OPTIONS, Utils.getStringFromCollection(errorMsgs, "\n")); } } /** * Update the userData object according to the content of the review * panel. * */ private void updateUserDataForReviewPanel() { Boolean b = (Boolean) getFieldValue(FieldName.SERVER_START); application.getUserData().setStartServer(b.booleanValue()); } /** * Update the UserData object according to the content of the review * panel. * */ private void updateUserUninstallDataForConfirmUninstallPanel() throws UserDataException { // TODO: move this to the Uninstall application UninstallUserData uud = (UninstallUserData)application.getUserData(); uud.setRemoveLibrariesAndTools( (Boolean)getFieldValue(FieldName.REMOVE_LIBRARIES_AND_TOOLS)); uud.setRemoveDatabases( (Boolean)getFieldValue(FieldName.REMOVE_DATABASES)); uud.setRemoveConfigurationAndSchema( (Boolean)getFieldValue(FieldName.REMOVE_CONFIGURATION_AND_SCHEMA)); uud.setRemoveBackups( (Boolean)getFieldValue(FieldName.REMOVE_BACKUPS)); uud.setRemoveLDIFs( (Boolean)getFieldValue(FieldName.REMOVE_LDIFS)); uud.setRemoveLogs( (Boolean)getFieldValue(FieldName.REMOVE_LOGS)); Set<String> dbs = new HashSet<String>(); Set s = (Set)getFieldValue(FieldName.EXTERNAL_DB_DIRECTORIES); for (Object v: s) { dbs.add((String)v); } Set<String> logs = new HashSet<String>(); s = (Set)getFieldValue(FieldName.EXTERNAL_LOG_FILES); for (Object v: s) { logs.add((String)v); } uud.setExternalDbsToRemove(dbs); uud.setExternalLogsToRemove(logs); if ((dbs.size() == 0) && (logs.size() == 0) && !uud.getRemoveLibrariesAndTools() && !uud.getRemoveDatabases() && !uud.getRemoveConfigurationAndSchema() && !uud.getRemoveBackups() && !uud.getRemoveLDIFs() && !uud.getRemoveLogs()) { throw new UserDataException(Step.CONFIRM_UNINSTALL, getMsg("nothing-selected-to-uninstall")); } } /** * Launch the installation of Open DS. Depending on whether we are running a * web start or not it will use on Installer object or other. * */ private void launchInstallation() public void launchInstallation() { ProgressMessageFormatter formatter = getDialog().getFormatter(); @@ -1041,7 +449,7 @@ * Launch the uninstallation of Open DS. * */ private void launchUninstallation() public void launchUninstallation() { application.addProgressUpdateListener(this); new Thread(application).start(); @@ -1100,7 +508,7 @@ * * @return the currently displayed Step of the wizard. */ private Step getCurrentStep() private WizardStep getCurrentStep() { return currentStep; } @@ -1112,7 +520,7 @@ * * @param step The step to be displayed. */ public void setCurrentStep(Step step) public void setCurrentStep(WizardStep step) { if (step == null) { @@ -1123,60 +531,11 @@ } /** * Gets the next step corresponding to the step passed as parameter. * * @param step the step of which we want to get the new step. * @return the next step for the current step. */ public Step nextStep(Step step) { Step nextStep; if (step == Step.CONFIRM_UNINSTALL) { nextStep = Step.PROGRESS; } else { Iterator<Step> it = EnumSet.range(step, Step.PROGRESS).iterator(); it.next(); if (!it.hasNext()) { throw new IllegalArgumentException("No next for step: " + step); } nextStep = it.next(); } return nextStep; } /** * Gets the previous step corresponding to the step passed as parameter. * * @param step, * the step of which we want to get the previous step. * @return the next step for the current step. * @throws IllegalArgumentException * if the current step has not a previous step. */ private Step previousStep(Step step) { Step previous = null; for (Step s : Step.values()) { if (s == step) { return previous; } previous = s; } throw new IllegalArgumentException("No previous for step: " + step); } /** * Get the dialog that is displayed. * * @return the dialog. */ private QuickSetupDialog getDialog() public QuickSetupDialog getDialog() { if (dialog == null) { @@ -1222,7 +581,7 @@ * the field name object. * @return the string value for the field name. */ private String getFieldStringValue(FieldName fieldName) public String getFieldStringValue(FieldName fieldName) { String sValue = null; @@ -1247,7 +606,7 @@ * the field name object. * @return the value for the field name. */ private Object getFieldValue(FieldName fieldName) public Object getFieldValue(FieldName fieldName) { return getDialog().getFieldValue(fieldName); } @@ -1263,7 +622,7 @@ * @param invalid * whether to mark the field valid or invalid. */ private void displayFieldInvalid(FieldName fieldName, boolean invalid) public void displayFieldInvalid(FieldName fieldName, boolean invalid) { getDialog().displayFieldInvalid(fieldName, invalid); } @@ -1313,22 +672,7 @@ { return Utils.isWebStart(); } /** * Returns the number of free disk space in bytes required to install Open DS * * For the moment we just return 15 Megabytes. TODO we might want to have * something dynamic to calculate the required free disk space for the * installation. * * @return the number of free disk space required to install Open DS. */ private long getRequiredInstallSpace() { return 15 * 1024 * 1024; } } /** * This class is just used to specify which are the default values that will be * proposed to the user in the Data Options panel of the Installation wizard. opends/src/quicksetup/org/opends/quicksetup/Step.java
@@ -32,7 +32,7 @@ * the installation and uninstallation wizards. * */ public enum Step public enum Step implements WizardStep { /** opends/src/quicksetup/org/opends/quicksetup/UserData.java
@@ -48,6 +48,8 @@ * Creates a user data object with default values. */ public UserData() { startServer = true; DataOptions defaultDataOptions = new DefaultDataOptions(); setServerLocation(Utils.getDefaultServerLocation()); opends/src/quicksetup/org/opends/quicksetup/UserDataException.java
@@ -37,7 +37,7 @@ { private static final long serialVersionUID = 1798143194655443132L; private Step step; private WizardStep step; private String localizedMessage; @@ -46,7 +46,7 @@ * @param step the step in the wizard where the exception occurred. * @param localizedMessage the localized message describing the error. */ public UserDataException(Step step, String localizedMessage) public UserDataException(WizardStep step, String localizedMessage) { super(localizedMessage); this.step = step; @@ -66,7 +66,7 @@ * Returns the step of the wizard in which this exception occurred. * @return the step of the wizard in which this exception occurred. */ public Step getStep() public WizardStep getStep() { return step; } opends/src/quicksetup/org/opends/quicksetup/WizardStep.java
New file @@ -0,0 +1,42 @@ /* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Portions Copyright 2007 Sun Microsystems, Inc. */ package org.opends.quicksetup; /** * Step in a QuickSetup wizard application. */ public interface WizardStep { /** * Gets the message key associated with the display name of this step. * @return String message key for accessing this step's display name * in a message bundle */ String getMessageKey(); } opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
@@ -26,14 +26,11 @@ */ package org.opends.quicksetup.installer; import static org.opends.quicksetup.Step.WELCOME; import static org.opends.quicksetup.Step.*; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Map; import java.util.Set; import java.util.EnumSet; import java.util.*; import java.awt.event.WindowEvent; import org.opends.quicksetup.ui.*; @@ -65,6 +62,19 @@ /* Indicates that we've detected that there is something installed */ boolean forceToDisplaySetup = false; // Constants used to do checks private static final int MIN_DIRECTORY_MANAGER_PWD = 1; private static final int MIN_PORT_VALUE = 1; private static final int MAX_PORT_VALUE = 65535; private static final int MIN_NUMBER_ENTRIES = 1; private static final int MAX_NUMBER_ENTRIES = 10000; private List<WizardStep> lstSteps = new ArrayList<WizardStep>(); /** * An static String that contains the class name of ConfigFileHandler. */ @@ -72,6 +82,17 @@ "org.opends.server.extensions.ConfigFileHandler"; /** * Creates a default instance. */ public Installer() { lstSteps.add(WELCOME); lstSteps.add(SERVER_SETTINGS); lstSteps.add(DATA_OPTIONS); lstSteps.add(REVIEW); lstSteps.add(PROGRESS); } /** * {@inheritDoc} */ public void forceToDisplay() { @@ -81,6 +102,127 @@ /** * {@inheritDoc} */ public boolean canGoBack(WizardStep step) { return step != WELCOME && step != PROGRESS; } /** * {@inheritDoc} */ public boolean canGoForward(WizardStep step) { return step != REVIEW && step != PROGRESS; } /** * {@inheritDoc} */ public boolean canFinish(WizardStep step) { return step == REVIEW; } /** * {@inheritDoc} */ public boolean canQuit(WizardStep step) { return step != PROGRESS; } /** * {@inheritDoc} */ public boolean canClose(WizardStep step) { return step == PROGRESS; } /** * {@inheritDoc} */ public boolean canCancel(WizardStep step) { return false; } /** * {@inheritDoc} */ public void previousClicked(WizardStep cStep) { if (cStep == WELCOME) { throw new IllegalStateException( "Cannot click on previous from progress step"); } else if (cStep == PROGRESS) { throw new IllegalStateException( "Cannot click on previous from progress step"); } } /** * {@inheritDoc} */ public void finishClicked(final WizardStep cStep, final QuickSetup qs) { if (cStep == Step.REVIEW) { updateUserDataForReviewPanel(qs); qs.launchInstallation(); qs.setCurrentStep(Step.PROGRESS); } else { throw new IllegalStateException( "Cannot click on finish when we are not in the Review window"); } } /** * {@inheritDoc} */ public void nextClicked(WizardStep cStep, QuickSetup qs) { if (cStep == PROGRESS) { throw new IllegalStateException( "Cannot click on next from progress step"); } else if (cStep == REVIEW) { throw new IllegalStateException("Cannot click on next from review step"); } } /** * {@inheritDoc} */ public void closeClicked(WizardStep cStep, QuickSetup qs) { if (cStep == PROGRESS) { if (isFinished() || qs.displayConfirmation(getMsg("confirm-close-install-msg"), getMsg("confirm-close-install-title"))) { qs.quit(); } } else { throw new IllegalStateException( "Close only can be clicked on PROGRESS step"); } } /** * {@inheritDoc} */ public void cancelClicked(WizardStep cStep, QuickSetup qs) { // do nothing; } /** * {@inheritDoc} */ public void quitClicked(WizardStep cStep, QuickSetup qs) { if (cStep == PROGRESS) { throw new IllegalStateException( "Cannot click on quit from progress step"); } else if (installStatus.isInstalled()) { qs.quit(); } else if (qs.displayConfirmation(getMsg("confirm-quit-install-msg"), getMsg("confirm-quit-install-title"))) { qs.quit(); } } /** * {@inheritDoc} */ public ButtonName getInitialFocusButtonName() { ButtonName name = null; if (!installStatus.isInstalled() || forceToDisplaySetup) @@ -118,35 +260,25 @@ /** * {@inheritDoc} */ public Set<Step> getWizardSteps() { return EnumSet.of(WELCOME, Step.SERVER_SETTINGS, Step.DATA_OPTIONS, Step.REVIEW, Step.PROGRESS); public Set<WizardStep> getWizardSteps() { return Collections.unmodifiableSet(new HashSet<WizardStep>(lstSteps)); } /** * {@inheritDoc} */ public QuickSetupStepPanel createWizardStepPanel(Step step) { public QuickSetupStepPanel createWizardStepPanel(WizardStep step) { QuickSetupStepPanel p = null; switch (step) { case WELCOME: if (step == WELCOME) { p = new InstallWelcomePanel(); break; case SERVER_SETTINGS: } else if (step == SERVER_SETTINGS) { p = new ServerSettingsPanel(getUserData()); break; case DATA_OPTIONS: } else if (step == DATA_OPTIONS) { p = new DataOptionsPanel(getUserData()); break; case REVIEW: } else if (step == REVIEW) { p = new ReviewPanel(getUserData()); break; case PROGRESS: } else if (step == PROGRESS) { p = new ProgressPanel(); break; } return p; } @@ -173,6 +305,27 @@ /** * {@inheritDoc} */ public String getCloseButtonToolTip() { return "close-button-install-tooltip"; } /** * {@inheritDoc} */ public String getFinishButtonToolTip() { return "finish-button-install-tooltip"; } /** * {@inheritDoc} */ public void previousClicked(WizardStep cStep, QuickSetup qs) { // do nothing; } /** * {@inheritDoc} */ public String getFrameTitle() { return getMsg("frame-install-title"); } @@ -186,45 +339,28 @@ */ protected void setWizardDialogState(QuickSetupDialog dlg, UserData userData, Step step) { WizardStep step) { if (!installStatus.isInstalled() || forceToDisplaySetup) { // Set the default button for the frame switch (step) { case REVIEW: if (step == REVIEW) { dlg.setDefaultButton(ButtonName.FINISH); break; case PROGRESS: dlg.setDefaultButton(ButtonName.CLOSE); break; default: dlg.setDefaultButton(ButtonName.NEXT); } // Set the focus for the current step switch (step) { case WELCOME: dlg.setFocusOnButton(ButtonName.NEXT); break; case SERVER_SETTINGS: // The focus is set by the panel itself break; case DATA_OPTIONS: // The focus is set by the panel itself break; case REVIEW: dlg.setFocusOnButton(ButtonName.FINISH); break; case PROGRESS: dlg.setFocusOnButton(ButtonName.CLOSE); dlg.setButtonEnabled(ButtonName.CLOSE, false); break; } else if (step == PROGRESS) { dlg.setDefaultButton(ButtonName.CLOSE); } else if (step == WELCOME) { dlg.setFocusOnButton(ButtonName.NEXT); } else if (step == SERVER_SETTINGS) { // The focus is set by the panel itself } else if (step == DATA_OPTIONS) { // The focus is set by the panel itself } else if (step == REVIEW) { // do nothing? } else if (step == PROGRESS) { dlg.setFocusOnButton(ButtonName.CLOSE); dlg.setButtonEnabled(ButtonName.CLOSE, false); } else { dlg.setDefaultButton(ButtonName.NEXT); } } } @@ -240,27 +376,32 @@ /** * {@inheritDoc} */ public Step getFirstWizardStep() { public WizardStep getFirstWizardStep() { return WELCOME; } /** * {@inheritDoc} */ public Step getNextWizardStep(Step step) { Step nextStep = null; if (step != null) { if (step.equals(Step.WELCOME)) { nextStep = Step.SERVER_SETTINGS; } else if (step.equals(Step.SERVER_SETTINGS)) { nextStep = Step.DATA_OPTIONS; } else if (step.equals(Step.DATA_OPTIONS)) { nextStep = Step.REVIEW; } else if (step.equals(Step.REVIEW)) { nextStep = Step.PROGRESS; } public WizardStep getNextWizardStep(WizardStep step) { WizardStep next = null; int i = lstSteps.indexOf(step); if (i != -1 && i + 1 < lstSteps.size()) { next = lstSteps.get(i + 1); } return nextStep; return next; } /** * {@inheritDoc} */ public WizardStep getPreviousWizardStep(WizardStep step) { WizardStep prev = null; int i = lstSteps.indexOf(step); if (i != -1 && i > 0) { prev = lstSteps.get(i - 1); } return prev; } /** @@ -559,6 +700,29 @@ } /** * These methods validate the data provided by the user in the panels and * update the userData object according to that content. * * @param cStep * the current step of the wizard * @param qs QuickStart controller * @throws UserDataException if the data provided by the user is not * valid. * */ protected void updateUserData(WizardStep cStep, QuickSetup qs) throws UserDataException { if (cStep == SERVER_SETTINGS) { updateUserDataForServerSettingsPanel(qs); } else if (cStep == DATA_OPTIONS) { updateUserDataForDataOptionsPanel(qs); } else if (cStep == REVIEW) { updateUserDataForReviewPanel(qs); } } /** * Returns the default backend name (the one that will be created). * @return the default backend name (the one that will be created). */ @@ -575,4 +739,321 @@ return Utils.getPath(getInstallationPath(), Utils.getBinariesRelativePath()); } /** * Validate the data provided by the user in the server settings panel and * update the userData object according to that content. * * @throws UserDataException if the data provided by the user is not * valid. * */ private void updateUserDataForServerSettingsPanel(QuickSetup qs) throws UserDataException { ArrayList<String> errorMsgs = new ArrayList<String>(); if (Utils.isWebStart()) { // Check the server location String serverLocation = qs.getFieldStringValue(FieldName.SERVER_LOCATION); if ((serverLocation == null) || ("".equals(serverLocation.trim()))) { errorMsgs.add(getMsg("empty-server-location")); qs.displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else if (!Utils.parentDirectoryExists(serverLocation)) { String[] arg = { serverLocation }; errorMsgs.add(getMsg("parent-directory-does-not-exist", arg)); qs.displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else if (Utils.fileExists(serverLocation)) { String[] arg = { serverLocation }; errorMsgs.add(getMsg("file-exists", arg)); qs.displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else if (Utils.directoryExistsAndIsNotEmpty(serverLocation)) { String[] arg = { serverLocation }; errorMsgs.add(getMsg("directory-exists-not-empty", arg)); qs.displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else if (!Utils.canWrite(serverLocation)) { String[] arg = { serverLocation }; errorMsgs.add(getMsg("directory-not-writable", arg)); qs.displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else if (!Utils.hasEnoughSpace(serverLocation, getRequiredInstallSpace())) { long requiredInMb = getRequiredInstallSpace() / (1024 * 1024); String[] args = { serverLocation, String.valueOf(requiredInMb) }; errorMsgs.add(getMsg("not-enough-disk-space", args)); qs.displayFieldInvalid(FieldName.SERVER_LOCATION, true); } else { getUserData().setServerLocation(serverLocation); qs.displayFieldInvalid(FieldName.SERVER_LOCATION, false); } } // Check the port String sPort = qs.getFieldStringValue(FieldName.SERVER_PORT); try { int port = Integer.parseInt(sPort); if ((port < MIN_PORT_VALUE) || (port > MAX_PORT_VALUE)) { String[] args = { String.valueOf(MIN_PORT_VALUE), String.valueOf(MAX_PORT_VALUE) }; errorMsgs.add(getMsg("invalid-port-value-range", args)); qs.displayFieldInvalid(FieldName.SERVER_PORT, true); } else if (!Utils.canUseAsPort(port)) { if (Utils.isPriviledgedPort(port)) { errorMsgs.add(getMsg("cannot-bind-priviledged-port", new String[] { String.valueOf(port) })); } else { errorMsgs.add(getMsg("cannot-bind-port", new String[] { String.valueOf(port) })); } qs.displayFieldInvalid(FieldName.SERVER_PORT, true); } else { getUserData().setServerPort(port); qs.displayFieldInvalid(FieldName.SERVER_PORT, false); } } catch (NumberFormatException nfe) { String[] args = { String.valueOf(MIN_PORT_VALUE), String.valueOf(MAX_PORT_VALUE) }; errorMsgs.add(getMsg("invalid-port-value-range", args)); qs.displayFieldInvalid(FieldName.SERVER_PORT, true); } // Check the Directory Manager DN String dmDn = qs.getFieldStringValue(FieldName.DIRECTORY_MANAGER_DN); if ((dmDn == null) || (dmDn.trim().length() == 0)) { errorMsgs.add(getMsg("empty-directory-manager-dn")); qs.displayFieldInvalid(FieldName.DIRECTORY_MANAGER_DN, true); } else if (!Utils.isDn(dmDn)) { errorMsgs.add(getMsg("not-a-directory-manager-dn")); qs.displayFieldInvalid(FieldName.DIRECTORY_MANAGER_DN, true); } else if (Utils.isConfigurationDn(dmDn)) { errorMsgs.add(getMsg("directory-manager-dn-is-config-dn")); qs.displayFieldInvalid(FieldName.DIRECTORY_MANAGER_DN, true); } else { getUserData().setDirectoryManagerDn(dmDn); qs.displayFieldInvalid(FieldName.DIRECTORY_MANAGER_DN, false); } // Check the provided passwords String pwd1 = qs.getFieldStringValue(FieldName.DIRECTORY_MANAGER_PWD); String pwd2 = qs.getFieldStringValue(FieldName.DIRECTORY_MANAGER_PWD_CONFIRM); if (pwd1 == null) { pwd1 = ""; } boolean pwdValid = true; if (!pwd1.equals(pwd2)) { errorMsgs.add(getMsg("not-equal-pwd")); qs.displayFieldInvalid(FieldName.DIRECTORY_MANAGER_PWD_CONFIRM, true); pwdValid = false; } if (pwd1.length() < MIN_DIRECTORY_MANAGER_PWD) { errorMsgs.add(getMsg(("pwd-too-short"), new String[] { String.valueOf(MIN_DIRECTORY_MANAGER_PWD) })); qs.displayFieldInvalid(FieldName.DIRECTORY_MANAGER_PWD, true); if ((pwd2 == null) || (pwd2.length() < MIN_DIRECTORY_MANAGER_PWD)) { qs.displayFieldInvalid(FieldName.DIRECTORY_MANAGER_PWD_CONFIRM, true); } pwdValid = false; } if (pwdValid) { getUserData().setDirectoryManagerPwd(pwd1); qs.displayFieldInvalid(FieldName.DIRECTORY_MANAGER_PWD, false); qs.displayFieldInvalid(FieldName.DIRECTORY_MANAGER_PWD_CONFIRM, false); } int defaultJMXPort = UserData.getDefaultJMXPort(); if (defaultJMXPort != -1) { getUserData().setServerJMXPort(defaultJMXPort); } if (errorMsgs.size() > 0) { throw new UserDataException(Step.SERVER_SETTINGS, Utils.getStringFromCollection(errorMsgs, "\n")); } } /** * Validate the data provided by the user in the data options panel and update * the userData object according to that content. * * @throws UserDataException if the data provided by the user is not * valid. * */ private void updateUserDataForDataOptionsPanel(QuickSetup qs) throws UserDataException { ArrayList<String> errorMsgs = new ArrayList<String>(); DataOptions dataOptions = null; // Check the base dn boolean validBaseDn = false; String baseDn = qs.getFieldStringValue(FieldName.DIRECTORY_BASE_DN); if ((baseDn == null) || (baseDn.trim().length() == 0)) { errorMsgs.add(getMsg("empty-base-dn")); qs.displayFieldInvalid(FieldName.DIRECTORY_BASE_DN, true); } else if (!Utils.isDn(baseDn)) { errorMsgs.add(getMsg("not-a-base-dn")); qs.displayFieldInvalid(FieldName.DIRECTORY_BASE_DN, true); } else if (Utils.isConfigurationDn(baseDn)) { errorMsgs.add(getMsg("base-dn-is-configuration-dn")); qs.displayFieldInvalid(FieldName.DIRECTORY_BASE_DN, true); } else { qs.displayFieldInvalid(FieldName.DIRECTORY_BASE_DN, false); validBaseDn = true; } // Check the data options DataOptions.Type type = (DataOptions.Type) qs.getFieldValue(FieldName.DATA_OPTIONS); switch (type) { case IMPORT_FROM_LDIF_FILE: String ldifPath = qs.getFieldStringValue(FieldName.LDIF_PATH); if ((ldifPath == null) || (ldifPath.trim().equals(""))) { errorMsgs.add(getMsg("no-ldif-path")); qs.displayFieldInvalid(FieldName.LDIF_PATH, true); } else if (!Utils.fileExists(ldifPath)) { errorMsgs.add(getMsg("ldif-file-does-not-exist")); qs.displayFieldInvalid(FieldName.LDIF_PATH, true); } else if (validBaseDn) { dataOptions = new DataOptions(type, baseDn, ldifPath); qs.displayFieldInvalid(FieldName.LDIF_PATH, false); } break; case IMPORT_AUTOMATICALLY_GENERATED_DATA: // variable used to know if everything went ok during these // checks int startErrors = errorMsgs.size(); // Check the number of entries String nEntries = qs.getFieldStringValue(FieldName.NUMBER_ENTRIES); if ((nEntries == null) || (nEntries.trim().equals(""))) { errorMsgs.add(getMsg("no-number-entries")); qs.displayFieldInvalid(FieldName.NUMBER_ENTRIES, true); } else { boolean nEntriesValid = false; try { int n = Integer.parseInt(nEntries); nEntriesValid = n >= MIN_NUMBER_ENTRIES && n <= MAX_NUMBER_ENTRIES; } catch (NumberFormatException nfe) { } if (!nEntriesValid) { String[] args = { String.valueOf(MIN_NUMBER_ENTRIES), String.valueOf(MAX_NUMBER_ENTRIES) }; errorMsgs.add(getMsg("invalid-number-entries-range", args)); qs.displayFieldInvalid(FieldName.NUMBER_ENTRIES, true); } else { qs.displayFieldInvalid(FieldName.NUMBER_ENTRIES, false); } } if (startErrors == errorMsgs.size() && validBaseDn) { // No validation errors dataOptions = new DataOptions(type, baseDn, new Integer(nEntries)); } break; default: qs.displayFieldInvalid(FieldName.LDIF_PATH, false); qs.displayFieldInvalid(FieldName.NUMBER_ENTRIES, false); if (validBaseDn) { dataOptions = new DataOptions(type, baseDn); } } if (dataOptions != null) { getUserData().setDataOptions(dataOptions); } if (errorMsgs.size() > 0) { throw new UserDataException(Step.DATA_OPTIONS, Utils.getStringFromCollection(errorMsgs, "\n")); } } /** * Update the userData object according to the content of the review * panel. * */ private void updateUserDataForReviewPanel(QuickSetup qs) { Boolean b = (Boolean) qs.getFieldValue(FieldName.SERVER_START); getUserData().setStartServer(b.booleanValue()); } /** * Returns the number of free disk space in bytes required to install Open DS * * For the moment we just return 15 Megabytes. TODO we might want to have * something dynamic to calculate the required free disk space for the * installation. * * @return the number of free disk space required to install Open DS. */ private long getRequiredInstallSpace() { return 15 * 1024 * 1024; } } opends/src/quicksetup/org/opends/quicksetup/installer/offline/OfflineInstaller.java
@@ -156,7 +156,7 @@ * Initialize the different map used in this class. * */ private void initMaps() protected void initMaps() { initSummaryMap(hmSummary); opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties
@@ -187,11 +187,14 @@ next-button-tooltip=Go to Next Step previous-button-label=< Previous previous-button-tooltip=Go to Previous Step finish-button-label=Finish finish-button-install-label=Finish finish-button-uninstall-label=Uninstall finish-button-install-tooltip=Finish Installation and Setup finish-button-uninstall-tooltip=Finish Uninstall finish-button-tooltip=Finish QuickSetup close-button-label=Close close-button-tooltip=Close QuickSetup Window close-button-install-tooltip=Close QuickSetup Window close-button-uninstall-tooltip=Close Uninstall Window quit-button-label=Quit opends/src/quicksetup/org/opends/quicksetup/ui/ButtonsPanel.java
@@ -39,10 +39,12 @@ import javax.swing.JPanel; import org.opends.quicksetup.ButtonName; import org.opends.quicksetup.Step; import org.opends.quicksetup.WizardStep; import org.opends.quicksetup.Application; import org.opends.quicksetup.uninstaller.Uninstaller; import org.opends.quicksetup.installer.Installer; import org.opends.quicksetup.event.ButtonActionListener; import org.opends.quicksetup.event.ButtonEvent; import org.opends.quicksetup.util.Utils; /** * This class contains the buttons in the bottom of the Install/Uninstall @@ -69,12 +71,16 @@ private JButton cancelButton; private Application application; /** * Default constructor. * @param application Application running in QuickSetup * */ public ButtonsPanel() public ButtonsPanel(Application application) { this.application = application; createButtons(); layoutButtons(); } @@ -104,66 +110,14 @@ * * @param step the step in the wizard. */ public void setDisplayedStep(Step step) public void setDisplayedStep(WizardStep step) { switch (step) { case WELCOME: previousButton.setVisible(false); nextButton.setVisible(true); finishButton.setVisible(false); quitButton.setVisible(true); closeButton.setVisible(false); cancelButton.setVisible(false); break; case REVIEW: previousButton.setVisible(true); nextButton.setVisible(false); finishButton.setVisible(true); quitButton.setVisible(true); closeButton.setVisible(false); cancelButton.setVisible(false); break; case PROGRESS: // TO COMPLETE: if there is an error we might want to change // this // like for instance coming back previousButton.setVisible(false); nextButton.setVisible(false); finishButton.setVisible(false); quitButton.setVisible(false); closeButton.setVisible(true); cancelButton.setVisible(false); break; case CONFIRM_UNINSTALL: previousButton.setVisible(false); nextButton.setVisible(false); finishButton.setVisible(true); quitButton.setVisible(false); closeButton.setVisible(false); cancelButton.setVisible(true); break; default: previousButton.setVisible(true); nextButton.setVisible(true); finishButton.setVisible(false); quitButton.setVisible(true); closeButton.setVisible(false); cancelButton.setVisible(false); } previousButton.setVisible(application.canGoBack(step)); nextButton.setVisible(application.canGoForward(step)); finishButton.setVisible(application.canFinish(step)); quitButton.setVisible(application.canQuit(step)); closeButton.setVisible(application.canClose(step)); cancelButton.setVisible(application.canCancel(step)); } /** @@ -227,14 +181,11 @@ quitButton = createButton("quit-button-label", tooltip, ButtonName.QUIT); tooltip = Utils.isUninstall()? "close-button-uninstall-tooltip":"close-button-install-tooltip"; tooltip = application.getCloseButtonToolTip(); closeButton = createButton("close-button-label", tooltip, ButtonName.CLOSE); String label = Utils.isUninstall()? "finish-button-uninstall-label":"finish-button-install-label"; tooltip = Utils.isUninstall()? "finish-button-uninstall-tooltip":"finish-button-install-tooltip"; String label = application.getFinishButtonLabel(); tooltip = application.getFinishButtonToolTip(); finishButton = createButton(label, tooltip, ButtonName.FINISH); cancelButton = @@ -275,8 +226,9 @@ // Set as opaque to inherit the background color of ButtonsPanel nextFinishPanel.setOpaque(false); nextFinishPanel.add(nextButton, gbcAux); if (!Utils.isUninstall()) { // TODO: remove this hack if (application instanceof Installer) { nextFinishPanel.add(finishButton, gbcAux); } width = @@ -295,8 +247,9 @@ gbc.weightx = 0.0; gbc.fill = GridBagConstraints.NONE; gbc.insets.left = UIFactory.HORIZONTAL_INSET_BETWEEN_BUTTONS; if (Utils.isUninstall()) { // TODO: remove this hack if (application instanceof Uninstaller) { gbc.insets.right = UIFactory.HORIZONTAL_INSET_BETWEEN_BUTTONS; add(finishButton, gbc); gbc.insets.right = 0; opends/src/quicksetup/org/opends/quicksetup/ui/CurrentStepPanel.java
@@ -35,8 +35,8 @@ import org.opends.quicksetup.event.ButtonActionListener; import org.opends.quicksetup.installer.FieldName; import org.opends.quicksetup.installer.Installer; import org.opends.quicksetup.*; import org.opends.quicksetup.util.Utils; /** * This is the class that contains the panel on the right-top part of the @@ -55,8 +55,10 @@ { private static final long serialVersionUID = 5474803491510999334L; private HashMap<Step, QuickSetupStepPanel> hmPanels = new HashMap<Step, QuickSetupStepPanel>(); private HashMap<WizardStep, QuickSetupStepPanel> hmPanels = new HashMap<WizardStep, QuickSetupStepPanel>(); private Application application; /** * The constructor of this class. @@ -64,6 +66,7 @@ */ public CurrentStepPanel(Application app) { this.application = app; createLayout(app); } @@ -75,7 +78,7 @@ public Object getFieldValue(FieldName fieldName) { Object value = null; for (Step s : hmPanels.keySet()) for (WizardStep s : hmPanels.keySet()) { value = getPanel(s).getFieldValue(fieldName); if (value != null) @@ -96,7 +99,7 @@ */ public void displayFieldInvalid(FieldName fieldName, boolean invalid) { for (Step s : hmPanels.keySet()) for (WizardStep s : hmPanels.keySet()) { getPanel(s).displayFieldInvalid(fieldName, invalid); } @@ -119,9 +122,9 @@ private void createLayout(Application app) { Set<Step> steps = app.getWizardSteps(); Set<WizardStep> steps = app.getWizardSteps(); if (steps != null) { for (Step step : steps) { for (WizardStep step : steps) { QuickSetupStepPanel panel = app.createWizardStepPanel(step); if (panel != null) { hmPanels.put(step, panel); @@ -132,7 +135,7 @@ int minWidth = 0; int minHeight = 0; setLayout(new CardLayout()); for (Step s : hmPanels.keySet()) for (WizardStep s : hmPanels.keySet()) { minWidth = Math.max(minWidth, getPanel(s).getMinimumWidth()); minHeight = Math.max(minHeight, getPanel(s).getMinimumHeight()); @@ -140,7 +143,8 @@ } // For aesthetical reasons we add a little bit of height if (!Utils.isUninstall()) // TODO: remove this hack if (application instanceof Installer) { minHeight += UIFactory.EXTRA_DIALOG_HEIGHT; } @@ -156,7 +160,7 @@ */ public void addButtonActionListener(ButtonActionListener l) { for (Step s : hmPanels.keySet()) for (WizardStep s : hmPanels.keySet()) { getPanel(s).addButtonActionListener(l); } @@ -168,7 +172,7 @@ */ public void removeButtonActionListener(ButtonActionListener l) { for (Step s : hmPanels.keySet()) for (WizardStep s : hmPanels.keySet()) { getPanel(s).removeButtonActionListener(l); } @@ -181,7 +185,7 @@ * @param userData the UserData object that must be used to populate * the panels. */ public void setDisplayedStep(Step step, UserData userData) public void setDisplayedStep(WizardStep step, UserData userData) { CardLayout cl = (CardLayout) (getLayout()); getPanel(step).beginDisplay(userData); @@ -196,7 +200,7 @@ */ public void displayProgress(ProgressDescriptor descriptor) { for (Step s : hmPanels.keySet()) for (WizardStep s : hmPanels.keySet()) { getPanel(s).displayProgress(descriptor); } @@ -207,7 +211,7 @@ * @param step the step for which we want to get the panel. * @return the panel for the provided step. */ private QuickSetupStepPanel getPanel(Step step) private QuickSetupStepPanel getPanel(WizardStep step) { return hmPanels.get(step); } opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetupDialog.java
@@ -73,7 +73,7 @@ private ButtonsPanel buttonsPanel; private Step displayedStep; private WizardStep displayedStep; private CurrentInstallStatus installStatus; @@ -168,7 +168,7 @@ * @param userData the UserData object that must be used to populate * the panels. */ public void setDisplayedStep(Step step, UserData userData) public void setDisplayedStep(WizardStep step, UserData userData) { displayedStep = step; @@ -182,7 +182,7 @@ * Returns the currently displayed step. * @return the currently displayed step. */ public Step getDisplayedStep() public WizardStep getDisplayedStep() { return displayedStep; } @@ -416,7 +416,7 @@ { if (buttonsPanel == null) { buttonsPanel = new ButtonsPanel(); buttonsPanel = new ButtonsPanel(application); } return buttonsPanel; } opends/src/quicksetup/org/opends/quicksetup/ui/StepsPanel.java
@@ -37,8 +37,8 @@ import javax.swing.JLabel; import javax.swing.JPanel; import org.opends.quicksetup.Step; import org.opends.quicksetup.Application; import org.opends.quicksetup.WizardStep; /** * This class displays the different steps of the wizard. It appears on the @@ -52,9 +52,11 @@ { private static final long serialVersionUID = -2003945907121690657L; HashMap<Step, JLabel> hmLabels = new HashMap<Step, JLabel>(); HashMap<WizardStep, JLabel> hmLabels = new HashMap<WizardStep, JLabel>(); HashMap<Step, JLabel> hmIcons = new HashMap<Step, JLabel>(); HashMap<WizardStep, JLabel> hmIcons = new HashMap<WizardStep, JLabel>(); Application application = null; /** * Creates a StepsPanel. @@ -62,6 +64,7 @@ */ public StepsPanel(Application app) { this.application = app; createLayout(app); } @@ -71,11 +74,11 @@ * * @param step the step in the wizard. */ public void setDisplayedStep(Step step) public void setDisplayedStep(WizardStep step) { for (Step s : Step.values()) for (WizardStep s : application.getWizardSteps()) { if (s == step) if (s.equals(step)) { getIcon(s).setVisible(true); UIFactory.setTextStyle(getLabel(s), UIFactory.TextStyle.CURRENT_STEP); @@ -111,10 +114,10 @@ gbc.fill = GridBagConstraints.HORIZONTAL; gbc.anchor = GridBagConstraints.WEST; HashMap<Step, String> hmText = new HashMap<Step, String>(); ArrayList<Step> orderedSteps = new ArrayList<Step>(); HashMap<WizardStep, String> hmText = new HashMap<WizardStep, String>(); ArrayList<WizardStep> orderedSteps = new ArrayList<WizardStep>(); Step step = app.getFirstWizardStep(); WizardStep step = app.getFirstWizardStep(); hmText.put(step, getMsg(step.getMessageKey())); orderedSteps.add(step); while (null != (step = app.getNextWizardStep(step))) { @@ -122,7 +125,7 @@ orderedSteps.add(step); } for (Step s : orderedSteps) for (WizardStep s : orderedSteps) { if (s != orderedSteps.get(0)) { @@ -187,7 +190,7 @@ * @param step the step for which we want to retrieve the JLabel. * @return the label associated with the given step. */ private JLabel getLabel(Step step) private JLabel getLabel(WizardStep step) { return hmLabels.get(step); } @@ -197,7 +200,7 @@ * @param step the step for which we want to retrieve the Icon. * @return the icon associated with the given step. */ private JLabel getIcon(Step step) private JLabel getIcon(WizardStep step) { return hmIcons.get(step); } opends/src/quicksetup/org/opends/quicksetup/uninstaller/UninstallLauncher.java
@@ -71,7 +71,6 @@ */ protected void willLaunchGui() { System.out.println(getMsg("uninstall-launcher-launching-gui")); System.setProperty("org.opends.quicksetup.uninstall", "true"); System.setProperty("org.opends.quicksetup.Application.class", "org.opends.quicksetup.uninstaller.Uninstaller"); } opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java
@@ -28,9 +28,14 @@ package org.opends.quicksetup.uninstaller; import org.opends.quicksetup.*; import static org.opends.quicksetup.Step.PROGRESS; import static org.opends.quicksetup.Step.REVIEW; import org.opends.quicksetup.installer.FieldName; import org.opends.quicksetup.ui.*; import org.opends.quicksetup.util.Utils; import org.opends.quicksetup.util.BackgroundTask; import org.opends.server.tools.ConfigureWindowsService; import org.opends.server.protocols.ldap.LDAPResultCode; import javax.swing.*; import java.io.*; @@ -45,10 +50,10 @@ private ProgressStep status = UninstallProgressStep.NOT_STARTED; private HashMap<ProgressStep, Integer> hmRatio = new HashMap<ProgressStep, Integer>(); new HashMap<ProgressStep, Integer>(); private HashMap<ProgressStep, String> hmSummary = new HashMap<ProgressStep, String>(); new HashMap<ProgressStep, String>(); private ApplicationException ue; @@ -73,14 +78,14 @@ /** * {@inheritDoc} */ public Step getFirstWizardStep() { public WizardStep getFirstWizardStep() { return Step.CONFIRM_UNINSTALL; } /** * {@inheritDoc} */ public Step getNextWizardStep(Step step) { public WizardStep getNextWizardStep(WizardStep step) { Step nextStep = null; if (step != null && step.equals(Step.CONFIRM_UNINSTALL)) { nextStep = Step.PROGRESS; @@ -91,39 +96,271 @@ /** * {@inheritDoc} */ public WizardStep getPreviousWizardStep(WizardStep step) { Step prevStep = null; if (step != null && step.equals(Step.PROGRESS)) { prevStep = Step.CONFIRM_UNINSTALL; } return prevStep; } /** * {@inheritDoc} */ public boolean canGoBack(WizardStep step) { return false; } /** * {@inheritDoc} */ public boolean canGoForward(WizardStep step) { return false; } /** * {@inheritDoc} */ public boolean canFinish(WizardStep step) { return step == Step.CONFIRM_UNINSTALL; } /** * {@inheritDoc} */ public boolean canQuit(WizardStep step) { return false; } /** * {@inheritDoc} */ public boolean canClose(WizardStep step) { return step == Step.PROGRESS; } /** * {@inheritDoc} */ public boolean canCancel(WizardStep step) { return step == Step.CONFIRM_UNINSTALL; } /** * {@inheritDoc} */ public void nextClicked(WizardStep cStep, QuickSetup qs) { if (cStep == PROGRESS) { throw new IllegalStateException( "Cannot click on next from progress step"); } else if (cStep == REVIEW) { throw new IllegalStateException("Cannot click on next from review step"); } } /** * {@inheritDoc} */ public void closeClicked(WizardStep cStep, QuickSetup qs) { if (cStep == PROGRESS) { if (isFinished() || qs.displayConfirmation(getMsg("confirm-close-uninstall-msg"), getMsg("confirm-close-uninstall-title"))) { qs.quit(); } } else { throw new IllegalStateException( "Close only can be clicked on PROGRESS step"); } } /** * {@inheritDoc} */ public void cancelClicked(WizardStep cStep, QuickSetup qs) { if (cStep == Step.CONFIRM_UNINSTALL) { qs.quit(); } else { throw new IllegalStateException( "Cancel only can be clicked on CONFIRM_UNINSTALL step"); } } /** * Update the UserData object according to the content of the review * panel. */ private void updateUserUninstallDataForConfirmUninstallPanel(QuickSetup qs) throws UserDataException { UninstallUserData uud = (UninstallUserData) getUserData(); uud.setRemoveLibrariesAndTools( (Boolean) qs.getFieldValue(FieldName.REMOVE_LIBRARIES_AND_TOOLS)); uud.setRemoveDatabases( (Boolean) qs.getFieldValue(FieldName.REMOVE_DATABASES)); uud.setRemoveConfigurationAndSchema( (Boolean) qs.getFieldValue( FieldName.REMOVE_CONFIGURATION_AND_SCHEMA)); uud.setRemoveBackups( (Boolean) qs.getFieldValue(FieldName.REMOVE_BACKUPS)); uud.setRemoveLDIFs( (Boolean) qs.getFieldValue(FieldName.REMOVE_LDIFS)); uud.setRemoveLogs( (Boolean) qs.getFieldValue(FieldName.REMOVE_LOGS)); Set<String> dbs = new HashSet<String>(); Set s = (Set) qs.getFieldValue(FieldName.EXTERNAL_DB_DIRECTORIES); for (Object v : s) { dbs.add((String) v); } Set<String> logs = new HashSet<String>(); s = (Set) qs.getFieldValue(FieldName.EXTERNAL_LOG_FILES); for (Object v : s) { logs.add((String) v); } uud.setExternalDbsToRemove(dbs); uud.setExternalLogsToRemove(logs); if ((dbs.size() == 0) && (logs.size() == 0) && !uud.getRemoveLibrariesAndTools() && !uud.getRemoveDatabases() && !uud.getRemoveConfigurationAndSchema() && !uud.getRemoveBackups() && !uud.getRemoveLDIFs() && !uud.getRemoveLogs()) { throw new UserDataException(Step.CONFIRM_UNINSTALL, getMsg("nothing-selected-to-uninstall")); } } /** * {@inheritDoc} */ public void quitClicked(WizardStep step, QuickSetup qs) { if (step == Step.PROGRESS) { throw new IllegalStateException( "Cannot click on quit from progress step"); } qs.quit(); } /** * {@inheritDoc} */ public String getCloseButtonToolTip() { return "close-button-uninstall-tooltip"; } /** * {@inheritDoc} */ public String getFinishButtonToolTip() { return "finish-button-uninstall-tooltip"; } /** * {@inheritDoc} */ public String getFinishButtonLabel() { return "finish-button-uninstall-label"; } /** * {@inheritDoc} */ public void previousClicked(WizardStep cStep, QuickSetup qs) { if (cStep == Step.PROGRESS) { throw new IllegalStateException( "Cannot click on previous from progress step"); } } /** * {@inheritDoc} */ public void finishClicked(final WizardStep cStep, final QuickSetup qs) { if (cStep == Step.CONFIRM_UNINSTALL) { BackgroundTask worker = new BackgroundTask() { public Object processBackgroundTask() throws UserDataException { try { updateUserUninstallDataForConfirmUninstallPanel(qs); } catch (UserDataException uude) { throw uude; } catch (Throwable t) { throw new UserDataException(cStep, getThrowableMsg("bug-msg", t)); } return CurrentInstallStatus.isServerRunning(); } public void backgroundTaskCompleted(Object returnValue, Throwable throwable) { qs.getDialog().workerFinished(); if (throwable != null) { qs.displayError(throwable.getLocalizedMessage(), getMsg("error-title")); } else { boolean serverRunning = (Boolean) returnValue; if (!serverRunning) { getUserData().setStopServer(false); if (qs.displayConfirmation( getMsg("confirm-uninstall-server-not-running-msg"), getMsg("confirm-uninstall-server-not-running-title"))) { qs.launchUninstallation(); qs.setCurrentStep(getNextWizardStep(cStep)); } } else { if (qs.displayConfirmation( getMsg("confirm-uninstall-server-running-msg"), getMsg("confirm-uninstall-server-running-title"))) { getUserData().setStopServer(true); qs.launchUninstallation(); qs.setCurrentStep(getNextWizardStep(cStep)); } else { getUserData().setStopServer(false); } } } } }; qs.getDialog().workerStarted(); worker.startBackgroundTask(); } } /** * {@inheritDoc} */ public void updateUserData(WizardStep step, QuickSetup qs) { // do nothing; } /** * {@inheritDoc} */ protected void setWizardDialogState(QuickSetupDialog dlg, UserData userData, Step step) { // Set the default button for the frame switch (step) { case CONFIRM_UNINSTALL: dlg.setDefaultButton(ButtonName.FINISH); break; case PROGRESS: dlg.setDefaultButton(ButtonName.CLOSE); break; } // Set the focus for the current step switch (step) { case CONFIRM_UNINSTALL: dlg.setFocusOnButton(ButtonName.FINISH); break; case PROGRESS: dlg.setFocusOnButton(ButtonName.CLOSE); dlg.setButtonEnabled(ButtonName.CLOSE, false); break; } WizardStep step) { if (step == Step.CONFIRM_UNINSTALL) { dlg.setDefaultButton(ButtonName.FINISH); dlg.setFocusOnButton(ButtonName.FINISH); } else if (step == Step.PROGRESS) { dlg.setDefaultButton(ButtonName.CLOSE); dlg.setFocusOnButton(ButtonName.CLOSE); dlg.setButtonEnabled(ButtonName.CLOSE, false); } } /** * {@inheritDoc} */ public UserData createUserData(String[] args, CurrentInstallStatus status) throws UserDataException { throws UserDataException { return cliHelper.createUserData(args, status); } @@ -137,86 +374,72 @@ /** * Returns the ApplicationException that might occur during installation or * <CODE>null</CODE> if no exception occurred. * * @return the ApplicationException that might occur during installation or * <CODE>null</CODE> if no exception occurred. * <CODE>null</CODE> if no exception occurred. */ public ApplicationException getException() { public ApplicationException getException() { return ue; } /** * Initialize the different map used in this class. * */ private void initMaps() { private void initMaps() { hmSummary.put(UninstallProgressStep.NOT_STARTED, getFormattedSummary(getMsg("summary-uninstall-not-started"))); getFormattedSummary(getMsg("summary-uninstall-not-started"))); hmSummary.put(UninstallProgressStep.STOPPING_SERVER, getFormattedSummary(getMsg("summary-stopping"))); getFormattedSummary(getMsg("summary-stopping"))); hmSummary.put(UninstallProgressStep.DISABLING_WINDOWS_SERVICE, getFormattedSummary(getMsg("summary-disabling-windows-service"))); getFormattedSummary(getMsg("summary-disabling-windows-service"))); hmSummary.put(UninstallProgressStep.DELETING_EXTERNAL_DATABASE_FILES, getFormattedSummary(getMsg("summary-deleting-external-db-files"))); getFormattedSummary(getMsg("summary-deleting-external-db-files"))); hmSummary.put(UninstallProgressStep.DELETING_EXTERNAL_LOG_FILES, getFormattedSummary(getMsg("summary-deleting-external-log-files"))); getFormattedSummary(getMsg("summary-deleting-external-log-files"))); hmSummary.put(UninstallProgressStep.REMOVING_EXTERNAL_REFERENCES, getFormattedSummary(getMsg("summary-deleting-external-references"))); getFormattedSummary( getMsg("summary-deleting-external-references"))); hmSummary.put(UninstallProgressStep.DELETING_INSTALLATION_FILES, getFormattedSummary(getMsg("summary-deleting-installation-files"))); getFormattedSummary(getMsg("summary-deleting-installation-files"))); String successMsg; if (Utils.isCli()) { if (getUninstallUserData().getRemoveLibrariesAndTools()) { if (Utils.isCli()) { if (getUninstallUserData().getRemoveLibrariesAndTools()) { String[] arg = new String[1]; if (Utils.isWindows()) { arg[0] = getUninstallBatFile()+getLineBreak()+ getTab()+getLibrariesPath(); } else { arg[0] = getLibrariesPath(); if (Utils.isWindows()) { arg[0] = getUninstallBatFile() + getLineBreak() + getTab() + getLibrariesPath(); } else { arg[0] = getLibrariesPath(); } successMsg = getMsg( "summary-uninstall-finished-successfully-remove-jarfiles-cli", arg); } else { "summary-uninstall-finished-successfully-remove-jarfiles-cli", arg); } else { successMsg = getMsg("summary-uninstall-finished-successfully-cli"); } } else { if (getUninstallUserData().getRemoveLibrariesAndTools()) { } else { if (getUninstallUserData().getRemoveLibrariesAndTools()) { String[] arg = {getLibrariesPath()}; successMsg = getMsg( "summary-uninstall-finished-successfully-remove-jarfiles", arg); } else { "summary-uninstall-finished-successfully-remove-jarfiles", arg); } else { successMsg = getMsg("summary-uninstall-finished-successfully"); } } hmSummary.put(UninstallProgressStep.FINISHED_SUCCESSFULLY, getFormattedSuccess(successMsg)); getFormattedSuccess(successMsg)); hmSummary.put(UninstallProgressStep.FINISHED_WITH_ERROR, getFormattedError(getMsg("summary-uninstall-finished-with-error"))); getFormattedError(getMsg("summary-uninstall-finished-with-error"))); /* * hmTime contains the relative time that takes for each task to be * accomplished. For instance if stopping takes twice the time of * deleting files, the value for downloading will be the double of the * value for extracting. */ * hmTime contains the relative time that takes for each task to be * accomplished. For instance if stopping takes twice the time of * deleting files, the value for downloading will be the double of the * value for extracting. */ HashMap<UninstallProgressStep, Integer> hmTime = new HashMap<UninstallProgressStep, Integer>(); new HashMap<UninstallProgressStep, Integer>(); hmTime.put(UninstallProgressStep.STOPPING_SERVER, 15); hmTime.put(UninstallProgressStep.DISABLING_WINDOWS_SERVICE, 5); hmTime.put(UninstallProgressStep.DELETING_EXTERNAL_DATABASE_FILES, 30); @@ -226,41 +449,35 @@ int totalTime = 0; ArrayList<UninstallProgressStep> steps = new ArrayList<UninstallProgressStep>(); if (getUserData().getStopServer()) { new ArrayList<UninstallProgressStep>(); if (getUserData().getStopServer()) { totalTime += hmTime.get(UninstallProgressStep.STOPPING_SERVER); steps.add(UninstallProgressStep.STOPPING_SERVER); } if (isWindowsServiceEnabled()) { if (isWindowsServiceEnabled()) { totalTime += hmTime.get(UninstallProgressStep.DISABLING_WINDOWS_SERVICE); steps.add(UninstallProgressStep.DISABLING_WINDOWS_SERVICE); } totalTime += hmTime.get(UninstallProgressStep.DELETING_INSTALLATION_FILES); steps.add(UninstallProgressStep.DELETING_INSTALLATION_FILES); if (getUninstallUserData().getExternalDbsToRemove().size() > 0) { if (getUninstallUserData().getExternalDbsToRemove().size() > 0) { totalTime += hmTime.get( UninstallProgressStep.DELETING_EXTERNAL_DATABASE_FILES); UninstallProgressStep.DELETING_EXTERNAL_DATABASE_FILES); steps.add(UninstallProgressStep.DELETING_EXTERNAL_DATABASE_FILES); } if (getUninstallUserData().getExternalLogsToRemove().size() > 0) { if (getUninstallUserData().getExternalLogsToRemove().size() > 0) { totalTime += hmTime.get( UninstallProgressStep.DELETING_EXTERNAL_LOG_FILES); UninstallProgressStep.DELETING_EXTERNAL_LOG_FILES); steps.add(UninstallProgressStep.DELETING_EXTERNAL_LOG_FILES); } int cumulatedTime = 0; for (UninstallProgressStep s : steps) { for (UninstallProgressStep s : steps) { Integer statusTime = hmTime.get(s); hmRatio.put(s, (100 * cumulatedTime) / totalTime); if (statusTime != null) { if (statusTime != null) { cumulatedTime += statusTime; } } @@ -271,35 +488,28 @@ /** * Actually performs the uninstall in this thread. The thread is blocked. * */ public void run() { public void run() { initMaps(); PrintStream origErr = System.err; PrintStream origOut = System.out; try { try { PrintStream err = new ErrorPrintStream(); PrintStream out = new OutputPrintStream(); if (!Utils.isCli()) { System.setErr(err); System.setOut(out); if (!Utils.isCli()) { System.setErr(err); System.setOut(out); } boolean displaySeparator = false; if (getUserData().getStopServer()) { if (getUserData().getStopServer()) { status = UninstallProgressStep.STOPPING_SERVER; stopServer(); displaySeparator = true; } if (isWindowsServiceEnabled()) { if (isWindowsServiceEnabled()) { status = UninstallProgressStep.DISABLING_WINDOWS_SERVICE; if (displaySeparator) { if (displaySeparator) { notifyListeners(getTaskSeparator()); } disableWindowsService(); @@ -307,11 +517,9 @@ } Set<String> dbsToDelete = getUninstallUserData().getExternalDbsToRemove(); if (dbsToDelete.size() > 0) { if (dbsToDelete.size() > 0) { status = UninstallProgressStep.DELETING_EXTERNAL_DATABASE_FILES; if (displaySeparator) { if (displaySeparator) { notifyListeners(getTaskSeparator()); } @@ -321,12 +529,10 @@ Set<String> logsToDelete = getUninstallUserData().getExternalLogsToRemove(); if (logsToDelete.size() > 0) { if (logsToDelete.size() > 0) { status = UninstallProgressStep.DELETING_EXTERNAL_LOG_FILES; if (displaySeparator) { if (displaySeparator) { notifyListeners(getTaskSeparator()); } @@ -336,52 +542,44 @@ UninstallUserData userData = getUninstallUserData(); boolean somethingToDelete = userData.getRemoveBackups() || userData.getRemoveConfigurationAndSchema() || userData.getRemoveDatabases() || userData.getRemoveLDIFs() || userData.getRemoveLibrariesAndTools() || userData.getRemoveLogs(); if (displaySeparator && somethingToDelete) { userData.getRemoveConfigurationAndSchema() || userData.getRemoveDatabases() || userData.getRemoveLDIFs() || userData.getRemoveLibrariesAndTools() || userData.getRemoveLogs(); if (displaySeparator && somethingToDelete) { notifyListeners(getTaskSeparator()); } if (somethingToDelete) { if (somethingToDelete) { status = UninstallProgressStep.DELETING_INSTALLATION_FILES; deleteInstallationFiles(getRatio(status), getRatio(UninstallProgressStep.FINISHED_SUCCESSFULLY)); getRatio(UninstallProgressStep.FINISHED_SUCCESSFULLY)); } status = UninstallProgressStep.FINISHED_SUCCESSFULLY; if (Utils.isCli()) { notifyListeners(getLineBreak()+getLineBreak()+getSummary(status)); } else { if (Utils.isCli()) { notifyListeners(getLineBreak() + getLineBreak() + getSummary(status)); } else { notifyListeners(null); } } catch (ApplicationException ex) { } catch (ApplicationException ex) { ue = ex; status = UninstallProgressStep.FINISHED_WITH_ERROR; String msg = getFormattedError(ex, true); notifyListeners(msg); } catch (Throwable t) { catch (Throwable t) { ue = new ApplicationException( ApplicationException.Type.BUG, getThrowableMsg("bug-msg", t), t); ApplicationException.Type.BUG, getThrowableMsg("bug-msg", t), t); status = UninstallProgressStep.FINISHED_WITH_ERROR; String msg = getFormattedError(ue, true); notifyListeners(msg); } if (!Utils.isCli()) { System.setErr(origErr); System.setOut(origOut); if (!Utils.isCli()) { System.setErr(origErr); System.setOut(origOut); } } @@ -395,24 +593,24 @@ /** * Returns an integer that specifies which percentage of the whole * installation has been completed. * * @param step the UninstallProgressStep for which we want to get the ratio. * @return an integer that specifies which percentage of the whole * uninstallation has been completed. * uninstallation has been completed. */ public Integer getRatio(ProgressStep step) { public Integer getRatio(ProgressStep step) { return hmRatio.get(step); } /** * Returns an formatted representation of the summary for the specified * UninstallProgressStep. * * @param step the UninstallProgressStep for which we want to get the summary. * @return an formatted representation of the summary for the specified * UninstallProgressStep. * UninstallProgressStep. */ public String getSummary(ProgressStep step) { public String getSummary(ProgressStep step) { return hmSummary.get(step); } @@ -448,44 +646,41 @@ /** * {@inheritDoc} */ public Set<Step> getWizardSteps() { return EnumSet.of(Step.CONFIRM_UNINSTALL, Step.PROGRESS); public Set<WizardStep> getWizardSteps() { Set<WizardStep> setSteps = new HashSet<WizardStep>(); setSteps.add(Step.CONFIRM_UNINSTALL); setSteps.add(Step.PROGRESS); return Collections.unmodifiableSet(setSteps); } /** * {@inheritDoc} */ public QuickSetupStepPanel createWizardStepPanel(Step step) { public QuickSetupStepPanel createWizardStepPanel(WizardStep step) { QuickSetupStepPanel p = null; switch (step) { case CONFIRM_UNINSTALL: p = new ConfirmUninstallPanel(installStatus); break; case PROGRESS: p = new ProgressPanel(); break; if (step == Step.CONFIRM_UNINSTALL) { p = new ConfirmUninstallPanel(installStatus); } else if (step == Step.PROGRESS) { p = new ProgressPanel(); } return p; } /** * This methods stops the server. * * @throws ApplicationException if something goes wrong. */ private void stopServer() throws ApplicationException { private void stopServer() throws ApplicationException { notifyListeners(getFormattedProgress(getMsg("progress-stopping")) + getLineBreak()); getLineBreak()); ArrayList<String> argList = new ArrayList<String>(); if (Utils.isWindows()) { if (Utils.isWindows()) { argList.add(Utils.getPath(getBinariesPath(), Utils.getWindowsStopFileName())); } else { } else { argList.add(Utils.getPath(getBinariesPath(), Utils.getUnixStopFileName())); } @@ -499,14 +694,15 @@ */ env.remove("JAVA_BIN"); try { try { Process process = pb.start(); BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream())); new BufferedReader( new InputStreamReader(process.getErrorStream())); BufferedReader out = new BufferedReader(new InputStreamReader(process.getInputStream())); new BufferedReader( new InputStreamReader(process.getInputStream())); /* Create these objects to resend the stop process output to the details * area. @@ -516,12 +712,9 @@ int returnValue = process.waitFor(); int clientSideError = org.opends.server.protocols.ldap.LDAPResultCode.CLIENT_SIDE_CONNECT_ERROR; if ((returnValue == clientSideError) || (returnValue == 0)) { if (Utils.isWindows()) { int clientSideError = LDAPResultCode.CLIENT_SIDE_CONNECT_ERROR; if ((returnValue == clientSideError) || (returnValue == 0)) { if (Utils.isWindows()) { /* * Sometimes the server keeps some locks on the files. * TODO: remove this code once stop-ds returns properly when server @@ -530,42 +723,34 @@ int nTries = 10; boolean stopped = false; for (int i=0; i<nTries && !stopped; i++) { for (int i = 0; i < nTries && !stopped; i++) { stopped = !CurrentInstallStatus.isServerRunning(); if (!stopped) { if (!stopped) { String msg = getFormattedLog(getMsg("progress-server-waiting-to-stop"))+ getLineBreak(); getFormattedLog(getMsg("progress-server-waiting-to-stop")) + getLineBreak(); notifyListeners(msg); try { try { Thread.sleep(5000); } catch (Exception ex) { catch (Exception ex) { } } } if (!stopped) { if (!stopped) { returnValue = -1; } } } if (returnValue == clientSideError) { if (returnValue == clientSideError) { String msg = getLineBreak() + getFormattedLog(getMsg("progress-server-already-stopped"))+ getLineBreak(); getFormattedLog(getMsg("progress-server-already-stopped")) + getLineBreak(); notifyListeners(msg); } else if (returnValue != 0) { } else if (returnValue != 0) { String[] arg = {String.valueOf(returnValue)}; String msg = getMsg("error-stopping-server-code", arg); @@ -576,133 +761,111 @@ throw new ApplicationException(ApplicationException.Type.STOP_ERROR, msg, null); } else { } else { String msg = getFormattedLog(getMsg("progress-server-stopped")); notifyListeners(msg); } } catch (IOException ioe) { } catch (IOException ioe) { throw new ApplicationException(ApplicationException.Type.STOP_ERROR, getThrowableMsg("error-stopping-server", ioe), ioe); getThrowableMsg("error-stopping-server", ioe), ioe); } catch (InterruptedException ie) { catch (InterruptedException ie) { throw new ApplicationException(ApplicationException.Type.BUG, getThrowableMsg("error-stopping-server", ie), ie); getThrowableMsg("error-stopping-server", ie), ie); } } /** * Deletes the external database files specified in the provided Set. * * @param dbFiles the database directories to be deleted. * @throws ApplicationException if something goes wrong. */ private void deleteExternalDatabaseFiles(Set<String> dbFiles) throws ApplicationException { throws ApplicationException { notifyListeners(getFormattedProgress( getMsg("progress-deleting-external-db-files")) + getLineBreak()); for (String path : dbFiles) { getMsg("progress-deleting-external-db-files")) + getLineBreak()); for (String path : dbFiles) { deleteRecursively(new File(path)); } } /** * Deletes the external database files specified in the provided Set. * * @param logFiles the log files to be deleted. * @throws ApplicationException if something goes wrong. */ private void deleteExternalLogFiles(Set<String> logFiles) throws ApplicationException { throws ApplicationException { notifyListeners(getFormattedProgress( getMsg("progress-deleting-external-log-files")) + getLineBreak()); for (String path : logFiles) { getMsg("progress-deleting-external-log-files")) + getLineBreak()); for (String path : logFiles) { deleteRecursively(new File(path)); } } /** * Deletes the files under the installation path. * * @throws ApplicationException if something goes wrong. */ private void deleteInstallationFiles(int minRatio, int maxRatio) throws ApplicationException { throws ApplicationException { notifyListeners(getFormattedProgress( getMsg("progress-deleting-installation-files")) + getLineBreak()); getMsg("progress-deleting-installation-files")) + getLineBreak()); File f = new File(Utils.getInstallPathFromClasspath()); InstallationFilesToDeleteFilter filter = new InstallationFilesToDeleteFilter(); new InstallationFilesToDeleteFilter(); File[] rootFiles = f.listFiles(); if (rootFiles != null) { if (rootFiles != null) { /* The following is done to have a moving progress bar when we delete * the installation files. */ int totalRatio = 0; ArrayList<Integer> cumulatedRatio = new ArrayList<Integer>(); for (int i=0; i<rootFiles.length; i++) { if (filter.accept(rootFiles[i])) { int relativeRatio; if (equalsOrDescendant(rootFiles[i], new File(getLibrariesPath()))) { relativeRatio = 10; } else if (equalsOrDescendant(rootFiles[i], new File(getBinariesPath()))) { relativeRatio = 5; } else if (equalsOrDescendant(rootFiles[i], new File(getConfigPath()))) { relativeRatio = 5; } else if (equalsOrDescendant(rootFiles[i], new File(getBackupsPath()))) { relativeRatio = 20; } else if (equalsOrDescendant(rootFiles[i], new File(getLDIFsPath()))) { relativeRatio = 20; } else if (equalsOrDescendant(rootFiles[i], new File(getDatabasesPath()))) { relativeRatio = 50; } else if (equalsOrDescendant(rootFiles[i], new File(getLogsPath()))) { relativeRatio = 30; } else { relativeRatio = 2; } cumulatedRatio.add(totalRatio); totalRatio += relativeRatio; } else { cumulatedRatio.add(totalRatio); } for (int i = 0; i < rootFiles.length; i++) { if (filter.accept(rootFiles[i])) { int relativeRatio; if (equalsOrDescendant(rootFiles[i], new File(getLibrariesPath()))) { relativeRatio = 10; } else if (equalsOrDescendant(rootFiles[i], new File(getBinariesPath()))) { relativeRatio = 5; } else if (equalsOrDescendant(rootFiles[i], new File(getConfigPath()))) { relativeRatio = 5; } else if (equalsOrDescendant(rootFiles[i], new File(getBackupsPath()))) { relativeRatio = 20; } else if (equalsOrDescendant(rootFiles[i], new File(getLDIFsPath()))) { relativeRatio = 20; } else if (equalsOrDescendant(rootFiles[i], new File(getDatabasesPath()))) { relativeRatio = 50; } else if (equalsOrDescendant(rootFiles[i], new File(getLogsPath()))) { relativeRatio = 30; } else { relativeRatio = 2; } cumulatedRatio.add(totalRatio); totalRatio += relativeRatio; } else { cumulatedRatio.add(totalRatio); } } Iterator<Integer> it = cumulatedRatio.iterator(); for (int i=0; i<rootFiles.length; i++) { for (int i = 0; i < rootFiles.length; i++) { int beforeRatio = minRatio + ((it.next() * (maxRatio - minRatio)) / totalRatio); ((it.next() * (maxRatio - minRatio)) / totalRatio); hmRatio.put(UninstallProgressStep.DELETING_INSTALLATION_FILES, beforeRatio); beforeRatio); deleteRecursively(rootFiles[i], filter); } hmRatio.put(UninstallProgressStep.DELETING_INSTALLATION_FILES, maxRatio); @@ -711,171 +874,150 @@ /** * Returns the path to the quicksetup jar file. * * @return the path to the quicksetup jar file. */ private String getQuicksetupJarPath() { private String getQuicksetupJarPath() { return Utils.getPath(getLibrariesPath(), "quicksetup.jar"); } /** * Returns the path to the opends jar file. * * @return the path to the opends jar file. */ private String getOpenDSJarPath() { private String getOpenDSJarPath() { return Utils.getPath(getLibrariesPath(), "OpenDS.jar"); } /** * Returns the path to the uninstall.bat file. * * @return the path to the uninstall.bat file. */ private String getUninstallBatFile() { private String getUninstallBatFile() { return Utils.getPath(Utils.getInstallPathFromClasspath(), "uninstall.bat"); } /** * Returns the path to the backup files under the install path. * * @return the path to the backup files under the install path. */ private String getBackupsPath() { private String getBackupsPath() { return Utils.getPath(Utils.getInstallPathFromClasspath(), Utils.getBackupsRelativePath()); Utils.getBackupsRelativePath()); } /** * Returns the path to the LDIF files under the install path. * * @return the path to the LDIF files under the install path. */ private String getLDIFsPath() { private String getLDIFsPath() { return Utils.getPath(Utils.getInstallPathFromClasspath(), Utils.getLDIFsRelativePath()); Utils.getLDIFsRelativePath()); } /** * Returns the path to the config files under the install path. * * @return the path to the config files under the install path. */ private String getConfigPath() { private String getConfigPath() { return Utils.getPath(Utils.getInstallPathFromClasspath(), Utils.getConfigRelativePath()); Utils.getConfigRelativePath()); } /** * Returns the path to the log files under the install path. * * @return the path to the log files under the install path. */ private String getLogsPath() { private String getLogsPath() { return Utils.getPath(Utils.getInstallPathFromClasspath(), Utils.getLogsRelativePath()); Utils.getLogsRelativePath()); } /** * Returns the path to the database files under the install path. * * @return the path to the database files under the install path. */ private String getDatabasesPath() { private String getDatabasesPath() { return Utils.getPath(Utils.getInstallPathFromClasspath(), Utils.getDatabasesRelativePath()); Utils.getDatabasesRelativePath()); } /** * Deletes everything below the specified file. * * @param file the path to be deleted. * @throws ApplicationException if something goes wrong. */ private void deleteRecursively(File file) throws ApplicationException { private void deleteRecursively(File file) throws ApplicationException { deleteRecursively(file, null); } /** * Deletes everything below the specified file. * @param file the path to be deleted. * * @param file the path to be deleted. * @param filter the filter of the files to know if the file can be deleted * directly or not. * directly or not. * @throws ApplicationException if something goes wrong. */ private void deleteRecursively(File file, FileFilter filter) throws ApplicationException { if (file.exists()) { if (file.isFile()) { if (filter != null) { if (filter.accept(file)) { throws ApplicationException { if (file.exists()) { if (file.isFile()) { if (filter != null) { if (filter.accept(file)) { delete(file); } } else { } else { delete(file); } } else { } else { File[] children = file.listFiles(); if (children != null) { for (int i=0; i<children.length; i++) { if (children != null) { for (int i = 0; i < children.length; i++) { deleteRecursively(children[i], filter); } } if (filter != null) { if (filter.accept(file)) { if (filter != null) { if (filter.accept(file)) { delete(file); } } else { } else { delete(file); } } } else { } else { // Just tell that the file/directory does not exist. String[] arg = {file.toString()}; notifyListeners(getFormattedWarning( getMsg("deleting-file-does-not-exist", arg))); getMsg("deleting-file-does-not-exist", arg))); } } /** * Deletes the specified file. * * @param file the file to be deleted. * @throws ApplicationException if something goes wrong. */ private void delete(File file) throws ApplicationException { private void delete(File file) throws ApplicationException { String[] arg = {file.getAbsolutePath()}; boolean isFile = file.isFile(); if (isFile) { if (isFile) { notifyListeners(getFormattedWithPoints( getMsg("progress-deleting-file", arg))); } else { getMsg("progress-deleting-file", arg))); } else { notifyListeners(getFormattedWithPoints( getMsg("progress-deleting-directory", arg))); getMsg("progress-deleting-directory", arg))); } boolean delete = false; @@ -885,99 +1027,81 @@ * is stopped. */ int nTries = 5; for (int i=0; i<nTries && !delete; i++) { for (int i = 0; i < nTries && !delete; i++) { delete = file.delete(); if (!delete) { try { if (!delete) { try { Thread.sleep(1000); } catch (Exception ex) { catch (Exception ex) { } } } if (!delete) { if (!delete) { String errMsg; if (isFile) { if (isFile) { errMsg = getMsg("error-deleting-file", arg); } else { } else { errMsg = getMsg("error-deleting-directory", arg); } throw new ApplicationException( ApplicationException.Type.FILE_SYSTEM_ERROR, errMsg, null); ApplicationException.Type.FILE_SYSTEM_ERROR, errMsg, null); } notifyListeners(getFormattedDone()+getLineBreak()); notifyListeners(getFormattedDone() + getLineBreak()); } private boolean equalsOrDescendant(File file, File directory) { private boolean equalsOrDescendant(File file, File directory) { return file.equals(directory) || Utils.isDescendant(file.toString(), directory.toString()); Utils.isDescendant(file.toString(), directory.toString()); } /** * {@inheritDoc} */ protected String getBinariesPath() { protected String getBinariesPath() { return Utils.getPath(Utils.getInstallPathFromClasspath(), Utils.getBinariesRelativePath()); Utils.getBinariesRelativePath()); } /** * This class is used to read the standard error and standard output of the * Stop process. * * <p/> * When a new log message is found notifies the * UninstallProgressUpdateListeners of it. If an error occurs it also * notifies the listeners. * */ private class StopReader { private class StopReader { private boolean isFirstLine; /** * The protected constructor. * @param reader the BufferedReader of the stop process. * * @param reader the BufferedReader of the stop process. * @param isError a boolean indicating whether the BufferedReader * corresponds to the standard error or to the standard output. * corresponds to the standard error or to the standard output. */ public StopReader(final BufferedReader reader,final boolean isError) { public StopReader(final BufferedReader reader, final boolean isError) { final String errorTag = isError ? "error-reading-erroroutput" : "error-reading-output"; isError ? "error-reading-erroroutput" : "error-reading-output"; isFirstLine = true; Thread t = new Thread(new Runnable() { public void run() { try { Thread t = new Thread(new Runnable() { public void run() { try { String line = reader.readLine(); while (line != null) { while (line != null) { StringBuilder buf = new StringBuilder(); if (!isFirstLine) { if (!isFirstLine) { buf.append(formatter.getLineBreak()); } if (isError) { if (isError) { buf.append(getFormattedLogError(line)); } else { } else { buf.append(getFormattedLog(line)); } notifyListeners(buf.toString()); @@ -985,13 +1109,11 @@ line = reader.readLine(); } } catch (IOException ioe) { } catch (IOException ioe) { String errorMsg = getThrowableMsg(errorTag, ioe); notifyListeners(errorMsg); } catch (Throwable t) { } catch (Throwable t) { String errorMsg = getThrowableMsg(errorTag, t); notifyListeners(errorMsg); } @@ -1006,8 +1128,7 @@ * required to know which are the files that can be deleted directly and which * not. */ class InstallationFilesToDeleteFilter implements FileFilter { class InstallationFilesToDeleteFilter implements FileFilter { File quicksetupFile = new File(getQuicksetupJarPath()); File openDSFile = new File(getOpenDSJarPath()); File librariesFile = new File(getLibrariesPath()); @@ -1015,64 +1136,57 @@ File uninstallBatFile = new File(getUninstallBatFile()); File installationPath = new File(Utils.getInstallPathFromClasspath()); /** * {@inheritDoc} */ public boolean accept(File file) { public boolean accept(File file) { UninstallUserData userData = getUninstallUserData(); boolean[] uData = { userData.getRemoveLibrariesAndTools(), userData.getRemoveLibrariesAndTools(), userData.getRemoveDatabases(), userData.getRemoveLogs(), userData.getRemoveConfigurationAndSchema(), userData.getRemoveBackups(), userData.getRemoveLDIFs() userData.getRemoveLibrariesAndTools(), userData.getRemoveLibrariesAndTools(), userData.getRemoveDatabases(), userData.getRemoveLogs(), userData.getRemoveConfigurationAndSchema(), userData.getRemoveBackups(), userData.getRemoveLDIFs() }; String[] parentFiles = { getLibrariesPath(), getBinariesPath(), getDatabasesPath(), getLogsPath(), getConfigPath(), getBackupsPath(), getLDIFsPath() getLibrariesPath(), getBinariesPath(), getDatabasesPath(), getLogsPath(), getConfigPath(), getBackupsPath(), getLDIFsPath() }; boolean accept = !installationPath.equals(file) && !equalsOrDescendant(file, librariesFile) && !quicksetupFile.equals(file) && !openDSFile.equals(file); boolean accept = !installationPath.equals(file) && !equalsOrDescendant(file, librariesFile) && !quicksetupFile.equals(file) && !openDSFile.equals(file); if (accept && Utils.isWindows() && Utils.isCli()) { accept = !uninstallBatFile.equals(file); } if (accept && Utils.isWindows() && Utils.isCli()) { accept = !uninstallBatFile.equals(file); } for (int i=0; i<uData.length && accept; i++) { accept &= uData[i] || !equalsOrDescendant(file, new File(parentFiles[i])); } for (int i = 0; i < uData.length && accept; i++) { accept &= uData[i] || !equalsOrDescendant(file, new File(parentFiles[i])); } return accept; return accept; } } private boolean isWindowsServiceEnabled() { if (isWindowsServiceEnabled == null) { private boolean isWindowsServiceEnabled() { if (isWindowsServiceEnabled == null) { if (ConfigureWindowsService.serviceState(null, null) == ConfigureWindowsService.SERVICE_STATE_ENABLED) { ConfigureWindowsService.SERVICE_STATE_ENABLED) { isWindowsServiceEnabled = Boolean.TRUE; } else { } else { isWindowsServiceEnabled = Boolean.FALSE; } } @@ -1081,25 +1195,25 @@ /** * This methods disables this server as a Windows service. * * @throws ApplicationException if something goes wrong. */ protected void disableWindowsService() throws ApplicationException { protected void disableWindowsService() throws ApplicationException { notifyListeners(getFormattedProgress( getMsg("progress-disabling-windows-service"))); getMsg("progress-disabling-windows-service"))); int code = ConfigureWindowsService.disableService(System.out, System.err); String errorMessage = getMsg("error-disabling-windows-service"); switch (code) { switch (code) { case ConfigureWindowsService.SERVICE_DISABLE_SUCCESS: break; break; case ConfigureWindowsService.SERVICE_ALREADY_DISABLED: break; break; default: throw new ApplicationException( ApplicationException.Type.WINDOWS_SERVICE_ERROR, errorMessage, null); throw new ApplicationException( ApplicationException.Type.WINDOWS_SERVICE_ERROR, errorMessage, null); } } @@ -1107,22 +1221,18 @@ * This class is used to notify the UninstallProgressUpdateListeners of events * that are written to the standard error. These classes just create an * ErrorPrintStream and then they do a call to System.err with it. * * <p/> * The class just reads what is written to the standard error, obtains an * formatted representation of it and then notifies the * UninstallProgressUpdateListeners with the formatted messages. * */ protected class ErrorPrintStream extends PrintStream { protected class ErrorPrintStream extends PrintStream { private boolean isFirstLine; /** * Default constructor. * */ public ErrorPrintStream() { public ErrorPrintStream() { super(new ByteArrayOutputStream(), true); isFirstLine = true; } @@ -1130,13 +1240,10 @@ /** * {@inheritDoc} */ public void println(String msg) { if (isFirstLine) { public void println(String msg) { if (isFirstLine) { notifyListeners(getFormattedLogError(msg)); } else { } else { notifyListeners(formatter.getLineBreak() + getFormattedLogError(msg)); } isFirstLine = false; @@ -1145,17 +1252,14 @@ /** * {@inheritDoc} */ public void write(byte[] b, int off, int len) { if (b == null) { public void write(byte[] b, int off, int len) { if (b == null) { throw new NullPointerException("b is null"); } if (off + len > b.length) { if (off + len > b.length) { throw new IndexOutOfBoundsException( "len + off are bigger than the length of the byte array"); "len + off are bigger than the length of the byte array"); } println(new String(b, off, len)); } @@ -1165,22 +1269,18 @@ * This class is used to notify the UninstallProgressUpdateListeners of events * that are written to the standard output. These classes just create an * OutputPrintStream and then they do a call to System.out with it. * * <p/> * The class just reads what is written to the standard output, obtains an * formatted representation of it and then notifies the * UninstallProgressUpdateListeners with the formatted messages. * */ protected class OutputPrintStream extends PrintStream { protected class OutputPrintStream extends PrintStream { private boolean isFirstLine; /** * Default constructor. * */ public OutputPrintStream() { public OutputPrintStream() { super(new ByteArrayOutputStream(), true); isFirstLine = true; } @@ -1188,13 +1288,10 @@ /** * {@inheritDoc} */ public void println(String msg) { if (isFirstLine) { public void println(String msg) { if (isFirstLine) { notifyListeners(getFormattedLog(msg)); } else { } else { notifyListeners(formatter.getLineBreak() + getFormattedLog(msg)); } isFirstLine = false; @@ -1203,17 +1300,14 @@ /** * {@inheritDoc} */ public void write(byte[] b, int off, int len) { if (b == null) { public void write(byte[] b, int off, int len) { if (b == null) { throw new NullPointerException("b is null"); } if (off + len > b.length) { if (off + len > b.length) { throw new IndexOutOfBoundsException( "len + off are bigger than the length of the byte array"); "len + off are bigger than the length of the byte array"); } println(new String(b, off, len)); @@ -1221,7 +1315,7 @@ } private UninstallUserData getUninstallUserData() { return (UninstallUserData)getUserData(); return (UninstallUserData) getUserData(); } } opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
@@ -51,8 +51,8 @@ /** * {@inheritDoc} */ public Step getFirstWizardStep() { return Step.WELCOME; public WizardStep getFirstWizardStep() { return null; } /** @@ -60,7 +60,7 @@ */ protected void setWizardDialogState(QuickSetupDialog dlg, UserData userData, Step step) { WizardStep step) { } /** @@ -121,27 +121,78 @@ /** * {@inheritDoc} */ public Set<Step> getWizardSteps() { public Set<WizardStep> getWizardSteps() { return null; } /** * {@inheritDoc} */ public QuickSetupStepPanel createWizardStepPanel(Step step) { public QuickSetupStepPanel createWizardStepPanel(WizardStep step) { return null; } /** * {@inheritDoc} */ public Step getNextWizardStep(Step step) { public Step getNextWizardStep(WizardStep step) { return null; } /** * {@inheritDoc} */ public WizardStep getPreviousWizardStep(WizardStep step) { return null; } /** * {@inheritDoc} */ public void quitClicked(WizardStep step, QuickSetup qs) { } /** * {@inheritDoc} */ protected void updateUserData(WizardStep cStep, QuickSetup qs) throws UserDataException { } /** * {@inheritDoc} */ public void previousClicked(WizardStep cStep, QuickSetup qs) { } /** * {@inheritDoc} */ public void finishClicked(final WizardStep cStep, final QuickSetup qs) { } /** * {@inheritDoc} */ public void nextClicked(WizardStep cStep, QuickSetup qs) { } /** * {@inheritDoc} */ public void closeClicked(WizardStep cStep, QuickSetup qs) { } /** * {@inheritDoc} */ public void cancelClicked(WizardStep cStep, QuickSetup qs) { } /** * {@inheritDoc} */ public void run() { } opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
@@ -826,17 +826,6 @@ } /** * Returns <CODE>true</CODE> if this is an uninstallation and * <CODE>false</CODE> otherwise. * @return <CODE>true</CODE> if this is an uninstallation and * <CODE>false</CODE> otherwise. */ public static boolean isUninstall() { return "true".equals(System.getProperty("org.opends.quicksetup.uninstall")); } /** * Returns <CODE>true</CODE> if this is executed from command line and * <CODE>false</CODE> otherwise. * @return <CODE>true</CODE> if this is executed from command line and