1
8
9 import com.sekati.core.App;
10 import com.sekati.core.CoreObject;
11 import com.sekati.convert.BoolConversion;
12 import com.sekati.data.XML2Object;
13 import com.sekati.except.FatalOperationException;
14 import com.sekati.events.Broadcaster;
15 import com.sekati.log.Logger;
16 import com.sekati.net.NetBase;
17 import com.sekati.services.Urchin;
18 import com.sekati.ui.ContextualMenu;
19 import com.sekati.utils.Delegate;
20 import com.sekati.validate.StringValidation;
21 import TextField.StyleSheet;
22
23
31 class com.project.core.Bootstrap extends CoreObject {
32
33
38 private var _this:Bootstrap;
39 private static var _sequenceChain:Array = [ "loadConfig", "loadData", "loadStyle" ];
40 private static var _sequenceCount:Number = 0;
41 private static var RETRY_ATTEMPT:Number = 0;
42 private static var RETRY_MAX:Number = 5;
43
44
47 public function Bootstrap() {
48 super( );
49 _this = this;
50 trace( "*** - Bootstrap Initialized ...\n" );
51 Broadcaster.$.broadcast( "onAppBootstrap" );
52 Urchin.track( "home" );
53 run( );
54 }
55
56
60 private function run():Void {
61 if (_sequenceCount < _sequenceChain.length - 1) {
62 var methodName:String = _sequenceChain[_sequenceCount];
63 Logger.$.trace( _this, "running method [" + _sequenceCount + "]" + methodName );
64 _this[methodName]( );
65 _sequenceCount++;
66 } else {
67 Broadcaster.$.broadcast( "onAppConfigured" );
68 Logger.$.status( _this, "@@@ Application Configured: auto-initialization via broadcast event ..." );
69 }
70 }
71
72
78 private function retry():Void {
79 if (RETRY_ATTEMPT < RETRY_MAX) {
80 Logger.$.warn( _this, "Bootstrap attempt failed in sequence chain " + _sequenceCount + ": " + _sequenceChain[_sequenceCount] + "()\n Retry Attempt: [" + RETRY_ATTEMPT + " of " + RETRY_MAX + "]" );
81 RETRY_ATTEMPT++;
82 _this[_sequenceChain[_sequenceCount]]( );
83 } else {
84 var msg:String = "Bootstrap died in sequence chain " + _sequenceCount + ": " + _sequenceChain[_sequenceCount] + "()\nRetry Attempt: [" + RETRY_ATTEMPT + " of " + RETRY_MAX + "]\n Sorry, I tried but the application failed to boot.";
85 Logger.$.fatal( _this, msg );
86 throw new FatalOperationException( _this, msg, arguments );
87 }
88 }
89
90
91
92
96 private function loadConfig():Void {
97 var oXML:XML = new XML( );
98 var o:Object = new Object( );
99 oXML.ignoreWhite = true;
100 var parseConfiguration:Function = function (success:Boolean):Void {
101 if (!success) {
102 retry( );
103 return;
104 }
105 o = new XML2Object( ).parseXML( oXML );
106 App.db.config = o.config;
107
108 App.APP_NAME = o.config.attributes.name + " v" + o.config.attributes.version;
109
110 App.CROSSDOMAIN_URI = (o.config.crossdomain_uri.data != undefined) ? o.config.crossdomain_uri.data : "crossdomain.xml";
111 App.CROSSDOMAIN_URI = (StringValidation.isURL( App.CROSSDOMAIN_URI )) ? App.CROSSDOMAIN_URI : NetBase.getPath( ) + App.CROSSDOMAIN_URI;
112 App.DATA_URI = o.config.data_uri.data;
113 App.CSS_URI = o.config.css_uri.data;
114
115 App.DEBUG_ENABLE = BoolConversion.toBoolean( o.config.debug_enable.data );
116 App.FLINK_ENABLE = BoolConversion.toBoolean( o.config.flink_enable.data );
117 App.TRACK_ENABLE = BoolConversion.toBoolean( o.config.track_enable.data );
118 App.KEY_ENABLE = BoolConversion.toBoolean( o.config.key_enable.data );
119 App.FLV_BUFFER_TIME = Number( o.config.flv_buffer_time.data );
120 if (App.DEBUG_ENABLE == true) {
121 App.log = Logger.getInstance( );
122 Logger.$.isIDE = true,
123 Logger.$.isLC = true,
124 Logger.$.isSWF = false;
125 Logger.$.info( _this, "@@@ Debug enabled ..." );
126 }
127
128
129 Logger.$.info( _this, "@@@ Setting ContextMenu ..." );
130 App.cmenu.addItem( App.APP_NAME );
131
132
133 Logger.$.info( _this, "@@@ loading crossdomain policy: " + App.CROSSDOMAIN_URI );
134 System.security.loadPolicyFile( App.CROSSDOMAIN_URI );
135 delete oXML;
136 delete o;
137 Logger.$.status( _this, "$$$ - Config loaded ..." );
138 Broadcaster.$.broadcast( "onLoadAppConfig" );
139 run( );
140 };
141 oXML.onLoad = Delegate.create( this, parseConfiguration );
142 oXML.load( App.CONF_URI );
143 }
144
145
149 private function loadData():Void {
150 var dXML:XML = new XML( );
151 var d:Object = new Object( );
152 dXML.ignoreWhite = true;
153 var parseData:Function = function(success:Boolean):Void {
154 if(success) {
155 d = new XML2Object( ).parseXML( dXML );
156
157 App.db.data = d.data;
158 delete dXML;
159 delete d;
160 Broadcaster.$.broadcast( "onLoadAppData" );
161 Logger.$.status( _this, "$$$ - Data loaded (App.db) ..." );
162
163 run( );
164 } else {
165 retry( );
166 }
167 };
168 dXML.onLoad = Delegate.create( _this, parseData );
169 dXML.load( App.DATA_URI );
170 }
171
172
180 private function loadStyle():Void {
181 var _styleSheet:TextField.StyleSheet = new StyleSheet( );
182 _styleSheet.load( App.CSS_URI );
183 _styleSheet.onLoad = function (success:Boolean):Void {
184 if (!success) {
185 retry( );
186 return;
187 }
188 App.css = _styleSheet;
189 Logger.$.status( _this, "$$$ - Styles loaded (App.CSS) ..." );
190 Broadcaster.$.broadcast( "onLoadAppStyle" );
191 run( );
192 };
193 }
194 }
195