Fix NPE when adding new taxon to classification
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / newWizard / NewTaxonNodeWizard.java
index 194bc3c7a66cc560dd971e896e9b39c094a462e4..2478bf5a125b6429af38ecd63c1312672728065f 100644 (file)
@@ -3,18 +3,26 @@
  */
 package eu.etaxonomy.taxeditor.newWizard;
 
+import java.util.HashSet;
+import java.util.Set;
 import java.util.UUID;
 
 import org.apache.commons.lang.StringUtils;
 
+import eu.etaxonomy.cdm.api.application.CdmApplicationState;
+import eu.etaxonomy.cdm.api.application.CdmChangeEvent;
+import eu.etaxonomy.cdm.api.application.CdmChangeEvent.Action;
 import eu.etaxonomy.cdm.api.service.IClassificationService;
 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
+import eu.etaxonomy.cdm.api.service.UpdateResult;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.cdm.model.taxon.Classification;
 import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.store.StoreUtil;
 import eu.etaxonomy.taxeditor.ui.section.classification.TaxonNodeWizardPage;
 
 /**
@@ -26,89 +34,132 @@ import eu.etaxonomy.taxeditor.ui.section.classification.TaxonNodeWizardPage;
  */
 public class NewTaxonNodeWizard extends AbstractNewEntityWizard<ITaxonTreeNode>{
 
-       private TaxonNodeWizardPage taxonNodePage;
-       private boolean openEmptyEditor;
-       private UUID generatedTaxonNodeUuid;
-
-       @Override
-       public void addPages() {
-               taxonNodePage = new TaxonNodeWizardPage(formFactory, getConversationHolder(), getEntity());
-               addPage(taxonNodePage);
-       }
-
-       @Override
-       protected void saveEntity() {
-               if(taxonNodePage.getTaxon() == null || StringUtils.isEmpty(taxonNodePage.getTaxon().getName().getFullTitleCache())){
-                       openEmptyEditor = true;
-               }else{
-                       getConversationHolder().bind();
-                       ITaxonTreeNode parent = getParentTreeNode();
-                       Taxon taxon = taxonNodePage.getTaxon();
-                       try{
-                               TaxonNode taxonNode = parent.addChildTaxon(taxon, parent.getReference(), parent.getMicroReference());
-                               generatedTaxonNodeUuid = CdmStore.getService(ITaxonNodeService.class).saveOrUpdate(taxonNode);
-                       }catch(IllegalArgumentException e){
-                               StoreUtil.warningDialog("Taxon already exists in classfication", getClass(), e.getMessage());
-                       }
-               }
-       }
-
-       @Override
-       protected ITaxonTreeNode createNewEntity() {
-               if(getSelection() != null){
-                       Object selectedObject = getSelection().getFirstElement();
-                       if(selectedObject instanceof ITaxonTreeNode){
-                           ITaxonTreeNode treeNode = (ITaxonTreeNode) selectedObject;
-
-                               if(treeNode instanceof Classification){
-                                       return CdmStore.getService(IClassificationService.class).load(treeNode.getUuid());
-                               }
-                               else if(treeNode instanceof TaxonNode){
-                                       return CdmStore.getService(ITaxonNodeService.class).load(treeNode.getUuid());
-                               }
-                       }
-               }
-
-               return null;
-       }
-
-       /**
-        * <p>openInEditor</p>
-        *
-        * @return a boolean.
-        */
-       public boolean openInEditor(){
-               return taxonNodePage.openInEditor();
-       }
-
-       /**
-        * <p>openEmpty</p>
-        *
-        * @return a boolean.
-        */
-       public boolean openEmpty(){
-               return openInEditor() && openEmptyEditor;
-       }
-
-       /**
-        * <p>getTaxonNode</p>
-        *
-        * @return a {@link eu.etaxonomy.cdm.model.taxon.TaxonNode} object.
-        */
-       public TaxonNode getTaxonNode(){
-               if(generatedTaxonNodeUuid != null){
-                       return CdmStore.getService(ITaxonNodeService.class).load(generatedTaxonNodeUuid);
-               }
-               return null;
-       }
-
-       public ITaxonTreeNode getParentTreeNode(){
-               return taxonNodePage.getParentTreeNode();
-       }
-
-       @Override
-       protected String getEntityName() {
-               return "Taxon";
-       }
+    private TaxonNodeWizardPage taxonNodePage;
+    private boolean openEmptyEditor;
+    private UUID generatedTaxonNodeUuid;
+    private IWizardPageListener wizardPageListener;
+
+    @Override
+    public void addPages() {
+        taxonNodePage = new TaxonNodeWizardPage(formFactory, getConversationHolder(), getEntity(), wizardPageListener);
+        addPage(taxonNodePage);
+    }
+
+    @Override
+    protected void saveEntity() {
+        if(taxonNodePage.getTaxon() == null || StringUtils.isEmpty(taxonNodePage.getTaxon().getName().getFullTitleCache())){
+            openEmptyEditor = true;
+        }else{
+            getConversationHolder().bind();
+            ITaxonTreeNode parent = getParentTreeNode();
+            Taxon taxon = taxonNodePage.getTaxon();
+            Reference sec = taxon.getSec();
+            taxon.setSec(null);
+            try{
+               UUID parentNodeUuid;
+               if(parent instanceof Classification){
+                   parentNodeUuid = ((Classification) parent).getRootNode().getUuid();
+               }
+               else{
+                   parentNodeUuid = parent.getUuid();
+               }
+                UpdateResult result = CdmStore.getService(ITaxonNodeService.class).createNewTaxonNode(parentNodeUuid, taxon, parent.getReference(), parent.getMicroReference());
+
+                //TaxonNode taxonNode = parent.addChildTaxon(taxon, parent.getReference(), parent.getMicroReference());
+
+              /*  if(CdmStore.getCurrentSessionManager().isRemoting()) {
+                    taxonNode = CdmStore.getService(ITaxonNodeService.class).merge(taxonNode);
+                } else {
+                    taxonNode = CdmStore.getService(ITaxonNodeService.class).save(taxonNode);
+                }*/
+               generatedTaxonNodeUuid = result.getCdmEntity().getUuid();
+               TaxonNode taxonNode = CdmStore.getService(ITaxonNodeService.class).load(generatedTaxonNodeUuid);
+               taxonNode.getTaxon().setSec(sec);
+               CdmStore.getService(ITaxonNodeService.class).merge(taxonNode, true);
+                Set<CdmBase> affectedObjects = new HashSet<CdmBase>();
+                if (result.getUpdatedObjects().iterator().hasNext()){
+                       TaxonNode parentNode = (TaxonNode)result.getUpdatedObjects().iterator().next();
+                       if(parentNode.getParent() == null) {
+                        affectedObjects.add(taxonNode.getClassification());
+                    }
+                       if(parentNode instanceof TaxonNode) {
+                        affectedObjects.add(parentNode);
+                    }
+                }
+
+
+
+
+                if(CdmStore.getCurrentSessionManager().isRemoting()) {
+                    CdmApplicationState.getCurrentDataChangeService()
+                        .fireChangeEvent(new CdmChangeEvent(Action.Create, affectedObjects, NewTaxonNodeWizard.class), true);
+                }
+            }catch(IllegalArgumentException e){
+                MessagingUtils.warningDialog("Taxon already exists in classfication", getClass(), e.getMessage());
+            }
+        }
+    }
+
+    @Override
+    protected ITaxonTreeNode createNewEntity() {
+        if(getSelection() != null){
+            Object selectedObject = getSelection().getFirstElement();
+            if(selectedObject instanceof ITaxonTreeNode){
+                ITaxonTreeNode treeNode = (ITaxonTreeNode) selectedObject;
+
+                if(treeNode instanceof Classification){
+                    return CdmStore.getService(IClassificationService.class).load(treeNode.getUuid());
+                }
+                else if(treeNode instanceof TaxonNode){
+                    return CdmStore.getService(ITaxonNodeService.class).load(treeNode.getUuid());
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * <p>openInEditor</p>
+     *
+     * @return a boolean.
+     */
+    public boolean openInEditor(){
+        return taxonNodePage.openInEditor();
+    }
+
+    /**
+     * <p>openEmpty</p>
+     *
+     * @return a boolean.
+     */
+    public boolean openEmpty(){
+        return openInEditor() && openEmptyEditor;
+    }
+
+    /**
+     * <p>getTaxonNode</p>
+     *
+     * @return a {@link eu.etaxonomy.cdm.model.taxon.TaxonNode} object.
+     */
+    public TaxonNode getTaxonNode(){
+        if(generatedTaxonNodeUuid != null){
+            return CdmStore.getService(ITaxonNodeService.class).load(generatedTaxonNodeUuid);
+        }
+        return null;
+    }
+
+    public ITaxonTreeNode getParentTreeNode(){
+        return taxonNodePage.getParentTreeNode();
+    }
+
+    @Override
+    protected String getEntityName() {
+        return "Taxon";
+    }
+
+    public void addWizardPageListener(IWizardPageListener wizardPageListener){
+        this.wizardPageListener = wizardPageListener;
+    }
 
 }
\ No newline at end of file