//*****************************************************************************
//*
//* (c) Copyright 2004. Glub Tech, Incorporated. All Rights Reserved.
//*
//* $Id: MDeleteCommand.java 118 2009-12-02 09:58:24Z gary $
//*
//*****************************************************************************
package com.glub.secureftp.client.cli;
import com.glub.secureftp.bean.*;
import com.glub.secureftp.client.framework.*;
import com.glub.util.*;
import org.apache.regexp.*;
import java.io.*;
import java.util.*;
public class MDeleteCommand extends NetworkCommand {
public MDeleteCommand() {
super("mdelete", CommandID.MDELETE_COMMAND_ID, 1, 9999,
"remote-file1 [remote-file2 ...]",
"delete multiple files and/or directories");
setBeepWhenDone( true );
}
public SecureFTPError doIt() throws CommandException {
SecureFTPError result = super.doIt();
FTPSession session = SecureFTP.getFTPSession();
PrintStream out = session.getPrintStream();
String pwd = "";
boolean changedDir = false;
if ( ! SecureFTP.getFTPSession().isDebugOn() ) {
session.getFTPBean().setRecvCmdStream(null);
session.getFTPBean().setSendCmdStream(null);
}
try {
pwd = session.getFTPBean().pwd();
}
catch ( Exception e ) {}
if ( ! SecureFTP.getFTPSession().isDebugOn() ) {
session.getFTPBean().setSendCmdStream(session.getOutputStream());
session.getFTPBean().setRecvCmdStream(session.getOutputStream());
}
// if we have a path separator, we need to change to that directory
for ( int arg = 0; arg < getArgs().size(); arg++ ) {
String fileName = (String)getArgs().get(arg);
if ( ! SecureFTP.getFTPSession().isDebugOn() ) {
session.getFTPBean().setRecvCmdStream(null);
session.getFTPBean().setSendCmdStream(null);
}
// and then try and delete the file(s)
if ( fileName.indexOf("/") >= 0 &&
fileName.indexOf("/") != fileName.length() - 1 ) {
fileName = parseForFile( fileName );
changedDir = true;
}
RemoteFileList fileList = new RemoteFileList();
if ( session.isGlobOn() && fileName.indexOf("*") >= 0 ) {
// if we are globbing and we have a glob, check to see if that file
// is in this directory
try {
//fileList = session.getFTPBean().list();
// do a list all to get hidden files
fileList = session.getFTPBean().listAll();
}
catch ( Exception e ) {}
String fileTest = Util.searchAndReplace(fileName, "*", ".*", true);
RECompiler compiler = new RECompiler();
RE fileRegex = new RE();
fileRegex.setMatchFlags(RE.MATCH_CASEINDEPENDENT);
REProgram pattern = compiler.compile("^" + fileTest + "$");
fileRegex.setProgram(pattern);
MDeleteCommand filesToDelete = new MDeleteCommand();
ArrayList args = new ArrayList();
boolean foundMatch = false;
for ( int j = 0; j < fileList.size(); j++ ) {
if ( fileRegex.match(fileList.getFile(j).getFileName()) ) {
foundMatch = true;
fileName = fileList.getFile(j).getFileName();
args.add(fileName);
}
}
if ( foundMatch ) {
filesToDelete.setArgs(args);
result =
SecureFTP.getCommandDispatcher().fireCommand(this, filesToDelete);
continue;
}
fileList.clear();
}
try {
//fileList = session.getFTPBean().list(fileName);
// do a list all to get hidden files
fileList = session.getFTPBean().list(fileName, null, true);
}
catch ( Exception e ) {
}
boolean fileIsDir = false;
if ( fileList.size() >= 2 ) {
try {
ByteArrayOutputStream baosSend = new ByteArrayOutputStream();
ByteArrayOutputStream baosRecv = new ByteArrayOutputStream();
if ( ! SecureFTP.getFTPSession().isDebugOn() ) {
session.getFTPBean().setSendCmdStream(baosSend);
session.getFTPBean().setRecvCmdStream(baosRecv);
}
session.getFTPBean().chdir(fileName);
if ( ! SecureFTP.getFTPSession().isDebugOn() ) {
session.getOutputStream().write(baosSend.toByteArray());
session.getOutputStream().write(baosRecv.toByteArray());
}
fileIsDir = true;
}
catch ( Exception e ) {
fileIsDir = false;
}
}
if ( ! SecureFTP.getFTPSession().isDebugOn() ) {
session.getFTPBean().setSendCmdStream(session.getOutputStream());
session.getFTPBean().setRecvCmdStream(session.getOutputStream());
}
if ( fileList.size() == 0 ) {
out.println("No such file or directory.");
result.setCode( SecureFTPError.NO_SUCH_FILE );
}
for ( int i = 0; i < fileList.size(); i++ ) {
if ( fileList.getFile(i).getFileName().equals(".") ||
fileList.getFile(i).getFileName().equals("..") ) {
continue;
}
// TODO: if we don't know the file props, we should try and change dir
// on that file to test if it's a dir
else if ( fileList.getFile(i).isDirectory() ) {
try {
MDeleteCommand mdel = new MDeleteCommand();
ArrayList args = new ArrayList(1);
args.add(fileList.getFile(i).getFileName());
mdel.setArgs( args );
result = SecureFTP.getCommandDispatcher().fireCommand(this, mdel);
}
catch ( Exception e ) {}
}
else {
DeleteCommand del = new DeleteCommand();
ArrayList args = new ArrayList(1);
args.add(fileList.getFile(i).getFileName());
del.setArgs( args );
result = SecureFTP.getCommandDispatcher().fireCommand(this, del);
}
}
if ( fileIsDir ) {
try {
session.getFTPBean().cdup();
session.getFTPBean().rmdir(fileName);
}
catch ( Exception e ) {}
}
}
if ( changedDir ) {
CDCommand cd = new CDCommand();
ArrayList args = new ArrayList(1);
args.add(pwd);
cd.setArgs(args);
SecureFTP.getCommandDispatcher().fireCommand(this, cd);
}
return result;
}
private String parseForFile( String path ) {
StringTokenizer tok = new StringTokenizer(path, "/", true);
String dirToChangeTo = "";
String result = "";
do {
result = tok.nextToken();
if ( tok.hasMoreTokens() ) {
dirToChangeTo += result;
}
} while( tok.hasMoreTokens() );
CDCommand cd = new CDCommand();
ArrayList args = new ArrayList(1);
args.add(dirToChangeTo);
cd.setArgs(args);
SecureFTP.getCommandDispatcher().fireCommand(this, cd);
return result;
}
}