Added a new collection class. Added a method to retrieve list of files
authorFuad Muhic <fmuhic@capeannenterprises.com>
Mon, 4 Dec 2017 15:23:29 +0000 (16:23 +0100)
committerFuad Muhic <fmuhic@capeannenterprises.com>
Mon, 4 Dec 2017 15:23:29 +0000 (16:23 +0100)
and folders in a collection.
Arvados-DCO-1.1-Signed-off-by: Fuad Muhic <fmuhic@capeannenterprises.com>

sdk/R/.RData
sdk/R/DESCRIPTION
sdk/R/R/Arvados.R
sdk/R/R/Collection.R [new file with mode: 0644]
sdk/R/R/HttpParser.R
sdk/R/R/arvados_objects.R

index 2b5f989a1604d9e79c4c5bd9f85fdca042c5b2f9..1e0b193a52ad7cf1c5978647b0e71ab44b5dd3ff 100644 (file)
Binary files a/sdk/R/.RData and b/sdk/R/.RData differ
index c6afbbb6959712d4a60094d79adc5c576caecdfe..cc46f65bfa942a88a5765a64cfa5a8988864345e 100644 (file)
@@ -13,4 +13,6 @@ RoxygenNote: 6.0.1.9000
 Imports:
     httr,
     stringr,
-    jsonlite
+    jsonlite,
+    curl,
+    XML
index 8b3b40bb2478dfbbe1e7b7bdfec9502d99f79af4..d502b8dabe93f830054040f70f97f4bdeb31598a 100644 (file)
@@ -1,5 +1,6 @@
 source("./R/HttpRequest.R")
 source("./R/HttpParser.R")
+source("./R/custom_classes.R")
 
 #' Arvados SDK Object
 #'
