source: trunk/prototype/app/newcontroller.php @ 5341

Revision 5341, 15.1 KB checked in by wmerlotto, 12 years ago (diff)

Ticket #2434 - Commit inicial do novo módulo de agenda do Expresso - expressoCalendar

Line 
1<?php
2
3if( !defined( 'ROOTPATH' ) )
4    define( 'ROOTPATH', dirname(__FILE__).'/..' );
5
6require_once(ROOTPATH.'/app/config.php');
7
8/**
9TODO list:
10
11  * definir de forma centralizada os caminhos e as constantes necessárias;
12  * criar um User Agent detect e um OS server detect para customizações espeçíficas de cada browser / servidor;
13  * criar um registrador para fallback handlers;
14  * criar um dependency manager na configuração dos serviços, para poder gerenciar os imports corretamente
15  * criar um login e a recuperação da sessão;
16
17*/
18
19class Controller {
20
21        static $cache;
22        static $services = array();
23        static $interceptors = array();
24        static $config = array();
25        static $includes = array();
26        static $wallet;
27
28        public function __destruct()
29        {
30//          if( $this->service )
31//              $this->service->close();
32//          else
33            self::closeAll();
34        }
35
36        public static function closeAll()
37        {
38            if( self::$services )
39                foreach( self::$services as $serviceName => $service )
40                    if( self::$config[ $serviceName ]['type'] === 'service' )
41                      $service->close();
42        }
43
44        public static function clearAll()
45        {
46            return self::$cache->clearAll();
47        }
48
49        public static function clear( $id )
50        {
51            return self::$cache->clear( $id );
52        }
53
54        public static function get( $id )
55        {
56            return self::$cache->get( $id );
57        }
58
59        public static function put( $id, $data, $expires, $compressed )
60        {
61            return self::$cache->put( $id, $data, $expires, $compressed );
62        }
63
64        public static function find( $concept, $filter, $options = false )
65        {
66            if( isset($URI['id']) && $URI['id'] )
67                return self::read( $URI, $params, $options );
68
69            return self::call( 'find', $URI, $params, $options );
70        }
71
72        public static function read( $concept, $id, $options = false )
73        {
74            if( !is_string( $id ) )
75                return self::find( $concept, $id, $options );
76
77            return self::call( 'read', $concept, $id, $options );
78        }
79       
80//      public static function deleteAll( $URI, $params = false, $criteria = false )
81//      {
82//          if( isset($URI['id']) && $URI['id'] )
83//              return self::delete( $URI, $params, $criteria );
84//
85//          return self::call( 'deleteAll', $URI, $params, $criteria );
86//      }
87
88        public static function delete( $concept, $id = false, $options = false )
89        {
90//          if( !isset($URI['id']) || !$URI['id'] )
91//              return self::deleteAll( $URI, $params, $criteria );
92
93            return self::call( 'delete', $URI, $params, $criteria );
94        }
95       
96//      public static function replace( $URI, $params, $criteria = false )
97//      {
98//          if( isset($URI['id']) && $URI['id'] )
99//              return self::update( $URI, $params, $criteria );
100//
101//          return self::call( 'replace', $URI, $params, $criteria );
102//      }
103
104        public static function update( $concept, $params, $filter = false, $options = false )
105        {
106            if( !isset($URI['id']) || !$URI['id'] )
107                return self::replace( $URI, $params, $criteria );
108
109            return self::call( 'update', $URI, $params, $criteria );
110        }
111
112        public static function create( $concept, $params, $filter = false, $options = false )
113        {
114            return self::call( 'create', $concept, $params, $filter, $options )
115        }
116
117        public static function begin( $concept, $id, $options = false )
118        {
119            return self::call( 'begin', $concept, $id, $options );
120        }
121
122        public static function commit( $concept, /*$id,*/ $params = false, $options = false )
123        {
124            return self::call( 'commit', $concept, $id, $params, $options );
125        }
126
127        public static function rollback($concept, /*$id,*/ $options = false )
128        {
129            return self::call( 'rollback', $URI, $params, $options );
130        }
131
132        public static function format( $type, $data, $options = false )
133        {
134            return self::call( 'format', $type, $data, $options );
135        }
136
137        public static function parse( $type, $data, $options = false )
138        {
139            return self::call( 'parse', $type, $data, $options );
140        }
141
142        public static function URI( $className, $id = false, $service = false )
143        {
144            return array( 'concept' => $className,
145                          'service' => $service ? $service : false,
146                          'id' => $id ? $id : '' );
147        }
148
149        public static function links( $concept )
150        {
151            if( !isset(self::$config[ $concept ]) )
152              self::$config[ $concept ] = self::loadConfig( $concept );
153
154            return( isset(self::$config[ $concept ]['links']) ?
155                          self::$config[ $concept ]['links'] : array() );
156        }
157
158        public static function isConcept( $concept )
159        {
160            if( isset( self::$config[ $concept ] ) &&
161                self::$config[ $concept ] )
162                return( true );
163            else
164                return file_exists( ROOTPATH."/config/$concept.ini" );
165        }
166
167        public static function getConcept( $concept )
168        {
169            if( isset( self::$config[ $concept ] ) )
170                return( self::$config[ $concept ] );
171
172            return( self::$config[ $concept ] = self::loadConfig( $concept ) );
173        }
174
175        public static function loadCache( $cacheType = 'Memory' )
176        {
177            include_once( "cache/MemoryCache.php" );
178            return new MemoryCache();
179        }
180       
181        public static function loadConfig( $className, $isService = false )
182        {
183            $fileName = $className.'.'.($isService ? 'srv' : 'ini');
184
185            $config = self::$cache->get( $fileName );
186
187            if( !$config )
188            {
189                $config = parse_ini_file( ROOTPATH."/config/$fileName", true );
190
191                self::$cache->put( $fileName, $config );
192            }
193
194            return( $config );
195        }
196
197        public static function import( $path, $ext = ".php" )
198        {
199           
200            if( !isset(self::$includes[$path]) )
201            {
202                require_once( ROOTPATH.'/'.$path.$ext );
203                self::$includes[$path] = false;
204            }
205
206            return( self::$includes[$path] );
207        }
208
209        public static function load( $path, $class = false )
210        {
211           
212            if( $return = self::import( $path, "" ) )
213                return( $return );
214           
215            if( !$class ){
216                preg_match( '/^\/?.*\/([^\/]+).php$/', $path, $class );
217                $class = $class[1];
218            }
219
220            $object =  self::$cache->get( $class );
221
222            if( !$object )
223            {
224                $object = new $class();
225                 self::$cache->put( $class, $object );
226            }
227
228            self::$includes[$path] = $object;
229
230            return( $object );
231        }
232
233        public static function wallet( $serviceName )
234        {
235            if( !isset( self::$wallet ) )
236            {
237                //// Hack //// TODO: passar o init da sessão no login do expresso
238                if ( isset( $_COOKIE[ 'sessionid' ] ) )
239                      session_id( $_COOKIE[ 'sessionid' ] );
240               
241                @session_start();
242
243//              if( !isset( $_SESSION['wallet'] ) )
244//              {
245//                  if( isset( $GLOBALS['phpgw_info'] ) )
246//                  {
247//                              $_SESSION['wallet']['Sieve']['user']          = $GLOBALS['phpgw_info']['user']['account_lid'];
248//                              $_SESSION['wallet']['Sieve']['password']      = $GLOBALS['phpgw_info']['user']['passwd'];
249//
250//                              $_SESSION['wallet']['Cyrus']['user']          = $GLOBALS['phpgw_info']['user']['account_lid'];
251//                              $_SESSION['wallet']['Cyrus']['password']      = $GLOBALS['phpgw_info']['user']['passwd'];
252//
253//                              $_SESSION['wallet']['user']                   = $GLOBALS['phpgw_info']['user']['account_lid'];
254//                      //                      $_SESSION['wallet']['me']['password']      = $_SESSION['phpgw_info']['expressomail']['user']['passwd'];
255//
256//                              $_SESSION['wallet']['PostgreSQL']['user']     = $GLOBALS['phpgw_info']['server']['db_user'];
257//                              $_SESSION['wallet']['PostgreSQL']['password'] = $GLOBALS['phpgw_info']['server']['db_pass'];
258//                              $_SESSION['wallet']['PostgreSQL']['dbname']   = $GLOBALS['phpgw_info']['server']['db_name'];
259//                  }
260//                  else
261//                      $_SESSION['wallet'] = array();
262//              }
263               
264                if(isset($_SESSION['wallet']))
265                    self::$wallet = $_SESSION['wallet'];
266                /////////////
267            }
268
269            return isset( self::$wallet[ $serviceName ] )? self::$wallet[ $serviceName ] : false;
270        }
271
272        public static function dispatch( $dispatcher, $data, $optionsMap = false )
273        {
274//          if( $mappedTo )
275//              $data = array( $mappedTo => $data );
276//
277//          foreach( $data as $method => $params )
278//          {
279// //           foreach( $data[ $method ] as $name => $value )
280//          }
281//
282//          self::import( "$dispatcher.php" );
283        }
284
285        public static function loadAll( $configurable, $isService = false )
286        {
287        }
288
289        public static function connect( $service, $config )
290        {
291            $result = $service->open( $config );
292
293            if( is_string( $result ) )
294                throw new Exception( $result );
295
296            return( true );
297        }
298
299        public static function open( $serviceName, $config = false )
300        {
301            $service = self::$services[ $serviceName ];
302
303            $srvConfig = array();
304
305            if( isset(self::$config[ $serviceName ][ 'config' ]) )
306                $srvConfig = self::configure( $srvConfig, self::$config[ $serviceName ][ 'config' ] );
307            if( $wallet = self::wallet( $serviceName ) )
308                $srvConfig = self::configure( $srvConfig, $wallet );
309            if( $config )
310                $srvConfig = self::configure( $srvConfig, $config );
311
312            if( empty( $srvConfig ) )
313                $srvConfig = false;
314
315            if( $service && self::$config[ $serviceName ]['type'] === 'service' )
316                self::connect( $service, $srvConfig );
317        }
318
319        public static function configure( $config, $newConfig )
320        {
321            foreach( $newConfig as $key => $value )
322                $config[$key] = $value;
323
324            return( $config );
325        }
326
327        public static function service( $serviceName, $concept = false )
328        {
329            if( isset( self::$services[ $serviceName ] ) )
330                return self::$services[ $serviceName ];
331
332            if( !isset(self::$config[ $serviceName ]) )
333                 self::$config[ $serviceName ] = self::loadConfig( $serviceName, true );
334
335            if( !isset(self::$config[ $serviceName ]) )
336                return( false );
337
338            if( !isset(self::$config[ $serviceName ]['type']) )
339                self::$config[ $serviceName ]['type'] = 'service';
340
341            self::import( 'app/'.self::$config[ $serviceName ]['type'] );   //TODO: Item 4
342
343            self::$services[ $serviceName ] = self::load( self::$config[ $serviceName ]['path'],
344                                                          self::$config[ $serviceName ]['class'] );
345
346            if( $concept && isset(self::$config[ $concept ]['service.config']) )
347                self::open( $serviceName, $self::$config[ $concept ]['service.config'] );
348            else
349                self::open( $serviceName );
350
351            return( self::$services[ $serviceName ] = $service );
352        }
353
354        public static function interceptor( $method, $concept = false, $serviceName = false, $isService = false )
355        {
356            if( $concept && !isset(self::$config[ $concept ]) )
357              self::$config[ $concept ] = self::loadConfig( $concept );
358
359            if( !$concept ) $concept = 'global';
360            if( !$isService || !$serviceName ) $serviceName = 'global';
361
362            if( !isset( self::$interceptors[ $concept ] ) )
363                self::$interceptors[ $concept ] = array();
364
365            if( !isset( self::$interceptors[ $concept ][ $serviceName ] ) )
366                self::$interceptors[ $concept ][ $serviceName ] = array();
367
368            if( !isset( self::$interceptors[ $concept ][ $serviceName ][ $method ] ) )
369            {
370                $events = array( 'before', 'after' );
371                $interceptors = array();
372
373                $prefix = ( $isService )? "$serviceName." : "";
374
375                foreach( $events as $i => $event )
376                {
377                    $interceptors[$event] = array();
378
379                    if( !isset(self::$config[$concept]["$prefix$event.$method"]) )
380                      continue;
381
382                    foreach( self::$config[$concept]["$prefix$event.$method"] as $intercept => $interceptor )
383                            $interceptors[$event][$intercept] = self::load( $interceptor );
384                }
385
386                self::$interceptors[ $concept ][ $serviceName ][ $method ] = $interceptors;
387            }
388
389            return( self::$interceptors[ $concept ][ $serviceName ][ $method ] );
390        }
391
392        public static function fire( $eventType, $method, $params, $original, $isService = false )
393        {
394            $interceptors = self::interceptor( $method,
395                                               isset($original['URI']['concept']) ? $original['URI']['concept'] : false,
396                                               isset($params['URI']['service']) ? $params['URI']['service'] : false, $isService );
397
398            if( $interceptors && isset($interceptors[ $eventType ]) )
399                foreach( $interceptors[ $eventType ] as $intercept => $interceptor )
400                {
401                    $return = $interceptor->$intercept( $params['URI'], $params['properties'], $params['criteria'], $original, $params['service'] );
402
403                    if( $return === false )
404                        return( false );
405
406                    if( isset($return) )
407                        $params['properties'] = $return;
408                }
409
410              return( $params );
411        }
412
413        /*
414          * ex: array
415          *             (
416          *                     [0] array( 'OR', array( array( '=', 'campo', 'valor' ),
417                                                          array( 'OR', array( array( '=', 'campo', 'valor' ) ) ) )
418          *                     [1] array( '=', 'campo' , 'valor' )
419          *                     [2] array( 'OR' , array( array( '=' , campo', 'valor' ) ) )
420          *                     [3] array( 'IN', 'campo', array( '1' , '2' , '3' ) )
421          *             )
422          * OR
423          *         array( '=' , 'campo' , 'valor' )
424        */
425
426        public static function call( $method, $URI, $properties, $criteria = false, $service = false )
427        {
428            try
429            {
430                $original = $params = array( 'properties' => $properties,
431                                             'criteria' => $criteria,
432                                             'URI' => $URI,
433                                             'service' => $service );
434
435                if( isset($params['URI']['concept']) )
436                    $params = self::fire( 'before', $method, $params, $original );
437
438                if( !$params['service'] )
439                {
440                    $isInternal = true;
441
442                    if( ( !isset($params['URI']['service']) || !$params['URI']['service'] ) && isset($params['URI']['concept']) )
443                    {
444                        if( !isset(self::$config[ $URI['concept'] ]) )
445                            self::$config[ $URI['concept'] ] = self::loadConfig( $URI['concept'] );
446
447                        $params['URI']['service'] = self::$config[ $URI['concept'] ][ 'service' ];
448                    }
449
450                    if( !isset($params['URI']['service']) )
451                        return( false );
452
453                    $params['service'] = self::service( $params['URI']['service'], isset($params['URI']['concept']) ? $params['URI']['concept'] : false );
454                }
455
456                if( isset($params['URI']['service']) )
457                    $params = self::fire( 'before', $method, $params, $original, true );
458
459                if( $params['service'] )
460                    switch( $method )
461                    {
462                        case 'find': $return = $params['service']->find( $params['URI'], $params['properties'], $params['criteria'] ); break;
463
464                        case 'read': $return = $params['service']->read( $params['URI'], $params['properties']/*, $criteria*/ ); break;
465
466                        case 'create': $return = $params['service']->create( $params['URI'], $params['properties']/*, $criteria*/ ); break;
467
468                        case 'delete': $return = $params['service']->delete( $params['URI'], $params['properties']/*, $criteria*/ ); break;
469
470                        case 'deleteAll': $return = $params['service']->deleteAll( $params['URI'], $params['properties'], $params['criteria'] ); break;
471
472                        case 'update': $return = $params['service']->update( $params['URI'], $params['properties']/*, $criteria*/ ); break;
473
474                        case 'replace': $return = $params['service']->replace( $params['URI'], $params['properties'], $params['criteria'] ); break;
475
476                        case 'begin': $return = $params['service']->begin( $params['URI'] ); break;
477
478                        case 'commit': $return = $params['service']->commit( $params['URI'] ); break;
479
480                        case 'rollback': $return = $params['service']->rollback( $params['URI'] ); break;
481
482                        case 'parse': $return = $params['service']->parse( $params['properties'], $params['criteria'] ); break;
483
484                        case 'format': $return = $params['service']->format( $params['properties'], $params['criteria'] ); break;
485                    }
486   
487                if( isset($return) && $return !== false )
488                    $params['properties'] = $return;
489
490                if( isset($params['URI']['service']) )
491                    $params = self::fire( 'after', $method, $params, $original, true );
492
493                if( isset($URI['concept']) )
494                    $params = self::fire( 'after', $method, $params, $original );
495            }
496            catch( Exception $e )
497            {
498                if( !self::fallback( $e ) )
499                    self::closeAll();
500
501                return( false );
502            }
503
504            return( empty($params['properties']) ? false : $params['properties'] );
505        }
506
507        public static function fallback( $exception )
508        {
509            error_log( $exception->getMessage() );
510            return( true );
511        }
512}
513
514Controller::$cache = Controller::loadCache();
515?>
Note: See TracBrowser for help on using the repository browser.