package topasin.util;
import static topasin.util.TopAsinUtil.log;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.apache.commons.lang3.ArrayUtils;
/**
* represent asin detail line
*
* @author mengzang
*
*/
public final class AsinDetail {
public static int getIndexFromFieldName(String fieldName) {
AsinFields asinFields = AsinFields.getAsinDetailFieldByName(fieldName);
return asinFields.getIndex();
}
public static String getFieldDisplayNameFromIndex(int index) {
AsinFields asinFields = AsinFields.getAsinDetailFieldByIndex(index);
return asinFields.getTitle();
}
private static int[] GROUP_INDEXS;
public static final void init(Map<String, Object> rtOptions) {
String[] groupColumnNames = (String[]) rtOptions.get(TopAsinContext.ASIN_GROUP_FIELD_NAMES);
AsinDetail.addNeededFields(groupColumnNames);
if (ArrayUtils.isEmpty(groupColumnNames) == true) {
log("Warning: No Group keys specified.");
return;
}
GROUP_INDEXS = new int[groupColumnNames.length];
for (int i = 0; i < groupColumnNames.length; i++) {
GROUP_INDEXS[i] = AsinDetail.getIndexFromFieldName(groupColumnNames[i]);
}
}
public final String getGroupKey() {
return TopAsinUtil.genGroupKeyFromStringArray(getStringFieldValues(GROUP_INDEXS));
}
private final String[] row;
public AsinDetail() {
row = new String[AsinFields.getAsinFieldsCount()];
}
// just get field values of specified field index
private static int[] FIELDS_INDEX = new int[] {
AsinFields.Asin.getIndex(),
};
public static synchronized void addNeededFields(String... fieldNames) {
if (ArrayUtils.isEmpty(fieldNames)) {
return;
}
Set<Integer> indexs = new TreeSet<Integer>();
for (Integer i : FIELDS_INDEX) {
indexs.add(i);
}
for (String fieldName : fieldNames) {
int fieldIndex = getIndexFromFieldName(fieldName);
indexs.add(fieldIndex);
}
Integer[] newIndexs = indexs.toArray(new Integer[0]);
FIELDS_INDEX = new int[newIndexs.length];
for (int i = 0; i < newIndexs.length; i++) {
FIELDS_INDEX[i] = newIndexs[i];
}
}
public void fillAsinDetailsWithNeededFields(final String asinDetailLine) {
int[] fieldIndexs = FIELDS_INDEX;
if (fieldIndexs == null || fieldIndexs.length == 0) {
return;
}
int len = asinDetailLine.length();
int currFieldId = 0;
int currFiledIdValue = fieldIndexs[currFieldId];
int prePos = 0;
int markerCount = -1;
char marker = ',';
for (int i = 0; i < len; i++) {
char curr = asinDetailLine.charAt(i);
if (curr == marker) {
markerCount++;
if (currFiledIdValue == markerCount) {
// needed to avoid OOM
String value = new String(asinDetailLine.substring(prePos, i).trim());
row[currFiledIdValue] = value;
currFieldId++;
if (currFieldId == fieldIndexs.length) {
return;
}
currFiledIdValue = fieldIndexs[currFieldId];
}
prePos = i + 1;
}
}
markerCount++;
if (currFiledIdValue == markerCount) {
String value = new String(asinDetailLine.substring(prePos, len));
row[currFiledIdValue] = value;
currFieldId++;
}
if (currFieldId != fieldIndexs.length) {
throw new IllegalArgumentException("Asin Detail Line can't fullfil indexs:" + Arrays.toString(FIELDS_INDEX)
+ ". Asin Detail Line:" + asinDetailLine);
}
return;
}
public String getAsin() {
return row[AsinFields.Asin.getIndex()];
}
public String[] getStringFieldValues(int[] filedIndexs) {
if (filedIndexs == null) {
return null;
}
return getStringFieldValues(filedIndexs, new String[filedIndexs.length]);
}
public String[] getStringFieldValues(int[] filedIndexs, String[] values) {
if (filedIndexs == null) {
return null;
}
for (int i = 0; i < filedIndexs.length; i++) {
values[i] = row[filedIndexs[i]];
}
return values;
}
public int getIntFieldValue(int index) {
return TopAsinUtil.getRealIntFromAsinDetailColunmString(row[index]);
}
public double getDoubleFieldValue(int index) {
return Double.parseDouble(row[index]);
}
public String getStringFieldValue(int index) {
return row[index];
}
public String[] getRow() {
return row;
}
@Override
public String toString() {
return "AsinDetail [row=" + Arrays.toString(row) + "]";
}
}