hide term vocabulary constructors and create factory methods instead
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / sdd / in / SDDImport.java
index f1bd53e68ce99b2616d6442bafd737892d3892c5..c6fe7d36aafce4d8573c1c59f14a66bcd2e6430b 100644 (file)
@@ -11,6 +11,7 @@ package eu.etaxonomy.cdm.io.sdd.in;
 \r
 import java.io.File;\r
 import java.net.MalformedURLException;\r
+import java.net.URI;\r
 import java.net.URL;\r
 import java.text.SimpleDateFormat;\r
 import java.util.ArrayList;\r
@@ -30,6 +31,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.TransactionStatus;\r
 \r
 import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
+import eu.etaxonomy.cdm.common.IProgressMonitor;\r
 import eu.etaxonomy.cdm.common.mediaMetaData.ImageMetaData;\r
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
 import eu.etaxonomy.cdm.io.common.CdmImportBase;\r
@@ -66,6 +68,7 @@ import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
 import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
 import eu.etaxonomy.cdm.model.description.TextData;\r
+import eu.etaxonomy.cdm.model.description.WorkingSet;\r
 import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity;\r
 import eu.etaxonomy.cdm.model.media.ImageFile;\r
@@ -76,12 +79,12 @@ import eu.etaxonomy.cdm.model.media.Rights;
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.occurrence.Specimen;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
+import eu.etaxonomy.cdm.model.taxon.Classification;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;\r
 \r
 /**\r
  * @author h.fradin\r
@@ -103,7 +106,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        private Map<String,String> locations = new HashMap<String,String>();\r
        private Map<String,List<CdmBase>> mediaObject_ListCdmBase = new HashMap<String,List<CdmBase>>();\r
        private Map<String,String> mediaObject_Role = new HashMap<String,String>();\r
-       private Map<String,ReferenceBase> publications = new HashMap<String,ReferenceBase>();\r
+       private Map<String,Reference> publications = new HashMap<String,Reference>();\r
        private Map<String,State> states = new HashMap<String,State>();\r
        private Map<String,TaxonDescription> taxonDescriptions = new HashMap<String,TaxonDescription>();\r
        private Map<String,NonViralName> taxonNameBases = new HashMap<String,NonViralName>();\r
@@ -114,28 +117,32 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        private Map<String,Modifier> modifiers = new HashMap<String,Modifier>();\r
        \r
        private Set<MarkerType> markerTypes = new HashSet<MarkerType>();\r
+       private Set<TermVocabulary> vocabularies = new HashSet<TermVocabulary>();\r
 \r
        private Set<Feature> descriptiveConcepts = new HashSet<Feature>();\r
        private Set<AnnotationType> annotationTypes = new HashSet<AnnotationType>();\r
-       private Set<Feature> featureSet = new HashSet<Feature>();\r
-       private ReferenceBase sec = ReferenceFactory.newDatabase();\r
-       private ReferenceBase sourceReference = null;\r
+//     private Set<Feature> featureSet = new HashSet<Feature>();\r
+       private Set<Reference> sources = new HashSet<Reference>();\r
+       private Reference sec = ReferenceFactory.newDatabase();\r
+       private Reference sourceReference = null;\r
 \r
        private Language datasetLanguage = null;\r
+       private WorkingSet workingSet = null;\r
 \r
        private Namespace xmlNamespace = Namespace.getNamespace("xml","http://www.w3.org/XML/1998/namespace");\r
 \r
        private String generatorName = "";\r
        private String generatorVersion = "";\r
+       \r
 \r
        private Set<StatisticalMeasure> statisticalMeasures = new HashSet<StatisticalMeasure>();\r
        private Set<VersionableEntity> featureData = new HashSet<VersionableEntity>();\r
        private Set<FeatureTree> featureTrees = new HashSet<FeatureTree>();\r
-       private Set<TaxonomicTree> taxonomicTrees = new HashSet<TaxonomicTree>();\r
+       private Set<Classification> classifications = new HashSet<Classification>();\r
 \r
        private Rights copyright = null;\r
 \r
-       private int taxonNamesCount = 0; //XIM ajout\r
+       private int taxonNamesCount = 0;\r
        \r
        public SDDImport(){\r
                super();\r
@@ -156,8 +163,10 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                \r
                TransactionStatus ts = startTransaction();\r
                SDDImportConfigurator sddConfig = state.getConfig();\r
-\r
+               IProgressMonitor progressMonitor = sddConfig.getProgressMonitor();\r
+                               \r
                logger.info("start Datasets ...");\r
+               \r
                // <Datasets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://rs.tdwg.org/UBIF/2006/" xsi:schemaLocation="http://rs.tdwg.org/UBIF/2006/ ../SDD.xsd">\r
                Element root = sddConfig.getSourceRoot();\r
                Namespace sddNamespace = sddConfig.getSddNamespace();\r
@@ -170,12 +179,16 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
 \r
                //for each Dataset\r
                logger.info("start Dataset ...");\r
+               progressMonitor.beginTask("Importing SDD data", elDatasets.size());\r
                for (Element elDataset : elDatasets){\r
                        success &= importDataset(elDataset, sddNamespace, state);                       \r
-                       if ((++i % modCount) == 0){ logger.info("Datasets handled: " + i);}\r
-                       logger.info(i + " Datasets handled");\r
+//                     if ((++i % modCount) == 0){ logger.info("dataset(s) handled: " + i);}\r
+//                     logger.info(i + " dataset(s) handled");\r
+                       progressMonitor.worked(1);\r
                }\r
                commitTransaction(ts);\r
+               progressMonitor.done();\r
+               logger.info("End of transaction");\r
                return success;\r
        }\r
 \r
@@ -212,17 +225,27 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                        <Detail>This is an example for a very simple SDD file, representing a single description with categorical, quantitative, and text character. Compare also the "Fragment*" examples, which contain more complex examples in the form of document fragments. Intended for version="SDD 1.1".</Detail>\r
               </Representation>\r
                 */\r
