1 source("./R/Arvados.R")
2 source("./R/HttpParser.R")
3 source("./R/Subcollection.R")
4 source("./R/ArvadosFile.R")
9 #' Todo: Update description
12 #' @param uuid Object ID
13 #' @param etag Object version
14 #' @param owner_uuid No description
15 #' @param created_at No description
16 #' @param modified_by_client_uuid No description
17 #' @param modified_by_user_uuid No description
18 #' @param modified_at No description
19 #' @param portable_data_hash No description
20 #' @param replication_desired No description
21 #' @param replication_confirmed_at No description
22 #' @param replication_confirmed No description
23 #' @param updated_at No description
24 #' @param manifest_text No description
25 #' @param name No description
26 #' @param description No description
27 #' @param properties No description
28 #' @param delete_at No description
29 #' @param file_names No description
30 #' @param trash_at No description
31 #' @param is_trashed No description
35 #' @exportClass Collection
36 Collection <- setRefClass(
40 fields = list(uuid = "ANY",
45 modified_by_client_uuid = "ANY",
46 modified_by_user_uuid = "ANY",
48 portable_data_hash = "ANY",
49 replication_desired = "ANY",
50 replication_confirmed_at = "ANY",
51 replication_confirmed = "ANY",
53 manifest_text = "ANY",
62 getCollectionContent = "function"
67 initialize = function(api, uuid)
69 result <- api$collection_get(uuid)
74 owner_uuid <<- result$owner_uuid
75 created_at <<- result$created_at
76 modified_by_client_uuid <<- result$modified_by_client_uuid
77 modified_by_user_uuid <<- result$modified_by_user_uuid
78 modified_at <<- result$modified_at
79 portable_data_hash <<- result$portable_data_hash
80 replication_desired <<- result$replication_desired
81 replication_confirmed_at <<- result$replication_confirmed_at
82 replication_confirmed <<- result$replication_confirmed
83 updated_at <<- result$updated_at
84 manifest_text <<- result$manifest_text
86 description <<- result$description
87 properties <<- result$properties
88 delete_at <<- result$delete_at
89 file_names <<- result$file_names
90 trash_at <<- result$trash_at
91 is_trashed <<- result$is_trashed
94 getCollectionContent <<- function()
96 #TODO(Fudo): Use proper URL here.
97 uri <- URLencode(api$getWebDavHostName())
99 # fetch directory listing via curl and parse XML response
100 h <- curl::new_handle()
101 curl::handle_setopt(h, customrequest = "PROPFIND")
103 #TODO(Fudo): Use proper token here.
104 curl::handle_setheaders(h, "Authorization" = paste("OAuth2", api$getWebDavToken()))
105 response <- curl::curl_fetch_memory(uri, h)
107 HttpParser()$parseWebDAVResponse(response, uri)
110 createCollectionContentTree <- function(fileStructure)
112 #Todo(Fudo): Refactor this.
113 treeBranches <- sapply(fileStructure, function(filePath)
115 fileWithPath <- unlist(stringr::str_split(filePath, "/"))
117 file <- fileWithPath[length(fileWithPath), drop = T]
118 file <- ArvadosFile(file)
120 folders <- fileWithPath[-length(fileWithPath)]
122 subcollections <- sapply(folders, function(folder)
124 folder <- Subcollection(folder)
127 if(length(subcollections) > 0)
129 bottomFolder <- subcollections[[length(subcollections)]]
130 bottomFolder$add(file)
132 if(length(subcollections) == 1)
138 # Link folders in hierarchy. At the bottom will always be a file.
139 for(subcollectionIndex in 1:(length(subcollections) - 1))
141 subcollections[[subcollectionIndex]]$add(subcollections[[subcollectionIndex + 1]])
153 root <- Subcollection(".")
155 addIfExists <- function(firstNode, secondNode)
157 firstNodeContent <- sapply(firstNode$content, function(node) {node$name})
158 if(length(firstNodeContent) == 0)
160 firstNode$add(secondNode)
164 matchPosition <- match(secondNode$name, firstNodeContent, -1)
165 if(matchPosition != -1)
167 addIfExists(firstNode$content[[matchPosition]], secondNode$content[[1]])
171 firstNode$add(secondNode)
175 sapply(treeBranches, function(branch)
177 addIfExists(root, branch)
183 #Todo(Fudo): This is dummy data. Real content will come from WebDAV server.
184 testFileStructure <- c("math.h", "main.cpp",
185 "java/render.java", "java/test/observer.java",
186 "java/test/observable.java",
187 "csharp/this.cs", "csharp/is.cs",
188 "csharp/dummy.cs", "csharp/file.cs")
189 #items <<- getCollectionContent()
190 items <<- createCollectionContentTree(testFileStructure)