/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright 2008 - 2009 Pentaho Corporation. All rights reserved. * * * Created May 26, 2009 * @author rmansoor */ package org.pentaho.platform.dataaccess.datasource.wizard.models; import java.util.ArrayList; import java.util.List; import org.pentaho.metadata.model.Category; import org.pentaho.metadata.model.Domain; import org.pentaho.metadata.model.LogicalColumn; import org.pentaho.metadata.model.LogicalModel; import org.pentaho.platform.dataaccess.datasource.Delimiter; import org.pentaho.platform.dataaccess.datasource.Enclosure; import org.pentaho.platform.dataaccess.datasource.beans.BusinessData; import org.pentaho.platform.dataaccess.datasource.wizard.DatasourceMessages; import org.pentaho.ui.xul.XulEventSourceAdapter; import org.pentaho.ui.xul.stereotype.Bindable; public class CsvModel extends XulEventSourceAdapter{ private CsvModelValidationListenerCollection csvModelValidationListeners; private boolean validated; private String datasourceName; private BusinessData businessData; private boolean headersPresent = false; private List<CsvModelDataRow> dataRows = new ArrayList<CsvModelDataRow>(); private String selectedFile = null; private Enclosure enclosure; private Delimiter delimiter; private List<String> enclosureList; private List<String> delimiterList; private DatasourceMessages messages; public CsvModel() { } @Bindable public List<String> getEnclosureList() { return enclosureList; } @Bindable public void setEnclosureList() { enclosureList = new ArrayList<String>(); Enclosure[] enclosureArray = Enclosure.values(); for(int i=0;i<enclosureArray.length;i++) { enclosureList.add(getMessages().getString(enclosureArray[i].getName())); } this.firePropertyChange("enclosureList", null, enclosureList); //$NON-NLS-1$ } @Bindable public List<String> getDelimiterList() { return delimiterList; } @Bindable public void setDelimiterList() { delimiterList = new ArrayList<String>(); Delimiter[] delimiterArray = Delimiter.values(); for(int i=0;i<delimiterArray.length;i++) { delimiterList.add(getMessages().getString(delimiterArray[i].getName())); } this.firePropertyChange("delimiterList", null, delimiterList); //$NON-NLS-1$ } @Bindable public String getDatasourceName() { return datasourceName; } @Bindable public void setDatasourceName(String datasourceName) { String previousVal = this.datasourceName; this.datasourceName = datasourceName; // if we're editing a generated or already defined domain, // we need to keep the datasource name in sync if (getBusinessData() != null && getBusinessData().getDomain() != null) { Domain domain = getBusinessData().getDomain(); domain.setId(datasourceName); LogicalModel model = domain.getLogicalModels().get(0); String localeCode = domain.getLocales().get(0).getCode(); model.getName().setString(localeCode, datasourceName); } this.firePropertyChange("datasourcename", previousVal, datasourceName); //$NON-NLS-1$ validate(); } @Bindable public BusinessData getBusinessData() { return businessData; } @Bindable public void setBusinessData(BusinessData value) { this.businessData = value; if (value != null) { Domain domain = value.getDomain(); List<List<String>> data = value.getData(); List<LogicalModel> logicalModels = domain.getLogicalModels(); int columnNumber = 0; for (LogicalModel logicalModel : logicalModels) { List<Category> categories = logicalModel.getCategories(); for (Category category : categories) { List<LogicalColumn> logicalColumns = category.getLogicalColumns(); for (LogicalColumn logicalColumn : logicalColumns) { addCsvModelDataRow(logicalColumn, getColumnData(columnNumber++, data), domain.getLocales().get(0).getCode()); } } } firePropertyChange("dataRows", null, dataRows);//$NON-NLS-1$ } else { if (this.dataRows != null) { this.dataRows.removeAll(dataRows); List<CsvModelDataRow> previousValue = this.dataRows; firePropertyChange("dataRows", previousValue, null);//$NON-NLS-1$ } } validate(); } @Bindable public boolean isHeadersPresent() { return headersPresent; } @Bindable public void setHeadersPresent(boolean value) { if(value != this.headersPresent) { this.headersPresent = value; this.firePropertyChange("headersPresent", !value, this.headersPresent); //$NON-NLS-1$ validate(); } } @Bindable public String getSelectedFile() { return selectedFile; } @Bindable public void setSelectedFile(String value) { String previousVal = this.selectedFile; this.selectedFile = value; this.firePropertyChange("selectedFile", previousVal, value); //$NON-NLS-1$ validate(); } @Bindable public boolean isValidated() { return validated; } @Bindable private void setValidated(boolean value) { if(value != this.validated) { this.validated = value; this.firePropertyChange("validated", !value, this.validated);//$NON-NLS-1$ } } public void validate() { if (datasourceName != null && datasourceName.length() > 0 && getSelectedFile() != null && getSelectedFile().length() > 0 && getBusinessData() != null) { fireCsvModelValid(); this.setValidated(true); } else { fireCsvModelInValid(); this.setValidated(false); } } @Bindable private void addCsvModelDataRow(LogicalColumn column, List<String> columnData,String locale) { if (dataRows == null) { dataRows = new ArrayList<CsvModelDataRow>(); } this.dataRows.add(new CsvModelDataRow(column, columnData, locale)); } @Bindable public List<CsvModelDataRow> getDataRows() { return dataRows; } @Bindable public void setDataRows(List<CsvModelDataRow> dataRows) { this.dataRows = dataRows; } @Bindable private List<String> getColumnData(int columnNumber, List<List<String>> data) { List<String> column = new ArrayList<String>(); for (List<String> row : data) { if (columnNumber < row.size()) { column.add(row.get(columnNumber)); } } return column; } @Bindable public Enclosure getEnclosure() { return enclosure; } @Bindable public void setEnclosure(Enclosure value) { Enclosure previousValue = this.enclosure; this.enclosure = value; this.firePropertyChange("enclosure", previousValue, value); //$NON-NLS-1$ } @Bindable public Delimiter getDelimiter() { return delimiter; } @Bindable public void setDelimiter(Delimiter value) { Delimiter previousValue = this.delimiter; this.delimiter = value; this.firePropertyChange("delimiter", previousValue, value); //$NON-NLS-1$ } public DatasourceMessages getMessages() { return messages; } public void setMessages(DatasourceMessages value) { this.messages = value; } /* * Clears out the model */ public void clearModel() { setBusinessData(null); setDataRows(null); setSelectedFile(null); setDelimiter(Delimiter.COMMA); setEnclosure(Enclosure.DOUBLEQUOTE); setHeadersPresent(true); setDatasourceName(""); } public void addCsvModelValidationListener(ICsvModelValidationListener listener) { if (csvModelValidationListeners == null) { csvModelValidationListeners = new CsvModelValidationListenerCollection(); } csvModelValidationListeners.add(listener); } public void removeCsvModelValidationListener(IRelationalModelValidationListener listener) { if (csvModelValidationListeners != null) { csvModelValidationListeners.remove(listener); } } /** * Fire all current {@link ICsvModelValidationListener}. */ void fireCsvModelValid() { if (csvModelValidationListeners != null) { csvModelValidationListeners.fireCsvModelValid(); } } /** * Fire all current {@link ICsvModelValidationListener}. */ void fireCsvModelInValid() { if (csvModelValidationListeners != null) { csvModelValidationListeners.fireCsvModelInValid(); } } }