Changeset 146

Show
Ignore:
Timestamp:
14-10-10 19:56:10 (4 years ago)
Author:
j.saito@…
Message:

Removed three possible sources for null-pointer exceptions in the CommunicationManager?.

Added a simpel way of handling REST errors using a new RestException? class.

I have tried to introduce Exception handling for errors in the Communication manager. So far, I only committed exceptions for something going wrong. I have been working on a more fine grained distinction between server side errors and client side errors related to REST. however, these errors require some sort of convention for delivering from the server side to the client side. Therefore, they require a convention to be agreed to by NMCDSP and I have not committed these Exceptions.

Files:
1 added
2 modified

Legend:

Unmodified
Added
Removed
  • grails-app/controllers/RestController.groovy

    r139 r146  
    77import org.compass.core.impl.* 
    88import dbnp.rest.common.CommunicationManager 
     9import dbnp.rest.* 
    910 
    1011 
     
    8485     */ 
    8586    def getMeasurements = { 
     87 
     88                def valid = CommunicationManager.hasValidParams( params, {render it as JSON }, 'assayToken' ) 
     89                if( !valid ) { 
     90                        return  
     91                } 
     92 
     93 
    8694                def assayToken = params.assayToken 
    87         if( !assayToken ) { return render [] as JSON } 
    88  
    89                 def list = [] 
     95                def list = []  
    9096                def assay = SimpleAssay.find( "from SimpleAssay as a where a.externalAssayID =? ", [assayToken] ) 
    9197                SimpleAssayMeasurement 
     
    9399                                .each{ measurement ->  
    94100                                        def tripple = [:] 
    95                                 tripple['value'] = measurement.value 
    96                                 tripple['sampleToken'] = measurement.sample.externalSampleId 
    97                                 tripple['measurementToken'] = measurement.type.name 
     101                                tripple['value'] = measurement.value 
     102                                tripple['sampleToken'] = measurement.sample.externalSampleId 
     103                                tripple['measurementToken'] = measurement.type.name 
    98104                                        list.push tripple 
    99105                                } 
     106 
    100107                render list as JSON 
    101108    } 
     
    527534 
    528535        def test = {  
    529                 render CommunicationManager.getSamples('PPSH-Glu-B') 
     536                render CommunicationManager.getStudies() 
    530537        } 
    531538 
  • src/groovy/dbnp/rest/common/CommunicationManager.groovy

    r136 r146  
    11package dbnp.rest.common 
    22 
     3import dbnp.rest.* 
    34import grails.converters.JSON 
    45import java.net.URLEncoder 
     
    4546            conn.setRequestProperty("Authorization", "Basic ${authString}") 
    4647            return JSON.parse( conn.content.text ) 
    47             //return conn.content.text 
    48                 //return JSON.parse( url.newReader() ) 
    4948    } 
    5049 
     
    111110 
    112111    public static addRestWrapper( serverURL, restName, params = [], closure = { return it } ) { 
    113                 CommunicationManager.metaClass.registerStaticMethod( restName ) { Object [] strangeGroovyArgs -> 
    114                         def map = [:] 
    115                     def args = strangeGroovyArgs[0]        // groovy nests the parameters of the methods in some other array 
    116                         if(params.size > 0 ) 
    117                         { 
    118                                 for( i in 0..(params.size-1) ) { 
    119                                         def param = params[i] 
    120                                         map[param] = args[i] 
     112                def result 
     113                try { 
     114                        CommunicationManager.metaClass.registerStaticMethod( restName ) { Object [] strangeGroovyArgs -> 
     115                                def map = [:] 
     116                            def args = strangeGroovyArgs[0]        // groovy nests the parameters of the methods in some other array 
     117                                if(params.size > 0 ) 
     118                                { 
     119                                        for( i in 0..(params.size-1) ) { 
     120                                                def param = params[i] 
     121                                                map[param] = args[i] 
     122                                        } 
    121123                                } 
    122                         } 
    123                         return closure( getRestResource( serverURL, restName, map ) ) 
    124                 } 
     124                                result = closure( getRestResource( serverURL, restName, map ) ) 
     125                        }  
     126                } catch ( Exception e ) { result = RestException.getErrorObject()  } 
     127                return result 
    125128        } 
    126129 
     
    253256                addRestWrapper( url+'/rest', 'getQueryResultWithOperator',  ['query','operator','value'], closure2 ) 
    254257 
    255  
    256258        } 
    257259         
     260 
     261 
     262    /** 
     263     * Give list of missing parameters for a parameter call in a RestController. 
     264     *   
     265     * @params params Map params        The parameter list required by this view. 
     266     * @params requiredParamers                 List of parameter names that must be provided 
     267     * @return true, if params has all required parameters, an error hash otherwise 
     268     */   
     269        static String hasValidParams( params, render, Object [] requiredParams ) { 
     270                def list = [] 
     271                requiredParams.each { p -> 
     272                        if( !params[p] ) list.push p 
     273                } 
     274                if(list.size()<=0) { return true } 
     275                render( ['error':list] ) 
     276                return false  // return erro object 
     277        } 
     278 
     279 
    258280}