ref #6166: parsing of siblings and search for siblings in different accessPoints
authorKatja Luther <k.luther@bgbm.org>
Wed, 12 Apr 2017 13:12:37 +0000 (15:12 +0200)
committerKatja Luther <k.luther@bgbm.org>
Wed, 12 Apr 2017 13:12:37 +0000 (15:12 +0200)
cdmlib-ext/src/main/java/eu/etaxonomy/cdm/ext/occurrence/bioCase/BioCaseQueryGenerator.java
cdmlib-ext/src/main/java/eu/etaxonomy/cdm/ext/occurrence/bioCase/BioCaseQueryServiceWrapper.java
cdmlib-ext/src/main/java/eu/etaxonomy/cdm/ext/occurrence/gbif/GbifJsonOccurrenceParser.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/specimen/SpecimenImportBase.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/specimen/abcd206/in/Abcd206DataHolder.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/specimen/abcd206/in/Abcd206Import.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/specimen/abcd206/in/Abcd206ImportState.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/specimen/abcd206/in/Abcd206XMLFieldGetter.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/specimen/abcd206/in/UnitAssociationParser.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/specimen/abcd206/in/UnitAssociationWrapper.java

index 27b4382b2e0ae1029c7d9c7345ab0774b0e4671e..56fc706d4bbe166f00dc5d32606ee4bde74d1b6f 100644 (file)
@@ -92,7 +92,7 @@ public class BioCaseQueryGenerator {
     private static final String COLLECTOR_PATH_ABCD_2_0 = UNIT_PATH + "/Gathering/Agents/GatheringAgentsText";
     private static final String ACCESSION_NUMBER_PATH_ABCD_2_0 = UNIT_PATH + "/SpecimenUnit/Accessions/AccessionNumber";
     private static final String CAT_PATH_ABCD_2_0 = UNIT_PATH + "/CAT";
-    private static final String ASSOCIATION_UNIT_ID_ABCD_2_0 = UNIT_PATH +"Associations/UnitAssociation/AssociatedUnitID";
+    private static final String ASSOCIATION_UNIT_ID_ABCD_2_0 = UNIT_PATH +"/Associations/UnitAssociation/AssociatedUnitID";
 
     /**
      * Generates an XML query according to the BioCASe protocol.
index d2db30a54474e05b1b9788ecae6b1a7962899aa1..9eb6ac813e9521c8f5f29f8337a8908d3d582a69 100644 (file)
@@ -147,4 +147,42 @@ public class BioCaseQueryServiceWrapper extends ServiceWrapperBase<SpecimenOrObs
         results.add(unit2.innerDerivedUnit());
         return results;
     }
+
+    /**
+     * @param query
+     * @param endPoint
+     * @return
+     */
+    public InputStream querySiblings(OccurenceQuery query, URI endPoint) throws ClientProtocolException, IOException{
+        if(endPoint==null){
+            logger.warn("URI for querying was null.");
+            return null;
+        }
+        if(UriUtils.isServiceAvailable(endPoint, 10000)){
+            //check capabilities for ABCD version
+            Map<String, String> requestHeaders = new HashMap<String, String>();
+            requestHeaders.put(CAPABILITY_TEST_PARAM.getName(), CAPABILITY_TEST_PARAM.getValue());
+            InputStream response = executeHttpGet(endPoint, requestHeaders);
+            String abcdSchema = parseAbcdSchemaVersion(response);
+
+            //build XML query
+            Document doc = BioCaseQueryGenerator.generateXMLQueryForSiblings(query, abcdSchema);
+            String xmlOutputString = new XMLOutputter(Format.getPrettyFormat()).outputString(doc);
+
+            //POST parameters
+            List<NameValuePair> queryParamsPOST = new ArrayList<NameValuePair>();
+            queryParamsPOST.add(SUBMIT_PARAM);
+            addNameValuePairTo(queryParamsPOST, QUERY_PARAM_NAME, xmlOutputString);
+            UrlEncodedFormEntity httpEntity = new UrlEncodedFormEntity(queryParamsPOST);
+
+            //Query provider
+            logger.info("Querying BioCASE service with " + endPoint + ", POST: " + queryParamsPOST);
+            //FIXME do the ABCD import here
+            return executeHttpPost(endPoint, null, httpEntity);
+        }
+        else{
+            logger.error("Querying " + endPoint + " got a timeout!");
+            return null;
+        }
+    }
 }
