/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.segmentation.server.paramImport;
import static net.codjo.segmentation.server.util.SegmentationUtil.getColumnIndexByName;
import net.codjo.segmentation.server.ParseException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
public abstract class AbstractParserManager {
protected String[][] dataArray;
private String rawData;
private String[] columnNames;
private String[] fileHeader;
private Connection connection;
protected AbstractParserManager(String rawData) {
this.rawData = rawData;
}
public boolean isValidColumn(String column) throws ParseException {
return Arrays.binarySearch(getColumnNames(), column) > -1;
}
public void parse() throws ParseException {
dataArray = new String[getRowCount()][getColumnNames().length + 1];
String[] header = createHeader();
System.arraycopy(header, 0, dataArray[0], 0, header.length);
initialiseRows();
}
private String[] createHeader() throws ParseException {
StringTokenizer tokenizer = new StringTokenizer(rawData, "\n");
String headerLine = tokenizer.nextToken();
StringTokenizer headerTokenizer = new StringTokenizer(headerLine, "\t");
if (getColumnNames().length < headerTokenizer.countTokens()) {
throw new ParseException(ParseException.BAD_FILE_FORMAT);
}
int index = 0;
fileHeader = new String[headerTokenizer.countTokens()];
while (headerTokenizer.hasMoreTokens()) {
String column = headerTokenizer.nextToken();
if (!isValidColumn(column)) {
throw new ParseException(ParseException.BAD_FILE_FORMAT);
}
fileHeader[index] = column;
index++;
}
String[] header = new String[getColumnNames().length + 1];
System.arraycopy(getColumnNames(), 0, header, 0, getColumnNames().length);
header[header.length - 1] = "IS_QUARANTINE";
return header;
}
private void initialiseRows() throws ParseException {
StringTokenizer lineTokenizer = new StringTokenizer(rawData, "\n");
lineTokenizer.nextToken();
int rowIndex = 1;
while (lineTokenizer.hasMoreTokens()) {
String currentLine = lineTokenizer.nextToken();
String pattern = "\t";
int occurrences = currentLine.length() - currentLine.replaceAll(pattern, "").length();
if (fileHeader.length - 2 >= occurrences) {
throw new ParseException(ParseException.BAD_FILE_FORMAT);
}
StringTokenizer currentLineTokenizer = new StringTokenizer(currentLine, "\t", true);
int index = 0;
boolean tabInPrevious = false;
while (currentLineTokenizer.hasMoreTokens()) {
String value = currentLineTokenizer.nextToken();
String columnInFile = fileHeader[index];
int indexInDataArray = getColumnIndexByName(dataArray[0], columnInFile);
if (tabInPrevious && "\t".equals(value)) {
dataArray[rowIndex][indexInDataArray] = null;
index++;
}
else {
if (!"\t".equals(value)) {
dataArray[rowIndex][indexInDataArray] = value;
index++;
}
}
tabInPrevious = "\t".equals(value);
}
dataArray[rowIndex][getColumnIndexByName(dataArray[0], "IS_QUARANTINE")] = "false";
rowIndex++;
}
}
private int getRowCount() {
return new StringTokenizer(rawData, "\n").countTokens();
}
public String[] getFileHeader() {
return fileHeader;
}
public String[][] getDataArray() {
return dataArray;
}
public abstract String getTableName();
public String[] getColumnNames() throws ParseException {
if (columnNames == null) {
initColumnNames();
}
return columnNames;
}
private void initColumnNames() throws ParseException {
try {
Statement statement = connection.createStatement();
String request = "select name from syscolumns where id=object_id('" + getTableName() + "')";
ResultSet resultSet = statement.executeQuery(request);
List<String> columnList = new ArrayList<String>();
while (resultSet.next()) {
columnList.add(resultSet.getString("name"));
}
columnNames = columnList.toArray(new String[columnList.size()]);
Arrays.sort(columnNames);
}
catch (SQLException exception) {
throw new ParseException(exception.getLocalizedMessage());
}
}
public void setConnection(Connection connection) {
this.connection = connection;
}
}