OSDN Git Service

#18507 - Typo at costume column name.
[mulab/sd3rd.git] / trust_path / modules / sd3rd / class / updater / UpdateUtils.class.php
1 <?php
2 /**
3  * @file
4  * @package sd3rd
5  * @version $Id$
6 **/
7
8 if(!defined('XOOPS_ROOT_PATH'))
9 {
10     exit();
11 }
12
13 require_once SD3RD_TRUST_PATH . '/class/Sd3rdUtils.class.php';
14 require_once SD3RD_TRUST_PATH . '/class/AssetManager.class.php';
15 require_once SD3RD_TRUST_PATH . '/class/updater/Context.class.php';
16 require_once SD3RD_TRUST_PATH . '/class/updater/AbstractProcess.class.php';
17
18 /**
19  * Utility of updater.
20 **/
21 class Sd3rd_UpdateUtils
22 {
23     protected static /*** Sd3rd_AssetManager ***/ $_mAsset = null;
24     protected static /*** string{} ***/ $_mEncoding = array();
25     
26     /**
27      * Setup process.
28      * 
29      * @param   void
30      * 
31      * @return  void
32     **/
33     public static function setup()
34     {
35         $root =& XCube_Root::getSingleton();
36         $dirname = $root->getSiteConfig('Sd3rd','publicName');
37         $root->mLanguageManager->loadModuleMessageCatalog($dirname);
38         self::$_mAsset =& Sd3rd_AssetManager::getInstance($dirname);
39         self::$_mEncoding = $root->getSiteConfig('Sd3rd.Encoding');
40     }
41     
42     #region output methods
43     /**
44      * Output message.
45      * 
46      * @param   string  $message
47      * @param   bool    $lf
48      * 
49      * @return  void
50     **/
51     public static function output(/*** string ***/ $message = null,/*** bool ***/ $lf = true)
52     {
53         echo self::convertToOutput($message);
54         $lf && self::output("\n",false);
55     }
56     
57     /**
58      * Output error message.
59      * 
60      * @param   Sd3rd_Exception $ex
61      * @param   callback        $callback
62      * 
63      * @return  void
64     **/
65     public static function outputError(Sd3rd_Exception $ex,/*** callback ***/ $callback = null)
66     {
67         self::output($ex->__toString());
68         if(is_callable($callback))
69         {
70             call_user_func($callback);
71         }
72         if($ex->isFatal())
73         {
74             die();
75         }
76     }
77     #endregion
78     
79     #region process methods
80     /**
81      * Execute filter list.
82      * 
83      * @param   Enum    $mode
84      * @param   string  $type
85      * 
86      * @return  void
87     **/
88     public static function executeFilter(/*** Enum ***/ $mode,/*** string ***/ $type = 'Sd3rd_AbstractFilter')
89     {
90         $process = new XCube_Delegate();
91         foreach(self::getFileList($mode) as $file)
92         {
93             $filter = self::makeInstance($mode,$file,$type);
94             $filter->prepare(SD3RD_UPDATE_TIME);
95             $process->add(array($filter,'execute'),$filter->getPriority());
96             unset($filter);
97         }
98         try
99         {
100             $process->call();
101         }
102         catch(Sd3rd_Exception $ex)
103         {
104             self::outputError($ex);
105         }
106     }
107     
108     /**
109      * Get sub process.
110      * 
111      * @param   Enum    $mode
112      * @param   string  $name
113      * @param   string  $type
114      * 
115      * @return  Sd3rd_AbstractProcess
116     **/
117     public static function getProcess(/*** Enum ***/ $mode,/*** string ***/ $name,/*** string ***/ $type = 'Sd3rd_AbstractProcess')
118     {
119         static $cache = array();
120         if(!isset($cache[$mode]))
121         {
122             $cache[$mode] = self::getProcessCache($mode,$type);
123         }
124         if(!isset($cache[$mode][$name = self::makeClassName($mode,$name)]))
125         {
126             throw new Sd3rd_ProcessNotFoundException('Request process is not found.');
127         }
128         return $cache[$mode][$name];
129     }
130     
131     /**
132      * Get sub process list.
133      * 
134      * @param   Enum    $mode
135      * @param   string  $type
136      * 
137      * @return  Sd3rd_AbstractProcess{}
138     **/
139     public static function getProcessCache(/*** Enum ***/ $mode,/*** string ***/ $type)
140     {
141         $list = array();
142         foreach(self::getFileList($mode) as $file)
143         {
144             $list[$name = self::makeClassNameFromPath($mode,$file)] = self::makeInstance($mode,$file,$type);
145             $list[$name]->prepare(SD3RD_UPDATE_TIME);
146         }
147         return $list;
148     }
149     
150     /**
151      * Get sub process file list.
152      * 
153      * @param   Enum    $mode
154      * 
155      * @return  string[]
156     **/
157     public static function getFileList(/*** Enum ***/ $mode)
158     {
159         return glob(SD3RD_TRUST_PATH . '/class/updater/' . $mode . '/*.class.php');
160     }
161     
162     /**
163      * Get sub process instance.
164      * 
165      * @param   Enum    $mode
166      * @param   string  $file
167      * @param   string  $type
168      * 
169      * @return  $type
170     **/
171     public static function makeInstance(/*** Enum ***/ $mode,/*** string ***/ $file,/*** string ***/ $type = 'Sd3rd_AbstractProcess')
172     {
173         require_once $file;
174         if(!class_exists($class = self::makeClassNameFromPath($mode,$file)))
175         {
176             throw new Sd3rd_ClassNotFoundException(sprintf('Class "%s" is not found.',$class));
177         }
178         $instance = new $class();
179         if(!$instance instanceof $type)
180         {
181             throw new Sd3rd_InvalidClassException(sprintf('"%s" is not implements "%s".',$class,$type));
182         }
183         return $instance;
184     }
185     
186     /**
187      * Get sub process name.
188      * 
189      * @param   Enum    $mode
190      * @param   string  $name
191      * 
192      * @return  string
193     **/
194     public static function makeClassName(/*** Enum ***/ $mode,/*** string ***/ $name)
195     {
196         return 'Sd3rd_' . ucfirst($name) . ucfirst(basename($mode));
197     }
198     
199     /**
200      * Get sub process name from file path.
201      * 
202      * @param   Enum    $mode
203      * @param   string  $path
204      * 
205      * @return  string
206     **/
207     public static function makeClassNameFromPath(/*** Enum ***/ $mode,/*** string ***/ $path)
208     {
209         return self::makeClassName($mode,substr(basename($path),0,-10));
210     }
211     #endregion
212     
213     #region convert methods
214     /**
215      * Convert message from input encoding to internal encoding.
216      * 
217      * @param   string  $message
218      * 
219      * @return  string
220     **/
221     public static function convertFromInput(/*** string ***/ $message)
222     {
223         return Sd3rd_Utils::normalizeString(mb_convert_encoding($message,mb_internal_encoding(),self::$_mEncoding['input']));
224     }
225     
226     /**
227      * Convert message from internal encoding to output encoding.
228      * 
229      * @param   string  $message
230      * 
231      * @return  string
232     **/
233     public static function convertToOutput(/*** string ***/ $message)
234     {
235         return mb_convert_encoding($message,self::$_mEncoding['output'],mb_internal_encoding());
236     }
237     
238     /**
239      * Get table name from table type.
240      * 
241      * @param   Enum    $type
242      * 
243      * @return  string
244     **/
245     public static function convertTableName(/*** Enum ***/ $type)
246     {
247         return self::getHandler($type)->mTable;
248     }
249     #endregion
250     
251     #region parse methods
252     /**
253      * Parse line by regex.
254      * 
255      * @param   string  $line
256      * @param   string  $pattern
257      * 
258      * @return  string{}
259     **/
260     public static function parseByRegex(/*** string ***/ $line,/*** string ***/ $pattern)
261     {
262         $arr = array();
263         if(!preg_match($pattern,$line,$arr))
264         {
265             throw new Sd3rd_ParseErrorException('No match at pattern.',array('line' => $line,'pattern' => $pattern));
266         }
267         return $arr;
268     }
269     
270     /**
271      * Parse line by explode.
272      * 
273      * @param   string  $line
274      * @param   int     $cnt
275      * @param   int     $offset
276      * @param   int     $end
277      * @param   string  $splitter
278      * 
279      * @return  string[]
280     **/
281     public static function parseByExplode(/*** string ***/ $line,/*** int ***/ $cnt,/*** int ***/ $offset,/*** int ***/ $end = null,/*** string ***/ $splitter = ',')
282     {
283         $arr = $end != null ? explode($splitter,substr($line,$offset,$end)) : explode($splitter,substr($line,$offset));
284         if(count($arr) != $cnt)
285         {
286             throw new Sd3rd_ParseErrorException('Mismatch token length.',array('line' => $line,'count' => $cnt,'offset' => $offset,'end' => $end,'splitter' => $splitter,'result' => $arr));
287         }
288         return $arr;
289     }
290     
291     /**
292      * Parse line by named explode.
293      * 
294      * @param   string      $line
295      * @param   string[]    $nameList
296      * @param   int         $offset
297      * @param   int         $end
298      * @param   string      $splitter
299      * 
300      * @return  string[]
301     **/
302     public static function parseByExplodeWithName(/*** string ***/ $line,/*** string[] ***/ $nameList,/*** int ***/ $offset,/*** int ***/ $end = null,/*** string ***/ $splitter = ',')
303     {
304         try
305         {
306             return array_combine($nameList,self::parseByExplode($line,count($nameList),$offset,$end,$splitter));
307         }
308         catch(Sd3rd_ParseErrorException $ex)
309         {
310             $ex->set('nameList',$nameList);
311             throw $ex;
312         }
313     }
314     #endregion
315     
316     #region handler methods
317     /**
318      * Get object handler.
319      * 
320      * @param   Enum    $name
321      * 
322      * @return  XoopsObjectGenericHandler
323     **/
324     public static function getHandler(/*** Enum ***/ $name)
325     {
326         return self::$_mAsset->getObject('handler',$name);
327     }
328     
329     /**
330      * Get object.
331      * 
332      * @param   Enum    $type
333      * 
334      * @return  XoopsSimpleObject
335     **/
336     public static function createObject(/*** Enum ***/ $type)
337     {
338         return self::getHandler($type)->create();
339     }
340     
341     /**
342      * Update object.
343      * 
344      * @param   Enum                $type
345      * @param   XoopsSimpleObject   &$obj
346      * 
347      * @return  void
348     **/
349     public static function insertObject(/*** Enum ***/ $type,XoopsSimpleObject &$obj)
350     {
351         if(!self::getHandler($type)->insert($obj,true))
352         {
353             throw new Sd3rd_QueryErrorException('Cannot insert object.',array('type' => $type,'object' => $obj));
354         }
355     }
356     
357     /**
358      * Delete object.
359      * 
360      * @param   Enum                $type
361      * @param   XoopsSimpleObject   $obj
362      * 
363      * @return  void
364     **/
365     public static function deleteObject(/*** Enum ***/ $type,XoopsSimpleObject $obj)
366     {
367         if(!self::getHandler($type)->delete($obj,true))
368         {
369             throw new Sd3rd_QueryErrorException('Cannot delete object.',array('type' => $type,'object' => $obj));
370         }
371     }
372     
373     /**
374      * Delete objects.
375      * 
376      * @param   Enum            $type
377      * @param   CriteriaElement $cri
378      * 
379      * @return  void
380     **/
381     public static function deleteMultiObjects(/*** Enum ***/ $type,CriteriaElement $cri)
382     {
383         if(!$handler->deleteAll($cri,true))
384         {
385             throw new Sd3rd_QueryErrorException('Cannot delete objects.',array('type' => $type,'criteria' => $cri));
386         }
387     }
388     #endregion
389 }
390
391 ?>