// Path: bte-core/src/main/java/gr/ekt/bte/core/DataOutputSpec.java
// public interface DataOutputSpec {
// }
// 
// Path: bte-core/src/main/java/gr/ekt/bte/core/OutputGenerator.java
// public interface OutputGenerator {
//     public List<String> generateOutput(RecordSet recs);
//     public List<String> generateOutput(RecordSet recs, DataOutputSpec spec);
// }
// 
// Path: bte-core/src/main/java/gr/ekt/bte/core/Record.java
// public interface Record {
//     /**
//        Given the name of a field returns the list of values.
// 
//        @param field The name of the field
//        @return      The list of values of the specified field
//     */
//     public List<Value> getValues(String field);
// 
//     /**
//        Converts this record into a {@link MutableRecord}.
// 
//        @return a {@link MutableRecord} containing the exact same
//        values
//      */
//     public MutableRecord makeMutable();
// 
//     /**
//        Tests whether the record is mutable or not.
// 
//        @return <code>true</code> if the record is mutable
//      */
//     public boolean isMutable();
// 
//     public boolean hasField(String field);
// 
//     public Set<String> getFields();
// }
// 
// Path: bte-core/src/main/java/gr/ekt/bte/core/RecordSet.java
// public class RecordSet implements Iterable<Record> {
//     private List<Record> records;
// 
//     public RecordSet() {
//         records = new ArrayList<Record>();
//     }
// 
//     public RecordSet(List<Record> records) {
//         records = new ArrayList<Record>(records);
//     }
// 
//     @Override
//     public Iterator<Record> iterator() {
//         return records.iterator();
//     }
// 
//     public void addRecord(Record rec) {
//         // After a talk with kstamatis we decided that records can be
//         // inserted multiple times, therefore there is no way for this
//         // method to fail.
//         records.add(rec);
//     }
// 
//     public List<Record> getRecords() {
//         return records;
//     }
// 
//     public void setRecords(List<Record> records) {
//         this.records = records;
//     }
// 
//     public int size() {
//         return records.size();
//     }
// 
//     public void addAll(RecordSet other_records) {
//         for (Record rec : other_records) {
//             records.add(rec);
//         }
//     }
// }
// 
// Path: bte-core/src/main/java/gr/ekt/bte/core/Value.java
// public interface Value {
//     public String getAsString();
//     // We need to override this if we want other than the default comparison semantics.
//     // As a matter of fact we do for the MapRecord.
//     public boolean equals(Object other);
// }
// 
// Path: bte-io/src/main/java/gr/ekt/bteio/specs/DSpaceOutputSpec.java
// public class DSpaceOutputSpec implements DataOutputSpec {
//     private String prefix_dir_;
//     private int padding_;
// 
//     /**
//      * @return the padding_
//      */
//     public int getPadding() {
//         return padding_;
//     }
// 
//     /**
//      * @param padding_ the padding_ to set
//      */
//     public void setPadding(int padding) {
//         this.padding_ = padding;
//     }
// 
//     /**
//      * @return the prefix_dir_
//      */
//     public String getPrefixDir() {
//         return prefix_dir_;
//     }
// 
//     /**
//      * @param prefix_dir_ the prefix_dir_ to set
//      */
//     public void setPrefixDir(String prefix_dir) {
//         this.prefix_dir_ = prefix_dir;
//     }
// 
// }


