private boolean isDirectory(String url) throws IOException, DavException {
    DavPropertyNameSet nameSet = new DavPropertyNameSet();
    nameSet.add(DavPropertyName.create(DavConstants.PROPERTY_RESOURCETYPE));

    PropFindMethod method = null;
    try {
      method = new PropFindMethod(url, nameSet, DavConstants.DEPTH_0);
      execute(method);
      if (method.succeeded()) {
        MultiStatus multiStatus = method.getResponseBodyAsMultiStatus();
        MultiStatusResponse response = multiStatus.getResponses()[0];
        DavPropertySet propertySet = response.getProperties(HttpStatus.SC_OK);
        DavProperty<?> property = propertySet.get(DavConstants.PROPERTY_RESOURCETYPE);
        if (property != null) {
          Node node = (Node) property.getValue();
          return node.getLocalName().equals(DavConstants.XML_COLLECTION);
        }
      }
      return false;
    } finally {
      if (method != null) {
        method.releaseConnection();
      }
    }
  }
  public List<String> getFileList(String destinationDirectory)
      throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException {
    String repositoryUrl = repository.getUrl();
    String url = repositoryUrl + (repositoryUrl.endsWith("/") ? "" : "/") + destinationDirectory;

    PropFindMethod method = null;
    try {
      if (isDirectory(url)) {
        DavPropertyNameSet nameSet = new DavPropertyNameSet();
        nameSet.add(DavPropertyName.create(DavConstants.PROPERTY_DISPLAYNAME));

        method = new PropFindMethod(url, nameSet, DavConstants.DEPTH_1);
        int status = execute(method);
        if (method.succeeded()) {
          ArrayList<String> dirs = new ArrayList<String>();
          MultiStatus multiStatus = method.getResponseBodyAsMultiStatus();

          for (int i = 0; i < multiStatus.getResponses().length; i++) {

            MultiStatusResponse response = multiStatus.getResponses()[i];

            String entryUrl = response.getHref();
            String fileName = PathUtils.filename(URLDecoder.decode(entryUrl));
            if (entryUrl.endsWith("/")) {
              if (i == 0) {
                // by design jackrabbit webdav sticks parent directory as the first entry
                // so we need to ignore this entry
                // http://www.nabble.com/Extra-entry-in-get-file-list-with-jackrabbit-webdav-td21262786.html
                // http://www.webdav.org/specs/rfc4918.html#rfc.section.9.1
                continue;
              }

              // extract "dir/" part of "path.to.dir/"
              fileName = PathUtils.filename(PathUtils.dirname(URLDecoder.decode(entryUrl))) + "/";
            }

            if (!StringUtils.isEmpty(fileName)) {
              dirs.add(fileName);
            }
          }
          return dirs;
        }

        if (status == HttpStatus.SC_NOT_FOUND) {
          throw new ResourceDoesNotExistException("Destination directory does not exist: " + url);
        }
      }
    } catch (DavException e) {
      throw new TransferFailedException(e.getMessage(), e);
    } catch (IOException e) {
      throw new TransferFailedException(e.getMessage(), e);
    } finally {
      if (method != null) {
        method.releaseConnection();
      }
    }
    throw new ResourceDoesNotExistException(
        "Destination path exists but is not a " + "WebDAV collection (directory): " + url);
  }
/** Programmer: rhodey */
public class WebDavConstants {

  public static final int SC_OK = 200;
  public static final int SC_NO_CONTENT = 204;

  public static final int SC_MOVED_PERMANENTLY = 301;
  public static final int SC_MOVED_TEMPORARILY = 302;
  public static final int SC_SEE_OTHER = 303;
  public static final int SC_USE_PROXY = 305;
  public static final int SC_TEMPORARY_REDIRECT = 307;

  public static final int SC_UNAUTHORIZED = 401;
  public static final int SC_FORBIDDEN = 403;
  public static final int SC_NOT_FOUND = 404;
  public static final int SC_PRECONDITION_FAILED = 412;
  public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;

