hide term vocabulary constructors and create factory methods instead
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / common / CdmImportBase.java
index 78e8ef13ba357302feaa622ddf5e7389d682cdab..3df048528e037b6d884f14983d395863cdbf175d 100644 (file)
@@ -12,9 +12,9 @@ package eu.etaxonomy.cdm.io.common;
 import java.net.MalformedURLException;\r
 import java.net.URI;\r
 import java.net.URISyntaxException;\r
-import java.net.URL;\r
 import java.sql.ResultSet;\r
 import java.sql.SQLException;\r
+import java.util.HashSet;\r
 import java.util.Set;\r
 import java.util.UUID;\r
 \r
@@ -35,9 +35,11 @@ import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
 import eu.etaxonomy.cdm.model.common.IdentifiableSource;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.MarkerType;\r
+import eu.etaxonomy.cdm.model.common.Representation;\r
 import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
+import eu.etaxonomy.cdm.model.description.PresenceTerm;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
 import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.location.NamedAreaLevel;\r
@@ -48,8 +50,10 @@ import eu.etaxonomy.cdm.model.media.MediaRepresentation;
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.reference.Reference;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\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.TaxonBase;\r
 \r
 /**\r
  * @author a.mueller\r
@@ -111,13 +115,18 @@ public abstract class CdmImportBase<CONFIG extends IImportConfigurator, STATE ex
        \r
        \r
        protected ExtensionType getExtensionType(STATE state, UUID uuid, String label, String text, String labelAbbrev){\r
+               if (uuid == null){\r
+                       uuid = UUID.randomUUID();\r
+               }\r
                ExtensionType extensionType = state.getExtensionType(uuid);\r
                if (extensionType == null){\r
                        extensionType = (ExtensionType)getTermService().find(uuid);\r
                        if (extensionType == null){\r
                                extensionType = ExtensionType.NewInstance(text, label, labelAbbrev);\r
                                extensionType.setUuid(uuid);\r
-                               ExtensionType.DOI().getVocabulary().addTerm(extensionType);\r
+                               UUID uuidExtensionTypeVoc = UUID.fromString("117cc307-5bd4-4b10-9b2f-2e14051b3b20");\r
+                               TermVocabulary voc = getVocabularyService().find(uuidExtensionTypeVoc);\r
+                               voc.addTerm(extensionType);\r
                                getTermService().save(extensionType);\r
                        }\r
                        state.putExtensionType(extensionType);\r
@@ -147,13 +156,18 @@ public abstract class CdmImportBase<CONFIG extends IImportConfigurator, STATE ex
        }\r
        \r
        protected MarkerType getMarkerType(STATE state, UUID uuid, String label, String text, String labelAbbrev){\r
+               if (uuid == null){\r
+                       uuid = UUID.randomUUID();\r
+               }\r
                MarkerType markerType = state.getMarkerType(uuid);\r
                if (markerType == null){\r
                        markerType = (MarkerType)getTermService().find(uuid);\r
                        if (markerType == null){\r
                                markerType = MarkerType.NewInstance(label, text, labelAbbrev);\r
                                markerType.setUuid(uuid);\r
-                               MarkerType.COMPLETE().getVocabulary().addTerm(markerType);\r
+                               UUID uuidMarkerTypeVoc = UUID.fromString("19dffff7-e142-429c-a420-5d28e4ebe305");\r
+                               TermVocabulary voc = getVocabularyService().find(uuidMarkerTypeVoc);\r
+                               voc.addTerm(markerType);\r
                                getTermService().save(markerType);\r
                        }\r
                        state.putMarkerType(markerType);\r
@@ -162,13 +176,18 @@ public abstract class CdmImportBase<CONFIG extends IImportConfigurator, STATE ex
        }\r
        \r
        protected AnnotationType getAnnotationType(STATE state, UUID uuid, String label, String text, String labelAbbrev){\r
+               if (uuid == null){\r
+                       uuid = UUID.randomUUID();\r
+               }\r
                AnnotationType annotationType = state.getAnnotationType(uuid);\r
                if (annotationType == null){\r
                        annotationType = (AnnotationType)getTermService().find(uuid);\r
                        if (annotationType == null){\r
                                annotationType = AnnotationType.NewInstance(label, text, labelAbbrev);\r
                                annotationType.setUuid(uuid);\r
-                               AnnotationType.EDITORIAL().getVocabulary().addTerm(annotationType);\r
+                               UUID uuidAnnotationTypeVoc = UUID.fromString("ca04609b-1ba0-4d31-9c2e-aa8eb2f4e62d");\r
+                               TermVocabulary voc = getVocabularyService().find(uuidAnnotationTypeVoc);\r
+                               voc.addTerm(annotationType);\r
                                getTermService().save(annotationType);\r
                        }\r
                        state.putAnnotationType(annotationType);\r
@@ -176,6 +195,7 @@ public abstract class CdmImportBase<CONFIG extends IImportConfigurator, STATE ex
                return annotationType;\r
        }\r
        \r
+       public static final UUID uuidUserDefinedNamedAreaVocabulary = UUID.fromString("b2238399-a3af-4f6d-b7eb-ff5d0899bf1b");\r
        /**\r
         * Returns a named area for a given uuid by first . If the named area does not\r
         * @param state\r
@@ -188,11 +208,22 @@ public abstract class CdmImportBase<CONFIG extends IImportConfigurator, STATE ex
         * @return\r
         */\r
        protected NamedArea getNamedArea(STATE state, UUID uuid, String label, String text, String labelAbbrev, NamedAreaType areaType, NamedAreaLevel level){\r
+               return getNamedArea(state, uuid, label, text, labelAbbrev, areaType, level, null);\r
+       }\r
+\r
+       protected NamedArea getNamedArea(STATE state, UUID uuid, String label, String text, String labelAbbrev, NamedAreaType areaType, NamedAreaLevel level, TermVocabulary voc){\r
+               if (uuid == null){\r
+                       uuid = UUID.randomUUID();\r
+               }\r
                NamedArea namedArea = state.getNamedArea(uuid);\r
                if (namedArea == null){\r
                        namedArea = (NamedArea)getTermService().find(uuid);\r
                        if (namedArea == null){\r
                                namedArea = NamedArea.NewInstance(text, label, labelAbbrev);\r
+                               if (voc == null){\r
+                                       voc = getVocabulary(uuidUserDefinedNamedAreaVocabulary, "User defined vocabulary for named areas", "User Defined Named Areas", null);\r
+                               }\r
+                               voc.addTerm(namedArea);\r
                                namedArea.setType(areaType);\r
                                namedArea.setLevel(level);\r
                                namedArea.setUuid(uuid);\r
@@ -233,6 +264,36 @@ public abstract class CdmImportBase<CONFIG extends IImportConfigurator, STATE ex
                }\r
                return feature;\r
        }\r
+       \r
+       /**\r
+        * Returns a presence term for a given uuid by first ...\r
+        * @param state\r
+        * @param uuid\r
+        * @param label\r
+        * @param text\r
+        * @param labelAbbrev\r
+        * @return\r
+        */\r
+       protected PresenceTerm getPresenceTerm(STATE state, UUID uuid, String label, String text, String labelAbbrev){\r
+               if (uuid == null){\r
+                       return null;\r
+               }\r
+               PresenceTerm presenceTerm = state.getPresenceTerm(uuid);\r
+               if (presenceTerm == null){\r
+                       presenceTerm = (PresenceTerm)getTermService().find(uuid);\r
+                       if (presenceTerm == null){\r
+                               presenceTerm = PresenceTerm.NewInstance(text, label, labelAbbrev);\r
+                               presenceTerm.setUuid(uuid);\r
+                               //set vocabulary ; FIXME use another user-defined vocabulary\r
+                               UUID uuidPresenceVoc = UUID.fromString("adbbbe15-c4d3-47b7-80a8-c7d104e53a05"); \r
+                               TermVocabulary<PresenceTerm> voc = getVocabularyService().find(uuidPresenceVoc);\r
+                               voc.addTerm(presenceTerm);\r
+                               getTermService().save(presenceTerm);\r
+                       }\r
+                       state.putPresenceTerm(presenceTerm);\r
+               }\r
+               return presenceTerm;\r
+       }\r
 \r
        /**\r
         * Returns a language for a given uuid by first ...\r
@@ -265,6 +326,22 @@ public abstract class CdmImportBase<CONFIG extends IImportConfigurator, STATE ex
                return language;\r
        }\r
        \r
+\r
+       /**\r
+        * @param uuid \r
+        * @return\r
+        * \r
+        */\r
+       protected TermVocabulary getVocabulary(UUID uuid, String text, String label, String abbrev) {\r
+               TermVocabulary voc = getVocabularyService().find(uuid);\r
+               if (voc == null){\r
+                       voc = TermVocabulary.NewInstance(text, label, abbrev, null);\r
+                       voc.setUuid(uuid);\r
+                       getVocabularyService().save(voc);\r
+               }\r
+               return voc;\r
+       }\r
+       \r
        /**\r
         * Adds an orginal source to a sourceable objects (implemented for Identifiable entity and description element.\r
         * If cdmBase is not sourceable nothing happens.\r
@@ -277,7 +354,7 @@ public abstract class CdmImportBase<CONFIG extends IImportConfigurator, STATE ex
         * @param citation\r
         * @throws SQLException\r
         */\r
-       public void addOriginalSource(CdmBase cdmBase, Object idAttributeValue, String namespace, Reference citation) throws SQLException {\r
+       public void addOriginalSource(CdmBase cdmBase, Object idAttributeValue, String namespace, Reference citation)  {\r
                if (cdmBase instanceof ISourceable ){\r
                        IOriginalSource source;\r
                        ISourceable sourceable = (ISourceable)cdmBase;\r
@@ -293,6 +370,10 @@ public abstract class CdmImportBase<CONFIG extends IImportConfigurator, STATE ex
                                return;\r
                        }\r
                        sourceable.addSource(source);\r
+               }else if (cdmBase != null){\r
+                       logger.warn("Sourced object does not implement ISourceable: " + cdmBase.getClass() + "," + cdmBase.getUuid());\r
+               }else{\r
+                       logger.warn("Sourced object is null");\r
                }\r
        }\r
        \r
@@ -371,6 +452,50 @@ public abstract class CdmImportBase<CONFIG extends IImportConfigurator, STATE ex
                return result;\r
        }\r
        \r
