1 5 package com.coldcore.coloradoftp.command.impl.ftp; 6 7 import com.coldcore.coloradoftp.command.Reply; 8 import com.coldcore.coloradoftp.command.impl.AbstractCommand; 9 import com.coldcore.coloradoftp.connection.DataConnectionMode; 10 import com.coldcore.coloradoftp.factory.ObjectFactory; 11 import com.coldcore.coloradoftp.factory.ObjectName; 12 import com.coldcore.coloradoftp.filesystem.FileSystem; 13 import com.coldcore.coloradoftp.filesystem.ListingFile; 14 import com.coldcore.coloradoftp.session.Session; 15 import com.coldcore.coloradoftp.session.SessionAttributeName; 16 import org.apache.log4j.Logger; 17 18 import java.io.ByteArrayInputStream ; 19 import java.nio.channels.Channels ; 20 import java.nio.channels.ReadableByteChannel ; 21 import java.text.SimpleDateFormat ; 22 import java.util.Locale ; 23 import java.util.Set ; 24 25 public class ListCommand extends AbstractCommand { 26 27 private static Logger log = Logger.getLogger(ListCommand.class); 28 29 30 public Reply execute() { 31 Reply reply = getReply(); 32 if (!testLogin()) return reply; 33 34 Session session = controlConnection.getSession(); 35 FileSystem fileSystem = (FileSystem) ObjectFactory.getObject(ObjectName.FILESYSTEM); 36 37 String listDir = fileSystem.getCurrentDirectory(session); 38 if (getParameter().length() > 0 && 39 parameter.indexOf("*") == -1 && !parameter.startsWith("-")) listDir = getParameter(); 40 41 Set <ListingFile> list = fileSystem.listDirectory(listDir, session); 42 String prepared = prepareList(list); 43 44 ByteArrayInputStream bin = new ByteArrayInputStream (prepared.getBytes()); 45 ReadableByteChannel rbc = Channels.newChannel(bin); 46 47 session.setAttribute(SessionAttributeName.DATA_CONNECTION_MODE, DataConnectionMode.LIST); 48 session.setAttribute(SessionAttributeName.DATA_CONNECTION_CHANNEL, rbc); 49 50 if (!prepareForDataConnection()) return reply; 51 52 reply.setCode("150"); 53 reply.setText("Opening A mode data connection for "+listDir+"."); 54 return reply; 55 } 56 57 58 62 protected String prepareList(Set <ListingFile> list) { 63 StringBuffer sb = new StringBuffer (); 64 SimpleDateFormat sdf = new SimpleDateFormat ("MMM dd HH:mm", new Locale ("en")); 65 for (ListingFile f : list) { 66 sb.append(f.isDirectory() ? "d" : "-").append(f.getPermissions()).append(" "); 68 sb.append("1 ").append(f.getOwner()).append(" "); 69 sb.append(f.getSize()).append(" "); 70 sb.append(sdf.format(f.getLastModified())).append(" "); 71 sb.append(f.getName()).append("\r\n"); 72 } 73 log.debug("Directory listing:\n"+sb); 74 return sb.toString(); 75 } 76 } 77 | Popular Tags |