/*! * 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 (c) 2002-2016 Pentaho Corporation.. All rights reserved. */ package org.pentaho.platform.dataaccess.datasource.wizard.controllers; import org.pentaho.platform.dataaccess.datasource.wizard.DatasourceMessages; import org.pentaho.platform.dataaccess.datasource.wizard.models.DatasourceModel; import org.pentaho.ui.xul.binding.BindingConvertor; import org.pentaho.ui.xul.binding.BindingFactory; import org.pentaho.ui.xul.components.XulFileUpload; import org.pentaho.ui.xul.components.XulLabel; import org.pentaho.ui.xul.containers.XulDialog; import org.pentaho.ui.xul.gwt.binding.GwtBindingFactory; import org.pentaho.ui.xul.impl.AbstractXulEventHandler; import org.pentaho.ui.xul.stereotype.Bindable; //TODO: move to the CSV datasource package public class FileImportController extends AbstractXulEventHandler { private XulDialog datasourceDialog; private XulFileUpload fileUpload; private XulDialog errorDialog; private XulLabel errorLabel; private BindingFactory bf; private DatasourceMessages messages; private DatasourceModel datasourceModel; public FileImportController( DatasourceModel datasourceModel, DatasourceMessages messages ) { this.datasourceModel = datasourceModel; setDatasourceMessages( messages ); } @Bindable public void init() { bf = new GwtBindingFactory( document ); fileUpload = (XulFileUpload) document.getElementById( "fileUpload" ); //$NON-NLS-1$ datasourceDialog = (XulDialog) document.getElementById( "fileImportEditorWindow" ); //$NON-NLS-1$ errorLabel = (XulLabel) document.getElementById( "errorLabel" ); //$NON-NLS-1$ errorDialog = (XulDialog) document.getElementById( "errorDialog" ); //$NON-NLS-1$ BindingConvertor<String, Boolean> isDisabledConvertor = new BindingConvertor<String, Boolean>() { @Override public Boolean sourceToTarget( String aValue ) { return ( aValue == null || "".equals( aValue ) ); } @Override public String targetToSource( Boolean aValue ) { return null; } }; bf.createBinding( "fileUpload", "selectedFile", "okButton", "disabled", isDisabledConvertor ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ } @Override public String getName() { return "fileImportController"; //$NON-NLS-1$ } @Bindable public void submitCsv() { String fileName = datasourceModel.getModelInfo().getFileInfo().getTmpFilename(); if ( fileName != null && fileName.endsWith( ".tmp" ) ) { //$NON-NLS-1$ fileName = fileName.substring( 0, fileName.lastIndexOf( ".tmp" ) ); //$NON-NLS-1$ } fileUpload.addParameter( "file_name", fileName == null ? "" : fileName ); //$NON-NLS-1$ //$NON-NLS-2$ fileUpload.addParameter( "mark_temporary", "true" ); //$NON-NLS-1$ //$NON-NLS-2$ // specify that we want any compressed files to be unpacked fileUpload.addParameter( "unzip", "true" ); //$NON-NLS-1$ //$NON-NLS-2$ showWaitingDialog(); fileUpload.submit(); } public void closeWaitingDialog() { MessageHandler.getInstance().closeWaitingDialog(); } public void showWaitingDialog() { MessageHandler.getInstance().showWaitingDialog( messages.getString( "fileImportDialog.UPLOADING", fileUpload.getSeletedFile() ) ); //$NON-NLS-1$ } @Bindable public void showFileImportDialog() { fileUpload.setSelectedFile( "" ); datasourceDialog.show(); } @Bindable public void close() { datasourceDialog.hide(); } @Bindable public void uploadSuccess( String uploadedFile ) { closeWaitingDialog(); close(); String selectedFile = this.fileUpload.getSeletedFile(); String selectedFileLc = selectedFile.toLowerCase(); String uploadedFileLc = uploadedFile.toLowerCase(); if ( uploadedFile.indexOf( "\n" ) != -1 ) { // uploadedFile is newline-separated list of file names // for now we only support a single file showErroDialog( messages.getString( "fileImportDialog.COMPRESSED_TOO_MANY_FILES" ) ); return; } if ( selectedFileLc.endsWith( ".zip" ) || selectedFileLc.endsWith( ".tgz" ) || selectedFileLc.endsWith( ".tar" ) ) { // check to see what kind of file was extracted from the compressed upload if ( !uploadedFileLc.endsWith( ".csv.tmp" ) && !uploadedFileLc.endsWith( ".txt.tmp" ) ) { showErroDialog( messages.getString( "fileImportDialog.COMPRESSED_NO_CSV" ) ); return; } } if ( selectedFileLc.endsWith( ".csv" ) || selectedFileLc.endsWith( ".txt" ) || selectedFileLc.endsWith( ".zip" ) || selectedFileLc.endsWith( ".tgz" ) || selectedFileLc.endsWith( ".tar" ) ) { datasourceModel.getModelInfo().getFileInfo().setTmpFilename( uploadedFile ); datasourceModel.getModelInfo().getFileInfo().setFriendlyFilename( extractFilename( selectedFile ) ); } else { showErroDialog( messages.getString( "fileImportDialog.INVALID_FILE" ) ); } } private String extractFilename( String path ) { int idx = path.lastIndexOf( '\\' ); if ( idx >= 0 ) { // Windows-based path return path.substring( idx + 1 ); } idx = path.lastIndexOf( '/' ); if ( idx >= 0 ) { // Unix-based path return path.substring( idx + 1 ); } return path; // just the filename } @Bindable public void uploadFailure( Throwable t ) { closeWaitingDialog(); close(); datasourceModel.getModelInfo().getFileInfo().setTmpFilename( "" ); datasourceModel.getModelInfo().getFileInfo().setFriendlyFilename( "" ); showErroDialog( t.getMessage() ); } public void showErroDialog( String error ) { errorLabel.setValue( error ); errorDialog.show(); } @Bindable public void closeErrorDialog() { errorDialog.hide(); } public void setDatasourceMessages( DatasourceMessages datasourceMessages ) { this.messages = datasourceMessages; } }