Replaced call to non-existent method execute in RESTService class with
[arvados.git] / sdk / R / R / RESTService.R
1 RESTService <- R6::R6Class(
2
3     "RESTService",
4
5     public = list(
6
7         token      = NULL,
8         http       = NULL,
9         httpParser = NULL,
10         numRetries = NULL,
11
12         initialize = function(token, rawHost,
13                               http, httpParser,
14                               numRetries     = 0,
15                               webDavHostName = NULL)
16         {
17             self$token      <- token
18             self$http       <- http
19             self$httpParser <- httpParser
20             self$numRetries <- numRetries
21
22             private$rawHostName    <- rawHost
23             private$webDavHostName <- webDavHostName
24         },
25
26         setNumConnRetries = function(newNumOfRetries)
27         {
28             self$numRetries <- newNumOfRetries
29         },
30
31         getWebDavHostName = function()
32         {
33             if(is.null(private$webDavHostName))
34             {
35                 discoveryDocumentURL <- paste0("https://", private$rawHostName,
36                                                "/discovery/v1/apis/arvados/v1/rest")
37
38                 headers <- list(Authorization = paste("OAuth2", self$token))
39
40                 serverResponse <- self$http$exec("GET", discoveryDocumentURL, headers,
41                                                  retryTimes = self$numRetries)
42
43                 discoveryDocument <- self$httpParser$parseJSONResponse(serverResponse)
44                 private$webDavHostName <- discoveryDocument$keepWebServiceUrl
45
46                 if(is.null(private$webDavHostName))
47                     stop("Unable to find WebDAV server.")
48             }
49
50             private$webDavHostName
51         },
52
53         create = function(files, uuid)
54         {
55             sapply(files, function(filePath)
56             {
57                 private$createNewFile(filePath, uuid, "text/html")
58             })
59         },
60
61         delete = function(relativePath, uuid)
62         {
63             fileURL <- paste0(self$getWebDavHostName(), "c=",
64                               uuid, "/", relativePath);
65             headers <- list(Authorization = paste("OAuth2", self$token)) 
66
67             serverResponse <- self$http$exec("DELETE", fileURL, headers,
68                                              retryTimes = self$numRetries)
69
70             if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
71                 stop(paste("Server code:", serverResponse$status_code))
72
73             serverResponse
74         },
75
76         move = function(from, to, uuid)
77         {
78             collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
79             fromURL <- paste0(collectionURL, from)
80             toURL <- paste0(collectionURL, to)
81
82             headers <- list("Authorization" = paste("OAuth2", self$token),
83                            "Destination" = toURL)
84
85             serverResponse <- self$http$exec("MOVE", fromURL, headers,
86                                              retryTimes = self$numRetries)
87
88             if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
89                 stop(paste("Server code:", serverResponse$status_code))
90
91             serverResponse
92         },
93
94         getCollectionContent = function(uuid)
95         {
96             collectionURL <- URLencode(paste0(self$getWebDavHostName(),
97                                               "c=", uuid))
98
99             headers <- list("Authorization" = paste("OAuth2", self$token))
100
101             response <- self$http$exec("PROPFIND", collectionURL, headers,
102                                        retryTimes = self$numRetries)
103
104             if(all(response == ""))
105                 stop("Response is empty, request may be misconfigured")
106
107             if(response$status_code < 200 || response$status_code >= 300)
108                 stop(paste("Server code:", response$status_code))
109
110             self$httpParser$getFileNamesFromResponse(response, collectionURL)
111         },
112
113         getResourceSize = function(relativePath, uuid)
114         {
115             collectionURL <- URLencode(paste0(self$getWebDavHostName(),
116                                               "c=", uuid))
117
118             subcollectionURL <- paste0(collectionURL, "/", relativePath);
119
120             headers <- list("Authorization" = paste("OAuth2", self$token))
121
122             response <- self$http$exec("PROPFIND", subcollectionURL, headers,
123                                        retryTimes = self$numRetries)
124
125             if(all(response == ""))
126                 stop("Response is empty, request may be misconfigured")
127
128             if(response$status_code < 200 || response$status_code >= 300)
129                 stop(paste("Server code:", response$status_code))
130
131             sizes <- self$httpParser$getFileSizesFromResponse(response,
132                                                               collectionURL)
133             as.numeric(sizes)
134         },
135
136         read = function(relativePath, uuid, contentType = "raw", offset = 0, length = 0)
137         {
138             fileURL <- paste0(self$getWebDavHostName(),
139                              "c=", uuid, "/", relativePath);
140
141             range <- paste0("bytes=", offset, "-")
142
143             if(length > 0)
144                 range = paste0(range, offset + length - 1)
145
146             if(offset == 0 && length == 0)
147             {
148                 headers <- list(Authorization = paste("OAuth2", self$token))
149             }
150             else
151             {
152                 headers <- list(Authorization = paste("OAuth2", self$token),
153                                 Range = range)
154             }
155
156             if(!(contentType %in% self$httpParser$validContentTypes))
157                 stop("Invalid contentType. Please use text or raw.")
158
159             serverResponse <- self$http$exec("GET", fileURL, headers,
160                                              retryTimes = self$numRetries)
161
162             if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
163                 stop(paste("Server code:", serverResponse$status_code))
164
165             self$httpParser$parseResponse(serverResponse, contentType)
166         },
167
168         write = function(relativePath, uuid, content, contentType)
169         {
170             fileURL <- paste0(self$getWebDavHostName(),
171                              "c=", uuid, "/", relativePath);
172             headers <- list(Authorization = paste("OAuth2", self$token),
173                             "Content-Type" = contentType)
174             body <- content
175
176             serverResponse <- self$http$exec("PUT", fileURL, headers, body,
177                                              retryTimes = self$numRetries)
178
179             if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
180                 stop(paste("Server code:", serverResponse$status_code))
181
182             self$httpParser$parseResponse(serverResponse, "text")
183         },
184
185         getConnection = function(uuid, relativePath, openMode)
186         {
187             fileURL <- paste0(self$getWebDavHostName(), 
188                               "c=", uuid, "/", relativePath);
189             headers <- list(Authorization = paste("OAuth2", self$token))
190
191             h <- curl::new_handle()
192             curl::handle_setheaders(h, .list = headers)
193
194             conn <- curl::curl(url = fileURL, open = openMode, handle = h)
195
196             conn
197         }
198     ),
199
200     private = list(
201
202         webDavHostName = NULL,
203         rawHostName    = NULL,
204
205         createNewFile = function(relativePath, uuid, contentType)
206         {
207             fileURL <- paste0(self$getWebDavHostName(), "c=",
208                               uuid, "/", relativePath)
209             headers <- list(Authorization = paste("OAuth2", self$token), 
210                             "Content-Type" = contentType)
211             body <- NULL
212
213             serverResponse <- self$http$exec("PUT", fileURL, headers, body,
214                                              retryTimes = self$numRetries)
215
216             if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
217                 stop(paste("Server code:", serverResponse$status_code))
218
219             paste("File created:", relativePath)
220         }
221     ),
222
223     cloneable = FALSE
224 )