From 3034f6e786e5b46a4a46769636b3421c56ab2ec9 Mon Sep 17 00:00:00 2001
From: Maximilian Brodhun <brodhun@sub.uni-goettingen.de>
Date: Mon, 27 May 2019 09:42:28 +0200
Subject: [PATCH] resolving concurrency problem in RecordListDeliverer

---
 .../middleware/DublinCoreBuilder.java         |   7 +
 .../middleware/DublinCoreFieldLoader.java     | 328 +++++++++---------
 .../middleware/RecordListDelivererDC.java     |  84 +++--
 .../middleware/RecordListDelivererIDIOM.java  |   2 +-
 .../RecordListDelivererInterface.java         |   2 +-
 .../info/textgrid/middleware/OaiPmhTest.java  |   2 +-
 .../middleware/OaiPmhTextgridOnlineTests.java |   6 +-
 7 files changed, 244 insertions(+), 187 deletions(-)

diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java
index a73a6873..fc47cfa0 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java
@@ -25,6 +25,7 @@ public final class DublinCoreBuilder {
   private ObjectFactory oaiDcObj = new ObjectFactory();
   private MetadataType metadata = new MetadataType();
 
+  
   /**
    * <p>
    * s * Constructor to build an DublinCore element for an OAIPMH request by getting TextGrid
@@ -38,6 +39,12 @@ public final class DublinCoreBuilder {
 
   }
 
+  /**
+   * Each of the following functions for generating the DC-XML file 
+   * produces an ElementType for the DC-field and puts each 
+   * element of the list into the corresponding XML-tag
+   */
+  
   /**
    * <p>
    * Takes a string list containing the contributors and build the specific dublinCore element for
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java
index 32c14455..90cda9e1 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java
@@ -10,22 +10,34 @@ import org.elasticsearch.action.get.GetResponse;
 import org.elasticsearch.search.SearchHit;
 
 /**
- *
+ * <p>
+ * The Dublin Core Field Loader takes the results of the 
+ * ElasticSearch request and puts them into a String-List. 
+ * For each element of Dublin Core exists a seperate list. 
+ * 
+ * For each element two functions are necessary because the datatype "SeachHit" 
+ * could contain more then one results and the GetResponse just one
+ * </p>
+ * 
+ * @author Maximilian Brodhun, SUB Goettingen
+ * @author Stefan E. Funk, SUB Goettingen
+ * @version 24.05.2019
+ * @since 18.02.2014
  */
 public class DublinCoreFieldLoader {
 
   private static Log log = LogFactory.getLog(OAIPMHImpl.class);
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setContributor(SearchHit hit, String[] values) {
+  public static List<String> setContributor(SearchHit hit, String[] fields) {
 
     List<String> contributors = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         contributors.add(hit.getFields().get(field).values().get(0)
             .toString());
@@ -36,16 +48,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setContributor(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setContributor(GetResponse responseWorkValues, String[] fields) {
 
     List<String> contributors = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         if (responseWorkValues.getField(field) != null) {
           contributors.add(responseWorkValues.getField(field).getValue().toString());
         }
@@ -57,16 +69,16 @@ public class DublinCoreFieldLoader {
 
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setCreator(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setCreator(GetResponse responseWorkValues, String[] fields) {
 
     List<String> creators = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         if (responseWorkValues.getField(field) != null) {
           creators.add(responseWorkValues.getField(field).getValue().toString());
         }
@@ -77,15 +89,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setCreator(SearchHit hit, String[] values) {
+  public static List<String> setCreator(SearchHit hit, String[] fields) {
 
     List<String> creators = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         creators.add(hit.getFields().get(field).values().get(0)
             .toString());
@@ -96,16 +108,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setCoverage(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setCoverage(GetResponse responseWorkValues, String[] fields) {
 
     List<String> coverages = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         if (responseWorkValues.getField(field) != null) {
           coverages.add(responseWorkValues.getField(field).getValue().toString());
         }
@@ -116,15 +128,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setCoverage(SearchHit hit, String[] values) {
+  public static List<String> setCoverage(SearchHit hit, String[] fields) {
 
     List<String> coverages = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         coverages.add(hit.getFields().get(field).values().get(0)
             .toString());
@@ -135,16 +147,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setDate(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setDate(GetResponse responseWorkValues, String[] fields) {
 
     List<String> dates = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         try {
           // FIXME DO SET VALUES VIA CONFIG FILE!
           if (responseWorkValues.getField(field) != null) {
@@ -172,15 +184,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setDate(SearchHit hit, String[] values) {
+  public static List<String> setDate(SearchHit hit, String[] fields) {
 
     List<String> dates = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
 
         try {
@@ -200,16 +212,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setDescription(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setDescription(GetResponse responseWorkValues, String[] fields) {
 
     List<String> descriptions = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         if (responseWorkValues.getField(field) != null) {
           descriptions.add(responseWorkValues.getField(field).getValue().toString());
         }
@@ -220,15 +232,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setDescription(SearchHit hit, String[] values) {
+  public static List<String> setDescription(SearchHit hit, String[] fields) {
 
     List<String> descriptions = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         descriptions.add(hit.getFields().get(field).values().get(0)
             .toString());
@@ -239,15 +251,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setFormat(SearchHit hit, String[] values) {
+  public static List<String> setFormat(SearchHit hit, String[] fields) {
 
     List<String> formats = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         formats.add(hit.getFields().get(field).values().get(0)
             .toString());
@@ -258,16 +270,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setFormat(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setFormat(GetResponse responseWorkValues, String[] fields) {
 
     List<String> formats = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         if (responseWorkValues.getField(field) != null) {
           formats.add(responseWorkValues.getField(field).getValue().toString());
         }
@@ -278,16 +290,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setIdentifier(SearchHit hit, String[] values) {
+  public static List<String> setIdentifier(SearchHit hit, String[] fields) {
 
     List<String> identifiers = new ArrayList<String>();
 
     String identifier = "";
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         for (int i = 0; i < hit.getFields().get(field).getValues().size(); i++) {
           if (hit.getFields().get(field).values().get(i).toString().startsWith("textgrid")) {
@@ -305,24 +317,22 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setIdentifier(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setIdentifier(GetResponse responseWorkValues, String[] fields) {
 
     List<String> identifiers = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
 
         if (responseWorkValues.getField(field) != null) {
           List<Object> entireIdentifier = responseWorkValues.getField(field).getValues();
           for (int i = 0; i < responseWorkValues.getField(field).getValues().size(); i++) {
             identifiers.add(entireIdentifier.get(i).toString());
           }
-          // identifiers.add(responseWorkValues.getField(field).getValue().toString());
-          // identifiers.add(entireIdentifier.get(i));
         }
       }
     }
@@ -331,15 +341,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setLanguage(SearchHit hit, String[] values) {
+  public static List<String> setLanguage(SearchHit hit, String[] fields) {
 
     List<String> languages = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         languages.add(hit.getFields().get(field).values().get(0).toString());
       }
@@ -349,16 +359,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setLanguage(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setLanguage(GetResponse responseWorkValues, String[] fields) {
 
     List<String> languages = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         if (responseWorkValues.getField(field) != null) {
           languages.add(responseWorkValues.getField(field).getValue().toString());
         }
@@ -369,15 +379,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setPublisher(SearchHit hit, String[] values) {
+  public static List<String> setPublisher(SearchHit hit, String[] fields) {
 
     List<String> publishers = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         publishers.add(hit.getFields().get(field).values().get(0).toString());
       }
@@ -387,16 +397,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setPublisher(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setPublisher(GetResponse responseWorkValues, String[] fields) {
 
     List<String> publishers = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         if (responseWorkValues.getField(field) != null) {
           publishers.add(responseWorkValues.getField(field).getValue().toString());
         }
@@ -407,15 +417,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setRelation(SearchHit hit, String[] values) {
+  public static List<String> setRelation(SearchHit hit, String[] fields) {
 
     List<String> relations = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         for (int i = 0; i < hit.getFields().get(field).getValues().size(); i++) {
           relations.add(hit.getFields().get(field).values().get(i).toString());
@@ -427,16 +437,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setRelation(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setRelation(GetResponse responseWorkValues, String[] fields) {
 
     List<String> relations = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         if (responseWorkValues.getField(field) != null) {
           relations.add(responseWorkValues.getField(field).getValue().toString());
         }
@@ -447,16 +457,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setRelationForWork(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setRelationForWork(GetResponse responseWorkValues, String[] fields) {
 
     List<String> relations = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         if (responseWorkValues.getField(field) != null) {
           relations.add(responseWorkValues.getField(field).getValue().toString());
         }
@@ -467,15 +477,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setRights(SearchHit hit, String[] values) {
+  public static List<String> setRights(SearchHit hit, String[] fields) {
 
     List<String> rights = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         rights.add(hit.getFields().get(field).values().get(0).toString());
       }
@@ -485,16 +495,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setRights(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setRights(GetResponse responseWorkValues, String[] fields) {
 
     List<String> rights = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         if (responseWorkValues.getField(field) != null) {
           rights.add(responseWorkValues.getField(field).getValue().toString());
         }
@@ -505,15 +515,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setSources(SearchHit hit, String[] values) {
+  public static List<String> setSources(SearchHit hit, String[] fields) {
 
     List<String> sources = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         sources.add(hit.getFields().get(field).values().get(0).toString());
       }
@@ -523,16 +533,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setSources(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setSources(GetResponse responseWorkValues, String[] fields) {
 
     List<String> sources = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         if (responseWorkValues.getField(field) != null) {
           sources.add(responseWorkValues.getField(field).getValue().toString());
         }
@@ -543,15 +553,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setSubject(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setSubject(GetResponse responseWorkValues, String[] fields) {
 
     List<String> subjects = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (responseWorkValues.getField(field) != null) {
         subjects.add(responseWorkValues.getField(field).getValue().toString());
       }
@@ -561,15 +571,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setSubject(SearchHit hit, String[] values) {
+  public static List<String> setSubject(SearchHit hit, String[] fields) {
 
     List<String> subjects = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         subjects.add(hit.getFields().get(field).values().get(0).toString());
       }
@@ -579,15 +589,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setTitle(SearchHit hit, String[] values) {
+  public static List<String> setTitle(SearchHit hit, String[] fields) {
 
     List<String> titles = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         for (int i = 0; i < hit.getFields().get(field).getValues().size(); i++) {
           titles.add(hit.getFields().get(field).values().get(i).toString());
@@ -599,16 +609,16 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setTitle(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setTitle(GetResponse responseWorkValues, String[] fields) {
 
     List<String> titles = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      for (String field : values) {
+      for (String field : fields) {
         List<Object> entireTitles = responseWorkValues.getField(field).getValues();
         if (responseWorkValues.getField(field) != null) {
           for (int i = 0; i < responseWorkValues.getField(field).getValues().size(); i++) {
@@ -622,17 +632,17 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param responseWorkValues
-   * @param values
-   * @return
+   * @param responseWorkValues contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setType(GetResponse responseWorkValues, String[] values) {
+  public static List<String> setType(GetResponse responseWorkValues, String[] fields) {
 
     List<String> types = new ArrayList<String>();
 
     if (responseWorkValues.isExists()) {
-      if (values != null) {
-        for (String field : values) {
+      if (fields != null) {
+        for (String field : fields) {
           if (responseWorkValues.getField(field) != null) {
             types.add(responseWorkValues.getField(field).getValue().toString());
           }
@@ -644,15 +654,15 @@ public class DublinCoreFieldLoader {
   }
 
   /**
-   * @param hit
-   * @param values
-   * @return
+   * @param hit contains results of the ElasticSearch request
+   * @param fields containing all fields from ElasticSearch related to this Dublin Core field
+   * @return all elements mapped from TetxGrid metadata scheme to Dublin Core
    */
-  public static List<String> setType(SearchHit hit, String[] values) {
+  public static List<String> setType(SearchHit hit, String[] fields) {
 
     List<String> types = new ArrayList<String>();
 
-    for (String field : values) {
+    for (String field : fields) {
       if (hit.getFields().get(field) != null) {
         for (int i = 0; i < hit.getFields().get(field).getValues().size(); i++) {
           types.add(hit.getFields().get(field).values().get(i).toString());
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java
index 97936597..6d25b48e 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java
@@ -60,7 +60,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
   // DC-Field Lists
   // **
 
-  private List<String> contributors = new ArrayList<String>();
+  /*private List<String> contributors = new ArrayList<String>();
   private List<String> coverages = new ArrayList<String>();
   private List<String> creators = new ArrayList<String>();
   private List<String> dates = new ArrayList<String>();
@@ -74,7 +74,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
   private List<String> sources = new ArrayList<String>();
   private List<String> subjects = new ArrayList<String>();
   private List<String> titles = new ArrayList<String>();
-  private List<String> types = new ArrayList<String>();
+  private List<String> types = new ArrayList<String>();*/
 
   private String[] contributorList;
   private String[] coverageList;
@@ -159,7 +159,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
     String scrollID = "";
     SearchResponse scrollResp;
     QueryBuilder recordFilter;
-
+    DublinCoreBuilder dublinCoreBuilder = new DublinCoreBuilder();
     if (this.dariah == true) {
       recordFilter = query;
     } else {
@@ -227,20 +227,20 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
               }
             }
 
-            putContentIntoDCFieldLists(hit,
+            dublinCoreBuilder = putContentIntoDCFieldLists(hit,
                 furtherDCElements(workUri, OAI_ESClient.getOaiESClient()));
 
             buildRecord(recordList, set,
-                hit.getFields().get(this.identifierField).getValue().toString());
-            listClearer();
+                hit.getFields().get(this.identifierField).getValue().toString(), dublinCoreBuilder);
+            //listClearer();
           }
 
           if (this.dariah == true) {
             putContentIntoDCFieldLists2(hit,
                 furtherDCElements(hit.getId(), OAI_ESClient.getOaiESClient()));
             buildRecord(recordList, set,
-                hit.getFields().get(this.identifierField).getValue().toString());
-            listClearer();
+                hit.getFields().get(this.identifierField).getValue().toString(), dublinCoreBuilder);
+            //listClearer();
           }
         }
       }
@@ -261,9 +261,29 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
    * @param hit
    * @param responseWorkValues
    */
-  public void putContentIntoDCFieldLists(SearchHit hit, GetResponse responseWorkValues) {
-    this.contributors = DublinCoreFieldLoader.setContributor(hit, this.contributorList);
-    this.coverages = DublinCoreFieldLoader.setCoverage(responseWorkValues, this.coverageList);
+  public DublinCoreBuilder putContentIntoDCFieldLists(SearchHit hit, GetResponse responseWorkValues) {
+	  
+	DublinCoreBuilder result = new DublinCoreBuilder();
+	
+	result.setContributor(DublinCoreFieldLoader.setContributor(responseWorkValues, this.contributorList));
+	result.setCoverage(DublinCoreFieldLoader.setCoverage(responseWorkValues, this.coverageList));
+    result.setCreator(DublinCoreFieldLoader.setCreator(responseWorkValues, this.creatorList));
+    result.setDate(DublinCoreFieldLoader.setDate(responseWorkValues, this.dateList));
+    result.setDescription(DublinCoreFieldLoader.setDescription(responseWorkValues, this.descriptionList));
+    result.setFormat(DublinCoreFieldLoader.setFormat(hit, this.formatList));
+    result.setIdentifier(DublinCoreFieldLoader.setIdentifier(hit, this.identifierList));
+    result.setLanguage(DublinCoreFieldLoader.setLanguage(hit, this.languageList));
+    result.setPublisher(DublinCoreFieldLoader.setPublisher(hit, this.publisherList));
+    result.setRelation(DublinCoreFieldLoader.setRelation(hit, this.relationList));
+    result.setRelation(DublinCoreFieldLoader.setRelationForWork(responseWorkValues, this.relationForWorkList));
+    result.setRights(DublinCoreFieldLoader.setRights(hit, this.rightList));
+    result.setSource(DublinCoreFieldLoader.setSources(hit, this.sourceList));
+    result.setSubject(DublinCoreFieldLoader.setSubject(hit, this.subjectList));
+    result.setTitle(DublinCoreFieldLoader.setTitle(hit, this.titleList));
+    result.setType(DublinCoreFieldLoader.setType(responseWorkValues, this.typeList));
+    
+    return result;
+    /*this.coverages = DublinCoreFieldLoader.setCoverage(responseWorkValues, this.coverageList);
     this.creators = DublinCoreFieldLoader.setCreator(responseWorkValues, this.creatorList);
     this.dates = DublinCoreFieldLoader.setDate(responseWorkValues, this.dateList);
     this.descriptions =
@@ -279,7 +299,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
     this.sources = DublinCoreFieldLoader.setSources(hit, this.sourceList);
     this.subjects = DublinCoreFieldLoader.setSubject(hit, this.subjectList);
     this.titles = DublinCoreFieldLoader.setTitle(hit, this.titleList);
-    this.types = DublinCoreFieldLoader.setType(responseWorkValues, this.typeList);
+    this.types = DublinCoreFieldLoader.setType(responseWorkValues, this.typeList);*/
   }
 
   /**
@@ -287,7 +307,26 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
    * @param responseWorkValues
    */
   public void putContentIntoDCFieldLists2(SearchHit hit, GetResponse responseWorkValues) {
-    this.contributors = DublinCoreFieldLoader.setContributor(hit, this.contributorList);
+	  
+	DublinCoreBuilder result = new DublinCoreBuilder();
+	
+	result.setContributor(DublinCoreFieldLoader.setContributor(hit, this.contributorList));
+	result.setCoverage(DublinCoreFieldLoader.setCoverage(hit, this.coverageList));
+	result.setCreator(DublinCoreFieldLoader.setCreator(hit, this.creatorList));
+	result.setDate(DublinCoreFieldLoader.setDate(hit, this.dateList));
+	result.setDescription(DublinCoreFieldLoader.setDescription(hit, this.descriptionList));
+	result.setFormat(DublinCoreFieldLoader.setFormat(hit, this.formatList));
+	result.setIdentifier(DublinCoreFieldLoader.setIdentifier(hit, this.identifierList));
+	result.setLanguage(DublinCoreFieldLoader.setLanguage(hit, this.languageList));
+	result.setPublisher(DublinCoreFieldLoader.setPublisher(hit, this.publisherList));
+	result.setRelation(DublinCoreFieldLoader.setRelation(hit, this.relationList));
+	result.setRights(DublinCoreFieldLoader.setRights(hit, this.rightList));
+	result.setSource(DublinCoreFieldLoader.setSources(hit, this.sourceList));
+	result.setSubject(DublinCoreFieldLoader.setSources(hit, this.subjectList));
+	result.setTitle(DublinCoreFieldLoader.setTitle(hit, this.titleList));
+	result.setType(DublinCoreFieldLoader.setType(hit, this.typeList));
+	  
+    /*this.contributors = DublinCoreFieldLoader.setContributor(hit, this.contributorList);
     this.coverages = DublinCoreFieldLoader.setCoverage(hit, this.coverageList);
     this.creators = DublinCoreFieldLoader.setCreator(hit, this.creatorList);
     this.dates = DublinCoreFieldLoader.setDate(hit, this.dateList);
@@ -301,7 +340,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
     this.sources = DublinCoreFieldLoader.setSources(hit, this.sourceList);
     this.subjects = DublinCoreFieldLoader.setSources(hit, this.subjectList);
     this.titles = DublinCoreFieldLoader.setTitle(hit, this.titleList);
-    this.types = DublinCoreFieldLoader.setType(hit, this.typeList);
+    this.types = DublinCoreFieldLoader.setType(hit, this.typeList);*/
   }
 
   /**
@@ -310,24 +349,25 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
    * @param headerIdentifier
    * @return
    */
-  public RecordType buildRecord(ListRecordsType recordList, String set, String headerIdentifier) {
+  public RecordType buildRecord(ListRecordsType recordList, String set, String headerIdentifier, DublinCoreBuilder dublinCoreBuilder) {
 
     ObjectFactory of = new ObjectFactory();
     OaiDcType odt = new OaiDcType();
-    DublinCoreBuilder newDbc = new DublinCoreBuilder();
+    //DublinCoreBuilder dublinCoreBuilder = new DublinCoreBuilder();
     MetadataType metadata = new MetadataType();
     RecordType record = new RecordType();
     // TODO Test if this is unnecessary
     // HeaderType recordHeader = new HeaderType();
 
-    setDCObject(newDbc);
+    //setDCObject(newDbc);
+    //dublinCoreBuilder = putContentIntoDCFieldLists(esResultObject);
 
     /*
      * if (!this.identifiers.isEmpty()) { recordHeader.setIdentifier(this.identifiers.get(0)); } if
      * (!this.dates.isEmpty()) { recordHeader.setDatestamp(this.dates.get(0)); }
      */
 
-    metadata = newDbc.getDC();
+    metadata = dublinCoreBuilder.getDC();
     record.setMetadata(metadata);
     record.setHeader(setHeader(set, headerIdentifier));
     recordList.getRecord().add(record);
@@ -425,7 +465,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
    * @param of
    * @return
    */
-  public DublinCoreBuilder setDCObject(DublinCoreBuilder dbc) {
+  /*public DublinCoreBuilder setDCObject(DublinCoreBuilder dbc) {
 
     dbc.setContributor(this.contributors);
     dbc.setCoverage(this.coverages);
@@ -444,12 +484,12 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
     dbc.setType(this.types);
 
     return dbc;
-  }
+  }*/
 
   /**
    * 
    */
-  public void listClearer() {
+  /*public void listClearer() {
     this.contributors.clear();
     this.coverages.clear();
     this.creators.clear();
@@ -465,7 +505,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
     this.subjects.clear();
     this.titles.clear();
     this.types.clear();
-  }
+  }*/
 
   /**
    * @param formatToFilter
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java
index 5acd5811..a5950d92 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java
@@ -38,7 +38,7 @@ public class RecordListDelivererIDIOM extends RecordListDelivererAbstract {
    * info.textgrid.middleware.RecordListDelivererInterface#buildRecord(info.textgrid.middleware.
    * oaipmh.ListRecordsType, java.lang.String, java.lang.String)
    */
-  @Override
+  //@Override
   public RecordType buildRecord(ListRecordsType recordList, String set, String headerIdentifier) {
 
     MetadataType metadata = new MetadataType();
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java
index 9ab30c61..aa3d0bd5 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java
@@ -6,7 +6,7 @@ import info.textgrid.middleware.oaipmh.RecordType;
 
 public interface RecordListDelivererInterface {
 	
-	 public RecordType buildRecord(ListRecordsType recordList, String set, String headerIdentifier);
+	 //public RecordType buildRecord(ListRecordsType recordList, String set, String headerIdentifier);
 	 public ListRecordsType getRecords(String from, String to, String set, String resumptionToken);
 	 public HeaderType setHeader(String set, String headerIdentifier);
 
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTest.java b/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTest.java
index 4a45af95..88697c79 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTest.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTest.java
@@ -322,7 +322,7 @@ public class OaiPmhTest {
    * @throws ParseException
    */
   @Test
-  @Ignore
+  //@Ignore
   public void testListRecordSets() throws ParseException {
     OaiPmhTest.recordList.setContributor(TGConstants.CONTRIBUTOR_LIST);
     OaiPmhTest.recordList.setCoverage(TGConstants.COVERAGE_LIST);
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTextgridOnlineTests.java b/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTextgridOnlineTests.java
index a487f7eb..61979ebf 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTextgridOnlineTests.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTextgridOnlineTests.java
@@ -482,11 +482,11 @@ public class OaiPmhTextgridOnlineTests {
     ExecutorService executor = Executors.newFixedThreadPool(3);
 
     Future<Boolean> f1 = executor.submit(new OaiPmhResumptionTokenTestThread(VERB_LIST_RECORDS,
-        NO_SET, OAI_DC_PREFIX, 200, 100, "[B1]"));
+        NO_SET, OAI_DC_PREFIX, 33, 100, "[B1]"));
     Future<Boolean> f2 = executor.submit(new OaiPmhResumptionTokenTestThread(VERB_LIST_RECORDS,
-        NO_SET, OAI_DC_PREFIX, 194, 100, "[B2]"));
+        NO_SET, OAI_DC_PREFIX, 33, 100, "[B2]"));
     Future<Boolean> f3 = executor.submit(new OaiPmhResumptionTokenTestThread(VERB_LIST_RECORDS,
-        NO_SET, OAI_DC_PREFIX, 256, 100, "[B3]"));
+        NO_SET, OAI_DC_PREFIX, 33, 100, "[B3]"));
 
     executor.shutdown();
 
-- 
GitLab