#5130 Extend import wizards to import data via remoting and Add tests for the same
authorCherian Mathew <c.mathew@bgbm.org>
Thu, 6 Aug 2015 14:01:13 +0000 (16:01 +0200)
committerCherian Mathew <c.mathew@bgbm.org>
Thu, 6 Aug 2015 14:01:13 +0000 (16:01 +0200)
19 files changed:
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/source/CdmServerInfo.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/SpecimenImportView.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/AbstractIOManager.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/ExportManager.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/ImportManager.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/wizard/AbcdImportWizard.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/wizard/ExcelNormalExplicitTaxaImportWizard.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/wizard/SddImportWizard.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/wizard/TcsImportWizard.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/RemotingLoginDialog.java
eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/service/IOServiceExportTest.java [moved from eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/service/IOServiceTest.java with 96% similarity]
eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/service/IOServiceImportTest.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.test/src/test/resources/eu/etaxonomy/taxeditor/service/IOServiceExportTest.xml [moved from eu.etaxonomy.taxeditor.test/src/test/resources/eu/etaxonomy/taxeditor/service/IOServiceTest.xml with 100% similarity]
eu.etaxonomy.taxeditor.test/src/test/resources/eu/etaxonomy/taxeditor/service/IOServiceImportTest.xml [new file with mode: 0644]
eu.etaxonomy.taxeditor.test/src/test/resources/imports/ABCDImport.xml [new file with mode: 0644]
eu.etaxonomy.taxeditor.test/src/test/resources/imports/NormalExplicitImport.xls [new file with mode: 0644]
eu.etaxonomy.taxeditor.test/src/test/resources/imports/SDD.xml [new file with mode: 0644]
eu.etaxonomy.taxeditor.test/src/test/resources/imports/SpecimenExcelImport.xls [new file with mode: 0644]
eu.etaxonomy.taxeditor.test/src/test/resources/imports/TcsImport.xml [new file with mode: 0644]

