#5009 Add operations and corresponding tests for delete / update nodes actions
authorCherian Mathew <c.mathew@bgbm.org>
Mon, 29 Jun 2015 12:24:40 +0000 (14:24 +0200)
committerCherian Mathew <c.mathew@bgbm.org>
Mon, 29 Jun 2015 12:31:22 +0000 (14:31 +0200)
#5009 : missed in last commit

16 files changed:
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientAgentService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientClassificationService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientCollectionService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientDescriptionService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientNameService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientOccurenceService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientReferenceService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTaxonService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTermService.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/handler/RemotingPolytomousKeyDeleteHandler.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/operation/RemotingPolytomousKeyDeleteOperation.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/operation/RemotingPolytomousKeyUpdateAllNodesOperation.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/META-INF/MANIFEST.MF
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/util/OperationsUtil.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/cdm/model/PolytomousKeyViewPartTest.java
eu.etaxonomy.taxeditor.test/src/test/resources/eu/etaxonomy/cdm/model/PolytomousKeyViewPartTest.xml

index 8f2ea5df6ae6d9c50327b8529a9c9247980c455a..a20f3a7229042cf264fea51fa73d5f3879543e43 100644 (file)
@@ -776,4 +776,12 @@ public class TransientAgentService implements IAgentService {
                return defaultService.delete(arg0);
        }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#delete(java.util.Collection)
+     */
+    @Override
+    public DeleteResult delete(Collection<UUID> arg0) {
+        return defaultService.delete(arg0);
+    }
+
 }
index de5efa8b4b8e81b3e889adc8f1288dfb88853ce5..d563a290b6c5e97b21623b19b0a8fe807c46ce9e 100644 (file)
@@ -950,4 +950,12 @@ public class TransientClassificationService implements IClassificationService {
         return defaultService.delete(arg0);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#delete(java.util.Collection)
+     */
+    @Override
+    public DeleteResult delete(Collection<UUID> arg0) {
+        return defaultService.delete(arg0);
+    }
+
 }
index d5e0c3bf280d21e50183c80491e666cba748a65e..4099ffdc2b010f869b1233b781c6676e5d37cf6f 100644 (file)
@@ -710,4 +710,12 @@ public class TransientCollectionService implements ICollectionService {
                return defaultService.delete(arg0);
        }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#delete(java.util.Collection)
+     */
+    @Override
+    public DeleteResult delete(java.util.Collection<UUID> arg0) {
+        return defaultService.delete(arg0);
+    }
+
 }
index d93be5db1adecae62b7e28305963caebba5e4263..90ae5f0ba42c067e8dbc15a8778a4cf3b2db1c7a 100644 (file)
@@ -1162,4 +1162,12 @@ public class TransientDescriptionService implements IDescriptionService {
         return defaultService.moveTaxonDescriptions(sourceTaxonUuid, targetTaxonUuid);
 
     }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#delete(java.util.Collection)
+     */
+    @Override
+    public DeleteResult delete(Collection<UUID> arg0) {
+        return defaultService.delete(arg0);
+    }
 }
