Ticket #270: GenericORMController.cfc

File GenericORMController.cfc, 7.2 kB (added by dhughes, 19 years ago)

Ye Olde File

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="parseCriteria" access="private" returntype="struct" output="false">
17        <cfargument name="event" type="ModelGlue.unity.eventrequest.EventContext" />
18        <cfset var criteriaList = arguments.event.getArgument("criteria") />
19        <cfset var field = "" />
20        <cfset var value = "" />
21        <cfset var criteria = structNew() />
22       
23        <cfloop list="#criteriaList#" index="field">
24                <cfif find("=", field)>
25                        <!--- this criteria is set to a static value --->
26                        <cfset criteria[listGetAt(field, 1, "=")] = listDeleteAt(field, 1, "=") />
27                       
28                <cfelseif find(":", field)>
29                        <!--- this criteria is set to a static value if not provided --->
30                        <cfif not arguments.event.valueExists(listGetAt(field, 1, ":"))>
31                                <cfset arguments.event.setValue(listGetAt(field, 1, ":"), listDeleteAt(field, 1, ":")) />
32                        </cfif>
33                        <cfset criteria[listGetAt(field, 1, ":")] = arguments.event.getValue(listGetAt(field, 1, ":")) />
34                       
35                <cfelseif find("|", field)>
36                        <!--- this criteria is set to a value in the event with a diferent name --->
37                        <cfset criteria[listFirst(field, "|")] = arguments.event.getValue(listLast(field, "|")) />
38                       
39                <cfelse>
40                        <!--- this criteria is set to a value with the same name in the event --->
41                        <!--- by default we don't include undefined elements (see http://www.firemoss.com/blog/index.cfm?mode=entry&entry=3160D4A0-3048-55C9-435A7958A61D02E5) --->
42                        <cfset value = arguments.event.getValue(field) />
43                        <cfif Len(value)>
44                                <cfset criteria[field] = value />
45                        </cfif>
46                       
47                </cfif>
48        </cfloop>
49       
50        <cfreturn criteria />
51</cffunction>
52       
53<cffunction name="getOrmAdapter" access="private" returntype="ModelGlue.unity.orm.AbstractORMAdapter" output="false">
54        <cfreturn getModelGlue().getOrmAdapter() />
55</cffunction>
56
57<cffunction name="genericList" access="public" returntype="void" output="false">
58        <cfargument name="event" type="ModelGlue.unity.eventrequest.EventContext" />
59        <cfset var table = arguments.event.getArgument("object") />
60        <cfset var queryName = arguments.event.getArgument("queryName", table & "Query") />
61        <cfset var criteria = parseCriteria(arguments.event) />
62        <cfset var result = "" />
63       
64        <cfif not arguments.event.argumentExists("gatewayMethod")>
65                <cfif arguments.event.argumentExists("orderBy")>
66                        <cfif not arguments.event.argumentExists("ascending")>
67                                <cfset result = getOrmAdapter().list(table, criteria, arguments.event.getArgument("orderBy"), true) />
68                        <cfelse>
69                                <cfset result = getOrmAdapter().list(table, criteria, arguments.event.getArgument("orderBy"), arguments.event.getArgument("ascending")) />
70                        </cfif>
71                <cfelse>
72                        <cfset result = getOrmAdapter().list(table, criteria) />
73                </cfif>
74        <cfelse>
75                <cfif not arguments.event.argumentExists("gatewayBean")>
76                        <cfset result = getOrmAdapter().list(table=table,criteria=criteria,gatewaymethod=arguments.event.getArgument("gatewayMethod")) />
77                <cfelse>
78                        <cfset result = getOrmAdapter().list(table=table,criteria=criteria,gatewaymethod=arguments.event.getArgument("gatewayMethod"),gatewayBean=arguments.event.getArgument("gatewayBean")) />
79                </cfif>
80        </cfif>
81               
82        <cfif variables._debug>
83                <cfset arguments.event.trace("ReactorORMController", result) />
84        </cfif>
85       
86        <cfset arguments.event.setValue(queryName, result) />
87</cffunction>
88
89<cffunction name="genericRead" access="public" returntype="void" output="false">
90        <cfargument name="event" type="ModelGlue.unity.eventrequest.EventContext" />
91        <cfset var table = arguments.event.getArgument("object") />
92        <cfset var recordName = arguments.event.getArgument("recordName", table & "Record") />
93        <cfset var criteria = parseCriteria(arguments.event) />
94        <cfset var result = "" />
95        <cfset var isNew = true />
96       
97        <cfif not arguments.event.valueExists(recordName)>
98               
99                <cfif Len(StructKeyList(criteria))>
100                        <cftry>
101                                <cfset result = getOrmAdapter().read(table, criteria) />
102               
103                                <cfcatch type="ModelGlue.unity.orm.AcceptableReadFailure">
104                                        <cfset result = getOrmAdapter().new(table) />
105                                </cfcatch>
106                        </cftry>
107                <cfelse>
108                        <cfset result = getOrmAdapter().new(table) />
109                </cfif>
110               
111                <cfset arguments.event.setValue(recordName, result) />
112        </cfif>
113</cffunction>
114
115<cffunction name="genericCommit" access="public" returntype="void" output="false">
116        <cfargument name="event" type="ModelGlue.unity.eventrequest.EventContext" />
117        <cfset var orm = getOrmAdapter() />
118        <cfset var values = arguments.event.getAllValues() />
119        <cfset var table = arguments.event.getArgument("object") />
120        <cfset var recordName = arguments.event.getArgument("recordName", table & "Record") />
121        <cfset var validationName = arguments.event.getArgument("validationName", table & "Validation") />
122        <cfset var criteria = parseCriteria(arguments.event) />
123        <cfset var metadata = orm.getObjectMetadata(table) />
124
125        <!--- Create Record --->       
126        <cfset record = orm.read(table,criteria) />
127       
128        <cftransaction>
129                <!--- Assemble --->
130                <cfset orm.assemble(arguments.event, record) />
131               
132                <!--- Validate --->
133                <cfset validation = orm.validate(table, record) />
134               
135                <!--- Place into state --->
136                <cfset arguments.event.setValue(recordName, record) />
137               
138                <cfif not validation.hasErrors()>
139                        <cfset orm.commit(table, record, false) />
140       
141                        <!--- Place keys into state, handling common "appends" situations --->
142                        <cfloop from="1" to="#arrayLen(metadata.primaryKeys)#" index="i">
143                                <cfinvoke component="#record#" method="get#metadata.primaryKeys[i]#" returnvariable="tmp" />
144                                <cfset arguments.event.setValue(metadata.primaryKeys[i], tmp) />
145                        </cfloop>
146       
147                        <!--- 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 --->
148                        <cfset arguments.event.setValue(table & "Committed", true) />
149       
150                        <cftransaction action="commit" />
151                        <cfset arguments.event.addResult("commit") />
152                <cfelse>
153                        <cfset arguments.event.setValue(validationName, validation.getErrors()) />
154                        <cfset arguments.event.setValue(table & "Committed", false) />
155                       
156                        <cftransaction action="rollback" />
157                        <cfset arguments.event.addResult("validationError") />
158                </cfif>
159        </cftransaction>
160
161</cffunction>
162
163<cffunction name="genericDelete" access="public" returntype="void" output="false">
164        <cfargument name="event" type="ModelGlue.unity.eventrequest.EventContext" />
165        <cfset var table = arguments.event.getArgument("object") />
166        <cfset var criteria = parseCriteria(arguments.event) />
167       
168        <cfset getOrmAdapter().delete(table, criteria) />
169</cffunction>
170
171</cfcomponent>