index 3391f17a7ebb1829c163aaed119dcc26a120c197..134d4f6870974457a8f13660568ae9282cd7b034 100644 (file)
@@ -227,16 +227,17 @@ public class CdmServerInfo {
     }
 
     public static CdmRemoteSource getDevServerRemoteSource() {
-        String value=System.getProperty("cdm.server.dev.activate");
+        String value = System.getProperty("cdm.server.dev.port");
         boolean available = false;
         CdmInstanceInfo devInstance = null;
-        if(value != null && value.equals("true")) {
-            CdmServerInfo devCii = new CdmServerInfo(NAME_LOCALHOST_DEV, SERVER_LOCALHOST_DEV, PORT_LOCALHOST_DEV);
+        if(value != null && !value.isEmpty()) {
+            int devPort = Integer.valueOf(value);
+            CdmServerInfo devCii = new CdmServerInfo(NAME_LOCALHOST_DEV, SERVER_LOCALHOST_DEV, devPort);
             try {
                 devInstance = devCii.addInstance(NAME_INSTANCE_LOCALHOST_DEV, BASEPATH_LOCALHOST_DEV);
-                available = devCii.pingInstance(devInstance, PORT_LOCALHOST_DEV);
+                available = devCii.pingInstance(devInstance, devPort);
                 if(available) {
-                    return devCii.getCdmRemoteSource(devInstance, PORT_LOCALHOST_DEV);
+                    return devCii.getCdmRemoteSource(devInstance, devPort);
                 }
             } catch (Exception e) {
 
index d4a254049339ec1297b05fae25dc593e30e4f5b2..298b1f4b66ce0638bc638b0b83471446c81db1ea 100644 (file)
@@ -16,9 +16,11 @@ import java.util.ArrayList;
 import java.util.Collection;
 
 import org.apache.http.client.ClientProtocolException;
+import org.eclipse.core.runtime.jobs.Job;
 
 import eu.etaxonomy.cdm.ext.occurrence.bioCase.BioCaseQueryServiceWrapper;
 import eu.etaxonomy.cdm.io.common.CdmDefaultImport;
+import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
 import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.taxeditor.editor.view.dataimport.transientServices.TransientCdmRepository;
@@ -65,14 +67,19 @@ public class SpecimenImportView extends DataImportView<SpecimenOrObservationBase
             //FIXME move ABCD import to cdmlib -> this will also get rid of the transient services
             InputStream resultStream;
             resultStream = new BioCaseQueryServiceWrapper().query(query, endPoint);
-            Abcd206ImportConfigurator configurator = Abcd206ImportConfigurator.NewInstance(resultStream, null, false);
+            Abcd206ImportConfigurator configurator = Abcd206ImportConfigurator.NewInstance(null, null);
             TransientCdmRepository repo =
                     new TransientCdmRepository(CdmStore.getCurrentApplicationConfiguration());
             configurator.setCdmAppController(repo);
             configurator.setAddMediaAsMediaSpecimen(true);
-
-            CdmDefaultImport<Abcd206ImportConfigurator> importer = new CdmDefaultImport<Abcd206ImportConfigurator>();
-            importer.invoke(configurator);
+            if(CdmStore.getCurrentSessionManager().isRemoting()) {
+                Job job = CdmStore.getImportManager().createIOServiceJob(configurator, resultStream, SOURCE_TYPE.INPUTSTREAM);
+                CdmStore.getImportManager().run(job);
+            } else {
+                configurator.setSource(resultStream);
+                CdmDefaultImport<Abcd206ImportConfigurator> importer = new CdmDefaultImport<Abcd206ImportConfigurator>();
+                importer.invoke(configurator);
+            }
             results = repo.getUnits();
             setResults(results);
         } catch (ClientProtocolException e) {
index ebabf84aea9cd7016c957ac2d437a48eb81ff401..5b01fc7e08258a87e32a888c0c4a2be1e8545bce 100644 (file)
@@ -10,8 +10,6 @@
 
 package eu.etaxonomy.taxeditor.io;
 
-import java.io.File;
-
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.ui.progress.IProgressConstants;
 
@@ -59,14 +57,17 @@ public abstract class AbstractIOManager<CONFIGURATOR extends IIoConfigurator> {
         *            a CONFIGURATOR object.
         */
        public void run(final CONFIGURATOR configurator) {
-               // create job
-               Job job = createIOJob(configurator);
-               // configure the job
-               job.setProperty(IProgressConstants.KEEP_PROPERTY, true);
-               job.setUser(true);
-               // schedule job
-               job.schedule();
+           // create job
+           Job job = createIOJob(configurator);
+           run(job);
+       }
 
+       public void run(Job job) {
+           // configure the job
+           job.setProperty(IProgressConstants.KEEP_PROPERTY, true);
+           job.setUser(true);
+           // schedule job
+           job.schedule();
        }
 
        /**
@@ -80,5 +81,4 @@ public abstract class AbstractIOManager<CONFIGURATOR extends IIoConfigurator> {
         */
        protected abstract Job createIOJob(CONFIGURATOR configurator);
 
-       public abstract Job createIOServiceJob(CONFIGURATOR configurator, File ioFile);
 }
index 21c1d98f458be68084770b805a357af3cd580270..9afd3ceea5d92e8b84353d98306c24afc790efb1 100644 (file)
@@ -165,10 +165,6 @@ public class ExportManager extends AbstractIOManager<IExportConfigurator> {
                return job;
        }
 
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.io.AbstractIOManager#createIOServiceJob(eu.etaxonomy.cdm.io.common.IIoConfigurator)
-        */
-       @Override
        public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) {
            Assert.isNotNull(configurator, "Configuration may not be null");
 
index fcb651eb6c58db9c091ae76ac88f6a97670cda46..89249cddc02f43a90f6d1dad5e9a9a85e6075259 100644 (file)
 package eu.etaxonomy.taxeditor.io;
 
 import java.io.File;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
+import org.apache.commons.io.IOUtils;
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
@@ -19,19 +24,23 @@ import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.swt.widgets.Display;
 
+import eu.etaxonomy.cdm.api.application.CdmApplicationState;
 import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
 import eu.etaxonomy.cdm.io.common.CdmDefaultImport;
 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
+import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
 import eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator;
 import eu.etaxonomy.cdm.io.jaxb.JaxbImportConfigurator;
 import eu.etaxonomy.cdm.io.reference.endnote.in.EndnoteImportConfigurator;
 import eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator;
+import eu.etaxonomy.cdm.io.service.IIOService;
 import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator;
 import eu.etaxonomy.cdm.io.specimen.excel.in.SpecimenCdmExcelImportConfigurator;
 import eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator;
 import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
 
 /**
  * <p>
@@ -128,14 +137,64 @@ public class ImportManager extends AbstractIOManager<IImportConfigurator> {
 
        }
 
+       public Job createIOServiceJob(IImportConfigurator configurator, InputStream is, SOURCE_TYPE type) {
+
+           try {
+               return createIOServiceJob(configurator, IOUtils.toByteArray(is), type);
+           } catch (Exception e) {
+               MessagingUtils.errorDialog("Error importing input stream",
+                       this,
+                       e.getMessage(),
+                       TaxeditorStorePlugin.PLUGIN_ID,
+                       e,
+                       true);
+           }
+           return null;
+       }
+
+       public Job createIOServiceJob(IImportConfigurator configurator, File importFile, SOURCE_TYPE type) {
+           Path path = Paths.get(importFile.toURI());
+           try {
+               return createIOServiceJob(configurator, Files.readAllBytes(path), type);
+           } catch (Exception e) {
+               MessagingUtils.errorDialog("Error importing file",
+                       this,
+                       e.getMessage(),
+                       TaxeditorStorePlugin.PLUGIN_ID,
+                       e,
+                       true);
+           }
+           return null;
+       }
+
+    public Job createIOServiceJob(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
+        Assert.isNotNull(configurator, "Configuration may not be null");
+        final Display display = Display.getDefault();
+        Job job = new Job("Import: " + configurator.getClass().getSimpleName()) {
+
+            @Override
+            protected IStatus run(IProgressMonitor monitor) {
+                monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
+                IIOService ioService = CdmApplicationState.getIOService();
+
+                ioService.importData(configurator, data, type);
+
+                monitor.done();
+
+                display.asyncExec(new Runnable() {
+
+                    @Override
+                    public void run() {
+                        CdmStore.getContextManager().notifyContextRefresh();
+                    }
+                });
+
+                return Status.OK_STATUS;
+            }
+        };
+
+        return job;
 
-    /* (non-Javadoc)
-     * @see eu.etaxonomy.taxeditor.io.AbstractIOManager#createIOServiceJob(eu.etaxonomy.cdm.io.common.IIoConfigurator)
-     */
-    @Override
-    public Job createIOServiceJob(IImportConfigurator configurator, File importFile) {
-        // TODO Auto-generated method stub
-        return null;
     }
 
        private IImportConfigurator getConfigurator(TYPE type) {
index 19eb4604d84c79aa0919c8bc74c5664ab84ae361..70bc683baa8c356fbc7002fd54a1bfc9eb37a631 100644 (file)
@@ -16,10 +16,12 @@ import java.io.FileNotFoundException;
 import java.net.URI;
 
 import org.apache.log4j.Logger;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.IWorkbench;
 
 import eu.etaxonomy.cdm.database.DbSchemaValidation;
+import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
 import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
@@ -55,23 +57,28 @@ public class AbcdImportWizard extends AbstractImportWizard<Abcd206ImportConfigur
        /** {@inheritDoc} */
        @Override
        public boolean performFinish() {
-               URI source = dataSourcePage.getUri();
-               try {
-            configurator.setSource(new FileInputStream(new File(source)));
-        } catch (FileNotFoundException e) {
-            MessagingUtils.errorDialog("File not found.", this, "Import file was not found.", TaxeditorStorePlugin.PLUGIN_ID, e, false);
-            logger.error("File not found!", e);
-            return false;
-        }
-               configurator.setDbSchemaValidation(DbSchemaValidation.CREATE);
+           URI source = dataSourcePage.getUri();
+           configurator.setDbSchemaValidation(DbSchemaValidation.CREATE);
 
-               if(classificationChooserWizardPage.getClassification()!=null){
-                   configurator.setClassificationUuid(classificationChooserWizardPage.getClassification().getUuid());
-               }
-               configurator.setReportUri(classificationChooserWizardPage.getReportUri());
+           if(classificationChooserWizardPage.getClassification()!=null){
+               configurator.setClassificationUuid(classificationChooserWizardPage.getClassification().getUuid());
+           }
+           configurator.setReportUri(classificationChooserWizardPage.getReportUri());
 
-               CdmStore.getImportManager().run(configurator);
-               return true;
+           if(CdmStore.getCurrentSessionManager().isRemoting()) {
+               Job job = CdmStore.getImportManager().createIOServiceJob(configurator, new File(source), SOURCE_TYPE.INPUTSTREAM);
+               CdmStore.getImportManager().run(job);
+           } else {
+               try {
+                   configurator.setSource(new FileInputStream(new File(source)));
+               } catch (FileNotFoundException e) {
+                   MessagingUtils.errorDialog("File not found.", this, "Import file was not found.", TaxeditorStorePlugin.PLUGIN_ID, e, false);
+                   logger.error("File not found!", e);
+                   return false;
+               }
+               CdmStore.getImportManager().run(configurator);
+           }
+           return true;
 
        }
 
index 744044a2b4efeaa97acf39a7f06121d62e10a2d7..f6d43baf8a87ad54781bc3133d77849036a302b3 100644 (file)
 
 package eu.etaxonomy.taxeditor.io.wizard;
 
+import java.io.File;
 import java.net.URI;
 
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.IWorkbench;
 
 import eu.etaxonomy.cdm.database.DbSchemaValidation;
+import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
 import eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
@@ -52,7 +55,13 @@ public class ExcelNormalExplicitTaxaImportWizard extends AbstractImportWizard<No
                configurator.setSource(source);
                configurator.setDbSchemaValidation(DbSchemaValidation.CREATE);
 
-               CdmStore.getImportManager().run(configurator);
+               if(CdmStore.getCurrentSessionManager().isRemoting()) {
+                   Job job = CdmStore.getImportManager().createIOServiceJob(configurator, new File(source), SOURCE_TYPE.URI);
+                   CdmStore.getImportManager().run(job);
+               } else {
+                   CdmStore.getImportManager().run(configurator);
+               }
+
 
                return true;
        }
index 294c68481528788a7eb0a915d19fb9405a64a247..8f4d382fe447410f271f066467f0656caa06a8d0 100644 (file)
@@ -1,21 +1,24 @@
 // $Id$
 /**
 * Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy 
+* 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.io.wizard;
 
+import java.io.File;
 import java.net.URI;
 
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.IWorkbench;
 
 import eu.etaxonomy.cdm.database.DbSchemaValidation;
+import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
 import eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
@@ -29,9 +32,9 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
 public class SddImportWizard extends AbstractImportWizard<SDDImportConfigurator> {
 
        private SDDImportConfigurator configurator;
-       
+
        private ImportFromFileDataSourceWizardPage dataSourcePage;
-       
+
        /* (non-Javadoc)
         * @see eu.etaxonomy.taxeditor.io.wizard.AbstractImportWizard#getConfigurator()
         */
@@ -40,7 +43,7 @@ public class SddImportWizard extends AbstractImportWizard<SDDImportConfigurator>
        public SDDImportConfigurator getConfigurator() {
                return configurator;
        }
-       
+
        /*
         * (non-Javadoc)
         * @see org.eclipse.jface.wizard.Wizard#addPage(org.eclipse.jface.wizard.IWizardPage)
@@ -49,12 +52,12 @@ public class SddImportWizard extends AbstractImportWizard<SDDImportConfigurator>
        @Override
        public void addPages() {
                super.addPages();
-               
-               dataSourcePage = new ImportFromFileDataSourceWizardPage("Choose File", 
+
+               dataSourcePage = new ImportFromFileDataSourceWizardPage("Choose File",
                                "Please choose an XML file in the SDD format.", new String[]{"*.xml", "*.sdd"});
                addPage(dataSourcePage);
        }
-       
+
        /* (non-Javadoc)
         * @see org.eclipse.jface.wizard.Wizard#performFinish()
         */
@@ -64,9 +67,14 @@ public class SddImportWizard extends AbstractImportWizard<SDDImportConfigurator>
                URI source = dataSourcePage.getUri();
                configurator.setSource(source);
                configurator.setDbSchemaValidation(DbSchemaValidation.CREATE);
-               
-               CdmStore.getImportManager().run(configurator);
-               
+
+               if(CdmStore.getCurrentSessionManager().isRemoting()) {
+                   Job job = CdmStore.getImportManager().createIOServiceJob(configurator, new File(source), SOURCE_TYPE.URI);
+                   CdmStore.getImportManager().run(job);
+               } else {
+                   CdmStore.getImportManager().run(configurator);
+               }
+
                return true;
        }
 
@@ -74,7 +82,8 @@ public class SddImportWizard extends AbstractImportWizard<SDDImportConfigurator>
         * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
         */
        /** {@inheritDoc} */
-       public void init(IWorkbench workbench, IStructuredSelection selection) {
+       @Override
+    public void init(IWorkbench workbench, IStructuredSelection selection) {
                super.init(workbench, selection);
                configurator =  CdmStore.getImportManager().SddConfigurator();
        }
index 96a95ae554bd9a61476a7baa8a46362a1c330731..13113c2e49a6bf93ee1058b30955bb69d58d2396 100644 (file)
@@ -1,21 +1,24 @@
 // $Id$
 /**
 * Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy 
+* 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.io.wizard;
 
+import java.io.File;
 import java.net.URI;
 
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.IWorkbench;
 
 import eu.etaxonomy.cdm.database.DbSchemaValidation;
+import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
 import eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
@@ -26,8 +29,8 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
  * @created 15.06.2009
  * @version 1.0
  */
-public class TcsImportWizard extends AbstractImportWizard<TcsXmlImportConfigurator>{
-       
+public class TcsImportWizard extends AbstractImportWizard<TcsXmlImportConfigurator> {
+
        private TcsXmlImportConfigurator configurator;
 
        private ImportFromFileDataSourceWizardPage dataSourcePage;
@@ -38,20 +41,26 @@ public class TcsImportWizard extends AbstractImportWizard<TcsXmlImportConfigurat
        /** {@inheritDoc} */
        @Override
        public boolean performFinish() {
-               URI source = dataSourcePage.getUri();
-               configurator.setSource(source);
-               configurator.setDbSchemaValidation(DbSchemaValidation.CREATE);
-               
-               CdmStore.getImportManager().run(configurator);
-               
-               return true;
+           URI source = dataSourcePage.getUri();
+           configurator.setSource(source);
+           configurator.setDbSchemaValidation(DbSchemaValidation.CREATE);
+
+           if(CdmStore.getCurrentSessionManager().isRemoting()) {
+               Job job = CdmStore.getImportManager().createIOServiceJob(configurator, new File(source), SOURCE_TYPE.URI);
+               CdmStore.getImportManager().run(job);
+           } else {
+               CdmStore.getImportManager().run(configurator);
+           }
+
+           return true;
        }
 
        /* (non-Javadoc)
         * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
         */
        /** {@inheritDoc} */
-       public void init(IWorkbench workbench, IStructuredSelection selection) {
+       @Override
+    public void init(IWorkbench workbench, IStructuredSelection selection) {
                super.init(workbench, selection);
                configurator = CdmStore.getImportManager().TcsConfigurator();
        }
@@ -72,7 +81,7 @@ public class TcsImportWizard extends AbstractImportWizard<TcsXmlImportConfigurat
        @Override
        public void addPages() {
                super.addPages();
-               
+
                dataSourcePage = ImportFromFileDataSourceWizardPage.XML();
                addPage(dataSourcePage);
        }
index f72fece5fe5051641466d6ccada30675ac8bebc4..ef35781c72c25c43ea44561d28acc57f4e600b68 100644 (file)
@@ -120,6 +120,7 @@ public class RemotingLoginDialog extends Dialog {
     private String serverName, instanceName;
     private boolean autoConnect = false;
     private boolean loadLoginPrefs = true;
+    private boolean isDevRemoteSource = false;
 
     /**
      * Create the dialog.
@@ -171,6 +172,7 @@ public class RemotingLoginDialog extends Dialog {
         CdmRemoteSource devRemoteSource = CdmServerInfo.getDevServerRemoteSource();
         if(devRemoteSource != null) {
             CdmStore.connect(devRemoteSource, this);
+            isDevRemoteSource = true;
         }
 
         Display display = getParent().getDisplay();
@@ -680,11 +682,21 @@ public class RemotingLoginDialog extends Dialog {
     }
 
     private void readPrefCredentials() {
+        String username, password;
+        if(isDevRemoteSource) {
+            username = System.getProperty("cdm.server.dev.username");
+            password = System.getProperty("cdm.server.dev.password");
+            if(username != null && !username.isEmpty() && password != null && !password.isEmpty()) {
+                txtLogin.setText(username);
+                txtPassword.setText(password);
+                return;
+            }
+        }
         IEclipsePreferences preferences = ConfigurationScope.INSTANCE.getNode(STORE_PREFERENCES_NODE);
         Preferences credentialsPrefs = preferences.node(LOGIN_NODE);
-        String username = credentialsPrefs.get(getUsernamePrefKey(), "");
+        username = credentialsPrefs.get(getUsernamePrefKey(), "");
         txtLogin.setText(username);
-        String password = credentialsPrefs.get(getPasswordPrefKey(), "");
+        password = credentialsPrefs.get(getPasswordPrefKey(), "");
         txtPassword.setText(password);
         if(username.isEmpty() || password.isEmpty()) {
             autoConnect = false;
similarity index 96%
rename from eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/service/IOServiceTest.java
rename to eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/service/IOServiceExportTest.java
index 89d04c8f584927b89d12077e3a5ce87a053a248d..90873c4bb14bbd6537c2c58b78839bba08c10ceb 100644 (file)
@@ -21,6 +21,7 @@ import org.junit.Test;
 import org.unitils.dbunit.annotation.DataSet;
 
 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
+import eu.etaxonomy.cdm.api.service.INameService;
 import eu.etaxonomy.cdm.io.common.ExportResult;
 import eu.etaxonomy.cdm.io.csv.caryophyllales.out.CsvNameExportConfigurator;
 import eu.etaxonomy.cdm.io.csv.redlist.demo.CsvDemoExportConfigurator;
@@ -35,9 +36,10 @@ import eu.etaxonomy.taxeditor.httpinvoker.BaseRemotingTest;
  *
  */
 @DataSet
-public class IOServiceTest extends BaseRemotingTest {
+public class IOServiceExportTest extends BaseRemotingTest {
 
     private final IIOService ioService = CdmApplicationState.getIOService();
+    private final INameService nameService = CdmApplicationState.getCurrentAppConfig().getNameService();
 
     @Test
     public void exportJaxbTest() {
diff --git a/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/service/IOServiceImportTest.java b/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/service/IOServiceImportTest.java
new file mode 100644 (file)
index 0000000..965304b
--- /dev/null
@@ -0,0 +1,149 @@
+// $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.service;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.unitils.dbunit.annotation.DataSet;
+
+import eu.etaxonomy.cdm.api.application.CdmApplicationState;
+import eu.etaxonomy.cdm.api.service.INameService;
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+import eu.etaxonomy.cdm.database.DbSchemaValidation;
+import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
+import eu.etaxonomy.cdm.io.common.ImportResult;
+import eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator;
+import eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator;
+import eu.etaxonomy.cdm.io.service.IIOService;
+import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator;
+import eu.etaxonomy.cdm.io.specimen.excel.in.SpecimenCdmExcelImportConfigurator;
+import eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator;
+import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;
+import eu.etaxonomy.taxeditor.httpinvoker.BaseRemotingTest;
+
+/**
+ *
+ * Note : One issue with this test class is that when the tests are run a second time
+ * against the same server there are errors due to the fact that not all the imported data is deleted.
+ * This needs to be fixed
+ * @author cmathew
+ * @date 5 Aug 2015
+ *
+ */
+@Ignore // seems to cause problems with other tests due to data not deleted
+@DataSet
+public class IOServiceImportTest extends BaseRemotingTest {
+
+    private final IIOService ioService = CdmApplicationState.getIOService();
+    private final INameService nameService = CdmApplicationState.getCurrentAppConfig().getNameService();
+    private final IOccurrenceService occurrenceService = CdmApplicationState.getCurrentAppConfig().getOccurrenceService();
+
+    @Test
+    public void importNormalExplicit() throws IOException {
+        String importFilePath = "src/test/resources/imports/NormalExplicitImport.xls";
+        NormalExplicitImportConfigurator config =
+                NormalExplicitImportConfigurator.NewInstance(null, null, null, null);
+        config.setNomenclaturalCode(NomenclaturalCode.ICNB);
+        config.setDbSchemaValidation(DbSchemaValidation.CREATE);
+        ImportResult result = ioService.importData(config, fileToByteArray(importFilePath), SOURCE_TYPE.URI);
+        Assert.assertTrue(result.isSuccess());
+        List<TaxonNameBase> list = nameService.list(TaxonNameBase.class, null, null, null, null);
+        Assert.assertEquals(9,list.size());
+    }
+
+
+    @Test
+    public void importAbcd() throws IOException {
+        String importFilePath = "src/test/resources/imports/ABCDImport.xml";
+        Abcd206ImportConfigurator config =
+                Abcd206ImportConfigurator.NewInstance(null, null);
+        config.setNomenclaturalCode(NomenclaturalCode.ICNB);
+        config.setDbSchemaValidation(DbSchemaValidation.CREATE);
+        ImportResult result = ioService.importData(config, fileToByteArray(importFilePath), SOURCE_TYPE.INPUTSTREAM);
+        Assert.assertTrue(result.isSuccess());
+        Assert.assertTrue(!result.getReports().isEmpty());
+        saveToFile("target/importAbcdReport.txt", result.getReports().get(0));
+        List<TaxonNameBase> list = nameService.list(TaxonNameBase.class, null, null, null, null);
+        Assert.assertEquals(2,list.size());
+    }
+
+    @Test
+    public void importSDD() throws IOException {
+        String importFilePath = "src/test/resources/imports/SDD.xml";
+        SDDImportConfigurator config =
+                SDDImportConfigurator.NewInstance(null, null);
+        config.setNomenclaturalCode(NomenclaturalCode.ICNB);
+        config.setDbSchemaValidation(DbSchemaValidation.CREATE);
+        ImportResult result = ioService.importData(config, fileToByteArray(importFilePath), SOURCE_TYPE.URI);
+        Assert.assertTrue(result.isSuccess());
+        List<TaxonNameBase> list = nameService.list(TaxonNameBase.class, null, null, null, null);
+        Assert.assertEquals(9,list.size());
+    }
+
+    @Test
+    public void importSpecimenExcel() throws IOException {
+        String importFilePath = "src/test/resources/imports/SpecimenExcelImport.xls";
+        SpecimenCdmExcelImportConfigurator config = SpecimenCdmExcelImportConfigurator.NewInstance(null, null);
+        config.setNomenclaturalCode(NomenclaturalCode.ICNB);
+        config.setDbSchemaValidation(DbSchemaValidation.CREATE);
+        ImportResult result = ioService.importData(config, fileToByteArray(importFilePath), SOURCE_TYPE.URI);
+        Assert.assertTrue(result.isSuccess());
+//        List<SpecimenOrObservationBase> occurrences = occurrenceService.list(SpecimenOrObservationBase.class, null, null, null, null);
+//        Assert.assertEquals(3,occurrences.size());
+    }
+
+    @Test
+    public void importTCS() throws IOException {
+        String importFilePath = "src/test/resources/imports/TcsImport.xml";
+        TcsXmlImportConfigurator config = TcsXmlImportConfigurator.NewInstance(null, null);
+        config.setNomenclaturalCode(NomenclaturalCode.ICNB);
+        config.setDbSchemaValidation(DbSchemaValidation.CREATE);
+        ImportResult result = ioService.importData(config, fileToByteArray(importFilePath), SOURCE_TYPE.URI);
+        Assert.assertTrue(result.isSuccess());
+        List<TaxonNameBase> list = nameService.list(TaxonNameBase.class, null, null, null, null);
+        Assert.assertEquals(16,list.size());
+    }
+
+    private byte[] fileToByteArray(String filePath) throws IOException {
+        Path path = Paths.get(filePath);
+        return Files.readAllBytes(path);
+    }
+
+    private static void saveToFile(String filePath, byte[] data) {
+        FileOutputStream stream = null;
+        try {
+            stream = new FileOutputStream(filePath);
+            stream.write(data);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if(stream != null) {
+                    stream.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+}
diff --git a/eu.etaxonomy.taxeditor.test/src/test/resources/eu/etaxonomy/taxeditor/service/IOServiceImportTest.xml b/eu.etaxonomy.taxeditor.test/src/test/resources/eu/etaxonomy/taxeditor/service/IOServiceImportTest.xml
new file mode 100644 (file)
index 0000000..e6c8bef
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<dataset>
+  <TaxonNameBase />
+  <TaxonBase />
+  <TaxonNode />
+  <Classification />
+</dataset>
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.test/src/test/resources/imports/ABCDImport.xml b/eu.etaxonomy.taxeditor.test/src/test/resources/imports/ABCDImport.xml
new file mode 100644 (file)
index 0000000..b97b0f1
--- /dev/null
@@ -0,0 +1,737 @@
+<?xml version="1.0"?>
+<abcd:DataSets xmlns:abcd="http://www.tdwg.org/schemas/abcd/2.06" xmlns:biocase="http://www.biocase.org/schemas/protocol/1.3" xmlns:ns1="http://www.dnabank-network.org/test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.biocase.org/schemas/protocol/1.3 http://www.bgbm.org/biodivinf/schema/protocol_1_31.xsd">
+      <abcd:DataSet>
+        <abcd:DatasetGUID>www.floraweb.de/florkart/atlas/2007</abcd:DatasetGUID>
+        <abcd:TechnicalContacts>
+          <abcd:TechnicalContact>
+            <abcd:Name>Rudolf May</abcd:Name>
+            <abcd:Email>rudolf.may@bfn.de</abcd:Email>
+            <abcd:Phone>+49-228-84911441</abcd:Phone>
+            <abcd:Address>BfN, Konstantinstr. 110, D-53179 Bonn</abcd:Address>
+          </abcd:TechnicalContact>
+        </abcd:TechnicalContacts>
+        <abcd:ContentContacts>
+          <abcd:ContentContact>
+            <abcd:Name>Rudolf May</abcd:Name>
+            <abcd:Email>rudolf.may@bfn.de</abcd:Email>
+            <abcd:Phone>+49-228-84911441</abcd:Phone>
+            <abcd:Address>BfN, Konstantinstr. 110, D-53179 Bonn</abcd:Address>
+          </abcd:ContentContact>
+        </abcd:ContentContacts>
+        <abcd:Metadata>
+          <abcd:Description>
+            <abcd:Representation abcd:language="GE German Deutsch">
+              <abcd:Title>FlorKart - FlorenKartierung Gefaesspflanzen</abcd:Title>
+              <abcd:Details>Verbreitung der Farn- und Bluetenpflanzen in Deutschland, Vorkommensnachweise aggregiert auf Rasterfelder der Topographischen Karte im Massstab 1 : 25000 (TK25 = MTB), Blattschnitt 6 x 10 Minuten, sowie in Zeitperioden 'vor 1950', '1950 - 1980', '1980 - 2000'</abcd:Details>
+              <abcd:Coverage>Deutschland</abcd:Coverage>
+              <abcd:URI>http://www.floraweb.de</abcd:URI>
+            </abcd:Representation>
+          </abcd:Description>
+          <abcd:IconURI>http://www.floraweb.de/images/floraweb.gif</abcd:IconURI>
+          <abcd:Version>
+            <abcd:Major>2007</abcd:Major>
+          </abcd:Version>
+          <abcd:RevisionData>
+            <abcd:Creators>Netzwerk Phytodiversitaet Deutschlands (NetPhyD) und Bundesamt f&#xFC;r Naturschutz (BfN)</abcd:Creators>
+            <abcd:Contributors>Alle ehrenamtlich an der Floristischen Kartierung Deutschlands beteiligten Mitarbeiter</abcd:Contributors>
+            <abcd:DateCreated>2007-01-01</abcd:DateCreated>
+            <abcd:DateModified>2010-01-01</abcd:DateModified>
+          </abcd:RevisionData>
+          <abcd:Owners>
+            <abcd:Owner>
+              <abcd:Organisation>
+                <abcd:Name>
+                  <abcd:Representation abcd:language="GE German Deutsch">
+                    <abcd:Text>Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversit&#xE4;t Deutschlands (NetPhyD)</abcd:Text>
+                    <abcd:Abbreviation>BfN/NetPhyD</abcd:Abbreviation>
+                  </abcd:Representation>
+                </abcd:Name>
+              </abcd:Organisation>
+              <abcd:Person>
+                <abcd:FullName>Rudolf May</abcd:FullName>
+              </abcd:Person>
+              <abcd:Roles>
+                <abcd:Role>Project Manager</abcd:Role>
+              </abcd:Roles>
+              <abcd:Addresses>
+                <abcd:Address>BfN, Konstantinstr. 110, D-53179 Bonn</abcd:Address>
+              </abcd:Addresses>
+              <abcd:TelephoneNumbers>
+                <abcd:TelephoneNumber>
+                  <abcd:Number>+49-228-84911441</abcd:Number>
+                  <abcd:Device>voice</abcd:Device>
+                </abcd:TelephoneNumber>
+              </abcd:TelephoneNumbers>
+              <abcd:EmailAddresses>
+                <abcd:EmailAddress>floraweb@bfn.de</abcd:EmailAddress>
+              </abcd:EmailAddresses>
+              <abcd:URIs>
+                <abcd:URL>http://www.bfn.de</abcd:URL>
+              </abcd:URIs>
+              <abcd:LogoURI>http://www.bfn.de/fileadmin/global/templates/images/logo_bfn.gif</abcd:LogoURI>
+            </abcd:Owner>
+          </abcd:Owners>
+          <abcd:IPRStatements>
+            <abcd:IPRDeclarations>
+              <abcd:IPRDeclaration abcd:language="GE German Deutsch">
+                <abcd:Text>Mitarbeiter der Floristischen Kartierung Deutschlands</abcd:Text>
+                <abcd:Details>Alle amtlich und ehrenamtlich an der Floristischen Kartierung Deutschlands beteiligten Mitarbeiter</abcd:Details>
+              </abcd:IPRDeclaration>
+            </abcd:IPRDeclarations>
+            <abcd:Copyrights>
+              <abcd:Copyright abcd:language="GE German Deutsch">
+                <abcd:Text>BfN/NetPhyD</abcd:Text>
+                <abcd:Details>Bundesamt fuer Naturschutz und Netzwerk Phytodiversitaet Deutschlands</abcd:Details>
+              </abcd:Copyright>
+            </abcd:Copyrights>
+            <abcd:TermsOfUseStatements>
+              <abcd:TermsOfUse abcd:language="GE German Deutsch">
+                <abcd:Text>Bei Verwendung in Publikationen bitte die Datenquelle vollstaendig zitieren.</abcd:Text>
+                <abcd:Details>Bei Verwendung in Publikationen bitte die Datenquelle vollstaendig zitieren.  Die Verwendung der Daten zu kommerziellen Zwecken wird untersagt.</abcd:Details>
+              </abcd:TermsOfUse>
+            </abcd:TermsOfUseStatements>
+            <abcd:Disclaimers>
+              <abcd:Disclaimer abcd:language="GE German Deutsch">
+                <abcd:Text>Fuer die Richtigkeit der Daten wird keine Gewaehrleistung uebernommen</abcd:Text>
+                <abcd:Details>Fuer die Richtigkeit der Daten wird keine Gewaehrleistung uebernommen</abcd:Details>
+              </abcd:Disclaimer>
+            </abcd:Disclaimers>
+            <abcd:Acknowledgements>
+              <abcd:Acknowledgement abcd:language="GE German Deutsch">
+                <abcd:Text>In Anerkennung der Leistungen der ehrenamtlichen Kartierer der Flora Deutschlands</abcd:Text>
+                <abcd:Details>Die Kompilation der Verbreitungsdaten beruht auf unentgeltlich erbrachten Kartierungsleistungen von &#xFC;ber 2000 ehrenamtlichen Mitarbeitern der Floristischen Kartierung Deutschlands, die in zahlreichen regionalen Kartierungsprojekten organisiert sind.</abcd:Details>
+                <abcd:URI>http://www.floraweb.de/pflanzenarten/hintergrundtexte_florkart_organisation.html</abcd:URI>
+              </abcd:Acknowledgement>
+            </abcd:Acknowledgements>
+            <abcd:Citations>
+              <abcd:Citation abcd:language="GE German Deutsch">
+                <abcd:Text>Datenbank FLORKART, BfN und NetPhyD</abcd:Text>
+                <abcd:Details>Datenbank FLORKART der Floristischen Kartierung Deutschlands, Stand 2007, Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversitaet Deutschland (NetPhyD)</abcd:Details>
+              </abcd:Citation>
+            </abcd:Citations>
+          </abcd:IPRStatements>
+        </abcd:Metadata>
+        <abcd:Units>
+          <abcd:Unit>
+            <abcd:SourceInstitutionID>BfN</abcd:SourceInstitutionID>
+            <abcd:SourceID>FlorKart_BfN</abcd:SourceID>
+            <abcd:UnitID>1003121</abcd:UnitID>
+            <abcd:UnitReferences>
+              <abcd:UnitReference>
+                <abcd:TitleCitation>Datenbank FLORKART, BfN und NetPhyD</abcd:TitleCitation>
+                <abcd:CitationDetail>Datenbank FLORKART der Floristischen Kartierung Deutschlands, Stand 2007, Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversitaet Deutschland (NetPhyD)</abcd:CitationDetail>
+              </abcd:UnitReference>
+            </abcd:UnitReferences>
+            <abcd:Identifications>
+              <abcd:Identification>
+                <abcd:Result>
+                  <abcd:TaxonIdentified>
+                    <abcd:HigherTaxa>
+                      <abcd:HigherTaxon>
+                        <abcd:HigherTaxonName>Asteraceae</abcd:HigherTaxonName>
+                      </abcd:HigherTaxon>
+                    </abcd:HigherTaxa>
+                    <abcd:ScientificName>
+                      <abcd:FullScientificNameString>Cichorium calvum Asch.</abcd:FullScientificNameString>
+                      <abcd:NameAtomised>
+                        <abcd:Botanical>
+                          <abcd:GenusOrMonomial>Cichorium</abcd:GenusOrMonomial>
+                          <abcd:FirstEpithet>calvum</abcd:FirstEpithet>
+                          <abcd:Rank>SPE</abcd:Rank>
+                          <abcd:AuthorTeamParenthesis>Asch.</abcd:AuthorTeamParenthesis>
+                        </abcd:Botanical>
+                      </abcd:NameAtomised>
+                    </abcd:ScientificName>
+                  </abcd:TaxonIdentified>
+                </abcd:Result>
+              </abcd:Identification>
+            </abcd:Identifications>
+            <abcd:Gathering>
+              <abcd:DateTime>
+                <abcd:DateText>1950-1980</abcd:DateText>
+                <abcd:PeriodExplicit>false</abcd:PeriodExplicit>
+              </abcd:DateTime>
+              <abcd:Agents>
+                <abcd:GatheringAgentsText>Mitarbeiter der Floristischen Kartierung Deutschlands</abcd:GatheringAgentsText>
+              </abcd:Agents>
+              <abcd:LocalityText>MTB 3915: Bockhorst</abcd:LocalityText>
+              <abcd:Country>
+                <abcd:Name language="German">Deutschland</abcd:Name>
+              </abcd:Country>
+              <abcd:SiteCoordinateSets>
+                <abcd:SiteCoordinates>
+                  <abcd:CoordinatesGrid>
+                    <abcd:GridCellSystem>German TK25</abcd:GridCellSystem>
+                    <abcd:GridCellCode>3915</abcd:GridCellCode>
+                  </abcd:CoordinatesGrid>
+                  <abcd:CoordinatesLatLong>
+                    <abcd:LongitudeDecimal>8.25</abcd:LongitudeDecimal>
+                    <abcd:LatitudeDecimal>52.06</abcd:LatitudeDecimal>
+                    <abcd:AccuracyStatement>Mittelpunkte von TK25-Rasterfeldern</abcd:AccuracyStatement>
+                    <abcd:CoordinateErrorDistanceInMeters>6363</abcd:CoordinateErrorDistanceInMeters>
+                  </abcd:CoordinatesLatLong>
+                </abcd:SiteCoordinates>
+              </abcd:SiteCoordinateSets>
+            </abcd:Gathering>
+          </abcd:Unit>
+          <abcd:Unit>
+            <abcd:SourceInstitutionID>BfN</abcd:SourceInstitutionID>
+            <abcd:SourceID>FlorKart_BfN</abcd:SourceID>
+            <abcd:UnitID>1003122</abcd:UnitID>
+            <abcd:UnitReferences>
+              <abcd:UnitReference>
+                <abcd:TitleCitation>Datenbank FLORKART, BfN und NetPhyD</abcd:TitleCitation>
+                <abcd:CitationDetail>Datenbank FLORKART der Floristischen Kartierung Deutschlands, Stand 2007, Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversitaet Deutschland (NetPhyD)</abcd:CitationDetail>
+              </abcd:UnitReference>
+            </abcd:UnitReferences>
+            <abcd:Identifications>
+              <abcd:Identification>
+                <abcd:Result>
+                  <abcd:TaxonIdentified>
+                    <abcd:HigherTaxa>
+                      <abcd:HigherTaxon>
+                        <abcd:HigherTaxonName>Asteraceae</abcd:HigherTaxonName>
+                      </abcd:HigherTaxon>
+                    </abcd:HigherTaxa>
+                    <abcd:ScientificName>
+                      <abcd:FullScientificNameString>Cichorium calvum Asch.</abcd:FullScientificNameString>
+                      <abcd:NameAtomised>
+                        <abcd:Botanical>
+                          <abcd:GenusOrMonomial>Cichorium</abcd:GenusOrMonomial>
+                          <abcd:FirstEpithet>calvum</abcd:FirstEpithet>
+                          <abcd:Rank>SPE</abcd:Rank>
+                          <abcd:AuthorTeamParenthesis>Asch.</abcd:AuthorTeamParenthesis>
+                        </abcd:Botanical>
+                      </abcd:NameAtomised>
+                    </abcd:ScientificName>
+                  </abcd:TaxonIdentified>
+                </abcd:Result>
+              </abcd:Identification>
+            </abcd:Identifications>
+            <abcd:Gathering>
+              <abcd:DateTime>
+                <abcd:DateText>1950-1980</abcd:DateText>
+                <abcd:PeriodExplicit>false</abcd:PeriodExplicit>
+              </abcd:DateTime>
+              <abcd:Agents>
+                <abcd:GatheringAgentsText>Mitarbeiter der Floristischen Kartierung Deutschlands</abcd:GatheringAgentsText>
+              </abcd:Agents>
+              <abcd:LocalityText>MTB 3916: Halle  (Westfalen)</abcd:LocalityText>
+              <abcd:Country>
+                <abcd:Name language="German">Deutschland</abcd:Name>
+              </abcd:Country>
+              <abcd:SiteCoordinateSets>
+                <abcd:SiteCoordinates>
+                  <abcd:CoordinatesGrid>
+                    <abcd:GridCellSystem>German TK25</abcd:GridCellSystem>
+                    <abcd:GridCellCode>3916</abcd:GridCellCode>
+                  </abcd:CoordinatesGrid>
+                  <abcd:CoordinatesLatLong>
+                    <abcd:LongitudeDecimal>8.42</abcd:LongitudeDecimal>
+                    <abcd:LatitudeDecimal>52.06</abcd:LatitudeDecimal>
+                    <abcd:AccuracyStatement>Mittelpunkte von TK25-Rasterfeldern</abcd:AccuracyStatement>
+                    <abcd:CoordinateErrorDistanceInMeters>6363</abcd:CoordinateErrorDistanceInMeters>
+                  </abcd:CoordinatesLatLong>
+                </abcd:SiteCoordinates>
+              </abcd:SiteCoordinateSets>
+            </abcd:Gathering>
+          </abcd:Unit>
+          <abcd:Unit>
+            <abcd:SourceInstitutionID>BfN</abcd:SourceInstitutionID>
+            <abcd:SourceID>FlorKart_BfN</abcd:SourceID>
+            <abcd:UnitID>1003123</abcd:UnitID>
+            <abcd:UnitReferences>
+              <abcd:UnitReference>
+                <abcd:TitleCitation>Datenbank FLORKART, BfN und NetPhyD</abcd:TitleCitation>
+                <abcd:CitationDetail>Datenbank FLORKART der Floristischen Kartierung Deutschlands, Stand 2007, Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversitaet Deutschland (NetPhyD)</abcd:CitationDetail>
+              </abcd:UnitReference>
+            </abcd:UnitReferences>
+            <abcd:Identifications>
+              <abcd:Identification>
+                <abcd:Result>
+                  <abcd:TaxonIdentified>
+                    <abcd:HigherTaxa>
+                      <abcd:HigherTaxon>
+                        <abcd:HigherTaxonName>Asteraceae</abcd:HigherTaxonName>
+                      </abcd:HigherTaxon>
+                    </abcd:HigherTaxa>
+                    <abcd:ScientificName>
+                      <abcd:FullScientificNameString>Cichorium calvum Asch.</abcd:FullScientificNameString>
+                      <abcd:NameAtomised>
+                        <abcd:Botanical>
+                          <abcd:GenusOrMonomial>Cichorium</abcd:GenusOrMonomial>
+                          <abcd:FirstEpithet>calvum</abcd:FirstEpithet>
+                          <abcd:Rank>SPE</abcd:Rank>
+                          <abcd:AuthorTeamParenthesis>Asch.</abcd:AuthorTeamParenthesis>
+                        </abcd:Botanical>
+                      </abcd:NameAtomised>
+                    </abcd:ScientificName>
+                  </abcd:TaxonIdentified>
+                </abcd:Result>
+              </abcd:Identification>
+            </abcd:Identifications>
+            <abcd:Gathering>
+              <abcd:DateTime>
+                <abcd:DateText>1950-1980</abcd:DateText>
+                <abcd:PeriodExplicit>false</abcd:PeriodExplicit>
+              </abcd:DateTime>
+              <abcd:Agents>
+                <abcd:GatheringAgentsText>Mitarbeiter der Floristischen Kartierung Deutschlands</abcd:GatheringAgentsText>
+              </abcd:Agents>
+              <abcd:LocalityText>MTB 5628: Bad K&#xF6;nigshofen im Grabfeld</abcd:LocalityText>
+              <abcd:Country>
+                <abcd:Name language="German">Deutschland</abcd:Name>
+              </abcd:Country>
+              <abcd:SiteCoordinateSets>
+                <abcd:SiteCoordinates>
+                  <abcd:CoordinatesGrid>
+                    <abcd:GridCellSystem>German TK25</abcd:GridCellSystem>
+                    <abcd:GridCellCode>5628</abcd:GridCellCode>
+                  </abcd:CoordinatesGrid>
+                  <abcd:CoordinatesLatLong>
+                    <abcd:LongitudeDecimal>10.42</abcd:LongitudeDecimal>
+                    <abcd:LatitudeDecimal>50.36</abcd:LatitudeDecimal>
+                    <abcd:AccuracyStatement>Mittelpunkte von TK25-Rasterfeldern</abcd:AccuracyStatement>
+                    <abcd:CoordinateErrorDistanceInMeters>6481</abcd:CoordinateErrorDistanceInMeters>
+                  </abcd:CoordinatesLatLong>
+                </abcd:SiteCoordinates>
+              </abcd:SiteCoordinateSets>
+            </abcd:Gathering>
+          </abcd:Unit>
+          <abcd:Unit>
+            <abcd:SourceInstitutionID>BfN</abcd:SourceInstitutionID>
+            <abcd:SourceID>FlorKart_BfN</abcd:SourceID>
+            <abcd:UnitID>1003124</abcd:UnitID>
+            <abcd:UnitReferences>
+              <abcd:UnitReference>
+                <abcd:TitleCitation>Datenbank FLORKART, BfN und NetPhyD</abcd:TitleCitation>
+                <abcd:CitationDetail>Datenbank FLORKART der Floristischen Kartierung Deutschlands, Stand 2007, Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversitaet Deutschland (NetPhyD)</abcd:CitationDetail>
+              </abcd:UnitReference>
+            </abcd:UnitReferences>
+            <abcd:Identifications>
+              <abcd:Identification>
+                <abcd:Result>
+                  <abcd:TaxonIdentified>
+                    <abcd:HigherTaxa>
+                      <abcd:HigherTaxon>
+                        <abcd:HigherTaxonName>Asteraceae</abcd:HigherTaxonName>
+                      </abcd:HigherTaxon>
+                    </abcd:HigherTaxa>
+                    <abcd:ScientificName>
+                      <abcd:FullScientificNameString>Cichorium calvum Asch.</abcd:FullScientificNameString>
+                      <abcd:NameAtomised>
+                        <abcd:Botanical>
+                          <abcd:GenusOrMonomial>Cichorium</abcd:GenusOrMonomial>
+                          <abcd:FirstEpithet>calvum</abcd:FirstEpithet>
+                          <abcd:Rank>SPE</abcd:Rank>
+                          <abcd:AuthorTeamParenthesis>Asch.</abcd:AuthorTeamParenthesis>
+                        </abcd:Botanical>
+                      </abcd:NameAtomised>
+                    </abcd:ScientificName>
+                  </abcd:TaxonIdentified>
+                </abcd:Result>
+              </abcd:Identification>
+            </abcd:Identifications>
+            <abcd:Gathering>
+              <abcd:DateTime>
+                <abcd:DateText>1950-1980</abcd:DateText>
+                <abcd:PeriodExplicit>false</abcd:PeriodExplicit>
+              </abcd:DateTime>
+              <abcd:Agents>
+                <abcd:GatheringAgentsText>Mitarbeiter der Floristischen Kartierung Deutschlands</abcd:GatheringAgentsText>
+              </abcd:Agents>
+              <abcd:LocalityText>MTB 5634: Teuschnitz</abcd:LocalityText>
+              <abcd:Country>
+                <abcd:Name language="German">Deutschland</abcd:Name>
+              </abcd:Country>
+              <abcd:SiteCoordinateSets>
+                <abcd:SiteCoordinates>
+                  <abcd:CoordinatesGrid>
+                    <abcd:GridCellSystem>German TK25</abcd:GridCellSystem>
+                    <abcd:GridCellCode>5634</abcd:GridCellCode>
+                  </abcd:CoordinatesGrid>
+                  <abcd:CoordinatesLatLong>
+                    <abcd:LongitudeDecimal>11.42</abcd:LongitudeDecimal>
+                    <abcd:LatitudeDecimal>50.36</abcd:LatitudeDecimal>
+                    <abcd:AccuracyStatement>Mittelpunkte von TK25-Rasterfeldern</abcd:AccuracyStatement>
+                    <abcd:CoordinateErrorDistanceInMeters>6482</abcd:CoordinateErrorDistanceInMeters>
+                  </abcd:CoordinatesLatLong>
+                </abcd:SiteCoordinates>
+              </abcd:SiteCoordinateSets>
+            </abcd:Gathering>
+          </abcd:Unit>
+          <abcd:Unit>
+            <abcd:SourceInstitutionID>BfN</abcd:SourceInstitutionID>
+            <abcd:SourceID>FlorKart_BfN</abcd:SourceID>
+            <abcd:UnitID>1003125</abcd:UnitID>
+            <abcd:UnitReferences>
+              <abcd:UnitReference>
+                <abcd:TitleCitation>Datenbank FLORKART, BfN und NetPhyD</abcd:TitleCitation>
+                <abcd:CitationDetail>Datenbank FLORKART der Floristischen Kartierung Deutschlands, Stand 2007, Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversitaet Deutschland (NetPhyD)</abcd:CitationDetail>
+              </abcd:UnitReference>
+            </abcd:UnitReferences>
+            <abcd:Identifications>
+              <abcd:Identification>
+                <abcd:Result>
+                  <abcd:TaxonIdentified>
+                    <abcd:HigherTaxa>
+                      <abcd:HigherTaxon>
+                        <abcd:HigherTaxonName>Asteraceae</abcd:HigherTaxonName>
+                      </abcd:HigherTaxon>
+                    </abcd:HigherTaxa>
+                    <abcd:ScientificName>
+                      <abcd:FullScientificNameString>Cichorium calvum Asch.</abcd:FullScientificNameString>
+                      <abcd:NameAtomised>
+                        <abcd:Botanical>
+                          <abcd:GenusOrMonomial>Cichorium</abcd:GenusOrMonomial>
+                          <abcd:FirstEpithet>calvum</abcd:FirstEpithet>
+                          <abcd:Rank>SPE</abcd:Rank>
+                          <abcd:AuthorTeamParenthesis>Asch.</abcd:AuthorTeamParenthesis>
+                        </abcd:Botanical>
+                      </abcd:NameAtomised>
+                    </abcd:ScientificName>
+                  </abcd:TaxonIdentified>
+                </abcd:Result>
+              </abcd:Identification>
+            </abcd:Identifications>
+            <abcd:Gathering>
+              <abcd:DateTime>
+                <abcd:DateText>1950-1980</abcd:DateText>
+                <abcd:PeriodExplicit>false</abcd:PeriodExplicit>
+              </abcd:DateTime>
+              <abcd:Agents>
+                <abcd:GatheringAgentsText>Mitarbeiter der Floristischen Kartierung Deutschlands</abcd:GatheringAgentsText>
+              </abcd:Agents>
+              <abcd:LocalityText>MTB 5635: Nordhalben</abcd:LocalityText>
+              <abcd:Country>
+                <abcd:Name language="German">Deutschland</abcd:Name>
+              </abcd:Country>
+              <abcd:SiteCoordinateSets>
+                <abcd:SiteCoordinates>
+                  <abcd:CoordinatesGrid>
+                    <abcd:GridCellSystem>German TK25</abcd:GridCellSystem>
+                    <abcd:GridCellCode>5635</abcd:GridCellCode>
+                  </abcd:CoordinatesGrid>
+                  <abcd:CoordinatesLatLong>
+                    <abcd:LongitudeDecimal>11.58</abcd:LongitudeDecimal>
+                    <abcd:LatitudeDecimal>50.36</abcd:LatitudeDecimal>
+                    <abcd:AccuracyStatement>Mittelpunkte von TK25-Rasterfeldern</abcd:AccuracyStatement>
+                    <abcd:CoordinateErrorDistanceInMeters>6483</abcd:CoordinateErrorDistanceInMeters>
+                  </abcd:CoordinatesLatLong>
+                </abcd:SiteCoordinates>
+              </abcd:SiteCoordinateSets>
+            </abcd:Gathering>
+          </abcd:Unit>
+          <abcd:Unit>
+            <abcd:SourceInstitutionID>BfN</abcd:SourceInstitutionID>
+            <abcd:SourceID>FlorKart_BfN</abcd:SourceID>
+            <abcd:UnitID>1003126</abcd:UnitID>
+            <abcd:UnitReferences>
+              <abcd:UnitReference>
+                <abcd:TitleCitation>Datenbank FLORKART, BfN und NetPhyD</abcd:TitleCitation>
+                <abcd:CitationDetail>Datenbank FLORKART der Floristischen Kartierung Deutschlands, Stand 2007, Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversitaet Deutschland (NetPhyD)</abcd:CitationDetail>
+              </abcd:UnitReference>
+            </abcd:UnitReferences>
+            <abcd:Identifications>
+              <abcd:Identification>
+                <abcd:Result>
+                  <abcd:TaxonIdentified>
+                    <abcd:HigherTaxa>
+                      <abcd:HigherTaxon>
+                        <abcd:HigherTaxonName>Asteraceae</abcd:HigherTaxonName>
+                      </abcd:HigherTaxon>
+                    </abcd:HigherTaxa>
+                    <abcd:ScientificName>
+                      <abcd:FullScientificNameString>Cichorium calvum Asch.</abcd:FullScientificNameString>
+                      <abcd:NameAtomised>
+                        <abcd:Botanical>
+                          <abcd:GenusOrMonomial>Cichorium</abcd:GenusOrMonomial>
+                          <abcd:FirstEpithet>calvum</abcd:FirstEpithet>
+                          <abcd:Rank>SPE</abcd:Rank>
+                          <abcd:AuthorTeamParenthesis>Asch.</abcd:AuthorTeamParenthesis>
+                        </abcd:Botanical>
+                      </abcd:NameAtomised>
+                    </abcd:ScientificName>
+                  </abcd:TaxonIdentified>
+                </abcd:Result>
+              </abcd:Identification>
+            </abcd:Identifications>
+            <abcd:Gathering>
+              <abcd:DateTime>
+                <abcd:DateText>1950-1980</abcd:DateText>
+                <abcd:PeriodExplicit>false</abcd:PeriodExplicit>
+              </abcd:DateTime>
+              <abcd:Agents>
+                <abcd:GatheringAgentsText>Mitarbeiter der Floristischen Kartierung Deutschlands</abcd:GatheringAgentsText>
+              </abcd:Agents>
+              <abcd:LocalityText>MTB 5728: Oberlauringen</abcd:LocalityText>
+              <abcd:Country>
+                <abcd:Name language="German">Deutschland</abcd:Name>
+              </abcd:Country>
+              <abcd:SiteCoordinateSets>
+                <abcd:SiteCoordinates>
+                  <abcd:CoordinatesGrid>
+                    <abcd:GridCellSystem>German TK25</abcd:GridCellSystem>
+                    <abcd:GridCellCode>5728</abcd:GridCellCode>
+                  </abcd:CoordinatesGrid>
+                  <abcd:CoordinatesLatLong>
+                    <abcd:LongitudeDecimal>10.42</abcd:LongitudeDecimal>
+                    <abcd:LatitudeDecimal>50.26</abcd:LatitudeDecimal>
+                    <abcd:AccuracyStatement>Mittelpunkte von TK25-Rasterfeldern</abcd:AccuracyStatement>
+                    <abcd:CoordinateErrorDistanceInMeters>6487</abcd:CoordinateErrorDistanceInMeters>
+                  </abcd:CoordinatesLatLong>
+                </abcd:SiteCoordinates>
+              </abcd:SiteCoordinateSets>
+            </abcd:Gathering>
+          </abcd:Unit>
+          <abcd:Unit>
+            <abcd:SourceInstitutionID>BfN</abcd:SourceInstitutionID>
+            <abcd:SourceID>FlorKart_BfN</abcd:SourceID>
+            <abcd:UnitID>1003127</abcd:UnitID>
+            <abcd:UnitReferences>
+              <abcd:UnitReference>
+                <abcd:TitleCitation>Datenbank FLORKART, BfN und NetPhyD</abcd:TitleCitation>
+                <abcd:CitationDetail>Datenbank FLORKART der Floristischen Kartierung Deutschlands, Stand 2007, Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversitaet Deutschland (NetPhyD)</abcd:CitationDetail>
+              </abcd:UnitReference>
+            </abcd:UnitReferences>
+            <abcd:Identifications>
+              <abcd:Identification>
+                <abcd:Result>
+                  <abcd:TaxonIdentified>
+                    <abcd:HigherTaxa>
+                      <abcd:HigherTaxon>
+                        <abcd:HigherTaxonName>Asteraceae</abcd:HigherTaxonName>
+                      </abcd:HigherTaxon>
+                    </abcd:HigherTaxa>
+                    <abcd:ScientificName>
+                      <abcd:FullScientificNameString>Cichorium calvum Asch.</abcd:FullScientificNameString>
+                      <abcd:NameAtomised>
+                        <abcd:Botanical>
+                          <abcd:GenusOrMonomial>Cichorium</abcd:GenusOrMonomial>
+                          <abcd:FirstEpithet>calvum</abcd:FirstEpithet>
+                          <abcd:Rank>SPE</abcd:Rank>
+                          <abcd:AuthorTeamParenthesis>Asch.</abcd:AuthorTeamParenthesis>
+                        </abcd:Botanical>
+                      </abcd:NameAtomised>
+                    </abcd:ScientificName>
+                  </abcd:TaxonIdentified>
+                </abcd:Result>
+              </abcd:Identification>
+            </abcd:Identifications>
+            <abcd:Gathering>
+              <abcd:DateTime>
+                <abcd:DateText>1950-1980</abcd:DateText>
+                <abcd:PeriodExplicit>false</abcd:PeriodExplicit>
+              </abcd:DateTime>
+              <abcd:Agents>
+                <abcd:GatheringAgentsText>Mitarbeiter der Floristischen Kartierung Deutschlands</abcd:GatheringAgentsText>
+              </abcd:Agents>
+              <abcd:LocalityText>MTB 6132: Buttenheim</abcd:LocalityText>
+              <abcd:Country>
+                <abcd:Name language="German">Deutschland</abcd:Name>
+              </abcd:Country>
+              <abcd:SiteCoordinateSets>
+                <abcd:SiteCoordinates>
+                  <abcd:CoordinatesGrid>
+                    <abcd:GridCellSystem>German TK25</abcd:GridCellSystem>
+                    <abcd:GridCellCode>6132</abcd:GridCellCode>
+                  </abcd:CoordinatesGrid>
+                  <abcd:CoordinatesLatLong>
+                    <abcd:LongitudeDecimal>11.08</abcd:LongitudeDecimal>
+                    <abcd:LatitudeDecimal>49.86</abcd:LatitudeDecimal>
+                    <abcd:AccuracyStatement>Mittelpunkte von TK25-Rasterfeldern</abcd:AccuracyStatement>
+                    <abcd:CoordinateErrorDistanceInMeters>6515</abcd:CoordinateErrorDistanceInMeters>
+                  </abcd:CoordinatesLatLong>
+                </abcd:SiteCoordinates>
+              </abcd:SiteCoordinateSets>
+            </abcd:Gathering>
+          </abcd:Unit>
+          <abcd:Unit>
+            <abcd:SourceInstitutionID>BfN</abcd:SourceInstitutionID>
+            <abcd:SourceID>FlorKart_BfN</abcd:SourceID>
+            <abcd:UnitID>1003128</abcd:UnitID>
+            <abcd:UnitReferences>
+              <abcd:UnitReference>
+                <abcd:TitleCitation>Datenbank FLORKART, BfN und NetPhyD</abcd:TitleCitation>
+                <abcd:CitationDetail>Datenbank FLORKART der Floristischen Kartierung Deutschlands, Stand 2007, Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversitaet Deutschland (NetPhyD)</abcd:CitationDetail>
+              </abcd:UnitReference>
+            </abcd:UnitReferences>
+            <abcd:Identifications>
+              <abcd:Identification>
+                <abcd:Result>
+                  <abcd:TaxonIdentified>
+                    <abcd:HigherTaxa>
+                      <abcd:HigherTaxon>
+                        <abcd:HigherTaxonName>Asteraceae</abcd:HigherTaxonName>
+                      </abcd:HigherTaxon>
+                    </abcd:HigherTaxa>
+                    <abcd:ScientificName>
+                      <abcd:FullScientificNameString>Cichorium calvum Asch.</abcd:FullScientificNameString>
+                      <abcd:NameAtomised>
+                        <abcd:Botanical>
+                          <abcd:GenusOrMonomial>Cichorium</abcd:GenusOrMonomial>
+                          <abcd:FirstEpithet>calvum</abcd:FirstEpithet>
+                          <abcd:Rank>SPE</abcd:Rank>
+                          <abcd:AuthorTeamParenthesis>Asch.</abcd:AuthorTeamParenthesis>
+                        </abcd:Botanical>
+                      </abcd:NameAtomised>
+                    </abcd:ScientificName>
+                  </abcd:TaxonIdentified>
+                </abcd:Result>
+              </abcd:Identification>
+            </abcd:Identifications>
+            <abcd:Gathering>
+              <abcd:DateTime>
+                <abcd:DateText>1950-1980</abcd:DateText>
+                <abcd:PeriodExplicit>false</abcd:PeriodExplicit>
+              </abcd:DateTime>
+              <abcd:Agents>
+                <abcd:GatheringAgentsText>Mitarbeiter der Floristischen Kartierung Deutschlands</abcd:GatheringAgentsText>
+              </abcd:Agents>
+              <abcd:LocalityText>MTB 6232: Forchheim</abcd:LocalityText>
+              <abcd:Country>
+                <abcd:Name language="German">Deutschland</abcd:Name>
+              </abcd:Country>
+              <abcd:SiteCoordinateSets>
+                <abcd:SiteCoordinates>
+                  <abcd:CoordinatesGrid>
+                    <abcd:GridCellSystem>German TK25</abcd:GridCellSystem>
+                    <abcd:GridCellCode>6232</abcd:GridCellCode>
+                  </abcd:CoordinatesGrid>
+                  <abcd:CoordinatesLatLong>
+                    <abcd:LongitudeDecimal>11.08</abcd:LongitudeDecimal>
+                    <abcd:LatitudeDecimal>49.76</abcd:LatitudeDecimal>
+                    <abcd:AccuracyStatement>Mittelpunkte von TK25-Rasterfeldern</abcd:AccuracyStatement>
+                    <abcd:CoordinateErrorDistanceInMeters>6522</abcd:CoordinateErrorDistanceInMeters>
+                  </abcd:CoordinatesLatLong>
+                </abcd:SiteCoordinates>
+              </abcd:SiteCoordinateSets>
+            </abcd:Gathering>
+          </abcd:Unit>
+          <abcd:Unit>
+            <abcd:SourceInstitutionID>BfN</abcd:SourceInstitutionID>
+            <abcd:SourceID>FlorKart_BfN</abcd:SourceID>
+            <abcd:UnitID>1003129</abcd:UnitID>
+            <abcd:UnitReferences>
+              <abcd:UnitReference>
+                <abcd:TitleCitation>Datenbank FLORKART, BfN und NetPhyD</abcd:TitleCitation>
+                <abcd:CitationDetail>Datenbank FLORKART der Floristischen Kartierung Deutschlands, Stand 2007, Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversitaet Deutschland (NetPhyD)</abcd:CitationDetail>
+              </abcd:UnitReference>
+            </abcd:UnitReferences>
+            <abcd:Identifications>
+              <abcd:Identification>
+                <abcd:Result>
+                  <abcd:TaxonIdentified>
+                    <abcd:HigherTaxa>
+                      <abcd:HigherTaxon>
+                        <abcd:HigherTaxonName>Asteraceae</abcd:HigherTaxonName>
+                      </abcd:HigherTaxon>
+                    </abcd:HigherTaxa>
+                    <abcd:ScientificName>
+                      <abcd:FullScientificNameString>Cichorium calvum Asch.</abcd:FullScientificNameString>
+                      <abcd:NameAtomised>
+                        <abcd:Botanical>
+                          <abcd:GenusOrMonomial>Cichorium</abcd:GenusOrMonomial>
+                          <abcd:FirstEpithet>calvum</abcd:FirstEpithet>
+                          <abcd:Rank>SPE</abcd:Rank>
+                          <abcd:AuthorTeamParenthesis>Asch.</abcd:AuthorTeamParenthesis>
+                        </abcd:Botanical>
+                      </abcd:NameAtomised>
+                    </abcd:ScientificName>
+                  </abcd:TaxonIdentified>
+                </abcd:Result>
+              </abcd:Identification>
+            </abcd:Identifications>
+            <abcd:Gathering>
+              <abcd:DateTime>
+                <abcd:DateText>1950-1980</abcd:DateText>
+                <abcd:PeriodExplicit>false</abcd:PeriodExplicit>
+              </abcd:DateTime>
+              <abcd:Agents>
+                <abcd:GatheringAgentsText>Mitarbeiter der Floristischen Kartierung Deutschlands</abcd:GatheringAgentsText>
+              </abcd:Agents>
+              <abcd:LocalityText>MTB 6235: Pegnitz</abcd:LocalityText>
+              <abcd:Country>
+                <abcd:Name language="German">Deutschland</abcd:Name>
+              </abcd:Country>
+              <abcd:SiteCoordinateSets>
+                <abcd:SiteCoordinates>
+                  <abcd:CoordinatesGrid>
+                    <abcd:GridCellSystem>German TK25</abcd:GridCellSystem>
+                    <abcd:GridCellCode>6235</abcd:GridCellCode>
+                  </abcd:CoordinatesGrid>
+                  <abcd:CoordinatesLatLong>
+                    <abcd:LongitudeDecimal>11.58</abcd:LongitudeDecimal>
+                    <abcd:LatitudeDecimal>49.76</abcd:LatitudeDecimal>
+                    <abcd:AccuracyStatement>Mittelpunkte von TK25-Rasterfeldern</abcd:AccuracyStatement>
+                    <abcd:CoordinateErrorDistanceInMeters>6523</abcd:CoordinateErrorDistanceInMeters>
+                  </abcd:CoordinatesLatLong>
+                </abcd:SiteCoordinates>
+              </abcd:SiteCoordinateSets>
+            </abcd:Gathering>
+          </abcd:Unit>
+          <abcd:Unit>
+            <abcd:SourceInstitutionID>BfN</abcd:SourceInstitutionID>
+            <abcd:SourceID>FlorKart_BfN</abcd:SourceID>
+            <abcd:UnitID>1003130</abcd:UnitID>
+            <abcd:UnitReferences>
+              <abcd:UnitReference>
+                <abcd:TitleCitation>Datenbank FLORKART, BfN und NetPhyD</abcd:TitleCitation>
+                <abcd:CitationDetail>Datenbank FLORKART der Floristischen Kartierung Deutschlands, Stand 2007, Bundesamt f&#xFC;r Naturschutz (BfN) und Netzwerk Phytodiversitaet Deutschland (NetPhyD)</abcd:CitationDetail>
+              </abcd:UnitReference>
+            </abcd:UnitReferences>
+            <abcd:Identifications>
+              <abcd:Identification>
+                <abcd:Result>
+                  <abcd:TaxonIdentified>
+                    <abcd:HigherTaxa>
+                      <abcd:HigherTaxon>
+                        <abcd:HigherTaxonName>Asteraceae</abcd:HigherTaxonName>
+                      </abcd:HigherTaxon>
+                    </abcd:HigherTaxa>
+                    <abcd:ScientificName>
+                      <abcd:FullScientificNameString>Cichorium calvum Asch.</abcd:FullScientificNameString>
+                      <abcd:NameAtomised>
+                        <abcd:Botanical>
+                          <abcd:GenusOrMonomial>Cichorium</abcd:GenusOrMonomial>
+                          <abcd:FirstEpithet>calvum</abcd:FirstEpithet>
+                          <abcd:Rank>SPE</abcd:Rank>
+                          <abcd:AuthorTeamParenthesis>Asch.</abcd:AuthorTeamParenthesis>
+                        </abcd:Botanical>
+                      </abcd:NameAtomised>
+                    </abcd:ScientificName>
+                  </abcd:TaxonIdentified>
+                </abcd:Result>
+              </abcd:Identification>
+            </abcd:Identifications>
+            <abcd:Gathering>
+              <abcd:DateTime>
+                <abcd:DateText>1950-1980</abcd:DateText>
+                <abcd:PeriodExplicit>false</abcd:PeriodExplicit>
+              </abcd:DateTime>
+              <abcd:Agents>
+                <abcd:GatheringAgentsText>Mitarbeiter der Floristischen Kartierung Deutschlands</abcd:GatheringAgentsText>
+              </abcd:Agents>
+              <abcd:LocalityText>MTB 7032: Bieswang</abcd:LocalityText>
+              <abcd:Country>
+                <abcd:Name language="German">Deutschland</abcd:Name>
+              </abcd:Country>
+              <abcd:SiteCoordinateSets>
+                <abcd:SiteCoordinates>
+                  <abcd:CoordinatesGrid>
+                    <abcd:GridCellSystem>German TK25</abcd:GridCellSystem>
+                    <abcd:GridCellCode>7032</abcd:GridCellCode>
+                  </abcd:CoordinatesGrid>
+                  <abcd:CoordinatesLatLong>
+                    <abcd:LongitudeDecimal>11.08</abcd:LongitudeDecimal>
+                    <abcd:LatitudeDecimal>48.96</abcd:LatitudeDecimal>
+                    <abcd:AccuracyStatement>Mittelpunkte von TK25-Rasterfeldern</abcd:AccuracyStatement>
+                    <abcd:CoordinateErrorDistanceInMeters>6575</abcd:CoordinateErrorDistanceInMeters>
+                  </abcd:CoordinatesLatLong>
+                </abcd:SiteCoordinates>
+              </abcd:SiteCoordinateSets>
+            </abcd:Gathering>
+          </abcd:Unit>
+        </abcd:Units>
+      </abcd:DataSet>
+    </abcd:DataSets>
diff --git a/eu.etaxonomy.taxeditor.test/src/test/resources/imports/NormalExplicitImport.xls b/eu.etaxonomy.taxeditor.test/src/test/resources/imports/NormalExplicitImport.xls
new file mode 100644 (file)
index 0000000..1c69278
Binary files /dev/null and b/eu.etaxonomy.taxeditor.test/src/test/resources/imports/NormalExplicitImport.xls differ
diff --git a/eu.etaxonomy.taxeditor.test/src/test/resources/imports/SDD.xml b/eu.etaxonomy.taxeditor.test/src/test/resources/imports/SDD.xml
new file mode 100644 (file)
index 0000000..4154c28
--- /dev/null
@@ -0,0 +1,981 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Datasets xmlns="http://rs.tdwg.org/UBIF/2006/"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://rs.tdwg.org/UBIF/2006/ http://rs.tdwg.org/UBIF/2006/Schema/1.1/SDD.xsd">
+    <TechnicalMetadata created="1970-01-01T09:34:00">
+        <Generator name="Xper2"
+            notes="This software is developed and distributed by LIS - Laboratoire Informatique et SystÈmatique (LIS) - UniversitÈ Pierre et Marie Curie - Paris VI - Copyright (c) 2004-2009" version="1.1"/>
+    </TechnicalMetadata>
+    <Dataset xml:lang="fr">
+        <Representation>
+            <Label>ant base</Label>
+        </Representation>
+        <RevisionData>
+            <Creators>
+                <Agent ref="a0" role="aut"/>
+            </Creators>
+            <DateCreated>2012-06-06T09:34:58</DateCreated>
+            <DateModified>2012-06-06T09:34:58</DateModified>
+        </RevisionData>
+        <TaxonNames>
+            <TaxonName id="t1">
+                <Representation>
+                    <Label>Dolichoderinae</Label>
+                </Representation>
+            </TaxonName>
+            <TaxonName id="t2">
+                <Representation>
+                    <Label>Formicinae</Label>
+                </Representation>
+            </TaxonName>
+            <TaxonName id="t3">
+                <Representation>
+                    <Label>Ponerinae</Label>
+                </Representation>
+            </TaxonName>
+            <TaxonName id="t4">
+                <Representation>
+                    <Label>Myrmicinae</Label>
+                </Representation>
+            </TaxonName>
+            <TaxonName id="t5">
+                <Representation>
+                    <Label>Pseudomyrmecinae</Label>
+                </Representation>
+            </TaxonName>
+            <TaxonName id="t6">
+                <Representation>
+                    <Label>Ecitoninae</Label>
+                </Representation>
+            </TaxonName>
+            <TaxonName id="t7">
+                <Representation>
+                    <Label>Ectatomminae</Label>
+                </Representation>
+            </TaxonName>
+            <TaxonName id="t8">
+                <Representation>
+                    <Label>Cerapachyinae</Label>
+                </Representation>
+            </TaxonName>
+            <TaxonName id="t9">
+                <Representation>
+                    <Label>Genus Ectatom</Label>
+                </Representation>
+            </TaxonName>
+        </TaxonNames>
+        <TaxonHierarchies>
+            <TaxonHierarchy id="th1">
+                <Representation>
+                    <Label>Default Entity Tree</Label>
+                </Representation>
+                <TaxonHierarchyType>UnspecifiedTaxonomy</TaxonHierarchyType>
+                <Nodes>
+                    <Node id="tn1">
+                        <TaxonName ref="t1"/>
+                    </Node>
+                    <Node id="tn2">
+                        <TaxonName ref="t2"/>
+                    </Node>
+                    <Node id="tn3">
+                        <Parent ref="tn2"/>
+                        <TaxonName ref="t3"/>
+                    </Node>
+                    <Node id="tn4">
+                        <TaxonName ref="t4"/>
+                    </Node>
+                    <Node id="tn5">
+                        <Parent ref="tn4"/>
+                        <TaxonName ref="t5"/>
+                    </Node>
+                    <Node id="tn6">
+                        <TaxonName ref="t6"/>
+                    </Node>
+                    <Node id="tn7">
+                        <Parent ref="tn6"/>
+                        <TaxonName ref="t8"/>
+                    </Node>
+                </Nodes>
+            </TaxonHierarchy>
+        </TaxonHierarchies>
+        <Characters>
+            <CategoricalCharacter id="c1">
+                <Representation>
+                    <Label>Pétiole</Label>
+                    <Detail>Le &lt;b&gt;pétiole&lt;/b&gt; se situe entre le mésosoma et l'alitrunk.</Detail>
+                    <MediaObject ref="m35"/>
+                    <MediaObject ref="m36"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s1">
+                        <Representation>
+                            <Label>un seul article réduit ou isolé</Label>
+                            <MediaObject ref="m37"/>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s2">
+                        <Representation>
+                            <Label>deux articles réduits ou isolés</Label>
+                            <Detail>Les deux articles correspondent au&lt;b&gt;pétiole&lt;/b&gt; et au &lt;b&gt;post-pétiole&lt;/b&gt;.&lt;br&gt;Soit les deux segments sont plus ou moins réduits, soit le deuxième article est plus large que le premier, soit le postpétiole est largement plus réduit.</Detail>
+                            <MediaObject ref="m38"/>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c2">
+                <Representation>
+                    <Label>Aiguillon venimeux</Label>
+                    <Detail>Quand il est vestigial et non fonctionnel, on le considère comme absent.</Detail>
+                    <MediaObject ref="m39"/>
+                    <MediaObject ref="m40"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s3">
+                        <Representation>
+                            <Label>absent</Label>
+                            <Detail>Apex du gastre &lt;b&gt;sans aiguillon&lt;/b&gt;.</Detail>
+                            <MediaObject ref="m41"/>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s4">
+                        <Representation>
+                            <Label>présent</Label>
+                            <Detail>C'est l'&lt;b&gt;apex du gastre&lt;/b&gt; qui porte l'aiguillon.&lt;br&gt;Il est considéré comme présent uniquement s'il &lt;b&gt;est fonctionnel&lt;/b&gt;. Certains aiguillons sont dévaginables, d'autres sont visibles de façon permanente.</Detail>
+                            <MediaObject ref="m42"/>
+                            <MediaObject ref="m43"/>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c3">
+                <Representation>
+                    <Label>Acidopore</Label>
+                    <Detail>L'&lt;b&gt;acidopore&lt;/b&gt; est l'ouverture Ã  la base du gastre par laquelle le venin est Ã©jecté ou vaporisé</Detail>
+                    <MediaObject ref="m44"/>
+                    <MediaObject ref="m45"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s5">
+                        <Representation>
+                            <Label>circulaire et entouré de soies</Label>
+                            <Detail>Quand cette structure est présente, le venin est projeté sous forme de spray. L'&lt;b&gt;acidopore circulaire&lt;/b&gt; est parfois visible Ã  l'oeil nu chez les fourmis de grande taille.</Detail>
+                            <MediaObject ref="m46"/>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s6">
+                        <Representation>
+                            <Label>sous forme de fente</Label>
+                            <Detail>Contrairement Ã  l'acidopore circulaire, la &lt;b&gt;fente&lt;/b&gt; est rarement visible Ã  l'oeil nu.</Detail>
+                            <MediaObject ref="m47"/>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s7">
+                        <Representation>
+                            <Label>absent ou quasi invisible</Label>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c4">
+                <Representation>
+                    <Label>Pygidium</Label>
+                    <Detail>Le &lt;b&gt;pygidium&lt;/b&gt; correspond au tergite Ã  l'apex du gastre.</Detail>
+                    <MediaObject ref="m48"/>
+                    <MediaObject ref="m49"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s8">
+                        <Representation>
+                            <Label>non armé</Label>
+                            <Detail>&lt;b&gt;Pygidium lisse non armé&lt;/b&gt; latéralement ou postérieurement.</Detail>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s9">
+                        <Representation>
+                            <Label>armé</Label>
+                            <Detail>&lt;b&gt;Pygidium armé &lt;/b&gt; latéralement, postérieurement ou les deux par une rangée de courtes Ã©pines ou dents.</Detail>
+                            <MediaObject ref="m50"/>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c5">
+                <Representation>
+                    <Label>Marge clypéale</Label>
+                    <MediaObject ref="m51"/>
+                    <MediaObject ref="m52"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s10">
+                        <Representation>
+                            <Label>sans projection</Label>
+                            <Detail>Il s'agit de la &lt;b&gt;marge clypéale antérolatérale&lt;/b&gt;.</Detail>
+                            <MediaObject ref="m53"/>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s11">
+                        <Representation>
+                            <Label>avec projection</Label>
+                            <MediaObject ref="m54"/>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c6">
+                <Representation>
+                    <Label>Yeux</Label>
+                    <Detail>Les &lt;b&gt;yeux&lt;/b&gt; des insectes sont des yeux composés d'&lt;b&gt;ommatidies&lt;/b&gt;. Attention Ã  ne pas les confondre avec les &lt;b&gt;ocelles&lt;/b&gt;, yeux simples souvent situés sur le dessu-de la tête, servant Ã  détecter les variations de luminosité.</Detail>
+                    <MediaObject ref="m55"/>
+                    <MediaObject ref="m56"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s12">
+                        <Representation>
+                            <Label>absents ou très réduits</Label>
+                            <Detail>Yeux absents ou très réduits c'est Ã  dire représentés seulement par une seule ou un petit nombre d'ommatidies.</Detail>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s13">
+                        <Representation>
+                            <Label>présents et bien visibles</Label>
+                            <Detail>Yeux présent et bien visibles composés d'un grand nombre d'ommatidies.</Detail>
+                            <MediaObject ref="m57"/>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c7">
+                <Representation>
+                    <Label>Antennes</Label>
+                    <MediaObject ref="m58"/>
+                    <MediaObject ref="m59"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s14">
+                        <Representation>
+                            <Label>de 8 Ã  10 segments</Label>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s15">
+                        <Representation>
+                            <Label>de 12 segments</Label>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s16">
+                        <Representation>
+                            <Label>moins de 8 segments</Label>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s17">
+                        <Representation>
+                            <Label>10 ou 11 segments</Label>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c8">
+                <Representation>
+                    <Label>Répartition mondiale</Label>
+                </Representation>
+                <States>
+                    <StateDefinition id="s18">
+                        <Representation>
+                            <Label>monde entier</Label>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s19">
+                        <Representation>
+                            <Label>régions tempérées</Label>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s20">
+                        <Representation>
+                            <Label>tropiques</Label>
+                            <Detail>Il s'agit des tropiques (voire subtropiques) du monden entier.</Detail>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s21">
+                        <Representation>
+                            <Label>néotropiques</Label>
+                            <Detail>Il s'agit des zones tropicales américaines.</Detail>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c9">
+                <Representation>
+                    <Label>Lobes frontaux</Label>
+                    <MediaObject ref="m60"/>
+                    <MediaObject ref="m61"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s22">
+                        <Representation>
+                            <Label>absents ou très réduits et verticaux</Label>
+                            <MediaObject ref="m62"/>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s23">
+                        <Representation>
+                            <Label>présents et horizontaux</Label>
+                            <MediaObject ref="m63"/>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c10">
+                <Representation>
+                    <Label>Bases antennaires</Label>
+                    <MediaObject ref="m64"/>
+                    <MediaObject ref="m65"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s24">
+                        <Representation>
+                            <Label>partiellement ou complètement camouflées</Label>
+                            <Detail>En vue de face, les &lt;b&gt;bases antennaires&lt;/b&gt; sont partiellement ou complètement recouvertes par les &lt;b&gt; lobes frontaux&lt;/b&gt; (jamais complètement exposées).</Detail>
+                            <MediaObject ref="m66"/>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s25">
+                        <Representation>
+                            <Label>totalement exposées</Label>
+                            <Detail>En vue de face, les &lt;b&gt;bases antennaires&lt;/b&gt; sont complètement exposées et non recouvertes par les lobes frontaux.</Detail>
+                            <MediaObject ref="m67"/>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c11">
+                <Representation>
+                    <Label>Suture promésonotale</Label>
+                    <Detail>La &lt;b&gt;suture promésonotale&lt;/b&gt; est la suture (ligne de ligne de fusion) entre le pronotum et le mesonotum, les deux premiers articles du thorax.</Detail>
+                    <MediaObject ref="m68"/>
+                    <MediaObject ref="m69"/>
+                    <MediaObject ref="m70"/>
+                    <MediaObject ref="m71"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s26">
+                        <Representation>
+                            <Label>absente</Label>
+                            <MediaObject ref="m72"/>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s27">
+                        <Representation>
+                            <Label>vestigiale</Label>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s28">
+                        <Representation>
+                            <Label>présente</Label>
+                            <MediaObject ref="m73"/>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c12">
+                <Representation>
+                    <Label>Ocelle(s)</Label>
+                    <Detail>Les &lt;b&gt;ocelles&lt;/b&gt; sont des yeux simples servant Ã  détecter les variations de luminosité. Les ouvrières peuvent avoir un ou plusieurs ocelles.</Detail>
+                    <MediaObject ref="m74"/>
+                    <MediaObject ref="m75"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s29">
+                        <Representation>
+                            <Label>absent(s)</Label>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s30">
+                        <Representation>
+                            <Label>présent(s)</Label>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+            <CategoricalCharacter id="c13">
+                <Representation>
+                    <Label>Palpes maxillaires</Label>
+                    <MediaObject ref="m76"/>
+                </Representation>
+                <States>
+                    <StateDefinition id="s31">
+                        <Representation>
+                            <Label>présents et bien visibles</Label>
+                        </Representation>
+                    </StateDefinition>
+                    <StateDefinition id="s32">
+                        <Representation>
+                            <Label>absents ou très difficilement visibles</Label>
+                        </Representation>
+                    </StateDefinition>
+                </States>
+            </CategoricalCharacter>
+        </Characters>
+        <CharacterTrees>
+            <CharacterTree id="ct1">
+                <Representation>
+                    <Label>Ordre et dÈpendance entre caractËres</Label>
+                </Representation>
+                <ShouldContainAllCharacters>true</ShouldContainAllCharacters>
+                <Nodes>
+                    <CharNode>
+                        <Character ref="c1"/>
+                    </CharNode>
+                    <CharNode>
+                        <Character ref="c2"/>
+                    </CharNode>
+                    <CharNode>
+                        <DependencyRules>
+                            <InapplicableIf>
+                                <State ref="s2"/>
+                            </InapplicableIf>
+                        </DependencyRules>
+                        <Character ref="c3"/>
+                    </CharNode>
+                    <CharNode>
+                        <Character ref="c4"/>
+                    </CharNode>
+                    <CharNode>
+                        <DependencyRules>
+                            <InapplicableIf>
+                                <State ref="s3"/>
+                            </InapplicableIf>
+                        </DependencyRules>
+                        <Character ref="c5"/>
+                    </CharNode>
+                    <CharNode>
+                        <Character ref="c6"/>
+                    </CharNode>
+                    <CharNode>
+                        <Character ref="c7"/>
+                    </CharNode>
+                    <CharNode>
+                        <Character ref="c8"/>
+                    </CharNode>
+                    <CharNode>
+                        <Character ref="c9"/>
+                    </CharNode>
+                    <CharNode>
+                        <Character ref="c10"/>
+                    </CharNode>
+                    <CharNode>
+                        <Character ref="c11"/>
+                    </CharNode>
+                    <CharNode>
+                        <Character ref="c12"/>
+                    </CharNode>
+                    <CharNode>
+                        <Character ref="c13"/>
+                    </CharNode>
+                </Nodes>
+            </CharacterTree>
+        </CharacterTrees>
+        <CodedDescriptions>
+            <CodedDescription id="D1">
+                <Representation>
+                    <Label>Dolichoderinae</Label>
+                    <MediaObject ref="m1"/>
+                    <MediaObject ref="m2"/>
+                    <MediaObject ref="m3"/>
+                </Representation>
+                <Scope>
+                    <TaxonName ref="t1"/>
+                </Scope>
+                <SummaryData>
+                    <Categorical ref="c1">
+                        <State ref="s1"/>
+                    </Categorical>
+                    <Categorical ref="c2">
+                        <Note>Leur aiguillon venimeux est vestigial et non fonctionnel.</Note>
+                        <State ref="s3"/>
+                    </Categorical>
+                    <Categorical ref="c3">
+                        <State ref="s6"/>
+                    </Categorical>
+                    <Categorical ref="c4">
+                        <State ref="s8"/>
+                    </Categorical>
+                    <Categorical ref="c5"/>
+                    <Categorical ref="c6">
+                        <State ref="s13"/>
+                    </Categorical>
+                    <Categorical ref="c7">
+                        <Note>Les ouvrières possèdent généralement 11 articles antennaires, rarement 10 ou 11.</Note>
+                        <State ref="s14"/>
+                        <State ref="s15"/>
+                    </Categorical>
+                    <Categorical ref="c8">
+                        <State ref="s18"/>
+                    </Categorical>
+                    <Categorical ref="c9">
+                        <Status code="DataUnavailable"/>
+                    </Categorical>
+                    <Categorical ref="c10">
+                        <Note>Elles sont partiellement ou totalement cachées par la carèbe frontale, marge du lbe frontal.</Note>
+                        <State ref="s24"/>
+                    </Categorical>
+                    <Categorical ref="c11">
+                        <Note>Elle est présente et flexible.</Note>
+                        <State ref="s28"/>
+                    </Categorical>
+                    <Categorical ref="c12">
+                        <Note>Les ocelles sont pratiquement tout le temps absents.</Note>
+                        <State ref="s29"/>
+                    </Categorical>
+                    <Categorical ref="c13">
+                        <State ref="s31"/>
+                    </Categorical>
+                </SummaryData>
+            </CodedDescription>
+            <CodedDescription id="D2">
+                <Representation>
+                    <Label>Formicinae</Label>
+                    <MediaObject ref="m4"/>
+                    <MediaObject ref="m5"/>
+                    <MediaObject ref="m6"/>
+                    <MediaObject ref="m7"/>
+                    <MediaObject ref="m8"/>
+                </Representation>
+                <Scope>
+                    <TaxonName ref="t2"/>
+                </Scope>
+                <SummaryData>
+                    <Categorical ref="c1">
+                        <State ref="s1"/>
+                    </Categorical>
+                    <Categorical ref="c2">
+                        <Note>Leur aiguillon est non fonctionnel.</Note>
+                        <State ref="s3"/>
+                    </Categorical>
+                    <Categorical ref="c3">
+                        <State ref="s5"/>
+                    </Categorical>
+                    <Categorical ref="c4">
+                        <State ref="s8"/>
+                    </Categorical>
+                    <Categorical ref="c5"/>
+                    <Categorical ref="c6">
+                        <Note>Leurs yeux sont généralement bien développés, rarement réduits ou absents.</Note>
+                        <State ref="s12"/>
+                        <State ref="s13"/>
+                    </Categorical>
+                    <Categorical ref="c7">
+                        <State ref="s14"/>
+                        <State ref="s15"/>
+                        <State ref="s17"/>
+                    </Categorical>
+                    <Categorical ref="c8">
+                        <State ref="s18"/>
+                    </Categorical>
+                    <Categorical ref="c9">
+                        <Status code="DataUnavailable"/>
+                    </Categorical>
+                    <Categorical ref="c10">
+                        <State ref="s25"/>
+                    </Categorical>
+                    <Categorical ref="c11">
+                        <State ref="s28"/>
+                    </Categorical>
+                    <Categorical ref="c12">
+                        <Note>Les ocelles sont présents dans la grande majorité des genres.</Note>
+                        <State ref="s30"/>
+                    </Categorical>
+                    <Categorical ref="c13">
+                        <State ref="s31"/>
+                        <State ref="s32"/>
+                    </Categorical>
+                </SummaryData>
+            </CodedDescription>
+            <CodedDescription id="D3">
+                <Representation>
+                    <Label>Ponerinae</Label>
+                    <MediaObject ref="m9"/>
+                    <MediaObject ref="m10"/>
+                    <MediaObject ref="m11"/>
+                    <MediaObject ref="m12"/>
+                    <MediaObject ref="m13"/>
+                </Representation>
+                <Scope>
+                    <TaxonName ref="t3"/>
+                </Scope>
+                <SummaryData>
+                    <Categorical ref="c1">
+                        <State ref="s1"/>
+                    </Categorical>
+                    <Categorical ref="c2">
+                        <State ref="s4"/>
+                    </Categorical>
+                    <Categorical ref="c3">
+                        <State ref="s7"/>
+                    </Categorical>
+                    <Categorical ref="c4">
+                        <State ref="s8"/>
+                    </Categorical>
+                    <Categorical ref="c5">
+                        <State ref="s10"/>
+                    </Categorical>
+                    <Categorical ref="c6">
+                        <Note>Les Ponerinae possèdent des yeux bien développés dans la grande majorité des cas.</Note>
+                        <State ref="s13"/>
+                    </Categorical>
+                    <Categorical ref="c7">
+                        <Status code="DataUnavailable"/>
+                    </Categorical>
+                    <Categorical ref="c8">
+                        <State ref="s19"/>
+                        <State ref="s20"/>
+                    </Categorical>
+                    <Categorical ref="c9">
+                        <State ref="s23"/>
+                    </Categorical>
+                    <Categorical ref="c10">
+                        <State ref="s24"/>
+                    </Categorical>
+                    <Categorical ref="c11">
+                        <Note>Si les yeux et les lobes frontaux sont absents, la suture promésonotale est toujours absente.</Note>
+                        <State ref="s26"/>
+                        <State ref="s28"/>
+                    </Categorical>
+                    <Categorical ref="c12">
+                        <Note>En général les ouvrières de poneriane ne portent pas d'ocelles.</Note>
+                        <State ref="s29"/>
+                    </Categorical>
+                    <Categorical ref="c13">
+                        <State ref="s31"/>
+                        <State ref="s32"/>
+                    </Categorical>
+                </SummaryData>
+            </CodedDescription>
+            <CodedDescription id="D4">
+                <Representation>
+                    <Label>Myrmicinae</Label>
+                    <MediaObject ref="m14"/>
+                    <MediaObject ref="m15"/>
+                    <MediaObject ref="m16"/>
+                    <MediaObject ref="m17"/>
+                    <MediaObject ref="m18"/>
+                    <MediaObject ref="m19"/>
+                    <MediaObject ref="m20"/>
+                </Representation>
+                <Scope>
+                    <TaxonName ref="t4"/>
+                </Scope>
+                <SummaryData>
+                    <Categorical ref="c1">
+                        <State ref="s2"/>
+                    </Categorical>
+                    <Categorical ref="c2">
+                        <State ref="s4"/>
+                    </Categorical>
+                    <Categorical ref="c3"/>
+                    <Categorical ref="c4">
+                        <State ref="s8"/>
+                    </Categorical>
+                    <Categorical ref="c5">
+                        <State ref="s10"/>
+                    </Categorical>
+                    <Categorical ref="c6">
+                        <State ref="s13"/>
+                    </Categorical>
+                    <Categorical ref="c7">
+                        <Note>Le nombre d'articles antennaires peut varier de 4 Ã  12 chez les Myrmicinae.</Note>
+                        <State ref="s14"/>
+                        <State ref="s15"/>
+                        <State ref="s16"/>
+                    </Categorical>
+                    <Categorical ref="c8">
+                        <State ref="s18"/>
+                    </Categorical>
+                    <Categorical ref="c9">
+                        <State ref="s22"/>
+                        <State ref="s23"/>
+                    </Categorical>
+                    <Categorical ref="c10">
+                        <State ref="s24"/>
+                        <State ref="s25"/>
+                    </Categorical>
+                    <Categorical ref="c11">
+                        <Note>Elle est souvent complètement absente et rarement vestigiale. Quand c'est le cas, elle donne l'impression transversalement s'un arche en vue dorsale.</Note>
+                        <State ref="s26"/>
+                        <State ref="s27"/>
+                    </Categorical>
+                    <Categorical ref="c12">
+                        <Note>Les ocelles sont la plupart du temps absents, très rarement présents.</Note>
+                        <State ref="s29"/>
+                    </Categorical>
+                    <Categorical ref="c13">
+                        <State ref="s31"/>
+                        <State ref="s32"/>
+                    </Categorical>
+                </SummaryData>
+            </CodedDescription>
+            <CodedDescription id="D5">
+                <Representation>
+                    <Label>Pseudomyrmecinae</Label>
+                    <MediaObject ref="m21"/>
+                    <MediaObject ref="m22"/>
+                    <MediaObject ref="m23"/>
+                    <MediaObject ref="m24"/>
+                </Representation>
+                <Scope>
+                    <TaxonName ref="t5"/>
+                </Scope>
+                <SummaryData>
+                    <Categorical ref="c1">
+                        <State ref="s2"/>
+                    </Categorical>
+                    <Categorical ref="c2">
+                        <State ref="s4"/>
+                    </Categorical>
+                    <Categorical ref="c3"/>
+                    <Categorical ref="c4">
+                        <State ref="s8"/>
+                    </Categorical>
+                    <Categorical ref="c5">
+                        <Note>La projestion clypéale concernée est postérieure c'est Ã  dir vers les mandibules, et non vers le haut de la tête.</Note>
+                        <State ref="s10"/>
+                    </Categorical>
+                    <Categorical ref="c6">
+                        <State ref="s13"/>
+                    </Categorical>
+                    <Categorical ref="c7">
+                        <State ref="s15"/>
+                    </Categorical>
+                    <Categorical ref="c8">
+                        <State ref="s20"/>
+                    </Categorical>
+                    <Categorical ref="c9">
+                        <State ref="s22"/>
+                        <State ref="s23"/>
+                    </Categorical>
+                    <Categorical ref="c10">
+                        <State ref="s24"/>
+                    </Categorical>
+                    <Categorical ref="c11">
+                        <Note>Elle est très visible en vue dorsale.</Note>
+                        <State ref="s28"/>
+                    </Categorical>
+                    <Categorical ref="c12">
+                        <State ref="s30"/>
+                    </Categorical>
+                    <Categorical ref="c13">
+                        <State ref="s32"/>
+                    </Categorical>
+                </SummaryData>
+            </CodedDescription>
+            <CodedDescription id="D6">
+                <Representation>
+                    <Label>Ecitoninae</Label>
+                    <MediaObject ref="m25"/>
+                    <MediaObject ref="m26"/>
+                    <MediaObject ref="m27"/>
+                    <MediaObject ref="m28"/>
+                </Representation>
+                <Scope>
+                    <TaxonName ref="t6"/>
+                </Scope>
+                <SummaryData>
+                    <Categorical ref="c1">
+                        <State ref="s2"/>
+                    </Categorical>
+                    <Categorical ref="c2">
+                        <State ref="s4"/>
+                    </Categorical>
+                    <Categorical ref="c3"/>
+                    <Categorical ref="c4">
+                        <State ref="s8"/>
+                    </Categorical>
+                    <Categorical ref="c5">
+                        <State ref="s10"/>
+                    </Categorical>
+                    <Categorical ref="c6">
+                        <Note>Leurs yeux sont réduits Ã  une seule ommatidies ou absents.</Note>
+                        <State ref="s12"/>
+                    </Categorical>
+                    <Categorical ref="c7">
+                        <State ref="s15"/>
+                    </Categorical>
+                    <Categorical ref="c8">
+                        <State ref="s19"/>
+                        <State ref="s21"/>
+                    </Categorical>
+                    <Categorical ref="c9">
+                        <State ref="s22"/>
+                    </Categorical>
+                    <Categorical ref="c10">
+                        <State ref="s25"/>
+                    </Categorical>
+                    <Categorical ref="c11">
+                        <Note>Cette suture n'est jamais marqué et elle est flexible.</Note>
+                        <State ref="s26"/>
+                        <State ref="s27"/>
+                    </Categorical>
+                    <Categorical ref="c12">
+                        <State ref="s30"/>
+                    </Categorical>
+                    <Categorical ref="c13">
+                        <State ref="s32"/>
+                    </Categorical>
+                </SummaryData>
+            </CodedDescription>
+            <CodedDescription id="D7">
+                <Representation>
+                    <Label>Ectatomminae</Label>
+                    <MediaObject ref="m29"/>
+                    <MediaObject ref="m30"/>
+                </Representation>
+                <Scope>
+                    <TaxonName ref="t7"/>
+                </Scope>
+                <SummaryData>
+                    <Categorical ref="c1">
+                        <State ref="s1"/>
+                    </Categorical>
+                    <Categorical ref="c2">
+                        <State ref="s3"/>
+                    </Categorical>
+                    <Categorical ref="c3">
+                        <State ref="s7"/>
+                    </Categorical>
+                    <Categorical ref="c4">
+                        <State ref="s8"/>
+                    </Categorical>
+                    <Categorical ref="c5"/>
+                    <Categorical ref="c6">
+                        <State ref="s13"/>
+                    </Categorical>
+                    <Categorical ref="c7">
+                        <Status code="DataUnavailable"/>
+                    </Categorical>
+                    <Categorical ref="c8">
+                        <State ref="s18"/>
+                    </Categorical>
+                    <Categorical ref="c9">
+                        <State ref="s22"/>
+                    </Categorical>
+                    <Categorical ref="c10">
+                        <State ref="s24"/>
+                    </Categorical>
+                    <Categorical ref="c11">
+                        <Status code="DataUnavailable"/>
+                    </Categorical>
+                    <Categorical ref="c12">
+                        <State ref="s29"/>
+                    </Categorical>
+                    <Categorical ref="c13">
+                        <State ref="s32"/>
+                    </Categorical>
+                </SummaryData>
+            </CodedDescription>
+            <CodedDescription id="D8">
+                <Representation>
+                    <Label>Cerapachyinae</Label>
+                    <MediaObject ref="m31"/>
+                    <MediaObject ref="m32"/>
+                    <MediaObject ref="m33"/>
+                    <MediaObject ref="m34"/>
+                </Representation>
+                <Scope>
+                    <TaxonName ref="t8"/>
+                </Scope>
+                <SummaryData>
+                    <Categorical ref="c1">
+                        <State ref="s1"/>
+                    </Categorical>
+                    <Categorical ref="c2">
+                        <Note>Aiguillon bien dévellopé et fonctionnel.</Note>
+                        <State ref="s4"/>
+                    </Categorical>
+                    <Categorical ref="c3">
+                        <Status code="DataUnavailable"/>
+                    </Categorical>
+                    <Categorical ref="c4">
+                        <Note>Il existe un rangée apicale ou marginale de courtes dents ou Ã©pines.</Note>
+                        <State ref="s9"/>
+                    </Categorical>
+                    <Categorical ref="c5">
+                        <State ref="s11"/>
+                    </Categorical>
+                    <Categorical ref="c6">
+                        <Note>Les yeux sont généralement présents, très rarement réduits ou absents.</Note>
+                        <State ref="s12"/>
+                    </Categorical>
+                    <Categorical ref="c7">
+                        <State ref="s15"/>
+                        <State ref="s17"/>
+                    </Categorical>
+                    <Categorical ref="c8">
+                        <State ref="s20"/>
+                    </Categorical>
+                    <Categorical ref="c9">
+                        <Status code="DataUnavailable"/>
+                    </Categorical>
+                    <Categorical ref="c10">
+                        <State ref="s25"/>
+                    </Categorical>
+                    <Categorical ref="c11">
+                        <Note>La plupart du temps, elle est complètement absente. Elle n'est que très rarement visible.</Note>
+                        <State ref="s26"/>
+                        <State ref="s28"/>
+                    </Categorical>
+                    <Categorical ref="c12">
+                        <State ref="s30"/>
+                    </Categorical>
+                    <Categorical ref="c13">
+                        <Status code="DataUnavailable"/>
+                    </Categorical>
+                </SummaryData>
+            </CodedDescription>
+            <CodedDescription id="D9">
+                <Representation>
+                    <Label>Genus Ectatom</Label>
+                </Representation>
+                <Scope>
+                    <TaxonName ref="t9"/>
+                </Scope>
+                <SummaryData>
+                    <Categorical ref="c1"/>
+                    <Categorical ref="c2"/>
+                    <Categorical ref="c3"/>
+                    <Categorical ref="c4"/>
+                    <Categorical ref="c5"/>
+                    <Categorical ref="c6"/>
+                    <Categorical ref="c7"/>
+                    <Categorical ref="c8"/>
+                    <Categorical ref="c9"/>
+                    <Categorical ref="c10"/>
+                    <Categorical ref="c11"/>
+                    <Categorical ref="c12"/>
+                    <Categorical ref="c13"/>
+                </SummaryData>
+            </CodedDescription>
+        </CodedDescriptions>
+        <Agents>
+            <Agent id="a0">
+                <Representation>
+                    <Label>Unknown</Label>
+                </Representation>
+            </Agent>
+        </Agents>
+        <MediaObjects>
+            <MediaObject id="m1">
+                <Representation>
+                    <Label>Dolichoderinae - m1</Label>
+                    <Detail role="Caption">Dolichoderinae</Detail>
+                </Representation>
+                <Type>Image</Type>
+                <Source href="http://cybertaxonomy.eu/sites/wp5.e-taxonomy.eu/files/cybergate.PNG"/>
+            </MediaObject>
+            <MediaObject id="m2">
+                <Representation>
+                    <Label>Dolichoderinae - m2</Label>
+                    <Detail role="Caption">Dolichoderinae</Detail>
+                </Representation>
+                <Type>Image</Type>
+                <Source href="http://cybertaxonomy.eu/sites/wp5.e-taxonomy.eu/files/cybergate.PNG"/>
+            </MediaObject>
+        </MediaObjects>
+    </Dataset>
+</Datasets>
diff --git a/eu.etaxonomy.taxeditor.test/src/test/resources/imports/SpecimenExcelImport.xls b/eu.etaxonomy.taxeditor.test/src/test/resources/imports/SpecimenExcelImport.xls
new file mode 100644 (file)
index 0000000..4b8db5b
Binary files /dev/null and b/eu.etaxonomy.taxeditor.test/src/test/resources/imports/SpecimenExcelImport.xls differ
diff --git a/eu.etaxonomy.taxeditor.test/src/test/resources/imports/TcsImport.xml b/eu.etaxonomy.taxeditor.test/src/test/resources/imports/TcsImport.xml
new file mode 100644 (file)
index 0000000..545f7c8
--- /dev/null
@@ -0,0 +1,382 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<DataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.tdwg.org/schemas/tcs/1.01     http://tdwg.napier.ac.uk/TCS_1.01/v101.xsd" xmlns="http://www.tdwg.org/schemas/tcs/1.01">
+    <!-- This is an instance document that tests as many different
+    applications of the schema as possible within a single document.
+    It is not meant to a 'realistic' example of a real data set
+    but a illustration of all the different types of data that can 
+    be passed. -->
+    <MetaData>
+        <!-- to be completed -->
+        <Simple/>
+    </MetaData>
+    <Specimens>
+        <Specimen id="2">
+            <Simple/>
+            <Institution identifier=""/>
+            <Collection identifier="LE"/>
+            <SpecimenItem identifier=""/>
+        </Specimen>
+    </Specimens>
+    <Publications>
+        <Publication id="1">
+            <Simple>Fl. SSR</Simple>
+        </Publication>
+        <Publication id="2">
+            <Simple>Copeland, H.F. (1943). A study, anatomical and taxonomic, of the
+                genera of Rhododendroideae. Am. Midl.Nat. 30:533-625</Simple>
+        </Publication>
+        <Publication id="3">
+            <Simple>Wilson, E.H. &amp; Rehder, A. (1921). A monograph of the azaleas.
+                Publication of the Arnold Arboretum No. 9 Harvard University, Cambridge
+            MA.</Simple>
+        </Publication>
+        <Publication id="4">
+            <Simple>Judd, W.S. &amp; Kron, K.A. (1995) A Revision of Rhododendron VI
+                Edinb. J. Bot. 52(1): 1-54</Simple>
+        </Publication>
+        <Publication id="5">
+            <Simple>Maximoxicz, C.J. (1870) Rhododendron schlippenbachii. Mem. Acad. Sci.
+                St Petersbourg. ser.3 15.</Simple>
+        </Publication>
+    </Publications>
+    <TaxonNames>
+        <TaxonName id="0" nomenclaturalCode="Botanical">
+            <Simple>Rhododendron</Simple>
+        </TaxonName>
+        <TaxonName nomenclaturalCode="Botanical" id="1">
+            <Simple>Rhododendron subgenus Pentanthera (G. Don) Poyarkova</Simple>
+            <CanonicalName>
+                <Simple>Rhododedron subgenus Pentanthera</Simple>
+                <Genus>Rhododendron</Genus>
+                <InfragenericEpithet>Pentanthera</InfragenericEpithet>
+            </CanonicalName>
+            <CanonicalAuthorship>
+                <Simple>(G.Don) Poyarkova</Simple>
+                <BasionymAuthorship>
+                    <Simple>G. Don</Simple>
+                    <Authors>
+                        <AgentName>G. Don</AgentName>
+                    </Authors>
+                </BasionymAuthorship>
+                <CombinationAuthorship>
+                    <Simple>Poyarkova</Simple>
+                    <Authors>
+                        <AgentName>Poyarkova</AgentName>
+                    </Authors>
+                </CombinationAuthorship>
+            </CanonicalAuthorship>
+            <PublishedIn ref="1">Fl. SSR Vol 18 (1952)</PublishedIn>
+            <MicroReference>Page 57</MicroReference>
+            <Typification>
+                <Simple>Rhododendron flavum G.Don</Simple>
+                    <!--
+                        N.B. This could be linked to a full name entry if
+                        required but no details are in the current monograph so
+                        it isn't
+                    -->
+                <TypeName/>
+            </Typification>
+        </TaxonName>
+        <TaxonName id="2" nomenclaturalCode="Botanical">
+            <Simple>Rhododendron sect. Sciadorhodion Rehder &amp; Wilson</Simple>
+            <CanonicalName>
+                <Simple>Rhododendron sect. Sciadorhodion</Simple>
+                <Genus>Rhododendron</Genus>
+                <InfragenericEpithet>Sciadorhodion</InfragenericEpithet>
+            </CanonicalName>
+            <CanonicalAuthorship>
+                <Simple>Rehder &amp; Wilson</Simple>
+                <BasionymAuthorship>
+                    <Simple>Rehder &amp; Wilson</Simple>
+                </BasionymAuthorship>
+            </CanonicalAuthorship>
+            <PublishedIn linkType="local" ref="3">Wislon &amp; Rehder Monogr. Azaleas 79 (1921)</PublishedIn>
+            <MicroReference>Page 79</MicroReference>
+            <Typification>
+                <Simple/>
+                <TypeName>
+                    <NameReference linkType="local" ref="3">Rhododendron quinquefolium Bisset
+                        &amp; Moore</NameReference>
+                    <LectotypePublication ref="2">Copeland, H.F.(1943)</LectotypePublication>
+                </TypeName>
+            </Typification>
+            <Basionym>
+                <RelatedName ref="4">Azalea subgen. Sciadorhodion (Rhehder &amp; Wilson)
+                    Copeland</RelatedName>
+            </Basionym>
+        </TaxonName>
+        <TaxonName id="3" nomenclaturalCode="Botanical">
+            <Simple>Rhododendron quinquefolium Bisset &amp; Moore</Simple>
+        </TaxonName>
+        <TaxonName id="4" nomenclaturalCode="Botanical">
+            <!-- for brevity this NameObject isn't fully expanded -->
+            <Simple>Azalea subgen. Sciadorhodion (Rhehder &amp; Wilson) Copeland </Simple>
+            <Basionym>
+                <RelatedName ref="2">Rhododendron sect. Sciadorhodion Rehder &amp;
+                Wilson</RelatedName>
+            </Basionym>
+        </TaxonName>
+        <TaxonName id="5" nomenclaturalCode="Botanical">
+            <Simple>Rhododendron schlippenbachii Maxim.</Simple>
+            <Rank code="sp">Species</Rank>
+            <CanonicalName>
+                <Simple>Rhododendron schlippenbachii</Simple>
+                <Genus>Rhododendron</Genus>
+                <SpecificEpithet>schlippenbachii</SpecificEpithet>
+            </CanonicalName>
+            <CanonicalAuthorship>
+                <Simple>Maxim.</Simple>
+                <BasionymAuthorship>
+                    <Simple>Maxim.</Simple>
+                    <Authors>
+                        <AgentName>Maximoxicz, C.J.</AgentName>
+                    </Authors>
+                </BasionymAuthorship>
+            </CanonicalAuthorship>
+            <PublishedIn ref="5">Bull. Acad. Sci. St Petersbourg, ser. 3 15 (1870)</PublishedIn>
+            <MicroReference>Page 226</MicroReference>
+            <Typification>
+                <Simple/>
+                <TypeVouchers>
+                <TypeVoucher typeOfType="lecto">
+                    <VoucherReference linkType="local" ref="1"/>
+                    <LectotypePublication ref="4"/>
+                    <LectotypeMicroReference>Page 15</LectotypeMicroReference>
+                </TypeVoucher>
+                <TypeVoucher typeOfType="isolecto">
+                    <VoucherReference linkType="local" ref="2"/>
+                    <LectotypePublication ref="4"/>
+                    <LectotypeMicroReference>Page 15</LectotypeMicroReference>
+                </TypeVoucher>
+                </TypeVouchers>
+            </Typification>
+        </TaxonName>
+        <TaxonName id="6" nomenclaturalCode="Botanical">
+            <Simple>Azalea schlippenbachii (Maxim.) Kuntze</Simple>
+            <CanonicalName>
+                <Simple>Azalea schlippenbachii</Simple>
+                <Genus>Azalea</Genus>
+                <SpecificEpithet>schlippenbachii</SpecificEpithet>
+            </CanonicalName>
+            <CanonicalAuthorship>
+                <Simple>(Maxim.) Kuntze</Simple>
+                <BasionymAuthorship>
+                    <Simple>Maxim.</Simple>
+                </BasionymAuthorship>
+                <CombinationAuthorship>
+                    <Simple>Kuntze</Simple>
+                </CombinationAuthorship>
+            </CanonicalAuthorship>
+            <PublishedIn>Revis. Gen.Pl. 2:387 (1891)</PublishedIn>
+            <Typification>
+                <Simple/>
+                <TypeVouchers>
+                <TypeVoucher typeOfType="lecto">
+                    <VoucherReference ref="2">[Russia] Manchuria, shores of Possiet Bay, [SW of
+                        Vladivostok], 1860, C. Maximowicz LE</VoucherReference>
+                    <LectotypePublication ref="4"/>
+                    <LectotypeMicroReference>Page 15</LectotypeMicroReference>
+                </TypeVoucher>
+               </TypeVouchers>
+            </Typification>
+        </TaxonName>
+        <TaxonName id="7" nomenclaturalCode="Botanical">
+            <Simple>Rhododendron pentaphyllum Maxim.</Simple>
+            <CanonicalName>
+                <Simple>Rhododendron pentaphyllum</Simple>
+                <Genus>Rhododendron</Genus>
+                <SpecificEpithet>pentaphyllum</SpecificEpithet>
+            </CanonicalName>
+            <CanonicalAuthorship>
+                <Simple>Maxim.</Simple>
+            </CanonicalAuthorship>
+            <PublishedIn>Bull. Acad. Sci. St Petersbourg, ser. 3, 31:65 (1887)</PublishedIn>
+            <Typification>
+                <Simple/>
+                <TypeVouchers>
+                    <TypeVoucher typeOfType="holo">
+                        <VoucherReference>Japan, Kyushiu, prov. Osumi, summit, Mt Taka-kuma, Tashiro
+                            (LE)</VoucherReference>
+                    </TypeVoucher>
+                </TypeVouchers>
+           
+            </Typification>
+        </TaxonName>
+        <TaxonName id="8" nomenclaturalCode="Botanical">
+            <Simple>Azalea pentaphylla (Maxim.) Copeland</Simple>
+            <CanonicalName>
+                <Simple>Azalea pentaphylla</Simple>
+                <Genus>Azalea</Genus>
+                <SpecificEpithet>pentaphylla</SpecificEpithet>
+            </CanonicalName>
+            <CanonicalAuthorship>
+                <Simple>(Maxim.) Copeland</Simple>
+                <BasionymAuthorship>
+                    <Simple>Maxim.</Simple>
+                </BasionymAuthorship>
+                <CombinationAuthorship>
+                    <Simple>Copeland</Simple>
+                </CombinationAuthorship>
+            </CanonicalAuthorship>
+            <PublishedIn>Am.Midl.Nat. 30:595 (1943)</PublishedIn>
+            <Typification>
+                <Simple/>
+                <TypeVouchers>
+                    <TypeVoucher typeOfType="holo">
+                        <VoucherReference>Japan, Kyushiu, prov. Osumi, summit, Mt Taka-kuma, Tashiro
+                            (LE)</VoucherReference>
+                    </TypeVoucher>
+                </TypeVouchers>
+            </Typification>
+        </TaxonName>
+        <TaxonName id="9" nomenclaturalCode="Botanical">
+            <Simple>Rhododendron pentaphyllum var. nikoense Komatsu</Simple>
+            <Rank code="var">variety</Rank>
+            <CanonicalName>
+                <Simple>Rhododendron pentaphyllum var. nikoense</Simple>
+                <Genus ref="0">Rhododendron</Genus>
+                <SpecificEpithet>pentaphyllum</SpecificEpithet>
+                <InfraspecificEpithet>nikoense</InfraspecificEpithet>
+            </CanonicalName>
+            <CanonicalAuthorship>
+                <Simple>Konatsu</Simple>
+            </CanonicalAuthorship>
+            <PublishedIn>Icon. Pl. Koisikav. 3: 45, t 168 (1916)</PublishedIn>
+        </TaxonName>
+        <TaxonName id="10" nomenclaturalCode="Botanical">
+            <Simple>Rhododendron nikoense (Komatsu) Nakai</Simple>
+            <Rank code="sp">Species</Rank>
+            <CanonicalName>
+                <Simple>Rhododendron nikoense</Simple>
+                <Genus ref="0">Rhododendron</Genus>
+                <SpecificEpithet>nikoense</SpecificEpithet>
+            </CanonicalName>
+            <CanonicalAuthorship>
+                <Simple>(Komatsu) Nakai</Simple>
+                <BasionymAuthorship>
+                    <Simple>Komatsu</Simple>
+                </BasionymAuthorship>
+                <CombinationAuthorship>
+                    <Simple>Nakai</Simple>
+                </CombinationAuthorship>
+            </CanonicalAuthorship>
+            <PublishedIn>Nakai &amp; Koidz. Trees and Shrubs Japan 1: 68 (1922)</PublishedIn>
+            <Basionym>
+                <RelatedName ref="9">Rhododendron pentaphyllum var. nikoense</RelatedName>
+            </Basionym>
+        </TaxonName>
+        <TaxonName id="11" nomenclaturalCode="Botanical">
+            <Simple>Rhododendron quinquefolium Bisset &amp; S. Moore var. roseum Rehder</Simple>
+            <Rank code="var">variety</Rank>
+            <CanonicalName>
+                <Simple>Rhododendron quinquefolium</Simple>
+                <Genus ref="0">Rhododendron</Genus>
+                <SpecificEpithet>quinquefolium</SpecificEpithet>
+                <InfraspecificEpithet>roseum</InfraspecificEpithet>
+            </CanonicalName>
+            <CanonicalAuthorship>
+                <Simple>Rehder</Simple>
+            </CanonicalAuthorship>
+            <PublishedIn>Bailey, Stand. Cycl. Hort. 5: 2947 (1916)</PublishedIn>
+        </TaxonName>
+        <TaxonName id="12" nomenclaturalCode="Botanical">
+            <Simple>Rhododendron pentaphyllum Maxim. var. shikokianum T. Yamazaki</Simple>
+            <Rank code="sp">species</Rank>
+            <CanonicalName>
+                <Simple>Rhododendron pentaphyllum var. shikokianum</Simple>
+                <Genus ref="0">Rhododendron</Genus>
+                <SpecificEpithet>pentaphyllum</SpecificEpithet>
+                <InfraspecificEpithet>shikokianum</InfraspecificEpithet>
+            </CanonicalName>
+            <CanonicalAuthorship>
+                <Simple>T. Yamazaki</Simple>
+            </CanonicalAuthorship>
+            <PublishedIn>Jap. Bot. 63: 312 (1988)</PublishedIn>
+        </TaxonName>
+    </TaxonNames>
+    <TaxonConcepts>
+        <TaxonConcept id="1">
+            <Name scientific="true" linkType="local" ref="2">Rhododendron sect. Sciadorhodion Rehder
+                &amp; Wilson</Name>
+            <Rank code="sect">Section</Rank>
+            <AccordingTo>
+                <Simple>Judd &amp; Kron (1995)</Simple>
+                <AccordingToDetailed>
+                    <PublishedIn linkType="local" ref="4">Judd &amp; Kron (1995) A Revision of
+                        Rhododendron VI </PublishedIn>
+                    <MicroReference>Page 13-14</MicroReference>
+                </AccordingToDetailed>
+            </AccordingTo>
+            <TaxonRelationships>
+                <TaxonRelationship type="is parent taxon of">
+                    <ToTaxonConcept linkType="local" ref="2"/>
+                </TaxonRelationship>
+            </TaxonRelationships>
+        </TaxonConcept>
+        <TaxonConcept id="2">
+            <Name scientific="true" linkType="local" ref="5">Rhododendron schlippenbachii Maxim.</Name>
+            <AccordingTo>
+                <Simple>Judd &amp; Kron (1995)</Simple>
+                <AccordingToDetailed>
+                    <PublishedIn linkType="local" ref="4"/>
+                    <MicroReference>Page 15</MicroReference>
+                </AccordingToDetailed>
+            </AccordingTo>
+            <TaxonRelationships>
+                <TaxonRelationship type="is child taxon of">
+                    <ToTaxonConcept ref="1">Rhododendron sect. Sciadorhodion Rehder &amp;
+                    Wilson</ToTaxonConcept>
+                </TaxonRelationship>
+            </TaxonRelationships>
+        </TaxonConcept>
+        <TaxonConcept id="3">
+            <Name scientific="true" ref="6">Azalea schlippenbachii (Maxim.) Kuntze</Name>
+            <AccordingTo>
+                <Simple>Kuntze (1891)</Simple>
+            </AccordingTo>
+            <TaxonRelationships>
+                <TaxonRelationship type="is congruent to">
+                    <ToTaxonConcept ref="2"/>
+                </TaxonRelationship>
+            </TaxonRelationships>
+        </TaxonConcept>
+        <TaxonConcept id="4">
+            <Name scientific="true" ref="7">Rhododendron pentaphyllum Maxim.</Name>
+            <AccordingTo>
+                <Simple>Judd &amp; Kron (1995)</Simple>
+            </AccordingTo>
+            <TaxonRelationships>
+                <!-- relationships linking to taxonconcept without any descriptive string -->
+                <TaxonRelationship type="has synonym">
+                    <ToTaxonConcept ref="6"/>
+                </TaxonRelationship>
+                <TaxonRelationship type="has synonym">
+                    <ToTaxonConcept ref="7"/>
+                </TaxonRelationship>
+                <!-- relationship with linking reference to another taxon concept and string description of concept -->
+                <TaxonRelationship type="has synonym">
+                    <ToTaxonConcept ref="8">Rhododendron pentaphyllum var. nikoense
+                    Komatsu</ToTaxonConcept>
+                </TaxonRelationship>
+                <!-- relationships without linking -->
+                <TaxonRelationship type="has synonym">
+                    <ToTaxonConcept>Rhododendron pentaphyllum Maxim. var. shikokianum T.
+                    Yamazaki</ToTaxonConcept>
+                </TaxonRelationship>
+                <TaxonRelationship type="has synonym">
+                    <ToTaxonConcept>Rhododendron quinquefolium Bisset &amp; S. Moore var. roseum
+                        Rehder</ToTaxonConcept>
+                </TaxonRelationship>
+            </TaxonRelationships>
+        </TaxonConcept>
+        <TaxonConcept id="6">
+            <Name scientific="true">Rhododendron nikoense (Komatsu) Nakai</Name>
+        </TaxonConcept>
+        <TaxonConcept id="7">
+            <Name scientific="true" ref="10">Rhododendron nikoense (Komatsu) Nakai</Name>
+        </TaxonConcept>
+        <TaxonConcept id="8">
+            <Name scientific="true" ref="9">Rhododendron pentaphyllum var. nikoense Komatsu</Name>
+        </TaxonConcept>
+    </TaxonConcepts>
+</DataSet>