package com.zillabyte.motherbrain.flow;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import net.sf.json.JSONArray;
import org.eclipse.jdt.annotation.NonNullByDefault;
import com.google.common.collect.Lists;
@NonNullByDefault
public final class Fields implements Iterable<String>, Serializable {
private static final long serialVersionUID = -2286408858067807309L;
public static final String COLUMN_ALIASES = "_column_aliases";
private ArrayList<String> _list;
public static final String DEFAULT = "_default_field";
public Fields(String... strings) {
this(Lists.newArrayList(strings));
}
public Fields(List<String> fieldNames) {
this._list = new ArrayList<>(fieldNames);
}
public Fields(JSONArray fieldNames) {
this((String[])fieldNames.toArray(new String[] {}));
}
public Fields(Collection<String> fields) {
this(fields.toArray(new String[] {}));
}
public String[] asStrings() {
final String[] array = _list.toArray(new String[] {});
assert (array != null);
return array;
}
public int getIndex(String key) {
return _list.indexOf(key);
}
public Fields add(String s) {
this._list.add(s);
return this;
}
public Fields addAll(Collection<String> c) {
this._list.addAll(c);
return this;
}
public Fields addAll(Fields f) {
for(final String s : f) {
/*
* Never allow a null field
*/
assert (s != null);
if (this._list.contains(s) == false) {
this.add(s);
}
}
return this;
}
/**
* Contract: Every element that returned iterator goes through is non-null.
*/
@Override
public Iterator<String> iterator() {
final Iterator<String> iter = _list.iterator();
/*
* By contract with List.
*/
assert (iter != null);
return iter;
}
public int size() {
return _list.size();
}
@Override
public Fields clone() {
return new Fields(new ArrayList<>(_list));
}
public Fields remove(Fields groupFields) {
Fields f = this.clone();
for(String i : groupFields._list) {
f._list.remove(i);
}
return f;
}
/***
*
*/
@Override
public String toString() {
final String string = _list.toString();
assert (string != null);
return string;
}
/**
* @param i Index of field
* @return Non-null String representing field name.
*/
public String get(int i) {
final String value = _list.get(i);
/*
* Either we're out of bounds or the value is non-null
*/
assert (value != null);
return value;
}
public boolean contains(String field) {
return this._list.contains(field);
}
}