index b1508a56cf9b6bd5ff03e4b541d104ec13141b6d..dbb732e1059eb1fea3444b380980df90711380d0 100644 (file)
@@ -257,7 +257,8 @@ public class GbifJsonOccurrenceParser {
                                 name = TaxonNameFactory.NewCultivarInstance(rank);
                             } else if (string.equals(NomenclaturalCode.ICVCN.getTitleCache())){
                                 name = TaxonNameFactory.NewViralInstance(rank);
-                            } else {
+                            } else if (string.equals("ICN")){
+                                name = TaxonNameFactory.NewBotanicalInstance(rank);
                             }
                         }else {
                             if (record.has(KINGDOM)){
@@ -276,6 +277,9 @@ public class GbifJsonOccurrenceParser {
                                 name = TaxonNameFactory.NewNonViralInstance(rank);
                             }
                         }
+                        if (name == null){
+                            name = TaxonNameFactory.NewNonViralInstance(rank);
+                        }
                         if (record.has(GENUS)){
                             name.setGenusOrUninomial(record.getString(GENUS));
                         }
index 9049b441ed4a02293f20a7b700584a45d7636cef..07ddd4038505c9cacec84450e52e917a3e0ac758 100755 (executable)
@@ -27,6 +27,7 @@ import eu.etaxonomy.cdm.api.service.pager.Pager;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.io.common.CdmImportBase;
 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
+import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportState;
 import eu.etaxonomy.cdm.io.specimen.abcd206.in.Identification;
 import eu.etaxonomy.cdm.io.specimen.abcd206.in.SpecimenImportReport;
 import eu.etaxonomy.cdm.model.agent.AgentBase;
@@ -97,7 +98,7 @@ public abstract class SpecimenImportBase<CONFIG extends IImportConfigurator, STA
         * @param state
         * @param item
         */
-       protected abstract void handleSingleUnit(STATE state, Object item) ;
+       protected abstract void handleSingleUnit(STATE state, Object item, boolean handleAssociatedUnits) ;
 
 
 
@@ -1466,4 +1467,14 @@ public abstract class SpecimenImportBase<CONFIG extends IImportConfigurator, STA
                }
            }
 
+        /**
+         * @param state
+         * @param itemObject
+         * @param handleAssociatedUnits
+         */
+        public void handleSingleUnit(Abcd206ImportState state, Object itemObject, boolean handleAssociatedUnits) {
+            // TODO Auto-generated method stub
+
+        }
+
 }