+\r
+               \r
+               \r
                Element elRepresentation = parent.getChild("Representation",sddNamespace);\r
                String label = (String)ImportHelper.getXmlInputValue(elRepresentation, "Label",sddNamespace);\r
                String detail = (String)ImportHelper.getXmlInputValue(elRepresentation, "Detail",sddNamespace);\r
+               \r
+               //new\r
+               Representation representation = Representation.NewInstance(detail, label, null, datasetLanguage);\r
+               workingSet.addRepresentation(representation);\r
+               \r
 \r
-               sec.setTitleCache(label, true);\r
-\r
-               if (detail != null) {\r
-                       Annotation annotation = Annotation.NewInstance(detail, datasetLanguage);\r
-                       annotation.setAnnotationType(AnnotationType.EDITORIAL());\r
-                       sec.addAnnotation(annotation);\r
-               }\r
+               //old\r
+//             sec.setTitleCache(label, true);\r
+//\r
+//             if (detail != null) {\r
+//                     Annotation annotation = Annotation.NewInstance(detail, datasetLanguage);\r
+//                     annotation.setAnnotationType(AnnotationType.EDITORIAL());\r
+//                     sec.addAnnotation(annotation);\r
+//             }\r
+               \r
 \r
                List<Element> listMediaObjects = elRepresentation.getChildren("MediaObject",sddNamespace);\r
 \r
@@ -264,7 +287,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                        }\r
                }\r
 \r
-               makeRepresentationMediaObjects(sddNamespace, ve, elRepresentation);\r
+               makeRepresentationMediaObjects(sddNamespace, ve, elRepresentation);//FIXME\r
 \r
        }\r
 \r
