source: trunk/grails-app/controllers/dbnp/studycapturing/TermEditorController.groovy @ 1157

Last change on this file since 1157 was 1157, checked in by robert@…, 12 years ago

Removed unnecessary REST call from term editor

  • Property svn:keywords set to Author Date Rev
File size: 4.9 KB
Line 
1/**
2 * TermEditorController Controller
3 *
4 * Webflow driven term editor
5 *
6 * @author  Jeroen Wesbeek
7 * @since       20100420
8 * @package     studycapturing
9 *
10 * Revision information:
11 * $Rev: 1157 $
12 * $Author: robert@isdat.nl $
13 * $Date: 2010-11-17 13:31:57 +0000 (wo, 17 nov 2010) $
14 */
15package dbnp.studycapturing
16
17import dbnp.data.Term
18import dbnp.data.Ontology
19
20class TermEditorController {
21        /**
22         * index closure
23         */
24    def index = {
25                // got a ontology get parameter?
26                def ontologies = (params.ontologies) ? params.ontologies : null
27
28                // enter the flow!
29        redirect(action: 'pages', params:["ontologies":ontologies])
30    }
31
32        /**
33         * Webflow
34         */
35        def pagesFlow = {
36                // start the flow
37                onStart {
38                        println ".start term / ontology editor flow"
39
40                        if (params.ontologies) {
41                                flow.ontologies         = params.ontologies
42                                flow.ontologiesList     = []
43                                params.ontologies.split(/\,/).each() { ncboId ->
44                                        // trim the id
45                                        ncboId.trim()
46
47                                        // and add to the flow scope
48                                        flow.ontologiesList[ flow.ontologies.size() ] = ncboId
49                                }
50                        }
51                }
52
53                // main term editor page
54                terms {
55                        render(view: "terms")
56                        onRender {
57                                println ".rendering term selection popup"
58                        }
59                        on("add") {
60                                // get ontology by ncboVersionedId
61                                def ontology = Ontology.findByNcboVersionedId( params.get('term-ontology_id') as int )
62                def strTerm = params.get('term')
63
64                                // do we have an ontology?
65                                if (!ontology && params.get('term-ontology_id')) {
66                                        // no, so either this is a new ontology that does not yet
67                                        // exist in the database, or it is a new version of an
68                                        // ontology that is already present in the database
69                                        println ".ontology missing, first fetch ontology information"
70
71                                        // use the NCBO REST service to fetch ontology information
72                                        try {
73                                                // instantiate Ontology with the proper values
74                                                ontology = Ontology.getBioPortalOntologyByVersionedId( params.get('term-ontology_id') )
75
76                                                // check if this is a newer version of an existing ontology
77                                                def checkOntology = Ontology.findByName( ontology.name )
78                                                if ( checkOntology ) {
79                                                        // this is a newer version of an existing Ontology, update
80                                                        // the ontology to a newer version. This is not the best
81                                                        // way to handle these updates as we don't know if terms
82                                                        // have been updated. However, introducing different versions
83                                                        // of Ontologies results into numerous difficulties as well:
84                                                        //      - what to do with studies that rely on an older ontology
85                                                        //      - when a new ontology is added, the existing terms of the
86                                                        //        older version are lacking in the new version
87                                                        //      - the webservice can only search on ontologyid, not on
88                                                        //        versions of ncboVersioned id's
89                                                        //      - if the name has changed between versions this check
90                                                        //        will not work anymore
91                                                        //      - etc :)
92                                                        // So for now, we will just update the existing ontology with
93                                                        // the new information until it becomes clear this needs a
94                                                        // more thorough workaround...
95                                                        //
96                                                        // Jeroen, 20101026
97
98                                                        // update ontology values
99                                                        checkOntology.ncboVersionedId   = ontology.ncboVersionedId
100                                                        checkOntology.versionNumber             = ontology.versionNumber
101                                                        checkOntology.url                               = ontology.url
102
103                                                        // store the ontology
104                                                        if ( checkOntology.validate() ) {
105                                                                println ".updated ontology with new version information"
106                                                                checkOntology.save(flush:true)
107
108                                                                // and use this existing ontology
109                                                                ontology = checkOntology
110                                                        }
111                                                } else if ( ontology.validate() ) {
112                                                        // store the ontology
113                                                        println ".adding new ontology"
114                                                        ontology.save(flush:true)
115                                                }
116                                        } catch (Exception e) {
117                                                // something went wrong, probably the
118                                                // ontology-id is invalid (hence, the term
119                                                // is invalid)
120                                                println ".oops? --> " + e.getMessage()
121                                                flash.errors = ["We could not add the ontology for this term, please try again"]
122                                        }
123                                }
124
125                                // got an error?
126                                if (!flash.errors) {
127                                        // instantiate term with parameters
128                                        def term = new Term(
129                                                name: strTerm,
130                                                ontology: ontology,
131                                                accession: params.get('term-concept_id')
132                                        )
133
134                                        // validate term
135                                        if (term.validate()) {
136                                                // save the term to the database
137                                                if (term.save(flush:true)) {
138                                                        flash.message = "'" + params.get('term') + "' was successfully added, either search for another term to add or close this window"
139                                                        success()
140                                                } else {
141                                                        flash.errors = ["We encountered a problem while storing the selected term. Please try again."]
142                                                        term.errors.each() { println it }
143                                                        error()
144                                                }
145                                        } else {
146                                                // term did not validate properly
147                                                term.errors.each() { println it }
148                                                if (term.errors =~ 'unique') {
149                                                        flash.errors = ["'" + params.get('term') + "' already exists, either search for another term or close this window"]
150                                                } else {
151                                                        flash.errors = ["We encountered a problem while storing the selected term. Please try again."]
152                                                }
153
154                                                error()
155                                        }
156                                }
157                        }.to "terms"
158                }
159        }
160}
Note: See TracBrowser for help on using the repository browser.