index e8868891eff37803817b7af0575c665c03d24303..ce499cee7b479e23a77e9ac5a4d709b41a13c03b 100644 (file)
@@ -39,7 +39,7 @@ public class Abcd206DataHolder extends SpecimenDataHolder{
 \r
 \r
 \r
-    protected List<String> associatedUnitIds;\r
+    protected List<String[]> associatedUnitIds;\r
 \r
 \r
     protected String institutionCode;\r
@@ -134,7 +134,7 @@ public class Abcd206DataHolder extends SpecimenDataHolder{
         setMultimediaObjects(new HashMap<String,Map<String, String>>());\r
         setGatheringMultimediaObjects(new HashMap<String,Map<String, String>>());\r
         setDocSources(new ArrayList<String>());\r
-        associatedUnitIds = new ArrayList<String>();\r
+        associatedUnitIds = new ArrayList<String[]>();\r
     }\r
 \r
 \r
@@ -222,11 +222,11 @@ public class Abcd206DataHolder extends SpecimenDataHolder{
         return this.gatheringMethod ;\r
 \r
     }\r
-    public void addAssociatedUnitId(String associatedUnitId){\r
+    public void addAssociatedUnitId(String[] associatedUnitId){\r
         this.associatedUnitIds.add(associatedUnitId);\r
     }\r
 \r
-    public List<String> getAssociatedUnitIds(){\r
+    public List<String[]> getAssociatedUnitIds(){\r
         return associatedUnitIds;\r
     }\r
 \r
index bd4cc0fdfa0b12067b2397d6177b153964427eab..77fd85bf80ba1853c26ae0930c8bf38b1573f584 100644 (file)
@@ -125,7 +125,7 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
                     logger.error("An error during ABCD import");
                 }
             }
-            SpecimenUserInteraction sui = ((Abcd206ImportConfigurator)state.getConfig()).getSpecimenUserInteraction();
+            SpecimenUserInteraction sui = state.getConfig().getSpecimenUserInteraction();
 
             //init import reference
         //  List<Reference> references = getReferenceService().list(Reference.class, null, null, null, null);
@@ -154,7 +154,7 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
 //                }
 //            }else{
                 if (state.getRef()==null){
-                    String name = NB(((Abcd206ImportConfigurator) state.getConfig()).getSourceReferenceTitle());
+                    String name = NB(state.getConfig().getSourceReferenceTitle());
                     for (Reference reference : referenceStore.getAllValues()) {
                         if (! StringUtils.isBlank(reference.getTitleCache())) {
                             if (reference.getTitleCache().equalsIgnoreCase(name)) {
@@ -169,16 +169,16 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
                 }
             //}
             save(state.getRef(), state);
-            ((Abcd206ImportConfigurator) state.getConfig()).setSourceReference(state.getRef());
+            state.getConfig().setSourceReference(state.getRef());
 
-            if(((Abcd206ImportConfigurator) state.getConfig()).getClassificationUuid()!=null){
+            if(state.getConfig().getClassificationUuid()!=null){
                 //load classification from config if it exists
-                state.setClassification(getClassificationService().load(((Abcd206ImportConfigurator) state.getConfig()).getClassificationUuid()));
+                state.setClassification(getClassificationService().load(state.getConfig().getClassificationUuid()));
             }
             if(state.getClassification()==null){//no existing classification was set in config
                 List<Classification> classificationList = getClassificationService().list(Classification.class, null, null, null, null);
                 //get classification via user interaction
-                if (((Abcd206ImportConfigurator) state.getConfig()).isUseClassification() && ((Abcd206ImportConfigurator) state.getConfig()).isInteractWithUser()){
+                if (state.getConfig().isUseClassification() && state.getConfig().isInteractWithUser()){
                     Map<String,Classification> classMap = new HashMap<String, Classification>();
                     for (Classification tree : classificationList) {
                         if (! StringUtils.isBlank(tree.getTitleCache())) {
@@ -198,7 +198,7 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
                 }
                 // use default classification as the classification to import into
                 if (state.getClassification() == null) {
-                    String name = NB(((Abcd206ImportConfigurator) state.getConfig()).getClassificationName());
+                    String name = NB(state.getConfig().getClassificationName());
                     for (Classification classif : classificationList){
                         if (classif.getTitleCache() != null && classif.getTitleCache().equalsIgnoreCase(name)) {
                             state.setClassification(classif);
@@ -215,7 +215,7 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
             }
 
             if (response == null){
-                response =(InputStream) ((Abcd206ImportConfigurator) state.getConfig()).getSource();
+                response =state.getConfig().getSource();
             }
             UnitAssociationWrapper unitAssociationWrapper = AbcdParseUtility.parseUnitsNodeList(response, state.getReport());
             NodeList unitsList = unitAssociationWrapper.getAssociatedUnits();
@@ -258,17 +258,20 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
 
                     //import unit + field unit data
                     state.setAssociatedUnitIds(state.getDataHolder().getAssociatedUnitIds());
-                    this.handleSingleUnit(state, item);
+                    this.handleSingleUnit(state, item, true);
 
-//                    if (state.getConfig().isGetSiblings() && (state.getDataHolder().getKindOfUnit().toLowerCase().indexOf("clone")>-1 || state.getDataHolder().getRecordBasis().toLowerCase().indexOf("sample")>-1)){
+//                   if (state.getDataHolder().getKindOfUnit() != null && state.getConfig().isGetSiblings() && (state.getDataHolder().getKindOfUnit().toLowerCase().indexOf("clone")>-1 || state.getDataHolder().getRecordBasis().toLowerCase().indexOf("sample")>-1)){
 //                        getSiblings(state, sourceUri);
 //                    }
+//                   if (state.getConfig().isSearchForAssociatingSpecimen()){
+//                       getAssociatingSpecimen(state, sourceUri);
+//                   }
 
                 }
-                if(((Abcd206ImportConfigurator)state.getConfig()).isDeduplicateReferences()){
+                if(state.getConfig().isDeduplicateReferences()){
                     getReferenceService().deduplicate(Reference.class, null, null);
                 }
-                if(((Abcd206ImportConfigurator)state.getConfig()).isDeduplicateClassifications()){
+                if(state.getConfig().isDeduplicateClassifications()){
                     getClassificationService().deduplicate(Classification.class, null, null);
                 }
             }
@@ -285,32 +288,41 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
         return;
     }
 
+
     /**
      * @param state
      * @param item
      */
-    private void getSiblings(Abcd206ImportState state, URI sourceUri) {
+    private void getSiblings(Abcd206ImportState state, Object item, DerivedUnitFacade facade) {
         NodeList unitAssociationList = null;
 
-        List<String> unitIds = state.getAssociatedUnitIds();
-
+        String unitId = facade.getCatalogNumber();
 
-        URI accessPoint = sourceUri;
-        for (String unitId:unitIds){
             UnitAssociationParser unitParser = new UnitAssociationParser(state.getPrefix(), state.getReport(), state.getCdmRepository());
-            UnitAssociationWrapper unitAssociationWrapper = unitParser.parseSiblings(unitId, accessPoint);
+            UnitAssociationWrapper unitAssociationWrapper = null;
+            for (URI accessPoint: state.getActualAccesPoint()){
+                unitAssociationWrapper = unitParser.parseSiblings(unitId, accessPoint);
+                if (unitAssociationWrapper.getAssociatedUnits() != null){
+                    break;
+                }
+            }
+
             DerivedUnit currentUnit = state.getDerivedUnitBase();
            DerivationEvent currentDerivedFrom = currentUnit.getDerivedFrom();
+           FieldUnit currentFieldUnit = facade.getFieldUnit(false);
             if(unitAssociationWrapper!=null){
                 NodeList associatedUnits = unitAssociationWrapper.getAssociatedUnits();
                 if(associatedUnits!=null){
                     for(int m=0;m<associatedUnits.getLength();m++){
                         if(associatedUnits.item(m) instanceof Element){
                             state.reset();
-                            state.setPrefix(unitAssociationWrapper.getPrefix());
-                            Abcd206ImportParser.setUnitPropertiesXML((Element) associatedUnits.item(m), new Abcd206XMLFieldGetter(state.getDataHolder(), state.getPrefix()), state);
+                            //state.setPrefix(unitAssociationWrapper.getPrefix());
+
+                            String associationType = AbcdParseUtility.parseFirstTextContent(((Element) associatedUnits.item(m)).getElementsByTagName(state.getPrefix()+"AssociationType"));
+
+                            Abcd206ImportParser.setUnitPropertiesXML((Element) associatedUnits.item(m), new Abcd206XMLFieldGetter(state.getDataHolder(), unitAssociationWrapper.getPrefix()), state);
                            // logger.debug("derived unit: " + state.getDerivedUnitBase().toString() + " associated unit: " +state.getDataHolder().getKindOfUnit() + ", " + state.getDataHolder().accessionNumber + ", " + state.getDataHolder().getRecordBasis() + ", " + state.getDataHolder().getUnitID());
-                            handleSingleUnit(state, associatedUnits.item(m));
+                            handleSingleUnit(state, associatedUnits.item(m), false);
 
                             DerivedUnit associatedUnit = state.getDerivedUnitBase();
                             FieldUnit associatedFieldUnit = null;
@@ -327,13 +339,13 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
 
                             //parent-child relation:
                             //copy derivation event and connect parent and sub derivative
-                            if(unitAssociationWrapper.getAssociationType().contains("individual") || unitAssociationWrapper.getAssociationType().contains("culture") ){
+                            if(associationType.contains("individual") || associationType.contains("culture") || associationType.contains("sample")){
                                 if(currentDerivedFrom==null){
                                     state.getReport().addInfoMessage(String.format("No derivation event found for unit %s. Defaulting to ACCESSIONING event.",SpecimenImportUtility.getUnitID(currentUnit, state.getConfig())));
                                     DerivationEvent.NewSimpleInstance(associatedUnit, currentUnit, DerivationEventType.ACCESSIONING());
                                 }
                                 else{
-                                    DerivationEvent updatedDerivationEvent = DerivationEvent.NewSimpleInstance(associatedUnit, currentUnit, currentDerivedFrom.getType());
+                                    DerivationEvent updatedDerivationEvent = DerivationEvent.NewSimpleInstance(currentUnit, associatedUnit, currentDerivedFrom.getType());
                                     updatedDerivationEvent.setActor(currentDerivedFrom.getActor());
                                     updatedDerivationEvent.setDescription(currentDerivedFrom.getDescription());
                                     updatedDerivationEvent.setInstitution(currentDerivedFrom.getInstitution());
@@ -342,15 +354,41 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
                                 }
                                 state.getReport().addDerivate(associatedUnit, currentUnit, state.getConfig());
                             }
+                            //siblings relation
+                            //connect current unit to field unit of associated unit
+                            else if(associationType.contains("population")|| associationType.contains("sample")){
+                                //no associated field unit -> using current one
+                                if(associatedFieldUnit==null){
+                                    if(currentFieldUnit!=null){
+                                        DerivationEvent.NewSimpleInstance(currentFieldUnit, associatedUnit, DerivationEventType.ACCESSIONING());
+                                    }
+                                }
+                                else{
+                                    if(currentDerivedFrom==null){
+                                        state.getReport().addInfoMessage("No derivation event found for unit "+SpecimenImportUtility.getUnitID(currentUnit, state.getConfig())+". Defaulting to ACCESIONING event.");
+                                        DerivationEvent.NewSimpleInstance(associatedFieldUnit, currentUnit, DerivationEventType.ACCESSIONING());
+                                    }
+                                    if(currentDerivedFrom!=null && associatedFieldUnit!=currentFieldUnit){
+                                        DerivationEvent updatedDerivationEvent = DerivationEvent.NewSimpleInstance(associatedFieldUnit, currentUnit, currentDerivedFrom.getType());
+                                        updatedDerivationEvent.setActor(currentDerivedFrom.getActor());
+                                        updatedDerivationEvent.setDescription(currentDerivedFrom.getDescription());
+                                        updatedDerivationEvent.setInstitution(currentDerivedFrom.getInstitution());
+                                        updatedDerivationEvent.setTimeperiod(currentDerivedFrom.getTimeperiod());
+                                    }
+                                }
+                            }
 
 
 
                             save(associatedUnit, state);
-                        }
+
                     }
                 }
             }
         }
+            state.reset();
+            state.setDerivedUnitBase(currentUnit);
+            //state.setPrefix(currentPrefix);
     }
 
     /**
@@ -360,7 +398,7 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
      */
     @Override
     @SuppressWarnings("rawtypes")
-    public void handleSingleUnit(Abcd206ImportState state, Object itemObject) {
+    public void handleSingleUnit(Abcd206ImportState state, Object itemObject, boolean handleAssociatedUnits) {
         Element item = (Element) itemObject;
 
         Abcd206ImportConfigurator config = state.getConfig();
@@ -374,13 +412,15 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
             }
             //check if unit already exists
             DerivedUnitFacade derivedUnitFacade = null;
-            if(((Abcd206ImportConfigurator)state.getConfig()).isIgnoreImportOfExistingSpecimen()){
+            if(state.getConfig().isIgnoreImportOfExistingSpecimen()){
                 SpecimenOrObservationBase<?> existingSpecimen = findExistingSpecimen(state.getDataHolder().getUnitID(), state);
                 if(existingSpecimen!=null && existingSpecimen.isInstanceOf(DerivedUnit.class)){
                     DerivedUnit derivedUnit = HibernateProxyHelper.deproxy(existingSpecimen, DerivedUnit.class);
                     state.setDerivedUnitBase(derivedUnit);
                     derivedUnitFacade = DerivedUnitFacade.NewInstance(state.getDerivedUnitBase());
-                    importAssociatedUnits(state, item, derivedUnitFacade);
+                    if (handleAssociatedUnits){
+                        importAssociatedUnits(state, item, derivedUnitFacade);
+                    }
                     state.getReport().addAlreadyExistingSpecimen(SpecimenImportUtility.getUnitID(derivedUnit, config), derivedUnit);
                     return;
                 }
@@ -530,7 +570,7 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
                         }
 
                         derivedUnitFacade.addDerivedUnitMedia(media);
-                        if(((Abcd206ImportConfigurator)state.getConfig()).isAddMediaAsMediaSpecimen()){
+                        if(state.getConfig().isAddMediaAsMediaSpecimen()){
                             //add media also as specimen scan
                             MediaSpecimen mediaSpecimen = MediaSpecimen.NewInstance(SpecimenOrObservationType.StillImage);
                             mediaSpecimen.setMediaSpecimen(media);
@@ -670,7 +710,7 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
 
             addToSourceMap(sourceMap, osbSet);
 
-            if( ((Abcd206ImportConfigurator) state.getConfig()).isInteractWithUser()){
+            if( state.getConfig().isInteractWithUser()){
                 List<OriginalSourceBase<?>>sources=null;
                 if(!state.isDerivedUnitSourcesSet()){
                     sources= sui.askForSource(sourceMap, "the unit itself","",getReferenceService(), state.getDataHolder().getDocSources());
@@ -721,8 +761,12 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
             handleIdentifications(state, derivedUnitFacade);
 
             //associatedUnits
-            importAssociatedUnits(state, item, derivedUnitFacade);
-
+            if (handleAssociatedUnits){
+                importAssociatedUnits(state, item, derivedUnitFacade);
+            }
+            if (derivedUnitFacade.getType() != null && (derivedUnitFacade.getType().equals(SpecimenOrObservationType.LivingSpecimen) ||  derivedUnitFacade.getType().equals(SpecimenOrObservationType.TissueSample) ) &&state.getConfig().isGetSiblings()){
+                getSiblings(state, item, derivedUnitFacade);
+            }
 
 
         } catch (Exception e) {
@@ -758,6 +802,7 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
                     Element unitAssociation = (Element)unitAssociationList.item(k);
                     UnitAssociationParser unitAssociationParser = new UnitAssociationParser(currentPrefix, state.getReport(), state.getCdmRepository());
                     UnitAssociationWrapper associationWrapper = unitAssociationParser.parse(unitAssociation);
+                    state.addActualAccesPoint(associationWrapper.getAccesPoint());
                     if(associationWrapper!=null){
                         NodeList associatedUnits = associationWrapper.getAssociatedUnits();
                         if(associatedUnits!=null){
@@ -767,7 +812,7 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
                                     state.setPrefix(associationWrapper.getPrefix());
                                     Abcd206ImportParser.setUnitPropertiesXML((Element) associatedUnits.item(m), new Abcd206XMLFieldGetter(state.getDataHolder(), state.getPrefix()), state);
                                     logger.debug("derived unit: " + state.getDerivedUnitBase().toString() + " associated unit: " +state.getDataHolder().getKindOfUnit() + ", " + state.getDataHolder().accessionNumber + ", " + state.getDataHolder().getRecordBasis() + ", " + state.getDataHolder().getUnitID());
-                                    handleSingleUnit(state, associatedUnits.item(m));
+                                    handleSingleUnit(state, associatedUnits.item(m), true);
 
                                     DerivedUnit associatedUnit = state.getDerivedUnitBase();
                                     FieldUnit associatedFieldUnit = null;
@@ -784,7 +829,7 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
 
                                     //parent-child relation:
                                     //copy derivation event and connect parent and sub derivative
-                                    if(associationWrapper.getAssociationType().contains("individual") || associationWrapper.getAssociationType().contains("culture") ){
+                                    if(associationWrapper.getAssociationType().contains("individual") || associationWrapper.getAssociationType().contains("culture") || associationWrapper.getAssociationType().contains("sample")){
                                         if(currentDerivedFrom==null){
                                             state.getReport().addInfoMessage(String.format("No derivation event found for unit %s. Defaulting to ACCESSIONING event.",SpecimenImportUtility.getUnitID(currentUnit, config)));
                                             DerivationEvent.NewSimpleInstance(associatedUnit, currentUnit, DerivationEventType.ACCESSIONING());
index 18985662f5d1da78fc2ec302cdf62074acb6b6d3..aaefcd838178fe3d489ce70e3bdf6cf5cabdc691 100644 (file)
@@ -11,6 +11,7 @@ package eu.etaxonomy.cdm.io.specimen.abcd206.in;
 
 import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -30,7 +31,9 @@ public class Abcd206ImportState
 
        private String prefix;
 
-       private List<String> associatedUnitIds = new ArrayList<String>();
+       private List<String[]> associatedUnitIds = new ArrayList<String[]>();
+
+       private List<URI> actualAccesPoints = new ArrayList<>();
 
 
 //****************** CONSTRUCTOR ***************************************************/
@@ -71,14 +74,28 @@ public class Abcd206ImportState
         return importStream.toByteArray();
     }
 
-    public void setAssociatedUnitIds(List<String> associatedUnitIds){
+    public void setAssociatedUnitIds(List<String[]> associatedUnitIds){
         this.associatedUnitIds = associatedUnitIds;
     }
 
-    public List<String> getAssociatedUnitIds(){
+    public List<String[]> getAssociatedUnitIds(){
         return this.associatedUnitIds;
     }
 
+    /**
+     * @return the actualAccesPoint
+     */
+    public List<URI> getActualAccesPoint() {
+        return actualAccesPoints;
+    }
+
+    /**
+     * @param actualAccesPoint the actualAccesPoint to set
+     */
+    public void addActualAccesPoint(URI actualAccesPoint) {
+        this.actualAccesPoints.add(actualAccesPoint);
+    }
+
 //
 //    public void reset() {
 //        getDataHolder().reset();
index 7286de835eeed0694a85aa8830115bc8fe31a9d8..c1ad720d9a38f633ede954fc2aa18ab49dda5d99 100644 (file)
@@ -866,15 +866,23 @@ public class Abcd206XMLFieldGetter {
                 for (int j = 0; j < childrenAssociations.getLength(); j++) {
                     if (childrenAssociations.item(j).getNodeName().equals(prefix + "UnitAssociation")) {
                         childrenUnitAssociations = childrenAssociations.item(j).getChildNodes();
+                        String[] associatedUnitId = new String[2];
                         for (int k = 0; k < childrenUnitAssociations.getLength(); k++) {
+                            System.err.println(childrenUnitAssociations.item(k).getNodeName());
                             if (childrenUnitAssociations.item(k).getNodeName().equals(prefix + "UnitID")) {
-                                dataHolder.addAssociatedUnitId(childrenUnitAssociations.item(k).getTextContent());
+                                associatedUnitId[0]= childrenUnitAssociations.item(k).getTextContent();
+
                                 path = childrenUnitAssociations.item(k).getNodeName();
                                 getHierarchie(childrenUnitAssociations.item(k));
                                 dataHolder.knownABCDelements.add(path);
                                 path = "";
                             }
+                            if (childrenUnitAssociations.item(k).getNodeName().equals(prefix +"DatasetAccessPoint")){
+                                associatedUnitId[1]= childrenUnitAssociations.item(k).getTextContent();
+                                System.err.println(childrenUnitAssociations.item(k).getTextContent());
+                            }
                         }
+                        dataHolder.addAssociatedUnitId(associatedUnitId);
                     }
                 }
             }
index d666e1db6dabcfe1f92ab4d9d358174c8a261b61..8b178fba065a2b62e9919b98b67e998c98cf271f 100644 (file)
@@ -94,6 +94,7 @@ public class UnitAssociationParser {
 
                     if(unitAssociationWrapper!=null){
                         unitAssociationWrapper.setAssociationType(associationType);
+                        unitAssociationWrapper.setAccesPoint(datasetAccessPoint);
                         if(unitAssociationWrapper.getAssociatedUnits()!=null && unitAssociationWrapper.getAssociatedUnits().getLength()>1){
                             String moreThanOneUnitFoundMessage = String.format("More than one unit was found for unit association to %s", unitId);
                             logger.warn(moreThanOneUnitFoundMessage);
@@ -129,14 +130,16 @@ public class UnitAssociationParser {
 
             OccurenceQuery query = new OccurenceQuery(unitID);
 
+
                 InputStream inputStream;
                 try {
-                    inputStream = serviceWrapper.query(query, datasetAccessPoint);
+                    inputStream = serviceWrapper.querySiblings(query, datasetAccessPoint);
 
                     if(inputStream!=null){
                     UnitAssociationWrapper unitAssociationWrapper = null;
                     try {
                         unitAssociationWrapper = AbcdParseUtility.parseUnitsNodeList(inputStream, report);
+
                     } catch (Exception e) {
                         String exceptionMessage = "An exception occurred during parsing of associated units!";
                         logger.error(exceptionMessage, e);
@@ -150,6 +153,7 @@ public class UnitAssociationParser {
                             logger.warn(moreThanOneUnitFoundMessage);
                             report.addInfoMessage(moreThanOneUnitFoundMessage);
                         }
+
                     }
                     return unitAssociationWrapper;
                     }
index 85000c4a649e29fc84c825c0f8fb7977a9b33eb2..8c29d799ca020f9f91cb082d5d27ce75cf50f2f1 100644 (file)
@@ -8,6 +8,8 @@
 */
 package eu.etaxonomy.cdm.io.specimen.abcd206.in;
 
+import java.net.URI;
+
 import org.w3c.dom.NodeList;
 
 /**
@@ -20,6 +22,7 @@ import org.w3c.dom.NodeList;
 public class UnitAssociationWrapper {
 
     private NodeList associatedUnits;
+    private URI accesPoint;
     private String associationType;
     private String prefix;
 
@@ -47,4 +50,18 @@ public class UnitAssociationWrapper {
         this.prefix = prefix;
     }
 
+    /**
+     * @return the accesPoint
+     */
+    public URI getAccesPoint() {
+        return accesPoint;
+    }
+
+    /**
+     * @param accesPoint the accesPoint to set
+     */
+    public void setAccesPoint(URI accesPoint) {
+        this.accesPoint = accesPoint;
+    }
+
 }