[jboss-cvs] Repository SVN: r27140 - in apache-slide: 2.1.jdk15-brew and 2 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Thu May 7 17:09:36 EDT 2009
Author: permaine
Date: 2009-05-07 17:09:36 -0400 (Thu, 07 May 2009)
New Revision: 27140
Added:
apache-slide/2.1.jdk15-brew/
apache-slide/2.1.jdk15-brew/component-info.xml
apache-slide/2.1.jdk15-brew/lib/
apache-slide/2.1.jdk15-brew/lib/webdavlib.jar
apache-slide/2.1.jdk15-brew/src/
apache-slide/2.1.jdk15-brew/src/jakarta-slide-webdavclient-2.2-WebdavResource.java
apache-slide/2.1.jdk15-brew/src/jakarta-slide-webdavclient-3.0-compat.patch
apache-slide/2.1.jdk15-brew/src/jakarta-slide-webdavclient-src-2.1.tar.gz
Log:
Add Brew-build 2.1.jdk15-brew
Added: apache-slide/2.1.jdk15-brew/component-info.xml
===================================================================
--- apache-slide/2.1.jdk15-brew/component-info.xml (rev 0)
+++ apache-slide/2.1.jdk15-brew/component-info.xml 2009-05-07 21:09:36 UTC (rev 27140)
@@ -0,0 +1,18 @@
+<project name="apache-slide-component-info">
+ <!-- ============================================================ -->
+ <!-- Apache Slide -->
+ <!-- ============================================================ -->
+ <component id="apache-slide"
+ licenseType="apache-2.0"
+ version="2.1.jdk15-brew"
+ projectHome="http://jakarta.apache.org/slide/index.html"
+ description="WebDAV Support Library"
+ scm=":ext:cvs.devel.redhat.com:/cvs/dist/jakarta-slide-webdavclient"
+ tag="jakarta-slide-webdavclient-2_1-9_1_el4">
+ <!-- Built using JDK 1.5 -->
+ <artifact id="jakarta-slide-webdavlib.jar"/>
+ <export>
+ <include input="jakarta-slide-webdavlib.jar"/>
+ </export>
+ </component>
+</project>
Added: apache-slide/2.1.jdk15-brew/lib/webdavlib.jar
===================================================================
(Binary files differ)
Property changes on: apache-slide/2.1.jdk15-brew/lib/webdavlib.jar
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: apache-slide/2.1.jdk15-brew/src/jakarta-slide-webdavclient-2.2-WebdavResource.java
===================================================================
--- apache-slide/2.1.jdk15-brew/src/jakarta-slide-webdavclient-2.2-WebdavResource.java (rev 0)
+++ apache-slide/2.1.jdk15-brew/src/jakarta-slide-webdavclient-2.2-WebdavResource.java 2009-05-07 21:09:36 UTC (rev 27140)
@@ -0,0 +1,5479 @@
+/*
+ * $Header: /home/cvspublic/jakarta-slide/webdavclient/clientlib/src/java/org/apache/webdav/lib/WebdavResource.java,v 1.36 2005/03/17 07:20:59 masonjm Exp $
+ * $Revision: 1.36 $
+ * $Date: 2005/03/17 07:20:59 $
+ *
+ * ====================================================================
+ *
+ * Copyright 1999-2002 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.webdav.lib;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+import org.apache.commons.httpclient.Credentials;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.HttpURL;
+import org.apache.commons.httpclient.HttpsURL;
+import org.apache.commons.httpclient.URIException;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.HeadMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+import org.apache.commons.httpclient.util.URIUtil;
+
+import org.apache.webdav.lib.methods.*;
+import org.apache.webdav.lib.properties.AclProperty;
+import org.apache.webdav.lib.properties.LockDiscoveryProperty;
+import org.apache.webdav.lib.properties.PrincipalCollectionSetProperty;
+import org.apache.webdav.lib.properties.ResourceTypeProperty;
+import org.apache.webdav.lib.util.DOMUtils;
+import org.apache.webdav.lib.util.WebdavStatus;
+
+/**
+ * The class <code>WebdavResource</code> is an abstract representation
+ * for WebDAV resource.<p>
+ *
+ * <pre>
+ * A functional comparison of WebdavResource and JDK(It's different a lot).
+ * ----------------------------------+-------------------------------------
+ * File class (JDK 1.3.x) | WebdavResource class
+ * ----------------------------------+-------------------------------------
+ * File(String) | WebdavResource(HttpURL)
+ * File(String, String) | X (need to escape)
+ * File(File, String) | WebdavResource(HttpURL, String)
+ * getName() | getName()
+ * getParent() | *see getHttpURL() and HttpURL
+ * getParentFile() | X (not yet)
+ * getPath() | getPath()
+ * isAbsolute() | X
+ * getAbsolutePath() |
+ * getAbsoluteFile() | X
+ * getCanonicalPath() |
+ * getCanonicalFile() | X
+ * toURL() | *see HttpURL
+ * canRead() |
+ * !canWrite() | !isLocked()
+ * exists() | exists()
+ * isDirectory() | isCollection()
+ * isFile() | !isCollection()
+ * isHidden() | getIsHidden()
+ * lastModified() | getGetLastModified()
+ * length() | getGetContentLength()
+ * createNewFile() | putMethod(String)
+ * delete() | deleteMethod()
+ * deleteOnExit() | X
+ * list() | list()
+ * list(FilenameFilter) | X
+ * listFiles() | listWebdavResources()
+ * listFiles(FilenameFilter) | X
+ * listFiles(FileFilter) | X
+ * mkdir() | mkcolMethod()
+ * mkdirs() | mkcolMethod()
+ * renameTo(File) | moveMethod(String)
+ * setLastModified() | X
+ * setReadOnly() | setOverwrite(boolean)
+ * listRoots() | *see WebdavSession
+ * generateFile() |
+ * createTempFile(...) | setGetTempDir(String)
+ * compareTo(Object) | compareTo(Object)
+ * equals(Object) | equals(Object)
+ * hashCode() | X
+ * ----------------------------------+-------------------------------------
+ * URL class (JDK 1.3.x) | Webdavresource and HttpURL classes
+ * ----------------------------------+-------------------------------------
+ * getQuery() | getQuery()
+ * getPath() | getPath()
+ * getUserInfo() | getUserInfo()
+ * getAuthority() | getAuthority()
+ * getPort() | getPort()
+ * getProtocol() | getScheme()
+ * getHost() | getHost()
+ * getFile() | getPath()
+ * getRef() | getFragmenet()
+ * hashCode() | X
+ * sameFile() |
+ * toExternalForm() | toExternalForm()
+ * openConnection() |
+ * openStream() |
+ * getContent() | getMethodDataAsString()
+ * ----------------------------------+-------------------------------------
+ * URLConnection class (JDK 1.3.x) | HttpClient Library and more
+ * ----------------------------------+-------------------------------------
+ * getFileNameMap() | X
+ * setFileNameMap() | X
+ * connect() |
+ * getURL() | HttpURL#getURL()
+ * getContenetLength()() |
+ * getContentType() |
+ * getContentEncoding() |
+ * getExpiration() |
+ * getDate() |
+ * getLastModified() |
+ * getHeaderField() |
+ * getHeaderFieldInt() | X
+ * getHeaderFielDate() | X
+ * getHeaderFieldKey() | X
+ * getHeaderFiled(int) | X
+ * getContenet() |
+ * getInputStream() | WebdavResource#getMethodData()
+ * getOutputStream() | WebdavResource#putMethod(...)
+ * setDoInput() | X
+ * getDoInput() | X
+ * setAllowUserInteraction() | *see WebdavException and WebdavStatus
+ * getAllowUserInteraction() | *see WebdavException and WebdavStatus
+ * setUseCaches() |
+ * getUseCaches() |
+ * getIfModifiedSince() | X
+ * setIfModifiedSince(boolean) | X
+ * setRequestProperty(...) | X
+ * getRequestProperty(...) | X
+ * guessContentTypeFromStream(...) | X
+ * ----------------------------------+-------------------------------------
+ * </pre>
+ *
+ */
+public class WebdavResource extends WebdavSession {
+
+
+ // ------------------------------------------------------- Constructors
+
+ /**
+ * The default constructor.
+ */
+ protected WebdavResource() {
+ }
+
+
+ /**
+ * The constructor.
+ */
+ protected WebdavResource(HttpClient client) {
+ super();
+ this.client = client;
+ }
+
+ /**
+ * The constructor.
+ *
+ * @param httpURL The specified http URL.
+ * @param credentials The credentials to use for authentication.
+ * @param action The action to set properties of this resource.
+ * @param depth The depth to find properties.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(HttpURL httpURL, Credentials credentials, int action,
+ int depth)
+ throws HttpException, IOException {
+
+ setCredentials(credentials);
+ setHttpURL(httpURL, action, depth);
+ }
+
+
+ /**
+ * The constructor.
+ *
+ * @param httpURL The specified http URL.
+ * @param action The action to set properties of this resource.
+ * @param depth The depth to find properties.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(HttpURL httpURL, int action, int depth)
+ throws HttpException, IOException {
+
+ setHttpURL(httpURL, action, depth);
+ }
+
+ /**
+ * The constructor.
+ *
+ * @param httpURL The specified http URL.
+ * @param action The action to set properties of this resource.
+ * @param depth The depth to find properties.
+ * @param followRedirects shall redirects from the server be accepted
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(HttpURL httpURL, int action, int depth,
+ boolean followRedirects)
+ throws HttpException, IOException {
+
+ setFollowRedirects(this.followRedirects);
+ setHttpURL(httpURL, action, depth);
+ }
+
+
+ /**
+ * The constructor.
+ *
+ * @param httpURL The specified http URL.
+ * @param depth The depth to find properties.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(HttpURL httpURL, int depth)
+ throws HttpException, IOException {
+
+ setHttpURL(httpURL, defaultAction, depth);
+
+ }
+ /**
+ * The constructor.
+ *
+ * @param httpURL The specified http URL.
+ * @param depth The depth to find properties.
+ * @param followRedirects Shall redirects be followed automatically.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(HttpURL httpURL, int depth, boolean followRedirects)
+ throws HttpException, IOException {
+
+ setFollowRedirects(followRedirects);
+ setHttpURL(httpURL, defaultAction, depth);
+ }
+
+
+ /**
+ * The constructor.
+ *
+ * @param httpURL The specified http URL.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(HttpURL httpURL)
+ throws HttpException, IOException {
+
+ setHttpURL(httpURL);
+ }
+ /**
+ * The constructor.
+ *
+ * @param httpURL The specified http URL.
+ * @param followRedirects shall redirects from the server be accepted
+ */
+ public WebdavResource(HttpURL httpURL, boolean followRedirects)
+ throws HttpException, IOException {
+
+ setFollowRedirects(followRedirects);
+ setHttpURL(httpURL);
+ }
+
+
+ /**
+ * The constructor.
+ *
+ * @param httpURL The specified http URL.
+ * @param proxyHost The hostname of the proxy to use.
+ * @param proxyPort The port number of the proxy to use.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(HttpURL httpURL, String proxyHost, int proxyPort)
+ throws HttpException, IOException {
+
+ setProxy(proxyHost, proxyPort);
+ setHttpURL(httpURL);
+ }
+ public WebdavResource(HttpURL httpURL, String proxyHost, int proxyPort, boolean followRedirects)
+ throws HttpException, IOException {
+
+ setFollowRedirects(followRedirects);
+ setProxy(proxyHost, proxyPort);
+ setHttpURL(httpURL);
+ }
+
+
+ /**
+ * The constructor.
+ *
+ * @param httpURL The specified http URL.
+ * @param proxyHost The hostname of the proxy to use.
+ * @param proxyPort The port number of the proxy to use.
+ * @param proxyCredentials Credentials to use for proxy authentication.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(HttpURL httpURL, String proxyHost, int proxyPort,
+ Credentials proxyCredentials)
+ throws HttpException, IOException {
+
+ setProxy(proxyHost, proxyPort);
+ setProxyCredentials(proxyCredentials);
+ setHttpURL(httpURL);
+ }
+
+ public WebdavResource(HttpURL httpURL, String proxyHost, int proxyPort,
+ Credentials proxyCredentials, boolean followRedirects)
+ throws HttpException, IOException {
+
+ setFollowRedirects(followRedirects);
+ setProxy(proxyHost, proxyPort);
+ setProxyCredentials(proxyCredentials);
+ setHttpURL(httpURL);
+ }
+
+ /**
+ * The constructor.
+ * It must be put an escaped http URL as an argument.
+ *
+ * @param escapedHttpURL The escaped http URL string.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(String escapedHttpURL)
+ throws HttpException, IOException {
+
+ setHttpURL(escapedHttpURL);
+ }
+ public WebdavResource(String escapedHttpURL, boolean followRedirects)
+ throws HttpException, IOException {
+
+ setFollowRedirects(followRedirects);
+ setHttpURL(escapedHttpURL);
+ }
+
+
+ /**
+ * The constructor.
+ * It must be put an escaped http URL as an argument.
+ *
+ * @param escapedHttpURL The escaped http URL string.
+ * @param credentials The credentials used for Authentication.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(String escapedHttpURL, Credentials credentials)
+ throws HttpException, IOException {
+
+ setCredentials(credentials);
+ setHttpURL(escapedHttpURL);
+ }
+
+ public WebdavResource(String escapedHttpURL, Credentials credentials,
+ boolean followRedirects)
+ throws HttpException, IOException {
+
+ setFollowRedirects(followRedirects);
+ setCredentials(credentials);
+ setHttpURL(escapedHttpURL);
+ }
+
+
+ /**
+ * The constructor.
+ * It must be put an escaped http URL as an argument.
+ *
+ * @param escapedHttpURL The escaped http URL string.
+ * @param proxyHost The hostname of the proxy to use.
+ * @param proxyPort The port number of the proxy to use.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(String escapedHttpURL, String proxyHost,
+ int proxyPort) throws HttpException, IOException {
+
+ setProxy(proxyHost, proxyPort);
+ setHttpURL(escapedHttpURL);
+ }
+
+ /**
+ * The constructor.
+ * It must be put an escaped http URL as an argument.
+ *
+ * @param escapedHttpURL The escaped http URL string.
+ * @param proxyHost The hostname of the proxy to use.
+ * @param proxyPort The port number of the proxy to use.
+ * @param proxyCredentials Credentials to use for proxy authentication.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(String escapedHttpURL, String proxyHost,
+ int proxyPort, Credentials proxyCredentials)
+ throws HttpException, IOException {
+
+ setProxy(proxyHost, proxyPort);
+ setProxyCredentials(proxyCredentials);
+ setHttpURL(escapedHttpURL);
+ }
+
+
+ /**
+ * The constructor.
+ *
+ * @param httpURL The http URL.
+ * @param additionalPath The added relative path.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setDefaultAction(int)
+ */
+ public WebdavResource(HttpURL httpURL, String additionalPath)
+ throws HttpException, IOException {
+
+ setHttpURL(httpURL, additionalPath);
+ }
+
+ /**
+ * The constructor.
+ *
+ * @param httpURL The http URL.
+ * @param additionalPath The added relative path.
+ * @param followRedirects shall redirects be accepted
+ */
+ public WebdavResource(HttpURL httpURL, String additionalPath, boolean followRedirects)
+ throws HttpException, IOException {
+
+ setFollowRedirects(followRedirects);
+ setHttpURL(httpURL, additionalPath);
+ }
+
+
+ // -------------------------------------- Constants for WebDAV properties.
+
+
+ /**
+ * The displayname property.
+ */
+ public static final String DISPLAYNAME = "displayname";
+
+
+ /**
+ * The getcontentlanguage property.
+ */
+ public static final String GETCONTENTLANGUAGE = "getcontentlanguage";
+
+
+ /**
+ * The getcontentlength property.
+ */
+ public static final String GETCONTENTLENGTH = "getcontentlength";
+
+
+ /**
+ * The getlastmodifed property.
+ */
+ public static final String GETLASTMODIFIED = "getlastmodified";
+
+
+ /**
+ * The creationdate property.
+ */
+ public static final String CREATIONDATE = "creationdate";
+
+
+ /**
+ * The resourcetype property.
+ */
+ public static final String RESOURCETYPE = "resourcetype";
+
+
+ /**
+ * The source property.
+ */
+ public static final String SOURCE = "source";
+
+
+ /**
+ * The getcontenttype property.
+ */
+ public static final String GETCONTENTTYPE = "getcontenttype";
+
+
+ /**
+ * The getetag property.
+ */
+ public static final String GETETAG = "getetag";
+
+
+ /**
+ * The ishidden property.
+ */
+ public static final String ISHIDDEN = "ishidden";
+
+
+ /**
+ * The iscollection property.
+ */
+ public static final String ISCOLLECTION = "iscollection";
+
+
+ /**
+ * The supportedlock property.
+ */
+ public static final String SUPPORTEDLOCK = "supportedlock";
+
+
+ /**
+ * The lockdiscovery property.
+ */
+ public static final String LOCKDISCOVERY = "lockdiscovery";
+
+
+ // ------------------------------------------------------------ Constants
+
+
+ /**
+ * No action to find properties for this resource.
+ */
+ public static final int NOACTION = 1;
+
+
+ /**
+ * The action setting only the displayname for this resource.
+ */
+ public static final int NAME = 2;
+
+
+ /**
+ * The action setting the basic properties for this resource.
+ */
+ public static final int BASIC = 3;
+
+
+ /**
+ * The action setting the default DAV properties for this resource.
+ */
+ public static final int DEFAULT = 4;
+
+
+ /**
+ * The action setting the all properties for this resource.
+ */
+ public static final int ALL = 5;
+
+
+ /**
+ *
+ */
+ public static final int OPTIONS_WORKSPACE = 8;
+
+ /**
+ *
+ */
+ public static final int OPTIONS_VERSION_HISTORY = 9;
+
+ public static final int LABEL_SET = 10;
+ public static final int LABEL_REMOVE = 11;
+ public static final int LABEL_ADD = 12;
+
+
+ /**
+ * Owner information for locking and unlocking.
+ */
+ public static final String defaultOwner = "Slide";
+
+
+ /**
+ * The true constant string.
+ */
+ public static final String TRUE = "1";
+
+
+ /**
+ * The false constant string.
+ */
+ public static final String FALSE = "0";
+
+
+ /**
+ * Date formats using for Date parsing.
+ */
+ public static final SimpleDateFormat formats[] = {
+ new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US),
+ new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US),
+ new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz", Locale.US),
+ new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US),
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US),
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sss'Z'", Locale.US)
+ };
+
+
+ /**
+ * GMT timezone.
+ */
+ protected final static TimeZone gmtZone = TimeZone.getTimeZone("GMT");
+
+
+ static {
+ for (int i = 0; i < formats.length; i++) {
+ formats[i].setTimeZone(gmtZone);
+ }
+ }
+
+
+ // --------------------------------------------------- Instance Variables
+
+
+ /**
+ * The HttpURL to represent a WebDAV resource.
+ */
+ protected HttpURL httpURL;
+
+
+ /**
+ * Table of the hrefs gotten in a collection.
+ */
+ protected WebdavResources childResources = new WebdavResources();
+
+
+ /**
+ * The default action to find properties.
+ */
+ protected static int defaultAction = BASIC;
+
+
+ /**
+ * The default depth for WebDAV methods.
+ */
+ protected static int defaultDepth = DepthSupport.DEPTH_0;
+
+
+ /**
+ * The default temporary directory for the GET method.
+ * @deprecated The client is responsible for disk I/O.
+ */
+ protected static String tempDirForGet;
+
+
+ /**
+ * The flag setter to use the disk for the GET method.
+ * @deprecated The client is responsible for disk I/O.
+ */
+ protected static boolean useDiskForGet = true;
+
+
+ /**
+ * The flag to set the status code by propfind.
+ */
+ protected boolean thisResource;
+
+
+ /**
+ * The allowed HTTP methods.
+ */
+ protected Enumeration allowedMethods;
+
+
+ /**
+ * The capabilities of the WebDAV server.
+ */
+ protected Enumeration davCapabilities;
+
+
+ /**
+ * An WebdavResource flag to check its existence;
+ */
+ protected boolean exists;
+
+
+ /**
+ * An WebdavResource flag to check overwriting;
+ */
+ protected boolean overwrite;
+
+
+ /**
+ * An status code performed by HTTP methods at the most recent.
+ */
+ protected int latestStatusCode;
+
+
+ /**
+ * An status message performed by HTTP methods at the most recent.
+ */
+ protected String latestStatusMessage = "";
+
+
+ /**
+ * An WebDAV property, displayname.
+ */
+ protected String displayName = "";
+
+
+ /**
+ * An WebDAV property, getcontentlength.
+ */
+ protected long getContentLength;
+
+
+ /**
+ * An WebDAV property, getcontenttype.
+ */
+ protected String getContentType = "";
+
+
+ /**
+ * An WebDAV property, resourcetype.
+ */
+ protected ResourceTypeProperty resourceType;
+
+
+ /**
+ * An WebDAV property, getlastmodified.
+ */
+ protected long getLastModified;
+
+
+ /**
+ * An WebDAV property, creationdate.
+ */
+ protected long creationDate;
+
+
+ /**
+ * An WebDAV property, getetag.
+ */
+ protected String getEtag = "";
+
+ /**
+ * Owner information for locking and unlocking.
+ */
+ protected String owner = null;
+
+
+ /**
+ * An WebDAV property, ishidden.
+ */
+ protected boolean isHidden;
+
+
+ /**
+ * An WebDAV property, iscollection.
+ */
+ protected boolean isCollection;
+
+
+ /**
+ * An WebDAV property, supportedlock.
+ */
+ protected String supportedLock = "";
+
+
+ /**
+ * An WebDAV property, lockdiscovery.
+ */
+ protected LockDiscoveryProperty lockDiscovery;
+
+ protected boolean followRedirects = false;
+
+ /**
+ * Map of additional headers
+ */
+ protected Map headers = new HashMap();
+
+ // --------------------------------------------------------- Basic settings
+
+ /**
+ * Generates and adds the "Transaction" header if this method is part of
+ * an externally controlled transaction.
+ */
+ protected void generateTransactionHeader(HttpMethod method) {
+ if (client == null || method == null) return;
+
+ WebdavState state = (WebdavState) client.getState();
+ String txHandle = state.getTransactionHandle();
+ if (txHandle != null) {
+ method.setRequestHeader("Transaction", "<" + txHandle + ">");
+ }
+ }
+
+ /**
+ * Generate and add the If header to the specified HTTP method.
+ */
+ protected void generateIfHeader(HttpMethod method) {
+
+ if (client == null) return;
+ if (method == null) return;
+
+ WebdavState state = (WebdavState) client.getState();
+ String[] lockTokens = state.getAllLocks(method.getPath());
+
+ if (lockTokens.length == 0) return;
+
+ StringBuffer ifHeaderValue = new StringBuffer();
+
+ for (int i = 0; i < lockTokens.length; i++) {
+ ifHeaderValue.append("(<").append(lockTokens[i]).append(">) ");
+ }
+
+ method.setRequestHeader("If", ifHeaderValue.toString());
+
+ }
+
+ /**
+ * Add all additionals headers that have been previously registered
+ * with addRequestHeader to the method
+ */
+ protected void generateAdditionalHeaders(HttpMethod method) {
+ for (Iterator iterator = headers.keySet().iterator(); iterator.hasNext();) {
+ String header = (String) iterator.next();
+ method.setRequestHeader(header, (String) headers.get(header));
+ }
+ }
+
+ /**
+ * Parse the <code>java.util.Date</code> string for HTTP-date.
+ *
+ * @return The parsed date.
+ */
+ protected Date parseDate(String dateValue) {
+ // TODO: move to the common util package related to http.
+ Date date = null;
+ for (int i = 0; (date == null) && (i < formats.length); i++) {
+ try {
+ synchronized (formats[i]) {
+ date = formats[i].parse(dateValue);
+ }
+ } catch (ParseException e) {
+ }
+ }
+
+ return date;
+ }
+
+
+ /**
+ * Set only the displayname property for this resource.
+ *
+ * @param depth The depth to find properties.
+ */
+ protected void setNameProperties(int depth)
+ throws HttpException, IOException {
+
+ Vector properties = new Vector();
+ properties.addElement(DISPLAYNAME);
+
+ setNamedProp(depth, properties);
+ }
+
+
+ /**
+ * Sets the basic properties on a resource by indirectly issuing a PROPFIND
+ * on the resource.
+ *
+ * <p>Properties retrieved include:
+ *
+ * <ul>
+ * <li>displayname</li>
+ * <li>getcontentlength</li>
+ * <li>getcontenttype</li>
+ * <li>resourcetype</li>
+ * <li>getlastmodified</li>
+ * <li>lockdiscovery</li>
+ * </ul>
+ *
+ * @param depth The depth to find properties.
+ */
+ protected void setBasicProperties(int depth)
+ throws HttpException, IOException {
+
+ Vector properties = new Vector();
+ properties.addElement(DISPLAYNAME);
+ properties.addElement(GETCONTENTLENGTH);
+ properties.addElement(GETCONTENTTYPE);
+ properties.addElement(RESOURCETYPE);
+ properties.addElement(GETLASTMODIFIED);
+ properties.addElement(LOCKDISCOVERY);
+
+ setNamedProp(depth, properties);
+ }
+
+
+ /**
+ * Set the default properties on the resource by indirectly issuing a PROPFIND request
+ * for a default set of properties.
+ *
+ * <p>Properties retrieved include:
+ *
+ * <ul>
+ * <li>creationdate</li>
+ * <li>displayname</li>
+ * <li>getcontentlanguage</li>
+ * <li>getcontentlength</li>
+ * <li>getcontenttype</li>
+ * <li>getetag</li>
+ * <li>getlastmodified</li>
+ * <li>lockdiscovery</li>
+ * <li>resourcetype</li>
+ * <li>source</li>
+ * <li>supportedlock</li>
+ * </ul>
+ *
+ * @param depth The depth to find properties.
+ */
+ protected void setDefaultProperties(int depth)
+ throws HttpException, IOException {
+
+ Vector properties = new Vector();
+ properties.addElement(CREATIONDATE);
+ properties.addElement(DISPLAYNAME);
+ properties.addElement(GETCONTENTLANGUAGE);
+ properties.addElement(GETCONTENTLENGTH);
+ properties.addElement(GETCONTENTTYPE);
+ properties.addElement(GETETAG);
+ properties.addElement(GETLASTMODIFIED);
+ properties.addElement(LOCKDISCOVERY);
+ properties.addElement(RESOURCETYPE);
+ properties.addElement(SOURCE);
+ properties.addElement(SUPPORTEDLOCK);
+
+ setNamedProp(depth, properties);
+ }
+
+
+ /**
+ * Set the named properties for this resource.
+ *
+ * @param depth The depth.
+ * @param propertyNames The property-names.
+ */
+ protected void setNamedProp(int depth, Vector propertyNames)
+ throws HttpException, IOException {
+
+ Enumeration responses = propfindMethod(depth, propertyNames);
+ setWebdavProperties(responses);
+ }
+
+
+ /**
+ * Set all properties for this resource.
+ *
+ * @param depth The depth
+ */
+ protected void setAllProp(int depth)
+ throws HttpException, IOException {
+
+ Enumeration responses = propfindMethod(depth);
+ setWebdavProperties(responses);
+ }
+
+
+ /**
+ * Set WebDAV properties following to the given http URL.
+ * This method is fundamental for getting information of a collection.
+ *
+ * @param responses An enumeration over {@link ResponseEntity} items, one
+ * for each resource for which information was returned via PROPFIND.
+ *
+ * @exception HttpException
+ * @exception IOException The socket error with a server.
+ */
+ protected void setWebdavProperties(Enumeration responses)
+ throws HttpException, IOException {
+
+ // Make the resources in the collection empty.
+ childResources.removeAll();
+ while (responses.hasMoreElements()) {
+
+ ResponseEntity response =
+ (ResponseEntity) responses.nextElement();
+
+ boolean itself = false;
+ String href = response.getHref();
+ if (!href.startsWith("/"))
+ href = URIUtil.getPath(href);
+ href = decodeMarks(href);
+
+ /*
+ * Decode URIs to common (unescaped) format for comparison
+ * as HttpClient.URI.setPath() doesn't escape $ and : chars.
+ */
+ String httpURLPath = httpURL.getPath();
+ String escapedHref = URIUtil.decode(href);
+
+ // Normalize them to both have trailing slashes if they differ by one in length.
+ int lenDiff = escapedHref.length() - httpURLPath.length();
+ int compareLen = 0;
+
+ if ( lenDiff == -1 && !escapedHref.endsWith("/")) {
+ compareLen = escapedHref.length();
+ lenDiff = 0;
+ }
+ else
+ if ( lenDiff == 1 && !httpURLPath.endsWith("/")) {
+ compareLen = httpURLPath.length();
+ lenDiff = 0;
+ }
+
+ // if they are the same length then compare them.
+ if (lenDiff == 0) {
+ if ((compareLen == 0 && httpURLPath.equals(escapedHref))
+ || httpURLPath.regionMatches(0, escapedHref, 0, compareLen))
+ {
+ // escaped href and http path are the same
+ // Set the status code for this resource.
+ if (response.getStatusCode() > 0)
+ setStatusCode(response.getStatusCode());
+ setExistence(true);
+ itself = true;
+ }
+ }
+
+ // Get to know each resource.
+ WebdavResource workingResource = null;
+ if (itself) {
+ workingResource = this;
+ }
+ else {
+ workingResource = createWebdavResource(client);
+ workingResource.setDebug(debug);
+ }
+
+ // clear the current lock set
+ workingResource.setLockDiscovery(null);
+
+ // Process the resource's properties
+ Enumeration properties = response.getProperties();
+ while (properties.hasMoreElements()) {
+
+ Property property = (Property) properties.nextElement();
+
+ // ------------------------------ Checking WebDAV properties
+ workingResource.processProperty(property);
+ }
+
+ String displayName = workingResource.getDisplayName();
+
+ if (displayName == null || displayName.trim().equals("")) {
+ displayName = getName(href, true);
+ }
+ if (!itself) {
+ String myURI = httpURL.getEscapedURI();
+ char[] childURI = (myURI + (myURI.endsWith("/") ? "" : "/")
+ + getName(href, false)).toCharArray();
+ HttpURL childURL = httpURL instanceof HttpsURL
+ ? new HttpsURL(childURI)
+ : new HttpURL(childURI);
+ childURL.setRawAuthority(httpURL.getRawAuthority());
+ workingResource.setHttpURL(childURL, NOACTION, defaultDepth);
+ workingResource.setExistence(true);
+ workingResource.setOverwrite(getOverwrite());
+ }
+ workingResource.setDisplayName(displayName);
+
+ if (!itself)
+ childResources.addResource(workingResource);
+ }
+ }
+
+
+ // ------------------------------------------------------------ Properties
+
+
+ /**
+ * Set the default action for this resource.
+ * The default action is set as 'BASIC' for the first time.
+ *
+ * ex)
+ * WebdavResource.NOACTION
+ * WebdavResource.NAME
+ * WebdavResource.BASIC
+ * WebdavResource.DEFAULT
+ * WebdavResource.ALL
+ *
+ * @param action The action type.
+ * @see #NOACTION
+ * @see #NAME
+ * @see #BASIC
+ * @see #DEFAULT
+ * @see #ALL
+ */
+ public static void setDefaultAction(int action) {
+ defaultAction = action;
+ }
+
+
+ /**
+ * Get the default action.
+ *
+ * @return The action type.
+ */
+ public static int getDefaultAction() {
+ return defaultAction;
+ }
+
+
+ /**
+ * Set the default action for this resource.
+ *
+ * ex)
+ * DepthSupport.DEPTH_0
+ * DepthSupport.DEPTH_1
+ * DepthSupport.DEPTH_INFINITY
+ *
+ * @param depth The depth.
+ */
+ public static void setDefaultDepth(int depth) {
+ defaultDepth = depth;
+ }
+
+
+ /**
+ * Get the default action.
+ *
+ * @return The depth.
+ */
+ public static int getDefaultDepth() {
+ return defaultDepth;
+ }
+
+
+ /**
+ * Get the default temporary directory for the GET method.
+ *
+ * @param tempDir The temporary directory.
+ * @deprecated The given directory will not be used.
+ */
+ public static void setGetTempDir(String tempDir) {
+ tempDirForGet = tempDir;
+ }
+
+
+ /**
+ * Get the default temporary directory for the GET method.
+ * The default temporary directory is "temp/".
+ *
+ * @return The temporary directory path.
+ * It's set by default, if it returns null.
+ * @deprecated The returned directory is not used by the GET method.
+ */
+ public static String getGetTempDir() {
+ return tempDirForGet;
+ }
+
+
+
+ /**
+ * Set the use disk flag for the GET method.
+ *
+ * @param useDisk The use disk flag.
+ * @deprecated This method has no effect.
+ */
+ public static void setGetUseDisk(boolean useDisk) {
+ //useDiskForGet = useDisk;
+ }
+
+
+ /**
+ * Get the use disk flag for the GET method.
+ *
+ * @return The current flag of the use disk.
+ * By default, it's true.
+ * @deprecated This method always returns false.
+ */
+ public static boolean getGetUseDisk() {
+ return false;
+ }
+
+ /**
+ * Sets a flag indicating that redirect responses from
+ * the server shall be followed.
+ */
+ public void setFollowRedirects(boolean value) {
+ this.followRedirects = value;
+ }
+ /**
+ * Returns the current "follow redirects" flag.
+ * @see #setFollowRedirects(boolean)
+ */
+ public boolean getFollowRedirects() {
+ return this.followRedirects;
+ }
+
+
+ /**
+ * Test that the httpURL is the same with the client.
+ *
+ * @return true if the given httpURL is the client for this resource.
+ */
+ protected synchronized boolean isTheClient() throws URIException {
+ HostConfiguration hostConfig = client.getHostConfiguration();
+ Credentials creds =
+ client.getState().getCredentials(null, hostConfig.getHost());
+ String userName = null;
+ String password = null;
+
+ if (creds instanceof UsernamePasswordCredentials) {
+ UsernamePasswordCredentials upc = (UsernamePasswordCredentials) creds;
+ userName = upc.getUserName();
+ password = upc.getPassword();
+ }
+ String ref = httpURL.getUser();
+ boolean userMatches = userName != null ? userName.equals(ref)
+ : ref == null;
+ if (userMatches) {
+ ref = httpURL.getPassword();
+ userMatches = password != null ? password.equals(ref)
+ : ref == null;
+ } else {
+ return false;
+ }
+ if (userMatches) {
+ return httpURL.getHost().equalsIgnoreCase(hostConfig.getHost())
+ && httpURL.getPort()
+ == hostConfig.getProtocol().resolvePort(hostConfig.getPort());
+ }
+ return false;
+ }
+
+
+ /**
+ * Set the client for this resource.
+ *
+ * @exception IOException
+ */
+ protected void setClient() throws IOException {
+ setClient(httpURL);
+ }
+
+
+ /**
+ * Set the client for this resource and the given http URL.
+ *
+ * @param httpURL The http URL.
+ * @exception IOException
+ */
+ protected synchronized void setClient(HttpURL httpURL) throws IOException {
+
+ if (client == null) {
+ client = getSessionInstance(httpURL);
+ } else if (!isTheClient()) {
+ closeSession();
+ client = getSessionInstance(httpURL);
+ }
+ }
+
+
+ /**
+ * Set the HttpURL for this WebdavResource.
+ *
+ * @param httpURL the specified HttpURL.
+ * @param action The action to decide, which properties to find.
+ * @param depth The depth to find properties.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setHttpURL(java.lang.String)
+ * @see #setUserInfo(java.lang.String, java.lang.String)
+ * @see #setPath(java.lang.String)
+ * @see #setDefaultAction(int)
+ */
+ public void setHttpURL(HttpURL httpURL, int action, int depth)
+ throws HttpException, IOException {
+
+ this.httpURL = httpURL;
+ setClient(httpURL);
+ // make its existence false
+ setExistence(false);
+
+ try {
+ setProperties(action, depth);
+ } catch (Exception e) {
+ // Ignore the exception if default properties cannot be loaded
+ }
+ }
+
+
+ /**
+ * Set the HttpURL for this WebdavResource.
+ *
+ * @param httpURL the specified HttpURL.
+ * @param depth The depth to find properties.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setHttpURL(java.lang.String)
+ * @see #setUserInfo(java.lang.String, java.lang.String)
+ * @see #setPath(java.lang.String)
+ */
+ public void setHttpURL(HttpURL httpURL, int depth)
+ throws HttpException, IOException {
+
+ // Follow the default action.
+ setHttpURL(httpURL, defaultAction, depth);
+ }
+
+
+ /**
+ * Set the HttpURL for this WebdavResource.
+ * It must be put an escaped path part of the http URL as an argument.
+ *
+ * @param httpURL The specified HttpURL.
+ * @param additionalPath The added relative path.
+ * @param action The action to decide, which properties to find.
+ * @param depth The depth.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setHttpURL(java.lang.String)
+ * @see #setUserInfo(java.lang.String, java.lang.String)
+ * @see #setPath(java.lang.String)
+ * @see #setDefaultAction(int)
+ */
+ public void setHttpURL
+ (HttpURL httpURL, String additionalPath, int action, int depth)
+ throws HttpException, IOException {
+
+ setHttpURL(httpURL instanceof HttpsURL
+ ? new HttpsURL((HttpsURL) httpURL, additionalPath)
+ : new HttpURL(httpURL, additionalPath), action, depth);
+ }
+
+
+ /**
+ * Set the HttpURL for this WebdavResource.
+ * It must be put an escaped path part of the http URL as an argument.
+ *
+ * @param httpURL The specified HttpURL.
+ * @param additionalPath The added relative path.
+ * @param action The action to decide, which properties to find.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setHttpURL(java.lang.String)
+ * @see #setUserInfo(java.lang.String, java.lang.String)
+ * @see #setPath(java.lang.String)
+ * @see #setDefaultAction(int)
+ */
+ public void setHttpURL
+ (HttpURL httpURL, String additionalPath, int action)
+ throws HttpException, IOException {
+
+ setHttpURL(httpURL instanceof HttpsURL
+ ? new HttpsURL((HttpsURL) httpURL, additionalPath)
+ : new HttpURL(httpURL, additionalPath),
+ action, defaultDepth);
+ }
+
+
+ /**
+ * Set the HttpURL for this WebdavResource.
+ *
+ * @param httpURL The specified HttpURL.
+ * @param additionalPath The added relative path.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setHttpURL(java.lang.String)
+ * @see #setUserInfo(java.lang.String, java.lang.String)
+ * @see #setPath(java.lang.String)
+ */
+ public void setHttpURL(HttpURL httpURL, String additionalPath)
+ throws HttpException, IOException {
+
+ setHttpURL(httpURL instanceof HttpsURL
+ ? new HttpsURL((HttpsURL) httpURL, additionalPath)
+ : new HttpURL(httpURL, additionalPath),
+ defaultAction, defaultDepth);
+ }
+
+
+ /**
+ * Set the HttpURL for this WebdavResource.
+ *
+ * @param httpURL the specified HttpURL.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setHttpURL(java.lang.String)
+ * @see #setUserInfo(java.lang.String, java.lang.String)
+ * @see #setPath(java.lang.String)
+ */
+ public void setHttpURL(HttpURL httpURL)
+ throws HttpException, IOException {
+
+ setHttpURL(httpURL, defaultDepth);
+ }
+
+
+ /**
+ * Set the HttpURL of this WebdavResource.
+ * It must be put an escaped http URL as an argument.
+ *
+ * @param escapedHttpURL The escaped http URL string.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setHttpURL(HttpURL)
+ * @see #setUserInfo(java.lang.String, java.lang.String)
+ * @see #setPath(java.lang.String)
+ */
+ public void setHttpURL(String escapedHttpURL)
+ throws HttpException, IOException {
+
+ setHttpURL(escapedHttpURL.startsWith("https")
+ ? new HttpsURL(escapedHttpURL)
+ : new HttpURL(escapedHttpURL));
+ }
+
+
+ /**
+ * Get the HttpURL of this WebdavResource.
+ *
+ * @return httpURL the http URL.
+ */
+ public HttpURL getHttpURL() {
+ return httpURL;
+ }
+
+
+ /**
+ * Get the HttpURL except for userinfo.
+ *
+ * @return httpURL the http URL.
+ */
+ public HttpURL getHttpURLExceptForUserInfo()
+ throws URIException {
+
+ return httpURL instanceof HttpsURL ? new HttpsURL(httpURL.getRawURI())
+ : new HttpURL(httpURL.getRawURI());
+ }
+
+
+ /**
+ * Set the path part of this WebdavResource.
+ *
+ * @param path the specified path.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setHttpURL(HttpURL)
+ * @see #setHttpURL(java.lang.String)
+ * @see #setUserInfo(java.lang.String, java.lang.String)
+ */
+ public void setPath(String path)
+ throws HttpException, IOException {
+
+ httpURL.setPath(path);
+ setHttpURL(httpURL);
+ }
+
+
+ /**
+ * Get the path part of this WebdavResource.
+ * If the decoding of the path fails, this method will not throw an
+ * exception but return the escaped path instead.
+ *
+ * @return the path for this WebdavResource.
+ * @see org.apache.commons.httpclient.HttpURL#getPath()
+ * @see #setPath(java.lang.String)
+ */
+ public String getPath() {
+ try {
+ return httpURL.getPath();
+ } catch (URIException e) {
+ return httpURL.getEscapedPath();
+ }
+ }
+
+
+ /**
+ * Get the name of this WebdavResource.
+ * If the decoding of the name fails, this method will not throw an
+ * exception but return the escaped name instead.
+ *
+ * @return the name of this WebdavResource.
+ * @see org.apache.commons.httpclient.HttpURL#getName()
+ */
+ public String getName() {
+ return getName(httpURL.getEscapedPath(), true);
+ }
+
+
+ /**
+ * Get the hostname of this WebdavResource.
+ *
+ * @return the hostname.
+ * @exception URIException
+ */
+ public String getHost() throws URIException {
+ return httpURL.getHost();
+ }
+
+
+ /**
+ * Set the userinfo part of this WebdavResource.
+ *
+ * @exception HttpException
+ * @exception IOException
+ * @see #setHttpURL(HttpURL)
+ * @see #setHttpURL(java.lang.String)
+ * @see #setPath(java.lang.String)
+ */
+ public void setUserInfo(String userName, String password)
+ throws HttpException, IOException {
+
+ httpURL.setUserinfo(userName, password);
+ setHttpURL(httpURL);
+ }
+
+
+ /**
+ * Add a header in the request sent to the webdav server
+ *
+ * @param header Header name
+ * @param value Value
+ */
+ public void addRequestHeader(String header, String value) {
+ headers.put(header, value);
+ }
+
+
+
+ // ------------------------------------------------ DAV properties checking
+
+
+ /**
+ * Get the value of DAV property, displayname.
+ *
+ * @return The displayname string.
+ */
+ public String getDisplayName() {
+ return displayName;
+ }
+
+
+ /**
+ * Set the value of DAV property, displayname.
+ *
+ * @param displayName The displayname string.
+ */
+ protected void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+
+ /**
+ * Get the value of DAV property, getcontentlength.
+ *
+ * @return The getcontentlength value.
+ */
+ public long getGetContentLength() {
+ return getContentLength;
+ }
+
+
+ /**
+ * Set the value of DAV property, getcontentlength.
+ *
+ * @param getContentLength The getcontentlength value.
+ */
+ protected void setGetContentLength(long getContentLength) {
+ this.getContentLength = getContentLength;
+ }
+
+
+ /**
+ * Set the value of DAV property, getcontentlength.
+ *
+ * @param getContentLength The getcontentlength value.
+ */
+ protected void setGetContentLength(String getContentLength) {
+ try {
+ this.getContentLength = Long.parseLong(getContentLength);
+ } catch (NumberFormatException nfe) {
+ // it's ok to ignore this error.
+ }
+ }
+
+
+ /**
+ * Get the value of DAV property, resourcetype.
+ *
+ * @return The resourcetype property.
+ * @see #isCollection()
+ */
+ public ResourceTypeProperty getResourceType() {
+ return resourceType;
+ }
+
+
+ /**
+ * Set the value of DAV property, resourcetype.
+ *
+ * @param resourceType The resourcetype property.
+ */
+ protected void setResourceType(ResourceTypeProperty resourceType) {
+ this.resourceType = resourceType;
+ }
+
+
+ /**
+ * Get the value of DAV property, resourcetype
+ *
+ * @return The resourcetype string.
+ * @see #getResourceType()
+ * @see #getIsCollection()
+ */
+ public boolean isCollection() {
+ if (getResourceType() == null) return false;
+ return getResourceType().isCollection();
+ }
+
+
+ /**
+ * Get the value of DAV property, getcontenttype.
+ *
+ * @return The getcontenttype string.
+ */
+ public String getGetContentType() {
+ return getContentType;
+ }
+
+
+ /**
+ * Set the value of DAV property, getcontenttype.
+ *
+ * @param getContentType The getcontenttype string.
+ */
+ protected void setGetContentType(String getContentType) {
+ this.getContentType = getContentType;
+ }
+
+ /**
+ * Set the content-type to use for this resource, for PUTs.
+ * @param contentType The content-type string.
+ */
+ public void setContentType(String contentType) {
+ this.getContentType = contentType;
+ }
+
+ /**
+ * Get the value of DAV property, getlastmodified.
+ *
+ * @return The getlastmodified value.
+ */
+ public long getGetLastModified() {
+ return getLastModified;
+ }
+
+
+ /**
+ * Set the value of DAV property, getlastmodified.
+ *
+ * @param getLastModified The getlastmodified value.
+ * @see #setGetLastModified(java.lang.String)
+ */
+ protected void setGetLastModified(long getLastModified) {
+ this.getLastModified = getLastModified;
+ }
+
+
+ /**
+ * Set the value of DAV property, getlastmodified.
+ *
+ * @param getLastModified The getlastmodified value.
+ * @see #setGetLastModified(long)
+ */
+ protected void setGetLastModified(String getLastModified) {
+ Date date = parseDate(getLastModified);
+ if (date != null)
+ this.getLastModified = date.getTime();
+ }
+
+
+ /**
+ * Get the value of DAV property, creationdate.
+ *
+ * @return The creationdate string.
+ */
+ public long getCreationDate() {
+ return creationDate;
+ }
+
+
+ /**
+ * Set the value of DAV property, creationdate.
+ *
+ * @param creationDate The creationdate string.
+ */
+ protected void setCreationDate(long creationDate) {
+ this.creationDate = creationDate;
+ }
+
+
+ /**
+ * Set the value of DAV property, creationdate.
+ *
+ * @param creationDate The creationdate string.
+ */
+ protected void setCreationDate(String creationDate) {
+ Date date = parseDate(creationDate);
+ if (date != null)
+ this.creationDate = date.getTime();
+ }
+
+
+ /**
+ * Get the value of DAV property, getetag.
+ *
+ * @return The getetag string.
+ */
+ public String getGetEtag() {
+ return getEtag;
+ }
+
+
+ /**
+ * Set the value of DAV property, getetag.
+ *
+ * @param getEtag The getetag string.
+ */
+ protected void setGetEtag(String getEtag) {
+ this.getEtag = getEtag;
+ }
+
+ /**
+ * Get the owner string, as used for locking purposes.
+ */
+ public String getOwner() {
+ return owner;
+ }
+
+ /**
+ * Get the value of DAV property, supportedlock.
+ *
+ * @return The supportedlock string.
+ */
+ public String getSupportedLock() {
+ return supportedLock;
+ }
+
+
+ /**
+ * Set the value of DAV property, supportedlock.
+ *
+ * @param supportedLock The supportedlock string.
+ */
+ protected void setSupportedLock(String supportedLock) {
+ this.supportedLock = supportedLock;
+ }
+
+
+ /**
+ * Get the value of DAV property, lockdiscovery.
+ *
+ * @return The lockdiscovery property.
+ */
+ public LockDiscoveryProperty getLockDiscovery() {
+ return lockDiscovery;
+ }
+
+ /**
+ * Set the value of DAV property, lockdiscovery.
+ *
+ * @param lockDiscovery The lockdiscovery property.
+ */
+ protected void setLockDiscovery(LockDiscoveryProperty lockDiscovery) {
+ this.lockDiscovery = lockDiscovery;
+ }
+
+
+ /**
+ * Get the activelock owners for this resource.
+ *
+ * @return An enumeration of owners.
+ */
+ public Enumeration getActiveLockOwners() {
+ if (lockDiscovery == null) return null;
+ Lock[] activeLocks = lockDiscovery.getActiveLocks();
+ if (activeLocks == null) return null;
+ Vector buff = new Vector();
+ int count = activeLocks.length;
+ for (int i = 0; i < count; i++) {
+ buff.addElement(activeLocks[i].getOwner());
+ }
+ return buff.elements();
+ }
+
+
+ /**
+ * Test that this resource is locked.
+ *
+ * @return true if it's locked.
+ */
+ public boolean isLocked() {
+ if (lockDiscovery == null) return false;
+ Lock[] activeLocks = lockDiscovery.getActiveLocks();
+ if (activeLocks == null) return false;
+ for (int i = 0; i < activeLocks.length; i++) {
+ if (activeLocks[i].getLockType() == Lock.TYPE_WRITE) return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Get the value of DAV property, ishidden.
+ *
+ * @return true if it is hidden, otherwise false.
+ */
+ public boolean getIsHidden() {
+ return isHidden;
+ }
+
+
+ /**
+ * Set the value of DAV property, ishidden.
+ *
+ * @param isHidden
+ */
+ protected void setIsHidden(boolean isHidden) {
+ this.isHidden = isHidden;
+ }
+
+
+ /**
+ * Set the value of DAV property, ishidden.
+ *
+ * @param isHidden
+ */
+ protected void setIsHidden(String isHidden) {
+ this.isHidden = isHidden.equals(TRUE) ? true : false;
+ }
+
+
+ /**
+ * Get the value of DAV property, iscollection
+ *
+ * @return true if it is collection, otherwise false.
+ * @see #isCollection()
+ */
+ public boolean getIsCollection() {
+ return isCollection;
+ }
+
+
+ /**
+ * Set the value of DAV property, iscollection
+ *
+ * @param isCollection
+ */
+ protected void setIsCollection(boolean isCollection) {
+ this.isCollection = isCollection;
+ }
+
+
+ /**
+ * Set the value of DAV property, iscollection
+ *
+ * @param isCollection
+ */
+ protected void setIsCollection(String isCollection) {
+ this.isCollection = isCollection.equals(TRUE) ? true : false;
+ }
+
+
+ // --------------------------------------- WebDAV Resource Public Methods
+
+
+ /**
+ * Set the properties for this resource.
+ *
+ * @param action The action to find properties for this resource.
+ * @param depth the depth to which properties shall be found
+ * @see #setDefaultAction(int)
+ */
+ public void setProperties(int action, int depth)
+ throws HttpException, IOException {
+
+ switch (action) {
+ case NAME:
+ setNameProperties(depth);
+ break;
+ case BASIC:
+ setBasicProperties(depth);
+ break;
+ case DEFAULT:
+ setDefaultProperties(depth);
+ break;
+ case ALL:
+ setAllProp(depth);
+ break;
+ case NOACTION:
+ default:
+ break;
+ }
+ }
+
+
+ /**
+ * Set the properties for this resource.
+ *
+ * @param depth the depth to which properties shall be found
+ */
+ public void setProperties(int depth)
+ throws HttpException, IOException {
+
+ setProperties(defaultAction, depth);
+ }
+
+ /**
+ * Refresh the properties of this resource
+ * without changing the status of the previous command
+ */
+ protected void refresh() throws HttpException, IOException {
+ int latestStatusCode = this.latestStatusCode;
+ String latestStatusMessage = this.latestStatusMessage;
+ setProperties(DepthSupport.DEPTH_0);
+ this.latestStatusCode = latestStatusCode;
+ this.latestStatusMessage = latestStatusMessage;
+ }
+
+ /**
+ * Returns the last known information about the existence of this resource.
+ * This is a wrapper method for getExistence.
+ *
+ * A previous call to the method setProperties might be necessary to update
+ * that information.
+ *
+ * @return true if the resource is known to exist<br>
+ * false if the resource is known not to exist or its status is unknown.
+ * @see #getExistence()
+ * @see #setProperties(int, int)
+ */
+ public boolean exists() {
+ return getExistence();
+ }
+
+
+ /**
+ * Set its existence.
+ *
+ * @param exists The boolean value to be set for its existence.
+ */
+ protected void setExistence(boolean exists) {
+ this.exists = exists;
+ }
+
+
+ /**
+ * Returns the last known information about the existence of this resource.
+ *
+ * A previous call to the method setProperties might be necessary to update that
+ * information.
+ *
+ * @return true if the resource is known to exist<br>
+ * false if the resource is known not to exist or its status is unknown.
+ * @see #setProperties(int, int)
+ */
+ public boolean getExistence() {
+ return exists;
+ }
+
+
+ /**
+ * Set the overwrite flag for COPY, MOVE, BIND and REBIND.
+ * Should be set before the method is executed.
+ *
+ * @param overwrite the overwrite flag
+ * @see #getOverwrite()
+ */
+ public void setOverwrite(boolean overwrite) {
+ this.overwrite = overwrite;
+ }
+
+
+ /**
+ * Get the current value of the overwrite flag for COPY, MOVE, BIND and
+ * REBIND.
+ *
+ * @return true if the current flag is overwriting.
+ * @see #setOverwrite(boolean)
+ */
+ public boolean getOverwrite() {
+ return overwrite;
+ }
+
+
+ /**
+ * Close the session of this client
+ */
+ public void close() throws IOException {
+ closeSession();
+ }
+
+
+ /**
+ * Get the lastest value of the status message by HTTP methods.
+ *
+ * @return The http status string.
+ */
+ public String getStatusMessage() {
+ return latestStatusMessage;
+ }
+
+
+ /**
+ * Get the lastest value of the status code by HTTP methods.
+ *
+ * @return The http status code.
+ */
+ public int getStatusCode() {
+ return latestStatusCode;
+ }
+
+
+ /**
+ * Set the lastest value of the status code by HTTP methods.
+ *
+ * @param statusCode the HTTP status code.
+ */
+ protected void setStatusCode(int statusCode) {
+ setStatusCode(statusCode, null);
+ }
+
+
+ /**
+ * Set the lastest value of the status code by HTTP methods.
+ *
+ * @param statusCode the HTTP status code.
+ * @param message the additional message.
+ */
+ protected void setStatusCode(int statusCode, String message) {
+
+ latestStatusCode = statusCode;
+ latestStatusMessage = WebdavStatus.getStatusText(statusCode) +
+ " (" + statusCode + ")" + ((message == null) ? "" : message);
+ }
+
+
+ /**
+ * Get the allowed methods, checked by HTTP OPTIONS.
+ *
+ * @return the allowed HTTP methods.
+ * @see #optionsMethod(java.lang.String)
+ */
+ public Enumeration getAllowedMethods() {
+ return allowedMethods;
+ }
+
+
+ /**
+ * Get the WebDAV capabilities, checked by HTTP OPTIONS.
+ *
+ * @return the WebDAV capabilities.
+ * @see #optionsMethod(java.lang.String)
+ */
+ public Enumeration getDavCapabilities() {
+ return davCapabilities;
+ }
+
+
+ /**
+ * Get all resources in this collection with the depth 1.
+ *
+ * @return resources in this collection with the depth 1.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public WebdavResources getChildResources()
+ throws HttpException, IOException {
+
+ setProperties(DepthSupport.DEPTH_1);
+
+ return childResources;
+ }
+
+
+ /**
+ * Get an array of resources denoting the WebDAV child resources in the
+ * collection of this resources.
+ *
+ * @return An array of child resources in this resource.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public WebdavResource[] listWebdavResources()
+ throws HttpException, IOException {
+
+ return getChildResources().listResources();
+ }
+
+
+ /**
+ * Get an array of pathnames denoting the WebDAV resources in the
+ * collection denoted by this pathname.
+ *
+ * @return An array of pathnames denoting the resources, null if an
+ * IOException occurs.
+ */
+ public String[] list() {
+
+ try {
+ setNameProperties(DepthSupport.DEPTH_1);
+ } catch (IOException e) {
+ return null;
+ }
+ Enumeration hrefs = childResources.getResourceNames();
+
+ // To be atomic.
+ Vector hrefList = new Vector();
+ while (hrefs.hasMoreElements()) {
+ hrefList.addElement((String) hrefs.nextElement());
+ }
+ // Calculate the size of the string array.
+ int num = hrefList.size();
+ String[] pathnames = new String[num];
+ for (int i = 0; i < num; i++) {
+ pathnames[i] = (String) hrefList.elementAt(i);
+ }
+
+ return pathnames;
+ }
+
+
+ /**
+ * Get an array of pathnames and basic information denoting the WebDAV
+ * resources in the denoted by this pathname.
+ *
+ * array 0: displayname
+ * array 1: getcontentlength
+ * array 2: iscollection or getcontentype
+ * array 3: getlastmodifieddate
+ * array 4: name
+ *
+ * @return An array of pathnames and more denoting the resources.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Vector listBasic()
+ throws HttpException, IOException {
+
+ setBasicProperties(DepthSupport.DEPTH_1);
+ Enumeration hrefs = childResources.getResourceNames();
+
+ Vector hrefList = new Vector();
+ while (hrefs.hasMoreElements()) {
+ try {
+ String resourceName = (String) hrefs.nextElement();
+ WebdavResource currentResource =
+ childResources.getResource(resourceName);
+
+ String[] longFormat = new String[5];
+ // displayname.
+ longFormat[0] = currentResource.getDisplayName();
+
+
+ long length = currentResource.getGetContentLength();
+ // getcontentlength
+ longFormat[1] = new Long(length).toString();
+ // resourcetype
+ ResourceTypeProperty resourceTypeProperty =
+ currentResource.getResourceType();
+ // getcontenttype
+ String getContentType =
+ currentResource.getGetContentType();
+ longFormat[2] = resourceTypeProperty.isCollection() ?
+ "COLLECTION" : getContentType ;
+ Date date = new Date(currentResource.getGetLastModified());
+ // getlastmodified
+ // Save the dummy what if failed.
+ longFormat[3] = (date == null) ? "-- -- ----" :
+ // Print the local fancy date format.
+ DateFormat.getDateTimeInstance().format(date);
+ hrefList.addElement(longFormat);
+
+ // real name of componente
+ longFormat[4] = currentResource.getName();
+
+
+ } catch (Exception e) {
+ // FIXME: After if's gotten an exception, any solution?
+ if (debug > 0)
+ e.printStackTrace();
+ //log.error(e,e);
+ }
+ }
+
+ return hrefList;
+ }
+
+
+ /**
+ * Set the URL encoding flag for this http URL.
+ *
+ * @param encodeURLs true if it is encoded.
+ * @exception MalformedURLException
+ * @exception IOException
+ *
+ * @deprecated No longer has any effect.
+ */
+ public void setEncodeURLs(boolean encodeURLs) {
+
+ }
+
+
+ // -------------------------- General accessor to use http request methods.
+
+
+ /**
+ * Retrieve the current http client for this resource.
+ *
+ * @return The http client.
+ * @see #executeHttpRequestMethod(HttpClient, HttpMethod)
+ */
+ public HttpClient retrieveSessionInstance()
+ throws IOException {
+
+ setClient();
+ return client;
+ }
+
+
+ /**
+ * Execute the http request method. And get its status code.
+ *
+ * @param client The http client.
+ * @param method The http method.
+ * @return The status code.
+ * @see #retrieveSessionInstance()
+ */
+ public int executeHttpRequestMethod(HttpClient client, HttpMethod method)
+ throws IOException, HttpException {
+
+ client.executeMethod(method);
+ return method.getStatusCode();
+ }
+
+
+ // --------------------------------- WebDAV Request-method Public Methods
+
+ /**
+ * Updates the resource with a new set of aces.
+ *
+ * @param path the server relative path of the resource to which the given
+ * ACEs shall be applied
+ * @param aces the ACEs to apply
+ * @return true if the method succeeded
+ */
+ public boolean aclMethod(String path, Ace[] aces)
+ throws HttpException, IOException {
+
+ setClient();
+
+ AclMethod method = new AclMethod(URIUtil.encodePath(path));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ for (int i=0; i<aces.length ; i++) {
+ Ace ace = aces[i];
+ method.addAce(ace);
+ }
+
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Return the <code>AclProperty</code> for the current resource
+ *
+ * @return acl property, null if the server doesn't respond with
+ * <code>AclProperty</code>
+ */
+ public AclProperty aclfindMethod() throws HttpException, IOException {
+ thisResource = true;
+ return aclfindMethod(httpURL.getPath());
+ }
+
+
+ /**
+ * Return the <code>AclProperty</code> for the resource at the given path
+ *
+ * @param path the server relative path of the resource to request
+ * @return acl property, null if the server doesn't respond with
+ * <code>AclProperty</code>
+ */
+ public AclProperty aclfindMethod(String path)
+ throws HttpException, IOException {
+
+ setClient();
+
+ AclProperty acl = null;
+
+ Vector properties = new Vector();
+ properties.addElement(AclProperty.TAG_NAME);
+
+ // Default depth=0, type=by_name
+ PropFindMethod method = new PropFindMethod(URIUtil.encodePath(path),
+ DepthSupport.DEPTH_0,
+ properties.elements());
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ Enumeration responses = method.getResponses();
+ if (responses.hasMoreElements()) {
+ ResponseEntity response =
+ (ResponseEntity) responses.nextElement();
+ String href = response.getHref();
+
+ // Set status code for this resource.
+ if ((thisResource == true) && (response.getStatusCode() > 0))
+ setStatusCode(response.getStatusCode());
+ thisResource = false;
+
+ Enumeration responseProperties =
+ method.getResponseProperties(href);
+ while (responseProperties.hasMoreElements()) {
+ Property property =
+ (Property) responseProperties.nextElement();
+ if (property instanceof AclProperty) {
+ acl = (AclProperty)property;
+ }
+
+ }
+ }
+
+ return acl;
+ }
+
+
+ /**
+ * Get the <code>PrincipalCollectionSetProperty</code> for the current
+ * resource.
+ *
+ * @return principal collection set Property, null if the server doesn't
+ * respond with a <code>PrincipalCollectionSetProperty</code>
+ */
+ public PrincipalCollectionSetProperty principalCollectionSetFindMethod()
+ throws HttpException, IOException {
+ thisResource = true;
+ return principalCollectionSetFindMethod(httpURL.getPath());
+ }
+
+ /**
+ * Get the <code>PrincipalCollectionSetProperty</code> for the resource.
+ *
+ * @param path the server relative path of the resource to request
+ * @return principal collection set Property, null if the server doesn't
+ * respond with a <code>PrincipalCollectionSetProperty</code>
+ */
+ public PrincipalCollectionSetProperty principalCollectionSetFindMethod(
+ String path) throws HttpException, IOException {
+
+ setClient();
+
+ PrincipalCollectionSetProperty set = null;
+
+ Vector properties = new Vector();
+ properties.addElement(PrincipalCollectionSetProperty.TAG_NAME);
+
+ // Default depth=0, type=by_name
+ PropFindMethod method = new PropFindMethod(URIUtil.encodePath(path),
+ DepthSupport.DEPTH_0,
+ properties.elements());
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ Enumeration responses = method.getResponses();
+ if (responses.hasMoreElements()) {
+ ResponseEntity response =
+ (ResponseEntity) responses.nextElement();
+ String href = response.getHref();
+
+ // Set status code for this resource.
+ if ((thisResource == true) && (response.getStatusCode() > 0))
+ setStatusCode(response.getStatusCode());
+ thisResource = false;
+
+ Enumeration responseProperties =
+ method.getResponseProperties(href);
+ while (responseProperties.hasMoreElements()) {
+ Property property =
+ (Property) responseProperties.nextElement();
+ if (property instanceof PrincipalCollectionSetProperty) {
+ set = (PrincipalCollectionSetProperty)property;
+ }
+
+ }
+ }
+
+ return set;
+ }
+
+
+ /**
+ * Return the LockDiscoveryProperty for the current resource
+ *
+ * @return null if the server doesn't respond with a LockDiscoveryProperty
+ */
+ public LockDiscoveryProperty lockDiscoveryPropertyFindMethod()
+ throws HttpException, IOException {
+ thisResource = true;
+ return lockDiscoveryPropertyFindMethod(httpURL.getPath());
+ }
+
+
+ /**
+ * Return the LockDiscoveryProperty for the resource at the given path
+ *
+ * @param path the server relative path of the resource to request
+ * @return null if the server doesn't respond with a LockDiscoveryProperty
+ */
+ public LockDiscoveryProperty lockDiscoveryPropertyFindMethod(String path)
+ throws HttpException, IOException {
+
+ setClient();
+
+ LockDiscoveryProperty set = null;
+
+ Vector properties = new Vector();
+ properties.addElement(LockDiscoveryProperty.TAG_NAME);
+
+ // Default depth=0, type=by_name
+ PropFindMethod method = new PropFindMethod(URIUtil.encodePath(path),
+ DepthSupport.DEPTH_0,
+ properties.elements());
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ Enumeration responses = method.getResponses();
+ if (responses.hasMoreElements()) {
+ ResponseEntity response =
+ (ResponseEntity) responses.nextElement();
+ String href = response.getHref();
+
+ // Set status code for this resource.
+ if ((thisResource == true) && (response.getStatusCode() > 0))
+ setStatusCode(response.getStatusCode());
+ thisResource = false;
+
+ Enumeration responseProperties =
+ method.getResponseProperties(href);
+ while (responseProperties.hasMoreElements()) {
+ Property property =
+ (Property) responseProperties.nextElement();
+ if (property instanceof LockDiscoveryProperty) {
+ set = (LockDiscoveryProperty)property;
+ }
+
+ }
+ }
+
+ return set;
+ }
+
+
+ /**
+ * Get InputStream for the GET method.
+ *
+ * @return InputStream
+ * @exception HttpException
+ * @exception IOException
+ */
+ public InputStream getMethodData()
+ throws HttpException, IOException {
+
+ return getMethodData(httpURL.getPathQuery());
+ }
+
+
+ /**
+ * Get InputStream for the GET method for the given path.
+ *
+ * @param path the server relative path of the resource to get
+ * @return InputStream
+ * @exception HttpException
+ * @exception IOException
+ */
+ public InputStream getMethodData(String path)
+ throws HttpException, IOException {
+
+ setClient();
+
+ GetMethod method = new GetMethod(URIUtil.encodePathQuery(path));
+
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ int statusCode = method.getStatusLine().getStatusCode();
+ setStatusCode(statusCode);
+
+ if(statusCode >= 200 && statusCode < 300)
+ return method.getResponseBodyAsStream();
+ else
+ throw new IOException("Couldn't get file");
+ }
+
+
+ /**
+ * Get data as a String for the GET method.
+ *
+ * @return the contents of this resource as a string
+ * @exception HttpException
+ * @exception IOException
+ */
+ public String getMethodDataAsString()
+ throws HttpException, IOException {
+
+ return getMethodDataAsString(httpURL.getPathQuery());
+ }
+
+
+ /**
+ * Get data as a String for the GET method for the given path.
+ *
+ * @param path the server relative path of the resource to get
+ * @return the contents of the given resource as a string
+ * @exception HttpException
+ * @exception IOException
+ */
+ public String getMethodDataAsString(String path)
+ throws HttpException, IOException {
+
+ setClient();
+ GetMethod method = new GetMethod(URIUtil.encodePathQuery(path));
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+
+ return method.getResponseBodyAsString();
+ }
+
+
+ /**
+ * Execute the GET method for this WebdavResource path.
+ *
+ * @param file The local file.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean getMethod(File file)
+ throws HttpException, IOException {
+
+ return getMethod(httpURL.getPathQuery(), file);
+ }
+
+
+ /**
+ * Execute the GET method for the given path.
+ *
+ * @param path the server relative path of the resource to get
+ * @param file The local file.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean getMethod(String path, File file)
+ throws HttpException, IOException {
+
+ setClient();
+ GetMethod method = new GetMethod(URIUtil.encodePathQuery(path));
+
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+
+ // get the file only if status is any kind of OK
+ if (statusCode >= 200 && statusCode < 300) {
+
+ // Do a simple little loop to read the response back into the passed
+ // file parameter.
+ InputStream inStream = method.getResponseBodyAsStream();
+
+ FileOutputStream fos = new FileOutputStream(file);
+ byte buffer[] = new byte[65535];
+ int bytesRead;
+ while ((bytesRead = inStream.read(buffer)) >= 0) {
+ fos.write(buffer, 0, bytesRead);
+ }
+ inStream.close();
+ fos.close();
+
+ return true;
+
+ } else {
+ return false;
+
+ }
+
+
+ }
+
+
+ /**
+ * Execute the PUT method for this resource.
+ *
+ * @param data The byte array.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean putMethod(byte[] data)
+ throws HttpException, IOException {
+
+ boolean result = putMethod(httpURL.getPathQuery(), data);
+ if (result) refresh();
+ return result;
+ }
+
+
+ /**
+ * Execute the PUT method for the given path.
+ *
+ * @param path the server relative path to put the data
+ * @param data The byte array.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean putMethod(String path, byte[] data)
+ throws HttpException, IOException {
+
+ setClient();
+ PutMethod method = new PutMethod(URIUtil.encodePathQuery(path));
+ generateIfHeader(method);
+ if (getGetContentType() != null && !getGetContentType().equals(""))
+ method.setRequestHeader("Content-Type", getGetContentType());
+
+ method.setRequestHeader("Content-Length", String.valueOf(data.length));
+ method.setRequestBody(new ByteArrayInputStream(data));
+
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute the PUT method for this resource.
+ *
+ * @param is The input stream.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean putMethod(InputStream is)
+ throws HttpException, IOException {
+
+ return putMethod(httpURL.getPathQuery(), is);
+ }
+
+
+ /**
+ * Execute the PUT method for the given path.
+ *
+ * @param path the server relative path to put the data
+ * @param is The input stream.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean putMethod(String path, InputStream is)
+ throws HttpException, IOException {
+
+ setClient();
+ PutMethod method = new PutMethod(URIUtil.encodePathQuery(path));
+ generateIfHeader(method);
+ if (getGetContentType() != null && !getGetContentType().equals(""))
+ method.setRequestHeader("Content-Type", getGetContentType());
+ method.setRequestContentLength(PutMethod.CONTENT_LENGTH_CHUNKED);
+ method.setRequestBody(is);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute the PUT method for this WebdavResource.
+ *
+ * @param data String</cdoe> data to send.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean putMethod(String data)
+ throws HttpException, IOException {
+
+ boolean result = putMethod(httpURL.getPathQuery(), data);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute the PUT method for the given path.
+ *
+ * @param path the server relative path to put the data
+ * @param data String to send.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean putMethod(String path, String data)
+ throws HttpException, IOException {
+
+ setClient();
+ PutMethod method = new PutMethod(URIUtil.encodePathQuery(path));
+ generateIfHeader(method);
+ if (getGetContentType() != null && !getGetContentType().equals(""))
+ method.setRequestHeader("Content-Type", getGetContentType());
+ method.setRequestBody(data);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute the PUT method for this WebdavResource.
+ *
+ * @param file the filename to get on local.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean putMethod(File file)
+ throws HttpException, IOException {
+
+ boolean result = putMethod(httpURL.getPathQuery(), file);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute the PUT method for the given path.
+ *
+ * @param path the server relative path to put the given file
+ * @param file the filename to get on local.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean putMethod(String path, File file)
+ throws HttpException, IOException {
+
+ setClient();
+ PutMethod method = new PutMethod(URIUtil.encodePathQuery(path));
+ generateIfHeader(method);
+ if (getGetContentType() != null && !getGetContentType().equals(""))
+ method.setRequestHeader("Content-Type", getGetContentType());
+ long fileLength = file.length();
+ method.setRequestContentLength(fileLength <= Integer.MAX_VALUE
+ ? (int) fileLength
+ : PutMethod.CONTENT_LENGTH_CHUNKED);
+ method.setRequestBody(new FileInputStream(file));
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+
+ /**
+ * Execute the PUT method for this resource from the given url.
+ * It's like a streaming copy about a resource of the specified remote url
+ * to another remote url of this resource.
+ *
+ * @param url The URL to get a resource.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean putMethod(URL url)
+ throws HttpException, IOException {
+
+ boolean result = putMethod(httpURL.getPathQuery(), url);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute the PUT method for the given path from the given url.
+ *
+ * @param path the server relative path to put the data
+ * @param url The URL to get a resource.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean putMethod(String path, URL url)
+ throws HttpException, IOException {
+
+ setClient();
+ PutMethod method = new PutMethod(URIUtil.encodePathQuery(path));
+ generateIfHeader(method);
+ if (getGetContentType() != null && !getGetContentType().equals(""))
+ method.setRequestHeader("Content-Type", getGetContentType());
+ method.setRequestBody(url.openStream());
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute OPTIONS method for this WebdavResource.
+ *
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean optionsMethod()
+ throws HttpException, IOException {
+
+ return optionsMethod(httpURL.getPath());
+ }
+
+
+ /**
+ * Execute OPTIONS method for the given path.
+ *
+ * @param path the server relative path of the resource to request
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ * @see #getAllowedMethods()
+ */
+ public boolean optionsMethod(String path)
+ throws HttpException, IOException {
+
+ setClient();
+ OptionsMethod method;
+ if (path.trim().equals("*"))
+ method = new OptionsMethod("*");
+ else
+ method = new OptionsMethod(URIUtil.encodePath(path));
+
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+
+ if (statusCode >= 200 && statusCode < 300) {
+ // check if the specific method is possbile
+ allowedMethods = method.getAllowedMethods();
+ // check WebDAV capabilities.
+ davCapabilities = method.getDavCapabilities();
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Execute OPTIONS method for the given path.
+ *
+ * @param path the server relative path to send the request
+ * @param aMethod a method to check it's supported.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean optionsMethod(String path, String aMethod)
+ throws HttpException, IOException {
+
+ if (aMethod != null && optionsMethod(path)) {
+ while (allowedMethods.hasMoreElements()) {
+ if (aMethod.equalsIgnoreCase((String)
+ allowedMethods.nextElement()))
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Execute OPTIONS method for the given http URL.
+ *
+ * @param httpURL the http URL.
+ * @return the allowed methods and capabilities.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Enumeration optionsMethod(HttpURL httpURL)
+ throws HttpException, IOException {
+
+ HttpClient client = getSessionInstance(httpURL, true);
+
+ OptionsMethod method = new OptionsMethod(httpURL.getEscapedPath());
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ Vector options = new Vector();
+ int statusCode = method.getStatusLine().getStatusCode();
+ if (statusCode >= 200 && statusCode < 300) {
+ // check if the specific method is possbile
+ Enumeration allowedMethods = method.getAllowedMethods();
+ while (allowedMethods.hasMoreElements()) {
+ options.addElement(allowedMethods.nextElement());
+ }
+ // check WebDAV capabilities.
+ Enumeration davCapabilities = method.getDavCapabilities();
+ while (davCapabilities.hasMoreElements()) {
+ options.addElement(davCapabilities.nextElement());
+ }
+ Enumeration responses = method.getResponses();
+ if (responses.hasMoreElements()) {
+ ResponseEntity response =
+ (ResponseEntity) responses.nextElement();
+ Enumeration workspaces = response.getWorkspaces();
+ String sResult="";
+ while (workspaces.hasMoreElements()){
+ sResult += workspaces.nextElement().toString();
+ }
+ Enumeration histories = response.getHistories();
+ while (histories.hasMoreElements()){
+ sResult += histories.nextElement().toString();
+ }
+ // Set status code for this resource.
+ if ((thisResource == true) && (response.getStatusCode() > 0))
+ setStatusCode(response.getStatusCode());
+ thisResource = false;
+ options.addElement(sResult);
+ }
+ }
+
+ return options.elements();
+ }
+
+
+ /**
+ * Execute OPTIONS method for the given http URL, DELTAV
+ *
+ * @param httpURL the http URL.
+ * @return the allowed methods and capabilities.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Enumeration optionsMethod(HttpURL httpURL, int type)
+ throws HttpException, IOException {
+
+ HttpClient client = getSessionInstance(httpURL, true);
+
+ OptionsMethod method = new OptionsMethod(httpURL.getEscapedPath(),
+ type);
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ Vector options = new Vector();
+ int statusCode = method.getStatusLine().getStatusCode();
+ if (statusCode >= 200 && statusCode < 300) {
+ Enumeration responses = method.getResponses();
+ if (responses.hasMoreElements()) {
+ ResponseEntity response =
+ (ResponseEntity) responses.nextElement();
+ // String sResult="";
+ if (type == OPTIONS_WORKSPACE){
+ Enumeration workspaces = response.getWorkspaces();
+ while (workspaces.hasMoreElements()){
+ options.add(workspaces.nextElement().toString());
+ }
+ } else if (type == OPTIONS_VERSION_HISTORY){
+ Enumeration histories = response.getHistories();
+ while (histories.hasMoreElements()){
+ options.add(histories.nextElement().toString());
+ }
+ }
+
+ // Set status code for this resource.
+ if ((thisResource == true) && (response.getStatusCode() > 0))
+ setStatusCode(response.getStatusCode());
+ thisResource = false;
+ // options.addElement(sResult);
+ }
+ }
+
+ return options.elements();
+ }
+
+
+ /**
+ * Execute OPTIONS method for the given path.
+ *
+ * @param path the server relative path of the resource to request
+ * @return the allowed methods and capabilities.
+ * @exception HttpException
+ * @exception IOException
+ * @see #getAllowedMethods()
+ */
+ public Enumeration optionsMethod(String path, int type)
+ throws HttpException, IOException {
+
+ setClient();
+
+ OptionsMethod method = new OptionsMethod(URIUtil.encodePath(path),
+ type);
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ Vector options = new Vector();
+ int statusCode = method.getStatusLine().getStatusCode();
+ if (statusCode >= 200 && statusCode < 300) {
+ Enumeration responses = method.getResponses();
+ if (responses.hasMoreElements()) {
+ ResponseEntity response =
+ (ResponseEntity) responses.nextElement();
+ // String sResult="";
+ if (type == OPTIONS_WORKSPACE){
+ Enumeration workspaces = response.getWorkspaces();
+ while (workspaces.hasMoreElements()){
+ options.add(workspaces.nextElement().toString());
+ }
+ } else if (type == OPTIONS_VERSION_HISTORY){
+ Enumeration histories = response.getHistories();
+ while (histories.hasMoreElements()){
+ options.add(histories.nextElement().toString());
+ }
+ }
+
+ // Set status code for this resource.
+ if ((thisResource == true) && (response.getStatusCode() > 0))
+ setStatusCode(response.getStatusCode());
+ thisResource = false;
+ // options.addElement(sResult);
+ }
+ }
+
+ return options.elements();
+ }
+
+ /**
+ * Execute a LABEL method on the current path, setting the given label
+ *
+ * @param labelname the label to set
+ * @param type the type of action. One of:
+ * <ul>
+ * <li> LABEL_ADD
+ * <li> LABEL_REMOVE
+ * <li> LABEL_SET
+ * </ul>
+ * @return true if the method succeeded
+ */
+ public boolean labelMethod(String labelname, int type)
+ throws HttpException, IOException {
+ return labelMethod(httpURL.getPath(), labelname, type);
+ }
+
+ /**
+ * Execute a LABEL method on the given path, setting the given label
+ *
+ * @param path the server relative path of the resource to act on
+ * @param labelname the label to set
+ * @param type the type of action. One of:
+ * <ul>
+ * <li> LABEL_ADD
+ * <li> LABEL_REMOVE
+ * <li> LABEL_SET
+ * </ul>
+ * @return true if the method succeeded
+ */
+ public boolean labelMethod(String path, String labelname, int type)
+ throws HttpException, IOException {
+ int labeltype=0;
+
+ switch(type) {
+ case LABEL_SET:
+ labeltype = LabelMethod.LABEL_SET;
+ break;
+ case LABEL_REMOVE:
+ labeltype = LabelMethod.LABEL_REMOVE;
+ break;
+ case LABEL_ADD:
+ labeltype = LabelMethod.LABEL_ADD;
+ break;
+ }
+
+ setClient();
+ LabelMethod method = new LabelMethod(URIUtil.encodePath(path),
+ labeltype, labelname);
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+ /**
+ * Execute the REPORT method.
+ */
+ public Enumeration reportMethod(HttpURL httpURL, int depth)
+
+ throws HttpException, IOException {
+ setClient();
+ // Default depth=0, type=by_name
+ ReportMethod method = new ReportMethod(httpURL.getEscapedPath(),
+ depth);
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ Vector results = new Vector();
+
+ Enumeration responses = method.getResponses();
+ while (responses.hasMoreElements()) {
+ ResponseEntity response = (ResponseEntity) responses.nextElement();
+ String href = response.getHref();
+ String sResult = href;
+
+ // Set status code for this resource.
+ if ((thisResource == true) && (response.getStatusCode() > 0))
+ setStatusCode(response.getStatusCode());
+ thisResource = false;
+
+ Enumeration responseProperties = method.getResponseProperties(href);
+ while (responseProperties.hasMoreElements()) {
+ Property property = (Property) responseProperties.nextElement();
+ sResult += "\n" + property.getName() + ":\t" +
+ DOMUtils.getTextValue(property.getElement());
+
+ }
+ results.addElement(sResult);
+ }
+
+ return results.elements();
+ }
+
+ public Enumeration reportMethod(HttpURL httpURL, Vector properties)
+
+ throws HttpException, IOException {
+ setClient();
+ // Default depth=0, type=by_name
+ ReportMethod method =
+ new ReportMethod(httpURL.getEscapedPath(), DepthSupport.DEPTH_0,
+ properties.elements());
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ return method.getResponses();
+ }
+
+ public Enumeration reportMethod(HttpURL httpURL, Vector properties,
+ int depth)
+
+ throws HttpException, IOException {
+ setClient();
+ // Default depth=0, type=by_name
+ ReportMethod method = new ReportMethod(httpURL.getEscapedPath(), depth,
+ properties.elements());
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ /*first draft, does work anyhow
+ Enumeration results = method.getAllResponseURLs();
+
+ return results;*/
+ /* Enumeration responses = method.getResponses();
+ ResponseEntity response = (ResponseEntity) responses.nextElement();
+ String href = (String) response.getHref();
+ Enumeration results = method.getResponseProperties(href);
+
+ return results;*/
+
+ Vector results = new Vector();
+
+ Enumeration responses = method.getResponses();
+ while (responses.hasMoreElements()) {
+ ResponseEntity response = (ResponseEntity) responses.nextElement();
+ String href = response.getHref();
+ String sResult = href;
+
+ // Set status code for this resource.
+ if ((thisResource == true) && (response.getStatusCode() > 0))
+ setStatusCode(response.getStatusCode());
+ thisResource = false;
+
+ Enumeration responseProperties = method.getResponseProperties(href);
+ while (responseProperties.hasMoreElements()) {
+ Property property = (Property) responseProperties.nextElement();
+ sResult += "\n" + property.getName() + ":\t" +
+ DOMUtils.getTextValue(property.getElement());
+ // results.addElement(DOMUtils.getTextValue(property.getElement()));
+ }
+ results.addElement(sResult);
+ }
+
+ return results.elements();
+ }
+
+
+ // locate-by-history Report
+ public Enumeration reportMethod(HttpURL httpURL, Vector properties,
+ Vector histUri, int depth)
+
+ throws HttpException, IOException {
+ setClient();
+ // Default depth=0, type=by_name
+ ReportMethod method = new ReportMethod(httpURL.getEscapedPath(), depth,
+ properties.elements(),
+ histUri.elements());
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ Vector results = new Vector();
+
+ Enumeration responses = method.getResponses();
+ while (responses.hasMoreElements()) {
+ ResponseEntity response = (ResponseEntity) responses.nextElement();
+ String href = response.getHref();
+ String sResult = href;
+
+ // Set status code for this resource.
+ if ((thisResource == true) && (response.getStatusCode() > 0))
+ setStatusCode(response.getStatusCode());
+ thisResource = false;
+
+ Enumeration responseProperties = method.getResponseProperties(href);
+ while (responseProperties.hasMoreElements()) {
+ Property property = (Property) responseProperties.nextElement();
+ sResult += "\n" + property.getName() + ":\t" +
+ DOMUtils.getTextValue(property.getElement());
+ }
+ results.addElement(sResult);
+ }
+
+ return results.elements();
+ }
+ // expand-property Report
+ public Enumeration reportMethod(HttpURL httpURL, String sQuery, int depth)
+
+ throws HttpException, IOException {
+ setClient();
+ // Default depth=0, type=by_name
+ ReportMethod method = new ReportMethod(httpURL.getEscapedPath(), depth,
+ sQuery);
+
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ client.executeMethod(method);
+
+ Vector results = new Vector();
+
+ Enumeration responses = method.getResponses();
+ while (responses.hasMoreElements()) {
+ ResponseEntity response = (ResponseEntity) responses.nextElement();
+ //String href = (String) response.getHref();
+ String sResult; //= href;
+
+ // Set status code for this resource.
+ if ((thisResource == true) && (response.getStatusCode() > 0))
+ setStatusCode(response.getStatusCode());
+ thisResource = false;
+
+ sResult = response.toString();
+ /*while (responseProperties.hasMoreElements()) {
+ Property property = (Property) responseProperties.nextElement();
+ sResult += "\t" + DOMUtils.getTextValue(property.getElement());
+
+ }*/
+ results.addElement(sResult);
+ }
+
+ return results.elements();
+ }
+
+
+ /**
+ * Execute PROPFIND method with allprop for this WebdavResource.
+ * Get list of all WebDAV properties on this WebDAV resource.
+ *
+ * <p>Once used this method, the the status code in the 207
+ * reponse is need to be set for the method of WebdavResource.
+ *
+ * <p>The values of DepthSupport.DEPTH_0, DepthSupport.DEPTH_1,
+ * DepthSupport.DEPTH_INFINITY is possbile for the depth.
+ *
+ * @param depth
+ * @return an enumeration of <code>ResponseEntity</code>
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Enumeration propfindMethod(int depth)
+ throws HttpException, IOException {
+
+ thisResource = true;
+ return propfindMethod(httpURL.getPath(), depth);
+ }
+
+
+ /**
+ * Execute PROPFIND method with allprop for the given path.
+ * Get list of all WebDAV properties on the given resource.
+ *
+ * <p>Once used this method, the the status code in the 207
+ * reponse is need to be set for the method of WebdavResource.
+ *
+ * <p>The values of DepthSupport.DEPTH_0, DepthSupport.DEPTH_1,
+ * DepthSupport.DEPTH_INFINITY is possbile for the depth.
+ *
+ * @param path the server relative path of the resource to request
+ * @param depth
+ * @return an enumeration of <code>ResponseEntity</code>
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Enumeration propfindMethod(String path, int depth)
+ throws HttpException, IOException {
+
+ setClient();
+ // Change the depth for allprop
+ PropFindMethod method = new PropFindMethod(URIUtil.encodePath(path),
+ depth);
+
+ method.setDebug(debug);
+
+ // Default depth=infinity, type=allprop
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int status = client.executeMethod(method);
+
+ // Set status code for this resource.
+ if (thisResource == true) {
+ setStatusCode(status);
+ }
+ // Also accept OK sent by buggy servers.
+ if (status != HttpStatus.SC_MULTI_STATUS
+ && status != HttpStatus.SC_OK) {
+ HttpException ex = new HttpException();
+ ex.setReasonCode(status);
+ throw ex;
+ }
+ thisResource = false;
+
+ return method.getResponses();
+ }
+
+
+
+ /**
+ * Execute PROPFIND method with by propname for this resource.
+ * Get list of named WebDAV properties on this resource.
+ *
+ * <p>Once used this method, the the status code in the 207
+ * reponse is need to be set for the method of WebdavResource.
+ *
+ * <p>The values of DepthSupport.DEPTH_0, DepthSupport.DEPTH_1
+ * DepthSupport.DEPTH_INFINITY is possbile for the depth.
+ *
+ * @param depth The depth.
+ * @param properties The named properties.
+ * @return an enumeration of <code>ResponseEntity</code>
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Enumeration propfindMethod(int depth, Vector properties)
+ throws HttpException, IOException {
+
+ thisResource = true;
+ return propfindMethod(httpURL.getPath(), depth, properties);
+ }
+
+
+ /**
+ * Execute PROPFIND method with by propname for the given path.
+ * Get list of named WebDAV properties on the given resource.
+ *
+ * <p>Once used this method, the the status code in the 207
+ * reponse is need to be set for the method of WebdavResource.
+ *
+ * <p>The values of DepthSupport.DEPTH_0, DepthSupport.DEPTH_1
+ * DepthSupport.DEPTH_INFINITY is possbile for the depth.
+ *
+ * @param path the server relative path of the resource to request
+ * @param depth The depth.
+ * @param properties The named properties.
+ * @return an enumeration of <code>ResponseEntity</code>
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Enumeration propfindMethod(String path, int depth,
+ Vector properties)
+ throws HttpException, IOException {
+
+ setClient();
+ // Change the depth for prop
+ PropFindMethod method = new PropFindMethod(URIUtil.encodePath(path),
+ depth,
+ properties.elements());
+
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int status = client.executeMethod(method);
+
+ // Set status code for this resource.
+ if (thisResource == true) {
+ // Set the status code.
+ setStatusCode(method.getStatusLine().getStatusCode());
+ }
+ // Also accept OK sent by buggy servers.
+ if (status != HttpStatus.SC_MULTI_STATUS
+ && status != HttpStatus.SC_OK) {
+ HttpException ex = new HttpException();
+ ex.setReasonCode(status);
+ throw ex;
+ }
+ thisResource = false;
+
+ return method.getResponses();
+ }
+
+
+ /**
+ * Execute PROPFIND method for this WebdavResource.
+ * Get list of given WebDAV properties on this WebDAV resource.
+ *
+ * @param propertyName the WebDAV property to find.
+ * @return Enumeration list of WebDAV properties on a resource.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Enumeration propfindMethod(String propertyName)
+ throws HttpException, IOException {
+
+ Vector property = new Vector();
+ property.addElement(propertyName);
+
+ thisResource = true;
+ return propfindMethod(httpURL.getPath(), property);
+ }
+
+
+ /**
+ * Execute PROPFIND method for the given WebdavResource path.
+ * Get list of given WebDAV properties on this WebDAV resource.
+ *
+ * @param path the server relative path of the resource to request
+ * @param propertyName the WebDAV property to find.
+ * @return Enumeration list of WebDAV properties on a resource.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Enumeration propfindMethod(String path, String propertyName)
+ throws HttpException, IOException {
+
+ Vector property = new Vector();
+ property.addElement(propertyName);
+
+ thisResource = false;
+ return propfindMethod(path, property);
+ }
+
+
+ /**
+ * Execute PROPFIND method for this WebdavResource.
+ * Get list of given WebDAV properties on this WebDAV resource.
+ *
+ * @param properties the WebDAV properties to find.
+ * @return Enumeration list of WebDAV properties on a resource.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Enumeration propfindMethod(Vector properties)
+ throws HttpException, IOException {
+
+ thisResource = true;
+ return propfindMethod(httpURL.getPath(), properties);
+ }
+
+
+ /**
+ * Execute PROPFIND method for the given path and properties.
+ * Get list of given WebDAV properties on the given resource.
+ *
+ * @param path the server relative path of the resource to request
+ * @param properties the WebDAV properties to find.
+ * @return Enumeration list of WebDAV properties on a resource.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Enumeration propfindMethod(String path, Vector properties)
+ throws HttpException, IOException {
+
+ setClient();
+ // Default depth=0, type=by_name
+ PropFindMethod method = new PropFindMethod(URIUtil.encodePath(path),
+ DepthSupport.DEPTH_0,
+ properties.elements());
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int status = client.executeMethod(method);
+
+ // Also accept OK sent by buggy servers.
+ if (status != HttpStatus.SC_MULTI_STATUS
+ && status != HttpStatus.SC_OK) {
+ HttpException ex = new HttpException();
+ ex.setReasonCode(status);
+ throw ex;
+ }
+
+ // It contains the results.
+ Vector results = new Vector();
+
+ Enumeration responses = method.getResponses();
+ if (responses.hasMoreElements()) {
+ ResponseEntity response =
+ (ResponseEntity) responses.nextElement();
+ String href = response.getHref();
+
+ // Set status code for this resource.
+ if ((thisResource == true) && (response.getStatusCode() > 0))
+ setStatusCode(response.getStatusCode());
+ thisResource = false;
+
+ Enumeration responseProperties =
+ method.getResponseProperties(href);
+ while (responseProperties.hasMoreElements()) {
+ Property property =
+ (Property) responseProperties.nextElement();
+ results.addElement(property.getPropertyAsString());
+ }
+ }
+
+ return results.elements();
+ }
+
+
+ /**
+ * Execute PROPATCH method for this WebdavResource.
+ *
+ * @param propertyName the name of the property to set
+ * @param propertyValue the value of the property to set
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ * @deprecated it could be removed after the major version changes
+ */
+ public boolean proppatchMethod(String propertyName, String propertyValue)
+ throws HttpException, IOException {
+
+ boolean result = proppatchMethod(httpURL.getPath(),
+ propertyName, propertyValue, true);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute PROPATCH method for this resource with the given property.
+ *
+ * @param propertyName the property name string (in "DAV:" namespace)
+ * @param propertyValue the property value string
+ * If the proppatch action is being removed, the value is null or any.
+ * @param action true if it's being set, false if it's being removed
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean proppatchMethod(String propertyName, String propertyValue,
+ boolean action) throws HttpException, IOException {
+
+ boolean result = proppatchMethod(httpURL.getPath(),
+ propertyName, propertyValue, action);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute PROPATCH method for this WebdavResource.
+ *
+ * @param propertyName the name of the property to set
+ * @param propertyValue the value of the property to set
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ * @deprecated it could be removed after the major version changes
+ */
+ public boolean proppatchMethod(PropertyName propertyName,
+ String propertyValue)
+ throws HttpException, IOException {
+
+ boolean result = proppatchMethod(httpURL.getPath(),
+ propertyName, propertyValue, true);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute PROPATCH method for this resource with the given property.
+ *
+ * @param propertyName the name of the property to set
+ * @param propertyValue the value of the property to set
+ * If the proppatch action is being removed, the value is null or any.
+ * @param action true if it's being set, false if it's being removed
+ * @return true if the method is succeeded
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean proppatchMethod(PropertyName propertyName,
+ String propertyValue, boolean action)
+ throws HttpException, IOException {
+
+ boolean result = proppatchMethod(httpURL.getPath(),
+ propertyName, propertyValue, action);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute PROPATCH method for the given WebdavResource.
+ *
+ * @param path the server relative path of the resource to act on
+ * @param propertyName the property name in "DAV:" namespace
+ * @param propertyValue the property value string
+ * @return true if the method is succeeded
+ * @exception HttpException
+ * @exception IOException
+ * @deprecated it could be removed after the major version changes
+ */
+ public boolean proppatchMethod(String path, String propertyName,
+ String propertyValue) throws HttpException, IOException {
+
+ Hashtable property = new Hashtable();
+ property.put(propertyName, propertyValue);
+ return proppatchMethod(path, property, true);
+ }
+
+
+ /**
+ * Execute PROPATCH method for the specified resource with the given
+ * property.
+ *
+ * @param path the server relative path of the resource to act on
+ * @param propertyName the property name string (in "DAV:" namespace)
+ * @param propertyValue the property value string
+ * If the proppatch action is being removed, the value is null or any.
+ * @param action true if it's to be set, false if it's to be removed
+ * @return true if the method is succeeded
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean proppatchMethod(String path, String propertyName,
+ String propertyValue, boolean action)
+ throws HttpException, IOException {
+
+ Hashtable property = new Hashtable();
+ property.put(propertyName, propertyValue);
+ return proppatchMethod(path, property, action);
+ }
+
+
+ /**
+ * Execute PROPATCH method for the given WebdavResource.
+ *
+ * @param path the server relative path of the resource to act on
+ * @param propertyName the property name.
+ * @param propertyValue the property value.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ * @deprecated it could be removed after the major version changes
+ */
+ public boolean proppatchMethod(String path, PropertyName propertyName,
+ String propertyValue) throws HttpException, IOException {
+
+ Hashtable property = new Hashtable();
+ property.put(propertyName, propertyValue);
+
+ return proppatchMethod(path, property, true);
+ }
+
+
+ /**
+ * Execute PROPATCH method for the given resource with the given
+ * properties.
+ *
+ * @param path the server relative path of the resource to act on
+ * @param propertyName the property name
+ * @param propertyValue the property value string
+ * If the proppatch action is being removed, the value is null or any.
+ * @param action true if it's to be set, false if it's to be removed
+ * @return true if the method is succeeded
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean proppatchMethod(String path, PropertyName propertyName,
+ String propertyValue, boolean action)
+ throws HttpException, IOException {
+
+ Hashtable property = new Hashtable();
+ property.put(propertyName, propertyValue);
+ return proppatchMethod(path, property, action);
+ }
+
+
+ /**
+ * Execute PROPATCH method for this WebdavResource.
+ *
+ * @param properties name and value pairs to set
+ * (name can be a String or PropertyName)
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ * @deprecated it could be removed after the major version changes
+ */
+ public boolean proppatchMethod(Hashtable properties)
+ throws HttpException, IOException {
+
+ boolean result = proppatchMethod(httpURL.getPath(), properties, true);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute PROPATCH method for this resource with the given properties.
+ *
+ * @param properties the name(= <code>String</code> or <code>PropertyName
+ * </code> and value(= <code>String</code>) pairs for proppatch action
+ * If the proppatch action is being removed, the value is null or any.
+ * @param action true if it's being set, false if it's being removed
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean proppatchMethod(Hashtable properties, boolean action)
+ throws HttpException, IOException {
+
+ boolean result = proppatchMethod(httpURL.getPath(), properties, action);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute PROPATCH method for the given WebdavResource.
+ *
+ * @param path the server relative path of the resource to act on
+ * @param properties name and value pairs to set
+ * (name can be a String or PropertyName)
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ * @deprecated it could be removed after the major version changes
+ */
+ public boolean proppatchMethod(String path, Hashtable properties)
+ throws HttpException, IOException {
+
+ return proppatchMethod(path, properties, true);
+ }
+
+
+ /**
+ * Execute PROPATCH method for the specified resource with the given
+ * properties.
+ *
+ * @param path the server relative path of the resource to act on
+ * @param properties the name(= <code>String</code> or <code>PropertyName
+ * </code> and value(= <code>String</code>) pairs for proppatch action
+ * If the proppatch action is being removed, the value is null or any.
+ * @param action true if it's being set, false if it's being removed
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean proppatchMethod(String path, Hashtable properties,
+ boolean action) throws HttpException, IOException {
+
+ setClient();
+ PropPatchMethod method = new PropPatchMethod(URIUtil.encodePath(path));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ Enumeration names = properties.keys();
+ boolean hasSomething = false;
+ if (names.hasMoreElements()) {
+ hasSomething = true;
+ }
+ while (names.hasMoreElements()) {
+ Object item = names.nextElement();
+ if (item instanceof String) {
+ String name = (String) item;
+ String value = (String) properties.get(item);
+ if (action) {
+ method.addPropertyToSet(name, value);
+ } else {
+ method.addPropertyToRemove(name);
+ }
+ } else if (item instanceof PropertyName) {
+ String name = ((PropertyName) item).getLocalName();
+ String namespaceURI = ((PropertyName) item).getNamespaceURI();
+ String value = (String) properties.get(item);
+ if (action) {
+ method.addPropertyToSet(name, value, null, namespaceURI);
+ } else {
+ method.addPropertyToRemove(name, null, namespaceURI);
+ }
+ } else {
+ // unknown type, debug or ignore it
+ }
+ }
+ if (hasSomething) {
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+ // Possbile Status Codes => SC_OK
+ // WebdavStatus.SC_FORBIDDEN, SC_CONFLICT, SC_LOCKED, 507
+ setStatusCode(statusCode);
+ if (statusCode >= 200 && statusCode < 300) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Execute the HEAD method for this WebdavResource.
+ *
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean headMethod()
+ throws HttpException, IOException {
+
+ return headMethod(httpURL.getPathQuery());
+ }
+
+
+ /**
+ * Execute the HEAD method for the given path.
+ *
+ * @param path the server relative path of the resource to request
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean headMethod(String path)
+ throws HttpException, IOException {
+
+ setClient();
+ HeadMethod method = new HeadMethod(URIUtil.encodePathQuery(path));
+
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute the DELETE method for this WebdavResource.
+ *
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean deleteMethod()
+ throws HttpException, IOException {
+
+ boolean result = deleteMethod(httpURL.getPath());
+ if (result) {
+ setExistence(false);
+ }
+
+ return result;
+ }
+
+
+ /**
+ * Execute the DELETE method for the given path.
+ *
+ * @param path the server relative path of the resource to delete
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean deleteMethod(String path)
+ throws HttpException, IOException {
+
+ setClient();
+ DeleteMethod method = new DeleteMethod(URIUtil.encodePath(path));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute the MOVE method for this WebdavReource.
+ *
+ * @param destination the destination to move to as a server relative path
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean moveMethod(String destination)
+ throws HttpException, IOException {
+
+ boolean result = moveMethod(httpURL.getPath(), destination);
+ if (result) {
+ httpURL.setPath(destination);
+ refresh();
+ }
+
+ return result;
+ }
+
+
+ /**
+ * Execute the MOVE method for the given source and destination.
+ *
+ * @param source the source resource as a server relativ path
+ * @param destination the destination to move to as a server relative path
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean moveMethod(String source, String destination)
+ throws HttpException, IOException {
+
+ setClient();
+ MoveMethod method = new MoveMethod(URIUtil.encodePath(source),
+ URIUtil.encodePath(destination));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateIfHeader(method);
+ method.setOverwrite(overwrite);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ // Possbile MOVE Status Codes => SC_CREATED, SC_NO_CONTENT
+ // WebdavStatus.SC_FORBIDDEN, SC_CONFLICT, SC_PRECONDITION_FAILED,
+ // SC_LOCKED, SC_BAD_GATEWAY
+ setStatusCode(statusCode);
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute the COPY method for the given destination path.
+ *
+ * @param destination the destination as a server relative path
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean copyMethod(String destination)
+ throws HttpException, IOException {
+
+ boolean result = copyMethod(httpURL.getPath(), destination);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute the COPY method the given source and destination.
+ *
+ * @param source the source resource as a server relative path
+ * @param destination the destination as a server relative path
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean copyMethod(String source, String destination)
+ throws HttpException, IOException {
+
+ setClient();
+ CopyMethod method = new CopyMethod(URIUtil.encodePath(source),
+ URIUtil.encodePath(destination));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ method.setOverwrite(overwrite);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ // Possbile COPY Status Codes => SC_CREATED, SC_NO_CONTENT
+ // WebdavStatus.SC_FORBIDDEN, SC_CONFLICT, SC_PRECONDITION_FAILED,
+ // SC_LOCKED, SC_BAD_GATEWAY, SC_INSUFFICIENT_STORAGE
+ setStatusCode(statusCode);
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+
+ /**
+ * Execute the MKCOL method for this WebdavResource.
+ *
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean mkcolMethod()
+ throws HttpException, IOException {
+
+ boolean result = mkcolMethod(httpURL.getPath());
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute the MKCOL method for the given path.
+ *
+ * @param path the server relative path at which to create a new collection
+ * resource
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean mkcolMethod(String path)
+ throws HttpException, IOException {
+
+ setClient();
+ MkcolMethod method = new MkcolMethod(URIUtil.encodePath(path));
+
+ generateIfHeader(method);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ // Possbile MKCOL Status Codes => SC_CREATED
+ // WebdavStatus.SC_FORBIDDEN, SC_METHOD_NOT_ALLOWED, SC_CONFLICT,
+ // SC_LOCKED, SC_UNSUPPORTED_MEDIA_TYPE, SC_INSUFFICIENT_STORAGE
+ setStatusCode(statusCode);
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute the LOCK method for this WebdavResource. This method tries to
+ * acquire an exclusive write lock with a timeout of 120 seconds.
+ *
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean lockMethod()
+ throws HttpException, IOException {
+
+ String owner = (httpURL.getUser() != null) ?
+ httpURL.getUser() : defaultOwner;
+
+ boolean result = lockMethod(httpURL.getPath(), owner, 120);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+
+ /**
+ * Execute the LOCK method for this WebdavResource. This method tries to
+ * acquire an exclusive write lock with the given timeout value.
+ *
+ * @param owner the owner string.
+ * @param timeout the timeout
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean lockMethod(String owner, int timeout)
+ throws HttpException, IOException {
+
+ boolean result = lockMethod(httpURL.getPath(), owner, timeout);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute the LOCK method for the given path. This method tries to acquire
+ * an exclusive write lock with a timeout of 120 seconds.
+ *
+ * @param path the server relative path of the resource to lock
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean lockMethod(String path)
+ throws HttpException, IOException {
+
+ String owner = (httpURL.getUser() != null) ?
+ httpURL.getUser() : defaultOwner;
+
+ return lockMethod(path, owner, 120);
+ }
+
+
+ /**
+ * Execute the LOCK method for the given path. This method tries to acquire
+ * an exclusive write lock with the given timeout value.
+ *
+ * @param path the server relative path of the resource to lock
+ * @param owner The owner string.
+ * @param timeout the timeout value.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean lockMethod(String path, String owner, int timeout)
+ throws HttpException, IOException {
+
+ return lockMethod(path, owner, timeout, LockMethod.SCOPE_EXCLUSIVE);
+ }
+
+ /**
+ * Execute the LOCK method for the given path. This method tries to acquire
+ * an exclusive write lock with the given timeout value.
+ *
+ * @param path the server relative path of the resource to lock
+ * @param owner The owner string.
+ * @param timeout the timeout value.
+ * @param locktype, the scope of lock.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean lockMethod(String path, String owner, int timeout, short lockType)
+ throws HttpException, IOException {
+
+ return lockMethod(path, owner, timeout, lockType, DepthSupport.DEPTH_INFINITY);
+ }
+
+
+ /**
+ * Execute the LOCK method for the given path. This method tries to acquire
+ * an exclusive write lock with the given timeout value.
+ *
+ * @param path the server relative path of the resource to lock
+ * @param owner The owner string.
+ * @param timeout the timeout value.
+ * @param locktype, the scope of lock.
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean lockMethod(String path, String owner, int timeout, short lockType, int depth)
+ throws HttpException, IOException {
+
+ setClient();
+
+ if (owner == null) {
+ owner = (httpURL.getUser() != null) ? httpURL.getUser() : defaultOwner;
+ }
+
+ // default lock type setting
+ LockMethod method = new LockMethod(URIUtil.encodePath(path), owner,
+ lockType, timeout);
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ method.setDepth(depth);
+
+ generateIfHeader(method);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+ String lock = method.getLockToken();
+ WebdavState state = (WebdavState) client.getState();
+ if (state != null) {
+ state.addLock(path, lock);
+ }
+ this.owner = method.getOwner();
+
+ // Possbile LOCK Status Codes => SC_OK
+ // WebdavStatus.SC_SC_PRECONDITION_FAILED, SC_LOCKED
+ setStatusCode(statusCode, lock);
+
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute the LOCK method for this WebdavResource.
+ *
+ * @see LockMethod
+ * @deprecated The timeout value MUST NOT be greater than 2^32-1.
+ */
+ public boolean lockMethod(String owner, short timeout)
+ throws HttpException, IOException {
+
+ return lockMethod(owner, (int) timeout);
+ }
+
+
+ /**
+ * Execute the LOCK method for the given path.
+ *
+ * @see LockMethod
+ * @deprecated The timeout value MUST NOT be greater than 2^32-1.
+ */
+ public boolean lockMethod(String path, String owner, short timeout)
+ throws HttpException, IOException {
+
+ return lockMethod(path, owner, (int) timeout);
+ }
+
+ /**
+ * Begins a new transaction.
+ * The transaction handle returned by the WebDAV server will be remembered and included
+ * as a header of subsequent requests until either {@link #commitTransaction()} or {@link #abortTransaction()}
+ * are called. You can retrieve it using {@link #getTransactionHandle()}.
+ *
+ * @param owner the owner of this transaction
+ * @param timeout timeout in milleseconds
+ * @return <code>true</code> if the transaction has been successfully started, <code>false</code> otherwise
+ * @throws IOException if anything goes wrong
+ * @see #commitTransaction()
+ * @see #abortTransaction()
+ * @see #getTransactionHandle()
+ */
+ public boolean startTransaction(String owner, int timeout) throws IOException {
+ String path = httpURL.getPath();
+
+ setClient();
+
+ if (owner == null) {
+ owner = (httpURL.getUser() != null) ? httpURL.getUser() : defaultOwner;
+ }
+
+ // default lock type setting
+ LockMethod method = new LockMethod(path, owner, timeout, true);
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+ String txHandle = method.getLockToken();
+ WebdavState state = (WebdavState) client.getState();
+ if (state != null) {
+ state.setTransactionHandle(txHandle);
+ }
+ this.owner = method.getOwner();
+
+ // Possbile LOCK Status Codes => SC_OK
+ // WebdavStatus.SC_SC_PRECONDITION_FAILED, SC_LOCKED
+ setStatusCode(statusCode, txHandle);
+
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+ /**
+ * Returns the transaction handle set by {@link #startTransaction(String, int)}.
+ *
+ * @return the current transaction handle or <code>null</code> if the client does not operate inside a transaction
+ * @throws IOException if anything goes wrong
+ * @see #startTransaction(String, int)
+ */
+ public String getTransactionHandle() throws IOException {
+ setClient();
+
+ // Get the lock for the given path.
+ WebdavState state = (WebdavState) client.getState();
+ if (state == null) return null;
+ String txHandle = state.getTransactionHandle();
+ return txHandle;
+ }
+
+ /**
+ * Commits the transaction started by {@link #startTransaction(String, int)} and resets the transaction handle.
+ *
+ * @return <code>true</code> if the transaction has been successfully committed, <code>false</code> otherwise
+ * @throws IOException if anything goes wrong
+ * @see #startTransaction(String, int)
+ * @see #abortTransaction()
+ * @see #getTransactionHandle()
+ */
+ public boolean commitTransaction() throws IOException {
+ String path = httpURL.getPath();
+ return endTransaction(path, UnlockMethod.COMMIT_TRANSACTION);
+ }
+
+ /**
+ * Aborts - i.e. rolls back all changes of - the transaction started by {@link #startTransaction(String, int)} and resets the transaction handle.
+ *
+ * @return <code>true</code> if the transaction has been successfully committed, <code>false</code> otherwise
+ * @throws IOException if anything goes wrong
+ * @see #startTransaction(String, int)
+ * @see #abortTransaction()
+ * @see #getTransactionHandle()
+ */
+ public boolean abortTransaction() throws IOException {
+ String path = httpURL.getPath();
+ return endTransaction(path, UnlockMethod.ABORT_TRANSACTION);
+ }
+
+ protected boolean endTransaction(String path, int transactionStatus) throws IOException {
+ setClient();
+
+ // Get the lock for the given path.
+ WebdavState state = (WebdavState) client.getState();
+ if (state == null) return false;
+ String txHandle = state.getTransactionHandle();
+ if (txHandle == null) return false;
+ UnlockMethod method = new UnlockMethod(path, txHandle, transactionStatus);
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+ if (statusCode >= 200 && statusCode < 300) {
+ state.setTransactionHandle(null);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Execute the Unlock method for this WebdavResource.
+ *
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean unlockMethod() throws HttpException, IOException {
+
+ String owner = (httpURL.getUser() != null) ?
+ httpURL.getUser() : defaultOwner;
+
+ boolean result = unlockMethod(httpURL.getPath(), owner);
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute the Unlock method for the given path.
+ *
+ * @param path the server relative path of the resource to unlock
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean unlockMethod(String path)
+ throws HttpException, IOException {
+
+ String owner = (httpURL.getUser() != null) ?
+ httpURL.getUser() : defaultOwner;
+
+ return unlockMethod(path, owner);
+ }
+
+
+ /**
+ * Execute the Unlock method for the given path.
+ *
+ * @param path the server relative path of the resource to unlock
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean unlockMethod(String path, String owner)
+ throws HttpException, IOException {
+
+ setClient();
+
+ if (owner == null) {
+ owner = (httpURL.getUser() != null) ? httpURL.getUser() : defaultOwner;
+ }
+
+ // Get the lock for the given path.
+ WebdavState state = (WebdavState) client.getState();
+ // Discover the locktoken from the given lock owner
+
+ state = discoverLock(owner, path, state);
+ String lock = state.getLock(path);
+ if (lock == null) return false;
+ // unlock for the given path.
+ UnlockMethod method = new UnlockMethod(URIUtil.encodePath(path));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ generateTransactionHeader(method);
+ method.setLockToken(lock);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+ if (statusCode >= 200 && statusCode < 300) {
+ state.removeLocks(path);
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Discover and refresh lock tokens.
+ *
+ * @exception HttpException
+ * @exception IOException
+ */
+ public void discoverOwnLocks()
+ throws HttpException, IOException {
+
+ setClient();
+ String owner = (httpURL.getUser() != null) ?
+ httpURL.getUser() : defaultOwner;
+
+ WebdavState state = (WebdavState) client.getState();
+ state = discoverLock(owner, httpURL.getPath(), state);
+ client.setState(state);
+ }
+
+
+ /**
+ * Discover and refresh lock tokens for a specific owner.
+ *
+ * @param owner the owner who's locks are to be discovered.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public void discoverOwnLocks(String owner)
+ throws HttpException, IOException {
+
+ setClient();
+
+ WebdavState state = (WebdavState) client.getState();
+ state = discoverLock(owner, httpURL.getPath(), state);
+ client.setState(state);
+ }
+
+
+ /**
+ * Discover the given owner and locktoken and set the locktoken
+ *
+ * @param owner the activelock owner
+ * @param path the server relative path of the resource to request
+ * @param state the state to save the locktoken
+ * @return state probably having lock information renewly
+ */
+ protected WebdavState discoverLock(String owner, String path,
+ WebdavState state) {
+ try {
+ lockDiscovery=lockDiscoveryPropertyFindMethod(path);
+ } catch (Exception e) {
+ return state;
+ }
+
+
+ if (lockDiscovery == null) return state;
+ Lock[] activeLocks = lockDiscovery.getActiveLocks();
+
+ if (activeLocks == null) return state;
+ for (int i = 0; i < activeLocks.length; i++) {
+ String activeLockOwner = activeLocks[i].getOwner();
+ if (activeLockOwner.equals(owner)) {
+ String locktoken = activeLocks[i].getLockToken();
+ state.addLock(path, locktoken);
+ }
+ }
+ return state;
+ }
+
+
+ /**
+ * Update this resource to the specified target
+ *
+ * @param target the path of the history element to update this resource
+ * from
+ * @return true if the method has succeeded
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean updateMethod(String target)
+ throws HttpException, IOException {
+
+ return updateMethod(httpURL.getPath(), target);
+ }
+
+
+ /**
+ * Update the specified resource to the specified target
+ *
+ * @param path the server relative path of the resource to update
+ * @param target path of the target to update from (history resource)
+ * @return true if the method has succeeded
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean updateMethod(String path, String target)
+ throws HttpException, IOException {
+
+ setClient();
+ UpdateMethod method = new UpdateMethod(URIUtil.encodePath(path),
+ URIUtil.encodePath(target));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ public boolean versionControlMethod(String path)
+ throws HttpException, IOException {
+
+ setClient();
+
+ VersionControlMethod method = new VersionControlMethod(
+ URIUtil.encodePath(path));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateIfHeader(method);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ public boolean versionControlMethod(String path, String target)
+ throws HttpException, IOException {
+
+ setClient();
+
+ VersionControlMethod method = new VersionControlMethod(
+ URIUtil.encodePath(path),
+ URIUtil.encodePath(target));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute the MKWORKSPACE method for this WebdavResource.
+ *
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean mkWorkspaceMethod()
+ throws HttpException, IOException {
+
+ boolean result = mkWorkspaceMethod(httpURL.getPath());
+ if (result) refresh();
+
+ return result;
+ }
+
+
+ /**
+ * Execute the MKCOL method for the given path.
+ *
+ * @param path the server relative path at which to create a new workspace
+ * resource
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean mkWorkspaceMethod(String path)
+ throws HttpException, IOException {
+
+ setClient();
+ MkWorkspaceMethod method =
+ new MkWorkspaceMethod(URIUtil.encodePath(path));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateIfHeader(method);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ // Possbile MKCOL Status Codes => SC_CREATED
+ // WebdavStatus.SC_FORBIDDEN, SC_METHOD_NOT_ALLOWED, SC_CONFLICT,
+ // SC_LOCKED, SC_UNSUPPORTED_MEDIA_TYPE, SC_INSUFFICIENT_STORAGE
+
+ setStatusCode(statusCode);
+
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ // -------------------------------------------------------- Basic Methods
+
+
+ /**
+ * Compare to the WebdavResource object.
+ *
+ * @param another the other WebdavResource object
+ * @return the value 0 if the argument is equal.
+ */
+ public int compareToWebdavResource(WebdavResource another) {
+
+ try {
+ HttpURL anotherUrl = another.getHttpURL();
+
+ String thisHost = httpURL.getHost();
+ String anotherHost= anotherUrl.getHost();
+ if (!thisHost.equalsIgnoreCase(anotherHost))
+ return thisHost.compareTo(anotherHost);
+
+ int thisPort = httpURL.getPort();
+ int anotherPort= anotherUrl.getPort();
+ if (thisPort != anotherPort)
+ return (thisPort < anotherPort) ? -1 : 1;
+
+ boolean thisCollection = isCollection();
+ boolean anotherCollection = another.isCollection();
+ if (thisCollection && !anotherCollection)
+ return -1;
+ if (anotherCollection && !thisCollection)
+ return 1;
+
+ String thisPath = httpURL.getPathQuery();
+ String anotherPath= anotherUrl.getPathQuery();
+ return thisPath.compareTo(anotherPath);
+ } catch (Exception e) {
+ // FIXME: not to return 0.
+ }
+
+ return 0;
+ }
+
+
+ /**
+ * Compare to the given another object.
+ *
+ * @param another the other WebdavResource object
+ * @return the value 0 if another is equal.
+ */
+ public int compareTo(Object another) {
+
+ if ((another != null) && (another instanceof WebdavResource)) {
+ return compareToWebdavResource((WebdavResource) another);
+ }
+
+ String thisUrl = toString();
+ String anotherUrl = another.toString();
+
+ return thisUrl.compareTo(anotherUrl);
+ }
+
+
+ /**
+ * Test the object.
+ *
+ * @param obj the other object
+ * @return true if it's equal.
+ */
+ public boolean equals(Object obj) {
+
+ if ((obj != null) && (obj instanceof WebdavResource)) {
+ return compareTo(obj) == 0;
+ }
+ return false;
+ }
+
+
+ /**
+ * Return the http URL string.
+ *
+ * @return the http URL string.
+ */
+ public String toString() {
+ return httpURL.toString();
+ }
+
+
+ /**
+ * Execute the CHECKIN method for this WebdavResource.
+ *
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean checkinMethod()
+ throws HttpException, IOException {
+
+ return checkinMethod(httpURL.getPath());
+ }
+
+
+ /**
+ * Execute the CHECKIN method for the given path.
+ *
+ * @param path the server relative path of the resource to check in
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean checkinMethod(String path)
+ throws HttpException, IOException {
+
+ setClient();
+ CheckinMethod method = new CheckinMethod(URIUtil.encodePath(path));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute the CHECKOUT method for this WebdavResource.
+ *
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean checkoutMethod()
+ throws HttpException, IOException {
+
+ return checkoutMethod(httpURL.getPath());
+ }
+
+
+ /**
+ * Execute the CHECKOUT method for the given path.
+ *
+ * @param path the server relative path of the resource to check out
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean checkoutMethod(String path)
+ throws HttpException, IOException {
+
+ setClient();
+ CheckoutMethod method = new CheckoutMethod(URIUtil.encodePath(path));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+
+ /**
+ * Execute the CHECKOUT method for this WebdavResource.
+ *
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean uncheckoutMethod()
+ throws HttpException, IOException {
+
+ return uncheckoutMethod(httpURL.getPath());
+ }
+
+
+
+
+ /**
+ * Execute the CHECKOUT method for the given path.
+ *
+ * @param path the server relative path of the resource to act on
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean uncheckoutMethod(String path)
+ throws HttpException, IOException {
+
+ setClient();
+ UncheckoutMethod method =
+ new UncheckoutMethod(URIUtil.encodePath(path));
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ generateIfHeader(method);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ setStatusCode(statusCode);
+
+ return (statusCode >= 200 && statusCode < 300) ? true : false;
+ }
+
+ /**
+ * Create a new WebdavResource object (as a seperate method so that it can
+ * be overridden by subclasses.
+ *
+ * @param client HttpClient to be used by this webdavresource.
+ * @return A new WebdavResource object.
+ */
+ protected WebdavResource createWebdavResource(HttpClient client) {
+ WebdavResource resource = new WebdavResource(client);
+ resource.setProxy(proxyHost, proxyPort);
+ resource.setProxyCredentials(proxyCredentials);
+ return resource;
+ }
+
+ /**
+ * Process a property, setting various member variables depending
+ * on what the property is.
+ *
+ * @param property The property to process.
+ */
+ protected void processProperty(Property property) {
+ if (property.getLocalName().equals(DISPLAYNAME)) {
+ displayName = property.getPropertyAsString();
+ }
+ else if (property.getLocalName().equals(GETCONTENTLENGTH)) {
+ String getContentLength = property.getPropertyAsString();
+ setGetContentLength(getContentLength);
+ }
+ else if (property.getLocalName().equals(RESOURCETYPE)) {
+ ResourceTypeProperty resourceType =
+ (ResourceTypeProperty) property;
+ setResourceType(resourceType);
+ }
+ else if (property.getLocalName().equals(GETCONTENTTYPE)) {
+ String getContentType = property.getPropertyAsString();
+ setGetContentType(getContentType);
+ }
+ else if (property.getLocalName().equals(GETLASTMODIFIED)) {
+ String getLastModified = property.getPropertyAsString();
+ setGetLastModified(getLastModified);
+ }
+ else if (property.getLocalName().equals(CREATIONDATE)) {
+ String creationDate = property.getPropertyAsString();
+ setCreationDate(creationDate);
+ }
+ else if (property.getLocalName().equals(GETETAG)) {
+ String getEtag = property.getPropertyAsString();
+ setGetEtag(getEtag);
+ }
+ else if (property.getLocalName().equals(ISHIDDEN)) {
+ String isHidden = property.getPropertyAsString();
+ setIsHidden(isHidden);
+ }
+ else if (property.getLocalName().equals(ISCOLLECTION)) {
+ String isCollection = property.getPropertyAsString();
+ setIsCollection(isCollection);
+ }
+ else if (property.getLocalName().equals(SUPPORTEDLOCK)) {
+ String supportedLock = property.getPropertyAsString();
+ setSupportedLock(supportedLock);
+ }
+ else if (property.getLocalName().equals(LOCKDISCOVERY)) {
+ LockDiscoveryProperty lockDiscovery =
+ (LockDiscoveryProperty) property;
+ setLockDiscovery(lockDiscovery);
+ }
+ }
+
+
+ /**
+ * Execute REPORT method.
+ * This method is for the special Access Control Reports:
+ * - acl-principal-prop-set (not supported yet)
+ * - principal-match (not supported yet)
+ * - principal-property-search
+ * - principal-search-property-set (not supported yet)
+ *
+ * @param path the server relative path of the resource to request
+ * @param properties The named properties.
+ * @return an enumeration of <code>ResponseEntity</code>
+ * @exception HttpException
+ * @exception IOException
+ */
+ public Enumeration aclReportMethod(
+ String path,
+ Collection properties,
+ int reportType)
+ throws HttpException, IOException {
+
+ setClient();
+ AclReportMethod method =
+ new AclReportMethod(
+ URIUtil.encodePath(path),
+ properties,
+ DepthSupport.DEPTH_0,
+ reportType);
+
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int status = client.executeMethod(method);
+
+ // Set status code for this resource.
+ if (thisResource == true) {
+ // Set the status code.
+ setStatusCode(method.getStatusLine().getStatusCode());
+ }
+
+ //slide/tamino delivers status code OK.
+ //can be removed when the server sends MULTI_STATUS
+ if (status != HttpStatus.SC_MULTI_STATUS && status != HttpStatus.SC_OK) {
+ HttpException ex = new HttpException();
+ ex.setReasonCode(status);
+ throw ex;
+ }
+ thisResource = false;
+
+ return method.getResponses();
+ }
+
+
+ /**
+ * Execute the BIND method for this WebdavResource, given
+ * an existing path to bind with.
+ *
+ * @param newBinding the new binding as a server relative path
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setOverwrite(boolean)
+ */
+ public boolean bindMethod(String newBinding)
+ throws HttpException, IOException {
+ return bindMethod(httpURL.getPath(), newBinding);
+ }
+
+ /**
+ * Execute the BIND method given the new path to bind to an existing path.
+ *
+ * @param existingBinding the existing binding as a server relative path
+ * @param newBinding the new binding as a server relative path
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setOverwrite(boolean)
+ */
+ public boolean bindMethod(String existingBinding, String newBinding)
+ throws HttpException, IOException {
+
+ setClient();
+ BindMethod method =
+ new BindMethod(URIUtil.encodePath(existingBinding),
+ URIUtil.encodePath(newBinding));
+ method.setDebug(debug);
+ method.setOverwrite(overwrite);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ // Possbile BIND Status Codes => SC_CREATED, SC_NO_CONTENT
+ // SC_FORBIDDEN, SC_CONFLICT, SC_PRECONDITION_FAILED,
+ // SC_LOCKED, SC_BAD_GATEWAY, SC_INSUFFICIENT_STORAGE,
+ // SC_LOOP_DETECTED
+ setStatusCode(statusCode);
+ return statusCode >= 200 && statusCode < 300;
+ }
+
+ /**
+ * Execute the UNBIND method for this WebdavResource.
+ *
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean unbindMethod() throws HttpException, IOException {
+ boolean result = unbindMethod(httpURL.getPath());
+ if (result) {
+ setExistence(false);
+ }
+
+ return result;
+ }
+
+ /**
+ * Execute the UNBIND method given the resource to Unbind.
+ *
+ * @param binding the server relative path of the resource to unbind
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ */
+ public boolean unbindMethod(String binding)
+ throws HttpException, IOException {
+
+ setClient();
+ UnbindMethod method =
+ new UnbindMethod(URIUtil.encodePath(binding));
+ method.setDebug(debug);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ // Possbile BIND Status Codes => SC_CREATED, SC_NOT_FOUND
+ // WebdavStatus.SC_FORBIDDEN, SC_CONFLICT, SC_PRECONDITION_FAILED,
+ // SC_LOCKED, SC_BAD_GATEWAY
+ setStatusCode(statusCode);
+ return statusCode >= 200 && statusCode < 300;
+ }
+
+ /**
+ * Execute the Rebind method for this WebdavResource given the new
+ * Resource to bind with.
+ * The REBIND method removes a binding to a resource from one collection,
+ * and adds a binding to that resource into another collection. It is
+ * effectively an atomic form of a MOVE request.
+ *
+ * @param newBinding the new binding as a server relative path
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setOverwrite(boolean)
+ */
+ public boolean rebindMethod(String newBinding)
+ throws HttpException, IOException {
+ boolean result = rebindMethod(httpURL.getPath(), newBinding);
+ if (result) {
+ httpURL.setPath(newBinding);
+ refresh();
+ }
+
+ return result;
+ }
+
+ /**
+ * Execute the Rebind method given a resource to rebind and the new
+ * Resource to bind with.
+ * The REBIND method removes a binding to a resource from one collection,
+ * and adds a binding to that resource into another collection. It is
+ * effectively an atomic form of a MOVE request
+ *
+ * @param existingBinding the existing binding as a server relative path
+ * @param newBinding the new binding as a server relative path
+ * @return true if the method is succeeded.
+ * @exception HttpException
+ * @exception IOException
+ * @see #setOverwrite(boolean)
+ */
+ public boolean rebindMethod(String existingBinding, String newBinding)
+ throws HttpException, IOException {
+
+ setClient();
+ RebindMethod method =
+ new RebindMethod(URIUtil.encodePath(existingBinding),
+ URIUtil.encodePath(newBinding));
+ method.setDebug(debug);
+ method.setOverwrite(overwrite);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+ int statusCode = client.executeMethod(method);
+
+ // Possbile BIND Status Codes => SC_CREATED, SC_NO_CONTENT
+ // WebdavStatus.SC_FORBIDDEN, SC_CONFLICT, SC_PRECONDITION_FAILED,
+ // SC_LOCKED, SC_BAD_GATEWAY, SC_INSUFFICIENT_STORAGE,
+ // SC_LOOP_DETECTED
+ setStatusCode(statusCode);
+ return statusCode >= 200 && statusCode < 300;
+ }
+
+ /**
+ * Subscribes for notifications for modifications of WebDAV resources.
+ *
+ * @param path URL path of the resource that is to be subscribed
+ * @param notificationType
+ * @param callback the URL to be registered for notification, may be
+ * <code>null</code> if no callback shall be registered.
+ * @param notificationDelay
+ * @param depth the depth of the subscription (for valid values see
+ * {@link DepthSupport})
+ * @param lifetime duration of that subscription in seconds (Note: the
+ * server may change this and return an other one;
+ * see {@link Subscription#getLifetime()}.
+ *
+ * @return a {@link Subscription} or <code>null</code> if an error occurs
+ * @throws HttpException
+ * @throws IOException
+ */
+ public Subscription subscribeMethod(String path,
+ String notificationType,
+ String callback,
+ long notificationDelay,
+ int depth,
+ long lifetime)
+ throws HttpException, IOException
+ {
+ setClient();
+
+ SubscribeMethod method = new SubscribeMethod(path);
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ method.setCallback(callback);
+ method.setDepth(depth);
+ method.setSubsciptionLifetime(lifetime);
+ method.setNotificationType(notificationType);
+ method.setNotificationDelay(notificationDelay);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+
+ int statusCode = client.executeMethod(method);
+
+ if (statusCode == HttpStatus.SC_OK) {
+ return new Subscription(
+ path,
+ method.getResponsedSubscriptionId(),
+ method.getCallback(),
+ method.getResponsedSubscriptionLifetime(),
+ method.getResponsedContentLocation(),
+ method.getNotificationType()
+ );
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Refreshes a subscription.
+ *
+ * @return <code>true</code> on success.
+ */
+ public boolean subscribeMethod(String path, int subscriptionId)
+ throws HttpException, IOException
+ {
+ setClient();
+
+ SubscribeMethod method = new SubscribeMethod(path);
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ method.setSubscriptionId(subscriptionId);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+
+ int statusCode = client.executeMethod(method);
+
+ if (statusCode == HttpStatus.SC_OK) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Refreshes a subscription.
+ *
+ * @param subscription The subscription to be refreshed.
+ * @return <code>true</code> on success
+ */
+ public boolean subscribeMethod(Subscription subscription)
+ throws HttpException, IOException
+ {
+ return subscribeMethod(subscription.getPath(), subscription.getId());
+ }
+
+ /**
+ * Cancels a subscription.
+ * @param path URL path for that was subscribed
+ * @return <code>true</code> on success
+ */
+ public boolean unsubscribeMethod(String path, int subscriptionId)
+ throws HttpException, IOException
+ {
+ setClient();
+
+ UnsubscribeMethod method = new UnsubscribeMethod(path);
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ method.addSubscriptionId(subscriptionId);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+
+ int statusCode = client.executeMethod(method);
+
+ if (statusCode == HttpStatus.SC_OK) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ /**
+ * Cancels a subscription.
+ * @param subscription
+ * @return <code>true</code> on success
+ */
+ public boolean unsubscribeMethod(Subscription subscription)
+ throws HttpException, IOException
+ {
+ return unsubscribeMethod(subscription.getPath(),subscription.getId());
+ }
+
+ /**
+ * Asks the server whether events for a given subscription are fired.
+ * @param contentLocation URL path returned by the SUBSCRIBE methods
+ * Content-Location header
+ * @param subscriptionId id of the subscription
+ * @return <code>true</code> if an event was fired
+ */
+ public boolean pollMethod(String contentLocation, int subscriptionId)
+ throws HttpException, IOException
+ {
+ setClient();
+
+ PollMethod method = new PollMethod(contentLocation);
+ method.setDebug(debug);
+ method.setFollowRedirects(this.followRedirects);
+
+ method.addSubscriptionId(subscriptionId);
+ generateTransactionHeader(method);
+ generateAdditionalHeaders(method);
+
+ int statusCode = client.executeMethod(method);
+
+ if (statusCode == HttpStatus.SC_MULTI_STATUS) {
+ return method.getSubscriptionsWithEvents().size() > 0;
+ } else {
+ return false;
+ }
+ }
+ /**
+ * Asks the server whether events for a given subscription are fired.
+ * @param subscription the subscription to ask for
+ * @return <code>true</code> if an event was fired
+ */
+ public boolean pollMethod(Subscription subscription)
+ throws HttpException, IOException
+ {
+ return pollMethod(subscription.getContentLocation(), subscription.getId());
+ }
+
+
+
+ private static String getName(String uri, boolean decode) {
+ String escapedName = URIUtil.getName(
+ uri.endsWith("/") ? uri.substring(0, uri.length() - 1): uri);
+ if (decode) {
+ try {
+ return URIUtil.decode(escapedName);
+ } catch (URIException e) {
+ // Oh well
+ }
+ }
+ return escapedName;
+ }
+
+ /**
+ * Unescape octets for some characters that a server might (but should not)
+ * have escaped. These are: "-", "_", ".", "!", "~", "*", "'", "(", ")"
+ * Look at section 2.3 of RFC 2396.
+ */
+ private static String decodeMarks(String input) {
+ char[] sequence = input.toCharArray();
+ StringBuffer decoded = new StringBuffer(sequence.length);
+ for (int i = 0; i < sequence.length; i++) {
+ if (sequence[i] == '%' && i < sequence.length - 2) {
+ switch (sequence[i + 1]) {
+ case '2':
+ switch (sequence[i + 2]) {
+ case 'd':
+ case 'D':
+ decoded.append('-');
+ i += 2;
+ continue;
+ case 'e':
+ case 'E':
+ decoded.append('.');
+ i += 2;
+ continue;
+ case '1':
+ decoded.append('!');
+ i += 2;
+ continue;
+ case 'a':
+ case 'A':
+ decoded.append('*');
+ i += 2;
+ continue;
+ case '7':
+ decoded.append('\'');
+ i += 2;
+ continue;
+ case '8':
+ decoded.append('(');
+ i += 2;
+ continue;
+ case '9':
+ decoded.append(')');
+ i += 2;
+ continue;
+ }
+ break;
+ case '5':
+ switch (sequence[i + 2]) {
+ case 'f':
+ case 'F':
+ decoded.append('_');
+ i += 2;
+ continue;
+ }
+ break;
+ case '7':
+ switch (sequence[i + 2]) {
+ case 'e':
+ case 'E':
+ decoded.append('~');
+ i += 2;
+ continue;
+ }
+ break;
+ }
+ }
+ decoded.append(sequence[i]);
+ }
+ return decoded.toString();
+ }
+}
Added: apache-slide/2.1.jdk15-brew/src/jakarta-slide-webdavclient-3.0-compat.patch
===================================================================
--- apache-slide/2.1.jdk15-brew/src/jakarta-slide-webdavclient-3.0-compat.patch (rev 0)
+++ apache-slide/2.1.jdk15-brew/src/jakarta-slide-webdavclient-3.0-compat.patch 2009-05-07 21:09:36 UTC (rev 27140)
@@ -0,0 +1,21 @@
+--- ./commandline/src/java/org/apache/webdav/cmd/Slide.java.sav 2006-04-21 10:32:26.000000000 -0400
++++ ./commandline/src/java/org/apache/webdav/cmd/Slide.java 2006-04-21 10:38:01.000000000 -0400
+@@ -23,8 +23,7 @@
+
+ package org.apache.webdav.cmd;
+
+-
+-import org.apache.commons.httpclient.contrib.ssl.*;
++import org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory;
+ import org.apache.commons.httpclient.protocol.Protocol;
+
+
+@@ -79,7 +78,7 @@
+ case 's':
+ Protocol.registerProtocol("https",
+ new Protocol("https",
+- new EasySSLProtocolSocketFactory(),
++ new SSLProtocolSocketFactory(),
+ 443));
+ break;
+ default:
Added: apache-slide/2.1.jdk15-brew/src/jakarta-slide-webdavclient-src-2.1.tar.gz
===================================================================
(Binary files differ)
Property changes on: apache-slide/2.1.jdk15-brew/src/jakarta-slide-webdavclient-src-2.1.tar.gz
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
More information about the jboss-cvs-commits
mailing list