/
GSVersion.R
145 lines (136 loc) · 4.68 KB
/
GSVersion.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#' Geoserver REST API - Geoserver Version
#'
#' @docType class
#' @importFrom R6 R6Class
#' @export
#'
#' @name GSVersion
#' @title A GeoServer version
#' @description This class allows to grab the GeoServer version. By default, a
#' tentative is made to fetch version from web admin default page, since Geoserver
#' REST API did not support GET operation for the Geoserver version in past releases
#' of Geoserver.
#' @keywords geoserver rest api version
#' @return Object of \code{\link{R6Class}} for modelling a GeoServer version
#' @format \code{\link{R6Class}} object.
#'
#' @examples
#' \dontrun{
#' version <- GSVersion$new(
#' url = "http://localhost:8080/geoserver",
#' user = "admin", pwd = "geoserver"
#' )
#' }
#'
#' @author Emmanuel Blondel <emmanuel.blondel1@@gmail.com>
#'
GSVersion <- R6Class("GSVersion",
private = list(
getVersionValue = function(version){
version <- gsub("x", "0", version)
version <- gsub("-SNAPSHOT", "", version)
versions <- unlist(strsplit(version, "\\."))
value <- list()
value[["major"]] <- as.integer(versions[1])
value[["minor"]] <- as.integer(versions[2])
value[["revision"]] <- 0
if(length(versions)==3){
value[["revision"]] <- as.integer(versions[3])
}
return(value)
}
),
public = list(
#'@field version version
version = NULL,
#'@field value value
value = NULL,
#'@description Initializes an object of class \link{GSVersion}
#'@param url url
#'@param user user
#'@param pwd pwd
initialize = function(url, user, pwd){
#try to grab version from web admin
req <- httr::GET(paste(dirname(url), "web", sep = "/"))
if(status_code(req) == 200){
html <- xml2::read_html(content(req, "text", encoding = "ISO-8859-1"))
trgSet <- xml2::xml_find_first(html, "//strong")
if(length(trgSet) > 0){
version <- xml2::xml_text(trgSet)
value <- private$getVersionValue(version)
if(is.list(value)){
self$version <- version
self$value <- value
}
}
}
#try to grab version from REST API
if(is.null(self$version) & is.null(self$value)){
req <- GSUtils$GET(url, user, pwd, "about/version.xml", verbose = FALSE)
if(status_code(req) == 200){
xml <- httr::content(req, encoding = "UTF-8")
trgSet <- xml2::xml_find_first(xml, "//resource[@name='GeoServer']/Version")
if(length(trgSet) > 0){
version <- xml2::xml_text(trgSet)
value <- private$getVersionValue(version)
if(is.list(value)){
self$version <- version
self$value <- value
}
}
}
}
},
#'@description Compares to a version and returns TRUE if it is lower, FALSE otherwise
#'@param version version
#'@return \code{TRUE} if lower, \code{FALSE} otherwise
lowerThan = function(version){
lower <- FALSE
if(is.character(version)){
value <- private$getVersionValue(version)
}else if(is.list(version)){
value <- version
}
lower <- (self$value$major < value$major)
if(!lower & identical(self$value$major, value$major)){
lower <- (self$value$minor < value$minor)
}
if(!lower & identical(self$value$minor, value$minor)){
lower <- (self$value$revision < value$revision)
}
return(lower)
},
#'@description Compares to a version and returns TRUE if it is greater, FALSE otherwise
#'@param version version
#'@return \code{TRUE} if greater, \code{FALSE} otherwise
greaterThan = function(version){
greater <- FALSE
if(is.character(version)){
value <- private$getVersionValue(version)
}else if(is.list(version)){
value <- version
}
greater <- (self$value$major > value$major)
if(!greater & identical(self$value$major, value$major)){
greater <- (self$value$minor > value$minor)
}
if(!greater & identical(self$value$minor, value$minor)){
greater <- (self$value$revision > value$revision)
}
return(greater)
},
#'@description Compares to a version and returns TRUE if it is equal, FALSE otherwise
#'@param version version
#'@return \code{TRUE} if equal, \code{FALSE} otherwise
equalTo = function(version){
equal <- FALSE
if(is.character(version)){
value <- private$getVersionValue(version)
}else if(is.list(version)){
value <- version
}
equal <- !self$lowerThan(version) & !self$greaterThan(version)
return(equal)
}
)
)