OC-1867: Remove package eu.alefzero.webdav
[pub/Android/ownCloud.git] / src / com / owncloud / android / operations / remote / CreateRemoteFolderOperation.java
index 6d417d0..7e02afe 100644 (file)
@@ -1,20 +1,81 @@
 package com.owncloud.android.operations.remote;
 
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.jackrabbit.webdav.client.methods.MkColMethod;
+
+import com.owncloud.android.Log_OC;
+import com.owncloud.android.network.webdav.WebdavClient;
+import com.owncloud.android.network.webdav.WebdavUtils;
 import com.owncloud.android.operations.RemoteOperation;
 import com.owncloud.android.operations.RemoteOperationResult;
+import com.owncloud.android.utils.FileStorageUtils;
 
-import eu.alefzero.webdav.WebdavClient;
 
+/**
+ * Remote operation performing the creation of a new folder in the ownCloud server.
+ * 
+ * @author David A. Velasco 
+ * @author masensio
+ *
+ */
 public class CreateRemoteFolderOperation extends RemoteOperation {
+    
+    private static final String TAG = CreateRemoteFolderOperation.class.getSimpleName();
 
-    public CreateRemoteFolderOperation() {
-        // TODO Auto-generated constructor stub
+    private static final int READ_TIMEOUT = 10000;
+    private static final int CONNECTION_TIMEOUT = 5000;
+    
+    protected String mRemotePath;
+    protected boolean mCreateFullPath;
+    
+    /**
+     * Contructor
+     * 
+     * @param remotePath            Full path to the new directory to create in the remote server.
+     * @param createFullPath        'True' means that all the ancestor folders should be created if don't exist yet.
+     */
+    public CreateRemoteFolderOperation(String remotePath, boolean createFullPath) {
+        mRemotePath = remotePath;
+        mCreateFullPath = createFullPath;
     }
 
+    /**
+     * Performs the operation
+     * 
+     * @param   client      Client object to communicate with the remote ownCloud server.
+     */
     @Override
     protected RemoteOperationResult run(WebdavClient client) {
-        // TODO Auto-generated method stub
-        return null;
+        RemoteOperationResult result = null;
+        MkColMethod mkcol = null;
+        
+        try {
+            mkcol = new MkColMethod(client.getBaseUri() + WebdavUtils.encodePath(mRemotePath));
+            int status =  client.executeMethod(mkcol, READ_TIMEOUT, CONNECTION_TIMEOUT);
+            if (!mkcol.succeeded() && mkcol.getStatusCode() == HttpStatus.SC_CONFLICT && mCreateFullPath) {
+                result = createParentFolder(FileStorageUtils.getParentPath(mRemotePath), client);
+                status = client.executeMethod(mkcol, READ_TIMEOUT, CONNECTION_TIMEOUT);    // second (and last) try
+            }
+            
+            result = new RemoteOperationResult(mkcol.succeeded(), status, mkcol.getResponseHeaders());
+            Log_OC.d(TAG, "Create directory " + mRemotePath + ": " + result.getLogMessage());
+            client.exhaustResponse(mkcol.getResponseBodyAsStream());
+                
+        } catch (Exception e) {
+            result = new RemoteOperationResult(e);
+            Log_OC.e(TAG, "Create directory " + mRemotePath + ": " + result.getLogMessage(), e);
+            
+        } finally {
+            if (mkcol != null)
+                mkcol.releaseConnection();
+        }
+        return result;
     }
 
+    
+    private RemoteOperationResult createParentFolder(String parentPath, WebdavClient client) {
+        RemoteOperation operation = new CreateRemoteFolderOperation(  parentPath,
+                                                                mCreateFullPath);
+        return operation.execute(client);
+    }
 }