comparison BiodbFactory.R @ 0:e66bb061af06 draft

planemo upload for repository https://github.com/workflow4metabolomics/lcmsmatching.git commit 3529b25417f8e1a5836474c9adec4b696d35099d-dirty
author prog
date Tue, 12 Jul 2016 12:02:37 -0400
parents
children 253d531a0193
comparison
equal deleted inserted replaced
-1:000000000000 0:e66bb061af06
1 if ( ! exists('BiodbFactory')) { # Do not load again if already loaded
2
3 library(methods)
4 source('ChebiConn.R')
5 source('KeggConn.R')
6 source('PubchemConn.R')
7 source('HmdbConn.R')
8 source('ChemspiderConn.R')
9 source('EnzymeConn.R')
10 source('LipidmapsConn.R')
11 source('MirbaseConn.R')
12 source('NcbigeneConn.R')
13 source('NcbiccdsConn.R')
14 source('UniprotConn.R')
15 source('MassbankConn.R')
16
17 #####################
18 # CLASS DECLARATION #
19 #####################
20
21 BiodbFactory <- setRefClass("BiodbFactory", fields = list(.useragent = "character", .conn = "list", .cache.dir = "character"))
22
23 ###############
24 # CONSTRUCTOR #
25 ###############
26
27 BiodbFactory$methods( initialize = function(useragent = NA_character_, cache.dir = NA_character_, ...) {
28
29 ( ! is.null(useragent) && ! is.na(useragent)) || stop("You must provide a user agent string (e.g.: \"myapp ; my.email@address\").")
30 .useragent <<- useragent
31 .conn <<- list()
32 .cache.dir <<- cache.dir
33
34 callSuper(...) # calls super-class initializer with remaining parameters
35 })
36
37 ##################
38 # GET USER AGENT #
39 ##################
40
41 BiodbFactory$methods( getUserAgent = function() {
42 return(.self$.useragent)
43 })
44
45 ############
46 # GET CONN #
47 ############
48
49 BiodbFactory$methods( getConn = function(class) {
50
51 if ( ! class %in% names(.self$.conn)) {
52
53 # Create connection instance
54 conn <- switch(class,
55 chebi = ChebiConn$new(useragent = .self$.useragent),
56 kegg = KeggConn$new(useragent = .self$.useragent),
57 pubchem = PubchemConn$new(useragent = .self$.useragent),
58 hmdb = HmdbConn$new(useragent = .self$.useragent),
59 chemspider = ChemspiderConn$new(useragent = .self$.useragent),
60 enzyme = EnzymeConn$new(useragent = .self$.useragent),
61 lipidmaps = LipidmapsConn$new(useragent = .self$.useragent),
62 mirbase = MirbaseConn$new(useragent = .self$.useragent),
63 ncbigene = NcbigeneConn$new(useragent = .self$.useragent),
64 ncbiccds = NcbiccdsConn$new(useragent = .self$.useragent),
65 uniprot = UniprotConn$new(useragent = .self$.useragent),
66 massbank = MassbankConn$new(useragent = .self$.useragent),
67 NULL)
68
69 # Unknown class
70 if (is.null(conn))
71 stop(paste0("Unknown r-biodb class \"", class,"\"."))
72
73 .self$.conn[[class]] <- conn
74 }
75
76 return (.self$.conn[[class]])
77 })
78
79 ################
80 # CREATE ENTRY #
81 ################
82
83 BiodbFactory$methods( createEntry = function(class, type, id = NULL, content = NULL, drop = TRUE) {
84
85 is.null(id) && is.null(content) && stop("One of id or content must be set.")
86 ! is.null(id) && ! is.null(content) && stop("id and content cannot be both set.")
87
88 # Get content
89 if ( ! is.null(id))
90 content <- .self$getEntryContent(class, type, id)
91
92 conn <- .self$getConn(class)
93 entry <- conn$createEntry(type = type, content = content, drop = drop)
94
95 # Set factory
96 for (e in c(entry))
97 e$setFactory(.self)
98
99 return(entry)
100 })
101
102 ########################
103 # GET CACHE FILE PATHS #
104 ########################
105
106 BiodbFactory$methods( .get.cache.file.paths = function(class, type, id) {
107
108 # Get extension
109 ext <- .self$getConn(class)$getEntryContentType(type)
110
111 # Set filenames
112 filenames <- vapply(id, function(x) paste0(class, '-', type, '-', x, '.', ext), FUN.VALUE = '')
113
114 # set file paths
115 file.paths <- vapply(filenames, function(x) file.path(.self$.cache.dir, x), FUN.VALUE = '')
116
117 # Create cache dir if needed
118 if ( ! is.na(.self$.cache.dir) && ! file.exists(.self$.cache.dir))
119 dir.create(.self$.cache.dir)
120
121 return(file.paths)
122 })
123
124 ###########################
125 # LOAD CONTENT FROM CACHE #
126 ###########################
127
128 BiodbFactory$methods( .load.content.from.cache = function(class, type, id) {
129
130 content <- NULL
131
132 # Read contents from files
133 file.paths <- .self$.get.cache.file.paths(class, type, id)
134 content <- lapply(file.paths, function(x) { if (file.exists(x)) paste(readLines(x), collapse = "\n") else NULL })
135
136 return(content)
137 })
138
139 #########################
140 # SAVE CONTENT TO CACHE #
141 #########################
142
143 BiodbFactory$methods( .save.content.to.cache = function(class, type, id, content) {
144
145 # Write contents into files
146 file.paths <- .self$.get.cache.file.paths(class, type, id)
147 mapply(function(c, f) { if ( ! is.null(c)) writeLines(c, f) }, content, file.paths)
148 })
149
150 #####################
151 # GET ENTRY CONTENT #
152 #####################
153
154 BiodbFactory$methods( getEntryContent = function(class, type, id) {
155
156 content <- NULL
157 # Load from cache
158 if ( ! is.na(.self$.cache.dir))
159 content <- .self$.load.content.from.cache(class, type, id)
160
161 # Get contents
162 missing.content.indexes <- vapply(content, is.null, FUN.VALUE = TRUE)
163 missing.ids <- if (is.null(content)) id else id[missing.content.indexes]
164 if (length(missing.ids) > 0) {
165
166 # Use connector to get missing contents
167 conn <- .self$getConn(class)
168 missing.contents <- conn$getEntryContent(type, missing.ids)
169
170 # Save to cache
171 if ( ! is.null(missing.contents) && ! is.na(.self$.cache.dir))
172 .self$.save.content.to.cache(class, type, missing.ids, missing.contents)
173
174 # Merge content and missing.contents
175 if (is.null(content))
176 content <- missing.contents
177 else
178 content[missing.content.indexes] <- missing.contents
179 }
180
181 return(content)
182 })
183 }