hide term vocabulary constructors and create factory methods instead
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / sdd / in / SDDImport.java
index 9c9bde0e8eae0fe4f15a08e5eb90e2a0e8aa72a1..c6fe7d36aafce4d8573c1c59f14a66bcd2e6430b 100644 (file)
@@ -11,17 +11,18 @@ package eu.etaxonomy.cdm.io.sdd.in;
 \r
 import java.io.File;\r
 import java.net.MalformedURLException;\r
+import java.net.URI;\r
 import java.net.URL;\r
 import java.text.SimpleDateFormat;\r
 import java.util.ArrayList;\r
 import java.util.Date;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
-import java.util.Iterator;\r
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
 \r
+import org.apache.commons.lang.StringUtils;\r
 import org.apache.log4j.Logger;\r
 import org.jdom.Element;\r
 import org.jdom.Namespace;\r
@@ -30,15 +31,14 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.TransactionStatus;\r
 \r
 import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
-import eu.etaxonomy.cdm.api.service.IReferenceService;\r
-import eu.etaxonomy.cdm.api.service.ITaxonService;\r
-import eu.etaxonomy.cdm.api.service.ITermService;\r
+import eu.etaxonomy.cdm.common.IProgressMonitor;\r
 import eu.etaxonomy.cdm.common.mediaMetaData.ImageMetaData;\r
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
 import eu.etaxonomy.cdm.io.common.CdmImportBase;\r
 import eu.etaxonomy.cdm.io.common.ICdmImport;\r
 import eu.etaxonomy.cdm.io.common.IImportConfigurator;\r
 import eu.etaxonomy.cdm.io.common.ImportHelper;\r
+import eu.etaxonomy.cdm.io.sdd.SDDTransformer;\r
 import eu.etaxonomy.cdm.model.agent.Person;\r
 import eu.etaxonomy.cdm.model.agent.Team;\r
 import eu.etaxonomy.cdm.model.common.Annotation;\r
@@ -68,6 +68,7 @@ import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
 import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
 import eu.etaxonomy.cdm.model.description.TextData;\r
+import eu.etaxonomy.cdm.model.description.WorkingSet;\r
 import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity;\r
 import eu.etaxonomy.cdm.model.media.ImageFile;\r
@@ -78,20 +79,19 @@ import eu.etaxonomy.cdm.model.media.Rights;
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.occurrence.Specimen;\r
-import eu.etaxonomy.cdm.model.reference.IArticle;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
+import eu.etaxonomy.cdm.model.taxon.Classification;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;\r
 \r
 /**\r
  * @author h.fradin\r
  * @created 24.10.2008\r
  * @version 1.0\r
  */\r
