StampTable.java

package pro.verron.officestamper.preset;

import org.springframework.lang.NonNull;

import java.util.*;

import static java.util.Collections.singletonList;

/// Represents a table with several columns, a header line, and several lines of content
///
/// @author Joseph Verron
/// @version ${version}
/// @since 1.6.2
public class StampTable
        extends AbstractSequentialList<List<String>> {
    private final List<String> headers;
    private final List<List<String>> records;

    @Override public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (!super.equals(o)) return false;
        StampTable lists = (StampTable) o;
        return Objects.equals(headers, lists.headers) && Objects.equals(records, lists.records);
    }

    @Override public int hashCode() {
        return Objects.hash(super.hashCode(), headers, records);
    }

    /// Instantiate an empty table
    public StampTable() {
        this.headers = new ArrayList<>();
        this.records = new ArrayList<>();
    }

    /// Instantiate a table with headers and several lines
    ///
    /// @param headers the header lines
    /// @param records the lines that the table should contain
    public StampTable(
            @NonNull List<String> headers,
            @NonNull List<List<String>> records
    ) {
        this.headers = headers;
        this.records = records;
    }

    @Override
    public int size() {
        return records.size();
    }

    @Override
    @NonNull
    public ListIterator<List<String>> listIterator(int index) {
        return records.listIterator(index);
    }

    /// empty.
    ///
    /// @return a [StampTable] object
    public static StampTable empty() {
        return new StampTable(
                singletonList("placeholder"),
                singletonList(singletonList("placeholder"))
        );
    }

    /// headers.
    ///
    /// @return a [List] object
    public List<String> headers() {
        return headers;
    }

}