//***************************************************************************** //* //* (c) Copyright 2003. Glub Tech, Incorporated. All Rights Reserved. //* //* $Id: DataTransferManager.java 37 2009-05-11 22:46:15Z gary $ //* //***************************************************************************** package com.glub.secureftp.client.gui; import com.glub.secureftp.client.framework.*; import com.glub.secureftp.bean.*; import com.glub.util.*; import java.awt.Cursor; import java.io.*; import java.util.*; public class DataTransferManager { private static DataTransferManager instance = null; public static final short NONE = -1; public static final short UPLOAD = 0; public static final short DOWNLOAD = 1; private HashMap sessions = new HashMap(); private HashMap listings = new HashMap(); private HashMap threads = new HashMap(); private DataTransferManager() { } public static DataTransferManager getInstance() { if ( null == instance ) { instance = new DataTransferManager(); } return instance; } protected void storeTransfer( FTPSession session, DataTransfer dt ) { ArrayList transferList = (ArrayList)sessions.get( session ); if ( null == transferList ) { transferList = new ArrayList(); } transferList.add( dt ); sessions.put( session, transferList ); } protected void storeListing( FTPSession session, DataTransfer dt ) { listings.put( session, dt ); } public DataTransfer getListingForSession( FTPSession session ) { DataTransfer dt = (DataTransfer)listings.get( session ); listings.remove( session ); return dt; } public ArrayList getTransfersForSession( FTPSession session ) { return (ArrayList)sessions.get( session ); } protected DataTransferThread getTransferThread( FTPSession session ) { DataTransferThread transferThread = (DataTransferThread)threads.get( session ); if ( null == transferThread || transferThread.isDone() ) { transferThread = new DataTransferThread( session ); transferThread.start(); threads.put( session, transferThread ); } return transferThread; } public void download( FTPSession session, List fileList ) { if ( !Client.getAllowDownload() ) return; DataTransfer dt = new DataTransfer( DataTransfer.FILE, fileList, DOWNLOAD ); FTPSession copySession = new FTPSession( session ); storeTransfer( copySession, dt ); getTransferThread( copySession ); } public void upload( FTPSession session, List fileList, RemoteFile dest ) { if ( !Client.getAllowUpload() ) return; DataTransfer dt = new DataTransfer( DataTransfer.FILE, fileList, UPLOAD, dest ); storeTransfer( session, dt ); getTransferThread( session ); } public void list( FTPSession session ) { list( session, null ); } public void list( FTPSession session, RemoteFile dirToList ) { ArrayList fileList = new ArrayList(1); fileList.add( dirToList ); DataTransfer dt = new DataTransfer( DataTransfer.LIST, fileList, NONE ); //storeTransfer( session, dt ); storeListing( session, dt ); getTransferThread( session ); } } class DataTransferThread extends Thread { private FTPSession session; private boolean isDone = false; public DataTransferThread( FTPSession session ) { super(); this.session = session; } public void run() { SecureFTP.getBaseFrame().setCursor( new Cursor(Cursor.WAIT_CURSOR) ); isDone = false; session.setTransferringData( true ); ArrayList dataTransfers = DataTransferManager.getInstance().getTransfersForSession( session ); DataTransfer dt = null; while ( (null != dataTransfers && dataTransfers.size() > 0) || null != (dt=DataTransferManager.getInstance().getListingForSession(session)) ) { if ( null != dataTransfers && dataTransfers.size() > 0 ) { dt = (DataTransfer)dataTransfers.get( 0 ); dataTransfers.remove( 0 ); } String currentDir = session.getWorkingDir(); boolean changedDir = false; if ( DataTransferManager.UPLOAD == dt.getDirection() ) { RemoteFile destination = dt.getDestination(); String destPath = destination.getFileName(); if ( !destPath.endsWith("/") ) { destPath += "/"; } if ( destination.getFileName().length() == 0 && session.getWorkingDir().length() == 0 ) { // fix stupid case where cwd is empty and so is the dest } else if ( !destination.getFileName().equals(".") && !destPath.equals(session.getWorkingDir()) ) { try { session.getFTPBean().chdir( destination ); changedDir = true; } catch ( FTPPermissionDeniedException fde ) { LString msg = new LString("CDCommand.permission_denied", "[^0]: Permission denied."); msg.replace( 0, destPath ); ErrorDialog.showDialog( msg ); continue; } catch ( FTPException fe ) { fe.printStackTrace(); } } } Iterator iter = dt.getFileList().iterator(); FTPAbortableTransfer abort = null; DataTransferDialog dialog = null; if ( DataTransfer.FILE == dt.getType() ) { dialog = new DataTransferDialog( SecureFTP.getBaseFrame(), session, dt.getDirection(), abort ); } MGetCommand mgc = new MGetCommand(); ArrayList mgcArgs = new ArrayList(4); mgc.setArgs( mgcArgs ); MPutCommand mpc = new MPutCommand(); ArrayList mpcArgs = new ArrayList(4); mpc.setArgs( mpcArgs ); while ( iter.hasNext() ) { DataTransfer listTransfer = DataTransferManager.getInstance().getListingForSession( session ); // if a listing was requested in between transfers if ( null != listTransfer ) { RemoteFile dirToList = (RemoteFile)listTransfer.getFileList().get(0); list( dirToList ); } // if a listing was requested all by itself else if ( DataTransfer.LIST == dt.getType() ) { RemoteFile dirToList = (RemoteFile)iter.next(); list( dirToList ); } else if ( DataTransferManager.UPLOAD == dt.getDirection() ) { File file = (File)iter.next(); dialog.setFileName( file.getName() ); //System.out.println( "put " + file + " to " + dt.getDestination() ); ArrayList args = mpc.getArgs(); args.clear(); args.add( file ); args.add( session ); args.add( dialog ); args.add( mpc.getLastCommand() ); mpc.setArgs( args ); SecureFTPError result = SecureFTP.getCommandDispatcher().fireCommand( this, mpc ); if ( SecureFTPError.NOT_CONNECTED == result.getCode() ) { SecureFTP.getBaseFrame().setCursor( new Cursor(Cursor.DEFAULT_CURSOR) ); } else if ( SecureFTPError.TRANSFER_ABORTED == result.getCode() ) { list(); break; } } else { RemoteFile remoteFile = (RemoteFile)iter.next(); ArrayList args = mgc.getArgs(); args.clear(); args.add( remoteFile ); args.add( session ); args.add( dialog ); args.add( mgc.getLastCommand() ); mgc.setArgs( args ); SecureFTPError result = SecureFTP.getCommandDispatcher().fireCommand( this, mgc ); if ( SecureFTPError.NOT_CONNECTED == result.getCode() ) { SecureFTP.getBaseFrame().setCursor( new Cursor(Cursor.DEFAULT_CURSOR) ); } else if ( SecureFTPError.TRANSFER_ABORTED == result.getCode() ) { break; } } } if ( !changedDir && DataTransferManager.UPLOAD == dt.getDirection() ) { list(); ArrayList selectionList = new ArrayList( dt.getFileList().size() ); for ( int i = 0; i < dt.getFileList().size(); i++ ) { File f = ((File)dt.getFileList().get(i)); RemoteFile rf = new RemoteFile( f.getName() ); selectionList.add( rf ); } RemotePanel rp = (RemotePanel)session.getRemoteUI(); rp.getTableView().selectFiles( selectionList ); } else if ( DataTransferManager.DOWNLOAD == dt.getDirection() ) { Client.getLocalView().refresh(); ArrayList selectionList = new ArrayList( dt.getFileList().size() ); for ( int i = 0; i < dt.getFileList().size(); i++ ) { RemoteFile rf = ((RemoteFile)dt.getFileList().get(i)); File f = new File( session.getLocalDir(), rf.getFileName() ); selectionList.add( f ); } Client.getLocalView().selectFiles( selectionList ); } if ( null != dialog ) { dialog.dispose(); } if ( changedDir ) { try { session.getFTPBean().chdir( currentDir ); } catch ( FTPException fe ) { fe.printStackTrace(); } } /* else if ( DataTransferManager.UPLOAD == dt.getDirection() ) { list(); } */ } isDone = true; session.setTransferringData( false ); SecureFTP.getBaseFrame().setCursor( new Cursor(Cursor.DEFAULT_CURSOR) ); } private void list() { list(null); } private void list( RemoteFile dirToList ) { RemotePanel rp = (RemotePanel)session.getRemoteUI(); if ( null == rp ) { return; } RemoteFileList rfl = null; FTPAbortableTransfer abort = new FTPAbortableTransfer(); session.setAbortableListTransfer( abort ); Client.getToolBar().updateToolBar(); try { if ( null != dirToList ) { rfl = session.getFTPBean().list( dirToList, abort, Client.showHiddenFiles() ); } else { if (Client.showHiddenFiles()) rfl = session.getFTPBean().listAll( abort ); else rfl = session.getFTPBean().list( abort ); } } catch ( FTPAbortException fae ) { //System.out.println("List aborted"); rfl = new RemoteFileList(); } catch ( FTPConnectionLostException fcle ) { SecureFTP.getCommandDispatcher().fireCommand( this, new CloseCommand() ); ErrorDialog.showDialog( new LString("Common.connection_lost", "Connection lost.") ); } catch ( Exception fe ) { rfl = new RemoteFileList(); } finally { // remove hidden files if ( !Client.showHiddenFiles() && null != rfl && rfl.size() > 0 ) { for ( int i = rfl.size() - 1; i > 0; i-- ) { if ( rfl.getFile(i).getFileName().startsWith(".") ) { rfl.remove( i ); } } } rp.buildTable( rfl ); session.setAbortableListTransfer( null ); Client.getToolBar().updateToolBar(); Client.getMenus().updateMenuBar(); rp.getTableView().validate(); rp.getTableView().repaint(); } } public boolean isDone() { return isDone; } } class DataTransfer { public static final short FILE = 0; public static final short LIST = 1; private List fileList; private short type; private short direction; private RemoteFile destination; public DataTransfer( short type, List fileList ) { this( type, fileList, (short)-1, null ); } public DataTransfer( short type, List fileList, short direction ) { this( type, fileList, direction, null ); } public DataTransfer( short type, List fileList, short direction, RemoteFile destination ) { this.type = type; this.fileList = fileList; this.direction = direction; if ( null == destination ) { this.destination = new RemoteFile(); this.destination.setFileName( "." ); } else { this.destination = destination; } } public short getType() { return type; } public List getFileList() { return fileList; } public short getDirection() { return direction; } public RemoteFile getDestination() { return destination; } }