package org.nightlabs.jfire.personrelation.ui.createrelation; import java.lang.reflect.InvocationTargetException; import java.util.Collection; import javax.jdo.JDOHelper; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.operation.IRunnableWithProgress; import org.nightlabs.base.ui.progress.ProgressMonitorWrapper; import org.nightlabs.base.ui.wizard.DynamicPathWizard; import org.nightlabs.jdo.NLJDOHelper; import org.nightlabs.jfire.base.ui.person.search.PersonSearchWizardPage; import org.nightlabs.jfire.person.Person; import org.nightlabs.jfire.personrelation.PersonRelationType; import org.nightlabs.jfire.personrelation.dao.PersonRelationDAO; import org.nightlabs.jfire.personrelation.id.PersonRelationTypeID; import org.nightlabs.jfire.personrelation.ui.resource.Messages; import org.nightlabs.jfire.prop.dao.PropertySetDAO; import org.nightlabs.jfire.prop.id.PropertySetID; import org.nightlabs.progress.ProgressMonitor; import org.nightlabs.progress.SubProgressMonitor; public class CreatePersonRelationWizard extends DynamicPathWizard { private PropertySetID fromPersonID; private SelectPersonRelationTypePage selectPersonRelationTypePage; private PersonSearchWizardPage personSearchWizardPage; public CreatePersonRelationWizard(PropertySetID fromPersonID) { if (fromPersonID == null) throw new IllegalArgumentException("fromPersonID must not be null!"); //$NON-NLS-1$ this.fromPersonID = fromPersonID; } @Override public void addPages() { selectPersonRelationTypePage = new SelectPersonRelationTypePage(); addPage(selectPersonRelationTypePage); personSearchWizardPage = new PersonSearchWizardPage(null); // TODO null supported? Or do I have to pass ""?! addPage(personSearchWizardPage); } @Override public boolean performFinish() { Collection<PersonRelationType> selectedPersonRelationTypes = selectPersonRelationTypePage.getSelectedElements(); final Collection<PersonRelationTypeID> selectedPersonRelationTypeIDs = NLJDOHelper.getObjectIDList(selectedPersonRelationTypes); final Person selectedPerson = personSearchWizardPage.getSelectedPerson(); try { getContainer().run(true, false, new IRunnableWithProgress() { @Override public void run(IProgressMonitor i_monitor) throws InvocationTargetException, InterruptedException { ProgressMonitor monitor = new ProgressMonitorWrapper(i_monitor); monitor.beginTask(Messages.getString("org.nightlabs.jfire.personrelation.ui.createrelation.CreatePersonRelationWizard.task.creatingPersonRelation.name"), 2 + selectedPersonRelationTypeIDs.size()); //$NON-NLS-1$ try { PropertySetID toPersonID = null; if (!JDOHelper.isDetached(selectedPerson)) { // The person is new (not yet persisted), we need to first store the person selectedPerson.deflate(); Person person = (Person) PropertySetDAO.sharedInstance().storeJDOObject( selectedPerson, true, null, 1, new SubProgressMonitor(monitor, 2) ); toPersonID = (PropertySetID) JDOHelper.getObjectId(person); } else { toPersonID = (PropertySetID) JDOHelper.getObjectId(selectedPerson); } for (PersonRelationTypeID personRelationTypeID : selectedPersonRelationTypeIDs) { createPersonRelation(fromPersonID, toPersonID, personRelationTypeID, new SubProgressMonitor(monitor, 1)); } } finally { monitor.done(); } } }); } catch (Exception x) { throw new RuntimeException(x); } return true; } /** * This method is called in order to create a new PersonRelation of the given type between the given persons. * <p> * The standard-implementation uses {@link PersonRelationDAO#createPersonRelation(PersonRelationTypeID, PropertySetID, PropertySetID, ProgressMonitor)}. * Subclasses may overwrite in order to do more specialized work. * </p> * * @param fromPersonID ID of the person that should be the origin of the new relation. * @param toPersonID ID of the person that should be the target of the new relation. * @param personRelationTypeID The ID of the type of the new relation. * @param monitor A monitor to report progress to. */ protected void createPersonRelation( PropertySetID fromPersonID, PropertySetID toPersonID, PersonRelationTypeID personRelationTypeID, ProgressMonitor monitor) { PersonRelationDAO.sharedInstance().createPersonRelation( personRelationTypeID, fromPersonID, toPersonID, new SubProgressMonitor(monitor, 1) ); } public PropertySetID getFromPersonID() { return fromPersonID; } public SelectPersonRelationTypePage getSelectPersonRelationTypePage() { return selectPersonRelationTypePage; } public PersonSearchWizardPage getPersonSearchWizardPage() { return personSearchWizardPage; } }