(no commit message)
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / sdd / SDDDescriptionIO.java
index 5ca49450aaf218b66cd06398a3acf7f76489d78d..4702340781ae208b539645398b1a9125b6f41662 100644 (file)
@@ -1,8 +1,21 @@
+/**\r
+ * Copyright (C) 2007 EDIT\r
+ * European Distributed Institute of Taxonomy \r
+ * http://www.e-taxonomy.eu\r
+ * \r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
+\r
 package eu.etaxonomy.cdm.io.sdd;\r
 \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.GregorianCalendar;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
 import java.util.Iterator;\r
@@ -14,74 +27,437 @@ import org.apache.log4j.Logger;
 import org.jdom.Element;\r
 import org.jdom.Namespace;\r
 import org.joda.time.DateTime;\r
+import org.springframework.stereotype.Component;\r
 import org.springframework.transaction.TransactionStatus;\r
 \r
+import eu.etaxonomy.cdm.api.service.IAgentService;\r
+import eu.etaxonomy.cdm.api.service.IVersionableService;//rajout\r
 import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
 import eu.etaxonomy.cdm.api.service.IReferenceService;\r
 import eu.etaxonomy.cdm.api.service.ITermService;\r
-import eu.etaxonomy.cdm.io.common.ICdmIO;\r
+import eu.etaxonomy.cdm.common.mediaMetaData.ImageMetaData;\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.common.MapWrapper;\r
+import eu.etaxonomy.cdm.model.agent.Contact;\r
+import eu.etaxonomy.cdm.model.agent.Institution;\r
 import eu.etaxonomy.cdm.model.agent.Person;\r
+import eu.etaxonomy.cdm.model.agent.Address;//rajout\r
 import eu.etaxonomy.cdm.model.agent.Team;\r
 import eu.etaxonomy.cdm.model.common.Annotation;\r
+import eu.etaxonomy.cdm.model.common.AnnotationType;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
+import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
+import eu.etaxonomy.cdm.model.common.IdentifiableSource;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
-import eu.etaxonomy.cdm.model.common.OriginalSource;\r
+import eu.etaxonomy.cdm.model.common.LanguageString;\r
+import eu.etaxonomy.cdm.model.common.Marker;\r
+import eu.etaxonomy.cdm.model.common.MarkerType;\r
+import eu.etaxonomy.cdm.model.common.Representation;\r
+import eu.etaxonomy.cdm.model.common.TermBase;\r
 import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
+import eu.etaxonomy.cdm.model.common.User;\r
 import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
 import eu.etaxonomy.cdm.model.description.CategoricalData;\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
+import eu.etaxonomy.cdm.model.description.FeatureNode;\r
+import eu.etaxonomy.cdm.model.description.FeatureTree;\r
 import eu.etaxonomy.cdm.model.description.MeasurementUnit;\r
 import eu.etaxonomy.cdm.model.description.QuantitativeData;\r
 import eu.etaxonomy.cdm.model.description.State;\r
+import eu.etaxonomy.cdm.model.description.StateData;\r
 import eu.etaxonomy.cdm.model.description.StatisticalMeasure;\r
 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.Modifier;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
+import eu.etaxonomy.cdm.model.media.ImageFile;\r
+import eu.etaxonomy.cdm.model.media.Media;\r
+import eu.etaxonomy.cdm.model.media.MediaRepresentation;\r
+import eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity;\r
+import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;\r
 import eu.etaxonomy.cdm.model.media.Rights;\r
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
-import eu.etaxonomy.cdm.model.reference.Article;\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.IDatabase;\r
+import eu.etaxonomy.cdm.model.reference.IGeneric;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-\r
-\r
-public class SDDDescriptionIO  extends SDDIoBase implements ICdmIO {\r
+import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
+\r
+/**\r
+ * @author h.fradin\r
+ * @created 24.10.2008\r
+ * @version 1.0\r
+ */\r
+@Component("sddDescriptionIO")\r
+public class SDDDescriptionIO extends CdmImportBase<SDDImportConfigurator, SDDImportState> implements ICdmImport<SDDImportConfigurator, SDDImportState> {\r
        private static final Logger logger = Logger.getLogger(SDDDescriptionIO.class);\r
 \r
        private static int modCount = 1000;\r
 \r
+       private Map<String,Person> authors = new HashMap<String,Person>();\r
+       private Map<String,String> citations = new HashMap<String,String>();\r
+       private Map<String,String> defaultUnitPrefixes = new HashMap<String,String>();\r
+       private Map<String,Person> editors = new HashMap<String,Person>();\r
+       private Map<String,FeatureNode> featureNodes = new HashMap<String,FeatureNode>();\r
+       private Map<String,Feature> features = new HashMap<String,Feature>();\r
+       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,FeatureNode> nodes = new HashMap<String,FeatureNode>();\r
+       private Map<String,ReferenceBase> publications = new HashMap<String,ReferenceBase>();\r
+       private Map<String,StateData> stateDatas = new HashMap<String,StateData>();\r
+       private Map<String,TaxonDescription> taxonDescriptions = new HashMap<String,TaxonDescription>();\r
+       private Map<String,NonViralName> taxonNameBases = new HashMap<String,NonViralName>();\r
+       private Map<String,MeasurementUnit> units = new HashMap<String,MeasurementUnit>();\r
+       private Map<String,TaxonNode> taxonNodes = new HashMap<String,TaxonNode>();\r
+       private Map<String,NamedArea> namedAreas = new HashMap<String,NamedArea>();\r
+       private Map<String,Specimen> specimens = new HashMap<String,Specimen>();\r
+\r
+       private Set<AnnotationType> annotationTypes = new HashSet<AnnotationType>();\r
+       private Set<Feature> featureSet = new HashSet<Feature>();\r
+       ReferenceFactory refFactory = ReferenceFactory.newInstance();\r
+       private ReferenceBase sec = refFactory.newDatabase();\r
+       private ReferenceBase sourceReference = null;\r
+\r
+       private Language datasetLanguage = 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
+       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
+\r
+       private Rights copyright = null;\r
+\r
+       private int taxonNamesCount = 0; //XIM ajout\r
+       \r
+       \r
        public SDDDescriptionIO(){\r
                super();\r
        }\r
 \r
        @Override\r
-       public boolean doCheck(IImportConfigurator config){\r
+       public boolean doCheck(SDDImportState state){\r
                boolean result = true;\r
                logger.warn("No check implemented for SDD");\r
                return result;\r
        }\r
 \r
+       //      @Override\r
+       //      public boolean doInvoke(IImportConfigurator config, Map<String, MapWrapper<? extends CdmBase>> stores){\r
        @Override\r
-       public boolean doInvoke(IImportConfigurator config, Map<String, MapWrapper<? extends CdmBase>> stores){\r
+       public boolean doInvoke(SDDImportState state){\r
 \r
-               String value;\r
-               logger.info("start Datasets ...");\r
-               SDDImportConfigurator sddConfig = (SDDImportConfigurator)config;\r
+               TransactionStatus ts = startTransaction();\r
+               SDDImportConfigurator sddConfig = state.getConfig();\r
 \r
+               logger.info("start Datasets ...");\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
-               boolean success =true;\r
-\r
+               boolean success = true;\r
                Namespace sddNamespace = sddConfig.getSddNamespace();\r
-               Namespace xmlNamespace = Namespace.getNamespace("xml","http://www.w3.org/XML/1998/namespace");\r
 \r
                logger.info("start TechnicalMetadata ...");\r
                // <TechnicalMetadata created="2006-04-20T10:00:00">\r
+               importTechnicalMetadata(root, sddNamespace, sddConfig);\r
+               List<Element> elDatasets = root.getChildren("Dataset",sddNamespace);\r
+               int i = 0;\r
+\r
+               //for each Dataset\r
+               logger.info("start Dataset ...");\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
+               }\r
+               commitTransaction(ts);\r
+               return success;\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
+        */\r
+       protected boolean isIgnore(SDDImportState state){\r
+               return false;\r
+       }\r
+\r
+\r
+       // 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
+                                       List<CdmBase> lcb = new ArrayList<CdmBase>();\r
+                                       lcb.add(cb);\r
+                                       mediaObject_ListCdmBase.put(refMO,lcb);\r
+                               } else {\r
+                                       List<CdmBase> lcb = mediaObject_ListCdmBase.get(refMO);\r
+                                       lcb.add(cb);\r
+                                       mediaObject_ListCdmBase.put(refMO,lcb);\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       // imports information about the Dataset\r
+       protected void importDatasetRepresentation(Element parent, Namespace sddNamespace){\r
+               logger.info("start Representation ...");\r
+               /* <Representation>\r
+                       <Label>The Genus Viola</Label>\r
+                       <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
+               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
+               sec.setTitleCache(label);\r
+\r
+               if (detail != null) {\r
+                       Annotation annotation = Annotation.NewInstance(detail, datasetLanguage);\r
+                       annotation.setAnnotationType(AnnotationType.EDITORIAL());\r
+                       sec.addAnnotation(annotation);\r
+               }\r
+\r
+               List<Element> listMediaObjects = elRepresentation.getChildren("MediaObject",sddNamespace);\r
+\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
+                       if (ref != null) {\r
+                               if (!ref.equals("")) {\r
+                                       this.associateImageWithCdmBase(ref,sourceReference);\r
+                                       this.associateImageWithCdmBase(ref,sec);\r
+                                       mediaObject_Role.put(ref,role);\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       // 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
+               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
+                       }\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
+               for (Element elDetail : listDetails){\r
+                       String lang = elDetail.getAttributeValue("lang",xmlNamespace);\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
+               if (ve instanceof TermBase) {\r
+                       TermBase tb = (TermBase) 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.size()>0){\r
+                                       if (labDet.size()>1) {\r
+                                               tb.addRepresentation(Representation.NewInstance(labDet.get(1), labDet.get(0), labDet.get(0), lang));\r
+                                       } else {\r
+                                               tb.addRepresentation(Representation.NewInstance(labDet.get(0), labDet.get(0), labDet.get(0), lang));\r
+                                       }\r
+                               }\r
+                               ve = tb;\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
+               //XIM else if\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
+\r
+                       ie.setTitleCache(labDet.get(0));\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
+\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
+                               //  <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
+                                       try {\r
+\r
+                                               String rel = elLink.getAttributeValue("rel");\r
+                                               String href = elLink.getAttributeValue("href");\r
+\r
+                                               mr.addRepresentationPart(MediaRepresentationPart.NewInstance(href, 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
+\r
+                                       if ((++k % modCount) == 0){ logger.info("Links handled: " + k);}\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
+                       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 = refFactory.newGeneric();\r
+                                                               td.addDescriptionSource(descriptionSource);\r
+                                                               this.associateImageWithCdmBase(ref,descriptionSource);\r
+                                                       }\r
+                                               } else {\r
+                                                       //System.out.println(parent.getName());\r
+                                                       this.associateImageWithCdmBase(ref,ve);\r
+                                               }\r
+                                       }\r
+\r
+                               }\r
+                       }\r
+               }\r
+\r
+       }\r
+       \r
+       protected void importGeographicAreas(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig) {\r
+               Element elGeographicAreas = elDataset.getChild("GeographicAreas",sddNamespace);\r
+               if (elGeographicAreas != null) {\r
+                       List<Element> listGeographicAreas = elGeographicAreas.getChildren("GeographicArea", sddNamespace);\r
+                       int j = 0;\r
+                       \r
+                       for (Element elGeographicArea : listGeographicAreas){\r
+\r
+                               String id = elGeographicArea.getAttributeValue("id");\r
+                               NamedArea na = new NamedArea();\r
+                               importRepresentation(elGeographicArea, sddNamespace, na, id, sddConfig);\r
+                               namedAreas.put(id,na);\r
+                       }\r
+                       if ((++j % modCount) == 0){ logger.info("TaxonNames handled: " + j);}\r
+               }\r
+       }\r
+       \r
+\r
+       // imports the representation (label, detail, lang) of a particular SDD element\r
+       protected void importTechnicalMetadata(Element root, Namespace sddNamespace, SDDImportConfigurator sddConfig){\r
                Element elTechnicalMetadata = root.getChild("TechnicalMetadata", sddNamespace);\r
                String nameCreated = elTechnicalMetadata.getAttributeValue("created");\r
-               ReferenceBase sourceReference = config.getSourceReference();\r
+               sourceReference = sddConfig.getSourceReference();\r
+\r
                if (nameCreated != null) {\r
                        if (!nameCreated.equals("")) {\r
                                int year = Integer.parseInt(nameCreated.substring(0,4));\r
@@ -92,74 +468,225 @@ public class SDDDescriptionIO  extends SDDIoBase implements ICdmIO {
                                int secondOfMinute = Integer.parseInt(nameCreated.substring(17,19));\r
                                DateTime created = new DateTime(year,monthOfYear,dayOfMonth,hourOfDay,minuteOfHour,secondOfMinute,0);\r
                                sourceReference.setCreated(created);\r
+                               sec.setCreated(created);\r
                        }\r
                }\r
 \r
                // <Generator name="n/a, handcrafted instance document" version="n/a"/>\r
                Element elGenerator = elTechnicalMetadata.getChild("Generator", sddNamespace);\r
-               String generatorName = elGenerator.getAttributeValue("name");\r
-               String generatorVersion = elGenerator.getAttributeValue("version");\r
+               generatorName = elGenerator.getAttributeValue("name");\r
+               generatorVersion = elGenerator.getAttributeValue("version");\r
 \r
-               List<Element> elDatasets = root.getChildren("Dataset",sddNamespace);\r
+               sec.addAnnotation(Annotation.NewDefaultLanguageInstance(generatorName + " - " + generatorVersion));\r
+               sourceReference.addAnnotation(Annotation.NewDefaultLanguageInstance(generatorName + " - " + generatorVersion));\r
 \r
-               Map<String,TaxonDescription> taxonDescriptions = new HashMap<String,TaxonDescription>();\r
-               Map<String,State> states = new HashMap<String,State>();\r
-               Map<String,MeasurementUnit> units = new HashMap<String,MeasurementUnit>();\r
-               Map<String,String> defaultUnitPrefixes = new HashMap<String,String>();\r
-               Map<String,Feature> features = new HashMap<String,Feature>();\r
-               Map<String,ReferenceBase> publications = new HashMap<String,ReferenceBase>();\r
+       }\r
 \r
-               Set<StatisticalMeasure> statisticalMeasures = new HashSet<StatisticalMeasure>();\r
-               Set<VersionableEntity> featureData = new HashSet<VersionableEntity>();\r
+       // imports the complete dataset information\r
+       protected void importDataset(Element elDataset, Namespace sddNamespace, boolean success, SDDImportConfigurator sddConfig){                      // <Dataset xml:lang="en-us">\r
+\r
+               importDatasetLanguage(elDataset,sddConfig);\r
+               importDatasetRepresentation(elDataset, sddNamespace);\r
+               importRevisionData(elDataset, sddNamespace);\r
+               importIPRStatements(elDataset, sddNamespace, sddConfig);\r
+               importTaxonNames(elDataset, sddNamespace, sddConfig);\r
+               importDescriptiveConcepts(elDataset, sddNamespace, sddConfig);\r
+               importCharacters(elDataset, sddNamespace, sddConfig, success);\r
+               importCharacterTrees(elDataset, sddNamespace, sddConfig, success);\r
+               importCodedDescriptions(elDataset, sddNamespace, sddConfig, success);\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
+               MarkerType editou = MarkerType.NewInstance("Editor", "editor", "edt") ;\r
+               if (authors != null) {\r
+                       Team team = Team.NewInstance();\r
+                       for (Iterator<Person> author = authors.values().iterator() ; author.hasNext() ;){\r
+                               team.addTeamMember(author.next());\r
+                       }\r
+                       if (editors != null) {\r
+                               Marker marker = Marker.NewInstance();\r
+                               marker.setMarkerType(editou);\r
+                               for (Iterator<Person> editor = editors.values().iterator() ; editor.hasNext() ;){\r
+                                       Person edit = editor.next();\r
+                                       edit.addMarker(marker);\r
+                                       team.addTeamMember(edit);\r
+                               }\r
+                               }\r
+                       sec.setAuthorTeam(team);\r
+                       sourceReference.setAuthorTeam(team);\r
+               }\r
+               \r
+               if (editors != null) {\r
+                       Person ed = Person.NewInstance();\r
+                       for (Iterator<Person> editor = editors.values().iterator() ; editor.hasNext() ;){\r
+                               ed = editor.next();\r
+                       }\r
+                       // TODO updatedBy refactored to use a user account, so setting a person is no longer applicable\r
+                       //                      sec.setUpdatedBy(ed);\r
+                       //                      sourceReference.setUpdatedBy(ed);\r
+               }\r
 \r
-               int i = 0;\r
-               //for each Dataset\r
-               logger.info("start Dataset ...");\r
-               for (Element elDataset : elDatasets){\r
+               if (copyright != null) {\r
+                       sourceReference.addRights(copyright);\r
+                       sec.addRights(copyright);\r
+               }\r
+               \r
+               // Returns a CdmApplicationController created by the values of this configuration.\r
+               IDescriptionService descriptionService = getDescriptionService();\r
 \r
-                       // <Dataset xml:lang="en-us">\r
-                       String nameLang = elDataset.getAttributeValue("lang",xmlNamespace);\r
-                       Language datasetLanguage = null;\r
-                       if (!nameLang.equals("")) {\r
-//                             config.getCdmAppController().getTermService().getLanguageByIso(nameLang);\r
-                               datasetLanguage = Language.ENGLISH();\r
-                       } else {\r
-                               datasetLanguage = Language.ENGLISH();\r
+               for (Iterator<TaxonDescription> k = taxonDescriptions.values().iterator() ; k.hasNext() ;){\r
+                       TaxonDescription taxonDescription = k.next();\r
+                       // Persists a Description\r
+                       descriptionService.save(taxonDescription);\r
+               }\r
+\r
+               //descriptionService.saveFeatureNodeAll(featureNodes.values());\r
+               \r
+               for (Iterator<String> refCD = taxonDescriptions.keySet().iterator() ; refCD.hasNext() ;){\r
+                       String ref = refCD.next();\r
+                       TaxonDescription td = taxonDescriptions.get(ref);\r
+                       //XIM BUG ONAFILE td.addDescriptionSource(sec);\r
+                       if (citations.containsKey(ref)) {\r
+                               IArticle publication = (IArticle) 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
+                               }\r
+                               td.addDescriptionSource((ReferenceBase)publication);\r
                        }\r
-                       if (datasetLanguage == null) {\r
-                               datasetLanguage = Language.ENGLISH();\r
+               }\r
+               logger.info("end makeTaxonDescriptions ...");\r
+\r
+               //sddConfig.setSourceReference(sourceReference);\r
+\r
+               //saving of all imported data into the CDM db\r
+               ITermService termService = getTermService();\r
+               for (Iterator<StateData> k = stateDatas.values().iterator() ; k.hasNext() ;){\r
+                       StateData sd = k.next();\r
+                       termService.save(sd.getState()); \r
+               }\r
+               for (Iterator<Feature> k = features.values().iterator() ; k.hasNext() ;){\r
+                       Feature feature = k.next();\r
+                       termService.save(feature); \r
+               }\r
+               \r
+               \r
+               termService.save(editou);\r
+               \r
+               MarkerType sddGeographicArea = MarkerType.NewInstance("", "SDDGeographicArea", "");\r
+               termService.save(sddGeographicArea);\r
+               for (Iterator<NamedArea> k = namedAreas.values().iterator() ; k.hasNext() ;) {\r
+                       Marker areamarker = Marker.NewInstance();\r
+                       areamarker.setMarkerType(sddGeographicArea);\r
+                       NamedArea area = k.next();\r
+                       area.addMarker(areamarker);\r
+                       getTermService().save(area);\r
+               }               \r
+               \r
+               if (units != null) {\r
+                       for (Iterator<MeasurementUnit> k = units.values().iterator() ; k.hasNext() ;){\r
+                               MeasurementUnit unit = k.next();\r
+                               if (unit != null) {\r
+                                       termService.save(unit); \r
+                               }\r
                        }\r
+               }\r
+               for (Iterator<StatisticalMeasure> k = statisticalMeasures.iterator() ; k.hasNext() ;) {\r
+                       StatisticalMeasure sm = k.next();\r
+                       termService.save(sm); \r
+               }\r
 \r
-                       /* <Representation>\r
-                       <Label>The Genus Viola</Label>\r
-                       <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
-                       logger.info("start Representation ...");\r
-                       Element elRepresentation = elDataset.getChild("Representation",sddNamespace);\r
-                       String label = (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace);\r
-                       String detail = (String)ImportHelper.getXmlInputValue(elRepresentation, "Detail",sddNamespace);\r
+               for (Iterator<AnnotationType> at = annotationTypes.iterator() ; at.hasNext() ;) {\r
+                       AnnotationType annotationType = at.next();\r
+                       termService.save(annotationType); \r
+               }\r
 \r
-                       sourceReference.setTitleCache(generatorName + " - " + generatorVersion + " - " + label);\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
+               }\r
 \r
-                       Annotation annotation = Annotation.NewInstance(detail, datasetLanguage);\r
+               for (Iterator<FeatureTree> k = featureTrees.iterator() ; k.hasNext() ;) {\r
+                       FeatureTree tree = k.next();\r
+                       getFeatureTreeService().save(tree);\r
+               }\r
+               \r
+               for (Iterator<TaxonomicTree> k = taxonomicTrees.iterator() ; k.hasNext() ;) {\r
+                       TaxonomicTree tree = k.next();\r
+                       getTaxonTreeService().save(tree);\r
+               }\r
+               \r
+               for (Iterator<Specimen> k = specimens.values().iterator() ; k.hasNext() ;) {\r
+                       Specimen specimen = k.next();\r
+                       getOccurrenceService().save(specimen);\r
+               }\r
+\r
+       }\r
 \r
-                       // <RevisionData>\r
-                       logger.info("start RevisionData ...");\r
-                       Element elRevisionData = elDataset.getChild("RevisionData",sddNamespace);\r
+       // imports the default language of the dataset\r
+       protected void importDatasetLanguage(Element elDataset, SDDImportConfigurator sddConfig){\r
+               String nameLang = elDataset.getAttributeValue("lang",xmlNamespace);\r
 \r
+               if (!nameLang.equals("")) {\r
+                       String iso = nameLang.substring(0, 2);\r
+                       datasetLanguage = getTermService().getLanguageByIso(iso);\r
+               } else {\r
+                       datasetLanguage = Language.ENGLISH();\r
+               }\r
+               if (datasetLanguage == null) {\r
+                       datasetLanguage = Language.ENGLISH();\r
+               }\r
+       }\r
+       \r
+       protected void importSpecimens(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig) {\r
+               logger.info("start Specimens ...");\r
+               Element elSpecimens = elDataset.getChild("Specimens",sddNamespace);\r
+               if (elSpecimens != null){\r
+                       List<Element> listSpecimens = elSpecimens.getChildren("Specimen", sddNamespace);\r
+                       int j = 0;\r
+                       for (Element elSpecimen : listSpecimens) {\r
+                               String id = elSpecimen.getAttributeValue("id");\r
+                               Specimen speci = null;\r
+                               if (!id.equals("")) {\r
+                                       speci = Specimen.NewInstance();\r
+                                       specimens.put(id,speci);\r
+                                       importRepresentation(elSpecimen, sddNamespace, speci, id, sddConfig);\r
+                               }\r
+                       }\r
+                       \r
+               }\r
+       }\r
+\r
+       \r
+\r
+       \r
+       \r
+       \r
+       // imports the revision data associated with the Dataset (authors, modifications)\r
+       protected void importRevisionData(Element elDataset, Namespace sddNamespace){\r
+               // <RevisionData>\r
+               logger.info("start RevisionData ...");\r
+               Element elRevisionData = elDataset.getChild("RevisionData",sddNamespace);\r
+               if (elRevisionData != null){\r
                        // <Creators>\r
                        Element elCreators = elRevisionData.getChild("Creators",sddNamespace);\r
-\r
+       \r
                        // <Agent role="aut" ref="a1"/>\r
                        List<Element> listAgents = elCreators.getChildren("Agent", sddNamespace);\r
-\r
+       \r
                        int j = 0;\r
                        //for each Agent\r
-                       Map<String,Person> authors = new HashMap<String,Person>();\r
-                       Map<String,Person> editors = new HashMap<String,Person>();\r
                        for (Element elAgent : listAgents){\r
-\r
+       \r
                                String role = elAgent.getAttributeValue("role");\r
                                String ref = elAgent.getAttributeValue("ref");\r
                                if (role.equals("aut")) {\r
@@ -172,14 +699,13 @@ public class SDDDescriptionIO  extends SDDIoBase implements ICdmIO {
                                                editors.put(ref, null);\r
                                        }\r
                                }\r
-\r
                                if ((++j % modCount) == 0){ logger.info("Agents handled: " + j);}\r
-\r
+       \r
                        }\r
-\r
+       \r
                        // <DateModified>2006-04-08T00:00:00</DateModified>\r
                        String stringDateModified = (String)ImportHelper.getXmlInputValue(elRevisionData, "DateModified",sddNamespace);\r
-\r
+       \r
                        if (stringDateModified != null) {\r
                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss");\r
                                Date d = null;\r
@@ -189,487 +715,492 @@ public class SDDDescriptionIO  extends SDDIoBase implements ICdmIO {
                                        System.err.println("Exception :");\r
                                        e.printStackTrace();\r
                                }\r
-\r
-                               GregorianCalendar updated = null;\r
+       \r
+                               DateTime updated = null;\r
                                if (d != null) {\r
-                                       updated = new java.util.GregorianCalendar();\r
-                                       updated.setTime(d);\r
+                                       updated = new DateTime(d);\r
                                        sourceReference.setUpdated(updated);\r
+                                       sec.setUpdated(updated);\r
                                }\r
                        }\r
+               }\r
+       }\r
 \r
-                       // <IPRStatements>\r
-                       logger.info("start IPRStatements ...");\r
-                       Element elIPRStatements = elDataset.getChild("IPRStatements",sddNamespace);\r
-                       // <IPRStatement role="Copyright">\r
-                       Rights copyright = null;\r
-                       if (elIPRStatements != null) {\r
-                               List<Element> listIPRStatements = elIPRStatements.getChildren("IPRStatement", sddNamespace);\r
-                               j = 0;\r
-                               //for each IPRStatement\r
+       // imports ipr statements associated with a dataset\r
+       protected void importIPRStatements(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig){\r
+               // <IPRStatements>\r
+               logger.info("start IPRStatements ...");\r
+               Element elIPRStatements = elDataset.getChild("IPRStatements",sddNamespace);\r
+               // <IPRStatement role="Copyright">\r
+               if (elIPRStatements != null) {\r
+                       List<Element> listIPRStatements = elIPRStatements.getChildren("IPRStatement", sddNamespace);\r
+                       int j = 0;\r
+                       //for each IPRStatement\r
 \r
-                               for (Element elIPRStatement : listIPRStatements){\r
+                       for (Element elIPRStatement : listIPRStatements){\r
 \r
-                                       String role = elIPRStatement.getAttributeValue("role");\r
-                                       // <Label xml:lang="en-au">(c) 2003-2006 Centre for Occasional Botany.</Label>\r
-                                       Element elLabel = elIPRStatement.getChild("Label",sddNamespace);\r
-                                       String lang = "";\r
-                                       if (elLabel != null) {\r
-                                               lang = elLabel.getAttributeValue("lang",xmlNamespace);\r
-                                       }\r
-                                       label = (String)ImportHelper.getXmlInputValue(elIPRStatement, "Label",sddNamespace);\r
-\r
-                                       if (role.equals("Copyright")) {\r
-                                               Language iprLanguage = null;\r
-                                               if (lang != null) {\r
-                                                       if (!lang.equals("")) {\r
-                                                               //iprLanguage = termService.getLanguageByIso(nameLang);\r
-                                                               iprLanguage = datasetLanguage;\r
-                                                       } else {\r
-                                                               iprLanguage = datasetLanguage;\r
-                                                       }\r
-                                               }\r
-                                               if (iprLanguage == null) {\r
+                               String role = elIPRStatement.getAttributeValue("role");\r
+                               // <Label xml:lang="en-au">(c) 2003-2006 Centre for Occasional Botany.</Label>\r
+                               Element elLabel = elIPRStatement.getChild("Label",sddNamespace);\r
+                               String lang = "";\r
+                               if (elLabel != null) {\r
+                                       lang = elLabel.getAttributeValue("lang",xmlNamespace);\r
+                               }\r
+                               String label = (String)ImportHelper.getXmlInputValue(elIPRStatement, "Label",sddNamespace);\r
+\r
+                               if (role.equals("Copyright")) {\r
+                                       Language iprLanguage = null;\r
+                                       if (lang != null) {\r
+                                               if (!lang.equals("")) {\r
+                                                       iprLanguage = getTermService().getLanguageByIso(lang.substring(0, 2));\r
+                                                       //iprLanguage = datasetLanguage;\r
+                                               } else {\r
                                                        iprLanguage = datasetLanguage;\r
                                                }\r
-                                               copyright = Rights.NewInstance(label, iprLanguage);\r
                                        }\r
-\r
-                                       if (copyright != null) {\r
-                                               sourceReference.addRights(copyright);\r
+                                       if (iprLanguage == null) {\r
+                                               iprLanguage = datasetLanguage;\r
                                        }\r
+                                       copyright = Rights.NewInstance(label, iprLanguage);\r
+                               }\r
 \r
-                                       if ((++j % modCount) == 0){ logger.info("IPRStatements handled: " + j);}\r
-\r
+                               if (copyright != null) {\r
+                                       sourceReference.addRights(copyright);\r
+                                       sec.addRights(copyright);\r
                                }\r
-                       }\r
 \r
-                       // <TaxonNames>\r
-                       logger.info("start TaxonNames ...");\r
-                       Element elTaxonNames = elDataset.getChild("TaxonNames",sddNamespace);\r
-                       // <TaxonName id="t1" uri="urn:lsid:authority:namespace:my-own-id">\r
-                       Map<String,NonViralName> taxonNameBases = new HashMap<String,NonViralName>();\r
-                       if (elTaxonNames != null) {\r
-                               List<Element> listTaxonNames = elTaxonNames.getChildren("TaxonName", sddNamespace);\r
-                               j = 0;\r
-                               //for each TaxonName\r
-                               for (Element elTaxonName : listTaxonNames){\r
+                               if ((++j % modCount) == 0){ logger.info("IPRStatements handled: " + j);}\r
 \r
-                                       String id = elTaxonName.getAttributeValue("id");\r
-                                       String uri = elTaxonName.getAttributeValue("uri");\r
-                                       // <Representation>\r
-                                       elRepresentation = elTaxonName.getChild("Representation",sddNamespace);\r
-                                       // <Label xml:lang="la">Viola hederacea Labill.</Label>\r
-                                       Element elLabel = elRepresentation.getChild("Label",sddNamespace);\r
-                                       String lang = elLabel.getAttributeValue("lang",xmlNamespace);\r
-                                       label = (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace);\r
-                                       NonViralName tnb = NonViralName.NewInstance(null);\r
-                                       if ((lang != null) && (!lang.equals("la")))  {\r
-                                               logger.info("TaxonName " + j + " is not specified as a latin name.");\r
+                       }\r
+               }\r
+       }\r
+\r
+       // imports the taxon names\r
+       protected void importTaxonNames(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig){\r
+               // <TaxonNames>\r
+               logger.info("start TaxonNames ...");\r
+               Element elTaxonNames = elDataset.getChild("TaxonNames",sddNamespace);\r
+               // <TaxonName id="t1" uri="urn:lsid:authority:namespace:my-own-id">\r
+               if (elTaxonNames != null) {\r
+                       List<Element> listTaxonNames = elTaxonNames.getChildren("TaxonName", sddNamespace);\r
+                       int j = 0;\r
+                       //for each TaxonName\r
+                       for (Element elTaxonName : listTaxonNames){\r
+\r
+                               String id = elTaxonName.getAttributeValue("id");\r
+                               String uri = elTaxonName.getAttributeValue("uri");\r
+\r
+                               NonViralName tnb = null;\r
+                               if (!id.equals("")) {\r
+                                       tnb = NonViralName.NewInstance(null);\r
+                                       IdentifiableSource source = null;\r
+                                       if (uri != null) {\r
+                                               if (!uri.equals("")) {\r
+                                                       source = IdentifiableSource.NewInstance(id, "TaxonName", refFactory.newGeneric(), uri);\r
+                                               }\r
+                                       } else {\r
+                                               source = IdentifiableSource.NewInstance(id, "TaxonName");\r
                                        }\r
-                                       tnb.setTitleCache(label);\r
-                                       OriginalSource source = OriginalSource.NewInstance(id, "TaxonName");\r
                                        tnb.addSource(source);\r
-                                       if (!id.equals("")) {\r
-                                               taxonNameBases.put(id,tnb);\r
-                                       }\r
+                                       taxonNameBases.put(id,tnb);\r
+                               }\r
 \r
-                                       if ((++j % modCount) == 0){ logger.info("TaxonNames handled: " + j);}\r
+                               // <Representation>\r
+                               // <Label xml:lang="la">Viola hederacea Labill.</Label>\r
+                               importRepresentation(elTaxonName, sddNamespace, tnb, id, sddConfig);\r
+\r
+                               if ((++j % modCount) == 0){ logger.info("TaxonNames handled: " + j);}\r
 \r
-                               }\r
                        }\r
+               }\r
+       }\r
 \r
-                       // <Characters>\r
-                       logger.info("start Characters ...");\r
-                       Element elCharacters = elDataset.getChild("Characters", sddNamespace);\r
+       // imports the representation (label, detail, lang) of a particular SDD element\r
+       protected void importCharacters(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\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
-                               j = 0;\r
-                               //for each CategoricalCharacter\r
-                               for (Element elCategoricalCharacter : elCategoricalCharacters){\r
+               // <CategoricalCharacter id="c1">\r
+               if (elCharacters != null) {\r
+                       List<Element> elCategoricalCharacters = elCharacters.getChildren("CategoricalCharacter", sddNamespace);\r
+                       int j = 0;\r
+                       //for each CategoricalCharacter\r
+                       for (Element elCategoricalCharacter : elCategoricalCharacters){\r
+                               try {\r
 \r
-                                       try {\r
+                                       String idCC = elCategoricalCharacter.getAttributeValue("id");\r
 \r
-                                               String idCC = elCategoricalCharacter.getAttributeValue("id");\r
+                                       // <Representation>\r
+                                       //  <Label> Leaf complexity</Label>\r
+                                       // </Representation>\r
 \r
-                                               // <Representation>\r
-                                               //  <Label> Leaf complexity</Label>\r
-                                               // </Representation>\r
-                                               elRepresentation = elCategoricalCharacter.getChild("Representation",sddNamespace);\r
-                                               label = (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace);\r
+                                       Feature categoricalCharacter = Feature.NewInstance();\r
+                                       categoricalCharacter.setKindOf(Feature.DESCRIPTION());\r
+                                       importRepresentation(elCategoricalCharacter, sddNamespace, categoricalCharacter, idCC, sddConfig);\r
 \r
-                                               Feature categoricalCharacter = null;\r
-                                               if (label != null){\r
-                                                       categoricalCharacter = Feature.NewInstance(label, label, label);\r
-                                               }\r
-                                               categoricalCharacter.setSupportsQuantitativeData(false);\r
-                                               categoricalCharacter.setSupportsTextData(true);\r
+                                       categoricalCharacter.setSupportsCategoricalData(true);\r
 \r
-                                               // <States>\r
-                                               Element elStates = elCategoricalCharacter.getChild("States",sddNamespace);\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 = new TermVocabulary<State>();\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
-                                               int k = 0;\r
-                                               //for each StateDefinition\r
-                                               for (Element elStateDefinition : elStateDefinitions){\r
-\r
-                                                       if ((++k % modCount) == 0){ logger.info("StateDefinitions handled: " + (k-1));}\r
-\r
-                                                       String idSD = elStateDefinition.getAttributeValue("id");\r
-                                                       // <Representation>\r
-                                                       //  <Label>Simple</Label>\r
-                                                       // </Representation>\r
-                                                       elRepresentation = elStateDefinition.getChild("Representation",sddNamespace);\r
-                                                       label = (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace);\r
-                                                       State state = new State(label,label,label);\r
-                                                       states.put(idSD, state);\r
-                                                       termVocabularyState.addTerm(state);\r
-                                               }\r
+                                               if ((++k % modCount) == 0){ logger.info("StateDefinitions handled: " + (k-1));}\r
 \r
-                                               categoricalCharacter.addSupportedCategoricalEnumeration(termVocabularyState);\r
-                                               features.put(idCC, categoricalCharacter);\r
+                                               String idSD = elStateDefinition.getAttributeValue("id");\r
+                                               // <Representation>\r
+                                               //  <Label>Simple</Label>\r
+                                               //  <MediaObject ref="ib" role="Primary"/>\r
+                                               // </Representation>\r
+                                               State state = State.NewInstance();\r
+                                               importRepresentation(elStateDefinition, sddNamespace, state, idSD, sddConfig);\r
 \r
-                                       } catch (Exception e) {\r
-                                               //FIXME\r
-                                               logger.warn("Import of CategoricalCharacter " + j + " failed.");\r
-                                               success = false; \r
+                                               StateData stateData = StateData.NewInstance();\r
+                                               stateData.setState(state);\r
+                                               termVocabularyState.addTerm(state);\r
+                                               stateDatas.put(idSD,stateData);\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
+                                       //FIXME\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
 \r
-                                               String idQC = elQuantitativeCharacter.getAttributeValue("id");\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
-                                               // <Representation>\r
-                                               //  <Label>Leaf length</Label>\r
-                                               // </Representation>\r
-                                               elRepresentation = elQuantitativeCharacter.getChild("Representation",sddNamespace);\r
-                                               label = (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace);\r
+                               try {\r
 \r
-                                               Feature quantitativeCharacter = Feature.NewInstance();\r
+                                       String idQC = elQuantitativeCharacter.getAttributeValue("id");\r
 \r
-                                               if (!label.equals("")){\r
-                                                       quantitativeCharacter = Feature.NewInstance(label, label, label);\r
-                                               }\r
-                                               quantitativeCharacter.setSupportsQuantitativeData(true);\r
-                                               quantitativeCharacter.setSupportsTextData(false);\r
-\r
-                                               // <MeasurementUnit>\r
-                                               //  <Label role="Abbrev">m</Label>\r
-                                               // </MeasurementUnit>\r
-                                               Element elMeasurementUnit = elQuantitativeCharacter.getChild("MeasurementUnit",sddNamespace);\r
-                                               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
+                                       // <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
+                                       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
-                                               if (unit != null) {\r
-                                                       units.put(idQC, unit);\r
-                                               }\r
+                                       if (unit != null) {\r
+                                               units.put(idQC, unit);\r
+                                       }\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
-                                                       }\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
-                                               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
-                                       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
 \r
-                                               String idTC = elTextCharacter.getAttributeValue("id");\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
-                                               elRepresentation = elTextCharacter.getChild("Representation",sddNamespace);\r
-                                               Element elLabel = elRepresentation.getChild("Label",sddNamespace);\r
-                                               nameLang = elLabel.getAttributeValue("lang",xmlNamespace);\r
-                                               Language language = null;\r
-                                               if (nameLang != null) {\r
-                                                       if (!nameLang.equals("")) {\r
-                                                               // language = termService.getLanguageByIso(nameLang);\r
-                                                               language = datasetLanguage;\r
-                                                       } else {\r
-                                                               language = datasetLanguage;\r
-                                                       }\r
-                                               } else {\r
-                                                       language = datasetLanguage;\r
-                                               }\r
+                               try {\r
 \r
-                                               label = (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace);\r
+                                       String idTC = elTextCharacter.getAttributeValue("id");\r
 \r
-                                               Feature textCharacter = Feature.NewInstance();\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
-                                               if (label != null) {\r
-                                                       if (!label.equals("")){\r
-                                                               textCharacter = Feature.NewInstance(label, label, label);\r
-                                                               textCharacter.setLabel(label, language);\r
-                                                       }\r
-                                               }\r
+                                       textCharacter.setSupportsTextData(true);\r
 \r
-                                               textCharacter.setSupportsQuantitativeData(false);\r
-                                               textCharacter.setSupportsTextData(true);\r
+                                       features.put(idTC, textCharacter);\r
 \r
-                                               features.put(idTC, textCharacter);\r
+                               } catch (Exception e) {\r
+                                       //FIXME\r
+                                       logger.warn("Import of TextCharacter " + j + " failed.");\r
+                                       success = false; \r
+                               }\r
 \r
-                                       } catch (Exception e) {\r
-                                               //FIXME\r
-                                               logger.warn("Import of TextCharacter " + j + " failed.");\r
-                                               success = false; \r
-                                       }\r
+                               if ((++j % modCount) == 0){ logger.info("TextCharacters handled: " + j);}\r
 \r
-                                       if ((++j % modCount) == 0){ logger.info("TextCharacters handled: " + j);}\r
+                       }\r
 \r
-                               }\r
+               }\r
 \r
-                       }\r
+               for (Iterator<Feature> f = features.values().iterator() ; f.hasNext() ;){\r
+                       featureSet.add(f.next());\r
+               }\r
 \r
-                       // <CodedDescriptions>\r
-                       logger.info("start CodedDescriptions ...");\r
-                       Element elCodedDescriptions = elDataset.getChild("CodedDescriptions",sddNamespace);\r
+       }\r
 \r
-                       // <CodedDescription id="D101">\r
+       // imports the descriptions of taxa (specimens TODO)\r
+       protected void importCodedDescriptions(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\r
+               // <CodedDescriptions>\r
+               logger.info("start CodedDescriptions ...");\r
+               Element elCodedDescriptions = elDataset.getChild("CodedDescriptions",sddNamespace);\r
 \r
-                       Map<String,String> citations = new HashMap<String,String>();\r
-                       Map<String,String> locations = new HashMap<String,String>();\r
+               // <CodedDescription id="D101">\r
 \r
-                       if (elCodedDescriptions != null) {\r
-                               List<Element> listCodedDescriptions = elCodedDescriptions.getChildren("CodedDescription", sddNamespace);\r
-                               j = 0;\r
-                               //for each CodedDescription\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
+                       for (Element elCodedDescription : listCodedDescriptions){\r
 \r
-                                       try {\r
+                               try {\r
 \r
-                                               String idCD = elCodedDescription.getAttributeValue("id");\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
-                                               elRepresentation = elCodedDescription.getChild("Representation",sddNamespace);\r
-                                               Element elLabel = elRepresentation.getChild("Label",sddNamespace);\r
-                                               label = (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace);\r
-\r
-                                               TaxonDescription taxonDescription = TaxonDescription.NewInstance();\r
-                                               taxonDescription.setTitleCache(label);\r
-                                               OriginalSource source = OriginalSource.NewInstance(idCD, "CodedDescription");\r
-                                               taxonDescription.addSource(source);\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
-\r
-                                                       NonViralName taxonNameBase = taxonNameBases.get(ref);\r
-                                                       taxon = Taxon.NewInstance(taxonNameBase, null);\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
+\r
+                                               NonViralName taxonNameBase = taxonNameBases.get(ref);\r
+                                               taxon = Taxon.NewInstance(taxonNameBase, sec);\r
+                                       }\r
+                                       else {\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
+                                               tnb.addSource(source);\r
+                                               taxonNameBases.put(id ,tnb);\r
+                                               taxonNamesCount++;\r
+                                               taxon = Taxon.NewInstance(tnb, sec);\r
+                                       }\r
+\r
+                                       String refCitation = "";\r
+                                       String location = "";\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
+\r
+                                       // <SummaryData>\r
+                                       Element elSummaryData = elCodedDescription.getChild("SummaryData",sddNamespace);\r
 \r
-                                               String refCitation = "";\r
-                                               String location = "";\r
+                                       if (elSummaryData != null) {\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
+                                               // <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
+                                                       //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
+                                                               StateData stateData = stateDatas.get(ref);\r
+                                                               categoricalData.addState(stateData);\r
                                                        }\r
+                                                       taxonDescription.addElement(categoricalData);\r
                                                }\r
 \r
-                                               // <SummaryData>\r
-                                               Element elSummaryData = elCodedDescription.getChild("SummaryData",sddNamespace);\r
-\r
-                                               if (elSummaryData != null) {\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.info("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
-                                                               //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
-                                                                       categoricalData.addState(state);\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
-                                                               taxonDescription.addElement(categoricalData);\r
+                                                               unit.setLabel(u);\r
+                                                               quantitativeData.setUnit(unit);\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.info("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
+                                                       // <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
-\r
-                                                               // <Measure type="Min" value="2.3"/>\r
-                                                               List<Element> elMeasures = elQuantitative.getChildren("Measure", sddNamespace);\r
-                                                               int l = 0;\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
-                                                                       value = elMeasure.getAttributeValue("value");\r
-                                                                       float v = Float.parseFloat(value);\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
-                                                                               // Create a new StatisticalMeasure for standard deviation\r
-                                                                               t = StatisticalMeasure.STANDARD_DEVIATION();\r
-                                                                       } else if (type.equals("N")) {\r
-                                                                               t = StatisticalMeasure.SAMPLE_SIZE();\r
-                                                                       } else {\r
-                                                                               t = StatisticalMeasure.NewInstance(type,type,type);\r
-                                                                               statisticalMeasures.add(t);\r
-                                                                       }\r
-\r
-                                                                       StatisticalMeasurementValue statisticalValue = StatisticalMeasurementValue.NewInstance();\r
-                                                                       statisticalValue.setValue(v);\r
-                                                                       statisticalValue.setType(t);\r
-                                                                       quantitativeData.addStatisticalValue(statisticalValue);\r
-                                                                       featureData.add(statisticalValue);\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
-                                                               taxonDescription.addElement(quantitativeData);\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
+                                                               StatisticalMeasurementValue statisticalValue = StatisticalMeasurementValue.NewInstance();\r
+                                                               statisticalValue.setValue(v);\r
+                                                               statisticalValue.setType(t);\r
+                                                               quantitativeData.addStatisticalValue(statisticalValue);\r
+                                                               featureData.add(statisticalValue);\r
                                                        }\r
-\r
+                                                       taxonDescription.addElement(quantitativeData);\r
                                                }\r
 \r
-                                               if (taxon != null) {\r
-                                                       taxon.addDescription(taxonDescription);\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
-                                               if (!refCitation.equals("")){\r
-                                                       citations.put(idCD,refCitation);\r
-                                               }\r
+                                       }\r
 \r
-                                               if (!location.equals("")){\r
-                                                       locations.put(idCD, location);\r
-                                               }\r
+                                       if (taxon != null) {\r
+                                               taxon.addDescription(taxonDescription);\r
+                                       }\r
 \r
-                                               taxonDescriptions.put(idCD, taxonDescription);\r
+                                       if (!refCitation.equals("")){\r
+                                               citations.put(idCD,refCitation);\r
+                                       }\r
 \r
-                                       } catch (Exception e) {\r
-                                               //FIXME\r
-                                               logger.warn("Import of CodedDescription " + j + " failed.");\r
-                                               success = false; \r
+                                       if (!location.equals("")){\r
+                                               locations.put(idCD, location);\r
                                        }\r
+                                       \r
+                                       taxonDescription.setDescriptiveSystem(featureSet);\r
 \r
-                                       if ((++j % modCount) == 0){ logger.info("CodedDescriptions handled: " + j);}\r
+                                       taxonDescriptions.put(idCD, taxonDescription);//XIM PB ici\r
 \r
+                               } catch (Exception e) {\r
+                                       //FIXME\r
+                                       logger.warn("Import of CodedDescription " + j + " failed.");\r
+                                       success = false; \r
                                }\r
 \r
+                               if ((++j % modCount) == 0){ logger.info("CodedDescriptions handled: " + j);}\r
+\r
                        }\r
 \r
-                       // <Agents>\r
-                       logger.info("start Agents ...");\r
-                       Element elAgents = elDataset.getChild("Agents",sddNamespace);\r
+               }\r
+       }\r
 \r
+       // imports the persons associated with the dataset creation, modification, related publications\r
+       protected void importAgents(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\r
+               // <Agents>\r
+               logger.info("start Agents ...");\r
+               Element elAgents = elDataset.getChild("Agents",sddNamespace);\r
+               if (elAgents != null) {\r
                        // <Agent id="a1">\r
-                       listAgents = elAgents.getChildren("Agent", sddNamespace);\r
-                       j = 0;\r
+                       List <Element> listAgents = elAgents.getChildren("Agent", sddNamespace);\r
+                       int j = 0;\r
                        //for each Agent\r
                        for (Element elAgent : listAgents){\r
 \r
@@ -681,22 +1212,11 @@ public class SDDDescriptionIO  extends SDDIoBase implements ICdmIO {
                                        //   <Label>Kevin Thiele</Label>\r
                                        //   <Detail role="Description">Ali Baba is also known as r.a.m.</Detail>\r
                                        //  </Representation>\r
-                                       elRepresentation = elAgent.getChild("Representation",sddNamespace);\r
-                                       label = (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace);\r
-                                       Element elDetail = elRepresentation.getChild("Detail",sddNamespace);\r
-\r
-                                       Person person = Person.NewTitledInstance(label);\r
-                                       OriginalSource source = OriginalSource.NewInstance(idA, "Agent");\r
-                                       person.addSource(source);\r
-\r
-                                       if (elDetail != null) {\r
-                                               String role = elDetail.getAttributeValue("role");\r
-                                               detail = (String)ImportHelper.getXmlInputValue(elRepresentation, "Detail",sddNamespace);\r
-                                               annotation = Annotation.NewInstance(role + " - " + detail, datasetLanguage);\r
-                                               person.addAnnotation(annotation);\r
-                                       }\r
+                                       Person person = Person.NewInstance();\r
+                                       importRepresentation(elAgent, sddNamespace, person, idA, sddConfig);\r
+                                       person.addSource(IdentifiableSource.NewInstance(idA, "Agent"));\r
 \r
-                                       // <Links>\r
+                                       /*XIM <Links>\r
                                        Element elLinks = elAgent.getChild("Links",sddNamespace);\r
 \r
                                        if (elLinks != null) {\r
@@ -712,10 +1232,11 @@ public class SDDDescriptionIO  extends SDDIoBase implements ICdmIO {
                                                                String rel = elLink.getAttributeValue("rel");\r
                                                                String href = elLink.getAttributeValue("href");\r
 \r
-                                                               if (k==1) {\r
-                                                                       source = OriginalSource.NewInstance(rel, href);\r
-                                                                       person.addSource(source);\r
-                                                               }\r
+                                                               Media link = Media.NewInstance();\r
+                                                               MediaRepresentation mr = MediaRepresentation.NewInstance();\r
+                                                               mr.addRepresentationPart(MediaRepresentationPart.NewInstance(href, null));\r
+                                                               link.addRepresentation(mr);\r
+                                                               person.addMedia(link);\r
 \r
                                                        } catch (Exception e) {\r
                                                                //FIXME\r
@@ -727,6 +1248,7 @@ public class SDDDescriptionIO  extends SDDIoBase implements ICdmIO {
 \r
                                                }\r
                                        }\r
+                                       */\r
                                        if (authors.containsKey(idA)) {\r
                                                authors.put(idA,person);\r
                                        }\r
@@ -744,147 +1266,490 @@ public class SDDDescriptionIO  extends SDDIoBase implements ICdmIO {
                                if ((++j % modCount) == 0){ logger.info("Agents handled: " + j);}\r
 \r
                        }\r
+               }\r
+       }\r
 \r
-                       // <Publications>\r
-                       logger.info("start Publications ...");\r
-                       Element elPublications = elDataset.getChild("Publications",sddNamespace);\r
+       // imports publications related with the data set\r
+       protected void importPublications(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\r
+               // <Publications>\r
+               logger.info("start Publications ...");\r
+               Element elPublications = elDataset.getChild("Publications",sddNamespace);\r
 \r
-                       if (elPublications != null) {\r
-                               // <Publication id="p1">\r
-                               List<Element> listPublications = elPublications.getChildren("Publication", sddNamespace);\r
-                               j = 0;\r
-                               //for each Publication\r
-                               for (Element elPublication : listPublications){\r
+               if (elPublications != null) {\r
+                       // <Publication id="p1">\r
+                       List<Element> listPublications = elPublications.getChildren("Publication", sddNamespace);\r
+                       int j = 0;\r
+                       //for each Publication\r
+                       for (Element elPublication : listPublications){\r
 \r
-                                       try {\r
+                               try {\r
 \r
-                                               String idP = elPublication.getAttributeValue("id");\r
+                                       String idP = elPublication.getAttributeValue("id");\r
 \r
-                                               //  <Representation>\r
-                                               //   <Label>Sample Citation</Label>\r
-                                               //  </Representation>\r
-                                               elRepresentation = elPublication.getChild("Representation",sddNamespace);\r
-                                               label = (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace);\r
-                                               Article publication = Article.NewInstance();\r
-                                               publication.setTitle(label);\r
-                                               OriginalSource source = OriginalSource.NewInstance(idP, "Publication");\r
-                                               publication.addSource(source);\r
+                                       //  <Representation>\r
+                                       //   <Label>Sample Citation</Label>\r
+                                       //  </Representation>\r
+                                       ReferenceBase publication = refFactory.newArticle();\r
+                                       importRepresentation(elPublication, sddNamespace, publication, idP, sddConfig);\r
 \r
-                                               publications.put(idP,publication);\r
+                                       publications.put(idP,publication);\r
 \r
-                                       } catch (Exception e) {\r
-                                               //FIXME\r
-                                               logger.warn("Import of Publication " + j + " failed.");\r
-                                               success = false; \r
-                                       }\r
+                               } catch (Exception e) {\r
+                                       //FIXME\r
+                                       logger.warn("Import of Publication " + j + " failed.");\r
+                                       success = false; \r
+                               }\r
 \r
-                                       if ((++j % modCount) == 0){ logger.info("Publications handled: " + j);}\r
+                               if ((++j % modCount) == 0){ logger.info("Publications handled: " + j);}\r
 \r
-                               }\r
                        }\r
+               }\r
+       }\r
 \r
-                       logger.info("MediaObjects to implement still");\r
+       // imports media objects such as images\r
+       protected void importMediaObjects(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\r
+               // <MediaObjects>\r
+               logger.info("start MediaObjects ...");\r
+               Element elMediaObjects = elDataset.getChild("MediaObjects",sddNamespace);\r
 \r
-                       /*\r
-                               // when several authors are supported\r
-                               if (authors.size()>1) {\r
-                                       for (Iterator<Person> author = authors.values().iterator() ; author.hasNext() ;){\r
-                                               sourceReference.setCreatedBy(author.next());\r
-                                       }\r
-                               } else {\r
-                                       Team team = Team.NewInstance();\r
-                                       for (Iterator<Person> author = authors.values().iterator() ; author.hasNext() ;){\r
-                                               team.addTeamMember(author.next());\r
+               if (elMediaObjects != null) {\r
+                       // <MediaObject id="m1">\r
+                       List<Element> listMediaObjects = elMediaObjects.getChildren("MediaObject", sddNamespace);\r
+                       int j = 0;\r
+                       //for each Publication\r
+                       for (Element elMO : listMediaObjects){\r
+\r
+                               String id = "";\r
+\r
+                               try {\r
+                                       String idMO = elMO.getAttributeValue("id");\r
+                                       id = idMO;\r
+\r
+                                       //  <Representation>\r
+                                       //   <Label>Image description, e.g. to be used for alt-attribute in html.</Label>\r
+                                       //  </Representation>\r
+                                       Media media = Media.NewInstance();\r
+                                       importRepresentation(elMO, sddNamespace, media, idMO, sddConfig);\r
+\r
+                                       // <Type>Image</Type>\r
+                                       // <Source href="http://test.edu/test.jpg"/>\r
+                                       String type = (String)ImportHelper.getXmlInputValue(elMO,"Type",sddNamespace);\r
+\r
+                                       if ((type != null) && (type.equals("Image"))) {\r
+                                               Element elSource = elMO.getChild("Source",sddNamespace);\r
+                                               String href = elSource.getAttributeValue("href");\r
+\r
+                                               ImageMetaData imageMetaData = ImageMetaData.newInstance();\r
+                                               ImageFile image = null;\r
+                                               if (href.substring(0,7).equals("http://")) {\r
+                                                       try{\r
+                                                               URL url = new URL(href);\r
+                                                               \r
+                                                               imageMetaData.readMetaData(url.toURI(), 0);\r
+                                                               image = ImageFile.NewInstance(url.toString(), null, imageMetaData);\r
+                                                       } catch (MalformedURLException e) {\r
+                                                               logger.error("Malformed URL", e);\r
+                                                       }\r
+                                               } else {\r
+                                                       String sns = sddConfig.getSourceNameString();\r
+                                                       File f = new File(sns);\r
+                                                       File parent = f.getParentFile();\r
+                                                       String fi = href;\r
+                                                       //XIMString fi = parent.toString() + File.separator + href; enlever le file:/ ou truc du genre\r
+                                                       File file = new File(fi);\r
+                                                       imageMetaData.readMetaData(file.toURI(), 0);\r
+                                                       image = ImageFile.NewInstance(file.toString(), null, imageMetaData);\r
+                                               }\r
+                                               MediaRepresentation representation = MediaRepresentation.NewInstance(imageMetaData.getMimeType(), null);\r
+                                               representation.addRepresentationPart(image);\r
+\r
+                                               media.addRepresentation(representation);\r
+\r
+                                               ArrayList<CdmBase> lcb = (ArrayList<CdmBase>) mediaObject_ListCdmBase.get(idMO);\r
+                                               if (lcb != null) {\r
+                                                       for (int k = 0; k < lcb.size(); k++) {\r
+                                                               if (lcb.get(k) instanceof DefinedTermBase) {\r
+                                                                       DefinedTermBase dtb = (DefinedTermBase) lcb.get(k);\r
+                                                                       // if (lcb.get(0) instanceof DefinedTermBase) {\r
+                                                                       // DefinedTermBase dtb = (DefinedTermBase) lcb.get(0);\r
+                                                                       //                                                                      if (dtb!=null) {\r
+                                                                       //                                                                              if (k == 0) {\r
+                                                                       dtb.addMedia(media);\r
+                                                                       //System.out.println(dtb.getLabel());\r
+                                                                       //                                                                              } else {\r
+                                                                       //                                                                                      Media me = (Media) media.clone();\r
+                                                                       //                                                                                      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
+                                                                       // rb.setTitleCache(label);\r
+                                                                       //                                                                      if (rb!=null) {\r
+                                                                       //                                                                              if (k == 0) {\r
+                                                                       rb.addMedia(media);\r
+                                                                       //System.out.println(rb.getTitle());\r
+                                                                       //                                                                              } else {\r
+                                                                       //                                                                                      Media me = (Media) media.clone();\r
+                                                                       //                                                                                      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
+                                                       }\r
+                                               }\r
                                        }\r
-                                       sourceReference.setCreatedBy(team);\r
+\r
+                               } catch (Exception e) {\r
+                                       //FIXME\r
+                                       logger.warn("Could not attach MediaObject " + j + "(SDD: " + id + ") to several objects.");\r
+                                       success = false; \r
                                }\r
-                        */\r
 \r
-                       Iterator<Person> author = authors.values().iterator();\r
-                       if (author.hasNext()){\r
-                               sourceReference.setCreatedBy(author.next());\r
-                       }\r
+                               if ((++j % modCount) == 0){ logger.info("MediaObjects handled: " + j);\r
 \r
-                       Iterator<Person> editor = editors.values().iterator();\r
-                       if (editor.hasNext()){\r
-                               sourceReference.setCreatedBy(editor.next());\r
+                               }\r
                        }\r
+               }\r
+       }\r
+\r
+       // imports the <DescriptiveConcepts> block\r
+       protected void importDescriptiveConcepts(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig){\r
+               // <DescriptiveConcepts>\r
+               logger.info("start DescriptiveConcepts ...");\r
+               Element elDescriptiveConcepts = elDataset.getChild("DescriptiveConcepts",sddNamespace);\r
+               // <DescriptiveConcept id="b">\r
+               if (elDescriptiveConcepts != null) {\r
+                       List<Element> listDescriptiveConcepts = elDescriptiveConcepts.getChildren("DescriptiveConcept", sddNamespace);\r
+                       int j = 0;\r
+                       //for each DescriptiveConcept\r
+                       int g = 1;\r
+\r
+                       for (Element elDescriptiveConcept : listDescriptiveConcepts){\r
+\r
+                               String id = elDescriptiveConcept.getAttributeValue("id");\r
+                               String uri = elDescriptiveConcept.getAttributeValue("uri");\r
+\r
+                               FeatureNode fn = null;\r
+\r
+                               if (!id.equals("")) {\r
+                                       fn = FeatureNode.NewInstance();\r
+                                       Feature feature = Feature.NewInstance();\r
+                                       feature.setKindOf(Feature.DESCRIPTION());\r
+                                       //       <Representation>\r
+                                       //       <Label>Body</Label>\r
+                                       importRepresentation(elDescriptiveConcept, sddNamespace, feature, id, sddConfig);\r
+                                       //System.out.println(feature.getLabel()+id);\r
+                                       features.put("g" + g, feature);\r
+                                       g++;\r
+                                       /*Element elModifiers = elDescriptiveConcept.getChild("Modifiers", sddNamespace);\r
+                                       if (elModifiers !=null){\r
+                                               List<Element> listModifiers = elModifiers.getChildren("Modifier", sddNamespace);\r
+                                               for (Element elModifier : listModifiers) {\r
+                                                               TermVocabulary<Modifier> termVocabularyState = new TermVocabulary<Modifier>("test","test","test","test");\r
+                                                               Modifier modif = Modifier.NewInstance();\r
+                                                               String idmod = elModifier.getAttributeValue("id");\r
+                                                               importRepresentation(elModifier, sddNamespace, modif, idmod, sddConfig);\r
+                                                               termVocabularyState.addTerm(modif);\r
+                                                               //XIMfeature.addRecommendedModifierEnumeration(termVocabularyState);\r
+                                               }\r
+                                       }*/\r
+                                       \r
+                                       fn.setFeature(feature);\r
+\r
+                                       //      TODO if an OriginalSource can be attached to a FeatureNode or a Feature         \r
+                                       //                                      OriginalSource source = null;\r
+                                       //                                      if (uri != null) {\r
+                                       //                                              if (!uri.equals("")) {\r
+                                       //                                                      source = OriginalSource.NewInstance(id, "DescriptiveConcept", Generic.NewInstance(), uri);\r
+                                       //                                              }\r
+                                       //                                      } else {\r
+                                       //                                              source = OriginalSource.NewInstance(id, "DescriptiveConcept");\r
+                                       //                                      }\r
+                                       //                                      f.addSource(source);\r
+\r
+                                       featureNodes.put(id,fn);\r
+                               }\r
+\r
+                               if ((++j % modCount) == 0){ logger.info("DescriptiveConcepts handled: " + j);}\r
 \r
-                       if (copyright != null) {\r
-                               sourceReference.addRights(copyright);\r
                        }\r
+               }\r
+       }\r
+       \r
+       protected void importCharacterTrees(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\r
+               // <CharacterTrees>\r
+               logger.info("start CharacterTrees ...");\r
+               Element elCharacterTrees = elDataset.getChild("CharacterTrees",sddNamespace);\r
 \r
-                       for (Iterator<String> refCD = taxonDescriptions.keySet().iterator() ; refCD.hasNext() ;){\r
-                               String ref = refCD.next();\r
-                               TaxonDescription td = taxonDescriptions.get(ref);\r
-                               if (citations.containsKey(ref)) {\r
-                                       Article publication = (Article) publications.get(citations.get(ref));\r
-                                       if (locations.containsKey(ref)) {\r
-                                               publication.addAnnotation(Annotation.NewInstance(locations.get(ref), datasetLanguage));\r
+               // <CharacterTree>\r
+\r
+               if (elCharacterTrees != null) {\r
+                       List<Element> listCharacterTrees = elCharacterTrees.getChildren("CharacterTree", sddNamespace);\r
+                       int j = 0;\r
+                       //for each CharacterTree\r
+                       for (Element elCharacterTree : listCharacterTrees){\r
+                               try {\r
+                                       Element elRepresentation = elCharacterTree.getChild("Representation",sddNamespace);\r
+                                       String label = (String)ImportHelper.getXmlInputValue(elRepresentation,"Label",sddNamespace);\r
+                                       Element elDesignedFor = elCharacterTree.getChild("DesignedFor",sddNamespace);\r
+                                       /*XIMList<Element> listRoles = elDesignedFor.getChildren("Role",sddNamespace);\r
+                                       boolean isgroups = false;\r
+\r
+                                       for (Element elRole : listRoles){\r
+                                               if (elRole.getText().equals("Filtering")) {\r
+                                                       isgroups = true;\r
+                                               }\r
+                                       }*/\r
+\r
+                                       // only treats the case of flat groups containing characters\r
+                                       // should also be added: dependencies between characters, \r
+                                       //XIM\r
+\r
+                                               FeatureTree feattree =  FeatureTree.NewInstance();\r
+                                               importRepresentation(elCharacterTree, sddNamespace, feattree, "", sddConfig);\r
+                                               FeatureNode root = feattree.getRoot();\r
+                                               //XIM several <Nodes> found in some files, is it correct ?\r
+                                               List<Element> listelNodes = elCharacterTree.getChildren("Nodes", sddNamespace);\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
+                                                                       if (!idN.equals("")) {\r
+                                                                               Element elDescriptiveConcept = elNode.getChild("DescriptiveConcept", sddNamespace);\r
+                                                                               if (elDescriptiveConcept != null){\r
+                                                                                       String refDC = elDescriptiveConcept.getAttributeValue("ref");\r
+                                                                                       //System.out.println(refDC);\r
+                                                                                       fn = featureNodes.get(refDC);\r
+                                                                               }\r
+                                                                               else {\r
+                                                                                       fn = FeatureNode.NewInstance();\r
+                                                                                       featureNodes.put(idN,fn);\r
+                                                                               }\r
+                                                                               Element elParent = elNode.getChild("Parent", sddNamespace);\r
+                                                                               if (elParent!=null){\r
+                                                                                       String refP = elParent.getAttributeValue("ref");\r
+                                                                                       if (!refP.equals("")) {\r
+                                                                                               FeatureNode parent = nodes.get(refP);\r
+                                                                                               parent.addChild(fn);\r
+                                                                                       }\r
+                                                                               }\r
+                                                                               else {\r
+                                                                                       fn = FeatureNode.NewInstance();\r
+                                                                                       root.addChild(fn);\r
+                                                                               }\r
+                                                                       }\r
+                                                                       nodes.put(idN, fn);\r
+                                                               }\r
+                                                               //System.out.println("zic");\r
+                                                               List<Element> listCharNodes = elNodes.getChildren("CharNode", sddNamespace);\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 = nodes.get(refP);\r
+                                                                                       if (parent==null){\r
+                                                                                               parent = root; // because of Delta example\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
+                                                                               // if method setParent() in FeatureNode becomes visible\r
+                                                                               // fn.setParent(parent);\r
+                                                                       }\r
+                                                                       else {\r
+                                                                               refC = String.valueOf(taxonNamesCount);\r
+                                                                               taxonNamesCount++;\r
+                                                                       }\r
+                                                                       nodes.put(refC, fn);\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                               featureTrees.add(feattree);\r
                                        }\r
-                                       td.addDescriptionSource(publication);\r
+\r
+                               catch (Exception e) {\r
+                                       //FIXME\r
+                                       logger.warn("Import of Character tree " + j + " failed.");\r
+                                       success = false; \r
                                }\r
-                       }\r
 \r
-                       if ((++i % modCount) == 0){ logger.info("Datasets handled: " + i);}\r
+                               if ((++j % modCount) == 0){ logger.info("CharacterTrees handled: " + j);}\r
 \r
-                       config.setSourceReference(sourceReference);\r
+                       }\r
 \r
                }\r
-               logger.info(i + " Datasets handled");\r
+       }\r
 \r
-               TransactionStatus ts = config.getCdmAppController().startTransaction();\r
-               \r
-               ITermService termService = config.getCdmAppController().getTermService();\r
-               for (Iterator<State> k = states.values().iterator() ; k.hasNext() ;){\r
-                       State state = k.next();\r
-                       termService.saveTerm(state); \r
-               }\r
-               for (Iterator<Feature> k = features.values().iterator() ; k.hasNext() ;){\r
-                       Feature feature = k.next();\r
-                       termService.saveTerm(feature); \r
-               }\r
-               if (units != null) {\r
-                       for (Iterator<MeasurementUnit> k = units.values().iterator() ; k.hasNext() ;){\r
-                               MeasurementUnit unit = k.next();\r
-                               if (unit != null) {\r
-                                       termService.saveTerm(unit); \r
+       \r
+       \r
+       \r
+       \r
+       protected void importTaxonHierarchies(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\r
+\r
+               logger.info("start TaxonHierarchies ...");\r
+               Element elTaxonHierarchies = elDataset.getChild("TaxonHierarchies",sddNamespace);\r
+\r
+               if (elTaxonHierarchies != null) {\r
+                       List<Element> listTaxonHierarchies = elTaxonHierarchies.getChildren("TaxonHierarchy", sddNamespace);\r
+                       int j = 0;\r
+                       for (Element elTaxonHierarchy : listTaxonHierarchies){\r
+                               try {\r
+                                       Element elRepresentation = elTaxonHierarchy.getChild("Representation",sddNamespace);\r
+                                       String label = (String)ImportHelper.getXmlInputValue(elRepresentation,"Label",sddNamespace);\r
+\r
+                                               TaxonomicTree taxonomicTree =  TaxonomicTree.NewInstance(label);\r
+                                               importRepresentation(elTaxonHierarchy, sddNamespace, taxonomicTree, "", sddConfig);\r
+                                               Set<TaxonNode> root = taxonomicTree.getRootNodes();\r
+                                               Element elNodes = elTaxonHierarchy.getChild("Nodes", sddNamespace);\r
+                                               List<Element> listNodes = elNodes.getChildren("Node", sddNamespace);\r
+                                               for (Element elNode : listNodes){\r
+                                                       String idN = elNode.getAttributeValue("id");\r
+                                                       TaxonNameBase tnb = null;\r
+                                                       if (!idN.equals("")) {\r
+                                                               Element elTaxonName = elNode.getChild("TaxonName", sddNamespace);\r
+                                                               String refTN = elTaxonName.getAttributeValue("ref");\r
+                                                               tnb = taxonNameBases.get(refTN);\r
+                                                               Taxon taxonou = (Taxon) tnb.getTaxa().iterator().next() ;\r
+                                                               Element elParent = elNode.getChild("Parent", sddNamespace);\r
+                                                               if (elParent!=null){\r
+                                                                       String refP = elParent.getAttributeValue("ref");\r
+                                                                       if (!refP.equals("")) {\r
+                                                                               TaxonNode parent = taxonNodes.get(refP);\r
+                                                                               //TaxonNode child = parent.addChildTaxon(Taxon.NewInstance(tnb, sec), sec, "", Synonym.NewInstance(tnb, sec));\r
+                                                                               TaxonNode child = parent.addChildTaxon(taxonou, sec, "", Synonym.NewInstance(tnb, sec));\r
+                                                                               taxonNodes.put(idN,child);\r
+                                                                       }\r
+                                                               }\r
+                                                               else {\r
+                                                                       //XIM addChildtaxon (taxon, referencebase ???\r
+                                                                       //TaxonNode tn = taxonomicTree.addChildTaxon(Taxon.NewInstance(tnb, sec), sec, "", Synonym.NewInstance(tnb, sec));\r
+                                                                       TaxonNode tn = taxonomicTree.addChildTaxon(taxonou, sec, "", Synonym.NewInstance(tnb, sec));\r
+                                                                       taxonNodes.put(idN,tn);\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               taxonomicTrees.add(taxonomicTree);\r
+                                       }\r
+\r
+                               catch (Exception e) {\r
+                                       //FIXME\r
+                                       logger.warn("Import of Taxon Hierarchy " + j + " failed.");\r
+                                       success = false; \r
                                }\r
+\r
+                               if ((++j % modCount) == 0){ logger.info("TaxonHierarchies handled: " + j);}\r
+\r
                        }\r
+\r
                }\r
-               for (Iterator<StatisticalMeasure> k = statisticalMeasures.iterator() ; k.hasNext() ;) {\r
-                       StatisticalMeasure sm = k.next();\r
-                       termService.saveTerm(sm); \r
-               }\r
+       }\r
+       \r
+       \r
+       \r
+       \r
+       \r
+       \r
+       \r
+       \r
+       \r
+       // imports the descriptions of taxa (specimens TODO)\r
+       protected void importCharacterTrees2(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\r
+               // <CharacterTrees>\r
+               logger.info("start CharacterTrees ...");\r
+               Element elCharacterTrees = elDataset.getChild("CharacterTrees",sddNamespace);\r
+\r
+               // <CharacterTree>\r
+\r
+               if (elCharacterTrees != null) {\r
+                       List<Element> listCharacterTrees = elCharacterTrees.getChildren("CharacterTree", sddNamespace);\r
+                       int j = 0;\r
+                       //for each CharacterTree\r
+                       for (Element elCharacterTree : listCharacterTrees){\r
 \r
-               IReferenceService referenceService = config.getCdmAppController().getReferenceService();\r
+                               try {\r
+                                       Element elRepresentation = elCharacterTree.getChild("Representation",sddNamespace);\r
+                                       String label = (String)ImportHelper.getXmlInputValue(elRepresentation,"Label",sddNamespace);\r
+                                       Element elDesignedFor = elCharacterTree.getChild("DesignedFor",sddNamespace);\r
+                                       List<Element> listRoles = elDesignedFor.getChildren("Role",sddNamespace);\r
+                                       boolean isgroups = false;\r
+\r
+                                       for (Element elRole : listRoles){\r
+                                               if (elRole.getText().equals("Filtering")) {\r
+                                                       isgroups = true;\r
+                                               }\r
+                                       }\r
 \r
-               for (Iterator<ReferenceBase> k = publications.values().iterator() ; k.hasNext() ;){\r
-                       Article publication = (Article) k.next();\r
-                       referenceService.saveReference(publication); \r
-               }\r
+                                       // only treats the case of flat groups containing characters\r
+                                       // should also be added: dependencies between characters, \r
+                                       //XIM\r
+                                       if ((label.contains("group")) || (isgroups) || (1==1)) {\r
+\r
+                                               FeatureTree groups =  FeatureTree.NewInstance();\r
+                                               importRepresentation(elCharacterTree, sddNamespace, groups, "", sddConfig);\r
+                                               FeatureNode root = groups.getRoot();\r
+                                               \r
+                                               Element elNodes = elCharacterTree.getChild("Nodes", sddNamespace);\r
+                                               List<Element> listNodes = elNodes.getChildren("Node", sddNamespace);\r
+                                               for (Element elNode : listNodes){\r
+                                                       String idN = elNode.getAttributeValue("id");\r
+                                                       FeatureNode fn = null;\r
+                                                       if (!idN.equals("")) {\r
+                                                               Element elDescriptiveConcept = elNode.getChild("DescriptiveConcept", sddNamespace);\r
+                                                               String refDC = elDescriptiveConcept.getAttributeValue("ref");\r
+                                                               fn = featureNodes.get(refDC);\r
+                                                               root.addChild(fn);\r
+                                                       }\r
+                                                       nodes.put(idN, fn);\r
+                                               }\r
 \r
-               // Returns a CdmApplicationController created by the values of this configuration.\r
-               IDescriptionService descriptionService = config.getCdmAppController().getDescriptionService();\r
+                                               List<Element> listCharNodes = elNodes.getChildren("CharNode", sddNamespace);\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.equals("")) {\r
+                                                                       FeatureNode parent = nodes.get(refP);\r
+                                                                       parent.addChild(fn);\r
+                                                               }\r
+                                                       }\r
+                                                       String refC = elCharacter.getAttributeValue("ref");\r
+                                                       if (!refC.equals("")){\r
+                                                               Feature character = features.get(refC);\r
+                                                               fn.setFeature(character);\r
+                                                               // if method setParent() in FeatureNode becomes visible\r
+                                                               // fn.setParent(parent);\r
+                                                       }\r
+                                                       nodes.put(refC, fn);\r
+                                               }\r
+                                               featureTrees.add(groups);\r
+                                       }\r
 \r
-               for (Iterator<TaxonDescription> k = taxonDescriptions.values().iterator() ; k.hasNext() ;){\r
-                       TaxonDescription taxonDescription = k.next();\r
-                       // Persists a Description\r
-                       descriptionService.saveDescription(taxonDescription)\r
-               }\r
+                               } catch (Exception e) {\r
+                                       //FIXME\r
+                                       logger.warn("Import of Character tree " + j + " failed.");\r
+                                       success = false\r
+                               }\r
 \r
-               config.getCdmAppController().commitTransaction(ts);\r
+                               if ((++j % modCount) == 0){ logger.info("CharacterTrees handled: " + j);}\r
 \r
-               //              makeNameSpecificData(nameMap);\r
-               logger.info("end makeTaxonDescriptions ...");\r
-               return success;\r
+                       }\r
 \r
+               }\r
        }\r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
-        */\r
-       protected boolean isIgnore(IImportConfigurator config){\r
-               return false;\r
-       }\r
-\r
 }\r