Changeset 515


Ignore:
Timestamp:
Jun 3, 2010, 9:48:33 AM (7 years ago)
Author:
jahn
Message:

REST resources for communicating with the Simple Assay Module.

Location:
trunk
Files:
2 edited

Legend:

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

    r480 r515  
    11/**
    2  * RestController Controler
     2 * ModuleCommunicationController Controler
    33 *
    4  * Description this is for testing the dbNP.rest.CCMCommunicationManager only and should be removed,
    5  * once the CCMCommunicationManager works with an exteneral server (nbx5)!!!!
     4 * This controler provides a REST service.
     5 * The names of the RESET resources are the same as the names of this
     6 * controller's actions. E.g., the resources called getStudies simply
     7 * corresponds to the action getStudies. Some of the resources are parameterized.
     8 * The parameters are passed as parameters in the url and are available in the
     9 * params respecting Grails' conventions. In this file, we adher to the javadoc 
     10 * convention for describing parameters ("@param"), but actually we mean
     11 * key-value pairs in the params object of each Grails action we comment on.
    612 *
    7  * This class renders two REST related requests (features and get_json).
    8  *
    9  * @author  Jahn
    10  * @since   20100526
     13 * @author      Jahn
     14 * @since       20100601
    1115 *
    1216 */
    1317
    14 import grails.converters.JSON
     18import data.*
     19import dbnp.studycapturing.Study
     20import dbnp.studycapturing.Assay
     21import grails.converters.*
    1522import org.codehaus.groovy.grails.web.json.*
    16 import dbnp.studycapturing.TemplateFieldListItem
    17 import dbnp.studycapturing.Template
    18 import dbnp.rest.CCMCommunicationManager
     23
    1924
    2025
     
    2227
    2328
    24     /**
    25      * result of querying the Clinical Chemistry Module
    26      * if assay in the database : return the Clinical Assay
    27      * else : return the list of all Assays in the database
    28      * @return Clinical Assay
    29      */
    30     def features = {
    31             //def items = TemplateFieldListItem.list()
    32             def items = Template.list()
    33             items.each{ render (it as JSON) }
    34             render params
    35     }
     29        /* REST resources for Simple Assay Module (SAM) */
    3630
    3731
    38     /* Use a REST resource to get data using the CCMCommunicationManager */
    39     def get_json = {
    40         def json_result = new CCMCommunicationManager().getFeatures()
    41         json_result.each { render "Value : ${it}\n"}
    42     }
     32        /**
     33        * REST resource for the Simple Assay Module.
     34        * Provide a list of all studies.
     35        *
     36        *
     37        * Examlpe call of the getAssays REST resource: http://localhost:8080/gscf/rest/getAssays/json?externalStudyID=1
     38        *
     39        * @return as JSON object list of members externalStudyID, and title for all studies
     40        */
     41        def getStudies = {
     42                List studies = []
     43                Study.list().each { study ->
     44                    studies.push( [ 'externalStudyID': study.externalStudyID, 'name':study.title ] )
     45                }
     46                render studies as JSON
     47        }
     48
     49
     50        /**
     51        * REST resource for the Simple Assay Module.
     52        * Provide a list of all assays for a given study
     53        *
     54        * Example for calling this resource: http://localhost:8080/gscf/rest/getAssays/json?externalStudyID=2
     55        *
     56        * @param  externalStudyID
     57        * @return list of assays as JSON object
     58        */
     59        def getAssays = {
     60                List assays = []
     61                if( params.externalStudyID ) {
     62                        def id = Long.parseLong(params.externalStudyID)
     63                        def study = Study.find( "from Study as s where s.externalStudyID=?", [id])
     64                        study.assays.each{ assay -> assays.push assay.externalAssayID }
     65                }
     66                render assays as JSON
     67        }
     68
     69
     70        /**
     71        * REST resource for the Simple Assay Module.
     72        * Provide all samples of a given Assay. The result is an enriched list with additional informatin on a sample.
     73        *
     74        * Example for calling this resource: http://localhost:8080/gscf/rest/getAssays/json?externalStudyID=2
     75        *
     76        * @param  assayID (externalAssayID of some Assay in GSCF)
     77        * @return list of element of  Sample.name x Sample.material x Sample.subject.name x Sample.Event.name x Sample.Event.time
     78        */
     79        def getSamples = {
     80                def items = []
     81                if( params.externalAssayID ) {
     82                        def id = Long.parseLong(params.externalAssayID)
     83                        Assay.find( "from Assay as a where externalAssayID=?",[id]).getSamples().each { sample ->
     84                                def item = [
     85                                        'name'            : sample.name,
     86                                        'material'        : sample.material.name,
     87                                        'subject'         : sample.parentSubject.name,
     88                                        //'event'         : sample.parentEvent.name,  // get the freaking name
     89                                        'startTime'       : sample.parentEvent.startTime
     90                                ]
     91                                items.push item
     92                        }
     93                }
     94                render items as JSON
     95        }
    4396
    4497}
  • trunk/src/groovy/dbnp/rest/CCMCommunicationManager.groovy

    r491 r515  
    1111
    1212
     13
     14/**  CCMCommunicationManager
     15 *
     16 *   This class implements a REST client to fetch data from the Clinical Chemistry Module (CCM).
     17 *   The communicatino manager provides methods for accessing each resources.
     18 *   Every REST resource corresponds to exactly one method in this class that makes
     19 *   the communication with the resource available.
     20 *
     21 *   For instance, the getSearchable() method calls the getMeasurements resource of the CCM
     22 *   by passing arguments to it and returning the result of the calling that resource.
     23 */
     24
     25
    1326class CCMCommunicationManager implements CleanDataLayer {
    1427
     28   
     29    /** ServerULR contains a string that represents the URL of the
     30     *  rest resources that this communication manager connects to.
     31     */
     32    def static ServerURL = "http://nbx5.nugo.org:8182/ClinicalChemistry/rest";
    1533    //def static ServerURL = "http://localhost:8080/gscf/rest";
    16     def static ServerURL = "http://nbx5.nugo.org:8182/ClinicalChemistry/rest";
    1734
    1835
     
    4360
    4461
    45 
    46 
    47 
    4862    /**
    4963     * Testing REST. Remove when connection to nbx5 is established.
     
    5266     */
    5367    public Object getFeatures() {
    54         def url = new URL( ServerURL + "/features" )
    55         return  JSON.parse(url.newReader())
     68    //    return  request( "features" )
     69        return  getStudiesForKeyword("ldl")
    5670    }
    5771
    5872
    5973    /**
    60      * Testing REST. Remove when connection to nbx5 is established.
     74     * For a string for the searchable plugin.
     75     * This works for one keyeword, but protection should be built in using
     76     * the methods that searchable uses for building query strings.
    6177     *
    6278     * @return list of ClinicalFloatData
    6379     */
    6480    private String getSearchable( keyword ) {
    65         return "submit=Query&q=" + keyword
     81        return  "?submit=Query&q=" + keyword
    6682    }
    6783
    6884
    6985    /**
    70      * Testing REST. Remove when connection to nbx5 is established.
     86     * Get all meassurements that contain a given keyword as feature.
    7187     *
     88     * @param  keyword, the keyword used
    7289     * @return list of ClinicalFloatData
    7390     */
    7491    public String getStudiesForKeyword( String keyword ) {
     92        def resource = "getMeasurementsForValue"
     93        request( resource + getSearchable(keyword) )
    7594    }
    7695
    7796
     97    /**
     98     * Get all meassurements that contain a given keyword as feature.
     99     *
     100     * @param  keyword, the keyword used
     101     * @return list of ClinicalFloatData
     102     */
    78103    public Object getMeasurementsResource( String keyword ) {
    79104        def url = new URL( ServerURL + "/" + getSearchable(keyword) )
     
    94119
    95120
     121
     122
     123
     124
    96125    /** Send a request for the REST resource to the server and deliver the
    97      *  resulting JSON object.
     126     *  resulting JSON object. (This is just a convenience method.)
    98127     *
    99128     *  @param resource: the name of the resource including parameters
    100129     *  @return JSON object
    101130     */
    102     private Object requesService( String resource ) {
     131    private Object request( String resource ) {
    103132        def url = new URL( ServerURL + "/" + resource );
    104133        return  JSON.parse( url.newReader() );
    105134    }
    106135
     136
     137
     138
     139
    107140}
Note: See TracChangeset for help on using the changeset viewer.