All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.brettonw.bedrock.bag.formats.FormatReaderTable Maven / Gradle / Ivy

package com.brettonw.bedrock.bag.formats;

import com.brettonw.bedrock.bag.BagArray;
import com.brettonw.bedrock.bag.BagObject;
import com.brettonw.bedrock.bag.entry.Handler;
import com.brettonw.bedrock.logger.LogManager;
import com.brettonw.bedrock.logger.Logger;

public class FormatReaderTable extends FormatReader implements ArrayFormatReader {
    private static final Logger log = LogManager.getLogger (FormatReaderTable.class);

    private Handler arrayHandler;
    private BagArray titlesArray;

    public FormatReaderTable () {}

    public FormatReaderTable (String input, Handler arrayHandler) {
        this (input, arrayHandler, null);
    }

    /**
     * @param input
     * @param arrayHandler a handler to return an array of arrays
     * @param titlesArray
     */
    public FormatReaderTable (String input, Handler arrayHandler, BagArray titlesArray) {
        super (input);
        this.arrayHandler = arrayHandler;
        this.titlesArray = titlesArray;
    }

    @Override
    public BagArray readBagArray () {
        // get the processed array
        BagArray bagArray = (BagArray) arrayHandler.getEntry (input);
        if (bagArray != null) {
            // filter it for actual entries, check to see if anything is left
            bagArray = bagArray.filter (object -> ((BagArray) object).getCount () > 0);
            if (bagArray.getCount () > 0) {
                // if we have a titles array, use it, otherwise use the first row of the array
                BagArray titlesArray = (this.titlesArray != null) ? this.titlesArray : (BagArray) bagArray.dequeue ();
                final int count = titlesArray.getCount ();

                // map each entry to a new bedrock object using the titles array
                BagArray mappedBagArray = new BagArray (bagArray.getCount ());
                bagArray.forEach (object -> {
                    BagArray entryArray = (BagArray) object;
                    if (count == entryArray.getCount ()) {
                        BagObject bagObject = new BagObject (count);
                        for (int i = 0; i < count; ++i) {
                            bagObject.put (titlesArray.getString (i), entryArray.getObject (i));
                        }
                        mappedBagArray.add (bagObject);
                    } else {
                        log.warn ("Mismatched size of entry and titles (skipping row)");
                    }
                });
                bagArray = mappedBagArray;
            }
        }
        return bagArray;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy