MlstCommand.java :  » Net » ColoradoFTP » com » coldcore » coloradoftp » plugin » impl3659 » command » Java Open Source

Java Open Source » Net » ColoradoFTP 
ColoradoFTP » com » coldcore » coloradoftp » plugin » impl3659 » command » MlstCommand.java
package com.coldcore.coloradoftp.plugin.impl3659.command;

import com.coldcore.coloradoftp.command.Command;
import com.coldcore.coloradoftp.command.Reply;
import com.coldcore.coloradoftp.factory.ObjectFactory;
import com.coldcore.coloradoftp.factory.ObjectName;
import com.coldcore.coloradoftp.filesystem.FileSystem;
import com.coldcore.coloradoftp.filesystem.ListingFile;
import com.coldcore.coloradoftp.session.Session;
import org.apache.log4j.Logger;

import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;

/**
 * Command MLST.
 * See FTP spec for details on the command.
 */
public class MlstCommand extends BaseMlsxCommand {

  private static Logger log = Logger.getLogger(MlstCommand.class);


  /** Set date format
   * @param format Date format
   */
  public void setDateFormat(String format) {
    if (format == null || !format.matches(DATE_FORMAT_REGEXP)) throw new IllegalArgumentException("Invalid format");
    setupDateFormatter(format);
  }


  public Reply execute() {
    Reply reply = getReply();
    if (!testLogin()) return reply;

    Session session = controlConnection.getSession();
    FileSystem fileSystem = (FileSystem) ObjectFactory.getObject(ObjectName.FILESYSTEM);

    String path = getParameter();
    String cdir = fileSystem.getCurrentDirectory(session);
    if (path.length() == 0) path = cdir;

    ListingFile lf = fileSystem.getPath(path, session);
    Map<String,String> pathFacts = getPathFacts(lf, cdir);
    String pfacts = preparePathFacts(pathFacts);

    StringBuffer sb = new StringBuffer();
    sb.append("Listing ").append(path).append("\r\n");
    sb.append(pfacts).append(" ").append(lf.getAbsolutePath()).append("\r\n");
    sb.append("End");

    reply.setCode("250");
    reply.setText(sb.toString());
    return reply;
  }


  public Reply executeOnParent(Command parent) {
    if (parent.getName().equals("OPTS")) {
      return executeOPTS();
    }

    if (parent.getName().equals("FEAT")) {
      return executeFEAT();
    }

    return null;
  }


  /** Execute as a reply to the OPTS command
   * @return Reply
   */
  protected Reply executeOPTS() {
    Reply reply = getReply();

    String param = getParameter();
    if (param.length() > 0 && (param.indexOf(" ") != -1 || param.indexOf(";") == -1)) {
      reply.setCode("501");
      reply.setText("Invalid MLST options");
      return reply;
    }

    //Clear the facts set and then re-fill it again
    Set<String> selectedFacts = getSelectedFacts();
    selectedFacts.clear();

    if (param.length() > 0) {
      StringTokenizer st = new StringTokenizer(param, ";");
      while (st.hasMoreTokens()) {
        String s = st.nextToken().trim().toLowerCase();
        if (facts.contains(s)) selectedFacts.add(s);
      }
    }

    StringBuffer sb = new StringBuffer("MLST OPTS");
    if (!selectedFacts.isEmpty()) sb.append(" ");
    for (String fact : selectedFacts)
      sb.append(fact).append(";");

    reply.setCode("200");
    reply.setText(sb.toString());
    return reply;
  }


  /** Execute as a reply to the FEAT command
   * @return Reply
   */
  protected Reply executeFEAT() {
    Reply reply = getReply();

    Set<String> selectedFacts = getSelectedFacts();

    StringBuffer sb = new StringBuffer("Features supported\r\n");
    sb.append("MLST");
    if (!facts.isEmpty()) sb.append(" ");
    for (String fact : facts) {
      sb.append(fact);
      if (selectedFacts.contains(fact)) sb.append("*");
      sb.append(";");
    }
    sb.append("\r\nend");

    reply.setCode("211");
    reply.setText(sb.toString());
    return reply;
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.