+       \r
+       /**\r
+        * Returns the accepted taxon of a {@link TaxonBase taxon base}. <BR>\r
+        * If taxonBase is of type taxon the same object is returned. If taxonBase is of type\r
+        * synonym the accepted taxon is returned if one exists. If no accepted taxon exists\r
+        * <code>null</code> is returned. If multiple accepted taxa exist the one taxon with the \r
+        * same secundum reference is returned. If no such single taxon exists an \r
+        * {@link IllegalStateException illegal state exception} is thrown.  \r
+        * @param taxonBase\r
+        * @return\r
+        */\r
+       protected Taxon getAcceptedTaxon(TaxonBase<?> taxonBase) {\r
+               if (taxonBase == null){\r
+                       return null;\r
+               }else if(taxonBase.isInstanceOf(Taxon.class)){\r
+                       return CdmBase.deproxy(taxonBase, Taxon.class);\r
+               }else if(taxonBase.isInstanceOf(Synonym.class)){\r
+                       Synonym synonym = CdmBase.deproxy(taxonBase, Synonym.class);\r
+                       Set<Taxon> acceptedTaxa = synonym.getAcceptedTaxa();\r
+                       if (acceptedTaxa.size() == 0){\r
+                               return null;\r
+                       }else if (acceptedTaxa.size() == 1){\r
+                               return acceptedTaxa.iterator().next();\r
+                       }else{\r
+                               Reference sec = synonym.getSec();\r
+                               if (sec != null){\r
+                                       Set<Taxon> taxaWithSameSec = new HashSet<Taxon>();\r
+                                       for (Taxon taxon: acceptedTaxa){\r
+                                               if (sec.equals(taxon.getSec())){\r
+                                                       taxaWithSameSec.add(taxon);\r
+                                               }\r
+                                       }\r
+                                       if (taxaWithSameSec.size() == 1){\r
+                                               return taxaWithSameSec.iterator().next();\r
+                                       }\r
+                               }\r
+                               throw new IllegalStateException("Can't define the one accepted taxon for a synonym out of multiple accept taxa");\r
+                       }\r
+               }else{\r
+                       throw new IllegalStateException("Unknown TaxonBase subclass: " + taxonBase.getClass().getName());\r
+               }\r
+       }\r
+\r
+       \r
 \r
        /**\r
         * @param derivedUnitFacade\r