index f24a603c9f69f2d6af09f5ae3213787b47cca29b..a74d73b5b471534e37dd3e4ae8cebdad5e984b44 100644 (file)
@@ -1182,6 +1182,14 @@ public class TransientNameService implements INameService {
         return defaultService.delete(arg0);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#delete(java.util.Collection)
+     */
+    @Override
+    public DeleteResult delete(Collection<UUID> arg0) {
+        return defaultService.delete(arg0);
+    }
+
 
 
 
index 7d30196c6dc1b849de28da7dfe6e3edef725eb43..c4c5e3ff7c0327a1d08d3222d4ed3734087d661c 100644 (file)
@@ -1065,4 +1065,12 @@ public class TransientOccurenceService implements IOccurrenceService {
         return defaultService.delete(uuid);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#delete(java.util.Collection)
+     */
+    @Override
+    public DeleteResult delete(Collection<UUID> arg0) {
+        return defaultService.delete(arg0);
+    }
+
 }
index 89ba707f7e821f2b68af219d64927849fa3a6e62..1a6612cb1aa4c5e66f9ea1429404528a82f34c11 100644 (file)
@@ -718,5 +718,13 @@ public class TransientReferenceService implements IReferenceService {
         return defaultService.delete(uuid);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#delete(java.util.Collection)
+     */
+    @Override
+    public DeleteResult delete(Collection<UUID> arg0) {
+        return defaultService.delete(arg0);
+    }
+
 
 }
index 2b3ed25f71a3101929d9118b4b0bb161711a0a7d..49237b718fb3a515cb7ac8de96aed44b1ef4c938 100644 (file)
@@ -1473,4 +1473,12 @@ public class TransientTaxonService implements ITaxonService {
 
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#delete(java.util.Collection)
+     */
+    @Override
+    public DeleteResult delete(Collection<UUID> arg0) {
+        return defaultService.delete(arg0);
+    }
+
 }
index 0089e72dbcc0ffe36f83ce2ca45cf9f547d4a46d..c3251691d24f762be42a1660568d98967182b134 100644 (file)
@@ -880,5 +880,13 @@ public class TransientTermService implements ITermService {
         return defaultService.delete(uuid);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#delete(java.util.Collection)
+     */
+    @Override
+    public DeleteResult delete(Collection<UUID> arg0) {
+        return defaultService.delete(arg0);
+    }
+
 
 }
index cb4534e2c5aad3c07b232192bf68f9fc3a61cfca..c04a5f33b2015aba3b59ff017eb93179e082fb55 100644 (file)
@@ -10,6 +10,7 @@
 package eu.etaxonomy.taxeditor.navigation.key.polytomous.handler;
 
 import java.util.List;
+import java.util.UUID;
 
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.operations.AbstractOperation;
@@ -18,11 +19,11 @@ import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.handlers.HandlerUtil;
 
-import eu.etaxonomy.cdm.model.description.PolytomousKey;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.navigation.key.polytomous.PolytomousKeyViewLabels;
 import eu.etaxonomy.taxeditor.navigation.key.polytomous.operation.RemotingPolytomousKeyDeleteOperation;
 import eu.etaxonomy.taxeditor.operation.RemotingCdmHandler;
+import eu.etaxonomy.taxeditor.util.OperationsUtil;
 
 /**
  * @author cmathew
@@ -31,7 +32,7 @@ import eu.etaxonomy.taxeditor.operation.RemotingCdmHandler;
  */
 public class RemotingPolytomousKeyDeleteHandler extends RemotingCdmHandler {
 
-    List<PolytomousKey> keysToDelete;
+    List<UUID> keysToDelete;
     /**
      * @param label
      */
@@ -46,7 +47,7 @@ public class RemotingPolytomousKeyDeleteHandler extends RemotingCdmHandler {
     public IStatus allowOperations(ExecutionEvent event) {
         IStructuredSelection selection = (IStructuredSelection) HandlerUtil.getCurrentSelection(event);
 
-        keysToDelete = selection.toList();
+        keysToDelete = OperationsUtil.convertToUuidList(selection.toList());
 
         if(keysToDelete.isEmpty()){
            return Status.CANCEL_STATUS;
index ecd5939c0a5d00391828d5731fdfd456e20b9d36..d3fcce5a82f6cfcb9ec423fcbe95c385f9158407 100644 (file)
@@ -10,6 +10,7 @@
 package eu.etaxonomy.taxeditor.navigation.key.polytomous.operation;
 
 import java.util.List;
+import java.util.UUID;
 
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -17,7 +18,6 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import eu.etaxonomy.cdm.api.application.CdmChangeEvent.Action;
 import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
 import eu.etaxonomy.cdm.api.service.UpdateResult;
-import eu.etaxonomy.cdm.model.description.PolytomousKey;
 import eu.etaxonomy.taxeditor.operation.RemotingCdmUpdateOperation;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
@@ -30,7 +30,7 @@ public class RemotingPolytomousKeyDeleteOperation extends RemotingCdmUpdateOpera
 
     private final static String LABEL = "Delete Polytomous Key operation";
 
-    private final List<PolytomousKey> keysToDelete;
+    private final List<UUID> keysToDelete;
     /**
      * @param label
      * @param action
@@ -39,7 +39,7 @@ public class RemotingPolytomousKeyDeleteOperation extends RemotingCdmUpdateOpera
      */
     public RemotingPolytomousKeyDeleteOperation(Object source,
             boolean async,
-            List<PolytomousKey> keysToDelete) {
+            List<UUID> keysToDelete) {
         super(LABEL, Action.Delete, source, async);
         this.keysToDelete = keysToDelete;
     }
@@ -49,20 +49,7 @@ public class RemotingPolytomousKeyDeleteOperation extends RemotingCdmUpdateOpera
      */
     @Override
     protected UpdateResult doUpdateExecute(IProgressMonitor monitor, IAdaptable info) throws Exception {
-        UpdateResult result = new UpdateResult();
-        for(PolytomousKey key : keysToDelete) {
-            UpdateResult updateResult = CdmStore.getService(IPolytomousKeyService.class).delete(key.getUuid());
-            if(updateResult.isAbort()) {
-                result.setStatus(updateResult.getStatus());
-                result.addExceptions(updateResult.getExceptions());
-                return result;
-            }
-            if(updateResult.isError()) {
-                result.setStatus(updateResult.getStatus());
-                result.addExceptions(updateResult.getExceptions());
-            }
-        }
-        return result;
+        return CdmStore.getService(IPolytomousKeyService.class).delete(keysToDelete);
     }
 
 }
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/operation/RemotingPolytomousKeyUpdateAllNodesOperation.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/operation/RemotingPolytomousKeyUpdateAllNodesOperation.java
new file mode 100644 (file)
index 0000000..7c1bedd
--- /dev/null
@@ -0,0 +1,55 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.navigation.key.polytomous.operation;
+
+import java.util.UUID;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import eu.etaxonomy.cdm.api.application.CdmChangeEvent.Action;
+import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
+import eu.etaxonomy.cdm.api.service.UpdateResult;
+import eu.etaxonomy.taxeditor.operation.RemotingCdmUpdateOperation;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * @author cmathew
+ * @date 29 Jun 2015
+ *
+ */
+public class RemotingPolytomousKeyUpdateAllNodesOperation extends RemotingCdmUpdateOperation {
+
+    UUID polytomousKeyUuid;
+    /**
+     * @param label
+     * @param action
+     * @param source
+     * @param async
+     */
+    public RemotingPolytomousKeyUpdateAllNodesOperation(Object source,
+            boolean async,
+            UUID polytomousKeyUuid) {
+        super(LABEL, Action.Update, source, async);
+        this.polytomousKeyUuid = polytomousKeyUuid;
+
+    }
+
+    private final static String LABEL = "Update All Polytomous Key Nodes operation";
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.operation.RemotingCdmUpdateOperation#doUpdateExecute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+     */
+    @Override
+    protected UpdateResult doUpdateExecute(IProgressMonitor monitor, IAdaptable info) throws Exception {
+        return CdmStore.getService(IPolytomousKeyService.class).updateAllNodeNumberings(polytomousKeyUuid);
+    }
+
+}
index 6ffffa58816e992bd68fd1aa7b94fb41466627c1..c312ec1778d276af0ed18895263ff964ccf3b67d 100644 (file)
@@ -47,6 +47,7 @@ Export-Package: eu.etaxonomy.cdm,
  eu.etaxonomy.taxeditor.ui.section.supplemental,
  eu.etaxonomy.taxeditor.ui.section.taxon,
  eu.etaxonomy.taxeditor.ui.selection,
+ eu.etaxonomy.taxeditor.util,
  eu.etaxonomy.taxeditor.view,
  eu.etaxonomy.taxeditor.view.datasource,
  eu.etaxonomy.taxeditor.view.datasource.handler,
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/util/OperationsUtil.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/util/OperationsUtil.java
new file mode 100644 (file)
index 0000000..6ba148a
--- /dev/null
@@ -0,0 +1,36 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import eu.etaxonomy.cdm.model.common.CdmBase;
+
+/**
+ * @author cmathew
+ * @date 29 Jun 2015
+ *
+ */
+public class OperationsUtil {
+
+    public static List<UUID> convertToUuidList(List<CdmBase> cdmBaseList) {
+        List<UUID> uuids = new ArrayList<UUID>();
+        for(CdmBase cdmBase : cdmBaseList) {
+            if(cdmBase == null) {
+                uuids.add(null);
+            } else {
+                uuids.add(cdmBase.getUuid());
+            }
+        }
+        return uuids;
+    }
+}
index 613eb9dece003ab09b09a082b8bafe19a2523a3d..1c64ff8ad933356a965064393c8ef782f432c6bc 100644 (file)
@@ -15,12 +15,14 @@ import java.util.UUID;
 
 import org.eclipse.core.commands.ExecutionException;
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.unitils.dbunit.annotation.DataSet;
 
 import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
 import eu.etaxonomy.cdm.model.description.PolytomousKey;
 import eu.etaxonomy.taxeditor.navigation.key.polytomous.operation.RemotingPolytomousKeyDeleteOperation;
+import eu.etaxonomy.taxeditor.navigation.key.polytomous.operation.RemotingPolytomousKeyUpdateAllNodesOperation;
 import eu.etaxonomy.taxeditor.operations.BaseOperationTest;
 
 /**
@@ -32,21 +34,30 @@ import eu.etaxonomy.taxeditor.operations.BaseOperationTest;
 public class PolytomousKeyViewPartTest extends BaseOperationTest {
 
     IPolytomousKeyService polytomousKeyService = getRemoteApplicationController().getPolytomousKeyService();
+    private static UUID pkey1Uuid = UUID.fromString("f82cef88-5a9e-4917-9938-d08bda40836f");
+    private static UUID pkey2Uuid = UUID.fromString("a00ca7ec-b660-433c-bd14-596826ab2243");
+    private static UUID pkey3Uuid = UUID.fromString("197bc542-bf5b-4a52-aa66-c65df32c196b");
 
+    @Ignore // waiting for #3998 to be fixed
     @Test
     public void testDeletePolytomousKey() throws ExecutionException {
         List<PolytomousKey> pKeysBeforeDelete = polytomousKeyService.list(PolytomousKey.class, null, null, null, null);
         int initialCount = pKeysBeforeDelete.size();
 
         List<PolytomousKey> keysToDelete = new ArrayList<PolytomousKey>();
-        keysToDelete.add(polytomousKeyService.load(UUID.fromString("f82cef88-5a9e-4917-9938-d08bda40836f")));
-        keysToDelete.add(polytomousKeyService.load(UUID.fromString("a00ca7ec-b660-433c-bd14-596826ab2243")));
-        keysToDelete.add(polytomousKeyService.load(UUID.fromString("197bc542-bf5b-4a52-aa66-c65df32c196b")));
+        keysToDelete.add(polytomousKeyService.load(pkey1Uuid));
+        keysToDelete.add(polytomousKeyService.load(pkey2Uuid));
+        keysToDelete.add(polytomousKeyService.load(pkey3Uuid));
+
+        List<UUID> uuids = new ArrayList<UUID>();
+        uuids.add(pkey1Uuid);
+        uuids.add(pkey2Uuid);
+        uuids.add(pkey3Uuid);
 
         int keysToDeleteCount = keysToDelete.size();
         operation = new RemotingPolytomousKeyDeleteOperation(sessionOwner,
                 false,
-                keysToDelete);
+                uuids);
         operation.execute(monitor, info);
 
         List<PolytomousKey> pKeysAfterDelete = polytomousKeyService.list(PolytomousKey.class, null, null, null, null);
@@ -57,4 +68,12 @@ public class PolytomousKeyViewPartTest extends BaseOperationTest {
 
     }
 
+    @Test
+    public void testUpdateAllNodes() throws ExecutionException {
+        operation = new RemotingPolytomousKeyUpdateAllNodesOperation(sessionOwner,
+                false,
+                pkey1Uuid);
+        operation.execute(monitor, info);
+    }
+
 }
index b91bc8620037e2931f53b5c781d52da7bbebc239..ec6b58042c41ec23e12f258e90e9e46dce008f45 100644 (file)
@@ -1,19 +1,24 @@
 <?xml version="1.0" encoding="UTF-8"?><!--
-  generated by Jailer 4.3, Thu Jun 25 16:36:00 CEST 2015 from cmathew@cmbgbm-t530
+  generated by Jailer 4.3, Mon Jun 29 14:15:44 CEST 2015 from cmathew@cmbgbm-t530
   
-  Extraction Model:  PolytomousKey where id = 90 or id = 111 or id = 112 or id = 113 or id = 114 or id = 115 or id = 116 (extractionmodel/by-example/SbE-PolytomousKey-16-34-36-489.csv)
+  Extraction Model:  PolytomousKey where id = 90 or id = 111 or id = 112 or id = 113 or id = 114 or id = 115 or id = 116 (extractionmodel/by-example/SbE-PolytomousKey-14-15-18-725.csv)
   Database URL:      jdbc:mysql://127.0.0.1:3306/local-cyprus
   Database User:     root
   
-  Exported Rows:     7
+  Exported Rows:     10
       PolytomousKey                  7
+      PolytomousKeyNode              3
   
 --><dataset>
-  <PolytomousKey id="90" created="2012-11-23 19:53:37.0" uuid="f82cef88-5a9e-4917-9938-d08bda40836f" protectedtitlecache="true" titleCache="Cleome"   startNumber="1"/>
+  <PolytomousKeyNode id="100" created="2012-11-23 19:53:37.0" uuid="c8e296da-441d-403b-9647-d729c00b2aa4" updated="2014-01-24 13:21:03.0" nodenumber="1"   key_id="90"/>
+  <PolytomousKeyNode id="101" created="2012-11-23 19:53:54.0" uuid="588754cd-6098-40d3-bb37-05d0a6676336" sortindex="0"  key_id="90"   parent_id="100"/>
+  <PolytomousKeyNode id="102" created="2012-11-23 19:54:42.0" uuid="52ea0b19-f29e-49fc-8326-02292fda4e43" sortindex="1"  key_id="90"   parent_id="100"/>
+
+  <PolytomousKey id="90" created="2012-11-23 19:53:37.0" uuid="f82cef88-5a9e-4917-9938-d08bda40836f" protectedtitlecache="true" titleCache="Cleome"  root_id="100" startNumber="1"/>
   <PolytomousKey id="111" created="2013-02-15 16:26:38.0" uuid="a00ca7ec-b660-433c-bd14-596826ab2243" protectedtitlecache="true" titleCache="Ammi"   startNumber="1"/>
   <PolytomousKey id="112" created="2013-02-15 16:31:54.0" uuid="197bc542-bf5b-4a52-aa66-c65df32c196b" protectedtitlecache="true" titleCache="Adonis"   startNumber="1"/>
   <PolytomousKey id="113" created="2013-02-15 16:50:59.0" uuid="2ebacbb0-13f4-4407-8579-d5968e09a905" protectedtitlecache="true" titleCache="Enarthrocarpus"   startNumber="1"/>
-  <PolytomousKey id="114" created="2013-02-15 16:54:31.0" uuid="0426418c-5b76-4c19-8177-6bebb4d37329" protectedtitlecache="true" titleCache="Glaucium"   startNumber="1"/>
+  <PolytomousKey id="114" created="2013-02-15 16:54:31.0" uuid="0426418c-5b76-4c19-8177-6bebb4d37329" protectedtitlecache="true" titleCache="Glaucium"  startNumber="1"/>
   <PolytomousKey id="115" created="2013-02-15 17:05:42.0" uuid="6aa69b73-6242-4d3d-85c9-485aab9b1975" protectedtitlecache="true" titleCache="Sagina"   startNumber="1"/>
   <PolytomousKey id="116" created="2013-02-15 17:09:43.0" uuid="cfe7626d-49cc-4dac-acbc-601825deb44a" protectedtitlecache="true" titleCache="Dianthus"   startNumber="1"/>