Ticket #266: GenericORMController.cfc

File GenericORMController.cfc, 7.2 kB (added by dhughes, 19 years ago)
Line 
1<cfcomponent displayName="Controller" output="false" hint="I am the controller that provides generic ORM service." extends="ModelGlue.unity.controller.Controller">
2
3<cfset variables._debug = false />
4
5<cffunction name="Init" access="public" returnType="any" output="false" hint="I return a new Controller.">
6  <cfargument name="ModelGlue" type="ModelGlue.unity.framework.ModelGlue" required="true" hint="I am an instance of ModelGlue.">
7  <cfargument name="name" type="string" required="false" hint="A name for this controller." default="#createUUID()#">
8  <cfargument name="debug" type="boolean" required="true" />
9       
10        <cfset super.init(arguments.ModelGlue, arguments.name) />
11        <cfset variables._debug = arguments.debug />
12       
13  <cfreturn this />
14</cffunction>
15       
16<cffunction name="getOrmAdapter" access="private" returntype="ModelGlue.unity.orm.AbstractORMAdapter" output="false">
17        <cfreturn getModelGlue().getOrmAdapter() />
18</cffunction>
19
20<cffunction name="genericList" access="public" returntype="void" output="false">
21        <cfargument name="event" type="ModelGlue.unity.eventrequest.EventContext" />
22
23        <cfset var table = arguments.event.getArgument("object") />
24        <cfset var queryName = arguments.event.getArgument("queryName", table & "Query") />
25        <cfset var criteriaList = arguments.event.getArgument("criteria") />
26        <cfset var criteria = structNew() />
27        <cfset var field = "" />
28        <cfset var result = "" />
29       
30        <cfloop list="#criteriaList#" index="field">
31                <cfif listLen(field, "=") gt 1>
32                        <cfset criteria[listFirst(field, "=")] = listLast(field, "=") />
33                <cfelseif listLen(field, ":") gt 1>
34                        <cfif not arguments.event.valueExists(listFirst(field, ":"))>
35                                <cfset arguments.event.setValue(listFirst(field, ":"), listLast(field, ":")) />
36                        </cfif>
37                        <cfset criteria[listFirst(field, ":")] = arguments.event.getValue(listFirst(field, ":")) />
38                <cfelse>
39                        <cfset criteria[field] = arguments.event.getValue(field) />
40                </cfif>
41        </cfloop>
42       
43        <cfif not arguments.event.argumentExists("gatewayMethod")>
44                <cfif arguments.event.argumentExists("orderBy")>
45                        <cfif not arguments.event.argumentExists("ascending")>
46                                <cfset result = getOrmAdapter().list(table, criteria, arguments.event.getArgument("orderBy"), true) />
47                        <cfelse>
48                                <cfset result = getOrmAdapter().list(table, criteria, arguments.event.getArgument("orderBy"), arguments.event.getArgument("ascending")) />
49                        </cfif>
50                <cfelse>
51                        <cfset result = getOrmAdapter().list(table, criteria) />
52                </cfif>
53        <cfelse>
54                <cfif not arguments.event.argumentExists("gatewayBean")>
55                        <cfset result = getOrmAdapter().list(table=table,criteria=criteria,gatewaymethod=arguments.event.getArgument("gatewayMethod")) />
56                <cfelse>
57                        <cfset result = getOrmAdapter().list(table=table,criteria=criteria,gatewaymethod=arguments.event.getArgument("gatewayMethod"),gatewayBean=arguments.event.getArgument("gatewayBean")) />
58                </cfif>
59        </cfif>
60               
61        <cfif variables._debug>
62                <cfset arguments.event.trace("ReactorORMController", result) />
63        </cfif>
64       
65        <cfset arguments.event.setValue(queryName, result) />
66</cffunction>
67
68<cffunction name="genericRead" access="public" returntype="void" output="false">
69        <cfargument name="event" type="ModelGlue.unity.eventrequest.EventContext" />
70       
71        <cfset var table = arguments.event.getArgument("object") />
72        <cfset var recordName = arguments.event.getArgument("recordName", table & "Record") />
73        <cfset var criteriaValues = arguments.event.getArgument("criteria") />
74        <cfset var criteria = structNew() />
75        <cfset var result = "" />
76        <cfset var i = "" />
77        <cfset var isNew = true />
78        <cfset var templateTO = structNew() />
79        <cfset var criteriaProps = getOrmAdapter().getCriteriaProperties(table) />
80        <cfset var criteriaExists = false />
81       
82        <cfloop list="#criteriaProps#" index="i">
83                <cfset templateTO[i] = "" />
84        </cfloop>
85       
86        <cfif not arguments.event.valueExists(recordName)>
87                <cfloop list="#criteriaValues#" index="i">
88                        <cfif arguments.event.valueExists(i)>
89                                <cfset criteria[i] = arguments.event.getValue(i, templateTO[i]) />
90                                <cfset criteriaExists = true />
91                        </cfif>
92                </cfloop>
93
94                <cfif criteriaExists>
95                        <cftry>
96                                <cfset result = getOrmAdapter().read(table, criteria) />
97                                <cfcatch type="ModelGlue.unity.orm.AcceptableReadFailure">
98                                        <cfset result = getOrmAdapter().new(table) />
99                                </cfcatch>
100                        </cftry>
101                <cfelse>
102                        <cfset result = getOrmAdapter().new(table) />
103                </cfif>
104                       
105                <cfset arguments.event.setValue(recordName, result) />
106        </cfif>
107</cffunction>
108
109<cffunction name="genericCommit" access="public" returntype="void" output="false">
110        <cfargument name="event" type="ModelGlue.unity.eventrequest.EventContext" />
111
112        <cfset var orm = getOrmAdapter() />
113        <cfset var values = arguments.event.getAllValues() />
114        <cfset var table = arguments.event.getArgument("object") />
115        <cfset var recordName = arguments.event.getArgument("recordName", table & "Record") />
116        <cfset var validationName = arguments.event.getArgument("validationName", table & "Validation") />
117        <cfset var criteriaList = arguments.event.getArgument("criteria") />
118        <cfset var metadata = orm.getObjectMetadata(table) />
119       
120        <!--- Determine Criteria --->
121        <cfloop list="#criteriaList#" index="i">
122                <cfif arguments.event.valueExists(i)>
123                        <cfset criteria[i] = arguments.event.getValue(i) />
124                </cfif>
125        </cfloop>
126
127        <!--- Create Record --->       
128        <cfset record = orm.read(table,criteria) />
129       
130        <cftransaction>
131                <!--- Assemble --->
132                <cfset orm.assemble(arguments.event, record) />
133               
134                <!--- Validate --->
135                <cfset validation = orm.validate(table, record) />
136               
137                <!--- Place into state --->
138                <cfset arguments.event.setValue(recordName, record) />
139               
140                <cfif not validation.hasErrors()>
141                        <cfset orm.commit(table, record, false) />
142       
143                        <!--- Place keys into state, handling common "appends" situations --->
144                        <cfloop from="1" to="#arrayLen(metadata.primaryKeys)#" index="i">
145                                <cfinvoke component="#record#" method="get#metadata.primaryKeys[i]#" returnvariable="tmp" />
146                                <cfset arguments.event.setValue(metadata.primaryKeys[i], tmp) />
147                        </cfloop>
148       
149                        <!--- Flag that a commit was successful:  there's no good way to success vs. new on the client-side if the form is re-displayed --->
150                        <cfset arguments.event.setValue(table & "Committed", true) />
151       
152                        <cftransaction action="commit" />
153                        <cfset arguments.event.addResult("commit") />
154                <cfelse>
155                        <cfset arguments.event.setValue(validationName, validation.getErrors()) />
156                        <cfset arguments.event.setValue(table & "Committed", false) />
157                       
158                        <cftransaction action="rollback" />
159                        <cfset arguments.event.addResult("validationError") />
160                </cfif>
161        </cftransaction>
162
163</cffunction>
164
165<cffunction name="genericDelete" access="public" returntype="void" output="false">
166        <cfargument name="event" type="ModelGlue.unity.eventrequest.EventContext" />
167
168        <cfset var table = arguments.event.getArgument("object") />
169        <cfset var criteriaValues = arguments.event.getArgument("criteria") />
170        <cfset var criteria = structNew() />
171        <cfset var i = "" />
172       
173        <cfloop list="#criteriaValues#" index="i">
174                <cfset criteria[i] = arguments.event.getValue(i) />
175        </cfloop>
176       
177        <cfset getOrmAdapter().delete(table, criteria) />
178</cffunction>
179
180</cfcomponent>