Mercurial > repos > prog > lcmsmatching
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BiodbFactory.R Tue Jul 12 12:02:37 2016 -0400 @@ -0,0 +1,183 @@ +if ( ! exists('BiodbFactory')) { # Do not load again if already loaded + + library(methods) + source('ChebiConn.R') + source('KeggConn.R') + source('PubchemConn.R') + source('HmdbConn.R') + source('ChemspiderConn.R') + source('EnzymeConn.R') + source('LipidmapsConn.R') + source('MirbaseConn.R') + source('NcbigeneConn.R') + source('NcbiccdsConn.R') + source('UniprotConn.R') + source('MassbankConn.R') + + ##################### + # CLASS DECLARATION # + ##################### + + BiodbFactory <- setRefClass("BiodbFactory", fields = list(.useragent = "character", .conn = "list", .cache.dir = "character")) + + ############### + # CONSTRUCTOR # + ############### + + BiodbFactory$methods( initialize = function(useragent = NA_character_, cache.dir = NA_character_, ...) { + + ( ! is.null(useragent) && ! is.na(useragent)) || stop("You must provide a user agent string (e.g.: \"myapp ; my.email@address\").") + .useragent <<- useragent + .conn <<- list() + .cache.dir <<- cache.dir + + callSuper(...) # calls super-class initializer with remaining parameters + }) + + ################## + # GET USER AGENT # + ################## + + BiodbFactory$methods( getUserAgent = function() { + return(.self$.useragent) + }) + + ############ + # GET CONN # + ############ + + BiodbFactory$methods( getConn = function(class) { + + if ( ! class %in% names(.self$.conn)) { + + # Create connection instance + conn <- switch(class, + chebi = ChebiConn$new(useragent = .self$.useragent), + kegg = KeggConn$new(useragent = .self$.useragent), + pubchem = PubchemConn$new(useragent = .self$.useragent), + hmdb = HmdbConn$new(useragent = .self$.useragent), + chemspider = ChemspiderConn$new(useragent = .self$.useragent), + enzyme = EnzymeConn$new(useragent = .self$.useragent), + lipidmaps = LipidmapsConn$new(useragent = .self$.useragent), + mirbase = MirbaseConn$new(useragent = .self$.useragent), + ncbigene = NcbigeneConn$new(useragent = .self$.useragent), + ncbiccds = NcbiccdsConn$new(useragent = .self$.useragent), + uniprot = UniprotConn$new(useragent = .self$.useragent), + massbank = MassbankConn$new(useragent = .self$.useragent), + NULL) + + # Unknown class + if (is.null(conn)) + stop(paste0("Unknown r-biodb class \"", class,"\".")) + + .self$.conn[[class]] <- conn + } + + return (.self$.conn[[class]]) + }) + + ################ + # CREATE ENTRY # + ################ + + BiodbFactory$methods( createEntry = function(class, type, id = NULL, content = NULL, drop = TRUE) { + + is.null(id) && is.null(content) && stop("One of id or content must be set.") + ! is.null(id) && ! is.null(content) && stop("id and content cannot be both set.") + + # Get content + if ( ! is.null(id)) + content <- .self$getEntryContent(class, type, id) + + conn <- .self$getConn(class) + entry <- conn$createEntry(type = type, content = content, drop = drop) + + # Set factory + for (e in c(entry)) + e$setFactory(.self) + + return(entry) + }) + + ######################## + # GET CACHE FILE PATHS # + ######################## + + BiodbFactory$methods( .get.cache.file.paths = function(class, type, id) { + + # Get extension + ext <- .self$getConn(class)$getEntryContentType(type) + + # Set filenames + filenames <- vapply(id, function(x) paste0(class, '-', type, '-', x, '.', ext), FUN.VALUE = '') + + # set file paths + file.paths <- vapply(filenames, function(x) file.path(.self$.cache.dir, x), FUN.VALUE = '') + + # Create cache dir if needed + if ( ! is.na(.self$.cache.dir) && ! file.exists(.self$.cache.dir)) + dir.create(.self$.cache.dir) + + return(file.paths) + }) + + ########################### + # LOAD CONTENT FROM CACHE # + ########################### + + BiodbFactory$methods( .load.content.from.cache = function(class, type, id) { + + content <- NULL + + # Read contents from files + file.paths <- .self$.get.cache.file.paths(class, type, id) + content <- lapply(file.paths, function(x) { if (file.exists(x)) paste(readLines(x), collapse = "\n") else NULL }) + + return(content) + }) + + ######################### + # SAVE CONTENT TO CACHE # + ######################### + + BiodbFactory$methods( .save.content.to.cache = function(class, type, id, content) { + + # Write contents into files + file.paths <- .self$.get.cache.file.paths(class, type, id) + mapply(function(c, f) { if ( ! is.null(c)) writeLines(c, f) }, content, file.paths) + }) + + ##################### + # GET ENTRY CONTENT # + ##################### + + BiodbFactory$methods( getEntryContent = function(class, type, id) { + + content <- NULL + # Load from cache + if ( ! is.na(.self$.cache.dir)) + content <- .self$.load.content.from.cache(class, type, id) + + # Get contents + missing.content.indexes <- vapply(content, is.null, FUN.VALUE = TRUE) + missing.ids <- if (is.null(content)) id else id[missing.content.indexes] + if (length(missing.ids) > 0) { + + # Use connector to get missing contents + conn <- .self$getConn(class) + missing.contents <- conn$getEntryContent(type, missing.ids) + + # Save to cache + if ( ! is.null(missing.contents) && ! is.na(.self$.cache.dir)) + .self$.save.content.to.cache(class, type, missing.ids, missing.contents) + + # Merge content and missing.contents + if (is.null(content)) + content <- missing.contents + else + content[missing.content.indexes] <- missing.contents + } + + return(content) + }) +}