Index: BeanProperty.cfc
===================================================================
RCS file: /coldspring/coldspring/beans/BeanProperty.cfc,v
retrieving revision 1.17
diff -d -w -r1.17 BeanProperty.cfc
191c191
< 		<cfargument name="properties" type="struct" required="false" hint="properties struct, passed in by a postProcessor" />
---
> 		<cfargument name="properties" type="struct" required="true" default="#structNew()#" hint="properties struct, passed in by a postProcessor" />
195,204c195,213
< 		<!--- resolve anything that looks like it should get replaced with a beanFactory default property --->
< 		<cfif left(rawValue,2) eq "${" and right(rawValue,1) eq "}">
< 			<!--- look for this property value in the bean factory (using isDefined/evaluate incase of "." in property name)
< 				OR look for the property in the passed in struct ( do that first, as we may be postProcessing ) --->
< 			<cfif StructKeyExists(arguments, "properties")>
< 				<cfif isDefined("arguments.properties.#mid(rawValue,3,len(rawValue)-3)#")>
< 					<cfreturn evaluate("arguments.properties.#mid(rawValue,3,len(rawValue)-3)#")/>
< 				</cfif>		
< 			<cfelseif isDefined("beanFactoryDefaultProperties.#mid(rawValue,3,len(rawValue)-3)#")>
< 				<cfreturn evaluate("beanFactoryDefaultProperties.#mid(rawValue,3,len(rawValue)-3)#")/>
---
> 		<cfset var expressions = arrayNew(1)/>
> 		<cfset var result = ""/>
> 		<cfset var hits = "null"/>
> 		<cfset var i = 0/>
> 		<cfset var seek = 1/>
> 
> 		<cfif reFind("\$\{.+\}", arguments.rawValue) eq 0>
> 			<!--- if the raw value does not require evaluation --->
> 			<cfset result = arguments.rawValue/>
> 		<cfelse>
> 			<!--- gather locations of all expressions --->
> 			<cfloop condition="seek gt 0">
> 				<cfset hits = reFindNoCase("\$\{##?[^}]+##?\}", arguments.rawValue, seek, true)/>
> 				<cfif hits.pos[1] gt 0>
> 					<!--- build an expression structure for hit --->
> 					<cfset arrayAppend(expressions, parseExpression(arguments.rawValue, hits.pos[1], hits.len[1], arguments.properties, beanFactoryDefaultProperties))/>
> 					<cfset seek = hits.pos[1] + hits.len[1]/>
> 				<cfelse>
> 					<cfset seek = 0/>
205a215
> 			</cfloop>
206a217,221
> 			<!--- build the result --->
> 			<cfloop from="1" to="#arrayLen(expressions)#" index="i">
> 				<cfif i eq 1 and expressions[i].pos gt 1>
> 					<!--- characters before first expression --->
> 					<cfset result = left(arguments.rawValue, expressions[i].pos - 1)/>
208c223,232
< 		<cfreturn rawValue />
---
> 				<cfset result = result & expressions[i].value/>
> 				<cfif i lt arrayLen(expressions)>
> 					<!--- characters after this expression --->
> 					<cfset result = result & mid(arguments.rawValue, expressions[i].end + 1, expressions[i + 1].pos - expressions[i].end - 1)/>
> 				<cfelseif len(arguments.rawValue) gt expressions[i].end>
> 					<cfset result = result & mid(arguments.rawValue, expressions[i].end + 1, len(arguments.rawValue))/>
> 				</cfif>
> 			</cfloop>
> 		</cfif>
> 		<cfreturn result/>
210a235,270
> 	<cffunction name="parseExpression" access="private" returntype="struct" output="false"
> 				hint="I perform expression evaluation">
> 		<cfargument name="rawValue" type="string" required="true"/>
> 		<cfargument name="pos" type="numeric" required="true"/>
> 		<cfargument name="len" type="numeric" required="true"/>
> 		<cfargument name="beanProperties" type="struct" required="true" default="#structNew()#"/>
> 		<cfargument name="factoryProperties" type="struct" required="true" default="#structNew()#"/>
> 
> 		<cfset var result = structNew()/>
> 		<cfset result.token = ""/>
> 		<cfset result.name= ""/>
> 		<cfset result.value = ""/>
> 		<cfset result.pos = arguments.pos/>
> 		<cfset result.len = arguments.len/>
> 		<cfset result.end = arguments.pos + arguments.len - 1/>
> 
> 		<!--- just a little sanity check --->
> 		<cfif len(arguments.rawValue) eq 0 or result.pos eq 0 or result.len eq 0>
> 			<cfreturn result/>
> 		</cfif>
> 		<cfset result.token = mid(arguments.rawValue, result.pos, result.len)/>
> 
> 		<cfif left(result.token, 3) eq "${##" and right(result.token, 2) eq "##}">
> 			  <!--- property with CFML to be evaluated --->
> 			<cfset result.value = evaluate(mid(result.token, 4, len(result.token) - 5))/>
> 		<cfelseif left(result.token, 2) eq "${" and right(result.token, 1) eq "}">
> 			<!--- typical property like {$appName} --->
> 			<cfset result.name = mid(result.token, 3, len(result.token) - 3)/>
> 			<cfif structKeyExists(arguments.beanProperties, result.name)>
> 				<cfset result.value = arguments.beanProperties[result.name]/>
> 			<cfelseif structKeyExists(arguments.factoryProperties, result.name)>
> 				<cfset result.value = arguments.factoryProperties[result.name]/>
> 			</cfif>
> 		</cfif>
> 		<cfreturn result/>
> 	</cffunction>