-@Component("sddDescriptionIO")\r
+@Component("sddImport")\r
 public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportState> implements ICdmImport<SDDImportConfigurator, SDDImportState> {\r
        private static final Logger logger = Logger.getLogger(SDDImport.class);\r
 \r
@@ -106,8 +106,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        private Map<String,String> locations = new HashMap<String,String>();\r
        private Map<String,List<CdmBase>> mediaObject_ListCdmBase = new HashMap<String,List<CdmBase>>();\r
        private Map<String,String> mediaObject_Role = new HashMap<String,String>();\r
-       private Map<String,ReferenceBase> publications = new HashMap<String,ReferenceBase>();\r
-       private Map<String,StateData> stateDatas = new HashMap<String,StateData>();\r
+       private Map<String,Reference> publications = new HashMap<String,Reference>();\r
        private Map<String,State> states = new HashMap<String,State>();\r
        private Map<String,TaxonDescription> taxonDescriptions = new HashMap<String,TaxonDescription>();\r
        private Map<String,NonViralName> taxonNameBases = new HashMap<String,NonViralName>();\r
@@ -118,29 +117,32 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        private Map<String,Modifier> modifiers = new HashMap<String,Modifier>();\r
        \r
        private Set<MarkerType> markerTypes = new HashSet<MarkerType>();\r
+       private Set<TermVocabulary> vocabularies = new HashSet<TermVocabulary>();\r
 \r
        private Set<Feature> descriptiveConcepts = new HashSet<Feature>();\r
-       private Set<TermVocabulary<Modifier>> termVocabularyStates = new HashSet<TermVocabulary<Modifier>>();\r
        private Set<AnnotationType> annotationTypes = new HashSet<AnnotationType>();\r
-       private Set<Feature> featureSet = new HashSet<Feature>();\r
-       private ReferenceBase sec = ReferenceFactory.newDatabase();\r
-       private ReferenceBase sourceReference = null;\r
+//     private Set<Feature> featureSet = new HashSet<Feature>();\r
+       private Set<Reference> sources = new HashSet<Reference>();\r
+       private Reference sec = ReferenceFactory.newDatabase();\r
+       private Reference sourceReference = null;\r
 \r
        private Language datasetLanguage = null;\r
+       private WorkingSet workingSet = null;\r
 \r
        private Namespace xmlNamespace = Namespace.getNamespace("xml","http://www.w3.org/XML/1998/namespace");\r
 \r
        private String generatorName = "";\r
        private String generatorVersion = "";\r
+       \r
 \r
        private Set<StatisticalMeasure> statisticalMeasures = new HashSet<StatisticalMeasure>();\r
        private Set<VersionableEntity> featureData = new HashSet<VersionableEntity>();\r
        private Set<FeatureTree> featureTrees = new HashSet<FeatureTree>();\r
-       private Set<TaxonomicTree> taxonomicTrees = new HashSet<TaxonomicTree>();\r
+       private Set<Classification> classifications = new HashSet<Classification>();\r
 \r
        private Rights copyright = null;\r
 \r
-       private int taxonNamesCount = 0; //XIM ajout\r
+       private int taxonNamesCount = 0;\r
        \r
        public SDDImport(){\r
                super();\r
@@ -161,8 +163,10 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                \r
                TransactionStatus ts = startTransaction();\r
                SDDImportConfigurator sddConfig = state.getConfig();\r
-\r
+               IProgressMonitor progressMonitor = sddConfig.getProgressMonitor();\r
+                               \r
                logger.info("start Datasets ...");\r
+               \r
                // <Datasets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://rs.tdwg.org/UBIF/2006/" xsi:schemaLocation="http://rs.tdwg.org/UBIF/2006/ ../SDD.xsd">\r
                Element root = sddConfig.getSourceRoot();\r
                Namespace sddNamespace = sddConfig.getSddNamespace();\r
@@ -175,12 +179,16 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
 \r
                //for each Dataset\r
                logger.info("start Dataset ...");\r
+               progressMonitor.beginTask("Importing SDD data", elDatasets.size());\r
                for (Element elDataset : elDatasets){\r
-                       importDataset(elDataset, sddNamespace, success, sddConfig);                     \r
-                       if ((++i % modCount) == 0){ logger.info("Datasets handled: " + i);}\r
-                       logger.info(i + " Datasets handled");\r
+                       success &= importDataset(elDataset, sddNamespace, state);                       \r
+//                     if ((++i % modCount) == 0){ logger.info("dataset(s) handled: " + i);}\r
+//                     logger.info(i + " dataset(s) handled");\r
+                       progressMonitor.worked(1);\r
                }\r
                commitTransaction(ts);\r
+               progressMonitor.done();\r
+               logger.info("End of transaction");\r
                return success;\r
        }\r
 \r
@@ -195,8 +203,8 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        // associates the reference of a media object in SDD with a CdmBase Object\r
        protected void associateImageWithCdmBase(String refMO, CdmBase cb){\r
                if ((refMO != null) && (cb!=null)) {\r
-                       if (!refMO.equals("")) {\r
-                               if (!mediaObject_ListCdmBase.containsKey(refMO)) {\r
+                       if (! refMO.equals("")) {\r
+                               if (! mediaObject_ListCdmBase.containsKey(refMO)) {\r
                                        List<CdmBase> lcb = new ArrayList<CdmBase>();\r
                                        lcb.add(cb);\r
                                        mediaObject_ListCdmBase.put(refMO,lcb);\r
@@ -217,17 +225,27 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                        <Detail>This is an example for a very simple SDD file, representing a single description with categorical, quantitative, and text character. Compare also the "Fragment*" examples, which contain more complex examples in the form of document fragments. Intended for version="SDD 1.1".</Detail>\r
               </Representation>\r
                 */\r
+\r
+               \r
+               \r
                Element elRepresentation = parent.getChild("Representation",sddNamespace);\r
                String label = (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace);\r
                String detail = (String)ImportHelper.getXmlInputValue(elRepresentation, "Detail",sddNamespace);\r
+               \r
+               //new\r
+               Representation representation = Representation.NewInstance(detail, label, null, datasetLanguage);\r
+               workingSet.addRepresentation(representation);\r
+               \r
 \r
-               sec.setTitleCache(label, true);\r
-\r
-               if (detail != null) {\r
-                       Annotation annotation = Annotation.NewInstance(detail, datasetLanguage);\r
-                       annotation.setAnnotationType(AnnotationType.EDITORIAL());\r
-                       sec.addAnnotation(annotation);\r
-               }\r
+               //old\r
+//             sec.setTitleCache(label, true);\r
+//\r
+//             if (detail != null) {\r
+//                     Annotation annotation = Annotation.NewInstance(detail, datasetLanguage);\r
+//                     annotation.setAnnotationType(AnnotationType.EDITORIAL());\r
+//                     sec.addAnnotation(annotation);\r
+//             }\r
+               \r
 \r
                List<Element> listMediaObjects = elRepresentation.getChildren("MediaObject",sddNamespace);\r
 \r
@@ -251,54 +269,93 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        // imports the representation (label, detail, lang) of a particular SDD element\r
        protected void importRepresentation(Element parent, Namespace sddNamespace, VersionableEntity ve, String id, IImportConfigurator config){\r
                Element elRepresentation = parent.getChild("Representation",sddNamespace);\r
-               // <Label xml:lang="la">Viola hederacea Labill.</Label>\r
-               List<Element> listLabels = elRepresentation.getChildren("Label",sddNamespace);\r
-               List<Element> listDetails = elRepresentation.getChildren("Detail",sddNamespace);\r
+               \r
                Map<Language,List<String>> langLabDet = new HashMap<Language,List<String>>();\r
 \r
-               for (Element elLabel : listLabels){\r
-                       String lang = elLabel.getAttributeValue("lang",xmlNamespace);\r
-                       Language language = null;\r
-                       if (lang != null) {\r
-                               if (!lang.equals("")) {\r
-                                       language = getTermService().getLanguageByIso(lang.substring(0, 2));\r
-                               } else {\r
-                                       language = datasetLanguage;\r
-                               }\r
-                       } else {\r
-                               language = datasetLanguage;\r
+               handleRepresentationLabels(sddNamespace, elRepresentation, langLabDet);\r
+               handleRepresentationDetails(sddNamespace, elRepresentation, langLabDet);\r
+\r
+               if (ve instanceof TermBase) {\r
+                       makeRepresentationForTerms((TermBase)ve, langLabDet);\r
+               }else if (ve instanceof Media) {\r
+                       makeRepresentationForMedia((Media)ve, langLabDet);\r
+               }else if (ve instanceof IdentifiableEntity<?>) {\r
+                       IdentifiableEntity<?> ie = (IdentifiableEntity<?>)ve;\r
+                       makeRepresentationForIdentifiableEntity(sddNamespace, ie, elRepresentation, langLabDet);\r
+                       if (ve instanceof IdentifiableMediaEntity<?>){\r
+                               makeRepresentationForIdentifiableMediaEntity(parent, sddNamespace, (IdentifiableMediaEntity<?>)ve);\r
                        }\r
-                       String label = elLabel.getText();\r
-                       List<String> labDet = new ArrayList<String>(3);\r
-                       labDet.add(label);\r
-                       langLabDet.put(language, labDet);\r
                }\r
 \r
+               makeRepresentationMediaObjects(sddNamespace, ve, elRepresentation);//FIXME\r
+\r
+       }\r
+\r
+\r
+       /**\r
+        * Handles the "Detail" children of representations. Adds the result to the langLabDet.\r
+        * @param sddNamespace\r
+        * @param elRepresentation\r
+        * @param langLabDet\r
+        */\r
+       private void handleRepresentationDetails(Namespace sddNamespace,\r
+                       Element elRepresentation, Map<Language, List<String>> langLabDet) {\r
+               List<Element> listDetails = elRepresentation.getChildren("Detail",sddNamespace);\r
                for (Element elDetail : listDetails){\r
-                       String lang = elDetail.getAttributeValue("lang",xmlNamespace);\r
+                       Language language = getLanguage(elDetail);\r
                        String role = elDetail.getAttributeValue("role");\r
-                       Language language = null;\r
-                       if (lang != null) {\r
-                               if (!lang.equals("")) {\r
-                                       language = getTermService().getLanguageByIso(lang.substring(0, 2));\r
-                               } else {\r
-                                       language = datasetLanguage;\r
-                               }\r
-                       } else {\r
-                               language = datasetLanguage;\r
-                       }\r
                        String detail = elDetail.getText();\r
                        List<String> labDet = langLabDet.get(language);\r
                        labDet.add(detail);\r
                        labDet.add(role);\r
                        langLabDet.put(language, labDet);\r
                }\r
+       }\r
 \r
-               if (ve instanceof TermBase) {\r
-                       TermBase tb = (TermBase) ve;\r
+       /**\r
+        * Handles the "Label" children of representations. Adds the result to the langLabDet.\r
+        * @param sddNamespace\r
+        * @param elRepresentation\r
+        * @param langLabDet\r
+        */\r
+       private void handleRepresentationLabels(Namespace sddNamespace,\r
+                               Element elRepresentation, Map<Language, List<String>> langLabDet) {\r
+               // <Label xml:lang="la">Viola hederacea Labill.</Label>\r
+               List<Element> listLabels = elRepresentation.getChildren("Label",sddNamespace);\r
+               for (Element elLabel : listLabels){\r
+                       Language language = getLanguage(elLabel);\r
+                       String label = elLabel.getText();\r
+                       List<String> labDet = new ArrayList<String>(3);\r
+                       labDet.add(label);\r
+                       langLabDet.put(language, labDet);\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * \r
+        * @param ve\r
+        * @param langLabDet\r
+        */\r
+       private void makeRepresentationForMedia(Media m, Map<Language, List<String>> langLabDet) {\r
+               for (Language lang : langLabDet.keySet()){\r
+                       List<String> labDet = langLabDet.get(lang);\r
+                       if (labDet.get(0) != null){\r
+                               m.putTitle(LanguageString.NewInstance(labDet.get(0), lang));\r
+                       }\r
+                       if (labDet.size()>1) {\r
+                               m.addDescription(labDet.get(1), lang);\r
+                       }\r
+               }\r
+       }\r
 \r
-                       for (Iterator<Language> l = langLabDet.keySet().iterator() ; l.hasNext() ;){\r
-                               Language lang = l.next();\r
+       /**\r
+        * Handles representations for terms. Adds one representation per language in langLabDet.\r
+        * \r
+        * @param ve\r
+        * @param langLabDet\r
+        */\r
+       private void makeRepresentationForTerms(TermBase tb, Map<Language, List<String>> langLabDet) {\r
+                       for (Language lang : langLabDet.keySet()){\r
                                List<String> labDet = langLabDet.get(lang);\r
                                if (labDet.size()>0){\r
                                        if (labDet.size()>1) {\r
@@ -307,125 +364,139 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                tb.addRepresentation(Representation.NewInstance(labDet.get(0), labDet.get(0), labDet.get(0), lang));\r
                                        }\r
                                }\r
-                               ve = tb;\r
                        }\r
+       }\r
 \r
-               } else if (ve instanceof Media) {\r
-                       Media m = (Media) ve;\r
 \r
-                       for (Iterator<Language> l = langLabDet.keySet().iterator() ; l.hasNext() ;){\r
-                               Language lang = l.next();\r
-                               List<String> labDet = langLabDet.get(lang);\r
-                               if (labDet.get(0) != null){\r
-                                       m.addTitle(LanguageString.NewInstance(labDet.get(0), lang));\r
-                               }\r
-                               if (labDet.size()>1) {\r
-                                       m.addDescription(labDet.get(1), lang);\r
-                               }\r
-                               ve = m;\r
-                       }\r
-\r
-               } \r
-               if (ve instanceof IdentifiableEntity<?>) {\r
-                       IdentifiableEntity<?> ie = (IdentifiableEntity<?>) ve;\r
-                       List<String> labDet = null;\r
-\r
-                       if (ve instanceof TaxonNameBase) {\r
-                               if (langLabDet.keySet().contains(getTermService().getLanguageByIso("la"))) {\r
-                                       labDet = langLabDet.get(getTermService().getLanguageByIso("la"));\r
-                               } else if (langLabDet.keySet().contains(datasetLanguage)) {\r
-                                       labDet = langLabDet.get(datasetLanguage);\r
-                                       logger.info("TaxonName " + (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace) + " is not specified as a latin name.");\r
-                               } else {\r
-                                       labDet = langLabDet.get(langLabDet.keySet().iterator().next());\r
-                                       logger.info("TaxonName " + (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace) + " is not specified as a latin name.");\r
-                               }\r
-                       } else {\r
-                               labDet = langLabDet.get(langLabDet.keySet().iterator().next());\r
+       /**\r
+        * Handles the "MediaObject" children of representations.\r
+        * @param sddNamespace\r
+        * @param ve\r
+        * @param elRepresentation\r
+        */\r
+       private void makeRepresentationMediaObjects(Namespace sddNamespace,     VersionableEntity ve, Element elRepresentation) {\r
+               List <Element> listMediaObjects = elRepresentation.getChildren("MediaObject", sddNamespace);\r
+               for (Element elMediaObject : listMediaObjects) {\r
+                       String ref = null;\r
+                       //TODO\r
+                       String role = null;\r
+                       if (elMediaObject != null) {\r
+                               ref = elMediaObject.getAttributeValue("ref");\r
+                               role = elMediaObject.getAttributeValue("role");\r
                        }\r
-\r
-                       ie.setTitleCache(labDet.get(0), true);\r
-\r
-                       if (labDet.size()>1) {\r
-                               Annotation annotation = null;\r
-                               if (labDet.get(1) != null) {\r
-                                       if (labDet.get(2) != null) {\r
-                                               annotation = Annotation.NewInstance(labDet.get(2) + " - " + labDet.get(1), datasetLanguage);\r
+                       if (StringUtils.isNotBlank(ref)) {\r
+                               if (ve instanceof TaxonDescription) {\r
+                                       TaxonDescription td = (TaxonDescription) ve;\r
+                                       if (td.getDescriptionSources().size() > 0) {\r
+                                               this.associateImageWithCdmBase(ref,(Reference) td.getDescriptionSources().toArray()[0]);\r
                                        } else {\r
-                                               annotation = Annotation.NewInstance(labDet.get(1), datasetLanguage);\r
+                                               Reference descriptionSource = ReferenceFactory.newGeneric();\r
+                                               sources.add(descriptionSource);\r
+                                               td.addDescriptionSource(descriptionSource);\r
+                                               this.associateImageWithCdmBase(ref,descriptionSource);\r
                                        }\r
+                               } else {\r
+                                       this.associateImageWithCdmBase(ref,ve);\r
                                }\r
-                               ie.addAnnotation(annotation);\r
                        }\r
-\r
-                       ve = ie;\r
-\r
                }\r
-               \r
-               if (ve instanceof IdentifiableMediaEntity<?>){\r
-                       IdentifiableMediaEntity<?> ime = (IdentifiableMediaEntity<?>) ve;\r
-                       Element elLinks = parent.getChild("Links",sddNamespace);\r
-\r
-                       if (elLinks != null) {\r
+       }\r
 \r
-                               //  <Link rel="Alternate" href="http://www.diversitycampus.net/people/hagedorn"/>\r
-                               List<Element> listLinks = elLinks.getChildren("Link", sddNamespace);\r
-                               Media link = Media.NewInstance();\r
-                               MediaRepresentation mr = MediaRepresentation.NewInstance();\r
-                               int k = 0;\r
-                               //for each Link\r
-                               for (Element elLink : listLinks){\r
+       /**\r
+        * Handles the "Links" element\r
+        * @param parent\r
+        * @param sddNamespace\r
+        * @param ve\r
+        */\r
+       private void makeRepresentationForIdentifiableMediaEntity(Element parent,\r
+                       Namespace sddNamespace, IdentifiableMediaEntity ime) {\r
+               Element elLinks = parent.getChild("Links",sddNamespace);\r
 \r
-                                       try {\r
+               if (elLinks != null) {\r
 \r
-                                               String rel = elLink.getAttributeValue("rel");\r
-                                               String href = elLink.getAttributeValue("href");\r
+                       //  <Link rel="Alternate" href="http://www.diversitycampus.net/people/hagedorn"/>\r
+                       List<Element> listLinks = elLinks.getChildren("Link", sddNamespace);\r
+                       Media link = Media.NewInstance();\r
+                       MediaRepresentation mr = MediaRepresentation.NewInstance();\r
+                       int k = 0;\r
+                       //for each Link\r
+                       for (Element elLink : listLinks){\r
 \r
-                                               mr.addRepresentationPart(MediaRepresentationPart.NewInstance(href, null));\r
-                                               link.addRepresentation(mr);\r
-                                               ime.addMedia(link);\r
+                               try {\r
+                                       //TODO\r
+                                       String rel = elLink.getAttributeValue("rel");\r
+                                       String href = elLink.getAttributeValue("href");\r
+                                       URI uri = new URI(href);\r
+                                       mr.addRepresentationPart(MediaRepresentationPart.NewInstance(uri, null));\r
+                                       link.addRepresentation(mr);\r
+                                       ime.addMedia(link);\r
 \r
-                                       } catch (Exception e) {\r
-                                               //FIXME\r
-                                               logger.warn("Import of Link " + k + " failed.");\r
-                                       }\r
+                               } catch (Exception e) {\r
+                                       //FIXME\r
+                                       logger.warn("Import of Link " + k + " failed.");\r
+                               }\r
 \r
-                                       if ((++k % modCount) == 0){ logger.info("Links handled: " + k);}\r
+                               if ((++k % modCount) == 0){ logger.info("Links handled: " + k);}\r
 \r
-                               }\r
                        }\r
                }\r
+       }\r
 \r
-               List <Element> listMediaObjects = elRepresentation.getChildren("MediaObject",sddNamespace);\r
-               for (Element elMediaObject : listMediaObjects) {\r
-                       String ref = null;\r
-                       String role = null;\r
-                       if (elMediaObject != null) {\r
-                               ref = elMediaObject.getAttributeValue("ref");\r
-                               role = elMediaObject.getAttributeValue("role");\r
+       /**\r
+        * @param sddNamespace\r
+        * @param ve\r
+        * @param elRepresentation\r
+        * @param langLabDet\r
+        * @return\r
+        */\r
+       private void makeRepresentationForIdentifiableEntity(Namespace sddNamespace, IdentifiableEntity<?> ie, \r
+                                       Element elRepresentation, Map<Language, List<String>> langLabDet) {\r
+               List<String> labDet = null;\r
+\r
+               if (ie instanceof TaxonNameBase) {\r
+                       if (langLabDet.keySet().contains(getTermService().getLanguageByIso("la"))) {\r
+                               labDet = langLabDet.get(getTermService().getLanguageByIso("la"));\r
+                       } else if (langLabDet.keySet().contains(datasetLanguage)) {\r
+                               labDet = langLabDet.get(datasetLanguage);\r
+                               logger.info("TaxonName " + (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace) + " is not specified as a latin name.");\r
+                       } else {\r
+                               labDet = langLabDet.get(langLabDet.keySet().iterator().next());\r
+                               logger.info("TaxonName " + (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace) + " is not specified as a latin name.");\r
                        }\r
-                       if (ref != null) {\r
-                               if (!ref.equals("")) {\r
-                                       if (ref != null) {\r
-                                               if (ve instanceof TaxonDescription) {\r
-                                                       TaxonDescription td = (TaxonDescription) ve;\r
-                                                       //TODO: ensure that all images are imported\r
-                                                       if (td.getDescriptionSources().toArray().length > 0) {\r
-                                                               this.associateImageWithCdmBase(ref,(ReferenceBase) td.getDescriptionSources().toArray()[0]);\r
-                                                       } else {\r
-                                                               ReferenceBase descriptionSource = ReferenceFactory.newGeneric();\r
-                                                               td.addDescriptionSource(descriptionSource);\r
-                                                               this.associateImageWithCdmBase(ref,descriptionSource);\r
-                                                       }\r
-                                               } else {\r
-                                                       this.associateImageWithCdmBase(ref,ve);\r
-                                               }\r
-                                       }\r
+               } else {\r
+                       labDet = langLabDet.get(langLabDet.keySet().iterator().next());\r
+               }\r
 \r
+               //FIXME labDet is != null only for TaxonNameBase\r
+               ie.setTitleCache(labDet.get(0), true);\r
+\r
+               if (labDet.size()>1) {\r
+                       Annotation annotation = null;\r
+                       if (labDet.get(1) != null) {\r
+                               if (labDet.get(2) != null) {\r
+                                       annotation = Annotation.NewInstance(labDet.get(2) + " - " + labDet.get(1), datasetLanguage);\r
+                               } else {\r
+                                       annotation = Annotation.NewInstance(labDet.get(1), datasetLanguage);\r
                                }\r
                        }\r
+                       ie.addAnnotation(annotation);\r
                }\r
+               return;\r
+       }\r
 \r
+       /**\r
+        * @param elLabel\r
+        * @return\r
+        */\r
+       private Language getLanguage(Element elLanguage) {\r
+               String lang = elLanguage.getAttributeValue("lang",xmlNamespace);\r
+               Language language = null;\r
+               if (StringUtils.isNotBlank(lang)) {\r
+                       language = getTermService().getLanguageByIso(lang.substring(0, 2));\r
+               } else {\r
+                       language = datasetLanguage;\r
+               }\r
+               return language;\r
        }\r
        \r
 \r
@@ -460,26 +531,30 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        }\r
 \r
        // imports the complete dataset information\r
-       protected void importDataset(Element elDataset, Namespace sddNamespace, boolean success, SDDImportConfigurator sddConfig){                      // <Dataset xml:lang="en-us">\r
+       protected boolean importDataset(Element elDataset, Namespace sddNamespace, SDDImportState state){                       // <Dataset xml:lang="en-us">\r
+               boolean success = true;\r
+               SDDImportConfigurator sddConfig = state.getConfig();\r
 \r
+               workingSet = WorkingSet.NewInstance();\r
                importDatasetLanguage(elDataset,sddConfig);\r
                importDatasetRepresentation(elDataset, sddNamespace);\r
                importRevisionData(elDataset, sddNamespace);\r
                importIPRStatements(elDataset, sddNamespace, sddConfig);\r
                importTaxonNames(elDataset, sddNamespace, sddConfig);\r
+\r
                importDescriptiveConcepts(elDataset, sddNamespace, sddConfig);\r
-               importCharacters(elDataset, sddNamespace, sddConfig, success);\r
+               success &= importCharacters(elDataset, sddNamespace, sddConfig);\r
                importCharacterTrees(elDataset, sddNamespace, sddConfig, success);\r
                \r
-               //FIXME (a.mueller) \r
-               MarkerType editorMarkerType = MarkerType.NewInstance("Editor", "editor", "edt") ;\r
-               MarkerType geographicAreaMarkerType = MarkerType.NewInstance("", "SDDGeographicArea", "ga");\r
-               MarkerType descriptiveConceptMarkerType = MarkerType.NewInstance("Descriptive Concept", "DescriptiveConcept", "DC");\r
+               MarkerType editorMarkerType = getMarkerType(state, SDDTransformer.uuidMarkerEditor, "editor", "Editor", "edt");\r
+               MarkerType geographicAreaMarkerType = getMarkerType(state, SDDTransformer.uuidMarkerSDDGeographicArea, "SDDGeographicArea", "SDDGeographicArea", "ga"); \r
+               MarkerType descriptiveConceptMarkerType = getMarkerType(state, SDDTransformer.uuidMarkerDescriptiveConcept, "DescriptiveConcept", "Descriptive Concept", "DC");\r
                markerTypes.add(editorMarkerType);\r
                markerTypes.add(geographicAreaMarkerType);\r
                markerTypes.add(descriptiveConceptMarkerType);\r
-\r
+               \r
                //saving of all imported data into the CDM db\r
+               saveVocabularies();\r
                saveFeatures();\r
                saveModifiers();\r
                saveStates();\r
@@ -488,33 +563,32 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                saveUnits();\r
                saveStatisticalMeasure();               \r
                saveAnnotationType();\r
-               \r
-               importCodedDescriptions(elDataset, sddNamespace, sddConfig, success);\r
+\r
+               success &= importCodedDescriptions(elDataset, sddNamespace, sddConfig);\r
                importAgents(elDataset, sddNamespace, sddConfig, success);\r
                importPublications(elDataset, sddNamespace, sddConfig, success);\r
                importMediaObjects(elDataset, sddNamespace, sddConfig, success);\r
                importTaxonHierarchies(elDataset, sddNamespace, sddConfig, success);\r
                importGeographicAreas(elDataset, sddNamespace, sddConfig);\r
                importSpecimens(elDataset,sddNamespace, sddConfig);\r
-                       \r
                \r
                \r
                if ((authors != null)||(editors != null)) {\r
                        Team team = Team.NewInstance();\r
                        if (authors != null) {\r
-                       for (Iterator<Person> author = authors.values().iterator() ; author.hasNext() ;){\r
-                               team.addTeamMember(author.next());\r
-                       }\r
+                               for (Person author : authors.values()){\r
+                                       team.addTeamMember(author);\r
+                               }\r
                        }\r
                        if (editors != null) {\r
                                Marker marker = Marker.NewInstance();\r
                                marker.setMarkerType(editorMarkerType);\r
-                               for (Iterator<Person> editor = editors.values().iterator() ; editor.hasNext() ;){\r
-                                       Person edit = editor.next();\r
+                               for (Person editor : editors.values()){\r
+                                       Person edit = editor;\r
                                        edit.addMarker(marker);\r
                                        team.addTeamMember(edit);\r
                                }\r
-                               }\r
+                       }\r
                        sec.setAuthorTeam(team);\r
                        sourceReference.setAuthorTeam(team);\r
                }\r
@@ -526,110 +600,85 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                \r
                // Returns a CdmApplicationController created by the values of this configuration.\r
                IDescriptionService descriptionService = getDescriptionService();\r
-\r
-               for (Iterator<TaxonDescription> k = taxonDescriptions.values().iterator() ; k.hasNext() ;){\r
-                       TaxonDescription taxonDescription = k.next();\r
+               \r
+               for (TaxonDescription taxonDescription : taxonDescriptions.values()){\r
                        // Persists a Description\r
                        descriptionService.save(taxonDescription);\r
                }\r
-\r
-\r
                \r
-               for (Iterator<String> refCD = taxonDescriptions.keySet().iterator() ; refCD.hasNext() ;){\r
-                       String ref = refCD.next();\r
+               for (String ref : taxonDescriptions.keySet()){\r
                        TaxonDescription td = taxonDescriptions.get(ref);\r
                        if (citations.containsKey(ref)) {\r
-                               IArticle publication = (IArticle) publications.get(citations.get(ref));\r
+                               Reference publication = publications.get(citations.get(ref));\r
                                if (locations.containsKey(ref)) {\r
                                        Annotation location = Annotation.NewInstance(locations.get(ref), datasetLanguage);\r
                                        AnnotationType annotationType = AnnotationType.NewInstance("", "location", "");\r
                                        annotationTypes.add(annotationType);\r
                                        location.setAnnotationType(annotationType);\r
-                                       ((ReferenceBase)publication).addAnnotation(location);\r
+                                       (publication).addAnnotation(location);\r
                                }\r
-                               td.addDescriptionSource((ReferenceBase)publication);\r
+                               td.addDescriptionSource(publication);\r
                        }\r
                }\r
                logger.info("end makeTaxonDescriptions ...");\r
-               \r
-               \r
-//             for (Iterator<TermVocabulary<Modifier>> k = termVocabularyStates.iterator() ; k.hasNext() ;){\r
-//                     TermVocabulary<Modifier> termVocabulary = k.next();\r
-//                     getVocabularyService().save(termVocabulary); //XIM\r
-//             }\r
-               \r
-\r
-               //sddConfig.setSourceReference(sourceReference);\r
-\r
 \r
                if (descriptiveConcepts != null) {\r
-                       for (Iterator<Feature> feat = descriptiveConcepts.iterator() ; feat.hasNext() ;) {\r
+                       for (Feature feature : descriptiveConcepts) {\r
                                Marker marker = Marker.NewInstance();\r
                                marker.setMarkerType(descriptiveConceptMarkerType);\r
-                               Feature feature = feat.next();\r
                                feature.addMarker(marker);\r
                        }\r
                }\r
                saveFeatures();\r
                \r
-               /*Marker markerd = Marker.NewInstance();\r
-               markerd.setMarkerType(descriptiveConceptMarker);\r
-               Feature fiture = Feature.NewInstance("Fitoure","Fitoure","Fitoure");\r
-               fiture.addMarker(markerd);\r
-               TermVocabulary<Modifier> termVocabularyState = new TermVocabulary<Modifier>("test","test","test","test");\r
-               Modifier modif = new Modifier("zoub","zab","zib");\r
-               termVocabularyState.addTerm(modif);\r
-               getVocabularyService().save(termVocabularyState);\r
-               fiture.addRecommendedModifierEnumeration(termVocabularyState);\r
-               termService.save(modif);\r
-               termService.save(fiture);*/\r
-       \r
-               //XIMtermService.save(editorMarkerType);\r
+               for (Reference publication : publications.values()){\r
+                       getReferenceService().save(publication); \r
+               }\r
                \r
-               //XIMtermService.save(geographicAreaMarkerType);\r
-\r
-               IReferenceService referenceService = getReferenceService();\r
-               // referenceService.saveReference(sourceReference); \r
-               for (Iterator<ReferenceBase> k = publications.values().iterator() ; k.hasNext() ;){\r
-                       ReferenceBase publication = (ReferenceBase) k.next();\r
-                       referenceService.save(publication); \r
+               for (Reference source : sources){\r
+                       getReferenceService().save(source); \r
                }\r
 \r
-               for (Iterator<FeatureTree> k = featureTrees.iterator() ; k.hasNext() ;) {\r
-                       FeatureTree tree = k.next();\r
-                       getFeatureTreeService().save(tree);\r
+               for (FeatureTree featureTree : featureTrees) {\r
+                       getFeatureTreeService().save(featureTree);\r
                }\r
-               for (Iterator<TaxonomicTree> k = taxonomicTrees.iterator() ; k.hasNext() ;) {\r
-                       TaxonomicTree tree = k.next();\r
-                       getTaxonTreeService().save(tree);\r
+               getWorkingSetService().save(workingSet);\r
+               for (Classification classification : classifications) {\r
+                       getClassificationService().save(classification);\r
                }\r
-               for (Iterator<Specimen> k = specimens.values().iterator() ; k.hasNext() ;) {\r
-                       Specimen specimen = k.next();\r
+               for (Specimen specimen : specimens.values()) {\r
                        getOccurrenceService().save(specimen);\r
                }\r
                logger.info("end of persistence ...");\r
                \r
+               return success;\r
+       }\r
+\r
+       /**\r
+        * \r
+        */\r
+       private void saveVocabularies() {\r
+               for (TermVocabulary vocabulary : vocabularies ){\r
+                       getVocabularyService().save(vocabulary);\r
+               }\r
                \r
        }\r
 \r
        private void saveAnnotationType() {\r
-               for (Iterator<AnnotationType> at = annotationTypes.iterator() ; at.hasNext() ;) {\r
-                       AnnotationType annotationType = at.next();\r
+               for (AnnotationType annotationType: annotationTypes){\r
                        getTermService().save(annotationType); \r
                }\r
        }\r
 \r
        private void saveStatisticalMeasure() {\r
-               for (Iterator<StatisticalMeasure> k = statisticalMeasures.iterator() ; k.hasNext() ;) {\r
-                       StatisticalMeasure sm = k.next();\r
+               for (StatisticalMeasure sm : statisticalMeasures){\r
                        getTermService().save(sm); \r
                }\r
        }\r
 \r
        private void saveUnits() {\r
                if (units != null) {\r
-                       for (Iterator<MeasurementUnit> k = units.values().iterator() ; k.hasNext() ;){\r
-                               MeasurementUnit unit = k.next();\r
+                       for (MeasurementUnit unit : units.values()){\r
                                if (unit != null) {\r
                                        getTermService().save(unit); \r
                                }\r
@@ -638,44 +687,35 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        }\r
 \r
        private void saveAreas(MarkerType geographicAreaMarkerType) {\r
-               for (Iterator<NamedArea> k = namedAreas.values().iterator() ; k.hasNext() ;) {\r
+               for (NamedArea area : namedAreas.values() ){\r
                        Marker marker = Marker.NewInstance();\r
                        marker.setMarkerType(geographicAreaMarkerType);\r
-                       NamedArea area = k.next();\r
                        area.addMarker(marker);\r
-                       //getTermService().save(area);\r
                        getTermService().save(area);\r
                }\r
        }\r
 \r
        private void saveStates() {\r
-               for (Iterator<State> k = states.values().iterator() ; k.hasNext() ;){\r
-                       State state = k.next();\r
+               for (State state : states.values() ){\r
                        getTermService().save(state);\r
                }\r
        }\r
 \r
        private void saveMarkerType() {\r
-               for(Iterator<MarkerType> k = markerTypes.iterator() ; k.hasNext() ;){\r
-                       MarkerType markerType = k.next();\r
+               for (MarkerType markerType : markerTypes){\r
                        getTermService().save(markerType);\r
                }\r
        }\r
 \r
        private void saveModifiers() {\r
-\r
-               for (Iterator<Modifier> k = modifiers.values().iterator() ; k.hasNext() ;){\r
-                       Modifier modifier = k.next();\r
+               for (Modifier modifier : modifiers.values() ){\r
                        getTermService().save(modifier);\r
                }\r
        }\r
 \r
        private void saveFeatures() {\r
-               ITermService termService = getTermService();\r
-               \r
-               for (Iterator<Feature> k = features.values().iterator() ; k.hasNext() ;){\r
-                       Feature feature = k.next();\r
-                       termService.save(feature); \r
+               for (Feature feature : features.values() ){\r
+                       getTermService().save(feature);\r
                }\r
        }\r
 \r
@@ -683,7 +723,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        protected void importDatasetLanguage(Element elDataset, SDDImportConfigurator sddConfig){\r
                String nameLang = elDataset.getAttributeValue("lang",xmlNamespace);\r
 \r
-               if (!nameLang.equals("")) {\r
+               if (StringUtils.isNotBlank(nameLang)) {\r
                        String iso = nameLang.substring(0, 2);\r
                        datasetLanguage = getTermService().getLanguageByIso(iso);\r
                } else {\r
@@ -866,406 +906,511 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        }\r
 \r
        // imports the characters (categorical, quantitative and text ; sequence characters not supported) which correspond to CDM Features\r
-       protected void importCharacters(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\r
+       protected boolean importCharacters(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig){\r
+               boolean success = true;\r
                // <Characters>\r
                logger.info("start Characters ...");\r
                Element elCharacters = elDataset.getChild("Characters", sddNamespace);\r
 \r
                // <CategoricalCharacter id="c1">\r
                if (elCharacters != null) {\r
-                       List<Element> elCategoricalCharacters = elCharacters.getChildren("CategoricalCharacter", sddNamespace);\r
-                       int j = 0;\r
-                       for (Element elCategoricalCharacter : elCategoricalCharacters){\r
-                               try {\r
-\r
-                                       String idCC = elCategoricalCharacter.getAttributeValue("id");\r
-                                       Feature categoricalCharacter = Feature.NewInstance();\r
-                                       categoricalCharacter.setKindOf(Feature.DESCRIPTION());\r
-                                       importRepresentation(elCategoricalCharacter, sddNamespace, categoricalCharacter, idCC, sddConfig);\r
-                                       categoricalCharacter.setSupportsCategoricalData(true);\r
+                       success &= handleCategoricalData(sddNamespace, sddConfig, elCharacters);\r
+                       success &= handleQuantitativeData(sddNamespace, sddConfig, elCharacters);\r
+                       success &= handleTextCharacters(sddNamespace, sddConfig, elCharacters);\r
+               }\r
 \r
-                                       // <States>\r
-                                       Element elStates = elCategoricalCharacter.getChild("States",sddNamespace);\r
+               /*for (Iterator<Feature> f = features.values().iterator() ; f.hasNext() ;){\r
+                       featureSet.add(f.next()); //XIM Why this line ?\r
+               }*/\r
+               \r
+               return success;\r
 \r
-                                       // <StateDefinition id="s1">\r
-                                       List<Element> elStateDefinitions = elStates.getChildren("StateDefinition",sddNamespace);\r
-                                       TermVocabulary<State> termVocabularyState = new TermVocabulary<State>();\r
-                                       int k = 0;\r
-                                       //for each StateDefinition\r
-                                       for (Element elStateDefinition : elStateDefinitions){\r
+       }\r
 \r
-                                               if ((++k % modCount) == 0){ logger.info("StateDefinitions handled: " + (k-1));}\r
+       /**\r
+        * @param sddNamespace\r
+        * @param sddConfig\r
+        * @param success\r
+        * @param elCharacters\r
+        * @return\r
+        */\r
+       private boolean handleCategoricalData(Namespace sddNamespace, SDDImportConfigurator sddConfig, Element elCharacters) {\r
+               boolean success = true;\r
+               List<Element> elCategoricalCharacters = elCharacters.getChildren("CategoricalCharacter", sddNamespace);\r
+               int j = 0;\r
+               for (Element elCategoricalCharacter : elCategoricalCharacters){\r
+                       try {\r
+\r
+                               String idCC = elCategoricalCharacter.getAttributeValue("id");\r
+                               Feature categoricalCharacter = Feature.NewInstance();\r
+                               categoricalCharacter.setKindOf(Feature.DESCRIPTION());\r
+                               importRepresentation(elCategoricalCharacter, sddNamespace, categoricalCharacter, idCC, sddConfig);\r
+                               categoricalCharacter.setSupportsCategoricalData(true);\r
+\r
+                               // <States>\r
+                               Element elStates = elCategoricalCharacter.getChild("States",sddNamespace);\r
+\r
+                               // <StateDefinition id="s1">\r
+                               List<Element> elStateDefinitions = elStates.getChildren("StateDefinition",sddNamespace);\r
+                               TermVocabulary<State> termVocabularyState = TermVocabulary.NewInstance(null, null, null, null);\r
+                               \r
+                               vocabularies.add(termVocabularyState);\r
+                               \r
+                               int k = 0;\r
+                               //for each StateDefinition\r
+                               for (Element elStateDefinition : elStateDefinitions){\r
 \r
-                                               String idS = elStateDefinition.getAttributeValue("id");\r
-                                               State state = State.NewInstance();\r
-                                               importRepresentation(elStateDefinition, sddNamespace, state, idS, sddConfig);\r
+                                       if ((++k % modCount) == 0){ logger.info("StateDefinitions handled: " + (k-1));}\r
 \r
-                                               //StateData stateData = StateData.NewInstance();\r
-                                               //stateData.setState(state);\r
-                                               termVocabularyState.addTerm(state);\r
-                                               states.put(idS,state);\r
+                                       String idS = elStateDefinition.getAttributeValue("id");\r
+                                       State state = states.get(idS);\r
+                                       if (state == null){\r
+                                               state = State.NewInstance();\r
+                                       }else{\r
+                                               logger.debug("State duplicate found");\r
                                        }\r
-                                       categoricalCharacter.addSupportedCategoricalEnumeration(termVocabularyState);\r
-                                       features.put(idCC, categoricalCharacter);\r
+                                       importRepresentation(elStateDefinition, sddNamespace, state, idS, sddConfig);\r
 \r
-                               } catch (Exception e) {\r
-                                       logger.warn("Import of CategoricalCharacter " + j + " failed.");\r
-                                       success = false; \r
+                                       termVocabularyState.addTerm(state);\r
+                                       states.put(idS,state);\r
                                }\r
+                               categoricalCharacter.addSupportedCategoricalEnumeration(termVocabularyState);\r
+                               features.put(idCC, categoricalCharacter);\r
 \r
-                               if ((++j % modCount) == 0){ logger.info("CategoricalCharacters handled: " + j);}\r
-\r
+                       } catch (Exception e) {\r
+                               logger.warn("Import of CategoricalCharacter " + j + " failed.");\r
+                               success = false; \r
                        }\r
 \r
-                       // <QuantitativeCharacter id="c2">\r
-                       List<Element> elQuantitativeCharacters = elCharacters.getChildren("QuantitativeCharacter", sddNamespace);\r
-                       j = 0;\r
-                       //for each QuantitativeCharacter\r
-                       for (Element elQuantitativeCharacter : elQuantitativeCharacters){\r
+                       if ((++j % modCount) == 0){ logger.info("CategoricalCharacters handled: " + j);}\r
 \r
-                               try {\r
+               }\r
+               return success;\r
+       }\r
 \r
-                                       String idQC = elQuantitativeCharacter.getAttributeValue("id");\r
-\r
-                                       // <Representation>\r
-                                       //  <Label>Leaf length</Label>\r
-                                       // </Representation>\r
-                                       Feature quantitativeCharacter = Feature.NewInstance();\r
-                                       quantitativeCharacter.setKindOf(Feature.DESCRIPTION());\r
-                                       importRepresentation(elQuantitativeCharacter, sddNamespace, quantitativeCharacter, idQC, sddConfig);\r
-\r
-                                       quantitativeCharacter.setSupportsQuantitativeData(true);\r
-\r
-                                       // <MeasurementUnit>\r
-                                       //  <Label role="Abbrev">m</Label>\r
-                                       // </MeasurementUnit>\r
-                                       Element elMeasurementUnit = elQuantitativeCharacter.getChild("MeasurementUnit",sddNamespace);\r
-                                       String label = "";\r
-                                       String role = "";\r
-                                       if (elMeasurementUnit != null) {\r
-                                               Element elLabel = elMeasurementUnit.getChild("Label",sddNamespace);\r
-                                               role = elLabel.getAttributeValue("role");\r
-                                               label = (String)ImportHelper.getXmlInputValue(elMeasurementUnit, "Label",sddNamespace);\r
-                                       }\r
+       /**\r
+        * @param sddNamespace\r
+        * @param sddConfig\r
+        * @param elCharacters\r
+        */\r
+       private boolean handleQuantitativeData(Namespace sddNamespace,  SDDImportConfigurator sddConfig, Element elCharacters) {\r
+               boolean success = true;\r
+               int j;\r
+               // <QuantitativeCharacter id="c2">\r
+               List<Element> elQuantitativeCharacters = elCharacters.getChildren("QuantitativeCharacter", sddNamespace);\r
+               j = 0;\r
+               //for each QuantitativeCharacter\r
+               for (Element elQuantitativeCharacter : elQuantitativeCharacters){\r
 \r
-                                       MeasurementUnit unit = null;\r
-                                       if (!label.equals("")){\r
-                                               if (role != null) {\r
-                                                       if (role.equals("Abbrev")){\r
-                                                               unit = MeasurementUnit.NewInstance(label,label,label);\r
-                                                       }\r
-                                               } else {\r
-                                                       unit = MeasurementUnit.NewInstance(label,label,label);\r
-                                               }\r
-                                       }\r
+                       try {\r
 \r
-                                       if (unit != null) {\r
-                                               units.put(idQC, unit);\r
-                                       }\r
+                               String idQC = elQuantitativeCharacter.getAttributeValue("id");\r
 \r
-                                       //<Default>\r
-                                       //  <MeasurementUnitPrefix>milli</MeasurementUnitPrefix>\r
-                                       //</Default>\r
-                                       Element elDefault = elQuantitativeCharacter.getChild("Default",sddNamespace);\r
-                                       if (elDefault != null) {\r
-                                               String measurementUnitPrefix = (String)ImportHelper.getXmlInputValue(elDefault, "MeasurementUnitPrefix",sddNamespace);\r
-                                               if (!measurementUnitPrefix.equals("")){\r
-                                                       defaultUnitPrefixes.put(idQC, measurementUnitPrefix);\r
+                               // <Representation>\r
+                               //  <Label>Leaf length</Label>\r
+                               // </Representation>\r
+                               Feature quantitativeCharacter = Feature.NewInstance();\r
+                               quantitativeCharacter.setKindOf(Feature.DESCRIPTION());\r
+                               importRepresentation(elQuantitativeCharacter, sddNamespace, quantitativeCharacter, idQC, sddConfig);\r
+\r
+                               quantitativeCharacter.setSupportsQuantitativeData(true);\r
+\r
+                               // <MeasurementUnit>\r
+                               //  <Label role="Abbrev">m</Label>\r
+                               // </MeasurementUnit>\r
+                               Element elMeasurementUnit = elQuantitativeCharacter.getChild("MeasurementUnit",sddNamespace);\r
+                               String label = "";\r
+                               String role = "";\r
+                               if (elMeasurementUnit != null) {\r
+                                       Element elLabel = elMeasurementUnit.getChild("Label",sddNamespace);\r
+                                       role = elLabel.getAttributeValue("role");\r
+                                       label = (String)ImportHelper.getXmlInputValue(elMeasurementUnit, "Label",sddNamespace);\r
+                               }\r
+\r
+                               MeasurementUnit unit = null;\r
+                               if (!label.equals("")){\r
+                                       if (role != null) {\r
+                                               if (role.equals("Abbrev")){\r
+                                                       unit = MeasurementUnit.NewInstance(label,label,label);\r
                                                }\r
+                                       } else {\r
+                                               unit = MeasurementUnit.NewInstance(label,label,label);\r
                                        }\r
+                               }\r
 \r
-                                       features.put(idQC, quantitativeCharacter);\r
+                               if (unit != null) {\r
+                                       units.put(idQC, unit);\r
+                               }\r
 \r
-                               } catch (Exception e) {\r
-                                       //FIXME\r
-                                       logger.warn("Import of QuantitativeCharacter " + j + " failed.");\r
-                                       success = false; \r
+                               //<Default>\r
+                               //  <MeasurementUnitPrefix>milli</MeasurementUnitPrefix>\r
+                               //</Default>\r
+                               Element elDefault = elQuantitativeCharacter.getChild("Default",sddNamespace);\r
+                               if (elDefault != null) {\r
+                                       String measurementUnitPrefix = (String)ImportHelper.getXmlInputValue(elDefault, "MeasurementUnitPrefix",sddNamespace);\r
+                                       if (! measurementUnitPrefix.equals("")){\r
+                                               defaultUnitPrefixes.put(idQC, measurementUnitPrefix);\r
+                                       }\r
                                }\r
 \r
-                               if ((++j % modCount) == 0){ logger.info("QuantitativeCharacters handled: " + j);}\r
+                               features.put(idQC, quantitativeCharacter);\r
 \r
+                       } catch (Exception e) {\r
+                               //FIXME\r
+                               logger.warn("Import of QuantitativeCharacter " + j + " failed.");\r
+                               success = false; \r
                        }\r
 \r
-                       // <TextCharacter id="c3">\r
-                       List<Element> elTextCharacters = elCharacters.getChildren("TextCharacter", sddNamespace);\r
-                       j = 0;\r
-                       //for each TextCharacter\r
-                       for (Element elTextCharacter : elTextCharacters){\r
+                       if ((++j % modCount) == 0){ logger.info("QuantitativeCharacters handled: " + j);}\r
 \r
-                               try {\r
+               }\r
+               return success;\r
+       }\r
 \r
-                                       String idTC = elTextCharacter.getAttributeValue("id");\r
+       private boolean handleTextCharacters(Namespace sddNamespace, SDDImportConfigurator sddConfig, Element elCharacters) {\r
+               boolean success = true;\r
+               int j;\r
+               // <TextCharacter id="c3">\r
+               List<Element> elTextCharacters = elCharacters.getChildren("TextCharacter", sddNamespace);\r
+               j = 0;\r
+               //for each TextCharacter\r
+               for (Element elTextCharacter : elTextCharacters){\r
 \r
-                                       // <Representation>\r
-                                       //  <Label xml:lang="en">Leaf features not covered by other characters</Label>\r
-                                       // </Representation>\r
-                                       Feature textCharacter = Feature.NewInstance();\r
-                                       textCharacter.setKindOf(Feature.DESCRIPTION());\r
-                                       importRepresentation(elTextCharacter, sddNamespace, textCharacter, idTC, sddConfig);\r
+                       try {\r
 \r
-                                       textCharacter.setSupportsTextData(true);\r
+                               String idTC = elTextCharacter.getAttributeValue("id");\r
 \r
-                                       features.put(idTC, textCharacter);\r
+                               // <Representation>\r
+                               //  <Label xml:lang="en">Leaf features not covered by other characters</Label>\r
+                               // </Representation>\r
+                               Feature textCharacter = Feature.NewInstance();\r
+                               textCharacter.setKindOf(Feature.DESCRIPTION());\r
+                               importRepresentation(elTextCharacter, sddNamespace, textCharacter, idTC, sddConfig);\r
 \r
-                               } catch (Exception e) {\r
-                                       //FIXME\r
-                                       logger.warn("Import of TextCharacter " + j + " failed.");\r
-                                       success = false; \r
-                               }\r
+                               textCharacter.setSupportsTextData(true);\r
 \r
-                               if ((++j % modCount) == 0){ logger.info("TextCharacters handled: " + j);}\r
+                               features.put(idTC, textCharacter);\r
 \r
+                       } catch (Exception e) {\r
+                               //FIXME\r
+                               logger.warn("Import of TextCharacter " + j + " failed.");\r
+                               success = false; \r
                        }\r
 \r
-               }\r
-\r
-               /*for (Iterator<Feature> f = features.values().iterator() ; f.hasNext() ;){\r
-                       featureSet.add(f.next()); //XIM Why this line ?\r
-               }*/\r
+                       if ((++j % modCount) == 0){ logger.info("TextCharacters handled: " + j);}\r
 \r
+               }\r
+               return success;\r
        }\r
 \r
        // imports the descriptions of taxa\r
-       protected void importCodedDescriptions(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\r
+       protected boolean importCodedDescriptions(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig){\r
+               boolean success = true;\r
+               \r
                // <CodedDescriptions>\r
                logger.info("start CodedDescriptions ...");\r
                Element elCodedDescriptions = elDataset.getChild("CodedDescriptions",sddNamespace);\r
-               // <CodedDescription id="D101">\r
                \r
-\r
-               ITaxonService taxonService = getTaxonService();\r
-\r
+               // <CodedDescription id="D101">\r
                if (elCodedDescriptions != null) {\r
                        List<Element> listCodedDescriptions = elCodedDescriptions.getChildren("CodedDescription", sddNamespace);\r
                        int j = 0;\r
                        //for each CodedDescription\r
-\r
                        for (Element elCodedDescription : listCodedDescriptions){\r
+                               success &= handleCodedDescription(sddNamespace, sddConfig, elCodedDescription, j);\r
+                               if ((++j % modCount) == 0){ logger.info("CodedDescriptions handled: " + j);}\r
+                       }\r
+               }\r
+               return success;\r
+       }\r
 \r
-                               try {\r
-\r
-                                       String idCD = elCodedDescription.getAttributeValue("id");\r
-\r
-                                       // <Representation>\r
-                                       //  <Label>&lt;i&gt;Viola hederacea&lt;/i&gt; Labill. as revised by R. Morris April 8, 2006</Label>\r
-                                       // </Representation>\r
-                                       TaxonDescription taxonDescription = TaxonDescription.NewInstance();\r
-                                       importRepresentation(elCodedDescription, sddNamespace, taxonDescription, idCD, sddConfig);\r
-\r
-                                       // <Scope>\r
-                                       //  <TaxonName ref="t1"/>\r
-                                       //  <Citation ref="p1" location="p. 30"/>\r
-                                       // </Scope>\r
-                                       Element elScope = elCodedDescription.getChild("Scope",sddNamespace);\r
-                                       String ref = "";\r
-                                       Taxon taxon = null;\r
-                                       if (elScope != null) {\r
-                                               Element elTaxonName = elScope.getChild("TaxonName",sddNamespace);\r
-                                               ref = elTaxonName.getAttributeValue("ref");\r
-                                               NonViralName taxonNameBase = taxonNameBases.get(ref);\r
-                                               \r
-                                               if(sddConfig.isDoMatchTaxa()){\r
-                                                       taxon = getTaxonService().findBestMatchingTaxon(taxonNameBase.getTitleCache());\r
-                                               }\r
-                                               \r
-                                               if(taxon != null){\r
-                                                       logger.info("using existing Taxon" + taxon.getTitleCache());\r
-                                                       if(!taxonNameBase.getUuid().equals(taxon.getName().getUuid())){\r
-                                                               logger.warn("TaxonNameBase entity of existing taxon does not match Name in list -> replacing Name in list");\r
-                                                               taxonNameBase = HibernateProxyHelper.deproxy(taxon.getName(), NonViralName.class);\r
-                                                       }                               \r
-                                               } else {                                                        \r
-                                                       logger.info("creating new Taxon from TaxonName" + taxonNameBase.getTitleCache());\r
-                                                       taxon = Taxon.NewInstance(taxonNameBase, sec);\r
-                                               }\r
-                                       }\r
-                                       \r
-                                       else {//in case no taxon is linked to the description, a new one is created\r
-                                               NonViralName tnb = NonViralName.NewInstance(null);\r
-                                               String id = new String(""+taxonNamesCount);\r
-                                               IdentifiableSource source = IdentifiableSource.NewInstance(id, "TaxonName");\r
-                                               importRepresentation(elCodedDescription, sddNamespace, tnb, id, sddConfig);\r
-                                               \r
-                                               if(sddConfig.isDoMatchTaxa()){\r
-                                                       taxon = getTaxonService().findBestMatchingTaxon(tnb.getTitleCache());\r
-                                               }\r
-                                               \r
-                                               if(taxon != null){\r
-                                                       tnb = HibernateProxyHelper.deproxy(taxon.getName(), NonViralName.class);\r
-//                                                     taxonNameBases.put(id ,tnb);\r
-//                                                     taxonNamesCount++;\r
-                                                       logger.info("using existing Taxon" + taxon.getTitleCache());\r
-                                               } else {\r
-                                                       tnb.addSource(source);\r
-                                                       taxonNameBases.put(id ,tnb);\r
-                                                       taxonNamesCount++;                                              \r
-                                                       logger.info("creating new Taxon from TaxonName" + tnb.getTitleCache());\r
-                                                       taxon = Taxon.NewInstance(tnb, sec);\r
-                                               }\r
-                                       }\r
+       /**\r
+        * @param sddNamespace\r
+        * @param sddConfig\r
+        * @param j\r
+        * @param elCodedDescription\r
+        * @return\r
+        */\r
+       private boolean handleCodedDescription(Namespace sddNamespace, SDDImportConfigurator sddConfig, Element elCodedDescription, int j) {\r
+               boolean success = true ;\r
+               try {\r
+\r
+                       String idCD = elCodedDescription.getAttributeValue("id");\r
+\r
+                       // <Representation>\r
+                       //  <Label>&lt;i&gt;Viola hederacea&lt;/i&gt; Labill. as revised by R. Morris April 8, 2006</Label>\r
+                       // </Representation>\r
+                       TaxonDescription taxonDescription = TaxonDescription.NewInstance();\r
+                       if (!generatorName.isEmpty()){\r
+                               Annotation annotation = Annotation.NewInstance(generatorName, AnnotationType.TECHNICAL(),Language.DEFAULT());\r
+                               taxonDescription.addAnnotation(annotation);\r
+                       }\r
+                       importRepresentation(elCodedDescription, sddNamespace, taxonDescription, idCD, sddConfig);\r
+\r
+                       // <Scope>\r
+                       //  <TaxonName ref="t1"/>\r
+                       //  <Citation ref="p1" location="p. 30"/>\r
+                       // </Scope>\r
+                       Element elScope = elCodedDescription.getChild("Scope", sddNamespace);\r
+                       Taxon taxon;\r
+                       if (elScope != null) {\r
+                               taxon = handleCDScope(sddNamespace, sddConfig, idCD, elScope);\r
+                       } else {//in case no taxon is linked to the description, a new one is created\r
+                               taxon = handleCDNoScope(sddNamespace, sddConfig, elCodedDescription);\r
+                       }\r
 \r
-                                       String refCitation = "";\r
-                                       String location = "";\r
+                       // <SummaryData>\r
+                       Element elSummaryData = elCodedDescription.getChild("SummaryData",sddNamespace);\r
+                       if (elSummaryData != null) {\r
+                               handleSummaryCategoricalData(sddNamespace, taxonDescription, elSummaryData);\r
+                               handleSummaryQuantitativeData(sddNamespace, taxonDescription, elSummaryData);\r
+                               handleSummaryTextData(sddNamespace, taxonDescription, elSummaryData);\r
+                       }\r
 \r
-                                       if (elScope != null) {\r
-                                               Element elCitation = elScope.getChild("Citation",sddNamespace);\r
-                                               if (elCitation != null) {\r
-                                                       refCitation = elCitation.getAttributeValue("ref");\r
-                                                       location = elCitation.getAttributeValue("location");\r
-                                               }\r
-                                       }\r
+                       if (taxon != null) {\r
+                               taxon.addDescription(taxonDescription);\r
+                       }\r
+//                     \r
+                       workingSet.addDescription(taxonDescription);\r
+                       \r
+//OLD                  taxonDescription.setDescriptiveSystem(featureSet);\r
 \r
-                                       // <SummaryData>\r
-                                       Element elSummaryData = elCodedDescription.getChild("SummaryData",sddNamespace);\r
-                                       if (elSummaryData != null) {\r
+                       taxonDescriptions.put(idCD, taxonDescription);//FIXME\r
 \r
-                                               // <Categorical ref="c4">\r
-                                               List<Element> elCategoricals = elSummaryData.getChildren("Categorical", sddNamespace);\r
-                                               int k = 0;\r
-                                               //for each Categorical\r
-                                               for (Element elCategorical : elCategoricals){\r
-                                                       if ((++k % modCount) == 0){ logger.warn("Categorical handled: " + (k-1));}\r
-                                                       ref = elCategorical.getAttributeValue("ref");\r
-                                                       Feature feature = features.get(ref);\r
-                                                       CategoricalData categoricalData = CategoricalData.NewInstance();\r
-                                                       categoricalData.setFeature(feature);\r
-\r
-                                                       // <State ref="s3"/>\r
-                                                       List<Element> elStates = elCategorical.getChildren("State", sddNamespace);\r
-                                                       int l = 0;\r
-                                                       \r
-                                                       //for each State\r
-                                                       for (Element elState : elStates){\r
-                                                               if ((++l % modCount) == 0){ logger.info("States handled: " + (l-1));}\r
-                                                               ref = elState.getAttributeValue("ref");\r
-                                                               State state = states.get(ref);\r
-                                                               if (state!=null) {\r
-                                                                       StateData stateData = StateData.NewInstance();\r
-                                                                       stateData.setState(state);\r
-                                                                       List<Element> elModifiers = elState.getChildren("Modifier", sddNamespace);\r
-                                                                       for (Element elModifier : elModifiers){\r
-                                                                               ref = elModifier.getAttributeValue("ref");\r
-                                                                               Modifier modifier = modifiers.get(ref);\r
-                                                                               if (modifier!=null) {\r
-                                                                                       stateData.addModifier(modifier);\r
-                                                                               }\r
-                                                                       }\r
-                                                               categoricalData.addState(stateData);\r
-                                                       }\r
-                                                       taxonDescription.addElement(categoricalData);\r
-                                               }\r
-                                               }\r
-                                               // <Quantitative ref="c2">\r
-                                               List<Element> elQuantitatives = elSummaryData.getChildren("Quantitative", sddNamespace);\r
-                                               k = 0;\r
-                                               //for each Quantitative\r
-                                               for (Element elQuantitative : elQuantitatives){\r
-                                                       if ((++k % modCount) == 0){ logger.warn("Quantitative handled: " + (k-1));}\r
-                                                       ref = elQuantitative.getAttributeValue("ref");\r
-                                                       Feature feature = features.get(ref);\r
-                                                       QuantitativeData quantitativeData = QuantitativeData.NewInstance();\r
-                                                       quantitativeData.setFeature(feature);\r
-\r
-                                                       MeasurementUnit unit = units.get(ref);\r
-                                                       String prefix = defaultUnitPrefixes.get(ref);\r
-                                                       if (unit != null) {\r
-                                                               String u = unit.getLabel();\r
-                                                               if (prefix != null) {\r
-                                                                       u = prefix + u;\r
-                                                               }\r
-                                                               unit.setLabel(u);\r
-                                                               quantitativeData.setUnit(unit);\r
-                                                       }\r
+               } catch (Exception e) {\r
+                       //FIXME\r
+                       logger.warn("Import of CodedDescription " + j + " failed.", e);\r
+                       success = false;\r
+               }\r
+               return success;\r
+       }\r
 \r
-                                                       // <Measure type="Min" value="2.3"/>\r
-                                                       List<Element> elMeasures = elQuantitative.getChildren("Measure", sddNamespace);\r
-                                                       int l = 0;\r
-                                                       \r
-                                                       //for each State\r
-                                                       for (Element elMeasure : elMeasures){\r
-                                                               if ((++l % modCount) == 0){ logger.info("States handled: " + (l-1));}\r
-                                                               String type = elMeasure.getAttributeValue("type");\r
-                                                               String value = elMeasure.getAttributeValue("value");\r
-                                                               if (value.contains(",")) {\r
-                                                                       value = value.replace(',', '.');\r
-                                                               }\r
-                                                               Float v = Float.parseFloat(value);\r
-                                                               //Float v = new Float(0);\r
-                                                               StatisticalMeasure t = null;\r
-                                                               if (type.equals("Min")) {\r
-                                                                       t = StatisticalMeasure.MIN();\r
-                                                               } else if (type.equals("Mean")) {\r
-                                                                       t = StatisticalMeasure.AVERAGE();\r
-                                                               } else if (type.equals("Max")) {\r
-                                                                       t = StatisticalMeasure.MAX();\r
-                                                               } else if (type.equals("SD")) {\r
-                                                                       t = StatisticalMeasure.STANDARD_DEVIATION();\r
-                                                               } else if (type.equals("N")) {\r
-                                                                       t = StatisticalMeasure.SAMPLE_SIZE();\r
-                                                               } else if (type.equals("UMethLower")) {\r
-                                                                       t = StatisticalMeasure.TYPICAL_LOWER_BOUNDARY();\r
-                                                               } else if (type.equals("UMethUpper")) {\r
-                                                                       t = StatisticalMeasure.TYPICAL_UPPER_BOUNDARY();\r
-                                                               } else if (type.equals("Var")) {\r
-                                                                       t = StatisticalMeasure.VARIANCE();\r
-                                                               } else {\r
-                                                                       t = StatisticalMeasure.NewInstance(type,type,type);\r
-                                                                       statisticalMeasures.add(t);\r
-                                                               }\r
+       /**\r
+        * @param sddNamespace\r
+        * @param sddConfig\r
+        * @param elCodedDescription\r
+        * @param taxon\r
+        * @return\r
+        */\r
+       private Taxon handleCDNoScope(Namespace sddNamespace,\r
+                       SDDImportConfigurator sddConfig, Element elCodedDescription     ) {\r
+               Taxon taxon = null;\r
+               NonViralName nonViralName = NonViralName.NewInstance(null);\r
+               String id = new String("" + taxonNamesCount);\r
+               IdentifiableSource source = IdentifiableSource.NewInstance(id, "TaxonName");\r
+               importRepresentation(elCodedDescription, sddNamespace, nonViralName, id, sddConfig);\r
+               \r
+               if(sddConfig.isDoMatchTaxa()){\r
+                       taxon = getTaxonService().findBestMatchingTaxon(nonViralName.getTitleCache());\r
+               }\r
+               \r
+               if(taxon != null){\r
+                       nonViralName = HibernateProxyHelper.deproxy(taxon.getName(), NonViralName.class);\r
+//                                                     taxonNameBases.put(id ,tnb);\r
+//                                                     taxonNamesCount++;\r
+                       logger.info("using existing Taxon " + taxon.getTitleCache());\r
+               } else {\r
+                       nonViralName.addSource(source);\r
+                       taxonNameBases.put(id ,nonViralName);\r
+                       taxonNamesCount++;                                              \r
+                       logger.info("creating new Taxon from TaxonName " + nonViralName.getTitleCache());\r
+                       taxon = Taxon.NewInstance(nonViralName, sec);\r
+               }\r
+               return taxon;\r
+       }\r
 \r
-                                                               StatisticalMeasurementValue statisticalValue = StatisticalMeasurementValue.NewInstance();\r
-                                                               statisticalValue.setValue(v);\r
-                                                               statisticalValue.setType(t);\r
-                                                               quantitativeData.addStatisticalValue(statisticalValue);\r
-                                                               featureData.add(statisticalValue);\r
-                                                       }\r
-                                                       taxonDescription.addElement(quantitativeData);\r
-                                               }\r
+       /**\r
+        * @param sddNamespace\r
+        * @param sddConfig\r
+        * @param idCD\r
+        * @param elScope\r
+        * @param taxon\r
+        * @return\r
+        */\r
+       private Taxon handleCDScope(Namespace sddNamespace, SDDImportConfigurator sddConfig, \r
+                       String idCD, Element elScope) {\r
+               Taxon taxon = null;\r
+               Element elTaxonName = elScope.getChild("TaxonName", sddNamespace);\r
+               String ref = elTaxonName.getAttributeValue("ref");\r
+               NonViralName nonViralName = taxonNameBases.get(ref);\r
+               \r
+               if(sddConfig.isDoMatchTaxa()){\r
+                       taxon = getTaxonService().findBestMatchingTaxon(nonViralName.getTitleCache());\r
+               }\r
+               \r
+               if(taxon != null){\r
+                       logger.info("using existing Taxon" + taxon.getTitleCache());\r
+                       if(!nonViralName.getUuid().equals(taxon.getName().getUuid())){\r
+                               logger.warn("TaxonNameBase entity of existing taxon does not match Name in list -> replacing Name in list");\r
+                               nonViralName = HibernateProxyHelper.deproxy(taxon.getName(), NonViralName.class);\r
+                       }                               \r
+               } else {                                                        \r
+                       logger.info("creating new Taxon from TaxonName '" + nonViralName.getTitleCache()+"'");\r
+                       taxon = Taxon.NewInstance(nonViralName, sec);\r
+               }\r
+               \r
+               //citation\r
+               Element elCitation = elScope.getChild("Citation",sddNamespace);\r
+               if (elCitation != null) {\r
+                       String refCitation = elCitation.getAttributeValue("ref");\r
+                       if (! refCitation.equals("")){\r
+                               citations.put(idCD, refCitation);\r
+                       }\r
+                       String location = elCitation.getAttributeValue("location");\r
+                       if (! location.equals("")){\r
+                               locations.put(idCD, location);\r
+                       }\r
+               }\r
+               return taxon;\r
+       }\r
 \r
-                                               // <TextChar ref="c3">\r
-                                               List<Element> elTextChars = elSummaryData.getChildren("TextChar", sddNamespace);\r
-                                               k = 0;\r
-                                               //for each TextChar\r
-                                               for (Element elTextChar : elTextChars){\r
-                                                       if ((++k % modCount) == 0){ logger.info("TextChar handled: " + (k-1));}\r
-                                                       ref = elTextChar.getAttributeValue("ref");\r
-                                                       Feature feature = features.get(ref);\r
-                                                       TextData textData = TextData.NewInstance();\r
-                                                       textData.setFeature(feature);\r
-\r
-                                                       // <Content>Free form text</Content>\r
-                                                       String content = (String)ImportHelper.getXmlInputValue(elTextChar, "Content",sddNamespace);\r
-                                                       textData.putText(content, datasetLanguage);\r
-                                                       taxonDescription.addElement(textData);\r
-                                               }\r
+       /**\r
+        * @param sddNamespace\r
+        * @param taxonDescription\r
+        * @param elSummaryData\r
+        */\r
+       private void handleSummaryTextData(Namespace sddNamespace,\r
+                       TaxonDescription taxonDescription, Element elSummaryData) {\r
+               String ref;\r
+               int k;\r
+               // <TextChar ref="c3">\r
+               List<Element> elTextChars = elSummaryData.getChildren("TextChar", sddNamespace);\r
+               k = 0;\r
+               //for each TextChar\r
+               for (Element elTextChar : elTextChars){\r
+                       if ((++k % modCount) == 0){ logger.info("TextChar handled: " + (k-1));}\r
+                       ref = elTextChar.getAttributeValue("ref");\r
+                       Feature feature = features.get(ref);\r
+                       TextData textData = TextData.NewInstance();\r
+                       textData.setFeature(feature);\r
+\r
+                       // <Content>Free form text</Content>\r
+                       String content = (String)ImportHelper.getXmlInputValue(elTextChar, "Content",sddNamespace);\r
+                       textData.putText(datasetLanguage, content);\r
+                       taxonDescription.addElement(textData);\r
+               }\r
+       }\r
 \r
-                                       }\r
+       /**\r
+        * @param sddNamespace\r
+        * @param taxonDescription\r
+        * @param elSummaryData\r
+        */\r
+       private void handleSummaryQuantitativeData(Namespace sddNamespace,\r
+                       TaxonDescription taxonDescription, Element elSummaryData) {\r
+               String ref;\r
+               int k;\r
+               // <Quantitative ref="c2">\r
+               List<Element> elQuantitatives = elSummaryData.getChildren("Quantitative", sddNamespace);\r
+               k = 0;\r
+               //for each Quantitative\r
+               for (Element elQuantitative : elQuantitatives){\r
+                       if ((++k % modCount) == 0){ logger.warn("Quantitative handled: " + (k-1));}\r
+                       ref = elQuantitative.getAttributeValue("ref");\r
+                       Feature feature = features.get(ref);\r
+                       QuantitativeData quantitativeData = QuantitativeData.NewInstance();\r
+                       quantitativeData.setFeature(feature);\r
+\r
+                       MeasurementUnit unit = units.get(ref);\r
+                       String prefix = defaultUnitPrefixes.get(ref);\r
+                       if (unit != null) {\r
+                               String u = unit.getLabel();\r
+                               if (prefix != null) {\r
+                                       u = prefix + u;\r
+                               }\r
+                               unit.setLabel(u);\r
+                               quantitativeData.setUnit(unit);\r
+                       }\r
 \r
-                                       if (taxon != null) {\r
-                                               taxon.addDescription(taxonDescription);\r
-                                       }\r
+                       // <Measure type="Min" value="2.3"/>\r
+                       List<Element> elMeasures = elQuantitative.getChildren("Measure", sddNamespace);\r
+                       int l = 0;\r
+                       \r
+                       //for each State\r
+                       for (Element elMeasure : elMeasures){\r
+                               if ((++l % modCount) == 0){ logger.info("States handled: " + (l-1));}\r
+                               String type = elMeasure.getAttributeValue("type");\r
+                               String value = elMeasure.getAttributeValue("value");\r
+                               if (value.contains(",")) {\r
+                                       value = value.replace(',', '.');\r
+                               }\r
+                               Float v = Float.parseFloat(value);\r
+                               //Float v = new Float(0);\r
+                               StatisticalMeasure t = null;\r
+                               if (type.equals("Min")) {\r
+                                       t = StatisticalMeasure.MIN();\r
+                               } else if (type.equals("Mean")) {\r
+                                       t = StatisticalMeasure.AVERAGE();\r
+                               } else if (type.equals("Max")) {\r
+                                       t = StatisticalMeasure.MAX();\r
+                               } else if (type.equals("SD")) {\r
+                                       t = StatisticalMeasure.STANDARD_DEVIATION();\r
+                               } else if (type.equals("N")) {\r
+                                       t = StatisticalMeasure.SAMPLE_SIZE();\r
+                               } else if (type.equals("UMethLower")) {\r
+                                       t = StatisticalMeasure.TYPICAL_LOWER_BOUNDARY();\r
+                               } else if (type.equals("UMethUpper")) {\r
+                                       t = StatisticalMeasure.TYPICAL_UPPER_BOUNDARY();\r
+                               } else if (type.equals("Var")) {\r
+                                       t = StatisticalMeasure.VARIANCE();\r
+                               } else {\r
+                                       t = StatisticalMeasure.NewInstance(type,type,type);\r
+                                       statisticalMeasures.add(t);\r
+                               }\r
 \r
-                                       if (!refCitation.equals("")){\r
-                                               citations.put(idCD,refCitation);\r
-                                       }\r
+                               StatisticalMeasurementValue statisticalValue = StatisticalMeasurementValue.NewInstance();\r
+                               statisticalValue.setValue(v);\r
+                               statisticalValue.setType(t);\r
+                               quantitativeData.addStatisticalValue(statisticalValue);\r
+                               featureData.add(statisticalValue);\r
+                       }\r
+                       taxonDescription.addElement(quantitativeData);\r
+               }\r
+       }\r
 \r
-                                       if (!location.equals("")){\r
-                                               locations.put(idCD, location);\r
+       /**\r
+        * @param sddNamespace\r
+        * @param taxonDescription\r
+        * @param elSummaryData\r
+        */\r
+       private void handleSummaryCategoricalData(Namespace sddNamespace,\r
+                       TaxonDescription taxonDescription, Element elSummaryData) {\r
+               String ref;\r
+               // <Categorical ref="c4">\r
+               List<Element> elCategoricals = elSummaryData.getChildren("Categorical", sddNamespace);\r
+               int k = 0;\r
+               //for each Categorical\r
+               for (Element elCategorical : elCategoricals){\r
+                       if ((++k % modCount) == 0){ logger.warn("Categorical handled: " + (k-1));}\r
+                       ref = elCategorical.getAttributeValue("ref");\r
+                       Feature feature = features.get(ref);\r
+                       CategoricalData categoricalData = CategoricalData.NewInstance();\r
+                       categoricalData.setFeature(feature);\r
+\r
+                       // <State ref="s3"/>\r
+                       List<Element> elStates = elCategorical.getChildren("State", sddNamespace);\r
+                       int l = 0;\r
+                       \r
+                       //for each State\r
+                       for (Element elState : elStates){\r
+                               if ((++l % modCount) == 0){ logger.info("States handled: " + (l-1));}\r
+                               ref = elState.getAttributeValue("ref");\r
+                               State state = states.get(ref);\r
+                               if (state != null) {\r
+                                       StateData stateData = StateData.NewInstance();\r
+                                       stateData.setState(state);\r
+                                       List<Element> elModifiers = elState.getChildren("Modifier", sddNamespace);\r
+                                       for (Element elModifier : elModifiers){\r
+                                               ref = elModifier.getAttributeValue("ref");\r
+                                               Modifier modifier = modifiers.get(ref);\r
+                                               if (modifier != null) {\r
+                                                       stateData.addModifier(modifier);\r
+                                               }\r
                                        }\r
-                                       \r
-                                       taxonDescription.setDescriptiveSystem(featureSet);\r
-\r
-                                       taxonDescriptions.put(idCD, taxonDescription);//FIXME\r
-\r
-                               } catch (Exception e) {\r
-                                       //FIXME\r
-                                       logger.warn("Import of CodedDescription " + j + " failed.", e);\r
-                                       success = false;\r
+                                       categoricalData.addState(stateData);\r
                                }\r
-                               if ((++j % modCount) == 0){ logger.info("CodedDescriptions handled: " + j);}\r
-\r
+                               taxonDescription.addElement(categoricalData);\r
                        }\r
-\r
                }\r
        }\r
 \r
@@ -1370,7 +1515,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                try {\r
 \r
                                        String idP = elPublication.getAttributeValue("id");\r
-                                       ReferenceBase publication = ReferenceFactory.newArticle();\r
+                                       Reference publication = ReferenceFactory.newArticle();\r
                                        importRepresentation(elPublication, sddNamespace, publication, idP, sddConfig);\r
 \r
                                        publications.put(idP,publication);\r
@@ -1425,7 +1570,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                                URL url = new URL(href);\r
                                                                \r
                                                                imageMetaData.readMetaData(url.toURI(), 0);\r
-                                                               image = ImageFile.NewInstance(url.toString(), null, imageMetaData);\r
+                                                               image = ImageFile.NewInstance(url.toURI(), null, imageMetaData);\r
                                                        } catch (MalformedURLException e) {\r
                                                                logger.error("Malformed URL", e);\r
                                                        }\r
@@ -1433,11 +1578,10 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                        String sns = sddConfig.getSourceNameString();\r
                                                        File f = new File(sns);\r
                                                        File parent = f.getParentFile();\r
-                                                       String fi = href;\r
-                                                       //String fi = parent.toString() + File.separator + href; //TODO erase file:/\r
+                                                       String fi = parent.toString() + File.separator + href;\r
                                                        File file = new File(fi);\r
-                                                       imageMetaData.readMetaData(file.toURI(), 0);\r
-                                                       image = ImageFile.NewInstance(file.toString(), null, imageMetaData);\r
+                                                       imageMetaData.readMetaData(new URI(fi), 0); //file\r
+                                                       image = ImageFile.NewInstance(file.toURI(), null, imageMetaData);\r
                                                }\r
                                                MediaRepresentation representation = MediaRepresentation.NewInstance(imageMetaData.getMimeType(), null);\r
                                                representation.addRepresentationPart(image);\r
@@ -1460,10 +1604,10 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                                        //                                                                                      dtb.addMedia(me);\r
                                                                        //                                                                              }\r
                                                                        //                                                                      }\r
-                                                               } else if (lcb.get(k) instanceof ReferenceBase) {\r
-                                                                       ReferenceBase rb = (ReferenceBase) lcb.get(k);\r
-                                                                       //} else if (lcb.get(0) instanceof ReferenceBase) {\r
-                                                                       //ReferenceBase rb = (ReferenceBase) lcb.get(0);\r
+                                                               } else if (lcb.get(k) instanceof Reference) {\r
+                                                                       Reference rb = (Reference) lcb.get(k);\r
+                                                                       //} else if (lcb.get(0) instanceof Reference) {\r
+                                                                       //Reference rb = (Reference) lcb.get(0);\r
                                                                        // rb.setTitleCache(label);\r
                                                                        //                                                                      if (rb!=null) {\r
                                                                        //                                                                              if (k == 0) {\r
@@ -1474,10 +1618,12 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                                        //                                                                                      rb.addMedia(me);\r
                                                                        //                                                                              }\r
                                                                        //                                                                      }\r
-                                                               }/* else if (lcb.get(k) instanceof TaxonNameBase){\r
-                                                                       TaxonNameBase tb = (TaxonNameBase) lcb.get(k);\r
-                                                                       tb.addMedia(media);\r
-                                                       }*/\r
+//                                                              else if (lcb.get(k) instanceof TaxonNameBase){\r
+//                                                                     TaxonNameBase tb = (TaxonNameBase) lcb.get(k);\r
+//                                                                     tb.addMedia(media);\r
+                                                               } else {\r
+                                                                       logger.warn("Can't handle associated media for " + lcb.get(k).getId() + "(" +  lcb.get(k).getClass().getSimpleName()+")"  );\r
+                                                               }\r
                                                        }\r
                                                }\r
                                        }\r
@@ -1537,7 +1683,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                Element elModifiers = elDescriptiveConcept.getChild("Modifiers", sddNamespace);\r
                                        if (elModifiers !=null){\r
                                                List<Element> listModifiers = elModifiers.getChildren("Modifier", sddNamespace);\r
-                                                       TermVocabulary<Modifier> termVocabularyState = new TermVocabulary<Modifier>();\r
+                                                       TermVocabulary<Modifier> termVocabularyState = TermVocabulary.NewInstance(null, null, null, null);\r
                                                for (Element elModifier : listModifiers) {\r
                                                                Modifier modif = Modifier.NewInstance();\r
                                                                String idmod = elModifier.getAttributeValue("id");\r
@@ -1553,7 +1699,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                        }\r
                                }\r
                                catch (Exception e) {\r
-                                       logger.warn("Import of DescriptiveConcept " + j + " failed.");\r
+                                       logger.warn("Import of DescriptiveConcept " + j + " failed: " + e.getMessage());\r
                                }\r
                                if ((++j % modCount) == 0){ logger.info("DescriptiveConcepts handled: " + j);}\r
 \r
@@ -1576,80 +1722,23 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                        String label = (String)ImportHelper.getXmlInputValue(elRepresentation,"Label",sddNamespace);\r
                                        //Element elDesignedFor = elCharacterTree.getChild("DesignedFor",sddNamespace);//TODO ?\r
 \r
-                                               FeatureTree feattree =  FeatureTree.NewInstance();\r
-                                               importRepresentation(elCharacterTree, sddNamespace, feattree, "", sddConfig);\r
-                                               FeatureNode root = feattree.getRoot();\r
-                                               List<Element> listelNodes = elCharacterTree.getChildren("Nodes", sddNamespace);\r
+                                       FeatureTree featureTree =  FeatureTree.NewInstance();\r
+                                       importRepresentation(elCharacterTree, sddNamespace, featureTree, "", sddConfig);\r
+                                       FeatureNode root = featureTree.getRoot();\r
+                                       List<Element> listeOfNodes = elCharacterTree.getChildren("Nodes", sddNamespace);\r
 \r
                                        //Nodes of CharacterTrees in SDD always refer to DescriptiveConcepts\r
-                                               for (Element elNodes : listelNodes) {\r
-                                                       List<Element> listNodes = elNodes.getChildren("Node", sddNamespace);\r
-                                                       if (listNodes != null) {\r
-                                                               for (Element elNode : listNodes){\r
-                                                                       String idN = elNode.getAttributeValue("id");\r
-                                                                       FeatureNode fn = null;\r
-                                                               Feature dc = null;\r
-                                                               if (idN!=null) {\r
-                                                                       // DescriptiveConcepts are used as nodes in CharacterTrees\r
-                                                                               Element elDescriptiveConcept = elNode.getChild("DescriptiveConcept", sddNamespace);\r
-                                                                               if (elDescriptiveConcept != null){\r
-                                                                                       String refDC = elDescriptiveConcept.getAttributeValue("ref");\r
-                                                                               dc = features.get(refDC);\r
-                                                                               fn = FeatureNode.NewInstance(dc);\r
-                                                                               }\r
-                                                                       if (fn==null){\r
-                                                                                       fn = FeatureNode.NewInstance();\r
-                                                                               }\r
-                                                                               Element elParent = elNode.getChild("Parent", sddNamespace);\r
-                                                                       // in SDD links between Nodes are referenced by the <Parent> tag\r
-                                                                               if (elParent!=null){\r
-                                                                                       String refP = elParent.getAttributeValue("ref");\r
-                                                                               if (refP!=null) {\r
-                                                                                       FeatureNode parent = featureNodes.get(refP);\r
-                                                                                       if (parent==null){\r
-                                                                                               root.addChild(fn); // if no parent found or the reference is broken, add the node to the root of the tree\r
-                                                                                       }\r
-                                                                                       else {\r
-                                                                                               parent.addChild(fn);\r
-                                                                                       }\r
-                                                                               }\r
-                                                                       }\r
-                                                                               else {\r
-                                                                               root.addChild(fn); // if no parent found or the reference is broken, add the node to the root of the tree\r
-                                                                               }\r
-                                                                       }\r
-                                                               featureNodes.put(idN, fn);\r
-                                                               }\r
-                                               }\r
-\r
-                                               // Leaves of CharacterTrees in SDD are always CharNodes (referring to Characters)\r
-                                                               List<Element> listCharNodes = elNodes.getChildren("CharNode", sddNamespace);\r
-                                               if (listCharNodes != null) {\r
-                                                               for (Element elCharNode : listCharNodes){\r
-                                                                       Element elParent = elCharNode.getChild("Parent", sddNamespace);\r
-                                                                       Element elCharacter = elCharNode.getChild("Character", sddNamespace);                                                   \r
-                                                                       FeatureNode fn = FeatureNode.NewInstance();\r
-                                                                       if (elParent!=null){\r
-                                                                               String refP = elParent.getAttributeValue("ref");\r
-                                                                               if ((refP!=null)&&(!refP.equals(""))) {\r
-                                                                               FeatureNode parent = featureNodes.get(refP);\r
-                                                                                       if (parent==null){\r
-                                                                                       parent = root; // if no parent found or the reference is broken, add the node to the root of the tree\r
-                                                                                       }\r
-                                                                                       parent.addChild(fn);\r
-                                                                               }\r
-                                                                       }\r
-                                                                       String refC = elCharacter.getAttributeValue("ref");\r
-                                                                       if ((refC!=null)&&(!refC.equals(""))){\r
-                                                                               Feature character = features.get(refC);\r
-                                                                               fn.setFeature(character);\r
-                                                               featureNodes.put(refC, fn);\r
-                                                                       }\r
-                                                       }               \r
-                                                                       }\r
-                                                               }\r
-                                               featureTrees.add(feattree);\r
+                                       for (Element elNodes : listeOfNodes) {\r
+                                               handleCharacterNodes(sddNamespace, root, elNodes);\r
                                        }\r
+                                       featureTrees.add(featureTree);\r
+                                       if (workingSet.getDescriptiveSystem() != null){\r
+                                               //TODO how to handle multiple \r
+                                               logger.warn("Multiple feature trees not yet supported");\r
+                                       }else{\r
+                                               workingSet.setDescriptiveSystem(featureTree);\r
+                                       }\r
+                               }\r
 \r
                                catch (Exception e) {\r
                                        logger.warn("Import of Character tree " + j + " failed.");\r
@@ -1662,6 +1751,105 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                }\r
        }\r
 \r
+       /**\r
+        * @param sddNamespace\r
+        * @param root\r
+        * @param elNodes\r
+        */\r
+       private void handleCharacterNodes(Namespace sddNamespace, FeatureNode root, Element elNodes) {\r
+               List<Element> listNodes = elNodes.getChildren("Node", sddNamespace);\r
+               if (listNodes != null) {\r
+                       for (Element elNode : listNodes){\r
+                               String idN = elNode.getAttributeValue("id");\r
+                               FeatureNode fn = null;\r
+                               Feature dc = null;\r
+                               if (idN!=null) {\r
+                                       // DescriptiveConcepts are used as nodes in CharacterTrees\r
+                                       Element elDescriptiveConcept = elNode.getChild("DescriptiveConcept", sddNamespace);\r
+                                       if (elDescriptiveConcept != null){\r
+                                               String refDC = elDescriptiveConcept.getAttributeValue("ref");\r
+                                               dc = features.get(refDC);\r
+                                               fn = FeatureNode.NewInstance(dc);\r
+                                       }\r
+                                       if (fn==null){\r
+                                               fn = FeatureNode.NewInstance();\r
+                                       }\r
+                                       Element elParent = elNode.getChild("Parent", sddNamespace);\r
+                                       // in SDD links between Nodes are referenced by the <Parent> tag\r
+                                       if (elParent!=null){\r
+                                               String refP = elParent.getAttributeValue("ref");\r
+                                               if (refP!=null) {\r
+                                                       FeatureNode parent = featureNodes.get(refP);\r
+                                                       if (parent==null){\r
+                                                               root.addChild(fn); // if no parent found or the reference is broken, add the node to the root of the tree\r
+                                                       }\r
+                                                       else {\r
+                                                               parent.addChild(fn);\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       else {\r
+                                               root.addChild(fn); // if no parent found or the reference is broken, add the node to the root of the tree\r
+                                       }\r
+                               }\r
+                               featureNodes.put(idN, fn);\r
+                       }\r
+               }\r
+\r
+               // Leaves of CharacterTrees in SDD are always CharNodes (referring to Characters)\r
+               List<Element> listCharNodes = elNodes.getChildren("CharNode", sddNamespace);\r
+               if (listCharNodes != null) {\r
+                       for (Element elCharNode : listCharNodes){\r
+                               Element elParent = elCharNode.getChild("Parent", sddNamespace);\r
+                               Element elCharacter = elCharNode.getChild("Character", sddNamespace);\r
+                               Element elDependencyRules = elCharNode.getChild("DependencyRules", sddNamespace);\r
+                               FeatureNode fn = FeatureNode.NewInstance();\r
+                               \r
+                               if (elDependencyRules!=null){\r
+                                       Element elInapplicableIf = elCharNode.getChild("InapplicableIf", sddNamespace);\r
+                                       if (elInapplicableIf!=null){\r
+                                               List<Element> listStates = elInapplicableIf.getChildren("State", sddNamespace);\r
+                                               for (Element stateElement : listStates) {\r
+                                                       String refState = stateElement.getAttributeValue("ref");\r
+                                                       if ((refState!=null)&&(!refState.equals(""))) {\r
+                                                               State state = states.get(refState);\r
+                                                               fn.addInapplicableState(state);\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       Element elOnlyapplicableIf = elCharNode.getChild("OnlyApplicableIf", sddNamespace);\r
+                                       if (elOnlyapplicableIf!=null){\r
+                                               List<Element> listStates = elInapplicableIf.getChildren("State", sddNamespace);\r
+                                               for (Element stateElement : listStates) {\r
+                                                       String refState = stateElement.getAttributeValue("ref");\r
+                                                       if ((refState!=null)&&(!refState.equals(""))) {\r
+                                                               State state = states.get(refState);\r
+                                                               fn.addApplicableState(state);\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                               \r
+                               if (elParent!=null){\r
+                                       String refP = elParent.getAttributeValue("ref");\r
+                                       if ((refP!=null)&&(!refP.equals(""))) {\r
+                                       FeatureNode parent = featureNodes.get(refP);\r
+                                               if (parent==null){\r
+                                               parent = root; // if no parent found or the reference is broken, add the node to the root of the tree\r
+                                               }\r
+                                               parent.addChild(fn);\r
+                                       }\r
+                               }\r
+                               String refC = elCharacter.getAttributeValue("ref");\r
+                               if ((refC!=null)&&(!refC.equals(""))){\r
+                                       Feature character = features.get(refC);\r
+                                       fn.setFeature(character);\r
+                                       featureNodes.put(refC, fn);\r
+                               }\r
+                       }               \r
+               }\r
+       }\r
+\r
        // imports the <TaxonHierarchies> block\r
        protected void importTaxonHierarchies(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\r
 \r
@@ -1675,10 +1863,10 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                try {\r
                                        Element elRepresentation = elTaxonHierarchy.getChild("Representation",sddNamespace);\r
                                        String label = (String)ImportHelper.getXmlInputValue(elRepresentation,"Label",sddNamespace);\r
-                                               TaxonomicTree taxonomicTree =  TaxonomicTree.NewInstance(label);\r
-                                               importRepresentation(elTaxonHierarchy, sddNamespace, taxonomicTree, "", sddConfig);\r
+                                               Classification classification =  Classification.NewInstance(label);\r
+                                               importRepresentation(elTaxonHierarchy, sddNamespace, classification, "", sddConfig);\r
                                        \r
-                                               Set<TaxonNode> root = taxonomicTree.getChildNodes();\r
+                                               Set<TaxonNode> root = classification.getChildNodes();\r
                                                Element elNodes = elTaxonHierarchy.getChild("Nodes", sddNamespace); // There can be only one <Nodes> block for TaxonHierarchies\r
                                                List<Element> listNodes = elNodes.getChildren("Node", sddNamespace);\r
                                                \r
@@ -1700,13 +1888,13 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                                        }\r
                                                                }\r
                                                                else {\r
-                                                                       TaxonNode tn = taxonomicTree.addChildTaxon(taxon, sec, "", Synonym.NewInstance(tnb, sec)); // if no parent found or the reference is broken, add the node to the root of the tree\r
+                                                                       TaxonNode tn = classification.addChildTaxon(taxon, sec, "", Synonym.NewInstance(tnb, sec)); // if no parent found or the reference is broken, add the node to the root of the tree\r
                                                                        taxonNodes.put(idN,tn);\r
                                                                }\r
                                                        }\r
                                                }\r
 \r
-                                               taxonomicTrees.add(taxonomicTree);\r
+                                               classifications.add(classification);\r
                                        }\r
 \r
                                catch (Exception e) {\r