// ============================================================================ // // Copyright (C) 2006-2016 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.dataprofiler.core.ui.wizard.parserrule; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TableColumn; import org.talend.dataprofiler.core.ImageLib; import org.talend.dq.helper.FileUtils; import com.talend.csv.CSVReader; /** * CsvFileTableViewer is a table viewer for preview a simple csv file. */ public class CsvFileTableViewer extends Composite { private static final char CURRENT_SEPARATOR = '\t'; private boolean useTextQualifier = true; private static final Image WARN_IMG = ImageLib.getImage(ImageLib.LEVEL_WARNING); private static CSVReader reader; private TableViewer viewer; private boolean quotesError = false; private boolean hasPatternHeaders = false; /** * DOC bZhou CsvFileTableViewer class global comment. Detailled comment */ static class ViewContentProvider implements IStructuredContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object parent) { CSVReader csvReader = (CSVReader) parent; List<Object> rows = new ArrayList<Object>(); try { csvReader.setStoreRawRecord(true); while (csvReader.readNext()) { String rawRecord = reader.getRawRecord(); String[] columnsValue = rawRecord.split(String.valueOf(reader.getSeperator())); rows.add(columnsValue); // rows.add(csvReader.getValues()); } } catch (IOException e) { e.printStackTrace(); } return rows.toArray(new Object[rows.size()]); } } /** * DOC bZhou CsvFileTableViewer class global comment. Detailled comment */ class ViewLabelProvider extends LabelProvider implements ITableLabelProvider { public String getColumnText(Object obj, int index) { String[] values = (String[]) obj; return index < values.length ? values[index] : null; } public Image getColumnImage(Object obj, int index) { String[] values = (String[]) obj; return index < values.length ? getImage(values[index]) : null; } @Override public Image getImage(Object obj) { if (!checkQuoteMarks(obj.toString())) { quotesError = true; return WARN_IMG; } else { return null; } } } public CsvFileTableViewer(final Composite parent, int style) { super(parent, style); setLayout(new GridLayout()); createView(this); viewer.setInput(reader); } private void createHeader(String[] headers) { int columnCount = headers.length; TableColumn[] columns = viewer.getTable().getColumns(); for (TableColumn column : columns) { column.dispose(); } for (int i = 0; i < columnCount; i++) { TableColumn tableColumn = new TableColumn(viewer.getTable(), SWT.NONE); tableColumn.setText(headers[i]); tableColumn.pack(); } } private void createView(Composite parent) { viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); GridData data = new GridData(GridData.FILL_BOTH); data.heightHint = 100; viewer.getTable().setLayoutData(data); viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); viewer.getTable().setHeaderVisible(true); viewer.getTable().setLinesVisible(true); } private boolean checkQuoteMarks(String text) { if (0 == text.length()) { return true; } if ('\"' == text.charAt(0) && '\"' == text.charAt(text.length() - 1)) { return true; } if ('\"' != text.charAt(0) && '\"' != text.charAt(text.length() - 1)) { return true; } return false; } private boolean checkFileHeader(String[] headers) { List<String> parserRuleEnums = new ArrayList<String>(); for (ParserRuleToExcelEnum tmpEnum : ParserRuleToExcelEnum.values()) { parserRuleEnums.add(tmpEnum.getLiteral()); } for (String header : headers) { if (!parserRuleEnums.contains(trimQuote(header))) { return false; } } return true; } private String trimQuote(String text) { if (text.length() < 2) { return text; } int beginLen = 0; int endLen = text.length(); if ('\"' == text.charAt(beginLen) && '\"' == text.charAt(endLen - 1)) { return text.substring(1, endLen - 1); } return text; } /** * set a csv file. * * @param csvFile * @return whether the file be loaded. */ public boolean setCsvFile(File csvFile) { quotesError = false; hasPatternHeaders = false; try { if (useTextQualifier) { reader = FileUtils.createCSVReader(csvFile, FileUtils.TEXT_QUAL, FileUtils.ESCAPE_CHAR); } else { reader = FileUtils.createCSVReader(csvFile, FileUtils.QUOTECHAR_NOTVALID, FileUtils.ESCAPE_CHAR); } reader.setSkipEmptyRecords(true); reader.readHeaders(); String[] headers = reader.getHeaders(); hasPatternHeaders = checkFileHeader(headers); createHeader(headers); } catch (IOException e1) { e1.printStackTrace(); } viewer.setInput(reader); return true; } /** * Returns <code>true</code> if the file contains a patterns header. * * @return whether the file contains a patterns header. */ public boolean isHeadersInvalid() { return !hasPatternHeaders; } /** * Returns <code>true</code> if Use Text Qualifier. * * @return whether Use Text Qualifier */ public boolean isUseTextQualifier() { return useTextQualifier; } /** * Sets the csv reader use text qualifier if the argument is <code>true</code>. * * @param useTextQualifier */ public void setUseTextQualifier(boolean useTextQualifier) { this.useTextQualifier = useTextQualifier; } /** * Returns <code>true</code> if the file contains quotes error value. * * @return */ public boolean isQuotesError() { return quotesError; } }