//*****************************************************************************
//*
//* (c) Copyright 2002. Glub Tech, Incorporated. All Rights Reserved.
//*
//* $Id: DeleteCommand.java 37 2009-05-11 22:46:15Z 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.IOException;
import java.io.PrintStream;
import java.util.*;
public class DeleteCommand extends NetworkCommand {
public DeleteCommand() {
super("delete", CommandID.DELETE_COMMAND_ID, 1, 1,
"remote-file", "delete remote file");
setBeepWhenDone( false );
}
public SecureFTPError doIt() throws CommandException {
SecureFTPError result = super.doIt();
FTPSession session = SecureFTP.getFTPSession();
PrintStream out = session.getPrintStream();
try {
boolean deleteIt = true;
boolean foundFile = true;
String pwd = "";
boolean changedDir = false;
String fileToDelete = (String)getArgs().get(0);
if ( session.isGlobOn() && fileToDelete.indexOf('*') >= 0 ) {
session.getFTPBean().setRecvCmdStream(null);
session.getFTPBean().setSendCmdStream(null);
try {
pwd = session.getFTPBean().pwd();
}
catch ( Exception e ) {}
session.getFTPBean().setSendCmdStream(session.getOutputStream());
session.getFTPBean().setRecvCmdStream(session.getOutputStream());
// if we have a path separator, we need to change to that directory
// and then try and delete the file(s)
if ( fileToDelete.indexOf("/") >= 0 ) {
fileToDelete = parseForFile( fileToDelete );
changedDir = true;
}
fileToDelete = Util.searchAndReplace(fileToDelete, "*", ".*", true);
RECompiler compiler = new RECompiler();
RE fileRegex = new RE();
fileRegex.setMatchFlags(RE.MATCH_CASEINDEPENDENT);
REProgram pattern = compiler.compile("^" + fileToDelete);
fileRegex.setProgram(pattern);
session.getFTPBean().setSendCmdStream(null);
session.getFTPBean().setRecvCmdStream(null);
RemoteFileList dirList;
if ( fileToDelete.startsWith("/") ) {
StringTokenizer tok = new StringTokenizer(fileToDelete, "/", true);
String pathToDelete = "";
while ( tok.hasMoreTokens() ) {
String newItem = tok.nextToken();
if ( tok.hasMoreTokens() ) {
pathToDelete += newItem;
}
}
pathToDelete = Util.searchAndReplace(pathToDelete, ".*", "*", true);
pathToDelete += "*";
dirList = session.getFTPBean().list(pathToDelete);
for ( int i = 0; i < dirList.size(); i++ ) {
String fn = dirList.getFile(i).getFileName();
String dirCheck =
fn.substring(pathToDelete.length()-1, fn.length());
if ( dirCheck.indexOf("/") >= 0 ) {
dirList.set(i, new RemoteFile());
}
}
}
else {
dirList = session.getFTPBean().list();
}
session.getFTPBean().setSendCmdStream(session.getOutputStream());
session.getFTPBean().setRecvCmdStream(session.getOutputStream());
foundFile = false;
for ( int i = 0; i < dirList.size(); i++ ) {
RemoteFile tempFile = dirList.getFile(i);
boolean linkToFile = false;
if ( tempFile.isLink() &&
fileRegex.match(tempFile.getFileName()) ) {
session.getFTPBean().setSendCmdStream(null);
session.getFTPBean().setRecvCmdStream(null);
RemoteFileList tl = session.getFTPBean().list(tempFile + "/*");
if ( tl != null && tl.size() > 0 ) {
linkToFile = false;
}
session.getFTPBean().setSendCmdStream(session.getOutputStream());
session.getFTPBean().setRecvCmdStream(session.getOutputStream());
}
if ( (tempFile.isFile() || linkToFile) &&
fileRegex.match(tempFile.getFileName()) ) {
fileToDelete = tempFile.getFileName();
foundFile = true;
break;
}
}
if ( !foundFile ) {
deleteIt = false;
}
}
if ( session.isInteractiveOn() && foundFile ) {
deleteIt =
CLIUtil.yesNoPrompt("You are about to permenently delete \"" +
fileToDelete + "\"." +
System.getProperty("line.separator") +
"Continue?");
}
if ( deleteIt ) {
session.getFTPBean().delete( fileToDelete );
out.println("File deleted.");
}
else if ( !foundFile ) {
out.println("File not found.");
result.setCode( SecureFTPError.NO_SUCH_FILE );
}
else {
out.println("File deletion aborted.");
}
if ( changedDir ) {
CDCommand cd = new CDCommand();
ArrayList args = new ArrayList(1);
args.add(pwd);
cd.setArgs(args);
SecureFTP.getCommandDispatcher().fireCommand(this, cd);
}
}
catch ( IllegalArgumentException iae ) {
throw new CommandException( getUsage() );
}
catch ( RESyntaxException rese ) {
result.setCode( SecureFTPError.BAD_ARGUMENTS );
}
catch ( IOException ioe ) {
result.setCode( SecureFTPError.DELETE_FAILED );
}
catch ( FTPException fe ) {
out.println(fe.getMessage());
result.setCode( SecureFTPError.DELETE_FAILED );
}
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;
}
}