170 likes | 319 Views
Case Study: HotelsCorp.com. Successfully Blending OO With Fusebox (and Other Cool Tricks). HotelsCorp.com At A Glance. The Business Plan Generate hotel bookings online, undercut big names (Expedia, Travelocity) Convert a percentage of bookings to tours Market through PPC on Search Engines
E N D
Case Study: HotelsCorp.com Successfully Blending OO With Fusebox (and Other Cool Tricks) Maxim Porges
HotelsCorp.com At A Glance • The Business Plan • Generate hotel bookings online, undercut big names (Expedia, Travelocity) • Convert a percentage of bookings to tours • Market through PPC on Search Engines • Hotel revenue pays for the advertising • Create location “skin-able” web sites • N Landing Pages - Cater to Special Interests • Sell hotels for revenue, tours for Timeshare • Brings cost-per-tour down to $60 from $150+ Maxim Porges
HotelsCorp.com At A Glance • Technical Challenges • Legacy Integration - Reservation System and Sales and Marketing System (S.A.M.S) • No API to S.A.M.S. - closed system • First CFMX Project • First OO with Fusebox Project • Delivery expected in 3 months (!) Maxim Porges
Implementation Choices • FB 3.0 on ColdFusion MX • Multi Aliased Circuits (from 2002 FB Conf) • Oracle back end (for web site) • Oracle PL/SQL API to legacy system • CFC Abstraction Layer • Java for Asynchronous Search and Form Validation System • A smattering of JavaScript (ugh) Maxim Porges
Legacy System - SAMS SAMS System DBLinks Problems • Business Logic in Forms • Intimate Knowledge of DB required • No clean separation between systems Maxim Porges
Fusebox App Why Objects? Changes here… …don’t force changes here! Maxim Porges
HotelsCorp Web App HotelsCorp.com Architecture SAMS SAMS Web API HotelsCorp API Maxim Porges
Creating the Object Model Maxim Porges
Fusebox 3.0 Architecture • Designed in Adalon • Architecture diagram available for questioning Maxim Porges
Skinning The Site • Each web site is “skinned” through LAF and code • orlando.hotelscorp.com • smokies.hotelscorp.com • vegas.hotelscorp.com (coming soon) • All Fusebox code is reusable between destinations • Identical process flows • Changes to codebase affect all sites at once Maxim Porges
Skinning The Site • Code sample from main fbx_Settings <!--------------------------------------------- Set up destination resource bundle variables This includes the default market effort ----------------------------------------------> <cfset request.G_DESTINATION_ID = 2> <cfset request.G_LP_COOKIE_DOMAIN = ".wgresorts.com"> <cfset request.G_SECURE_SERVER_URL = "http://webdev1mx.wgresorts.com/… <cfset request.G_SECURE_SERVER_DOMAIN = ".wgresorts.com"> <cfset request.G_DEFAULT_LP_TEXT_ID = "gatlinburg"> <cfset request.G_AREA_ATTRACTION_ID_LIST = "28,31,33,47,50,51,35,… <cfset request.G_DESTINATION_DOMAIN = "http://webdev1mx.wgresorts… <cfset request.G_LP_ATTRACTION_TICKET_LINK = "#request.G_SELF_FUSE… Maxim Porges
Skinning The Site • Sample Resource Bundle Maxim Porges
Tying the Objects To Fusebox • Main objects stored in the application scope as Singletons • The request scope is your friend • JSP forwarding in CFMX • Abstracts persistence implementation (i.e. session, cookie, DB) Maxim Porges
Asynchronous Search • Asynchronous Processes/Threads • ColdFusion doesn’t allow you to kick off your own threads • Wrote a simple Java object that would open a URL in a Java Thread and die on completion • Used for asynchronous search in HotelsCorp.com. Maxim Porges
Search Process Diagram ColdFusion Server Search Submitted Store Search Returns Java Thread Opens URL CFM Search Code Search Ends META Refresh Search Complete? Search Results Maxim Porges
Lessons Learned • In Fuses, don’t explicitly reference object scope <cfset object = request.objectName> • In Fuse: <cfset object = getSomeObject()> • In Application File: <cfscript> // return object that’s brand new function getSomeObject() { return CreateObject(“component”, com.mywebsite.object”); } </cfscript> <cfscript> // return object stored persistently in application scope function getSomeObject() { return application.someObject; } </cfscript> Maxim Porges
That’s All, Folks! • Thanks for watching! • Please ask me any questions that you might have Maxim Porges