1 RESTService <- R6::R6Class(
12 initialize = function(token, hostName, webDavHostName = NULL, http, httpParser)
17 self$hostName <- paste0("https://", hostName,
18 "/arvados/", version, "/")
20 self$httpParser <- httpParser
22 private$rawHostName <- hostName
23 private$webDavHostName <- webDavHostName
26 getWebDavHostName = function()
28 if(is.null(private$webDavHostName))
30 discoveryDocumentURL <- paste0("https://", private$rawHostName,
31 "/discovery/v1/apis/arvados/v1/rest")
33 headers <- list(Authorization = paste("OAuth2", self$token))
35 serverResponse <- self$http$GET(discoveryDocumentURL, headers)
37 discoveryDocument <- self$httpParser$parseJSONResponse(serverResponse)
38 private$webDavHostName <- discoveryDocument$keepWebServiceUrl
40 if(is.null(private$webDavHostName))
41 stop("Unable to find WebDAV server.")
44 private$webDavHostName
47 getResource = function(resource, uuid)
49 resourceURL <- paste0(self$hostName, resource, "/", uuid)
50 headers <- list(Authorization = paste("OAuth2", self$token))
52 serverResponse <- self$http$GET(resourceURL, headers)
54 resource <- self$httpParser$parseJSONResponse(serverResponse)
56 if(!is.null(resource$errors))
62 listResources = function(resource, filters = NULL, limit = 100, offset = 0)
64 resourceURL <- paste0(self$hostName, resource)
65 headers <- list(Authorization = paste("OAuth2", self$token))
67 serverResponse <- self$http$GET(resourceURL, headers, filters,
70 resources <- self$httpParser$parseJSONResponse(serverResponse)
72 if(!is.null(resources$errors))
73 stop(resources$errors)
78 fetchAllItems = function(resourceURL, filters)
80 headers <- list(Authorization = paste("OAuth2", self$token))
83 itemsAvailable <- .Machine$integer.max
85 while(length(items) < itemsAvailable)
87 serverResponse <- self$http$GET(url = resourceURL,
89 queryFilters = filters,
93 parsedResponse <- self$httpParser$parseJSONResponse(serverResponse)
95 if(!is.null(parsedResponse$errors))
96 stop(parsedResponse$errors)
98 items <- c(items, parsedResponse$items)
99 offset <- length(items)
100 itemsAvailable <- parsedResponse$items_available
106 deleteResource = function(resource, uuid)
108 collectionURL <- paste0(self$hostName, resource, "/", uuid)
109 headers <- list("Authorization" = paste("OAuth2", self$token),
110 "Content-Type" = "application/json")
112 serverResponse <- self$http$DELETE(collectionURL, headers)
114 removedResource <- self$httpParser$parseJSONResponse(serverResponse)
116 if(!is.null(removedResource$errors))
117 stop(removedResource$errors)
122 updateResource = function(resource, uuid, newContent)
124 resourceURL <- paste0(self$hostName, resource, "/", uuid)
125 headers <- list("Authorization" = paste("OAuth2", self$token),
126 "Content-Type" = "application/json")
128 newContent <- jsonlite::toJSON(newContent, auto_unbox = T)
130 serverResponse <- self$http$PUT(resourceURL, headers, newContent)
132 updatedResource <- self$httpParser$parseJSONResponse(serverResponse)
134 if(!is.null(updatedResource$errors))
135 stop(updatedResource$errors)
140 createResource = function(resource, content)
142 resourceURL <- paste0(self$hostName, resource)
143 headers <- list("Authorization" = paste("OAuth2", self$token),
144 "Content-Type" = "application/json")
146 content <- jsonlite::toJSON(content, auto_unbox = T)
148 serverResponse <- self$http$POST(resourceURL, headers, content)
150 newResource <- self$httpParser$parseJSONResponse(serverResponse)
152 if(!is.null(newResource$errors))
153 stop(newResource$errors)
158 create = function(files, uuid)
160 sapply(files, function(filePath)
162 private$createNewFile(filePath, uuid, "text/html")
166 delete = function(relativePath, uuid)
168 fileURL <- paste0(self$getWebDavHostName(), "c=",
169 uuid, "/", relativePath);
170 headers <- list(Authorization = paste("OAuth2", self$token))
172 serverResponse <- self$http$DELETE(fileURL, headers)
174 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
175 stop(paste("Server code:", serverResponse$status_code))
180 move = function(from, to, uuid)
182 collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
183 fromURL <- paste0(collectionURL, from)
184 toURL <- paste0(collectionURL, to)
186 headers <- list("Authorization" = paste("OAuth2", self$token),
187 "Destination" = toURL)
189 serverResponse <- self$http$MOVE(fromURL, headers)
191 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
192 stop(paste("Server code:", serverResponse$status_code))
197 getCollectionContent = function(uuid)
199 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
202 headers <- list("Authorization" = paste("OAuth2", self$token))
204 response <- self$http$PROPFIND(collectionURL, headers)
206 if(all(response == ""))
207 stop("Response is empty, request may be misconfigured")
209 if(response$status_code < 200 || response$status_code >= 300)
210 stop(paste("Server code:", response$status_code))
212 self$httpParser$getFileNamesFromResponse(response, collectionURL)
215 getResourceSize = function(relativePath, uuid)
217 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
220 subcollectionURL <- paste0(collectionURL, "/", relativePath);
222 headers <- list("Authorization" = paste("OAuth2", self$token))
224 response <- self$http$PROPFIND(subcollectionURL, headers)
226 if(all(response == ""))
227 stop("Response is empty, request may be misconfigured")
229 if(response$status_code < 200 || response$status_code >= 300)
230 stop(paste("Server code:", response$status_code))
232 sizes <- self$httpParser$getFileSizesFromResponse(response,
237 read = function(relativePath, uuid, contentType = "raw", offset = 0, length = 0)
239 fileURL <- paste0(self$getWebDavHostName(),
240 "c=", uuid, "/", relativePath);
242 range <- paste0("bytes=", offset, "-")
245 range = paste0(range, offset + length - 1)
247 if(offset == 0 && length == 0)
249 headers <- list(Authorization = paste("OAuth2", self$token))
253 headers <- list(Authorization = paste("OAuth2", self$token),
257 if(!(contentType %in% self$httpParser$validContentTypes))
258 stop("Invalid contentType. Please use text or raw.")
260 serverResponse <- self$http$GET(fileURL, headers)
262 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
263 stop(paste("Server code:", serverResponse$status_code))
265 self$httpParser$parseResponse(serverResponse, contentType)
268 write = function(relativePath, uuid, content, contentType)
270 fileURL <- paste0(self$getWebDavHostName(),
271 "c=", uuid, "/", relativePath);
272 headers <- list(Authorization = paste("OAuth2", self$token),
273 "Content-Type" = contentType)
276 serverResponse <- self$http$PUT(fileURL, headers, body)
278 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
279 stop(paste("Server code:", serverResponse$status_code))
281 self$httpParser$parseResponse(serverResponse, "text")
284 getConnection = function(uuid, relativePath, openMode)
286 fileURL <- paste0(self$getWebDavHostName(),
287 "c=", uuid, "/", relativePath);
288 headers <- list(Authorization = paste("OAuth2", self$token))
290 h <- curl::new_handle()
291 curl::handle_setheaders(h, .list = headers)
293 conn <- curl::curl(url = fileURL, open = openMode, handle = h)
301 webDavHostName = NULL,
304 createNewFile = function(relativePath, uuid, contentType)
306 fileURL <- paste0(self$getWebDavHostName(), "c=",
307 uuid, "/", relativePath)
308 headers <- list(Authorization = paste("OAuth2", self$token),
309 "Content-Type" = contentType)
312 serverResponse <- self$http$PUT(fileURL, headers, body)
314 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
315 stop(paste("Server code:", serverResponse$status_code))
317 paste("File created:", relativePath)