package org.nightlabs.jfire.auth.ui.wizard; import java.util.ArrayList; import java.util.List; import javax.jdo.FetchPlan; import javax.security.auth.login.LoginException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.nightlabs.base.ui.job.Job; import org.nightlabs.base.ui.wizard.WizardHop; import org.nightlabs.jfire.auth.ui.resource.Messages; import org.nightlabs.jfire.auth.ui.wizard.ISynchronizationPerformerHop.SyncDirection; import org.nightlabs.jfire.security.dao.UserManagementSystemDAO; import org.nightlabs.jfire.security.integration.SynchronizableUserManagementSystem; import org.nightlabs.jfire.security.integration.UserManagementSystem; import org.nightlabs.jfire.security.integration.UserManagementSystemCommunicationException; import org.nightlabs.jfire.security.integration.UserManagementSystemType; import org.nightlabs.progress.ProgressMonitor; /** * WizardHop containing {@link ImportExportConfigurationPage} for selecting {@link UserManagementSystem} and action type. * Starts a {@link Job} for loading all existent {@link UserManagementSystem} persistent instances when constructor is called. * * @author Denis Dudnik <deniska.dudnik[at]gmail{dot}com> * */ public class ImportExportWizardHop extends WizardHop{ private Job loadJob; private ImportExportConfigurationPage configPage; private static final String[] FETCH_GROUPS_USER_MANAGEMENT_SYSTEM = { UserManagementSystem.FETCH_GROUP_NAME, UserManagementSystem.FETCH_GROUP_TYPE, UserManagementSystemType.FETCH_GROUP_NAME, FetchPlan.DEFAULT }; // UserManagementSystem -> UserManagementSystemType -> UserManagementSystemTypeName -> names private static final int FETCH_DEPTH_USER_MANAGEMENT_SYSTEM = 4; private List<SynchronizableUserManagementSystem<?>> allSyncUserManagementSystems; /** * Default constructor. Creates {@link ImportExportConfigurationPage} and starts a {@link Job} for loading all * persistent {@link UserManagementSystem} objects. */ public ImportExportWizardHop() { // create page with "loading usermanagement systems..." label configPage = new ImportExportConfigurationPage(); setEntryPage(configPage); loadJob = new Job(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.ImportExportWizardHop.loadAllUserManagementSystemsJobTitle")) { //$NON-NLS-1$ @Override protected IStatus run(ProgressMonitor monitor) throws Exception { List<UserManagementSystem> allUserManagementSystems = UserManagementSystemDAO.sharedInstance().getAllUserManagementSystems( FETCH_GROUPS_USER_MANAGEMENT_SYSTEM, FETCH_DEPTH_USER_MANAGEMENT_SYSTEM, monitor); allSyncUserManagementSystems = new ArrayList<SynchronizableUserManagementSystem<?>>(); for (UserManagementSystem userManagementSystem : allUserManagementSystems) { if (userManagementSystem instanceof SynchronizableUserManagementSystem){ allSyncUserManagementSystems.add((SynchronizableUserManagementSystem<?>) userManagementSystem); } } return Status.OK_STATUS; } }; loadJob.addJobChangeListener(new JobChangeAdapter(){ @Override public void done(IJobChangeEvent event) { if (Status.OK_STATUS == event.getResult()){ getWizard().getContainer().getShell().getDisplay().asyncExec(new Runnable() { @Override public void run() { configPage.setUserManagementSystems(allSyncUserManagementSystems); } }); } super.done(event); } }); loadJob.schedule(); } /** * Sets selected {@link UserManagementSystem} and {@link SyncDirection} so {@link ImportExportConfigurationPage} * and calls it to proceed to the next page. * * @param userManagementSystem {@link UserManagementSystem} selected for synchronization * @param syncDirection Direction of synchronization, either import or export */ public void proceedToNextPage(SynchronizableUserManagementSystem<?> userManagementSystem, SyncDirection syncDirection) { configPage.proceedToNextPage(userManagementSystem, syncDirection); } /** * Delegates running synchronization to specific {@link ISynchronizationPerformerHop} implementation. * * @param monitor {@link ProgressMonitor} to be used * @throws LoginException * @throws UserManagementSystemCommunicationException */ public void performSynchronization(ProgressMonitor monitor) throws LoginException, UserManagementSystemCommunicationException{ configPage.getSynchronizationHop().performSynchronization(configPage.getSelectedUserManagementSystem(), configPage.getSyncDirection(), monitor); } /** * Get selected action: import or export. * * @return selected {@link SyncDirection} */ public SyncDirection getSyncDirection(){ return configPage.getSyncDirection(); } /** * Get {@link UserManagementSystem} selected for import/export on {@link ImportExportConfigurationPage} * * @return selected {@link UserManagementSystem} */ public SynchronizableUserManagementSystem<?> getSelectedUserManagementSystem(){ return configPage.getSelectedUserManagementSystem(); } }