Java tutorial
/******************************************************************************* * Copyright (c) 2011 neXtep Software and contributors. * All rights reserved. * * This file is part of neXtep designer. * * NeXtep designer is free software: you can redistribute it * and/or modify it under the terms of the GNU General Public * License as published by the Free Software Foundation, either * version 3 of the License, or any later version. * * NeXtep designer is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * neXtep Softwares - initial API and implementation *******************************************************************************/ /** * */ package com.nextep.designer.vcs.ui.services; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import org.hibernate.HibernateException; import com.nextep.datadesigner.Designer; import com.nextep.datadesigner.exception.CancelException; import com.nextep.datadesigner.gui.impl.DefaultWizard; import com.nextep.datadesigner.gui.model.IConnector; import com.nextep.datadesigner.hibernate.HibernateUtil; import com.nextep.datadesigner.model.IEventListener; import com.nextep.datadesigner.model.IObservable; import com.nextep.datadesigner.model.UID; import com.nextep.datadesigner.vcs.gui.UserCreationWizard; import com.nextep.datadesigner.vcs.gui.dialog.RepositoryUpgradeWizardPage; import com.nextep.datadesigner.vcs.services.VersionHelper; import com.nextep.designer.core.CorePlugin; import com.nextep.designer.core.model.IConnection; import com.nextep.designer.core.model.IDatabaseConnector; import com.nextep.designer.repository.RepositoryPlugin; import com.nextep.designer.repository.RepositoryStatus; import com.nextep.designer.repository.exception.NoRepositoryConnectionException; import com.nextep.designer.repository.exception.NoRepositoryException; import com.nextep.designer.repository.services.IRepositoryUpdaterService; import com.nextep.designer.ui.CoreUiPlugin; import com.nextep.designer.ui.UIMessages; import com.nextep.designer.ui.editors.RepositoryConnectionEditor; import com.nextep.designer.ui.helpers.UIHelper; import com.nextep.designer.ui.preferences.DesignerUIConstants; import com.nextep.designer.vcs.model.IRepositoryUser; import com.nextep.designer.vcs.model.IVersionable; import com.nextep.designer.vcs.model.IWorkspace; import com.nextep.designer.vcs.model.impl.Workspace; import com.nextep.designer.vcs.ui.VCSUIMessages; import com.nextep.designer.vcs.ui.VCSUIPlugin; import com.nextep.designer.vcs.ui.dialogs.RepositoryInstallerMonitorPage; /** * @author Christophe Fondacci */ public final class VersionUIHelper { private static final Log log = LogFactory.getLog(VersionUIHelper.class); private VersionUIHelper() { } /** * Retrieves the currently selected versionable or <code>null</code> if no IVersionable object * is currently selected . * * @param window active window or event window * @return the IVErsionable object currently being selected */ @SuppressWarnings("unchecked") public static List<IVersionable<?>> getSelectedVersionable(IWorkbenchWindow window) { List<?> models = UIHelper.getSelectedModel(window); if (models != null) { for (Object o : models) { if (!(o instanceof IVersionable)) { return Collections.emptyList(); } } } return (List<IVersionable<?>>) models; } /** * Changes the current version view (workarea). This method handles the view switch at the UI * layer and will therefore handle any opened editor / perspective. The raw view flush / load is * delegated to the {@link VersionHelper#changeWorkspace(UID)} method. * * @param viewID new view ID to load. */ public static void changeView(UID viewID) { VCSUIPlugin.getService(IWorkspaceUIService.class).changeWorkspace(viewID); // List<ICommand> cmds = new ArrayList<ICommand>(); // boolean openPerspective = false; // // Handling perspective closure if a perspective is already opened // if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) { // final IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow() // .getActivePage(); // if (page != null) { // openPerspective = true; // if (!PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() // .closeAllEditors(true)) { // return; // } // } // } // // Delegating load to the VersionHelper // cmds.addAll(VersionHelper.getChangeViewCommands(viewID)); // // // Opening the perspective if we have previously closed it // if (openPerspective) { // cmds.add(new ICommand() { // // @Override // public Object execute(Object... parameters) { // try { // PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() // .closeAllPerspectives(false, true); // PlatformUI.getWorkbench().showPerspective( // "com.neXtep.Designer.perspective", // PlatformUI.getWorkbench().getActiveWorkbenchWindow()); // Designer.getMarkerProvider().invalidate(); // PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() // .showView(ProblemsView.VIEW_ID, null, IWorkbenchPage.VIEW_CREATE); // // // Job j = new CommandJob("Synchronizing with database.",new // // RefreshSynchStatusCommand()); // // j.schedule(); // } catch (WorkbenchException e) { // log.error(e); // } // return null; // } // // @Override // public String getName() { // return VCSUIMessages.getString("openingNewView"); // } // }); // } // // if (openPerspective) { // CommandProgress.runWithProgress(false, cmds.toArray(new ICommand[cmds.size()])); // } else { // for (ICommand cmd : cmds) { // cmd.execute(); // } // } // // Saving last opened view for proper restore of the workbench // Designer.getInstance().setProperty(DesignerCoreConstants.LAST_OPENED_VIEW, // viewID.toString()); } /** * Changes the password of this repository user * * @param user repository user for password update * @param newPassword new password to assign to this user */ public static void changeUserPassword(IRepositoryUser user, String newPassword) { boolean confirm = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Change user password", MessageFormat.format(VCSUIMessages.getString("userConfirmChangePassword"), user.getName(), newPassword)); if (confirm) { try { HibernateUtil.getInstance().getSession() .createSQLQuery("update REP_USERS set password=? where user_id=?").setString(0, newPassword) .setLong(1, user.getUID().rawId()).executeUpdate(); } catch (HibernateException e) { log.error("Error while updating user password", e); throw e; } log.info("Password changed for user '" + user.getName() + "'"); } else { log.info("Aborted password change."); } } /** * Retrieves the repository database status * * @return a {@link RepositoryStatus} enumeration representing our ability to connect to a * proper repository database. */ private static RepositoryStatus getRepositoryStatus(IDatabaseConnector dbConnector) { /* * FIXME [BGA] The DatabaseConnector that is used to log the repository to which we are * connecting is not the same as the DatabaseConnector that is actually used to connect the * repository, i.e the dbConnector parameter passed in is not used to connect. Either it * should be removed, either the local variable repoConn should be removed. */ final IConnection repoConn = CorePlugin.getRepositoryService().getRepositoryConnection(); final IProgressMonitor monitor = Designer.getProgressMonitor(); if (monitor != null) { monitor.setTaskName("Connecting to repository [" + dbConnector.getConnectionURL(repoConn) + "]..."); } RepositoryStatus repositoryStatus; // Checking release try { repositoryStatus = getRepositoryUpdaterService().checkRepository(repoConn); } catch (NoRepositoryException e) { repositoryStatus = RepositoryStatus.NO_REPOSITORY; } catch (NoRepositoryConnectionException e) { repositoryStatus = RepositoryStatus.NO_CONNECTION; } return repositoryStatus; } private static IRepositoryUpdaterService getRepositoryUpdaterService() { return RepositoryPlugin.getService(IRepositoryUpdaterService.class); } /** * This method handles the startup of the versioning features. It handles the check of the * repository connection, its version, user setup and displays the appropriate wizards when * needed. * * @return <code>true</code> if startup requirements are ok, else </code>. Users should not go * on with the startup of neXtep if this method returns false. */ public static boolean startup() { final List<IWizardPage> pages = new ArrayList<IWizardPage>(); final IDatabaseConnector dbConnector = CoreUiPlugin.getRepositoryUIService().getRepositoryConnector(); final RepositoryStatus repositoryStatus = getRepositoryStatus(dbConnector); // Enabling controls switch (repositoryStatus) { case NO_CONNECTION: pages.add(new RepositoryUpgradeWizardPage(repositoryStatus)); pages.add(new RepositoryConnectionEditor()); break; case NO_REPOSITORY: pages.add(new RepositoryUpgradeWizardPage(repositoryStatus)); pages.add(new RepositoryInstallerMonitorPage(dbConnector)); pages.add(new UserCreationWizard()); break; case REPOSITORY_TOO_OLD: pages.add(new RepositoryUpgradeWizardPage(repositoryStatus)); pages.add(new RepositoryInstallerMonitorPage(dbConnector)); break; case CLIENT_TOO_OLD: // update manager cannot work here because the platform is not yet running // UpdateManagerUI.openInstaller(statusLabel.getShell()); IWorkspace view = new Workspace("Update view", ""); view.setId(1); VersionHelper.setCurrentView(view); break; } // Wizarding only if there's something to do... if (pages.size() > 0) { final Shell shell = Display.getDefault().getActiveShell(); try { final String title = VCSUIMessages.getString("repositoryUpgradeTitle"); //$NON-NLS-1$ Wizard wiz = new DefaultWizard(title) { @Override public boolean canFinish() { for (IWizardPage page : getPages()) { if (!page.isPageComplete()) { return false; } } return true; } @Override public boolean performCancel() { if (getContainer().getCurrentPage() instanceof RepositoryInstallerMonitorPage) { return false; } return super.performCancel(); } };// title,pages); WizardDialog d = new WizardDialog(shell, wiz) { @Override public void updateButtons() { super.updateButtons(); if (getCurrentPage() instanceof RepositoryInstallerMonitorPage) { getButton(IDialogConstants.CANCEL_ID).setEnabled(false); } } }; d.setHelpAvailable(true); d.setTitle(title); d.setBlockOnOpen(true); for (IWizardPage page : pages) { wiz.addPage(page); } // This setting overrides the computed size which might not be enough to display // correctly all controls d.setMinimumPageSize(500, 300); d.open(); if (d.getReturnCode() == Window.OK) { final IDatabaseConnector repoConnector = CoreUiPlugin.getRepositoryUIService() .getRepositoryConnector(); final RepositoryStatus newStatus = getRepositoryStatus(repoConnector); if (repositoryStatus == RepositoryStatus.NO_CONNECTION && newStatus != RepositoryStatus.NO_CONNECTION) { return startup(); } return newStatus == RepositoryStatus.OK; } else { return false; } } catch (CancelException e) { log.info("Action cancelled", e); return false; } catch (RuntimeException e) { MessageDialog.openError(shell, "Unexpected exception", "An unexpected exception was raised while checking the repository status, please contact neXtep Softwares.\nException was :\n" + e.getMessage()); log.error("Unexpected exception", e); return false; } } else { return true; } } /** * Depending on preferences, user will be prompted that the object has been resynched and any * listening display connector will be refreshed. * * @param o object which had been synched. */ public static void promptObjectSynched(Object o) { if (!Designer.getInstance().getPropertyBool(DesignerUIConstants.PROP_PROMPT_WHEN_SYNCHED)) { MessageDialogWithToggle.openInformation( CoreUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(), UIMessages.getString("objectSynchedTitle"), UIMessages.getString("objectSynched"), UIMessages.getString("objectSynchedToggle"), false, VCSUIPlugin.getDefault().getPreferenceStore(), DesignerUIConstants.PROP_PROMPT_WHEN_SYNCHED); } // Ensuring proper refresh if (o instanceof IObservable) { final IObservable obs = (IObservable) o; for (IEventListener l : obs.getListeners()) { if (l instanceof IConnector) { ((IConnector) l).refreshConnector(); } } } } }