From eaf1213d888843bc187a2a1c9201547690eb9d3f Mon Sep 17 00:00:00 2001
From: "Stefan E. Funk" <funk@sub.uni-goettingen.de>
Date: Thu, 7 Mar 2019 14:06:30 +0100
Subject: [PATCH] Add interface and abstract class for parting DC and METS
 delivery

---
 .../textgrid/middleware/RecordDeliverer.java  | 498 -----------------
 .../middleware/RecordDelivererAbstract.java   |  26 +
 .../middleware/RecordDelivererDC.java         | 502 ++++++++++++++++++
 .../middleware/RecordDelivererInterface.java  |  37 ++
 4 files changed, 565 insertions(+), 498 deletions(-)
 delete mode 100644 oaipmh-core/src/main/java/info/textgrid/middleware/RecordDeliverer.java
 create mode 100644 oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererAbstract.java
 create mode 100644 oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java
 create mode 100644 oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererInterface.java

diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDeliverer.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDeliverer.java
deleted file mode 100644
index 5d934868..00000000
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDeliverer.java
+++ /dev/null
@@ -1,498 +0,0 @@
-package info.textgrid.middleware;
-
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.datatype.DatatypeConfigurationException;
-
-import org.apache.commons.logging.LogFactory;
-import org.elasticsearch.action.get.GetRequestBuilder;
-import org.elasticsearch.action.get.GetResponse;
-
-import info.textgrid.middleware.oaipmh.GetRecordType;
-import info.textgrid.middleware.oaipmh.HeaderType;
-import info.textgrid.middleware.oaipmh.OaiDcType;
-import info.textgrid.middleware.oaipmh.ObjectFactory;
-import info.textgrid.middleware.oaipmh.RecordType;
-import info.textgrid.middleware.oaipmh.RequestType;
-
-/**
- * Query ElasticSearch index for the values mapped to dublinCore for a specific
- * object and collect them into lists
- * 
- * @author Maximilian Brodhun SUB
- * @version 1.1
- * @since 17.02.2014
- *
- */
-
-public class RecordDeliverer {
-
-	private String[]								fields;
-	private String[]								workFields;
-	private boolean								textgrid;
-	private boolean								dariah;
-
-	private String									formatField;
-	private String									formatToFilter;
-	private String									dateOfObjectCreation;
-	private String									relationToFurtherMetadataObject;
-	private String									repositoryObjectURIPrefix;
-	private String									identifierField;
-
-	/*
-	 * Lists for the Dublin Core elements. Lists are needed since each DC fields
-	 * is possible to occur several times
-	 */
-
-	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>();
-	private List<String>							descriptions	= new ArrayList<String>();
-	private List<String>							formats			= new ArrayList<String>();
-	private List<String>							identifiers		= new ArrayList<String>();
-	private List<String>							languages		= new ArrayList<String>();
-	private List<String>							publishers		= new ArrayList<String>();
-	private List<String>							relations		= new ArrayList<String>();
-	private List<String>							rights			= new ArrayList<String>();
-	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 String[]								contributorList;
-	private String[]								coverageList;
-	private String[]								creatorList;
-	private String[]								dateList;
-	private String[]								descriptionList;
-	private String[]								formatList;
-	private String[]								identifierList;
-	private String[]								languageList;
-	private String[]								publisherList;
-	private String[]								relationList;
-	private String[]								relationForWorkList;
-	private String[]								rightList;
-	private String[]								sourceList;
-	private String[]								subjectList;
-	private String[]								titleList;
-	private String[]								typeList;
-
-	private static org.apache.commons.logging.Log	log				= LogFactory
-																			.getLog(RecordDeliverer.class);
-
-	private OAI_ESClient							oaiEsClient;
-
-	/**
-	 * @param oaiEsClient
-	 * @param workFields
-	 * @param textgrid
-	 * @param dariah
-	 */
-	public RecordDeliverer(OAI_ESClient oaiEsClient, String[] workFields,
-			boolean textgrid, boolean dariah) {
-		this.oaiEsClient = oaiEsClient;
-		this.workFields = workFields;
-		this.textgrid = textgrid;
-		this.dariah = dariah;
-	}
-
-	/**
-	 * Query ElasticSearch index for the values mapped to dublinCore for a
-	 * specific object
-	 * 
-	 * @param id
-	 *            identifier within the EalsticSearch index
-	 * @return Get the GetRecord response for the request
-	 */
-	public GetRecordType getRecordById(String id) {
-
-		ObjectFactory of = new ObjectFactory();
-		OaiDcType odt = new OaiDcType();
-		GetRecordType grt = new GetRecordType();
-		RecordType record = new RecordType();
-		String changedId = id;
-		DublinCoreBuilder dbc = new DublinCoreBuilder(odt, of);
-
-		if (id.startsWith(this.repositoryObjectURIPrefix)) {
-			changedId = changedId.replace(this.repositoryObjectURIPrefix, "");
-//			System.out.println("CHANGEDID: " + changedId);
-		}
-
-		GetRequestBuilder recordById = OAI_ESClient.getOaiESClient()
-				.prepareGet().setIndex(OAI_ESClient.getEsIndex())
-				.setType(OAI_ESClient.getEsType()).setFields(this.fields)
-				.setId(changedId);
-
-		GetResponse tgObject = recordById.execute().actionGet();
-
-		if (tgObject.isExists()) {
-
-			String identifier;
-
-			if (this.dariah == true) {
-
-				putContentIntoDCFieldLists(tgObject);
-				// FIXME MAX!!!! DO CONFIGURE!!!!
-
-//				System.out.println(identifierField);
-				identifier = tgObject.getField(this.identifierField).getValue().toString();
-//				System.out.println("IDENTIFIER: " + identifier);
-				String dateOfCreation = "NO_DATE_SET!";
-				
-				if (tgObject.getField(this.dateOfObjectCreation) != null) {
-					try {
-						dateOfCreation = OAIPMHUtillities.convertDateFormat(tgObject.getField(this.dateOfObjectCreation).getValue().toString()).toXMLFormat();
-					} catch (ParseException e) {
-						// TODO Auto-generated catch block
-						e.printStackTrace();
-					} catch (DatatypeConfigurationException e) {
-						// TODO Auto-generated catch block
-						e.printStackTrace();
-					}
-				}
-				setRecordHeader(dateOfCreation, identifier, record, dbc);
-			}
-
-			if (this.textgrid == true && tgObject.getField(formatField).getValue().toString().equals(formatToFilter) ) {
-				
-				String workUri = tgObject.getField(this.relationToFurtherMetadataObject).getValue().toString();
-				workUri = workUri.substring(this.repositoryObjectURIPrefix.length());
-				putContentIntoDCFieldLists(tgObject, furtherDCElements(workUri));
-				identifier = tgObject.getField(this.identifierField).getValue().toString();				
-				String dateOfCreation = tgObject.getField(this.dateOfObjectCreation).getValue().toString();
-				setRecordHeader(dateOfCreation, identifier, record, dbc);
-			}
-
-			setDCObject(odt, of, dbc);
-			record.setMetadata(dbc.getDC());
-			grt.setRecord(record);
-			listClearer();
-
-		} else {
-			grt = null;
-		}
-
-		return grt;
-	}
-
-	/**
-	 * @param dateOfCreation
-	 * @param identifier
-	 * @param record
-	 * @param dbc
-	 * @return
-	 */
-	public RecordType setRecordHeader(String dateOfCreation, String identifier,
-			RecordType record, DublinCoreBuilder dbc) {
-
-		HeaderType recordHeader = new HeaderType();
-//		System.out.println("IDENTIFIRE::: " + identifier);
-		recordHeader.setIdentifier(identifier);
-		recordHeader.setDatestamp(dateOfCreation);
-		record.setMetadata(dbc.getDC());
-		record.setHeader(recordHeader);
-
-		return record;
-	}
-
-	/**
-	 * @param id
-	 * @return
-	 */
-	public GetResponse furtherDCElements(String id) {
-
-		if (!id.endsWith(".0")) {
-			id = id.concat(".0");
-		}
-
-		GetRequestBuilder getWorkValues = OAI_ESClient.getOaiESClient()
-				.prepareGet().setIndex(OAI_ESClient.getEsIndex())
-				.setType(OAI_ESClient.getEsType()).setId(id)
-				.setFields(this.workFields);
-
-		GetResponse responseWorkValues = getWorkValues.execute().actionGet();
-
-		try {
-			if (responseWorkValues.getField(this.dateOfObjectCreation) != null) {
-				this.dates.add(OAIPMHUtillities.convertDateFormat(responseWorkValues.getField(this.dateOfObjectCreation).getValue().toString()).toXMLFormat());
-			}
-		} catch (ParseException e) {
-			log.debug(e);
-		} catch (DatatypeConfigurationException e) {
-			log.debug(e);
-		}
-
-		return responseWorkValues;
-	}
-
-	/**
-	 * @param responseWorkValues
-	 * @param relatedWorkObject
-	 */
-	public void putContentIntoDCFieldLists(GetResponse responseWorkValues, GetResponse relatedWorkObject) {
-		this.contributors = DublinCoreFieldLoader.setContributor(responseWorkValues, this.contributorList);
-		this.formats = DublinCoreFieldLoader.setFormat(responseWorkValues,this.formatList);
-//		for(String bla : identifierList){
-//			System.out.println("BLA: " + bla);
-//		}
-		this.identifiers = DublinCoreFieldLoader.setIdentifier(responseWorkValues, this.identifierList);
-		this.languages = DublinCoreFieldLoader.setLanguage(responseWorkValues,this.languageList);
-		this.publishers = DublinCoreFieldLoader.setPublisher(responseWorkValues, this.publisherList);
-		this.relations = DublinCoreFieldLoader.setRelationForWork(responseWorkValues, this.relationList);
-		this.rights = DublinCoreFieldLoader.setRights(responseWorkValues,this.rightList);
-		this.sources = DublinCoreFieldLoader.setSources(responseWorkValues,this.sourceList);
-		this.titles = DublinCoreFieldLoader.setTitle(responseWorkValues,this.titleList);
-		this.coverages = DublinCoreFieldLoader.setCoverage(responseWorkValues,this.coverageList);
-		this.creators = DublinCoreFieldLoader.setCreator(relatedWorkObject,this.creatorList);
-		this.dates = DublinCoreFieldLoader.setDate(relatedWorkObject,this.dateList);
-		this.descriptions = DublinCoreFieldLoader.setDescription(relatedWorkObject, this.descriptionList);
-		this.relations = DublinCoreFieldLoader.setRelationForWork(relatedWorkObject, this.relationForWorkList);
-		this.subjects = DublinCoreFieldLoader.setSubject(relatedWorkObject,this.subjectList);
-		this.types = DublinCoreFieldLoader.setType(relatedWorkObject,this.typeList);
-
-	}
-
-	/**
-	 * @param responseWorkValues
-	 */
-	public void putContentIntoDCFieldLists(GetResponse responseWorkValues) {
-		this.contributors = DublinCoreFieldLoader.setContributor(responseWorkValues, this.contributorList);
-		this.coverages = DublinCoreFieldLoader.setCoverage(responseWorkValues,this.coverageList);
-		this.creators = DublinCoreFieldLoader.setCreator(responseWorkValues,this.creatorList);
-		this.dates = DublinCoreFieldLoader.setDate(responseWorkValues,this.dateList);
-		this.descriptions = DublinCoreFieldLoader.setDescription(responseWorkValues, this.descriptionList);
-		this.formats = DublinCoreFieldLoader.setFormat(responseWorkValues,this.formatList);
-		this.identifiers = DublinCoreFieldLoader.setIdentifier(responseWorkValues, this.identifierList);
-		this.languages = DublinCoreFieldLoader.setLanguage(responseWorkValues,this.languageList);
-		this.publishers = DublinCoreFieldLoader.setPublisher(responseWorkValues, this.publisherList);
-		this.relations = DublinCoreFieldLoader.setRelation(responseWorkValues,this.relationList);
-		this.rights = DublinCoreFieldLoader.setRights(responseWorkValues,this.rightList);
-		this.sources = DublinCoreFieldLoader.setSources(responseWorkValues,this.sourceList);
-		this.subjects = DublinCoreFieldLoader.setSubject(responseWorkValues,this.subjectList);
-		this.titles = DublinCoreFieldLoader.setTitle(responseWorkValues,this.titleList);
-		this.types = DublinCoreFieldLoader.setType(responseWorkValues,this.typeList);
-	}
-
-	/**
-	 * converting the textGrid elements into dublinCore elements
-	 * 
-	 * @param odt
-	 *            container for the OAIPMH DublinCore element
-	 * @param of
-	 *            jaxb object factory the DublinCore elements
-	 */
-	public void setDCObject(OaiDcType odt, ObjectFactory of, DublinCoreBuilder dbc) {
-		dbc.setContributor(this.contributors);
-		dbc.setCoverage(this.coverages);
-		dbc.setCreator(this.creators);
-		dbc.setDate(this.dates);
-		dbc.setDescription(this.descriptions);
-		dbc.setFormat(this.formats);
-		dbc.setIdentifier(this.identifiers);
-		for(String identifier : identifiers){
-//			System.out.println("IDENTIFIEROPF: " + identifier);
-		}
-		dbc.setLanguage(this.languages);
-		dbc.setPublisher(this.publishers);
-		dbc.setRelation(this.relations);
-		dbc.setRights(this.rights);
-		dbc.setSource(this.sources);
-		dbc.setSubject(this.subjects);
-		for(String title : titles){
-//			System.out.println("TITLEOPF: " + title);
-		}
-		dbc.setTitle(this.titles);
-		dbc.setType(this.types);
-
-	}
-
-	/**
-	 * 
-	 */
-	public void listClearer() {
-		this.contributors.clear();
-		this.coverages.clear();
-		this.creators.clear();
-		this.dates.clear();
-		this.descriptions.clear();
-		this.formats.clear();
-		this.identifiers.clear();
-		this.languages.clear();
-		this.publishers.clear();
-		this.relations.clear();
-		this.rights.clear();
-		this.sources.clear();
-		this.subjects.clear();
-		this.titles.clear();
-		this.types.clear();
-	}
-
-	public void setFormatToFilter(String formatToFilter) {
-		this.formatToFilter = formatToFilter;
-	}
-
-	public void setFormatField(String formatField) {
-		this.formatField = formatField;
-	}
-
-	public String getDateOfObjectCreation() {
-		return this.dateOfObjectCreation;
-	}
-
-	public void setDateOfObjectCreation(String dateOfObjectCreation) {
-		this.dateOfObjectCreation = dateOfObjectCreation;
-	}
-
-	public String getRelationToFurtherMetadataObject() {
-		return this.relationToFurtherMetadataObject;
-	}
-
-	public void setRelationToFurtherMetadataObject(
-			String relationToFurtherMetadataObject) {
-		this.relationToFurtherMetadataObject = relationToFurtherMetadataObject;
-	}
-
-	public String getRepositoryObjectURIPrefix() {
-		return this.repositoryObjectURIPrefix;
-	}
-
-	public void setRepositoryObjectURIPrefix(String repositoryObjectURIPrefix) {
-		this.repositoryObjectURIPrefix = repositoryObjectURIPrefix;
-	}
-
-	public String getIdentifierField() {
-		return this.identifierField;
-	}
-
-	public void setIdentifierField(String identifierPrefix) {
-		this.identifierField = identifierPrefix;
-	}
-
-	public void setFields(String[] fields) {
-		this.fields = fields;
-	}
-
-	public String[] getFields() {
-		return this.fields;
-
-	}
-
-	public void setWorkFields(String[] workFields) {
-		this.workFields = workFields;
-	}
-
-	public void setContributor(String[] contributorList) {
-
-		this.contributorList = contributorList;
-	}
-
-	public String[] getContributor() {
-
-		return this.contributorList;
-	}
-
-	public void setCoverage(String[] coveragesList) {
-
-		this.coverageList = coveragesList;
-	}
-
-	public void setCreator(String[] creatorsList) {
-
-		this.creatorList = creatorsList;
-	}
-
-	public void setDates(String[] datesList) {
-
-		this.dateList = datesList;
-	}
-
-	public void setDescriptions(String[] descriptionsList) {
-
-		this.descriptionList = descriptionsList;
-	}
-
-	public void setFormats(String[] formatsList) {
-
-		this.formatList = formatsList;
-	}
-
-	public void setIdentifiers(String[] identifiersList) {
-
-		this.identifierList = identifiersList;
-	}
-
-	public void setLanguages(String[] languagesList) {
-
-		this.languageList = languagesList;
-	}
-
-	public void setPublishers(String[] publishersList) {
-
-		this.publisherList = publishersList;
-	}
-
-	public void setRelations(String[] relationsList) {
-
-		this.relationList = relationsList;
-	}
-
-	public void setRelationsForWork(String[] relationsList) {
-
-		this.relationForWorkList = relationsList;
-	}
-
-	public void setRights(String[] rightsList) {
-
-		this.rightList = rightsList;
-	}
-
-	public void setSources(String[] sourcesList) {
-
-		this.sourceList = sourcesList;
-	}
-
-	public void setSubjects(String[] subjectsList) {
-
-		this.subjectList = subjectsList;
-	}
-
-	public void setTitles(String[] titlesList) {
-
-		this.titleList = titlesList;
-	}
-
-	public void setTypes(String[] typesList) {
-
-		this.typeList = typesList;
-	}
-
-	/**
-	 * Checking if necessary values are set and not allowed values are not set
-	 * 
-	 * @param request
-	 *            the request from the client
-	 * @return requestCheck indicating if the request is correct or not
-	 */
-	public boolean requestChecker(RequestType request) {
-
-		boolean requestCheck;
-
-		if (request.getFrom() != null || request.getUntil() != null
-				|| request.getResumptionToken() != null) {
-
-			requestCheck = false;
-		} else if (request.getSet() != null || request.getIdentifier() == null
-				|| request.getMetadataPrefix() == null) {
-			requestCheck = false;
-		}
-
-		else {
-			requestCheck = true;
-		}
-
-		return requestCheck;
-	}
-
-}
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererAbstract.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererAbstract.java
new file mode 100644
index 00000000..80c436fe
--- /dev/null
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererAbstract.java
@@ -0,0 +1,26 @@
+package info.textgrid.middleware;
+
+/**
+ * FIXME
+ * 
+ * @author Maximilian Brodhun, SUB Göttingen
+ * @author Stefan E. Funk, SUB Göttingen
+ * @version 2019-03-07
+ * @since 2019-03-07
+ */
+
+public abstract class RecordDelivererAbstract implements RecordDelivererInterface {
+
+  protected boolean textgrid;
+  protected boolean dariah;
+
+  /**
+   * @param textgrid
+   * @param dariah
+   */
+  public RecordDelivererAbstract(boolean textgrid, boolean dariah) {
+    this.textgrid = textgrid;
+    this.dariah = dariah;
+  }
+
+}
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java
new file mode 100644
index 00000000..a7921450
--- /dev/null
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java
@@ -0,0 +1,502 @@
+package info.textgrid.middleware;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.datatype.DatatypeConfigurationException;
+import org.apache.commons.logging.LogFactory;
+import org.elasticsearch.action.get.GetRequestBuilder;
+import org.elasticsearch.action.get.GetResponse;
+import info.textgrid.middleware.oaipmh.GetRecordType;
+import info.textgrid.middleware.oaipmh.HeaderType;
+import info.textgrid.middleware.oaipmh.OaiDcType;
+import info.textgrid.middleware.oaipmh.ObjectFactory;
+import info.textgrid.middleware.oaipmh.RecordType;
+import info.textgrid.middleware.oaipmh.RequestType;
+
+/**
+ * FIXME
+ * 
+ * @author Maximilian Brodhun SUB
+ * @version 1.1
+ * @since 17.02.2014
+ */
+
+public class RecordDelivererDC extends RecordDelivererAbstract {
+
+  private String[] fields;
+  private String[] workFields;
+
+  private String formatField;
+  private String formatToFilter;
+  private String dateOfObjectCreation;
+  private String relationToFurtherMetadataObject;
+  private String repositoryObjectURIPrefix;
+  private String identifierField;
+
+  /*
+   * Lists for the Dublin Core elements. Lists are needed since each DC fields is possible to occur
+   * several times
+   */
+
+  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>();
+  private List<String> descriptions = new ArrayList<String>();
+  private List<String> formats = new ArrayList<String>();
+  private List<String> identifiers = new ArrayList<String>();
+  private List<String> languages = new ArrayList<String>();
+  private List<String> publishers = new ArrayList<String>();
+  private List<String> relations = new ArrayList<String>();
+  private List<String> rights = new ArrayList<String>();
+  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 String[] contributorList;
+  private String[] coverageList;
+  private String[] creatorList;
+  private String[] dateList;
+  private String[] descriptionList;
+  private String[] formatList;
+  private String[] identifierList;
+  private String[] languageList;
+  private String[] publisherList;
+  private String[] relationList;
+  private String[] relationForWorkList;
+  private String[] rightList;
+  private String[] sourceList;
+  private String[] subjectList;
+  private String[] titleList;
+  private String[] typeList;
+
+  private static org.apache.commons.logging.Log log = LogFactory.getLog(RecordDelivererDC.class);
+
+  private OAI_ESClient oaiEsClient;
+
+  /**
+   * @param oaiEsClient
+   * @param workFields
+   * @param textgrid
+   * @param dariah
+   */
+  public RecordDelivererDC(OAI_ESClient oaiEsClient, String[] workFields, boolean textgrid,
+      boolean dariah) {
+    this.oaiEsClient = oaiEsClient;
+    this.workFields = workFields;
+    this.textgrid = textgrid;
+    this.dariah = dariah;
+  }
+
+  /**
+   * Query ElasticSearch index for the values mapped to dublinCore for a specific object
+   * 
+   * @param id identifier within the EalsticSearch index
+   * @return Get the GetRecord response for the request
+   */
+  public GetRecordType getRecordById(String id) {
+
+    // FIXME Interface!
+
+    ObjectFactory of = new ObjectFactory();
+    OaiDcType odt = new OaiDcType();
+    GetRecordType grt = new GetRecordType();
+    RecordType record = new RecordType();
+    String changedId = id;
+    DublinCoreBuilder dbc = new DublinCoreBuilder(odt, of);
+
+    if (id.startsWith(this.repositoryObjectURIPrefix)) {
+      changedId = changedId.replace(this.repositoryObjectURIPrefix, "");
+      // System.out.println("CHANGEDID: " + changedId);
+    }
+
+    GetRequestBuilder recordById = OAI_ESClient.getOaiESClient()
+        .prepareGet().setIndex(OAI_ESClient.getEsIndex())
+        .setType(OAI_ESClient.getEsType()).setFields(this.fields)
+        .setId(changedId);
+
+    GetResponse tgObject = recordById.execute().actionGet();
+
+    if (tgObject.isExists()) {
+
+      String identifier;
+
+      if (this.dariah == true) {
+
+        putContentIntoDCFieldLists(tgObject);
+        // FIXME MAX!!!! DO CONFIGURE!!!!
+
+        // System.out.println(identifierField);
+        identifier = tgObject.getField(this.identifierField).getValue().toString();
+        // System.out.println("IDENTIFIER: " + identifier);
+        String dateOfCreation = "NO_DATE_SET!";
+
+        if (tgObject.getField(this.dateOfObjectCreation) != null) {
+          try {
+            dateOfCreation = OAIPMHUtillities
+                .convertDateFormat(
+                    tgObject.getField(this.dateOfObjectCreation).getValue().toString())
+                .toXMLFormat();
+          } catch (ParseException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+          } catch (DatatypeConfigurationException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+          }
+        }
+        setRecordHeader(dateOfCreation, identifier, record, dbc);
+      }
+
+      if (this.textgrid == true
+          && tgObject.getField(formatField).getValue().toString().equals(formatToFilter)) {
+
+        String workUri =
+            tgObject.getField(this.relationToFurtherMetadataObject).getValue().toString();
+        workUri = workUri.substring(this.repositoryObjectURIPrefix.length());
+        putContentIntoDCFieldLists(tgObject, furtherDCElements(workUri));
+        identifier = tgObject.getField(this.identifierField).getValue().toString();
+        String dateOfCreation = tgObject.getField(this.dateOfObjectCreation).getValue().toString();
+        setRecordHeader(dateOfCreation, identifier, record, dbc);
+      }
+
+      setDCObject(odt, of, dbc);
+      record.setMetadata(dbc.getDC());
+      grt.setRecord(record);
+      listClearer();
+
+    } else {
+      grt = null;
+    }
+
+    return grt;
+  }
+
+  /**
+   * Checking if necessary values are set and not allowed values are not set
+   * 
+   * @param request the request from the client
+   * @return requestCheck indicating if the request is correct or not
+   */
+  public boolean requestChecker(RequestType request) {
+
+    boolean requestCheck;
+
+    if (request.getFrom() != null || request.getUntil() != null
+        || request.getResumptionToken() != null) {
+
+      requestCheck = false;
+    } else if (request.getSet() != null || request.getIdentifier() == null
+        || request.getMetadataPrefix() == null) {
+      requestCheck = false;
+    }
+
+    else {
+      requestCheck = true;
+    }
+
+    return requestCheck;
+  }
+
+  // **
+  // PRIVATE METHODS
+  // **
+
+  /**
+   * @param dateOfCreation
+   * @param identifier
+   * @param record
+   * @param dbc
+   * @return
+   */
+  private static RecordType setRecordHeader(String dateOfCreation, String identifier,
+      RecordType record, DublinCoreBuilder dbc) {
+
+    HeaderType recordHeader = new HeaderType();
+    // System.out.println("IDENTIFIRE::: " + identifier);
+    recordHeader.setIdentifier(identifier);
+    recordHeader.setDatestamp(dateOfCreation);
+    record.setMetadata(dbc.getDC());
+    record.setHeader(recordHeader);
+
+    return record;
+  }
+
+  /**
+   * @param id
+   * @return
+   */
+  private GetResponse furtherDCElements(String id) {
+
+    if (!id.endsWith(".0")) {
+      id = id.concat(".0");
+    }
+
+    GetRequestBuilder getWorkValues = OAI_ESClient.getOaiESClient()
+        .prepareGet().setIndex(OAI_ESClient.getEsIndex())
+        .setType(OAI_ESClient.getEsType()).setId(id)
+        .setFields(this.workFields);
+
+    GetResponse responseWorkValues = getWorkValues.execute().actionGet();
+
+    try {
+      if (responseWorkValues.getField(this.dateOfObjectCreation) != null) {
+        this.dates.add(OAIPMHUtillities
+            .convertDateFormat(
+                responseWorkValues.getField(this.dateOfObjectCreation).getValue().toString())
+            .toXMLFormat());
+      }
+    } catch (ParseException e) {
+      log.debug(e);
+    } catch (DatatypeConfigurationException e) {
+      log.debug(e);
+    }
+
+    return responseWorkValues;
+  }
+
+  /**
+   * @param responseWorkValues
+   * @param relatedWorkObject
+   */
+  private void putContentIntoDCFieldLists(GetResponse responseWorkValues,
+      GetResponse relatedWorkObject) {
+    this.contributors =
+        DublinCoreFieldLoader.setContributor(responseWorkValues, this.contributorList);
+    this.formats = DublinCoreFieldLoader.setFormat(responseWorkValues, this.formatList);
+    this.identifiers = DublinCoreFieldLoader.setIdentifier(responseWorkValues, this.identifierList);
+    this.languages = DublinCoreFieldLoader.setLanguage(responseWorkValues, this.languageList);
+    this.publishers = DublinCoreFieldLoader.setPublisher(responseWorkValues, this.publisherList);
+    this.relations =
+        DublinCoreFieldLoader.setRelationForWork(responseWorkValues, this.relationList);
+    this.rights = DublinCoreFieldLoader.setRights(responseWorkValues, this.rightList);
+    this.sources = DublinCoreFieldLoader.setSources(responseWorkValues, this.sourceList);
+    this.titles = DublinCoreFieldLoader.setTitle(responseWorkValues, this.titleList);
+    this.coverages = DublinCoreFieldLoader.setCoverage(responseWorkValues, this.coverageList);
+    this.creators = DublinCoreFieldLoader.setCreator(relatedWorkObject, this.creatorList);
+    this.dates = DublinCoreFieldLoader.setDate(relatedWorkObject, this.dateList);
+    this.descriptions =
+        DublinCoreFieldLoader.setDescription(relatedWorkObject, this.descriptionList);
+    this.relations =
+        DublinCoreFieldLoader.setRelationForWork(relatedWorkObject, this.relationForWorkList);
+    this.subjects = DublinCoreFieldLoader.setSubject(relatedWorkObject, this.subjectList);
+    this.types = DublinCoreFieldLoader.setType(relatedWorkObject, this.typeList);
+  }
+
+  /**
+   * @param responseWorkValues
+   */
+  private void putContentIntoDCFieldLists(GetResponse responseWorkValues) {
+    this.contributors =
+        DublinCoreFieldLoader.setContributor(responseWorkValues, this.contributorList);
+    this.coverages = DublinCoreFieldLoader.setCoverage(responseWorkValues, this.coverageList);
+    this.creators = DublinCoreFieldLoader.setCreator(responseWorkValues, this.creatorList);
+    this.dates = DublinCoreFieldLoader.setDate(responseWorkValues, this.dateList);
+    this.descriptions =
+        DublinCoreFieldLoader.setDescription(responseWorkValues, this.descriptionList);
+    this.formats = DublinCoreFieldLoader.setFormat(responseWorkValues, this.formatList);
+    this.identifiers = DublinCoreFieldLoader.setIdentifier(responseWorkValues, this.identifierList);
+    this.languages = DublinCoreFieldLoader.setLanguage(responseWorkValues, this.languageList);
+    this.publishers = DublinCoreFieldLoader.setPublisher(responseWorkValues, this.publisherList);
+    this.relations = DublinCoreFieldLoader.setRelation(responseWorkValues, this.relationList);
+    this.rights = DublinCoreFieldLoader.setRights(responseWorkValues, this.rightList);
+    this.sources = DublinCoreFieldLoader.setSources(responseWorkValues, this.sourceList);
+    this.subjects = DublinCoreFieldLoader.setSubject(responseWorkValues, this.subjectList);
+    this.titles = DublinCoreFieldLoader.setTitle(responseWorkValues, this.titleList);
+    this.types = DublinCoreFieldLoader.setType(responseWorkValues, this.typeList);
+  }
+
+  /**
+   * converting the textGrid elements into dublinCore elements
+   * 
+   * @param odt container for the OAIPMH DublinCore element
+   * @param of jaxb object factory the DublinCore elements
+   */
+  private void setDCObject(OaiDcType odt, ObjectFactory of, DublinCoreBuilder dbc) {
+    dbc.setContributor(this.contributors);
+    dbc.setCoverage(this.coverages);
+    dbc.setCreator(this.creators);
+    dbc.setDate(this.dates);
+    dbc.setDescription(this.descriptions);
+    dbc.setFormat(this.formats);
+    dbc.setIdentifier(this.identifiers);
+    dbc.setLanguage(this.languages);
+    dbc.setPublisher(this.publishers);
+    dbc.setRelation(this.relations);
+    dbc.setRights(this.rights);
+    dbc.setSource(this.sources);
+    dbc.setSubject(this.subjects);
+    dbc.setTitle(this.titles);
+    dbc.setType(this.types);
+  }
+
+  /**
+   * 
+   */
+  private void listClearer() {
+    this.contributors.clear();
+    this.coverages.clear();
+    this.creators.clear();
+    this.dates.clear();
+    this.descriptions.clear();
+    this.formats.clear();
+    this.identifiers.clear();
+    this.languages.clear();
+    this.publishers.clear();
+    this.relations.clear();
+    this.rights.clear();
+    this.sources.clear();
+    this.subjects.clear();
+    this.titles.clear();
+    this.types.clear();
+  }
+
+  // **
+  // GETTERS AND SETTERS
+  // **
+
+  /**
+   * @param formatToFilter
+   */
+  public void setFormatToFilter(String formatToFilter) {
+    this.formatToFilter = formatToFilter;
+  }
+
+  /**
+   * @param formatField
+   */
+  public void setFormatField(String formatField) {
+    this.formatField = formatField;
+  }
+
+  public String getDateOfObjectCreation() {
+    return this.dateOfObjectCreation;
+  }
+
+  public void setDateOfObjectCreation(String dateOfObjectCreation) {
+    this.dateOfObjectCreation = dateOfObjectCreation;
+  }
+
+  public String getRelationToFurtherMetadataObject() {
+    return this.relationToFurtherMetadataObject;
+  }
+
+  public void setRelationToFurtherMetadataObject(
+      String relationToFurtherMetadataObject) {
+    this.relationToFurtherMetadataObject = relationToFurtherMetadataObject;
+  }
+
+  public String getRepositoryObjectURIPrefix() {
+    return this.repositoryObjectURIPrefix;
+  }
+
+  public void setRepositoryObjectURIPrefix(String repositoryObjectURIPrefix) {
+    this.repositoryObjectURIPrefix = repositoryObjectURIPrefix;
+  }
+
+  public String getIdentifierField() {
+    return this.identifierField;
+  }
+
+  public void setIdentifierField(String identifierPrefix) {
+    this.identifierField = identifierPrefix;
+  }
+
+  public void setFields(String[] fields) {
+    this.fields = fields;
+  }
+
+  public String[] getFields() {
+    return this.fields;
+  }
+
+  public void setWorkFields(String[] workFields) {
+    this.workFields = workFields;
+  }
+
+  public void setContributor(String[] contributorList) {
+    this.contributorList = contributorList;
+  }
+
+  public String[] getContributor() {
+    return this.contributorList;
+  }
+
+  public void setCoverage(String[] coveragesList) {
+
+    this.coverageList = coveragesList;
+  }
+
+  public void setCreator(String[] creatorsList) {
+
+    this.creatorList = creatorsList;
+  }
+
+  public void setDates(String[] datesList) {
+
+    this.dateList = datesList;
+  }
+
+  public void setDescriptions(String[] descriptionsList) {
+
+    this.descriptionList = descriptionsList;
+  }
+
+  public void setFormats(String[] formatsList) {
+
+    this.formatList = formatsList;
+  }
+
+  public void setIdentifiers(String[] identifiersList) {
+
+    this.identifierList = identifiersList;
+  }
+
+  public void setLanguages(String[] languagesList) {
+
+    this.languageList = languagesList;
+  }
+
+  public void setPublishers(String[] publishersList) {
+
+    this.publisherList = publishersList;
+  }
+
+  public void setRelations(String[] relationsList) {
+
+    this.relationList = relationsList;
+  }
+
+  public void setRelationsForWork(String[] relationsList) {
+
+    this.relationForWorkList = relationsList;
+  }
+
+  public void setRights(String[] rightsList) {
+
+    this.rightList = rightsList;
+  }
+
+  public void setSources(String[] sourcesList) {
+
+    this.sourceList = sourcesList;
+  }
+
+  public void setSubjects(String[] subjectsList) {
+
+    this.subjectList = subjectsList;
+  }
+
+  public void setTitles(String[] titlesList) {
+
+    this.titleList = titlesList;
+  }
+
+  public void setTypes(String[] typesList) {
+
+    this.typeList = typesList;
+  }
+
+}
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererInterface.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererInterface.java
new file mode 100644
index 00000000..65f66e4e
--- /dev/null
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererInterface.java
@@ -0,0 +1,37 @@
+package info.textgrid.middleware;
+
+import info.textgrid.middleware.oaipmh.GetRecordType;
+import info.textgrid.middleware.oaipmh.RequestType;
+
+/**
+ * FIXME
+ * 
+ * @author Maximilian Brodhun, SUB Göttingen
+ * @author Stefan E. Funk, SUB Göttingen
+ * @version 2019-03-07
+ * @since 2019-03-07
+ */
+
+public interface RecordDelivererInterface {
+
+  /**
+   * <p>
+   * Query database (whatever) for specific dataset.
+   * </p>
+   * 
+   * @param id identifier within database
+   * @return Get the GetRecord response for the request
+   */
+  GetRecordType getRecordById(String id);
+
+  /**
+   * <p>
+   * Checking if necessary values are set and not allowed values are not set.
+   * </p>
+   * 
+   * @param request the request from the client
+   * @return requestCheck indicating if the request is correct or not
+   */
+  boolean requestChecker(RequestType request);
+
+}
-- 
GitLab