  public static final String PROPERTY_RESOURCE_ID = "resource-id";
  public static final String PROPERTY_CURRENT_USER_PRINCIPAL = "current-user-principal";
  public static final String PROPERTY_SUPPORTED_REPORT_SET = "supported-report-set";
  public static final String PROPERTY_SYNC_TOKEN = "sync-token";
  public static final String PROPERTY_QUOTA_AVAILABLE_BYTES = "quota-available-bytes";
  public static final String PROPERTY_QUOTA_USED_BYTES = "quota-used-bytes";

  public static final DavPropertyName PROPERTY_NAME_PROP =
      DavPropertyName.create(DavConstants.XML_PROP, DavConstants.NAMESPACE);

  public static final DavPropertyName PROPERTY_NAME_RESOURCE_ID =
      DavPropertyName.create(PROPERTY_RESOURCE_ID, DavConstants.NAMESPACE);

  public static final DavPropertyName PROPERTY_NAME_CURRENT_USER_PRINCIPAL =
      DavPropertyName.create(PROPERTY_CURRENT_USER_PRINCIPAL, DavConstants.NAMESPACE);

  public static final DavPropertyName PROPERTY_NAME_SUPPORTED_REPORT_SET =
      DavPropertyName.create(PROPERTY_SUPPORTED_REPORT_SET, DavConstants.NAMESPACE);

  public static final DavPropertyName PROPERTY_NAME_SYNC_TOKEN =
      DavPropertyName.create(PROPERTY_SYNC_TOKEN, DavConstants.NAMESPACE);

  public static final DavPropertyName PROPERTY_NAME_QUOTA_USED_BYTES =
      DavPropertyName.create(PROPERTY_QUOTA_USED_BYTES, DavConstants.NAMESPACE);

  public static final DavPropertyName PROPERTY_NAME_QUOTA_AVAILABLE_BYTES =
      DavPropertyName.create(PROPERTY_QUOTA_AVAILABLE_BYTES, DavConstants.NAMESPACE);
}
/**
 * Provides constants for request headers, URL parameters, and XML namespaces, elements and values,
 * DAV properties and resource types defined by the WebDAV ticket spec.
 */
public interface TicketConstants extends DavConstants {

  /** The HTTP header name <code>Ticket</code> */
  public static final String HEADER_TICKET = "Ticket";

  /** The URL query string parameter name <code>ticket</code> */
  public static final String PARAM_TICKET = "ticket";

  /** The ticket XML namespace */
  public static final Namespace NAMESPACE_TICKET =
      Namespace.getNamespace("ticket", "http://www.xythos.com/namespaces/StorageServer");

  /** The ticket XML element name <ticket:ticketinfo */
  public static final String ELEMENT_TICKET_TICKETINFO = "ticketinfo";

  public static final String QN_TICKET_TICKETINFO =
      DomUtil.getQualifiedName(ELEMENT_TICKET_TICKETINFO, NAMESPACE_TICKET);
  /** The ticket XML element name <ticket:id */
  public static final String ELEMENT_TICKET_ID = "id";

  public static final String QN_TICKET_ID =
      DomUtil.getQualifiedName(ELEMENT_TICKET_ID, NAMESPACE_TICKET);
  /** The ticket XML element name <ticket:timeout */
  public static final String ELEMENT_TICKET_TIMEOUT = "timeout";

  public static final String QN_TICKET_TIMEOUT =
      DomUtil.getQualifiedName(ELEMENT_TICKET_TIMEOUT, NAMESPACE_TICKET);
  /** The ticket XML element name <ticket:visits */
  public static final String ELEMENT_TICKET_VISITS = "visits";
  /** The ticket XML element name <ticket:freebusy */
  public static final String ELEMENT_TICKET_FREEBUSY = "freebusy";

  /** The XML value <code>infinity</code> */
  public static final String VALUE_INFINITY = "infinity";

  /** The DAV property name <code>ticketdiscovery</code> */
  public static final String PROPERTY_TICKET_TICKETDISCOVERY = "ticketdiscovery";

  /** The ticket property <code>ticket:ticketdiscovery</code> */
  public static final DavPropertyName TICKETDISCOVERY =
      DavPropertyName.create(PROPERTY_TICKET_TICKETDISCOVERY, NAMESPACE_TICKET);
}