import gr.ekt.bte.core.DataOutputSpec;
import gr.ekt.bte.core.OutputGenerator;
import gr.ekt.bte.core.Record;
import gr.ekt.bte.core.RecordSet;
import gr.ekt.bte.core.Value;
import gr.ekt.bteio.specs.DSpaceOutputSpec;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.log4j.Logger;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonStreamParser;
    public DSpaceOutputGenerator(Map<String, String> fmap, DSpaceOutputSpec spec) {
        field_map_ = fmap;
        spec_ = spec;
    }

    /**
     * Return the records in JSON.
     */
    @Override
    public List<String> generateOutput(RecordSet recs) {
        List<String> ret = null;
        if (spec_ != null) {
            ret = createOutput(recs, spec_.getPrefixDir(), spec_.getPadding());
        }
        else {
            ret = createOutput(recs, output_directory_, padding_);
        }

        if(write_json_) {
            writeJsonToFile(ret, "./output.json");
        }

        return ret;
    }

    /**
     * Return the records in JSON.
     */
    @Override
    public List<String> generateOutput(RecordSet recs, DataOutputSpec spec) {
// Path: bte-core/src/main/java/gr/ekt/bte/core/DataOutputSpec.java
// public interface DataOutputSpec {
// }
// 
// Path: bte-core/src/main/java/gr/ekt/bte/core/OutputGenerator.java
// public interface OutputGenerator {
//     public List<String> generateOutput(RecordSet recs);
//     public List<String> generateOutput(RecordSet recs, DataOutputSpec spec);
// }
// 
// Path: bte-core/src/main/java/gr/ekt/bte/core/Record.java
// public interface Record {
//     /**
//        Given the name of a field returns the list of values.
// 
//        @param field The name of the field
//        @return      The list of values of the specified field
//     */
//     public List<Value> getValues(String field);
// 
//     /**
//        Converts this record into a {@link MutableRecord}.
// 
//        @return a {@link MutableRecord} containing the exact same
//        values
//      */
//     public MutableRecord makeMutable();
// 
//     /**
//        Tests whether the record is mutable or not.
// 
//        @return <code>true</code> if the record is mutable
//      */
//     public boolean isMutable();
// 
//     public boolean hasField(String field);
// 
//     public Set<String> getFields();
// }
// 
// Path: bte-core/src/main/java/gr/ekt/bte/core/RecordSet.java
// public class RecordSet implements Iterable<Record> {
//     private List<Record> records;
// 
//     public RecordSet() {
//         records = new ArrayList<Record>();
//     }
// 
//     public RecordSet(List<Record> records) {
//         records = new ArrayList<Record>(records);
//     }
// 
//     @Override
//     public Iterator<Record> iterator() {
//         return records.iterator();
//     }
// 
//     public void addRecord(Record rec) {
//         // After a talk with kstamatis we decided that records can be
//         // inserted multiple times, therefore there is no way for this
//         // method to fail.
//         records.add(rec);
//     }
// 
//     public List<Record> getRecords() {
//         return records;
//     }
// 
//     public void setRecords(List<Record> records) {
//         this.records = records;
//     }
// 
//     public int size() {
//         return records.size();
//     }
// 
//     public void addAll(RecordSet other_records) {
//         for (Record rec : other_records) {
//             records.add(rec);
//         }
//     }
// }
// 
// Path: bte-core/src/main/java/gr/ekt/bte/core/Value.java
// public interface Value {
//     public String getAsString();
//     // We need to override this if we want other than the default comparison semantics.
//     // As a matter of fact we do for the MapRecord.
//     public boolean equals(Object other);
// }
// 
// Path: bte-io/src/main/java/gr/ekt/bteio/specs/DSpaceOutputSpec.java
// public class DSpaceOutputSpec implements DataOutputSpec {
//     private String prefix_dir_;
//     private int padding_;
// 
//     /**
//      * @return the padding_
//      */
//     public int getPadding() {
//         return padding_;
//     }
// 
//     /**
//      * @param padding_ the padding_ to set
//      */
//     public void setPadding(int padding) {
//         this.padding_ = padding;
//     }
// 
//     /**
//      * @return the prefix_dir_
//      */
//     public String getPrefixDir() {
//         return prefix_dir_;
//     }
// 
//     /**
//      * @param prefix_dir_ the prefix_dir_ to set
//      */
//     public void setPrefixDir(String prefix_dir) {
//         this.prefix_dir_ = prefix_dir;
//     }
// 
// }


// Path: bte-io/src/main/java/gr/ekt/bteio/generators/DSpaceOutputGenerator.java
import gr.ekt.bte.core.DataOutputSpec;
import gr.ekt.bte.core.OutputGenerator;
import gr.ekt.bte.core.Record;
import gr.ekt.bte.core.RecordSet;
import gr.ekt.bte.core.Value;
import gr.ekt.bteio.specs.DSpaceOutputSpec;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.log4j.Logger;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonStreamParser;

    public DSpaceOutputGenerator(Map<String, String> fmap, DSpaceOutputSpec spec) {
        field_map_ = fmap;
        spec_ = spec;
    }

    /**
     * Return the records in JSON.
     */
    @Override
    public List<String> generateOutput(RecordSet recs) {
        List<String> ret = null;
        if (spec_ != null) {
            ret = createOutput(recs, spec_.getPrefixDir(), spec_.getPadding());
        }
        else {
            ret = createOutput(recs, output_directory_, padding_);
        }

        if(write_json_) {
            writeJsonToFile(ret, "./output.json");
        }

        return ret;
    }

    /**
     * Return the records in JSON.
     */
    @Override
    public List<String> generateOutput(RecordSet recs, DataOutputSpec spec) {
        spec_ = (DSpaceOutputSpec)spec;