@@ -14,16 +15,16 @@ Arvados <- setRefClass(
     "Arvados",
 
     fields = list(
-        token = "character",
-        host  = "character"
+        token = "ANY",
+        host  = "ANY"
     ),
 
     methods = list(
 
-        initialize = function(auth_token, host_name
+        initialize = function(auth_token = NULL, host_name = NULL
         {
             version <- "v1"
-            #Todo(Fudo): Validate token
+            #Todo(Fudo): Set environment variables
             token <<- auth_token
             host  <<- paste0("https://", host_name, "/arvados/", version, "/")
         }
diff --git a/sdk/R/R/Collection.R b/sdk/R/R/Collection.R
new file mode 100644 (file)
index 0000000..037f711
--- /dev/null
@@ -0,0 +1,108 @@
+source("./R/Arvados.R")
+source("./R/HttpParser.R")
+
+#' Collection Object
+#' 
+#' @details 
+#' Todo: Update description
+#' Collection
+#' 
+#' @param uuid Object ID
+#' @param etag Object version
+#' @param owner_uuid No description
+#' @param created_at No description
+#' @param modified_by_client_uuid No description
+#' @param modified_by_user_uuid No description
+#' @param modified_at No description
+#' @param portable_data_hash No description
+#' @param replication_desired No description
+#' @param replication_confirmed_at No description
+#' @param replication_confirmed No description
+#' @param updated_at No description
+#' @param manifest_text No description
+#' @param name No description
+#' @param description No description
+#' @param properties No description
+#' @param delete_at No description
+#' @param file_names No description
+#' @param trash_at No description
+#' @param is_trashed No description
+#' 
+#' @export
+Collection <- setRefClass(
+
+    "Collection",
+
+    #NOTE(Fudo): Fix types!
+    fields = list(uuid                     = "ANY",
+                  items                    = "ANY",
+                  etag                     = "ANY",
+                  owner_uuid               = "ANY",
+                  created_at               = "ANY",
+                  modified_by_client_uuid  = "ANY",
+                  modified_by_user_uuid    = "ANY",
+                  modified_at              = "ANY",
+                  portable_data_hash       = "ANY",
+                  replication_desired      = "ANY",
+                  replication_confirmed_at = "ANY",
+                  replication_confirmed    = "ANY",
+                  updated_at               = "ANY",
+                  manifest_text            = "ANY",
+                  name                     = "ANY",
+                  description              = "ANY",
+                  properties               = "ANY",
+                  delete_at                = "ANY",
+                  file_names               = "ANY",
+                  trash_at                 = "ANY",
+                  is_trashed               = "ANY",
+                  arvados_api              = "Arvados"
+    ),
+
+    methods = list(
+
+        initialize = function(api, uuid) 
+        {
+            arvados_api <<- api
+            result <- arvados_api$collection_get(uuid)
+            
+            uuid                     <<- result$uuid                               
+            etag                     <<- result$etag                               
+            owner_uuid               <<- result$owner_uuid                         
+            created_at               <<- result$created_at                         
+            modified_by_client_uuid  <<- result$modified_by_client_uuid            
+            modified_by_user_uuid    <<- result$modified_by_user_uuid              
+            modified_at              <<- result$modified_at                        
+            portable_data_hash       <<- result$portable_data_hash                 
+            replication_desired      <<- result$replication_desired                
+            replication_confirmed_at <<- result$replication_confirmed_at           
+            replication_confirmed    <<- result$replication_confirmed              
+            updated_at               <<- result$updated_at                         
+            manifest_text            <<- result$manifest_text                      
+            name                     <<- result$name                               
+            description              <<- result$description                        
+            properties               <<- result$properties                         
+            delete_at                <<- result$delete_at                          
+            file_names               <<- result$file_names                         
+            trash_at                 <<- result$trash_at                           
+            is_trashed               <<- result$is_trashed                         
+
+            items  <<- getCollectionContent()
+        },
+
+        getCollectionContent = function()
+        {
+            #IMPORTANT(Fudo): This url is hardcoded for now. Fix it later.
+            uri <- URLencode("https://collections.4xphq.arvadosapi.com/c=4xphq-4zz18-9d5b0qm4fgijeyi/_/")
+
+            # fetch directory listing via curl and parse XML response
+            h <- curl::new_handle()
+            curl::handle_setopt(h, customrequest = "PROPFIND")
+
+            #IMPORTANT(Fudo): Token is hardcoded as well. Write it properly.
+            curl::handle_setheaders(h, "Authorization" = paste("OAuth2 4invqy35tf70t7hmvdc83ges8ug9cklhgqq1l8gj2cjn18teuq"))
+            response <- curl::curl_fetch_memory(uri, h)
+
+            HttpParser()$parseWebDAVResponse(response, uri)
+        }
+    )
+)
index 09304fc59928c4dcd469f37dbf1795d9ca3c8444..ebe7d8c636d28b26132f4d3da965a709753b380f 100644 (file)
@@ -17,6 +17,23 @@ HttpParser <- setRefClass(
             parsed_response <- httr::content(server_response, as = "parsed", type = "application/json")
 
             #Todo(Fudo): Create new Collection object and populate it
+        },
+
+        parseWebDAVResponse = function(response, uri)
+        {
+            #Todo(Fudo): Move this to HttpParser.
+            text <- rawToChar(response$content)
+            doc <- XML::xmlParse(text, asText=TRUE)
+
+            # calculate relative paths
+            base <- paste(paste("/", strsplit(uri, "/")[[1]][-1:-3], sep="", collapse=""), "/", sep="")
+            result <- unlist(
+                XML::xpathApply(doc, "//D:response/D:href", function(node) {
+                    sub(base, "", URLdecode(xmlValue(node)), fixed=TRUE)
+                })
+            )
+            result[result != ""]
         }
+
     )
 )
index 88fd515194847c84b4f6741d167bc0b75625a081..8b137891791fe96927ad78e64b0aad7bded08bdc 100644 (file)
@@ -1,75 +1 @@
-#' Collection Object
-#' 
-#' @details 
-#' Todo: Update description
-#' Collection
-#' 
-#' @param uuid Object ID
-#' @param etag Object version
-#' @param owner_uuid No description
-#' @param created_at No description
-#' @param modified_by_client_uuid No description
-#' @param modified_by_user_uuid No description
-#' @param modified_at No description
-#' @param portable_data_hash No description
-#' @param replication_desired No description
-#' @param replication_confirmed_at No description
-#' @param replication_confirmed No description
-#' @param updated_at No description
-#' @param manifest_text No description
-#' @param name No description
-#' @param description No description
-#' @param properties No description
-#' @param delete_at No description
-#' @param file_names No description
-#' @param trash_at No description
-#' @param is_trashed No description
-#' 
-#' @return Collection object
-#' 
-#' @family Collection functions
-#' @export
-Collection <- function(uuid                     = NULL,
-                       etag                     = NULL,
-                       owner_uuid               = NULL,
-                       created_at               = NULL,
-                       modified_by_client_uuid  = NULL,
-                       modified_by_user_uuid    = NULL,
-                       modified_at              = NULL,
-                       portable_data_hash       = NULL,
-                       replication_desired      = NULL,
-                       replication_confirmed_at = NULL,
-                       replication_confirmed    = NULL,
-                       updated_at               = NULL,
-                       manifest_text            = NULL,
-                       name                     = NULL,
-                       description              = NULL,
-                       properties               = NULL,
-                       delete_at                = NULL,
-                       file_names               = NULL,
-                       trash_at                 = NULL,
-                       is_trashed               = NULL)
-{
-    structure(list(uuid                     = uuid,
-                   etag                     = etag,
-                   owner_uuid               = owner_uuid,
-                   created_at               = created_at,
-                   modified_by_client_uuid  = modified_by_client_uuid,
-                   modified_by_user_uuid    = modified_by_user_uuid,
-                   modified_at              = modified_at,
-                   portable_data_hash       = portable_data_hash,
-                   replication_desired      = replication_desired,
-                   replication_confirmed_at = replication_confirmed_at,
-                   replication_confirmed    = replication_confirmed,
-                   updated_at               = updated_at,
-                   manifest_text            = manifest_text,
-                   name                     = name,
-                   description              = description,
-                   properties               = properties,
-                   delete_at                = delete_at,
-                   file_names               = file_names,
-                   trash_at                 = trash_at,
-                   is_trashed               = is_trashed),
-              class = "ArvadosCollection")
-}