fix not running ABCD import test, still needs further fixing for OriginalSource handling
authorAndreas Müller <a.mueller@bgbm.org>
Wed, 30 Oct 2013 22:51:25 +0000 (22:51 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Wed, 30 Oct 2013 22:51:25 +0000 (22:51 +0000)
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/specimen/abcd206/in/Abcd206Import.java

index 621f3a3633ad06406fe42d689e9e54713013d486..1d233d740a8b10676800244ce7a58c82cab48b24 100644 (file)
@@ -32,6 +32,7 @@ import org.w3c.dom.NodeList;
 
 import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
+import eu.etaxonomy.cdm.common.CdmUtils;
 import eu.etaxonomy.cdm.common.UriUtils;
 import eu.etaxonomy.cdm.io.specimen.SpecimenImportBase;
 import eu.etaxonomy.cdm.io.specimen.SpecimenUserInteraction;
@@ -400,17 +401,20 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
                 IdentifiableSource sour = getIdentifiableSource(reference,citationDetail);
 
                 try{
-                    if(sour.getCitationMicroReference() !=null && !sour.getCitationMicroReference().isEmpty()) {
-                        dataHolder.docSources.add(sour.getCitation().getTitleCache()+ "---"+sour.getCitationMicroReference());
-                    } else {
-                        dataHolder.docSources.add(sour.getCitation().getTitleCache());
+                    if (sour.getCitation() != null){ 
+                           if(StringUtils.isNotBlank(sour.getCitationMicroReference())) {
+                               dataHolder.docSources.add(sour.getCitation().getTitleCache()+ "---"+sour.getCitationMicroReference());
+                           } else {
+                               dataHolder.docSources.add(sour.getCitation().getTitleCache());
+                           }
                     }
                 }catch(Exception e){
                     logger.warn("oups");
                 }
+                //TODO what do we need tmp for?
                 String tmp = sour.getCitation().getTitleCache();
-                if (!sour.getCitationMicroReference().isEmpty()) {
-                    tmp+=" ("+sour.getCitationMicroReference()+")";
+                if (StringUtils.isNotBlank(sour.getCitationMicroReference())) {
+                    tmp +=" ("+sour.getCitationMicroReference()+")";
                 }
                 reference.addSource(sour);
                 getReferenceService().saveOrUpdate(reference);
@@ -518,24 +522,36 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
      * @param citationDetail
      * @return
      */
+    //FIXME this method is highly critical, because
+    //  * it will have serious performance and memory problems with large databases
+    //        (databases may easily have >1 Mio source records)
+    //  * it does not make sense to search for existing sources and then clone them
+    //    we need to search for existing references instead and use them (if exist) 
+    //    for our new source.
     private IdentifiableSource getIdentifiableSource(Reference<?> reference, String citationDetail) {
 
         List<OriginalSourceBase> issTmp = getCommonService().list(IdentifiableSource.class, null, null, null, null);
 
-
-        try {
-            for (OriginalSourceBase<?> osb:issTmp){
-                if (osb.getCitation().getTitleCache().equalsIgnoreCase(reference.getTitleCache())
-                        && osb.getCitationMicroReference().equalsIgnoreCase(citationDetail)) {
-                    System.out.println("REFERENCE FOUND RETURN EXISTING SOURCE");
-                    return (IdentifiableSource) osb.clone();
-                }
-            }
-        } catch (CloneNotSupportedException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-
+        
+        if (reference != null){
+               try {
+                       for (OriginalSourceBase<?> osb: issTmp){
+                       if (osb.getCitation() != null && osb.getCitation().getTitleCache().equalsIgnoreCase(reference.getTitleCache())){
+                               String osbDetail = osb.getCitationMicroReference();
+                               if (StringUtils.isBlank(osbDetail) && StringUtils.isBlank(citationDetail)
+                                               || osbDetail != null && osbDetail.equalsIgnoreCase(citationDetail) ) {
+                                   System.out.println("REFERENCE FOUND RETURN EXISTING SOURCE");
+                                   return (IdentifiableSource) osb.clone();
+                               }
+                       }
+                   }
+               } catch (CloneNotSupportedException e) {
+                   throw new RuntimeException(e);
+               } catch (Exception e1){
+                       e1.printStackTrace();
+               }
+        }
+               
         IdentifiableSource sour = IdentifiableSource.NewInstance(OriginalSourceType.Import,null,null, reference,citationDetail);
         return sour;
     }