@@ -317,7 +340,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                for (Language lang : langLabDet.keySet()){\r
                        List<String> labDet = langLabDet.get(lang);\r
                        if (labDet.get(0) != null){\r
-                               m.addTitle(LanguageString.NewInstance(labDet.get(0), lang));\r
+                               m.putTitle(LanguageString.NewInstance(labDet.get(0), lang));\r
                        }\r
                        if (labDet.size()>1) {\r
                                m.addDescription(labDet.get(1), lang);\r
@@ -351,8 +374,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
         * @param ve\r
         * @param elRepresentation\r
         */\r
-       private void makeRepresentationMediaObjects(Namespace sddNamespace,\r
-                       VersionableEntity ve, Element elRepresentation) {\r
+       private void makeRepresentationMediaObjects(Namespace sddNamespace,     VersionableEntity ve, Element elRepresentation) {\r
                List <Element> listMediaObjects = elRepresentation.getChildren("MediaObject", sddNamespace);\r
                for (Element elMediaObject : listMediaObjects) {\r
                        String ref = null;\r
@@ -365,11 +387,11 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                        if (StringUtils.isNotBlank(ref)) {\r
                                if (ve instanceof TaxonDescription) {\r
                                        TaxonDescription td = (TaxonDescription) ve;\r
-                                       //TODO: ensure that all images are imported\r
                                        if (td.getDescriptionSources().size() > 0) {\r
-                                               this.associateImageWithCdmBase(ref,(ReferenceBase) td.getDescriptionSources().toArray()[0]);\r
+                                               this.associateImageWithCdmBase(ref,(Reference) td.getDescriptionSources().toArray()[0]);\r
                                        } else {\r
-                                               ReferenceBase descriptionSource = ReferenceFactory.newGeneric();\r
+                                               Reference descriptionSource = ReferenceFactory.newGeneric();\r
+                                               sources.add(descriptionSource);\r
                                                td.addDescriptionSource(descriptionSource);\r
                                                this.associateImageWithCdmBase(ref,descriptionSource);\r
                                        }\r
@@ -404,8 +426,8 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                        //TODO\r
                                        String rel = elLink.getAttributeValue("rel");\r
                                        String href = elLink.getAttributeValue("href");\r
-\r
-                                       mr.addRepresentationPart(MediaRepresentationPart.NewInstance(href, null));\r
+                                       URI uri = new URI(href);\r
+                                       mr.addRepresentationPart(MediaRepresentationPart.NewInstance(uri, null));\r
                                        link.addRepresentation(mr);\r
                                        ime.addMedia(link);\r
 \r
@@ -512,11 +534,14 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        protected boolean importDataset(Element elDataset, Namespace sddNamespace, SDDImportState state){                       // <Dataset xml:lang="en-us">\r
                boolean success = true;\r
                SDDImportConfigurator sddConfig = state.getConfig();\r
+\r
+               workingSet = WorkingSet.NewInstance();\r
                importDatasetLanguage(elDataset,sddConfig);\r
                importDatasetRepresentation(elDataset, sddNamespace);\r
                importRevisionData(elDataset, sddNamespace);\r
                importIPRStatements(elDataset, sddNamespace, sddConfig);\r
                importTaxonNames(elDataset, sddNamespace, sddConfig);\r
+\r
                importDescriptiveConcepts(elDataset, sddNamespace, sddConfig);\r
                success &= importCharacters(elDataset, sddNamespace, sddConfig);\r
                importCharacterTrees(elDataset, sddNamespace, sddConfig, success);\r
@@ -527,8 +552,9 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                markerTypes.add(editorMarkerType);\r
                markerTypes.add(geographicAreaMarkerType);\r
                markerTypes.add(descriptiveConceptMarkerType);\r
-\r
+               \r
                //saving of all imported data into the CDM db\r
+               saveVocabularies();\r
                saveFeatures();\r
                saveModifiers();\r
                saveStates();\r
@@ -537,7 +563,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                saveUnits();\r
                saveStatisticalMeasure();               \r
                saveAnnotationType();\r
-               \r
+\r
                success &= importCodedDescriptions(elDataset, sddNamespace, sddConfig);\r
                importAgents(elDataset, sddNamespace, sddConfig, success);\r
                importPublications(elDataset, sddNamespace, sddConfig, success);\r
@@ -545,7 +571,6 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                importTaxonHierarchies(elDataset, sddNamespace, sddConfig, success);\r
                importGeographicAreas(elDataset, sddNamespace, sddConfig);\r
                importSpecimens(elDataset,sddNamespace, sddConfig);\r
-                       \r
                \r
                \r
                if ((authors != null)||(editors != null)) {\r
@@ -563,7 +588,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                        edit.addMarker(marker);\r
                                        team.addTeamMember(edit);\r
                                }\r
-                               }\r
+                       }\r
                        sec.setAuthorTeam(team);\r
                        sourceReference.setAuthorTeam(team);\r
                }\r
@@ -575,7 +600,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                \r
                // Returns a CdmApplicationController created by the values of this configuration.\r
                IDescriptionService descriptionService = getDescriptionService();\r
-\r
+               \r
                for (TaxonDescription taxonDescription : taxonDescriptions.values()){\r
                        // Persists a Description\r
                        descriptionService.save(taxonDescription);\r
@@ -584,7 +609,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                for (String ref : taxonDescriptions.keySet()){\r
                        TaxonDescription td = taxonDescriptions.get(ref);\r
                        if (citations.containsKey(ref)) {\r
-                               ReferenceBase publication = publications.get(citations.get(ref));\r
+                               Reference publication = publications.get(citations.get(ref));\r
                                if (locations.containsKey(ref)) {\r
                                        Annotation location = Annotation.NewInstance(locations.get(ref), datasetLanguage);\r
                                        AnnotationType annotationType = AnnotationType.NewInstance("", "location", "");\r
@@ -596,16 +621,6 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                        }\r
                }\r
                logger.info("end makeTaxonDescriptions ...");\r
-               \r
-               \r
-//             for (Iterator<TermVocabulary<Modifier>> k = termVocabularyStates.iterator() ; k.hasNext() ;){\r
-//                     TermVocabulary<Modifier> termVocabulary = k.next();\r
-//                     getVocabularyService().save(termVocabulary); //XIM\r
-//             }\r
-               \r
-\r
-               //sddConfig.setSourceReference(sourceReference);\r
-\r
 \r
                if (descriptiveConcepts != null) {\r
                        for (Feature feature : descriptiveConcepts) {\r
@@ -616,32 +631,20 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                }\r
                saveFeatures();\r
                \r
-               /*Marker markerd = Marker.NewInstance();\r
-               markerd.setMarkerType(descriptiveConceptMarker);\r
-               Feature fiture = Feature.NewInstance("Fitoure","Fitoure","Fitoure");\r
-               fiture.addMarker(markerd);\r
-               TermVocabulary<Modifier> termVocabularyState = new TermVocabulary<Modifier>("test","test","test","test");\r
-               Modifier modif = new Modifier("zoub","zab","zib");\r
-               termVocabularyState.addTerm(modif);\r
-               getVocabularyService().save(termVocabularyState);\r
-               fiture.addRecommendedModifierEnumeration(termVocabularyState);\r
-               termService.save(modif);\r
-               termService.save(fiture);*/\r
-       \r
-               //XIMtermService.save(editorMarkerType);\r
-               \r
-               //XIMtermService.save(geographicAreaMarkerType);\r
-\r
-               // referenceService.saveReference(sourceReference); \r
-               for (ReferenceBase publication : publications.values()){\r
+               for (Reference publication : publications.values()){\r
                        getReferenceService().save(publication); \r
                }\r
+               \r
+               for (Reference source : sources){\r
+                       getReferenceService().save(source); \r
+               }\r
 \r
                for (FeatureTree featureTree : featureTrees) {\r
                        getFeatureTreeService().save(featureTree);\r
                }\r
-               for (TaxonomicTree taxonomicTree : taxonomicTrees) {\r
-                       getTaxonTreeService().save(taxonomicTree);\r
+               getWorkingSetService().save(workingSet);\r
+               for (Classification classification : classifications) {\r
+                       getClassificationService().save(classification);\r
                }\r
                for (Specimen specimen : specimens.values()) {\r
                        getOccurrenceService().save(specimen);\r
@@ -651,6 +654,16 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                return success;\r
        }\r
 \r
+       /**\r
+        * \r
+        */\r
+       private void saveVocabularies() {\r
+               for (TermVocabulary vocabulary : vocabularies ){\r
+                       getVocabularyService().save(vocabulary);\r
+               }\r
+               \r
+       }\r
+\r
        private void saveAnnotationType() {\r
                for (AnnotationType annotationType: annotationTypes){\r
                        getTermService().save(annotationType); \r
@@ -710,7 +723,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
        protected void importDatasetLanguage(Element elDataset, SDDImportConfigurator sddConfig){\r
                String nameLang = elDataset.getAttributeValue("lang",xmlNamespace);\r
 \r
-               if (!nameLang.equals("")) {\r
+               if (StringUtils.isNotBlank(nameLang)) {\r
                        String iso = nameLang.substring(0, 2);\r
                        datasetLanguage = getTermService().getLanguageByIso(iso);\r
                } else {\r
@@ -939,7 +952,10 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
 \r
                                // <StateDefinition id="s1">\r
                                List<Element> elStateDefinitions = elStates.getChildren("StateDefinition",sddNamespace);\r
-                               TermVocabulary<State> termVocabularyState = new TermVocabulary<State>();\r
+                               TermVocabulary<State> termVocabularyState = TermVocabulary.NewInstance(null, null, null, null);\r
+                               \r
+                               vocabularies.add(termVocabularyState);\r
+                               \r
                                int k = 0;\r
                                //for each StateDefinition\r
                                for (Element elStateDefinition : elStateDefinitions){\r
@@ -955,8 +971,6 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                        }\r
                                        importRepresentation(elStateDefinition, sddNamespace, state, idS, sddConfig);\r
 \r
-                                       //StateData stateData = StateData.NewInstance();\r
-                                       //stateData.setState(state);\r
                                        termVocabularyState.addTerm(state);\r
                                        states.put(idS,state);\r
                                }\r
@@ -1096,7 +1110,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                // <CodedDescriptions>\r
                logger.info("start CodedDescriptions ...");\r
                Element elCodedDescriptions = elDataset.getChild("CodedDescriptions",sddNamespace);\r
-\r
+               \r
                // <CodedDescription id="D101">\r
                if (elCodedDescriptions != null) {\r
                        List<Element> listCodedDescriptions = elCodedDescriptions.getChildren("CodedDescription", sddNamespace);\r
@@ -1127,6 +1141,10 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                        //  <Label>&lt;i&gt;Viola hederacea&lt;/i&gt; Labill. as revised by R. Morris April 8, 2006</Label>\r
                        // </Representation>\r
                        TaxonDescription taxonDescription = TaxonDescription.NewInstance();\r
+                       if (!generatorName.isEmpty()){\r
+                               Annotation annotation = Annotation.NewInstance(generatorName, AnnotationType.TECHNICAL(),Language.DEFAULT());\r
+                               taxonDescription.addAnnotation(annotation);\r
+                       }\r
                        importRepresentation(elCodedDescription, sddNamespace, taxonDescription, idCD, sddConfig);\r
 \r
                        // <Scope>\r
@@ -1152,8 +1170,10 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                        if (taxon != null) {\r
                                taxon.addDescription(taxonDescription);\r
                        }\r
+//                     \r
+                       workingSet.addDescription(taxonDescription);\r
                        \r
-                       taxonDescription.setDescriptiveSystem(featureSet);\r
+//OLD                  taxonDescription.setDescriptiveSystem(featureSet);\r
 \r
                        taxonDescriptions.put(idCD, taxonDescription);//FIXME\r
 \r
@@ -1188,12 +1208,12 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                        nonViralName = HibernateProxyHelper.deproxy(taxon.getName(), NonViralName.class);\r
 //                                                     taxonNameBases.put(id ,tnb);\r
 //                                                     taxonNamesCount++;\r
-                       logger.info("using existing Taxon" + taxon.getTitleCache());\r
+                       logger.info("using existing Taxon " + taxon.getTitleCache());\r
                } else {\r
                        nonViralName.addSource(source);\r
                        taxonNameBases.put(id ,nonViralName);\r
                        taxonNamesCount++;                                              \r
-                       logger.info("creating new Taxon from TaxonName" + nonViralName.getTitleCache());\r
+                       logger.info("creating new Taxon from TaxonName " + nonViralName.getTitleCache());\r
                        taxon = Taxon.NewInstance(nonViralName, sec);\r
                }\r
                return taxon;\r
@@ -1225,7 +1245,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                nonViralName = HibernateProxyHelper.deproxy(taxon.getName(), NonViralName.class);\r
                        }                               \r
                } else {                                                        \r
-                       logger.info("creating new Taxon from TaxonName" + nonViralName.getTitleCache());\r
+                       logger.info("creating new Taxon from TaxonName '" + nonViralName.getTitleCache()+"'");\r
                        taxon = Taxon.NewInstance(nonViralName, sec);\r
                }\r
                \r
@@ -1266,7 +1286,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
 \r
                        // <Content>Free form text</Content>\r
                        String content = (String)ImportHelper.getXmlInputValue(elTextChar, "Content",sddNamespace);\r
-                       textData.putText(content, datasetLanguage);\r
+                       textData.putText(datasetLanguage, content);\r
                        taxonDescription.addElement(textData);\r
                }\r
        }\r
@@ -1495,7 +1515,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                try {\r
 \r
                                        String idP = elPublication.getAttributeValue("id");\r
-                                       ReferenceBase publication = ReferenceFactory.newArticle();\r
+                                       Reference publication = ReferenceFactory.newArticle();\r
                                        importRepresentation(elPublication, sddNamespace, publication, idP, sddConfig);\r
 \r
                                        publications.put(idP,publication);\r
@@ -1550,7 +1570,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                                URL url = new URL(href);\r
                                                                \r
                                                                imageMetaData.readMetaData(url.toURI(), 0);\r
-                                                               image = ImageFile.NewInstance(url.toString(), null, imageMetaData);\r
+                                                               image = ImageFile.NewInstance(url.toURI(), null, imageMetaData);\r
                                                        } catch (MalformedURLException e) {\r
                                                                logger.error("Malformed URL", e);\r
                                                        }\r
@@ -1558,11 +1578,10 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                        String sns = sddConfig.getSourceNameString();\r
                                                        File f = new File(sns);\r
                                                        File parent = f.getParentFile();\r
-                                                       String fi = href;\r
-                                                       //String fi = parent.toString() + File.separator + href; //TODO erase file:/\r
+                                                       String fi = parent.toString() + File.separator + href;\r
                                                        File file = new File(fi);\r
-                                                       imageMetaData.readMetaData(file.toURI(), 0);\r
-                                                       image = ImageFile.NewInstance(file.toString(), null, imageMetaData);\r
+                                                       imageMetaData.readMetaData(new URI(fi), 0); //file\r
+                                                       image = ImageFile.NewInstance(file.toURI(), null, imageMetaData);\r
                                                }\r
                                                MediaRepresentation representation = MediaRepresentation.NewInstance(imageMetaData.getMimeType(), null);\r
                                                representation.addRepresentationPart(image);\r
@@ -1585,10 +1604,10 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                                        //                                                                                      dtb.addMedia(me);\r
                                                                        //                                                                              }\r
                                                                        //                                                                      }\r
-                                                               } else if (lcb.get(k) instanceof ReferenceBase) {\r
-                                                                       ReferenceBase rb = (ReferenceBase) lcb.get(k);\r
-                                                                       //} else if (lcb.get(0) instanceof ReferenceBase) {\r
-                                                                       //ReferenceBase rb = (ReferenceBase) lcb.get(0);\r
+                                                               } else if (lcb.get(k) instanceof Reference) {\r
+                                                                       Reference rb = (Reference) lcb.get(k);\r
+                                                                       //} else if (lcb.get(0) instanceof Reference) {\r
+                                                                       //Reference rb = (Reference) lcb.get(0);\r
                                                                        // rb.setTitleCache(label);\r
                                                                        //                                                                      if (rb!=null) {\r
                                                                        //                                                                              if (k == 0) {\r
@@ -1599,10 +1618,12 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                                        //                                                                                      rb.addMedia(me);\r
                                                                        //                                                                              }\r
                                                                        //                                                                      }\r
-                                                               }/* else if (lcb.get(k) instanceof TaxonNameBase){\r
-                                                                       TaxonNameBase tb = (TaxonNameBase) lcb.get(k);\r
-                                                                       tb.addMedia(media);\r
-                                                       }*/\r
+//                                                              else if (lcb.get(k) instanceof TaxonNameBase){\r
+//                                                                     TaxonNameBase tb = (TaxonNameBase) lcb.get(k);\r
+//                                                                     tb.addMedia(media);\r
+                                                               } else {\r
+                                                                       logger.warn("Can't handle associated media for " + lcb.get(k).getId() + "(" +  lcb.get(k).getClass().getSimpleName()+")"  );\r
+                                                               }\r
                                                        }\r
                                                }\r
                                        }\r
@@ -1662,7 +1683,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                Element elModifiers = elDescriptiveConcept.getChild("Modifiers", sddNamespace);\r
                                        if (elModifiers !=null){\r
                                                List<Element> listModifiers = elModifiers.getChildren("Modifier", sddNamespace);\r
-                                                       TermVocabulary<Modifier> termVocabularyState = new TermVocabulary<Modifier>();\r
+                                                       TermVocabulary<Modifier> termVocabularyState = TermVocabulary.NewInstance(null, null, null, null);\r
                                                for (Element elModifier : listModifiers) {\r
                                                                Modifier modif = Modifier.NewInstance();\r
                                                                String idmod = elModifier.getAttributeValue("id");\r
@@ -1678,7 +1699,7 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                        }\r
                                }\r
                                catch (Exception e) {\r
-                                       logger.warn("Import of DescriptiveConcept " + j + " failed.");\r
+                                       logger.warn("Import of DescriptiveConcept " + j + " failed: " + e.getMessage());\r
                                }\r
                                if ((++j % modCount) == 0){ logger.info("DescriptiveConcepts handled: " + j);}\r
 \r
@@ -1701,80 +1722,23 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                        String label = (String)ImportHelper.getXmlInputValue(elRepresentation,"Label",sddNamespace);\r
                                        //Element elDesignedFor = elCharacterTree.getChild("DesignedFor",sddNamespace);//TODO ?\r
 \r
-                                               FeatureTree feattree =  FeatureTree.NewInstance();\r
-                                               importRepresentation(elCharacterTree, sddNamespace, feattree, "", sddConfig);\r
-                                               FeatureNode root = feattree.getRoot();\r
-                                               List<Element> listelNodes = elCharacterTree.getChildren("Nodes", sddNamespace);\r
+                                       FeatureTree featureTree =  FeatureTree.NewInstance();\r
+                                       importRepresentation(elCharacterTree, sddNamespace, featureTree, "", sddConfig);\r
+                                       FeatureNode root = featureTree.getRoot();\r
+                                       List<Element> listeOfNodes = elCharacterTree.getChildren("Nodes", sddNamespace);\r
 \r
                                        //Nodes of CharacterTrees in SDD always refer to DescriptiveConcepts\r
-                                               for (Element elNodes : listelNodes) {\r
-                                                       List<Element> listNodes = elNodes.getChildren("Node", sddNamespace);\r
-                                                       if (listNodes != null) {\r
-                                                               for (Element elNode : listNodes){\r
-                                                                       String idN = elNode.getAttributeValue("id");\r
-                                                                       FeatureNode fn = null;\r
-                                                               Feature dc = null;\r
-                                                               if (idN!=null) {\r
-                                                                       // DescriptiveConcepts are used as nodes in CharacterTrees\r
-                                                                               Element elDescriptiveConcept = elNode.getChild("DescriptiveConcept", sddNamespace);\r
-                                                                               if (elDescriptiveConcept != null){\r
-                                                                                       String refDC = elDescriptiveConcept.getAttributeValue("ref");\r
-                                                                               dc = features.get(refDC);\r
-                                                                               fn = FeatureNode.NewInstance(dc);\r
-                                                                               }\r
-                                                                       if (fn==null){\r
-                                                                                       fn = FeatureNode.NewInstance();\r
-                                                                               }\r
-                                                                               Element elParent = elNode.getChild("Parent", sddNamespace);\r
-                                                                       // in SDD links between Nodes are referenced by the <Parent> tag\r
-                                                                               if (elParent!=null){\r
-                                                                                       String refP = elParent.getAttributeValue("ref");\r
-                                                                               if (refP!=null) {\r
-                                                                                       FeatureNode parent = featureNodes.get(refP);\r
-                                                                                       if (parent==null){\r
-                                                                                               root.addChild(fn); // if no parent found or the reference is broken, add the node to the root of the tree\r
-                                                                                       }\r
-                                                                                       else {\r
-                                                                                               parent.addChild(fn);\r
-                                                                                       }\r
-                                                                               }\r
-                                                                       }\r
-                                                                               else {\r
-                                                                               root.addChild(fn); // if no parent found or the reference is broken, add the node to the root of the tree\r
-                                                                               }\r
-                                                                       }\r
-                                                               featureNodes.put(idN, fn);\r
-                                                               }\r
-                                               }\r
-\r
-                                               // Leaves of CharacterTrees in SDD are always CharNodes (referring to Characters)\r
-                                                               List<Element> listCharNodes = elNodes.getChildren("CharNode", sddNamespace);\r
-                                               if (listCharNodes != null) {\r
-                                                               for (Element elCharNode : listCharNodes){\r
-                                                                       Element elParent = elCharNode.getChild("Parent", sddNamespace);\r
-                                                                       Element elCharacter = elCharNode.getChild("Character", sddNamespace);                                                   \r
-                                                                       FeatureNode fn = FeatureNode.NewInstance();\r
-                                                                       if (elParent!=null){\r
-                                                                               String refP = elParent.getAttributeValue("ref");\r
-                                                                               if ((refP!=null)&&(!refP.equals(""))) {\r
-                                                                               FeatureNode parent = featureNodes.get(refP);\r
-                                                                                       if (parent==null){\r
-                                                                                       parent = root; // if no parent found or the reference is broken, add the node to the root of the tree\r
-                                                                                       }\r
-                                                                                       parent.addChild(fn);\r
-                                                                               }\r
-                                                                       }\r
-                                                                       String refC = elCharacter.getAttributeValue("ref");\r
-                                                                       if ((refC!=null)&&(!refC.equals(""))){\r
-                                                                               Feature character = features.get(refC);\r
-                                                                               fn.setFeature(character);\r
-                                                               featureNodes.put(refC, fn);\r
-                                                                       }\r
-                                                       }               \r
-                                                                       }\r
-                                                               }\r
-                                               featureTrees.add(feattree);\r
+                                       for (Element elNodes : listeOfNodes) {\r
+                                               handleCharacterNodes(sddNamespace, root, elNodes);\r
+                                       }\r
+                                       featureTrees.add(featureTree);\r
+                                       if (workingSet.getDescriptiveSystem() != null){\r
+                                               //TODO how to handle multiple \r
+                                               logger.warn("Multiple feature trees not yet supported");\r
+                                       }else{\r
+                                               workingSet.setDescriptiveSystem(featureTree);\r
                                        }\r
+                               }\r
 \r
                                catch (Exception e) {\r
                                        logger.warn("Import of Character tree " + j + " failed.");\r
@@ -1787,6 +1751,105 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                }\r
        }\r
 \r
+       /**\r
+        * @param sddNamespace\r
+        * @param root\r
+        * @param elNodes\r
+        */\r
+       private void handleCharacterNodes(Namespace sddNamespace, FeatureNode root, Element elNodes) {\r
+               List<Element> listNodes = elNodes.getChildren("Node", sddNamespace);\r
+               if (listNodes != null) {\r
+                       for (Element elNode : listNodes){\r
+                               String idN = elNode.getAttributeValue("id");\r
+                               FeatureNode fn = null;\r
+                               Feature dc = null;\r
+                               if (idN!=null) {\r
+                                       // DescriptiveConcepts are used as nodes in CharacterTrees\r
+                                       Element elDescriptiveConcept = elNode.getChild("DescriptiveConcept", sddNamespace);\r
+                                       if (elDescriptiveConcept != null){\r
+                                               String refDC = elDescriptiveConcept.getAttributeValue("ref");\r
+                                               dc = features.get(refDC);\r
+                                               fn = FeatureNode.NewInstance(dc);\r
+                                       }\r
+                                       if (fn==null){\r
+                                               fn = FeatureNode.NewInstance();\r
+                                       }\r
+                                       Element elParent = elNode.getChild("Parent", sddNamespace);\r
+                                       // in SDD links between Nodes are referenced by the <Parent> tag\r
+                                       if (elParent!=null){\r
+                                               String refP = elParent.getAttributeValue("ref");\r
+                                               if (refP!=null) {\r
+                                                       FeatureNode parent = featureNodes.get(refP);\r
+                                                       if (parent==null){\r
+                                                               root.addChild(fn); // if no parent found or the reference is broken, add the node to the root of the tree\r
+                                                       }\r
+                                                       else {\r
+                                                               parent.addChild(fn);\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       else {\r
+                                               root.addChild(fn); // if no parent found or the reference is broken, add the node to the root of the tree\r
+                                       }\r
+                               }\r
+                               featureNodes.put(idN, fn);\r
+                       }\r
+               }\r
+\r
+               // Leaves of CharacterTrees in SDD are always CharNodes (referring to Characters)\r
+               List<Element> listCharNodes = elNodes.getChildren("CharNode", sddNamespace);\r
+               if (listCharNodes != null) {\r
+                       for (Element elCharNode : listCharNodes){\r
+                               Element elParent = elCharNode.getChild("Parent", sddNamespace);\r
+                               Element elCharacter = elCharNode.getChild("Character", sddNamespace);\r
+                               Element elDependencyRules = elCharNode.getChild("DependencyRules", sddNamespace);\r
+                               FeatureNode fn = FeatureNode.NewInstance();\r
+                               \r
+                               if (elDependencyRules!=null){\r
+                                       Element elInapplicableIf = elCharNode.getChild("InapplicableIf", sddNamespace);\r
+                                       if (elInapplicableIf!=null){\r
+                                               List<Element> listStates = elInapplicableIf.getChildren("State", sddNamespace);\r
+                                               for (Element stateElement : listStates) {\r
+                                                       String refState = stateElement.getAttributeValue("ref");\r
+                                                       if ((refState!=null)&&(!refState.equals(""))) {\r
+                                                               State state = states.get(refState);\r
+                                                               fn.addInapplicableState(state);\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       Element elOnlyapplicableIf = elCharNode.getChild("OnlyApplicableIf", sddNamespace);\r
+                                       if (elOnlyapplicableIf!=null){\r
+                                               List<Element> listStates = elInapplicableIf.getChildren("State", sddNamespace);\r
+                                               for (Element stateElement : listStates) {\r
+                                                       String refState = stateElement.getAttributeValue("ref");\r
+                                                       if ((refState!=null)&&(!refState.equals(""))) {\r
+                                                               State state = states.get(refState);\r
+                                                               fn.addApplicableState(state);\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                               \r
+                               if (elParent!=null){\r
+                                       String refP = elParent.getAttributeValue("ref");\r
+                                       if ((refP!=null)&&(!refP.equals(""))) {\r
+                                       FeatureNode parent = featureNodes.get(refP);\r
+                                               if (parent==null){\r
+                                               parent = root; // if no parent found or the reference is broken, add the node to the root of the tree\r
+                                               }\r
+                                               parent.addChild(fn);\r
+                                       }\r
+                               }\r
+                               String refC = elCharacter.getAttributeValue("ref");\r
+                               if ((refC!=null)&&(!refC.equals(""))){\r
+                                       Feature character = features.get(refC);\r
+                                       fn.setFeature(character);\r
+                                       featureNodes.put(refC, fn);\r
+                               }\r
+                       }               \r
+               }\r
+       }\r
+\r
        // imports the <TaxonHierarchies> block\r
        protected void importTaxonHierarchies(Element elDataset, Namespace sddNamespace, SDDImportConfigurator sddConfig, boolean success){\r
 \r
@@ -1800,10 +1863,10 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                try {\r
                                        Element elRepresentation = elTaxonHierarchy.getChild("Representation",sddNamespace);\r
                                        String label = (String)ImportHelper.getXmlInputValue(elRepresentation,"Label",sddNamespace);\r
-                                               TaxonomicTree taxonomicTree =  TaxonomicTree.NewInstance(label);\r
-                                               importRepresentation(elTaxonHierarchy, sddNamespace, taxonomicTree, "", sddConfig);\r
+                                               Classification classification =  Classification.NewInstance(label);\r
+                                               importRepresentation(elTaxonHierarchy, sddNamespace, classification, "", sddConfig);\r
                                        \r
-                                               Set<TaxonNode> root = taxonomicTree.getChildNodes();\r
+                                               Set<TaxonNode> root = classification.getChildNodes();\r
                                                Element elNodes = elTaxonHierarchy.getChild("Nodes", sddNamespace); // There can be only one <Nodes> block for TaxonHierarchies\r
                                                List<Element> listNodes = elNodes.getChildren("Node", sddNamespace);\r
                                                \r
@@ -1825,13 +1888,13 @@ public class SDDImport extends CdmImportBase<SDDImportConfigurator, SDDImportSta
                                                                        }\r
                                                                }\r
                                                                else {\r
-                                                                       TaxonNode tn = taxonomicTree.addChildTaxon(taxon, sec, "", Synonym.NewInstance(tnb, sec)); // if no parent found or the reference is broken, add the node to the root of the tree\r
+                                                                       TaxonNode tn = classification.addChildTaxon(taxon, sec, "", Synonym.NewInstance(tnb, sec)); // if no parent found or the reference is broken, add the node to the root of the tree\r
                                                                        taxonNodes.put(idN,tn);\r
                                                                }\r
                                                        }\r
                                                }\r
 \r
-                                               taxonomicTrees.add(taxonomicTree);\r
+                                               classifications.add(classification);\r
                                        }\r
 \r
                                catch (Exception e) {\r