package org.nightlabs.jfire.auth.ui.wizard; import java.util.Collection; import java.util.HashSet; import java.util.List; import javax.jdo.FetchPlan; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.nightlabs.base.ui.job.Job; import org.nightlabs.base.ui.table.AbstractTableComposite; import org.nightlabs.base.ui.wizard.WizardHopPage; import org.nightlabs.jdo.NLJDOHelper; import org.nightlabs.jfire.auth.ui.resource.Messages; import org.nightlabs.jfire.base.ui.person.search.PersonSearchComposite; import org.nightlabs.jfire.base.ui.person.search.PersonSearchUseCaseConstants; import org.nightlabs.jfire.base.ui.security.UserTable; import org.nightlabs.jfire.person.Person; import org.nightlabs.jfire.prop.id.PropertySetID; import org.nightlabs.jfire.security.GlobalSecurityReflector; import org.nightlabs.jfire.security.User; import org.nightlabs.jfire.security.dao.UserDAO; import org.nightlabs.jfire.security.id.UserID; import org.nightlabs.jfire.security.integration.UserManagementSystem; import org.nightlabs.jfire.security.integration.UserManagementSystemManagerRemote; import org.nightlabs.progress.ProgressMonitor; /** * This page represents options for export of user data to some {@link UserManagementSystem}. It could contributed to {@link ImportExportWizard} * by specific {@link ISynchronizationPerformerHop} implementations or just added to wizard as is. * * Export options are: export all data (which means getting all related JFire object IDs by {@link UserManagementSystemManagerRemote#getAllUserManagementSystemRelatedEntityIDs()}), * export selected {@link User} objects, export selected {@link Person} objects. * * {@link User}s could are selected using {@link UserTable}, {@link Person}s are selected using {@link PersonSearchComposite}. * * @author Denis Dudnik <deniska.dudnik[at]gmail{dot}com> * */ public class GenericExportWizardPage extends WizardHopPage{ private Button exportAllButton; private Button exportSelectedUsers; private Button exportSelectedPersons; private StackLayout tableParentLayout; private UserTable userTable; private PersonSearchComposite personSearchComposite; private Collection<Object> selectedObjectsIDs = new HashSet<Object>(); private boolean shouldExportAll = true; private boolean canFinish = false; /** * Default constructor */ public GenericExportWizardPage() { super(GenericExportWizardPage.class.getName(), Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.pageTitle")); //$NON-NLS-1$ setDescription(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.pageDescription")); //$NON-NLS-1$ } /** * {@inheritDoc} */ @Override public Control createPageContents(Composite wizardParent) { Composite parent = new Composite(wizardParent, SWT.NONE); parent.setLayout(new GridLayout(1, false)); exportAllButton = new Button(parent, SWT.RADIO); exportAllButton.setText(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.exportAllButtonLabel")); //$NON-NLS-1$ exportAllButton.setSelection(true); exportAllButton.setToolTipText(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.exportAllButtonTooltip")); //$NON-NLS-1$ exportAllButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (exportAllButton.getSelection()){ shouldExportAll = true; if (userTable != null){ userTable.setEnabled(false); } if (personSearchComposite != null){ setEnabledRecursively(personSearchComposite, false); } updateStatus(null); } } }); exportSelectedUsers = new Button(parent, SWT.RADIO); exportSelectedUsers.setText(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.exportSelectedUsersButtonLabel")); //$NON-NLS-1$ exportSelectedUsers.setToolTipText(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.exportSelectedUsersButtonTooltip")); //$NON-NLS-1$ exportSelectedUsers.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (exportSelectedUsers.getSelection() && userTable != null){ shouldExportAll = false; if (!(userTable.getTableViewer().getInput() instanceof Collection)){ loadUserTable(); } userTable.setEnabled(true); tableParentLayout.topControl = userTable; userTable.getParent().layout(); updateStatus(null); } } }); exportSelectedPersons = new Button(parent, SWT.RADIO); exportSelectedPersons.setText(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.exportSelectedPersonsButtonLabel")); //$NON-NLS-1$ exportSelectedPersons.setToolTipText(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.exportSelectedPersonsButtonTooltip")); //$NON-NLS-1$ exportSelectedPersons.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (exportSelectedPersons.getSelection() && personSearchComposite != null){ shouldExportAll = false; setEnabledRecursively(personSearchComposite, true); tableParentLayout.topControl = personSearchComposite; personSearchComposite.getParent().layout(); updateStatus(null); } } }); Composite tableParent = new Composite(parent, SWT.NONE); tableParent.setLayoutData(new GridData(GridData.FILL_BOTH)); tableParentLayout = new StackLayout(); tableParent.setLayout(tableParentLayout); userTable = new UserTable(tableParent, SWT.MULTI, true, AbstractTableComposite.DEFAULT_STYLE_MULTI_BORDER); userTable.setLinesVisible(true); userTable.setHeaderVisible(true); userTable.getTableViewer().setSorter(new ViewerSorter()); userTable.setEnabled(false); userTable.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent e) { selectedObjectsIDs.clear(); for(User user : userTable.getSelectedElements()){ selectedObjectsIDs.add(UserID.create(user.getOrganisationID(), user.getUserID())); } if (selectedObjectsIDs.isEmpty()){ updateStatus(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.pageErrorStatus_noUserSelected")); //$NON-NLS-1$ }else{ canFinish = true; updateStatus(null); } } }); tableParentLayout.topControl = userTable; personSearchComposite = new PersonSearchComposite(tableParent, SWT.NONE, "", PersonSearchUseCaseConstants.USE_CASE_ID_DEFAULT); //$NON-NLS-1$ personSearchComposite.createSearchButton(personSearchComposite.getButtonBar()); personSearchComposite.getResultViewer().addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { selectedObjectsIDs.clear(); for (Person person : personSearchComposite.getResultViewer().getSelectedElements()){ selectedObjectsIDs.add(PropertySetID.create(person.getOrganisationID(), person.getPropertySetID())); } if (selectedObjectsIDs.isEmpty()){ updateStatus(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.pageErrorStatus_noPersonSelected")); //$NON-NLS-1$ }else{ canFinish = true; updateStatus(null); } } }); setEnabledRecursively(personSearchComposite, false); setControl(parent); return parent; } @Override public boolean canBeLastPage() { if (shouldExportAll){ return true; } return canFinish; } /** * {@inheritDoc} */ @Override public boolean isPageComplete() { if (exportAllButton != null && !exportAllButton.isDisposed() && exportAllButton.getSelection()){ return true; }else if (exportSelectedUsers != null && !exportSelectedUsers.isDisposed() && exportSelectedUsers.getSelection() && userTable != null && !userTable.isDisposed() && userTable.getSelection() != null && !userTable.getSelection().isEmpty()){ return true; }else if (exportSelectedPersons != null && !exportSelectedPersons.isDisposed() && exportSelectedPersons.getSelection() && personSearchComposite != null && !personSearchComposite.isDisposed() && personSearchComposite.getResultViewer() != null && personSearchComposite.getResultViewer().getFirstSelectedElement() instanceof Person){ return true; } return false; } /** * Check whether everything should be exported (corresponding option was selected) * * @return <code>true</code> if all related entities should be exported */ public boolean shouldExportAll() { return shouldExportAll; } /** * Get object IDs for export * * @return {@link Collection} of selected objects' IDs */ public Collection<Object> getSelectedObjectIDs(){ return selectedObjectsIDs; } private static final String[] USER_TYPES = new String[]{User.USER_TYPE_USER}; private static final String[] USER_FETCH_GROUPS = new String[] {FetchPlan.DEFAULT}; private void loadUserTable(){ userTable.setInput(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.userTableLoadingLabel")); //$NON-NLS-1$ Job job = new Job(Messages.getString("org.nightlabs.jfire.auth.ui.wizard.GenericExportWizardPage.loadUsersJobTitle")) { //$NON-NLS-1$ @Override protected IStatus run(ProgressMonitor monitor){ try { String organisationID = GlobalSecurityReflector.sharedInstance().getUserDescriptor().getOrganisationID(); final List<User> users = UserDAO.sharedInstance().getUsers( organisationID, USER_TYPES, USER_FETCH_GROUPS, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor); if (!getContainer().getShell().isDisposed()){ getContainer().getShell().getDisplay().asyncExec(new Runnable(){ public void run() { userTable.setInput(users); } }); } } catch (Exception e) { throw new RuntimeException(e); } return Status.OK_STATUS; } }; job.schedule(); } private static void setEnabledRecursively(Composite parent, boolean enabled){ parent.setEnabled(enabled); for (Control c : parent.getChildren()){ if (c instanceof Composite){ setEnabledRecursively((Composite) c, enabled); }else{ c.setEnabled(enabled); } } } }