#' Init GMQL server
#'
#' It initializes and runs GMQL server for executing GMQL query.
#' It also performs a login to GMQL REST services suite, if needed
#' 
#' @importFrom rJava J
#' 
#' @param output_format string that identifies the output format of all sample 
#' files. It can be TAB, GTF or COLLECT:
#' \itemize{
#' \item{TAB: tab-delimited file format}
#' \item{GTF: tab-delimited text standard format based on the General 
#' Feature Format}
#' \item{COLLECT: used for storing output in memory (only in the case of local 
#' processing, i.e., remote_processing = FALSE)}
#' }
#' @param remote_processing logical value specifying the processing mode.
#' True for processing on cluster (remote), false for local processing.
#' 
#' @param url string url of server: It must contain the server address 
#' and base url; service name is added automatically.
#' If NULL, no login is performed.
#' You can always perform it by calling the function \code{\link{login_gmql}} 
#' explicitly
#' 
#' @param username string name used during remote server signup 
#' @param password string password used during remote server signup
#' 
#' @return None
#'
#' @examples
#'
#' ## This statement initializes GMQL with local processing with sample files 
#' ## output format as tab-delimited
#' 
#' init_gmql("tab", FALSE)
#' 
#' ## This statement initializes GMQL with remote processing
#' 
#' remote_url = "http://www.gmql.eu/gmql-rest/
#' init_gmql(remote_processing = TRUE, url = remote_url)
#' 
#' @export
#'
init_gmql <- function(output_format = "GTF", remote_processing = FALSE, 
                    url = NULL, username = NULL, password = NULL)
{
    out_format <- toupper(output_format)
    if(!out_format %in% c("TAB", "GTF", "COLLECT"))
        stop("output_format: must be TAB, GTF or COLLECT")
    
    .check_logical(remote_processing)
    
    # mettere attesa da input keyboard, controllare se token già esiste 
    # da sessione precedente
    if(!is.null(url) && !exists("GMQL_credentials", envir = .GlobalEnv))
        login_gmql(url,username,password)
    
    WrappeR <- J("it/polimi/genomics/r/Wrapper")
    WrappeR$initGMQL(out_format,remote_processing)
}

#' Stop GMQL server
#'
#' It stops GMQL server processing
#' 
#' @importFrom rJava J
#' 
#' @return None
#'
#' @examples
#'
#' ## This statement first initializes GMQL with local processing and with 
#' ## sample file output format as tab-delimited, and then stops it
#' 
#' init_gmql("tab", FALSE)
#' 
#' stop_gmql()
#' 
#' @export
#'
stop_gmql <- function()
{
    WrappeR <- J("it/polimi/genomics/r/Wrapper")
    WrappeR$stopGMQL()
}


#' Disable or Enable remote processing
#'
#' It allows to enable or disable remote processing 
#' 
#' @details 
#' The invocation of this function allows to change mode of processing.
#' After invoking collect() function, it is not possbile to switch the 
#' processing mode. 
#' 
#' @importFrom rJava J
#' 
#' @param is_remote logical value used in order to set the processing mode.
#' TRUE: you set a remote query processing mode, otherwise it will be local
#' 
#' @return None
#' 
#' @examples
#' 
#' ## This statement initializes GMQL with local processing with sample 
#' ## files output format as tab-delimited, and then it changes processing 
#' ## mode to remote
#' 
#' init_gmql("tab", remote_processing = FALSE)
#' 
#' remote_processing(TRUE)
#'
#' @export
#' 
remote_processing<-function(is_remote)
{
    WrappeR <- J("it/polimi/genomics/r/Wrapper")
    .check_logical(is_remote)
    response <- WrappeR$remote_processing(is_remote)
    print(response)
}